| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655 |
- /**
- * Name: kankan-sdk.js
- * Date: 2026/3/31
- * Author: https://www.4dkankan.com
- * Copyright © 2026 4DAGE Co., Ltd. All rights reserved.
- * Licensed under the GLP license
- */
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('three')) :
- typeof define === 'function' && define.amd ? define(['three'], factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.KanKan = factory(global.THREE));
- }(this, (function (THREE$1) { 'use strict';
- function _interopNamespace(e) {
- if (e && e.__esModule) return e;
- var n = Object.create(null);
- if (e) {
- Object.keys(e).forEach(function (k) {
- if (k !== 'default') {
- var d = Object.getOwnPropertyDescriptor(e, k);
- Object.defineProperty(n, k, d.get ? d : {
- enumerable: true,
- get: function () {
- return e[k];
- }
- });
- }
- });
- }
- n['default'] = e;
- return Object.freeze(n);
- }
- var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE$1);
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
- function _defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
- function _assertThisInitialized(self) {
- if (self === void 0) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
- return self;
- }
- function _setPrototypeOf(o, p) {
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
- o.__proto__ = p;
- return o;
- };
- return _setPrototypeOf(o, p);
- }
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function");
- }
- subClass.prototype = Object.create(superClass && superClass.prototype, {
- constructor: {
- value: subClass,
- writable: true,
- configurable: true
- }
- });
- if (superClass) _setPrototypeOf(subClass, superClass);
- }
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function _typeof(obj) {
- return typeof obj;
- };
- } else {
- _typeof = function _typeof(obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
- };
- }
- return _typeof(obj);
- }
- function _possibleConstructorReturn(self, call) {
- if (call && (_typeof(call) === "object" || typeof call === "function")) {
- return call;
- } else if (call !== void 0) {
- throw new TypeError("Derived constructors may only return object or undefined");
- }
- return _assertThisInitialized(self);
- }
- function _getPrototypeOf(o) {
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
- return o.__proto__ || Object.getPrototypeOf(o);
- };
- return _getPrototypeOf(o);
- }
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
- try {
- var info = gen[key](arg);
- var value = info.value;
- } catch (error) {
- reject(error);
- return;
- }
- if (info.done) {
- resolve(value);
- } else {
- Promise.resolve(value).then(_next, _throw);
- }
- }
- function _asyncToGenerator(fn) {
- return function () {
- var self = this,
- args = arguments;
- return new Promise(function (resolve, reject) {
- var gen = fn.apply(self, args);
- function _next(value) {
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
- }
- function _throw(err) {
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
- }
- _next(undefined);
- });
- };
- }
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- function createCommonjsModule(fn) {
- var module = { exports: {} };
- return fn(module, module.exports), module.exports;
- }
- /**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- var runtime_1 = createCommonjsModule(function (module) {
- var runtime = function (exports) {
- var Op = Object.prototype;
- var hasOwn = Op.hasOwnProperty;
- var undefined$1; // More compressible than void 0.
- var $Symbol = typeof Symbol === "function" ? Symbol : {};
- var iteratorSymbol = $Symbol.iterator || "@@iterator";
- var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
- var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
- function define(obj, key, value) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- return obj[key];
- }
- try {
- // IE 8 has a broken Object.defineProperty that only works on DOM objects.
- define({}, "");
- } catch (err) {
- define = function define(obj, key, value) {
- return obj[key] = value;
- };
- }
- function wrap(innerFn, outerFn, self, tryLocsList) {
- // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
- var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
- var generator = Object.create(protoGenerator.prototype);
- var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
- // .throw, and .return methods.
- generator._invoke = makeInvokeMethod(innerFn, self, context);
- return generator;
- }
- exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
- // record like context.tryEntries[i].completion. This interface could
- // have been (and was previously) designed to take a closure to be
- // invoked without arguments, but in all the cases we care about we
- // already have an existing method we want to call, so there's no need
- // to create a new function object. We can even get away with assuming
- // the method takes exactly one argument, since that happens to be true
- // in every case, so we don't have to touch the arguments object. The
- // only additional allocation required is the completion record, which
- // has a stable shape and so hopefully should be cheap to allocate.
- function tryCatch(fn, obj, arg) {
- try {
- return {
- type: "normal",
- arg: fn.call(obj, arg)
- };
- } catch (err) {
- return {
- type: "throw",
- arg: err
- };
- }
- }
- var GenStateSuspendedStart = "suspendedStart";
- var GenStateSuspendedYield = "suspendedYield";
- var GenStateExecuting = "executing";
- var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
- // breaking out of the dispatch switch statement.
- var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
- // .constructor.prototype properties for functions that return Generator
- // objects. For full spec compliance, you may wish to configure your
- // minifier not to mangle the names of these two functions.
- function Generator() {}
- function GeneratorFunction() {}
- function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
- // don't natively support it.
- var IteratorPrototype = {};
- define(IteratorPrototype, iteratorSymbol, function () {
- return this;
- });
- var getProto = Object.getPrototypeOf;
- var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
- if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
- // This environment has a native %IteratorPrototype%; use it instead
- // of the polyfill.
- IteratorPrototype = NativeIteratorPrototype;
- }
- var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
- GeneratorFunction.prototype = GeneratorFunctionPrototype;
- define(Gp, "constructor", GeneratorFunctionPrototype);
- define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
- GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
- // Iterator interface in terms of a single ._invoke method.
- function defineIteratorMethods(prototype) {
- ["next", "throw", "return"].forEach(function (method) {
- define(prototype, method, function (arg) {
- return this._invoke(method, arg);
- });
- });
- }
- exports.isGeneratorFunction = function (genFun) {
- var ctor = typeof genFun === "function" && genFun.constructor;
- return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
- // do is to check its .name property.
- (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
- };
- exports.mark = function (genFun) {
- if (Object.setPrototypeOf) {
- Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
- } else {
- genFun.__proto__ = GeneratorFunctionPrototype;
- define(genFun, toStringTagSymbol, "GeneratorFunction");
- }
- genFun.prototype = Object.create(Gp);
- return genFun;
- }; // Within the body of any async function, `await x` is transformed to
- // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
- // `hasOwn.call(value, "__await")` to determine if the yielded value is
- // meant to be awaited.
- exports.awrap = function (arg) {
- return {
- __await: arg
- };
- };
- function AsyncIterator(generator, PromiseImpl) {
- function invoke(method, arg, resolve, reject) {
- var record = tryCatch(generator[method], generator, arg);
- if (record.type === "throw") {
- reject(record.arg);
- } else {
- var result = record.arg;
- var value = result.value;
- if (value && typeof value === "object" && hasOwn.call(value, "__await")) {
- return PromiseImpl.resolve(value.__await).then(function (value) {
- invoke("next", value, resolve, reject);
- }, function (err) {
- invoke("throw", err, resolve, reject);
- });
- }
- return PromiseImpl.resolve(value).then(function (unwrapped) {
- // When a yielded Promise is resolved, its final value becomes
- // the .value of the Promise<{value,done}> result for the
- // current iteration.
- result.value = unwrapped;
- resolve(result);
- }, function (error) {
- // If a rejected Promise was yielded, throw the rejection back
- // into the async generator function so it can be handled there.
- return invoke("throw", error, resolve, reject);
- });
- }
- }
- var previousPromise;
- function enqueue(method, arg) {
- function callInvokeWithMethodAndArg() {
- return new PromiseImpl(function (resolve, reject) {
- invoke(method, arg, resolve, reject);
- });
- }
- return previousPromise = // If enqueue has been called before, then we want to wait until
- // all previous Promises have been resolved before calling invoke,
- // so that results are always delivered in the correct order. If
- // enqueue has not been called before, then it is important to
- // call invoke immediately, without waiting on a callback to fire,
- // so that the async generator function has the opportunity to do
- // any necessary setup in a predictable way. This predictability
- // is why the Promise constructor synchronously invokes its
- // executor callback, and why async functions synchronously
- // execute code before the first await. Since we implement simple
- // async functions in terms of async generators, it is especially
- // important to get this right, even though it requires care.
- previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
- // invocations of the iterator.
- callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
- } // Define the unified helper method that is used to implement .next,
- // .throw, and .return (see defineIteratorMethods).
- this._invoke = enqueue;
- }
- defineIteratorMethods(AsyncIterator.prototype);
- define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
- return this;
- });
- exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
- // AsyncIterator objects; they just return a Promise for the value of
- // the final result produced by the iterator.
- exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
- if (PromiseImpl === void 0) PromiseImpl = Promise;
- var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
- return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
- : iter.next().then(function (result) {
- return result.done ? result.value : iter.next();
- });
- };
- function makeInvokeMethod(innerFn, self, context) {
- var state = GenStateSuspendedStart;
- return function invoke(method, arg) {
- if (state === GenStateExecuting) {
- throw new Error("Generator is already running");
- }
- if (state === GenStateCompleted) {
- if (method === "throw") {
- throw arg;
- } // Be forgiving, per 25.3.3.3.3 of the spec:
- // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
- return doneResult();
- }
- context.method = method;
- context.arg = arg;
- while (true) {
- var delegate = context.delegate;
- if (delegate) {
- var delegateResult = maybeInvokeDelegate(delegate, context);
- if (delegateResult) {
- if (delegateResult === ContinueSentinel) continue;
- return delegateResult;
- }
- }
- if (context.method === "next") {
- // Setting context._sent for legacy support of Babel's
- // function.sent implementation.
- context.sent = context._sent = context.arg;
- } else if (context.method === "throw") {
- if (state === GenStateSuspendedStart) {
- state = GenStateCompleted;
- throw context.arg;
- }
- context.dispatchException(context.arg);
- } else if (context.method === "return") {
- context.abrupt("return", context.arg);
- }
- state = GenStateExecuting;
- var record = tryCatch(innerFn, self, context);
- if (record.type === "normal") {
- // If an exception is thrown from innerFn, we leave state ===
- // GenStateExecuting and loop back for another invocation.
- state = context.done ? GenStateCompleted : GenStateSuspendedYield;
- if (record.arg === ContinueSentinel) {
- continue;
- }
- return {
- value: record.arg,
- done: context.done
- };
- } else if (record.type === "throw") {
- state = GenStateCompleted; // Dispatch the exception by looping back around to the
- // context.dispatchException(context.arg) call above.
- context.method = "throw";
- context.arg = record.arg;
- }
- }
- };
- } // Call delegate.iterator[context.method](context.arg) and handle the
- // result, either by returning a { value, done } result from the
- // delegate iterator, or by modifying context.method and context.arg,
- // setting context.delegate to null, and returning the ContinueSentinel.
- function maybeInvokeDelegate(delegate, context) {
- var method = delegate.iterator[context.method];
- if (method === undefined$1) {
- // A .throw or .return when the delegate iterator has no .throw
- // method always terminates the yield* loop.
- context.delegate = null;
- if (context.method === "throw") {
- // Note: ["return"] must be used for ES3 parsing compatibility.
- if (delegate.iterator["return"]) {
- // If the delegate iterator has a return method, give it a
- // chance to clean up.
- context.method = "return";
- context.arg = undefined$1;
- maybeInvokeDelegate(delegate, context);
- if (context.method === "throw") {
- // If maybeInvokeDelegate(context) changed context.method from
- // "return" to "throw", let that override the TypeError below.
- return ContinueSentinel;
- }
- }
- context.method = "throw";
- context.arg = new TypeError("The iterator does not provide a 'throw' method");
- }
- return ContinueSentinel;
- }
- var record = tryCatch(method, delegate.iterator, context.arg);
- if (record.type === "throw") {
- context.method = "throw";
- context.arg = record.arg;
- context.delegate = null;
- return ContinueSentinel;
- }
- var info = record.arg;
- if (!info) {
- context.method = "throw";
- context.arg = new TypeError("iterator result is not an object");
- context.delegate = null;
- return ContinueSentinel;
- }
- if (info.done) {
- // Assign the result of the finished delegate to the temporary
- // variable specified by delegate.resultName (see delegateYield).
- context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
- context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
- // exception, let the outer generator proceed normally. If
- // context.method was "next", forget context.arg since it has been
- // "consumed" by the delegate iterator. If context.method was
- // "return", allow the original .return call to continue in the
- // outer generator.
- if (context.method !== "return") {
- context.method = "next";
- context.arg = undefined$1;
- }
- } else {
- // Re-yield the result returned by the delegate method.
- return info;
- } // The delegate iterator is finished, so forget it and continue with
- // the outer generator.
- context.delegate = null;
- return ContinueSentinel;
- } // Define Generator.prototype.{next,throw,return} in terms of the
- // unified ._invoke helper method.
- defineIteratorMethods(Gp);
- define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the
- // @@iterator function is called on it. Some browsers' implementations of the
- // iterator prototype chain incorrectly implement this, causing the Generator
- // object to not be returned from this call. This ensures that doesn't happen.
- // See https://github.com/facebook/regenerator/issues/274 for more details.
- define(Gp, iteratorSymbol, function () {
- return this;
- });
- define(Gp, "toString", function () {
- return "[object Generator]";
- });
- function pushTryEntry(locs) {
- var entry = {
- tryLoc: locs[0]
- };
- if (1 in locs) {
- entry.catchLoc = locs[1];
- }
- if (2 in locs) {
- entry.finallyLoc = locs[2];
- entry.afterLoc = locs[3];
- }
- this.tryEntries.push(entry);
- }
- function resetTryEntry(entry) {
- var record = entry.completion || {};
- record.type = "normal";
- delete record.arg;
- entry.completion = record;
- }
- function Context(tryLocsList) {
- // The root entry object (effectively a try statement without a catch
- // or a finally block) gives us a place to store values thrown from
- // locations where there is no enclosing try statement.
- this.tryEntries = [{
- tryLoc: "root"
- }];
- tryLocsList.forEach(pushTryEntry, this);
- this.reset(true);
- }
- exports.keys = function (object) {
- var keys = [];
- for (var key in object) {
- keys.push(key);
- }
- keys.reverse(); // Rather than returning an object with a next method, we keep
- // things simple and return the next function itself.
- return function next() {
- while (keys.length) {
- var key = keys.pop();
- if (key in object) {
- next.value = key;
- next.done = false;
- return next;
- }
- } // To avoid creating an additional object, we just hang the .value
- // and .done properties off the next function object itself. This
- // also ensures that the minifier will not anonymize the function.
- next.done = true;
- return next;
- };
- };
- function values(iterable) {
- if (iterable) {
- var iteratorMethod = iterable[iteratorSymbol];
- if (iteratorMethod) {
- return iteratorMethod.call(iterable);
- }
- if (typeof iterable.next === "function") {
- return iterable;
- }
- if (!isNaN(iterable.length)) {
- var i = -1,
- next = function next() {
- while (++i < iterable.length) {
- if (hasOwn.call(iterable, i)) {
- next.value = iterable[i];
- next.done = false;
- return next;
- }
- }
- next.value = undefined$1;
- next.done = true;
- return next;
- };
- return next.next = next;
- }
- } // Return an iterator with no values.
- return {
- next: doneResult
- };
- }
- exports.values = values;
- function doneResult() {
- return {
- value: undefined$1,
- done: true
- };
- }
- Context.prototype = {
- constructor: Context,
- reset: function reset(skipTempReset) {
- this.prev = 0;
- this.next = 0; // Resetting context._sent for legacy support of Babel's
- // function.sent implementation.
- this.sent = this._sent = undefined$1;
- this.done = false;
- this.delegate = null;
- this.method = "next";
- this.arg = undefined$1;
- this.tryEntries.forEach(resetTryEntry);
- if (!skipTempReset) {
- for (var name in this) {
- // Not sure about the optimal order of these conditions:
- if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
- this[name] = undefined$1;
- }
- }
- }
- },
- stop: function stop() {
- this.done = true;
- var rootEntry = this.tryEntries[0];
- var rootRecord = rootEntry.completion;
- if (rootRecord.type === "throw") {
- throw rootRecord.arg;
- }
- return this.rval;
- },
- dispatchException: function dispatchException(exception) {
- if (this.done) {
- throw exception;
- }
- var context = this;
- function handle(loc, caught) {
- record.type = "throw";
- record.arg = exception;
- context.next = loc;
- if (caught) {
- // If the dispatched exception was caught by a catch block,
- // then let that catch block handle the exception normally.
- context.method = "next";
- context.arg = undefined$1;
- }
- return !!caught;
- }
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- var record = entry.completion;
- if (entry.tryLoc === "root") {
- // Exception thrown outside of any try block that could handle
- // it, so set the completion value of the entire function to
- // throw the exception.
- return handle("end");
- }
- if (entry.tryLoc <= this.prev) {
- var hasCatch = hasOwn.call(entry, "catchLoc");
- var hasFinally = hasOwn.call(entry, "finallyLoc");
- if (hasCatch && hasFinally) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- } else if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
- } else if (hasCatch) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- }
- } else if (hasFinally) {
- if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
- } else {
- throw new Error("try statement without catch or finally");
- }
- }
- }
- },
- abrupt: function abrupt(type, arg) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
- var finallyEntry = entry;
- break;
- }
- }
- if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
- // Ignore the finally entry if control is not jumping to a
- // location outside the try/catch block.
- finallyEntry = null;
- }
- var record = finallyEntry ? finallyEntry.completion : {};
- record.type = type;
- record.arg = arg;
- if (finallyEntry) {
- this.method = "next";
- this.next = finallyEntry.finallyLoc;
- return ContinueSentinel;
- }
- return this.complete(record);
- },
- complete: function complete(record, afterLoc) {
- if (record.type === "throw") {
- throw record.arg;
- }
- if (record.type === "break" || record.type === "continue") {
- this.next = record.arg;
- } else if (record.type === "return") {
- this.rval = this.arg = record.arg;
- this.method = "return";
- this.next = "end";
- } else if (record.type === "normal" && afterLoc) {
- this.next = afterLoc;
- }
- return ContinueSentinel;
- },
- finish: function finish(finallyLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.finallyLoc === finallyLoc) {
- this.complete(entry.completion, entry.afterLoc);
- resetTryEntry(entry);
- return ContinueSentinel;
- }
- }
- },
- "catch": function _catch(tryLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc === tryLoc) {
- var record = entry.completion;
- if (record.type === "throw") {
- var thrown = record.arg;
- resetTryEntry(entry);
- }
- return thrown;
- }
- } // The context.catch method must only be called with a location
- // argument that corresponds to a known catch block.
- throw new Error("illegal catch attempt");
- },
- delegateYield: function delegateYield(iterable, resultName, nextLoc) {
- this.delegate = {
- iterator: values(iterable),
- resultName: resultName,
- nextLoc: nextLoc
- };
- if (this.method === "next") {
- // Deliberately forget the last sent value so that we don't
- // accidentally pass it on to the delegate.
- this.arg = undefined$1;
- }
- return ContinueSentinel;
- }
- }; // Regardless of whether this script is executing as a CommonJS module
- // or not, return the runtime object so that we can declare the variable
- // regeneratorRuntime in the outer scope, which allows this module to be
- // injected easily by `bin/regenerator --include-runtime script.js`.
- return exports;
- }( // If this script is executing as a CommonJS module, use module.exports
- // as the regeneratorRuntime namespace. Otherwise create a new empty
- // object. Either way, the resulting object will be used to initialize
- // the regeneratorRuntime variable at the top of this file.
- module.exports );
- try {
- regeneratorRuntime = runtime;
- } catch (accidentalStrictMode) {
- // This module should not be running in strict mode, so the above
- // assignment should always work unless something is misconfigured. Just
- // in case runtime.js accidentally runs in strict mode, in modern engines
- // we can explicitly access globalThis. In older engines we can escape
- // strict mode using a global Function call. This could conceivably fail
- // if a Content Security Policy forbids using Function, but in that case
- // the proper solution is to fix the accidental strict mode problem. If
- // you've misconfigured your bundler to force strict mode and applied a
- // CSP to forbid Function, and you're not willing to fix either of those
- // problems, please detail your unique predicament in a GitHub issue.
- if (typeof globalThis === "object") {
- globalThis.regeneratorRuntime = runtime;
- } else {
- Function("r", "regeneratorRuntime = r")(runtime);
- }
- }
- });
- var regenerator = runtime_1;
- function _arrayLikeToArray$e(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 _arrayWithoutHoles(arr) {
- if (Array.isArray(arr)) return _arrayLikeToArray$e(arr);
- }
- function _iterableToArray(iter) {
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
- }
- function _unsupportedIterableToArray$e(o, minLen) {
- if (!o) return;
- if (typeof o === "string") return _arrayLikeToArray$e(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$e(o, minLen);
- }
- function _nonIterableSpread() {
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
- }
- function _toConsumableArray(arr) {
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$e(arr) || _nonIterableSpread();
- }
- 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;
- }
- }
- function _construct(Parent, args, Class) {
- if (_isNativeReflectConstruct$1R()) {
- _construct = Reflect.construct;
- } else {
- _construct = function _construct(Parent, args, Class) {
- var a = [null];
- a.push.apply(a, args);
- var Constructor = Function.bind.apply(Parent, a);
- var instance = new Constructor();
- if (Class) _setPrototypeOf(instance, Class.prototype);
- return instance;
- };
- }
- return _construct.apply(null, arguments);
- }
- var e = [],
- t$1 = [];
- function n$4(n, r) {
- if (n && "undefined" != typeof document) {
- var a,
- s = !0 === r.prepend ? "prepend" : "append",
- d = !0 === r.singleTag,
- i = "string" == typeof r.container ? document.querySelector(r.container) : document.getElementsByTagName("head")[0];
- if (d) {
- var u = e.indexOf(i);
- -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();
- } else a = c();
- 65279 === n.charCodeAt(0) && (n = n.substring(1)), a.styleSheet ? a.styleSheet.cssText += n : a.appendChild(document.createTextNode(n));
- }
- function c() {
- var e = document.createElement("style");
- if (e.setAttribute("type", "text/css"), r.attributes) for (var t = Object.keys(r.attributes), n = 0; n < t.length; n++) {
- e.setAttribute(t[n], r.attributes[t[n]]);
- }
- var a = "prepend" === s ? "afterbegin" : "beforeend";
- return i.insertAdjacentElement(a, e), e;
- }
- }
- 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}";
- n$4(css$3,{});
- /*
- * @Author: Rindy
- * @Date: 2021-04-25 16:49:05
- * @LastEditors: Rindy
- * @LastEditTime: 2021-09-15 11:31:00
- * @Description: 注释
- */
- /**
- * 配置对象
- */
- var lang_zh = {
- 'common.about': '约',
- 'common.meter': '米',
- 'cad.input': '请输入名称',
- 'model.enter': '入户门'
- };
- var config$6 = {
- num: null,
- dom: null,
- /**
- * 运行环境
- */
- env: "development",
- /**
- * SDK版本号
- */
- version: "4.12.1-alpha.18",
- /**
- * 源码版本号
- */
- edition: null,
- lang: 'zh',
- langs: {},
- /**
- * SDK展示模式
- */
- view: true,
- /**
- * 移动端模式
- */
- mobile: false,
- /**
- * 请求参数
- */
- params: '',
- /**
- * 部署方式,本地版为local
- */
- deploy: '',
- /**
- * 区域
- */
- region: '',
- /**
- * 服务器地址
- */
- server: '',
- //'https://www.4dkankan.com/',
- /**
- * 场景资源地址
- */
- resource: 'https://4dkk.4dage.com/',
- resourceLaser: '',
- /**
- * 显示SDK信息
- */
- showSDKInfo: true,
- /**
- * 是否使用场景控制快捷键
- */
- useShortcutKeys: false,
- /**
- * statistics
- */
- useStatistics: true,
- /**
- * 是否需要用户鉴权
- */
- useAuth: false,
- /**
- * 抗锯齿
- */
- antialias: true,
- /**
- * 全景关联设置
- */
- link: {
- onAction: null,
- target: 'self'
- },
- /**
- * 模型设置
- */
- model: {
- /**
- * 模型名称
- */
- name: '' // 铁塔
- //name: 'tieta.dam',
- },
- /**
- * 场景设置
- */
- scene: {
- /**
- * 图片质量
- */
- quality: null,
- /**
- * 自定义marker图片地址
- */
- markerURL: null,
- /**
- * 自定义marker透明的
- */
- markerOpacity: null,
- /**
- * 自定义当前点位颜色
- */
- pathEndColor: null,
- /**
- * 自定义地面logoId
- */
- floorlogoId: null // 铁塔
- //floorlogoId: 2,
- },
- camera: {
- lookLimitUp: null,
- lookLimitDown: null // // 铁塔
- // lookLimitUp: 89.9,
- // lookLimitDown: -89.9,
- },
- vr: {
- markerHeight: null
- },
- tag: {
- showIn: null
- },
- /**
- * 获取服务器资源
- */
- getServerURL(path) {
- return this.server + path;
- },
- /**
- * 获取场景资源地址
- * @param {String} path 资源路径
- */
- getResourceURL(path) {
- return this.resource + path;
- },
- /**
- * 获取场景图片地址
- * @param {*} path 图片路径
- */
- getResourceImageURL(path) {
- return this.getResourceURL("scene_view_data/".concat(this.num, "/images/").concat(path));
- },
- /**
- * 获取场景数据地址
- * @param {*} path 数据路径
- */
- getResourceDataURL(path) {
- return this.getResourceURL("scene_view_data/".concat(this.num, "/data/").concat(path));
- },
- i18n(key) {
- if (this.langs[this.lang] && this.langs[this.lang][key]) {
- return this.langs[this.lang][key];
- }
- if (!this.langs['zh']) {
- this.langs['zh'] = lang_zh;
- }
- return this.langs['zh'][key] || '';
- },
- /**
- * 是否加载热点
- */
- isLoadTags: true
- };
- if (config$6.showSDKInfo) {
- if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
- 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;'];
- console.log.apply(console, log$1);
- } else console && console.log('4DKanKan SDK ' + config$6.version + ' - https://www.4dkankan.com/');
- }
- /*
- * @Author: Rindy
- * @Date: 2021-09-14 20:02:23
- * @LastEditors: Rindy
- * @LastEditTime: 2021-09-14 20:03:48
- * @Description:
- */
- /**
- * Merges two arrays and returns the new one.
- * @param a
- * @param b
- * @param fn
- */
- function mergeArrays(a, b, fn) {
- var result = [];
- for (var i = 0; i < a.length; i += 1) {
- if (typeof a !== 'undefined') {
- if (a[i] !== null && typeof a[i] === 'object') {
- result[i] = fn({}, a[i]);
- } else {
- result[i] = a[i];
- }
- }
- }
- for (var _i = 0; _i < b.length; _i += 1) {
- if (typeof b[_i] !== 'undefined') {
- if (b[_i] !== null && typeof b[_i] === 'object') {
- result[_i] = fn(a[_i], b[_i]);
- } else {
- result[_i] = b[_i];
- }
- }
- }
- return result;
- }
- /**
- * Merge deep objects
- * @param args
- */
- function deepExtend() {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- var a = args.shift();
- for (var i = 0; i < args.length; i += 1) {
- var b = args[i];
- if (a !== null && b !== null && typeof a !== 'undefined' && typeof b !== 'undefined') {
- // Merge objects
- if (typeof a === 'object' && typeof b === 'object') {
- // Merge arrays
- if (a instanceof Array && b instanceof Array) {
- a = mergeArrays(a, b, deepExtend);
- } else {
- var keys = Object.keys(b);
- for (var j = 0; j < keys.length; j += 1) {
- var key = keys[j]; // Avoid prototype pollution.
- if (key !== '__proto__') {
- if (typeof b[key] === 'object' && b[key] !== null) {
- a[key] = deepExtend(a[key], b[key]);
- } else if (typeof b[key] !== 'undefined') {
- a[key] = b[key];
- }
- }
- }
- }
- }
- } else if (b !== null && typeof b !== 'undefined') {
- if (b instanceof Array) {
- a = mergeArrays([], b, deepExtend);
- } else {
- a = b;
- }
- }
- }
- return a;
- }
- function _classPrivateFieldBase(receiver, privateKey) {
- if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
- throw new TypeError("attempted to use private field on non-instance");
- }
- return receiver;
- }
- var id = 0;
- function _classPrivateFieldKey(name) {
- return "__private_" + id++ + "_" + name;
- }
- function isArray$4(arr) {
- return Object.prototype.toString.call(arr) === '[object Array]';
- }
- function foreach(arr, handler) {
- if (isArray$4(arr)) {
- for (var i = 0; i < arr.length; i++) {
- handler(arr[i]);
- }
- } else handler(arr);
- }
- function D(fn) {
- var status = 'pending',
- doneFuncs = [],
- failFuncs = [],
- progressFuncs = [],
- resultArgs = null,
- _promise = {
- done: function done() {
- for (var i = 0; i < arguments.length; i++) {
- // skip any undefined or null arguments
- if (!arguments[i]) {
- continue;
- }
- if (isArray$4(arguments[i])) {
- var arr = arguments[i];
- for (var j = 0; j < arr.length; j++) {
- // immediately call the function if the deferred has been resolved
- if (status === 'resolved') {
- arr[j].apply(this, resultArgs);
- }
- doneFuncs.push(arr[j]);
- }
- } else {
- // immediately call the function if the deferred has been resolved
- if (status === 'resolved') {
- arguments[i].apply(this, resultArgs);
- }
- doneFuncs.push(arguments[i]);
- }
- }
- return this;
- },
- fail: function fail() {
- for (var i = 0; i < arguments.length; i++) {
- // skip any undefined or null arguments
- if (!arguments[i]) {
- continue;
- }
- if (isArray$4(arguments[i])) {
- var arr = arguments[i];
- for (var j = 0; j < arr.length; j++) {
- // immediately call the function if the deferred has been resolved
- if (status === 'rejected') {
- arr[j].apply(this, resultArgs);
- }
- failFuncs.push(arr[j]);
- }
- } else {
- // immediately call the function if the deferred has been resolved
- if (status === 'rejected') {
- arguments[i].apply(this, resultArgs);
- }
- failFuncs.push(arguments[i]);
- }
- }
- return this;
- },
- always: function always() {
- return this.done.apply(this, arguments).fail.apply(this, arguments);
- },
- progress: function progress() {
- for (var i = 0; i < arguments.length; i++) {
- // skip any undefined or null arguments
- if (!arguments[i]) {
- continue;
- }
- if (isArray$4(arguments[i])) {
- var arr = arguments[i];
- for (var j = 0; j < arr.length; j++) {
- // immediately call the function if the deferred has been resolved
- if (status === 'pending') {
- progressFuncs.push(arr[j]);
- }
- }
- } else {
- // immediately call the function if the deferred has been resolved
- if (status === 'pending') {
- progressFuncs.push(arguments[i]);
- }
- }
- }
- return this;
- },
- then: function then(done, fail, progress) {
- /*
- // fail callbacks
- if (arguments.length > 1 && arguments[1]) {
- this.fail(arguments[1])
- }
- // done callbacks
- if (arguments.length > 0 && arguments[0]) {
- this.done(arguments[0])
- }
- // notify callbacks
- if (arguments.length > 2 && arguments[2]) {
- this.progress(arguments[2])
- }
- return this
- */
- return D(function (def) {
- foreach(done, function (func) {
- // filter function
- if (typeof func === 'function') {
- deferred.done(function () {
- var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
- if (returnval && typeof returnval === 'function') {
- returnval.promise().then(def.resolve, def.reject, def.notify);
- } else {
- // if new return val is passed, it is passed to the piped done
- def.resolve(returnval);
- }
- });
- } else {
- deferred.done(def.resolve);
- }
- });
- foreach(fail, function (func) {
- if (typeof func === 'function') {
- deferred.fail(function () {
- var returnval = func.apply(this, arguments);
- if (returnval && typeof returnval === 'function') {
- returnval.promise().then(def.resolve, def.reject, def.notify);
- } else {
- def.reject(returnval);
- }
- });
- } else {
- deferred.fail(def.reject);
- }
- });
- }).promise();
- },
- catch: function _catch() {
- for (var i = 0; i < arguments.length; i++) {
- // skip any undefined or null arguments
- if (!arguments[i]) {
- continue;
- }
- if (isArray$4(arguments[i])) {
- var arr = arguments[i];
- for (var j = 0; j < arr.length; j++) {
- // immediately call the function if the deferred has been resolved
- if (status === 'rejected') {
- arr[j].apply(this, resultArgs);
- }
- failFuncs.push(arr[j]);
- }
- } else {
- // immediately call the function if the deferred has been resolved
- if (status === 'rejected') {
- arguments[i].apply(this, resultArgs);
- }
- failFuncs.push(arguments[i]);
- }
- }
- return this;
- },
- promise: function promise(obj) {
- if (obj == null) {
- return _promise;
- } else {
- for (var i in _promise) {
- obj[i] = _promise[i];
- }
- return obj;
- }
- },
- state: function state() {
- return status;
- },
- debug: function debug() {
- console.log('[debug]', doneFuncs, failFuncs, status);
- },
- isRejected: function isRejected() {
- return status === 'rejected';
- },
- isResolved: function isResolved() {
- return status === 'resolved';
- },
- pipe: function pipe(done, fail, progress) {
- return D(function (def) {
- foreach(done, function (func) {
- // filter function
- if (typeof func === 'function') {
- deferred.done(function () {
- var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
- if (returnval && typeof returnval === 'function') {
- returnval.promise().then(def.resolve, def.reject, def.notify);
- } else {
- // if new return val is passed, it is passed to the piped done
- def.resolve(returnval);
- }
- });
- } else {
- deferred.done(def.resolve);
- }
- });
- foreach(fail, function (func) {
- if (typeof func === 'function') {
- deferred.fail(function () {
- var returnval = func.apply(this, arguments);
- if (returnval && typeof returnval === 'function') {
- returnval.promise().then(def.resolve, def.reject, def.notify);
- } else {
- def.reject(returnval);
- }
- });
- } else {
- deferred.fail(def.reject);
- }
- });
- }).promise();
- }
- },
- deferred = {
- resolveWith: function resolveWith(context) {
- if (status === 'pending') {
- status = 'resolved';
- var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
- for (var i = 0; i < doneFuncs.length; i++) {
- doneFuncs[i].apply(context, args);
- }
- }
- return this;
- },
- rejectWith: function rejectWith(context) {
- if (status === 'pending') {
- status = 'rejected';
- var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
- for (var i = 0; i < failFuncs.length; i++) {
- failFuncs[i].apply(context, args);
- }
- }
- return this;
- },
- notifyWith: function notifyWith(context) {
- if (status === 'pending') {
- var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
- for (var i = 0; i < progressFuncs.length; i++) {
- progressFuncs[i].apply(context, args);
- }
- }
- return this;
- },
- resolve: function resolve() {
- return this.resolveWith(this, arguments);
- },
- reject: function reject() {
- return this.rejectWith(this, arguments);
- },
- notify: function notify() {
- return this.notifyWith(this, arguments);
- }
- };
- var obj = _promise.promise(deferred);
- if (fn) {
- fn.apply(obj, [obj]);
- }
- return obj;
- }
- D.when = function () {
- if (arguments.length < 2) {
- var obj = arguments.length ? arguments[0] : undefined;
- if (obj && typeof obj.isResolved === 'function' && typeof obj.isRejected === 'function') {
- return obj.promise();
- } else {
- return D().resolve(obj).promise();
- }
- } else {
- return function (args) {
- var df = D(),
- size = args.length,
- done = 0,
- 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
- for (var i = 0; i < args.length; i++) {
- (function (j) {
- var obj = null;
- if (args[j].done) {
- args[j].done(function () {
- rp[j] = arguments.length < 2 ? arguments[0] : arguments;
- if (++done == size) {
- df.resolve.apply(df, rp);
- }
- }).fail(function () {
- df.reject(arguments);
- });
- } else {
- obj = args[j];
- args[j] = new Deferred();
- args[j].done(function () {
- rp[j] = arguments.length < 2 ? arguments[0] : arguments;
- if (++done == size) {
- df.resolve.apply(df, rp);
- }
- }).fail(function () {
- df.reject(arguments);
- }).resolve(obj);
- }
- })(i);
- }
- return df.promise();
- }(arguments);
- }
- };
- var Defer = D;
- function Deferred$1 () {
- return new D();
- }
- var _deferrals = /*#__PURE__*/_classPrivateFieldKey("deferrals");
- var Plugins = /*#__PURE__*/function () {
- function Plugins(app) {
- _classCallCheck(this, Plugins);
- Object.defineProperty(this, _deferrals, {
- writable: true,
- value: {}
- });
- this.app = app;
- }
- _createClass(Plugins, [{
- key: "add",
- value: function () {
- var _add = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(Plugin, config) {
- var _this = this;
- var plugin;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- plugin = Plugin(this.app, config);
- return _context.abrupt("return", new Promise(function (resolve, reject) {
- if (plugin.then) {
- plugin.then(function (instance) {
- if (!instance.$name) {
- return reject('require a plugin name');
- }
- if (_this[instance.$name]) {
- return resolve(_this[instance.$name]);
- }
- if (instance.$html) {
- if (instance.$scope) {
- instance.$scope.insertAdjacentHTML('beforeend', instance.$html);
- } else {
- _this.app.$plugins.insertAdjacentHTML('beforeend', instance.$html);
- }
- delete instance.$html;
- }
- _this[instance.$name] = instance;
- if (instance.$load) {
- instance.$load();
- delete instance.$load;
- }
- if (_classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name]) {
- _classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name].resolve(instance);
- }
- resolve(instance);
- });
- }
- }));
- case 2:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function add(_x, _x2) {
- return _add.apply(this, arguments);
- }
- return add;
- }()
- }, {
- key: "get",
- value: function get(name) {
- if (_classPrivateFieldBase(this, _deferrals)[_deferrals][name] == void 0) {
- _classPrivateFieldBase(this, _deferrals)[_deferrals][name] = Deferred$1();
- }
- return _classPrivateFieldBase(this, _deferrals)[_deferrals][name];
- }
- }]);
- return Plugins;
- }();
- var _components = /*#__PURE__*/_classPrivateFieldKey("components");
- /*
- * @Author: Rindy
- * @Date: 2021-09-15 09:31:50
- * @LastEditors: Rindy
- * @LastEditTime: 2021-11-01 10:40:09
- * @Description: Core Component
- */
- var Component = /*#__PURE__*/function () {
- function Component(app) {
- _classCallCheck(this, Component);
- Object.defineProperty(this, _components, {
- writable: true,
- value: void 0
- });
- this.app = app;
- _classPrivateFieldBase(this, _components)[_components] = {};
- }
- _createClass(Component, [{
- key: "add",
- value: function add(name, component) {
- if (['store', 'resource'].indexOf(name) == -1) {
- _classPrivateFieldBase(this, _components)[_components][name] = component;
- } else {
- this.app[name] = component;
- }
- }
- }, {
- key: "get",
- value: function get(name) {
- return _classPrivateFieldBase(this, _components)[_components][name];
- }
- }]);
- return Component;
- }();
- /*
- * @Author: Rindy
- * @Date: 2021-04-26 14:18:55
- * @LastEditors: Rindy
- * @LastEditTime: 2021-09-13 12:28:00
- * @Description: 注释
- */
- var baseOrigin = location.origin;
- var currentScript = (document.currentScript || {}).src;
- /**
- * 获取当前脚本路径
- */
- var getScriptURL = function () {
- if (!currentScript) {
- var a = {};
- try {
- a.b();
- } catch (e) {
- var stack = e.stack || e.sourceURL || e.stacktrace;
- var match = /(?:http|https|file):\/\/.*?\/.+?.js/.exec(stack);
- if (match) {
- currentScript = match[0];
- }
- }
- }
- var filepathPart = currentScript.split('/');
- filepathPart.pop();
- currentScript = filepathPart.join('/') + '/';
- return function () {
- return currentScript;
- };
- }();
- window.addEventListener('error', function (evt) {
- });
- function createScript(url) {
- var script = document.createElement('script');
- script.async = true; // Only add cross origin for actual cross origin
- // this is because Safari triggers for all
- // - https://bugs.webkit.org/show_bug.cgi?id=171566
- if (url.indexOf(baseOrigin + '/')) {
- script.crossOrigin = 'anonymous';
- }
- script.src = url;
- return script;
- }
- function loadScript(url, name, version) {
- return new Promise(function (resolve, reject) {
- var script = createScript(url + (version ? "?v=".concat(version) : ''));
- script.addEventListener('error', function () {
- console.error('load:' + url + ' error');
- reject();
- });
- script.addEventListener('load', function () {
- document.head.removeChild(script);
- resolve(name);
- });
- document.head.appendChild(script);
- });
- }
- function usePlugin(name, version) {
- return loadScript(getScriptURL() + 'plugins/' + name + '.js', name, version);
- }
- var GUI = /*#__PURE__*/function () {
- function GUI(app) {
- _classCallCheck(this, GUI);
- this.app = app;
- } // data可直接传String,默认为content
- /**
- * @param data
- * {
- type: String,
- delay: Number,
- content: String,
- showClose: Boolean
- }
- */
- _createClass(GUI, [{
- key: "toast",
- value: function toast(data) {
- // alert(data.content)
- this.app.emit('gui.toast', data);
- }
- /**
- * @param data
- * {
- title: { type: String, default: '提示' },
- okText: { type: String, default: '确定' },
- func: Function,
- content: String
- }
- */
- }, {
- key: "alert",
- value: function alert(data) {
- // alert(data)
- this.app.emit('gui.alert', data);
- }
- /**
- * @param data
- * {
- title: { type: String, default: '提示' },
- okText: { type: String, default: '确定' },
- noText: { type: String, default: '取消' },
- single: { type: Boolean, default: true },
- func: Function,
- content: String
- }
- */
- }, {
- key: "confirm",
- value: function confirm(data) {
- // alert(data)
- this.app.emit('gui.confirm', data);
- }
- }]);
- return GUI;
- }();
- function _arrayWithHoles(arr) {
- if (Array.isArray(arr)) return arr;
- }
- function _iterableToArrayLimit(arr, i) {
- var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
- if (_i == null) return;
- var _arr = [];
- var _n = true;
- var _d = false;
- var _s, _e;
- try {
- for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"] != null) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
- return _arr;
- }
- function _nonIterableRest() {
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
- }
- function _slicedToArray(arr, i) {
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$e(arr, i) || _nonIterableRest();
- }
- var math$2 = {
- getBaseLog(x, y) {
- //返回以 x 为底 y 的对数(即 logx y) . Math.log 返回一个数的自然对数
- return Math.log(y) / Math.log(x);
- },
- convertVisionVector: function convertVisionVector(e) {
- return new THREE.Vector3(e.x, e.z, -e.y);
- },
- invertVisionVector: function invertVisionVector(e) {
- //反转给算法部
- return new THREE.Vector3(e.x, -e.z, e.y);
- },
- convertVisionQuaternion: function convertVisionQuaternion(e) {
- 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)));
- },
- invertVisionQuaternion: function invertVisionQuaternion(e) {
- //反转给算法部
- var a = e.clone().multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(-90)));
- return new THREE.Quaternion(a.x, -a.z, a.y, a.w);
- },
- convertWorkshopVector: function convertWorkshopVector(e) {
- return new THREE.Vector3(-e.x, e.y, e.z);
- },
- convertWorkshopQuaternion: function convertWorkshopQuaternion(e) {
- 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));
- },
- convertWorkshopPanoramaQuaternion: function convertWorkshopPanoramaQuaternion(e) {
- 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)));
- },
- convertWorkshopOrthoZoom: function convertWorkshopOrthoZoom(e, dom) {
- //xzw
- return e === -1 ? -1 : e * (dom.clientHeight / dom.clientHeight);
- },
- getVec2Angle: function getVec2Angle(dir1, dir2) {
- return Math.acos(THREE.MathUtils.clamp(this.getVec2Cos(dir1, dir2), -1, 1));
- },
- getVec2Cos: function getVec2Cos(dir1, dir2) {
- return dir1.dot(dir2) / dir1.length() / dir2.length();
- },
- closeTo: function closeTo(a, b, num) {
- if (num != void 0) return Math.abs(a - b) < num;
- return Math.abs(a - b) < 1e-6;
- },
- toPrecision: function toPrecision(e, t) {
- //xzw change 保留小数
- var f = function f(e, t) {
- var i = Math.pow(10, t);
- return Math.round(e * i) / i;
- };
- if (e instanceof Array) {
- for (var s = 0; s < e.length; s++) {
- e[s] = f(e[s], t);
- }
- return e;
- } else if (e instanceof Object) {
- for (var s in e) {
- e[s] = f(e[s], t);
- }
- return e;
- } else return f(e, t);
- },
- isEmptyQuaternion: function isEmptyQuaternion(e) {
- return 0 === Math.abs(e.x) && 0 === Math.abs(e.y) && 0 === Math.abs(e.z) && 0 === Math.abs(e.w);
- },
- projectPositionToCanvas: function projectPositionToCanvas(e, t, i, domE) {
- i = i || new THREE.Vector3(), i.copy(e);
- var r = 0.5 * domE.clientWidth,
- o = 0.5 * domE.clientHeight;
- return i.project(t), i.x = i.x * r + r, i.y = -(i.y * o) + o, i;
- },
- convertScreenPositionToNDC: function convertScreenPositionToNDC(e, t, i, domE) {
- /* return i = i || new THREE.Vector2,
- i.x = e / window.innerWidth * 2 - 1,
- i.y = 2 * -(t / window.innerHeight) + 1,
- i
- */
- return i = i || new n.Vector2(), i.x = e / domE.clientWidth * 2 - 1, i.y = 2 * -(t / domE.clientHeight) + 1, i;
- },
- handelPadding: function () {
- //去除player左边和上面的宽高,因为pc的player左上有其他element 许钟文
- var pads = new Map(); //记录下来避免反复计算
- return function (x, y, domE) {
- var pad;
- var padInfo = pads.get(domE);
- if (padInfo) {
- if (domE.clientWidth == padInfo.width && domE.clientHeight == padInfo.height) {
- //resize
- pad = padInfo.pad;
- }
- }
- if (!pad) {
- pad = domE.getBoundingClientRect();
- pads.set(domE, {
- width: domE.clientWidth,
- height: domE.clientHeight,
- pad
- });
- }
- return {
- x: x - pad.x,
- y: y - pad.y
- };
- };
- }(),
- /* getOffset: function (type, element, parent) { //弃用,因body上的offset得不到
- //获取元素的边距 许钟文
- var offset = type == 'left' ? element.offsetLeft : element.offsetTop
- if (!parent) parent = document.body
- while ((element = element.offsetParent)) {
- if (element == parent) break
- offset += type == 'left' ? element.offsetLeft : element.offsetTop
- }
- return offset
- }, */
- constrainedTurn: function constrainedTurn(e) {
- var t = e % (2 * Math.PI);
- return t = t > Math.PI ? t -= 2 * Math.PI : t < -Math.PI ? t += 2 * Math.PI : t;
- },
- getFOVDotThreshold: function getFOVDotThreshold(e) {
- return Math.cos(THREE.MathUtils.degToRad(e / 2));
- },
- transform2DForwardVectorByCubeFace: function transform2DForwardVectorByCubeFace(e, t, i, n) {
- switch (e) {
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- i.set(1, t.y, t.x);
- break;
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- i.set(-1, t.y, -t.x);
- break;
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- i.set(-t.x, 1, -t.y);
- break;
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- i.set(-t.x, -1, t.y);
- break;
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- i.set(-t.x, t.y, 1);
- break;
- case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- i.set(t.x, t.y, -1);
- }
- n && i.normalize();
- },
- getFootPoint: function getFootPoint(oldPos, p1, p2, restricInline) {
- //找oldPos在线段p1, p2上的垂足
- /* if(isWorld){//输出全局坐标 需要考虑meshGroup.position
- p1 = p1.clone();
- p2 = p2.clone();
- p1.y += mainDesign.meshGroup.position.y;
- p2.y += mainDesign.meshGroup.position.y;
- } */
- var op1 = oldPos.clone().sub(p1);
- var p1p2 = p1.clone().sub(p2);
- var p1p2Len = p1p2.length();
- var leftLen = op1.dot(p1p2) / p1p2Len;
- var pos = p1.clone().add(p1p2.multiplyScalar(leftLen / p1p2Len));
- if (restricInline && pos.clone().sub(p1).dot(pos.clone().sub(p2)) > 0) {
- //foot不在线段上
- if (pos.distanceTo(p1) < pos.distanceTo(p2)) pos = p1.clone();else pos = p2.clone();
- }
- return pos;
- },
- /**
- * 计算多边形的重心
- * @param {*} points
- */
- getCenterOfGravityPoint: function getCenterOfGravityPoint(mPoints) {
- var area = 0.0; //多边形面积
- var Gx = 0.0,
- Gy = 0.0; // 重心的x、y
- for (var i = 1; i <= mPoints.length; i++) {
- var ix = mPoints[i % mPoints.length].x;
- var iy = mPoints[i % mPoints.length].y;
- var nx = mPoints[i - 1].x;
- var ny = mPoints[i - 1].y;
- var temp = (ix * ny - iy * nx) / 2.0;
- area += temp;
- Gx += temp * (ix + nx) / 3.0;
- Gy += temp * (iy + ny) / 3.0;
- }
- Gx = Gx / area;
- Gy = Gy / area;
- return {
- x: Gx,
- y: Gy
- };
- },
- getBound: function getBound(ring) {
- var bound = new THREE.Box2();
- for (var j = 0, len = ring.length; j < len; j++) {
- bound.expandByPoint(ring[j]);
- }
- return bound;
- },
- isPointInArea: function isPointInArea(ring, point, ifAtLine) {
- //判断点是否在某个环内
- var bound = this.getBound(ring);
- if (point.x < bound.min.x || point.x > bound.max.x || point.y < bound.min.y || point.y > bound.max.y) return false;
- var inside = false;
- var x = point.x,
- y = point.y;
- for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {
- var xi = ring[i].x,
- yi = ring[i].y;
- var xj = ring[j].x,
- yj = ring[j].y;
- if ((xi - x) * (yj - y) == (xi - x) * (yi - y) && x >= Math.min(xi, xj) && x <= Math.max(xi, xj) && //xzw add
- y >= Math.min(yi, yj) && y <= Math.max(yi, yj)) {
- return !!ifAtLine; //在线段上,则判断为…… (默认在外)
- }
- if (yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) {
- inside = !inside;
- }
- }
- return inside;
- },
- getArea: function getArea(ring) {
- //求面积 顺时针为正 来自three shape
- for (var t = ring.length, i = 0, n = t - 1, r = 0; r < t; n = r++) {
- i += ring[n].x * ring[r].y - ring[r].x * ring[n].y;
- }
- return -0.5 * i;
- },
- isInBetween: function isInBetween(a, b, c, precision) {
- // 如果b几乎等于a或c,返回false.为了避免浮点运行时两值几乎相等,但存在相差0.00000...0001的这种情况出现使用下面方式进行避免
- /* if (Math.abs(a - b) < 0.000001 || Math.abs(b - c) < 0.000001) {
- return false;
- }
- return (a <= b && b <= c) || (c <= b && b <= a);*/
- //更改:如果b和a或c中一个接近 就算在a和c之间
- return a <= b && b <= c || c <= b && b <= a || this.closeTo(a, b, precision) || this.closeTo(b, c, precision);
- },
- ifPointAtLineBound: function ifPointAtLineBound(point, linePoints, precision) {
- //待验证 横线和竖线比较特殊
- 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);
- },
- isLineIntersect: function isLineIntersect(line1, line2, notSegment) {
- //线段和线段是否有交点. notSegment代表是直线而不是线段
- var a1 = line1[1].y - line1[0].y;
- var b1 = line1[0].x - line1[1].x;
- var c1 = a1 * line1[0].x + b1 * line1[0].y; //转换成一般式: Ax+By = C
- var a2 = line2[1].y - line2[0].y;
- var b2 = line2[0].x - line2[1].x;
- var c2 = a2 * line2[0].x + b2 * line2[0].y; // 计算交点
- var d = a1 * b2 - a2 * b1; // 当d==0时,两线平行
- if (d == 0) {
- return false;
- } else {
- var x = (b2 * c1 - b1 * c2) / d;
- var y = (a1 * c2 - a2 * c1) / d; // 检测交点是否在两条线段上
- /* if (notSegment || (isInBetween(line1[0].x, x, line1[1].x) || isInBetween(line1[0].y, y, line1[1].y)) &&
- (isInBetween(line2[0].x, x, line2[1].x) || isInBetween(line2[0].y, y, line2[1].y))) {
- return {x,y};
- } */
- if (notSegment || math$2.ifPointAtLineBound({
- x,
- y
- }, line1) && math$2.ifPointAtLineBound({
- x,
- y
- }, line2)) {
- return {
- x,
- y
- };
- }
- }
- },
- getNormal: function getNormal(line2d) {
- //获取二维法向量 方向向内
- var x, y; //要求的向量
- //line2d的向量
- var x1 = line2d.points[1].x - line2d.points[0].x;
- var y1 = line2d.points[1].y - line2d.points[0].y; //假设法向量的x或y固定为1或-1
- if (y1 != 0) {
- x = 1;
- y = -(x1 * x) / y1;
- } else if (x1 != 0) {
- //y如果为0,正常情况x不会是0
- y = 1;
- x = -(y1 * y) / x1;
- } else {
- console.log('两个点一样');
- return null;
- } //判断方向里或者外:
- var vNormal = new THREE.Vector3(x, 0, y);
- var vLine = new THREE.Vector3(x1, 0, y1);
- var vDir = vNormal.cross(vLine);
- if (vDir.y > 0) {
- x *= -1;
- y *= -1;
- }
- return new THREE.Vector2(x, y).normalize();
- },
- getQuaBetween2Vector: function getQuaBetween2Vector(oriVec, newVec, upVec) {
- //似乎可以用quternion.setFromUnitVectors代替
- //获取从oriVec旋转到newVec可以应用的quaternion
- var angle = oriVec.angleTo(newVec);
- var axis = oriVec.clone().cross(newVec).normalize(); //两个up之间
- if (axis.length() == 0) {
- //当夹角为180 或 0 度时,得到的axis为(0,0,0),故使用备用的指定upVec
- return new THREE.Quaternion().setFromAxisAngle(upVec, angle);
- }
- return new THREE.Quaternion().setFromAxisAngle(axis, angle);
- },
- getScaleForConstantSize: function () {
- //获得规定二维大小的mesh的scale值。可以避免因camera的projection造成的mesh视觉大小改变。 来源:tag.updateDisc
- var w;
- var i = new THREE.Vector3(),
- o = new THREE.Vector3(),
- l = new THREE.Vector3(),
- c = new THREE.Vector3(),
- h = new THREE.Vector3();
- return function () {
- var op = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var player = op.player,
- nearBound = op.nearBound,
- farBound = op.farBound,
- farBoundPlan = op.farBoundPlan,
- minSize = op.minSize,
- maxSize = op.maxSize;
- var camera = op.camera || player.camera,
- dom = op.dom || player.domElement;
- if (op.width2d) w = op.width2d; //如果恒定二维宽度
- else {
- var _orthoCam;
- var currentDis, orthoProgress, orthoCam;
- if (player && (player.mode == 'floorplan' || player.mode == 'transitioning')) {
- var modes = player.modeTran.split('-');
- if (modes.includes('floorplan')) {
- orthoCam = player.cameraControls.cameras.floorplan;
- orthoProgress = player.mode == 'transitioning' ? modes[1] == 'floorplan' ? player.flyInOutProgress : 1 - player.flyInOutProgress : null;
- }
- }
- var dis = op.position.distanceTo(camera.position); //dollhouse要直接使用player.camera, 因为activeControl.camera没有更新matrixWorld
- if (!orthoCam && camera.type == 'OrthographicCamera') orthoCam = camera; //小地图
- if (((_orthoCam = orthoCam) === null || _orthoCam === void 0 ? void 0 : _orthoCam.type) == 'OrthographicCamera') {
- //floorplan要直接使用activeControl.camera,主要用到projectionMatrix
- var orthoZoom = (orthoCam.right - orthoCam.left) / orthoCam.zoom / 3;
- if (orthoProgress != void 0) {
- //transitioning
- currentDis = dis * (1 - orthoProgress) + orthoZoom * orthoProgress; //mix
- farBoundPlan != void 0 && (farBound = farBound * (1 - orthoProgress) + farBoundPlan * orthoProgress);
- op.log && console.log('orthoProgress', orthoProgress, 'dis', dis, 'orthoZoom', orthoZoom);
- } else {
- currentDis = orthoZoom;
- farBoundPlan != void 0 && (farBound = farBoundPlan);
- }
- } else {
- currentDis = dis;
- }
- if (nearBound == void 0 && farBound != void 0 || nearBound != void 0 && farBound == void 0) {
- //仅限制最大或最小的话,不判断像素大小,直接限制mesh的scale
- //这个判断也可以写到getScaleForConstantSize里,可以更严谨控制像素宽度,这里只简单计算大小
- var scale;
- if (farBound == void 0 && currentDis < nearBound) {
- scale = op.scale * currentDis / nearBound;
- } else if (nearBound == void 0 && currentDis > farBound) {
- scale = op.scale * currentDis / farBound;
- } else {
- scale = op.scale;
- }
- return scale;
- }
- w = maxSize - (maxSize - minSize) * THREE.MathUtils.smoothstep(currentDis, nearBound, farBound);
- op.log && console.log('w', w, 'currentDis', currentDis, 'farBound', farBound); //maxSize : mesh要表现的最大像素宽度; nearBound: 最近距离,若比nearBound近,则使用maxSize
- }
- i.copy(op.position).project(camera), //tag中心在屏幕上的二维坐标
- o.set(dom.clientWidth / 2, dom.clientHeight / 2, 1).multiply(i), //转化成px -w/2 到 w/2的范围
- l.set(w / 2, 0, 0).add(o), //加上tag宽度的一半
- c.set(2 / dom.clientWidth, 2 / dom.clientHeight, 1).multiply(l), //再转回 -1 到 1的范围
- h.copy(c).unproject(camera); //再转成三维坐标,求得tag边缘的位置
- var g = h.distanceTo(op.position); //就能得到tag的三维半径
- return g;
- };
- }(),
- //W , H, left, top分别是rect的宽、高、左、上
- getCrossPointAtRect: function getCrossPointAtRect(p1, aim, W, H, left, top) {
- //求射线p1-aim在rect边界上的交点,其中aim在rect范围内,p1则不一定(交点在aim这边的延长线上)
- var x, y, borderX;
- var r = (aim.x - p1.x) / (aim.y - p1.y); //根据相似三角形原理先求出这个比值
- var getX = function getX(y) {
- return r * (y - p1.y) + p1.x;
- };
- var getY = function getY(x) {
- return 1 / r * (x - p1.x) + p1.y;
- };
- if (aim.x >= p1.x) {
- borderX = W + left;
- } else {
- borderX = left;
- }
- x = borderX;
- y = getY(x);
- if (y < top || y > top + H) {
- if (y < top) {
- y = top;
- } else {
- y = top + H;
- }
- x = getX(y);
- }
- return new THREE.Vector2(x, y);
- },
- getDirFromUV: function getDirFromUV(uv) {
- //获取dir 反向计算 - - 二维转三维比较麻烦
- var dirB; //所求 单位向量
- uv.x %= 1;
- if (uv.x < 0) uv.x += 1; //调整为0-1
- var y = Math.cos(uv.y * Math.PI); //uv中纵向可以直接确定y, 根据上面getUVfromDir的反向计算
- var angle = 2 * Math.PI * uv.x - Math.PI; //x/z代表的是角度
- var axisZ; //axis为1代表是正,-1是负数
- if (-Math.PI / 2 <= angle && angle < Math.PI / 2) {
- axisZ = 1; //右半圆
- } else {
- axisZ = -1; //左半圆
- }
- var XDivideZ = Math.tan(angle);
- var z = Math.sqrt((1 - y * y) / (1 + XDivideZ * XDivideZ));
- var x = XDivideZ * z;
- if (z * axisZ < 0) {
- //异号
- z *= -1;
- x *= -1;
- }
- x *= -1; //计算完成后这里不能漏掉 *= -1
- dirB = new THREE.Vector3(x, y, z); //理想状态下x和z和anotherDir相同
- return dirB;
- },
- getUVfromDir: function getUVfromDir(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone();
- dir.x *= -1; //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5; //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI;
- return new THREE.Vector2(tx, ty); //理想状态下tx相同
- },
- crossRight: function crossRight(vec3, matrix) {
- //向量右乘矩阵,不能用向量的applyMatrix4(左乘)
- var e = matrix.elements;
- var v = new THREE.Vector3();
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3];
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7];
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]; //v.w不要
- return v;
- },
- getNormalDir: function getNormalDir(point,
- /* supportsTiles, */
- currentPano) {
- //获取A单位法线
- /* console.log("lookVector:")
- console.log(objects.player.cameraControls.activeControl.lookVector) */
- var dir = point.clone().sub(currentPano.position); //OA
- /* console.log("A的dir(无matrix转化):")
- console.log(dir.clone().normalize()); */
- if (currentPano.tiled) {
- var matrixWorld = currentPano.rot90Matrix.clone(); //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- } else {
- var matrixWorld = currentPano.matrixWorld.clone();
- }
- dir = this.crossRight(dir, matrixWorld); //右乘matrixWorld 得matrix转化的向量
- dir.normalize();
- /* var b = player.currentPano.skyboxMesh.matrixWorld.clone().getInverse(player.currentPano.skyboxMesh.matrixWorld)
- console.log(crossRight(dir,b).normalize()) */
- return dir;
- },
- getDirByLonLat: function getDirByLonLat(lon, lat) {
- var dir = new THREE.Vector3();
- var phi = THREE.MathUtils.degToRad(90 - lat);
- var theta = THREE.MathUtils.degToRad(lon);
- dir.x = Math.sin(phi) * Math.cos(theta);
- dir.y = Math.cos(phi);
- dir.z = Math.sin(phi) * Math.sin(theta);
- return dir;
- },
- //0,0 => (1,0,0) 270=>(0,0,-1)
- getYawByDir(dir) {
- return Math.atan2(-dir.z, dir.x); // - Math.PI / 2
- },
- getPitchByDir(dir) {
- dir = dir.clone().normalize(); //add
- var pitch;
- if (dir.x === 0 && dir.z === 0) {
- pitch = Math.PI / 2 * Math.sign(dir.y);
- } else {
- pitch = Math.atan2(dir.y, Math.sqrt(dir.x * dir.x + dir.z * dir.z));
- }
- return pitch;
- },
- getLineIntersect2() {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //得两条直线在其向量构成的面的法线方向的交点,投影在线上点的中点。
- if (o.A != void 0) {
- // Ap1为一条线,Bp2为一条线
- var A = o.A;
- var B = o.B;
- var p1 = o.p1 || new THREE.Vector3().addVctors(A, o.dir0);
- var p2 = o.p2 || new THREE.Vector3().addVctors(B, o.dir1);
- var dir0 = o.dir0 || new THREE.Vector3().subVectors(p1, A);
- var dir1 = o.dir1 || new THREE.Vector3().subVectors(p2, B);
- }
- if (A.equals(B)) return {
- pos3d: p1.clone()
- }; //寻找两个向量所在的面
- var normal = dir0.clone().cross(dir1); //面的法线
- //先把整体旋转到使在xz平面上,求完交点再转回来
- var qua = math$2.getQuaBetween2Vector(normal, new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, 1, 0));
- var newPoints = [A, B, p1, p2].map(function (e) {
- return e.clone().applyQuaternion(qua);
- });
- var pos2d = math$2.isLineIntersect([{
- x: newPoints[0].x,
- y: newPoints[0].z
- }, {
- x: newPoints[2].x,
- y: newPoints[2].z
- }], [{
- x: newPoints[1].x,
- y: newPoints[1].z
- }, {
- x: newPoints[3].x,
- y: newPoints[3].z
- }], true);
- var quaInverse = qua.clone().invert();
- var pos3d = new THREE.Vector3(pos2d.x, 0, pos2d.y);
- var pos3d1 = pos3d.clone().setY(newPoints[0].y);
- var pos3d2 = pos3d.clone().setY(newPoints[1].y);
- pos3d1.applyQuaternion(quaInverse);
- pos3d2.applyQuaternion(quaInverse);
- pos3d = new THREE.Vector3().addVectors(pos3d1, pos3d2).multiplyScalar(0.5);
- return {
- pos3d,
- mid1: pos3d1,
- mid2: pos3d2
- };
- },
- getLineIntersect(o) {
- //两条三维直线相交 //取两线最短线段中心点 并且不能超出起点
- o = o || {};
- if (o.A != void 0) {
- // Ap1为一条线,Bp2为一条线
- var A = o.A;
- var B = o.B;
- var p1 = o.p1;
- var p2 = o.p2;
- }
- if (A.equals(B)) return {
- pos3d: p1.clone()
- };
- /* console.log("v1:")
- console.log(A.clone().sub(p1).normalize())
- console.log("v2:")
- console.log(B.clone().sub(p2).normalize())
- */
- //调试热点夹角
- var line1 = p1.clone().sub(A).normalize();
- var line2 = p2.clone().sub(B).normalize();
- line1.angleTo(line2); //var pano = player.model.panos.index[player.posGets.list[1]]
- //console.log('真实两线夹角: ', THREE.MathUtils.radToDeg(angle)) /*+ "旧夹角min: "+getAngle(pano.recentAngleScore)+"("+pano.recentAngleScore+")" */
- //----------
- var compute = function compute() {
- var pos3d;
- var ux = p1.x - A.x;
- var uy = p1.y - A.y;
- var uz = p1.z - A.z;
- var vx = p2.x - B.x;
- var vy = p2.y - B.y;
- var vz = p2.z - B.z;
- var wx = A.x - B.x;
- var wy = A.y - B.y;
- var wz = A.z - B.z;
- var a = ux * ux + uy * uy + uz * uz; //u*u
- var b = ux * vx + uy * vy + uz * vz; //u*v
- var c = vx * vx + vy * vy + vz * vz; //v*v
- var d = ux * wx + uy * wy + uz * wz; //u*w
- var e = vx * wx + vy * wy + vz * wz; //v*w
- var dt = a * c - b * b;
- var sd = dt;
- var td = dt;
- var sn = 0.0; //sn = be-cd
- var tn = 0.0; //tn = ae-bd
- var behind = function (index) {
- //在后方交点的话,直接其中一个点 不用两posget点中心点是因为可能从不同方位 距离很大
- pos3d = (index == 1 ? p1 : p2).clone(); //console.log(pos3d , ' 在后方交点,使用点' + index)
- }.bind(this);
- if (math$2.closeTo(dt, 0.0)) {
- //两直线平行
- sn = 0.0; //在s上指定取s0
- sd = 1.0; //防止计算时除0错误
- tn = e; //按(公式3)求tc
- td = c;
- } else {
- sn = b * e - c * d;
- tn = a * e - b * d;
- if (sn < 0.0) {
- //最近点在s起点以外,同平行条件
- behind(1);
- return {
- pos3d,
- behind: true
- };
- }
- }
- if (tn < 0.0) {
- //最近点在t起点以外
- behind(2);
- return {
- pos3d,
- behind: true
- };
- }
- /* else if (tn > td){ //超出终点不限制
- tn = td;
- if ((-d + b) < 0.0)
- sn = 0.0;
- else if ((-d + b) > a)
- sn = sd;
- else
- {
- sn = (-d + b);
- sd = a;
- }
- } */
- var sc = 0.0;
- var tc = 0.0;
- if (math$2.closeTo(sn, 0.0)) sc = 0.0;else sc = sn / sd;
- if (math$2.closeTo(tn, 0.0)) tc = 0.0;else tc = tn / td; //两个最近点
- var mid1 = new THREE.Vector3(A.x + sc * ux, A.y + sc * uy, A.z + sc * uz);
- var mid2 = new THREE.Vector3(B.x + tc * vx, B.y + tc * vy, B.z + tc * vz);
- /* console.log("v11:")
- console.log(A.clone().sub(mid1).normalize())
- console.log("v22:")
- console.log(B.clone().sub(mid2).normalize()) */
- //console.log('另一个结果', math.getLineIntersect2(o)) //结果一样的,只是没有限制后方交点
- var r = {
- pos3d: mid1.clone().add(mid2).multiplyScalar(0.5),
- mid1,
- mid2
- };
- return r;
- };
- return compute(); //https://blog.csdn.net/u011511587/article/details/52063663 三维空间两直线/线段最短距离、线段计算算法
- },
- getAngle(vec1, vec2, axis) {
- var angle = vec1.angleTo(vec2);
- var axis_ = vec1.clone().cross(vec2);
- if (axis_[axis] < 0) {
- angle *= -1;
- }
- return angle;
- },
- linearClamp(value, xArr, yArr) {
- if (arguments.length == 5) {
- xArr = [arguments[1], arguments[2]];
- yArr = [arguments[3], arguments[4]];
- }
- var len = xArr.length;
- if (value <= xArr[0]) return yArr[0];
- if (value >= xArr[len - 1]) return yArr[len - 1];
- var i = 0;
- while (++i < len) {
- if (value < xArr[i]) {
- var x1 = xArr[i - 1],
- x2 = xArr[i],
- y1 = yArr[i - 1],
- y2 = yArr[i];
- value = y1 + (y2 - y1) * (value - x1) / (x2 - x1);
- break;
- }
- }
- return value;
- },
- isInsideFrustum(bounding, camera) {
- // bounding是否在视野范围内有可见部分(视野就是一个锥状box)
- var frustumMatrix = new THREE.Matrix4();
- frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
- var frustum = new THREE.Frustum();
- frustum.setFromProjectionMatrix(frustumMatrix);
- if (bounding instanceof THREE.Sphere) {
- return frustum.intersectsSphere(bounding);
- } else {
- return frustum.intersectsBox(bounding);
- }
- },
- getStandardYaw(yaw1, yaw2) {
- //使yaw1过渡到yaw2时朝角度差小的那边走。如果差距大于半个圆,就要反个方向转(把大的那个数字减去360度)
- if (Math.abs(yaw1 - yaw2) > Math.PI) {
- yaw1 > yaw2 ? yaw1 -= Math.PI * 2 : yaw2 -= Math.PI * 2;
- }
- return [yaw1, yaw2];
- }
- };
- var easing = {}; //渐变曲线函数,反应加速度的变化
- //currentTime:x轴当前时间(从0-到duration), startY:起始点, duration:总时长, wholeY:路程 (即endY-startY)
- //参数基本是 x, 0, 1, 1
- /*
- easeOut 基本是y= m * (x-dur)^k + n, 若k为偶数,m<0, 若k为奇数,m>0; (因为偶数的话必须开口向下才能获得斜率递减的递增的那段,而奇数是对称的,单调递增. )
- 根据x=0时y=0, x=dur时y=S , 得 n = S,m = -S/(-dur)^k
- */
- easing.getEaseOut = function (k) {
- // k 是>=2的整数. 越大变化率越大, 相同初始速度所需要时间越久
- var easeFun;
- k = Math.round(k);
- if (k < 2) {
- k = Math.PI / 2;
- easeFun = easing.easeOutSine;
- } else {
- easeFun = function easeFun(currentTime, startY, wholeY, duration) {
- if (k > 2) {
- console.log(k);
- }
- return -wholeY / Math.pow(-duration, k) * Math.pow(currentTime - duration, k) + wholeY;
- };
- }
- return {
- k,
- easeFun
- };
- };
- easing.linearTween = function (currentTime, startY, wholeY, duration) {
- return wholeY * currentTime / duration + startY;
- }, easing.easeInQuad = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, wholeY * currentTime * currentTime + startY;
- }, easing.easeOutQuad = function (currentTime, startY, wholeY, duration) {
- // 如套上实际的距离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
- return currentTime /= duration, -wholeY * currentTime * (currentTime - 2) + startY;
- }, easing.easeInOutQuad = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime + startY : (currentTime--, -wholeY / 2 * (currentTime * (currentTime - 2) - 1) + startY);
- }, easing.easeInCubic = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, wholeY * currentTime * currentTime * currentTime + startY;
- }, easing.easeOutCubic = function (currentTime, startY, wholeY, duration) {
- // y = S / dur^3 *(x-dur)^3 + S,对称中心是(dur,S),从0-dur是 斜率递减的递增函数,导数为3S/dur^3 * (x-dur)^2, 0时速度为3S/dur
- return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime + 1) + startY;
- }, easing.easeInOutCubic = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime + startY : (currentTime -= 2, wholeY / 2 * (currentTime * currentTime * currentTime + 2) + startY);
- }, easing.easeInQuart = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime + startY;
- }, easing.easeOutQuart = function (currentTime, startY, wholeY, duration) {
- //根据上面的计算,估计0时速度应该是4S/dur吧……
- return currentTime /= duration, currentTime--, -wholeY * (currentTime * currentTime * currentTime * currentTime - 1) + startY;
- }, easing.easeInOutQuart = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime * currentTime + startY : (currentTime -= 2, -wholeY / 2 * (currentTime * currentTime * currentTime * currentTime - 2) + startY);
- }, easing.easeInQuint = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime * currentTime + startY;
- }, easing.easeOutQuint = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime * currentTime * currentTime + 1) + startY;
- }, easing.easeInOutQuint = function (currentTime, startY, wholeY, duration) {
- 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);
- }, easing.easeInSine = function (currentTime, startY, wholeY, duration) {
- return -wholeY * Math.cos(currentTime / duration * (Math.PI / 2)) + wholeY + startY;
- }, easing.easeOutSine = function (currentTime, startY, wholeY, duration) {
- // y' = S * PI / 2 / dur * cos(PI/2/dur * x)
- return wholeY * Math.sin(currentTime / duration * (Math.PI / 2)) + startY;
- }, easing.easeInOutSine = function (currentTime, startY, wholeY, duration) {
- return -wholeY / 2 * (Math.cos(Math.PI * currentTime / duration) - 1) + startY;
- }, easing.easeInExpo = function (currentTime, startY, wholeY, duration) {
- return wholeY * Math.pow(2, 10 * (currentTime / duration - 1)) + startY;
- }, easing.easeOutExpo = function (currentTime, startY, wholeY, duration) {
- return wholeY * (-Math.pow(2, -10 * currentTime / duration) + 1) + startY;
- }, easing.easeInOutExpo = function (currentTime, startY, wholeY, duration) {
- 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);
- }, easing.easeInCirc = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, -wholeY * (Math.sqrt(1 - currentTime * currentTime) - 1) + startY;
- }, easing.easeOutCirc = function (currentTime, startY, wholeY, duration) {
- return currentTime /= duration, currentTime--, wholeY * Math.sqrt(1 - currentTime * currentTime) + startY;
- }, easing.easeInOutCirc = function (currentTime, startY, wholeY, duration) {
- 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);
- }, easing.easeInElastic = function (currentTime, startY, wholeY, duration) {
- var r = 1.70158,
- o = 0,
- a = wholeY;
- 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);
- }, easing.easeOutElastic = function (currentTime, startY, wholeY, duration) {
- var r = 1.70158,
- o = 0,
- a = wholeY;
- 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);
- }, easing.easeInOutElastic = function (currentTime, startY, wholeY, duration) {
- var r = 1.70158,
- o = 0,
- a = wholeY;
- 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);
- }, easing.easeInBack = function (currentTime, startY, wholeY, duration, r) {
- return void 0 === r && (r = 1.70158), wholeY * (currentTime /= duration) * currentTime * ((r + 1) * currentTime - r) + startY;
- }, easing.easeOutBack = function (currentTime, startY, wholeY, duration, r) {
- return void 0 === r && (r = 1.70158), wholeY * ((currentTime = currentTime / duration - 1) * currentTime * ((r + 1) * currentTime + r) + 1) + startY;
- }, easing.easeInOutBack = function (currentTime, startY, wholeY, duration, r) {
- 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;
- }, easing.easeOutBounce = function (currentTime, startY, wholeY, duration) {
- 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;
- }, easing.easeInBounce = function (currentTime, startY, wholeY, r) {
- return wholeY - easing.easeOutBounce(r - currentTime, 0, wholeY, r) + startY;
- }, easing.easeInOutBounce = function (currentTime, startY, wholeY, r) {
- 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;
- };
- var transitions$1 = {
- globalDone: null,
- funcs: [],
- counter: 0,
- uniqueID: 0,
- start(e, t, i) {
- var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
- var o = arguments.length > 4 ? arguments[4] : undefined;
- var a = arguments.length > 5 ? arguments[5] : undefined;
- var s = arguments.length > 6 ? arguments[6] : undefined;
- var cancelFun = arguments.length > 7 ? arguments[7] : undefined;
- var ignoreFirstFrame = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
- var object = {
- func: e,
- current: -r * Math.abs(t),
- duration: (1 - Math.max(r, 0)) * Math.abs(t),
- done: i,
- easing: o || easing.linearTween,
- cycling: t < 0,
- running: !0,
- debug: r < 0,
- name: a || 'T' + this.counter,
- id: void 0 === s ? this.counter : s,
- paused: !1,
- cancelFun: cancelFun,
- //取消时执行的函数
- updateCount: 0,
- //add
- ignoreFirstFrame //add
- };
- this.funcs.push(object);
- e(0, 16);
- this.counter += 1;
- return e;
- },
- trigger(e) {
- var t = void 0 === e.delayRatio ? 0 : e.delayRatio,
- i = e.func || function () {},
- r = void 0 === e.duration ? 0 : e.duration;
- void 0 !== e.cycling && e.cycling && (r = -Math.abs(r));
- var o = e.done || null,
- a = e.easing || easing.linearTween,
- s = e.name || 'R' + this.counter,
- l = void 0 === e.id ? this.counter : e.id;
- return this.start(i, r, o, t, a, s, l);
- },
- setTimeout(e, t, i) {
- var n = void 0 === i ? this.counter : i;
- return this.trigger({
- done: e,
- duration: void 0 === t ? 0 : t,
- name: 'O' + this.counter,
- id: n
- });
- },
- pause() {
- this.paused = !0;
- },
- resume() {
- this.paused = !1;
- },
- update(e) {
- this.funcs.forEach(function (t) {
- if (t.updateCount++ == 0 && t.ignoreFirstFrame) return; //add start可能发生在一帧中任意时刻,而每次update的是在一帧中的固定时刻,所以从start到第一次update的时间并不是所传入的delta,该delta 是上一帧的update到这一帧的update的耗时。 故去掉了第一次的update,相当于延迟一帧再update.
- if (!(t.paused || (t.current += 1e3 * e, t.current < 0))) if (t.current >= t.duration && !t.cycling) {
- var i = t.easing(1, 0, 1, 1);
- t.func(i, 1e3 * e), t.done && t.done(), t.running = !1;
- } else {
- var n = t.easing(t.current % t.duration / t.duration, 0, 1, 1),
- r = t.func(n, 1e3 * e) || !1;
- r && (t.done && t.done(), t.running = !1);
- }
- });
- var t = this.funcs.length;
- this.funcs = this.funcs.filter(function (e) {
- return e.running;
- });
- var i = this.funcs.length;
- if (t > 0 && 0 === i && this.globalDone) {
- var n = this.globalDone;
- this.globalDone = null, n();
- }
- },
- adjustSpeed(e, t) {
- for (var i = this.getById(e), n = 0; n < i.length; n++) {
- var r = i[n];
- r.duration /= t, r.current /= t;
- }
- },
- getById(e) {
- return this.funcs.filter(function (t) {
- return e === t.id;
- });
- },
- get(e) {
- for (var t = 0; t < this.funcs.length; t += 1) {
- if (this.funcs[t].func === e) return this.funcs[t];
- }
- return null;
- },
- isRunning(e) {
- var t = this.get(e);
- return null !== t && t.running;
- },
- countActive() {
- for (var e = 0, t = 0; t < this.funcs.length; t += 1) {
- e += this.funcs[t].running;
- }
- return e;
- },
- listActive() {
- for (var e = [], t = 0; t < this.funcs.length; t += 1) {
- this.funcs[t].running && e.push(this.funcs[t].name);
- }
- return e;
- },
- done(e) {
- this.globalDone = e;
- },
- cancelById: function cancelById(e, dealCancelFun) {
- //xzw add dealDone
- var t = void 0 === e ? 0 : e;
- this.funcs = this.funcs.filter(function (e) {
- var is = e.id == t;
- if (is && dealCancelFun) {
- e.cancelFun && e.cancelFun();
- }
- return !is;
- });
- },
- cancel(e) {
- this.funcs = this.funcs.filter(function (t) {
- return t.func !== e;
- });
- },
- getUniqueId() {
- return this.uniqueID -= 1, this.uniqueID;
- }
- };
- var RenderLayers = {
- DEFAULT: 0,
- //mesh默认都会显示在DEFAULT层。若不要需要手动toggle(DEFAULT)
- MODEL: 1,
- SKYBOX: 2,
- PANOMARKERS: 3,
- //这三个是在截图时用到的,其实也可以不用分这么多
- RETICULE: 4,
- // add by xzw:
- Tag3d: 5,
- SubScreen: 6,
- Monitor: 7,
- cursor_mini: 8,
- magnifierContent: 9
- };
- function _superPropBase(object, property) {
- while (!Object.prototype.hasOwnProperty.call(object, property)) {
- object = _getPrototypeOf(object);
- if (object === null) break;
- }
- return object;
- }
- function _get(target, property, receiver) {
- if (typeof Reflect !== "undefined" && Reflect.get) {
- _get = Reflect.get;
- } else {
- _get = function _get(target, property, receiver) {
- var base = _superPropBase(target, property);
- if (!base) return;
- var desc = Object.getOwnPropertyDescriptor(base, property);
- if (desc.get) {
- return desc.get.call(receiver);
- }
- return desc.value;
- };
- }
- return _get(target, property, receiver || target);
- }
- var ray$3 = new THREE.Raycaster();
- var convertTool = {
- getPos2d: function getPos2d(point, player, camera, dom) {
- //获取一个三维坐标对应屏幕中的二维坐标
- var camera = camera || player.camera;
- var dom = dom || player.domElement;
- 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);
- var x, y;
- x = (pos.x + 1) / 2 * dom.clientWidth;
- y = (1 - (pos.y + 1) / 2) * dom.clientHeight;
- var inSight = x <= dom.clientWidth && x >= 0 && //是否在屏幕中
- y <= dom.clientHeight && y >= 0;
- return {
- pos: new THREE.Vector2(x, y),
- // 屏幕像素坐标
- vector: pos,
- //(范围 -1 ~ 1)
- trueSide: pos.z < 1,
- //trueSide为false时,即使在屏幕范围内可见,也是反方向的另一个不可以被渲染的点 参见Tag.update
- inSight: inSight //在屏幕范围内可见
- };
- },
- ifShelter: function ifShelter(pos3d, player, pos2d, camera, floorIndex) {
- //检测某点在视线中是否被mesh遮挡
- if (!pos2d) pos2d = this.getPos2d(pos3d, player);
- camera = camera || player.camera;
- var ori = new THREE.Vector3(pos2d.x, pos2d.y, -1).unproject(camera); //找到视线原点
- var dir = pos3d.clone().sub(ori).normalize();
- ray$3.set(ori, dir); //由外向里 因为模型从内侧是可见的所以从外侧
- /* if(config.isEdit && publicObjectSet.editor.mainDesign.editing){
- var o = ray.intersectObjects(publicObjectSet.editor.mainDesign.wallMeshes);
- }else{ */
- var colliders = floorIndex == void 0 ? player.model.colliders : player.model.floors.index[floorIndex].collider.children;
- var o = ray$3.intersectObjects(colliders); //}
- var len = pos3d.distanceTo(ori);
- if (o && o.length) {
- for (var i = 0; i < o.length; i++) {
- if (o[i].distance < len) {
- return true;
- } //有遮挡
- }
- }
- },
- /*
- 拖拽时,获取鼠标在拖拽面上的位置(需要借助另一个intersectPlane面来计算,即和相机方向一样的面,可保证铺满屏幕)
- 但是不一定能获取到,比如鼠标射线不朝向拖拽面时,即使获取也会是一个意外的反方向的交点。
- */
- getPosAtPlane: function getPosAtPlane(pos, player, info
- /* , mouse, camera */
- ) {
- //pos:与intersectPlane的交点 见笔记
- var A = pos;
- var mouse = player.mouse;
- var O = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(player.camera);
- if (info.y != void 0) {
- //地面线的
- var y = info.y;
- if (player.mode == 'floorplan'
- /* || Math.abs(O.x-pos.x)<0.0001 && Math.abs(O.z-pos.z)<0.0001) */
- ) {
- //intersectPlane和地面平行,无交点
- var x = pos.x,
- z = pos.z;
- } else {
- if (y < player.camera.position.y && O.y <= A.y
- /* || y>player.camera.position.y && O.y >= A.y */
- ) return null; //鼠标射线向上。因为相机一定位于地面以上(地面不会抬高到相机上吧?),所以无交点。
- if (O.y == A.y) {
- console.log('一样??');
- return;
- }
- if (A.y == y) {
- console.log('一样2??');
- return;
- }
- var r = (O.y - y) / (A.y - y);
- var x = (r * A.x - O.x) / (r - 1);
- var z = (r * A.z - O.z) / (r - 1);
- }
- } else {
- //垂直的也有越过消失点以后反向变化的情况,但使用时影响不大
- var N = info.normalVec;
- var P = info.pullPos;
- if (N.y != 0) {
- console.log('N.y != 0');
- return;
- } //仅仅支持垂直于地面的的墙壁,目前都是
- if (O.z == A.z) {
- console.log('O.z==A.z?');
- return;
- }
- if (N.z != 0 && N.x != 0) {
- //直接用这个通用的也可以,支持斜线的墙
- //console.log('N.z==0 && N.x == 0?');
- var c = N.x * (A.x - O.x) + N.y * (A.y - O.y) + N.z * (A.z - O.z);
- if (c == 0) {
- console.log('分母为0?? return;');
- return;
- }
- 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;
- var x = t * (A.x - O.x) + O.x;
- var y = t * (A.y - O.y) + O.y;
- var z = t * (A.z - O.z) + O.z;
- /*原理: 已知空间直线L:(x-a)/m=(x-b)/n=(z-c)/p和空间平面π:Ax+By+Cz+D=0;
- 求直线L与平面π的交点的坐标。
- 把直线方程改写成参数形式:设(x-a)/m=(x-b)/n=(z-c)/p=t;
- 则x=mt+a;y=nt+b;z=pt+c;代入平面π的方程得:
- A(mt+a)+B(nt+b)+C(pt+c)+D=0
- 由此解得t=-(Aa+Bb+Cc+D)/(Am+Bn+Cp)
- 再代入参数方程即得交点的坐标(x,y,z). */
- } else if (N.x == 0) {
- //z与pullPos相等
- var z = P.z;
- if (O.y == A.y) {
- console.log('一样??');
- return;
- }
- if (A.y == y) {
- console.log('一样2??');
- return;
- }
- if (A.z == z) {
- console.log('一样3??');
- return;
- }
- var r = (O.z - z) / (A.z - z);
- var x = (r * A.x - O.x) / (r - 1);
- var y = (r * A.y - O.y) / (r - 1);
- } else if (N.z == 0) {
- //x与pullPos相等
- var x = P.x;
- if (O.y == A.y) {
- console.log('一样??');
- return;
- }
- if (A.y == y) {
- console.log('一样2??');
- return;
- }
- if (A.x == x) {
- console.log('一样3??');
- return;
- }
- var r = (O.x - x) / (A.x - x);
- var y = (r * A.y - O.y) / (r - 1);
- var z = (r * A.z - O.z) / (r - 1);
- }
- }
- return new THREE.Vector3(x, y, z);
- },
- getMouseIntersect: function getMouseIntersect(camera, meshes, mouse) {
- //获取鼠标和meshes交点
- var raycaster = new THREE.Raycaster();
- camera.updateMatrixWorld();
- var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(camera),
- end = new THREE.Vector3(mouse.x, mouse.y, 1).unproject(camera);
- var dir = end.sub(origin).normalize();
- raycaster.set(origin, dir);
- meshes.forEach(function (e) {
- raycaster.layers.enable(math$2.getBaseLog(2, e.layers.mask));
- });
- var n = raycaster.intersectObjects(meshes);
- if (0 === n.length) return null;
- var i = n.find(function (e) {
- return e.object.visible === true;
- });
- if (i) return i;
- return null;
- },
- ifIntersectChunks: function ifIntersectChunks(A, B, model) {
- var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
- //获取某个线段/射线和meshes的交点
- var dir = B.clone().sub(A).normalize();
- var len = options.InfinityLen ? Infinity : A.distanceTo(B) + (options.extLen || 0);
- if (len == 0) return;
- var ray = new THREE.Raycaster(A.clone(), dir, 0, len);
- var meshes = options.meshes || [];
- if (meshes.length == 0) {
- meshes = model.floors.reduce(function (e, t) {
- return t.hidden ? e : e.concat(t.collider.children);
- }, meshes);
- }
- var o = ray.intersectObjects(meshes); //var o = ray.intersectObjects(options.meshes || model.colliders)
- if (o && o.length) return o;
- if (options.throughWidth) {
- //允许最小宽度,防止穿过极小的缝隙导致撞墙感
- var normal = math$2.getNormal({
- points: [{
- x: A.x,
- y: A.z
- }, {
- x: B.x,
- y: B.z
- }]
- }); //线段法线
- normal.multiplyScalar(options.throughWidth);
- var normalVec3 = new THREE.Vector3(normal.x, 0, normal.y);
- var A2 = A.clone().add(normalVec3);
- ray.set(A2, dir);
- var o2 = ray.intersectObjects(options.meshes || model.colliders);
- ray.set(A.clone().add(normalVec3.negate()), dir);
- if (o2 && o2.length) return o2;
- var o3 = ray.intersectObjects(options.meshes || model.colliders);
- if (o3 && o3.length) return o3;
- }
- return null;
- },
- /* getPosAtSphere : function(pos3d, toPanoPos){
- var dir = pos3d.clone().sub(toPanoPos);
- dir.normalize();//然后计算在球中
- dir.multiplyScalar(Constants.skyRadius);
- dir.add(toPanoPos);
- return dir;
- }, */
- getVisiblePano: function getVisiblePano(position, model) {
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- //获取某个坐标的可见pano。即没有遮挡的位置。
- var visiblePanos = []; //var wallDepth = 0.075, discScale = 0.06;
- var B = position.clone();
- var panos = options.panos || model.panos.list;
- panos.forEach(function (pano) {
- if (!pano.isAligned()) return;
- var A = pano.position.clone();
- var distance = A.distanceTo(B);
- if (options.maxDis != void 0 && distance > options.maxDis) {
- //超出这个距离不可见
- //console.log('超出',pano.id, distance-options.maxDis)
- return;
- }
- var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, distance - (options.tolerance || 0));
- /* discScale / 2 - wallDepth */
- var o = ray.intersectObjects(options.model || model.colliders, true);
- /* if(o && o.length){
- console.log('ex', pano.id, distance - o[0].distance)
- }else console.log('visi',pano.id) */
- if (!o || !o.length) visiblePanos.push(pano);
- });
- return visiblePanos;
- },
- raycastToFindFloor: function () {
- //八个方向上寻找floor,返回碰撞到最多的floor
- 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)];
- return function (player, position) {
- /* var floors = []; //有时候在建筑外侧,容易识别到其他层
- var max = {floor:null,count:0};
- for (var t = 0; t < e.length; t++) {
- var i = new THREE.Raycaster(position.clone(), e[t].clone())
- , n = i.intersectObjects(objects.model.colliders);
- if (n.length){
- var floor = n[0].object.parent.parent
- var item = floors.find(item=>item.floor == floor)
- if(item)item.len++
- else floors.push({floor:floor , len:1})
- }
- }
-
- floors.sort((a,b)=>{b.len-a.len})
-
- if(floors[0]) return floors[0].floor */
- var floors = [],
- colliders = [],
- floorScores = [];
- for (var u in player.model.floors.list) {
- //寻找高度区间
- var floor = player.model.floors.list[u];
- if (position.y >= floor.boundingBox.min.y && position.y <= floor.boundingBox.max.y) {
- floors.push(floor);
- colliders.push.apply(colliders, _toConsumableArray(floor.collider.children)); //在floor区间的话就添加
- }
- }
- if (floors.length == 1) return floors[0];else if (floors.length > 1) {
- //寻找 raycaster最多的floor
- for (var t = 0; t < e.length; t++) {
- var i = new THREE.Raycaster(position.clone(), e[t].clone()),
- n = i.intersectObjects(colliders);
- if (n.length) {
- (function () {
- var floor = n[0].object.parent.floor;
- var item = floorScores.find(function (item) {
- return item.floor == floor;
- });
- if (item) item.len++;else floorScores.push({
- floor: floor,
- len: 1
- });
- })();
- }
- }
- floorScores.sort(function (a, b) {
- b.len - a.len;
- }); //可能数量一致
- if (floorScores[0]) return floorScores[0].floor;else {
- //如果找不到mesh,直接用boundingbox
- floorScores = [];
- floors.forEach(function (floor) {
- var box = floor.boundingBox;
- 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)];
- var dis = 0;
- points.forEach(function (p) {
- return dis += p.distanceTo(position);
- });
- floorScores.push({
- floor,
- dis
- });
- });
- floorScores.sort(function (a, b) {
- a.dis - b.dis;
- }); //选择boundingbox八个点到position最短的
- return floorScores[0].floor;
- }
- } else {
- //超出floor区间后要么是第一层,要么是最后一层(因为寻找最接近的)
- if (position.y < player.model.floors.list[0].center.y) {
- //比随意一层低 即 低于最低层
- var floors = player.model.floors.list.sort(function (f1, f2) {
- return f1.boundingBox.min.y - f2.boundingBox.min.y;
- });
- return floors[0];
- } else {
- var floors = player.model.floors.list.sort(function (f1, f2) {
- return f2.boundingBox.max.y - f1.boundingBox.max.y;
- });
- return floors[0];
- }
- }
- /* 思路笔记:1 即使1个面片都能成为floor,可能是底面,可能是墙
- 2 且这个floor还不一定有panos
- 3 根据上述特征 最好是根据在不同panos的visible来判断楼层
- 4 但是存在一个bug : 漫游点和mesh之间可能不对应,也就是看上去在某个楼层,飞出后发现它对应的mesh是另一个。。(这个是明显错误。可以推给算法部)
- 5 在漫游时和楼层无关,一直显示overlay的。所以重点是要让飞出来的mesh看上去和overlay对应。所以直接考虑mesh即可。这样可以避开4
- */
- };
- }(),
- getQuaByAim: function getQuaByAim(aim) {
- var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE.Vector3();
- var up = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new THREE.Vector3(0, 1, 0);
- //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
- /* let aimQua = new THREE.Quaternion().setFromUnitVectors(//一个单位向量旋转到另一个单位向量的最短路径
- forward, //2026.3:如果之后还要这种的就加参数吧
- aim
- .clone()
- .sub(center)
- .normalize()
- ) */
- var _ = new THREE.Matrix4().lookAt(center, aim, up),
- aimQua = new THREE.Quaternion().setFromRotationMatrix(_); //这二者结果不一定相同,setFromUnitVectors可能使roll不为0
- return aimQua;
- },
- getAimByQua: function getAimByQua(quaternion, center) {
- return new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(center);
- },
- projectedRadius(radius, camera, distance, screenWidth, screenHeight) {
- //from Potree
- if (camera instanceof THREE.OrthographicCamera) {
- return this.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight);
- } else if (camera instanceof THREE.PerspectiveCamera) {
- return this.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight);
- }
- },
- projectedRadiusPerspective(radius, fov, distance, screenHeight) {
- var projFactor = 1 / Math.tan(fov / 2) / distance;
- projFactor = projFactor * screenHeight / 2;
- return radius * projFactor;
- },
- projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) {
- var p1 = new THREE.Vector4(0);
- var p2 = new THREE.Vector4(radius);
- p1.applyMatrix4(proj);
- p2.applyMatrix4(proj);
- p1 = new THREE.Vector3(p1.x, p1.y, p1.z);
- p2 = new THREE.Vector3(p2.x, p2.y, p2.z);
- p1.x = (p1.x + 1.0) * 0.5 * screenWidth;
- p1.y = (p1.y + 1.0) * 0.5 * screenHeight;
- p2.x = (p2.x + 1.0) * 0.5 * screenWidth;
- p2.y = (p2.y + 1.0) * 0.5 * screenHeight;
- return p1.distanceTo(p2);
- }
- };
- 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); }; }
- 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; } }
- var geo = new THREE.PlaneBufferGeometry(1, 1);
- var player$p;
- var Sprite = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(Sprite, _THREE$Mesh);
- var _super = _createSuper$1Q(Sprite);
- function Sprite() {
- var _player;
- var _this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- _classCallCheck(this, Sprite);
- _this = _super.call(this, geo, options.mat || new THREE.MeshBasicMaterial({
- map: options.map,
- color: 0xffffff,
- transparent: true,
- depthTest: false,
- depthWrite: false
- }));
- player$p || (player$p = options.player);
- _this.root = options.root || _assertThisInitialized(_this);
- _this.renderOrder = options.renderOrder != void 0 ? options.renderOrder : 4;
- _this.pickOrder = options.pickOrder || 0;
- _this.sizeInfo = options.sizeInfo;
- _this.fixOrient = options.fixOrient;
- _this.options = options;
- options.transform2D && (_this.position.x = options.transform2D.x, _this.position.y = options.transform2D.y); //偏移
- _this.name = options.name || 'sprite';
- _this.useViewport = null;
- _this.visible_ = true;
- _this.events = {
- updatePose: _this.update.bind(_assertThisInitialized(_this))
- };
- (_player = player$p) === null || _player === void 0 ? void 0 : _player.on('update', _this.events.updatePose);
- _this.root.addEventListener('isVisible', function (e) {
- if (e.visible) {
- _this.update();
- }
- });
- return _this;
- }
- _createClass(Sprite, [{
- key: "waitUpdate",
- value: function waitUpdate() {
- this.needsUpdate = true; //this.matrixMap.clear()//清空后在所有viewport上都必须更新才能渲染
- }
- /* realVisible() {
- if (!this.visible && this.unvisibleReasons && this.unvisibleReasons.some(e => e.reason != 'unableCompute')) {
- return false
- }
- return common.realVisible(this.root)
- } */
- }, {
- key: "realVisible",
- value: function realVisible() {
- if (!this.visible && this.unvisibleReasons && this.unvisibleReasons.some(function (e) {
- return e.reason != 'unableCompute';
- })) {
- return false;
- }
- return _get(_getPrototypeOf(Sprite.prototype), "realVisible", this).call(this.root);
- }
- }, {
- key: "update",
- value: function update() {
- var _this2 = this;
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- _ref$lastFrameChanged = _ref.lastFrameChanged,
- lastFrameChanged = _ref$lastFrameChanged === void 0 ? 'level3' : _ref$lastFrameChanged;
- if (lastFrameChanged && lastFrameChanged.split('level')[1] > 1) this.needsUpdate = true; //飞出后总是在微小地变几乎看不出来,忽略
- if (!this.realVisible() || !this.needsUpdate) return;
- this.needsUpdate = false;
- if (!this.fixOrient) {
- //orthoCamera一般要加dontFixOrient
- var orient2dAngle;
- if (this.root.lineDir) {
- this.root.updateMatrix(); //先更新,getWorldPosition才能得到正确的
- this.root.updateMatrixWorld(true);
- var center = this.root.getWorldPosition(new THREE.Vector3()); //由于两个端点容易在屏幕外,所以使用center和center加dir
- var setVisi = function setVisi(state) {
- //this.visiMap.set(e.viewport, state)
- common$1.updateVisible(_this2, 'unableCompute', !!state); //赋值原先的,否则之后每次render都触发update:
- /* this.matrixMap.set(e.viewport, this.matrix.clone())
- this.matrixMapRoot.set(e.viewport, this.root.matrix.clone()) */
- };
- var r1 = convertTool.getPos2d(center, player$p);
- if (!r1.trueSide) return setVisi(false); // 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
- var r2, point2;
- var p2State = '',
- len = 1,
- p2StateHistory = [];
- while (p2State != 'got' && p2StateHistory.length < 10) {
- point2 = center.clone().add(this.root.lineDir.clone().multiplyScalar(len));
- r2 = convertTool.getPos2d(point2, player$p);
- if (!r2.trueSide) {
- //很少遇到点2在背面的
- if (!p2StateHistory.includes('tooLong-reverse')) {
- p2State = 'tooLong-reverse'; //先尝试反向
- len = -len;
- } else {
- p2State = 'tooLong';
- len = len / 2;
- }
- } else {
- var dis = r2.pos.distanceTo(r1.pos);
- if (math$2.closeTo(dis, 0)) {
- //console.log('dis == 0')
- return setVisi(false);
- }
- if (dis < 10 && !p2StateHistory.includes('tooLong')) {
- //和r1的屏幕距离太近,要加长,否则精度过低
- p2State = 'tooShort';
- len = 100 / dis * len;
- } else {
- p2State = 'got';
- break;
- }
- }
- p2StateHistory.push(p2State);
- } //console.log(p2StateHistory,len)
- if (!r2.trueSide) {
- return setVisi(false); //, console.log(' !r2.trueSide', )
- }
- var p1 = r1.pos,
- p2 = r2.pos;
- if (p2StateHistory.filter(function (e) {
- return e == 'tooLong-reverse';
- }).length % 2 == 1) {
- p2 = r1.pos, p1 = r2.pos;
- }
- var vec = new THREE.Vector2().subVectors(p1, p2);
- orient2dAngle = -vec.angle(); //根据测量线在屏幕上的角度在旋转label,使之和屏幕上的二维线平行。
- var y = Math.abs(this.position.y);
- var facePlane = this.root.measure && this.root.measure.facePlane;
- var eyeDir = new THREE.Vector3().subVectors(center, player$p.position);
- var clockWise = facePlane && facePlane.normal.dot(eyeDir) < 0;
- if (p1.x < p2.x) {
- orient2dAngle += Math.PI; //避免字是倒着的情况。(使字一直在线的下方)
- clockWise != void 0 && (this.position.y = clockWise ? y : -y);
- } else {
- clockWise != void 0 && (this.position.y = clockWise ? -y : y); //使area类型的edgeLabel都在外侧
- } //this.parent.text && console.log(this.parent.text, clockWise, this.position.y, e.viewport.name /* THREE.Math.radToDeg(angle), p1.x < p2.x */ )
- setVisi(true);
- }
- var parentQua = this.root.parent.getWorldQuaternion(new THREE.Quaternion());
- this.root.quaternion.multiplyQuaternions(parentQua.invert(), player$p.quaternion); //乘上parentQua.invert()是为了中和掉父结点的qua,使只剩下camera.quaternion
- if (orient2dAngle) {
- var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), orient2dAngle);
- this.root.quaternion.multiply(qua);
- }
- }
- if (this.sizeInfo) {
- //window.logSprite || (this.log111 = window.logSprite = true)
- var s = math$2.getScaleForConstantSize(Object.assign({
- player: player$p,
- log: this.log111
- }, this.sizeInfo, {
- //farBound: player.mode == 'floorplan' ? this.sizeInfo.farBoundPlan || this.sizeInfo.farBound : this.sizeInfo.farBound,
- position: this.root.getWorldPosition(new THREE.Vector3())
- }));
- this.root.scale.set(s, s, s);
- }
- this.afterUpdate && this.afterUpdate();
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var _this$parent, _player2;
- this.material.dispose();
- (_this$parent = this.parent) === null || _this$parent === void 0 ? void 0 : _this$parent.remove(this);
- this.dispatchEvent('dispose');
- this.events.updatePos && ((_player2 = player$p) === null || _player2 === void 0 ? void 0 : _player2.off('update', this.events.updatePose));
- this._listeners = [];
- }
- }]);
- return Sprite;
- }(THREE.Mesh);
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var TextSprite = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(TextSprite, _THREE$Object3D);
- var _super = _createSuper$1P(TextSprite);
- function TextSprite() {
- var _this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- _classCallCheck(this, TextSprite);
- _this = _super.call(this);
- var map = new THREE.Texture();
- map.minFilter = THREE.LinearFilter; //缩小效果都不好,sizeInfo尽量放大些,用框选工具测出像素宽度大于map.image.width即可
- map.magFilter = THREE.NearestFilter; //试过 放大后可以很清晰
- map.anisotropy = map.anisotropy__ = options.fixOrient ? 4 : 1;
- _this.sprite = new Sprite(Object.assign({
- root: _assertThisInitialized(_this)
- }, options, {
- map
- }));
- _this.add(_this.sprite);
- _this.fontWeight = options.fontWeight == void 0 ?
- /* 'Bold' */
- '' : options.fontWeight;
- _this.rectBorderThick = options.rectBorderThick || 0;
- _this.textBorderThick = options.textBorderThick || 0;
- _this.fontface = 'Arial';
- _this.fontsize = options.fontsize || 16;
- _this.textBorderColor = options.textBorderColor ? common$1.CloneObject(options.textBorderColor) : {
- r: 0,
- g: 0,
- b: 0,
- a: 1.0
- };
- _this.backgroundColor = options.backgroundColor ? common$1.CloneObject(options.backgroundColor) : {
- r: 255,
- g: 255,
- b: 255,
- a: 0.7
- };
- _this.textColor = options.textColor ? common$1.CloneObject(options.textColor) : {
- r: 0,
- g: 0,
- b: 0,
- a: 1.0
- };
- _this.borderColor = options.borderColor || {
- r: 0,
- g: 0,
- b: 0,
- a: 0.0
- };
- _this.borderRadius = options.borderRadius == void 0 ? 6 : options.borderRadius;
- _this.margin = options.margin;
- _this.textshadowColor = options.textshadowColor;
- _this.textAlign = options.textAlign || 'center';
- _this.name = options.name;
- _this.sizeInfo = options.sizeInfo;
- _this.lineSpace = options.lineSpace;
- _this.maxLineWidth = options.maxLineWidth;
- _this.addEventListener('dispose', _this.dispose.bind(_assertThisInitialized(_this)));
- _this.fixOrient = options.fixOrient;
- _this.transform2Dpercent = options.transform2Dpercent;
- _this.dontBreakWords = options.dontBreakWords;
- _this.setText(options.text);
- _this.updatePose();
- return _this;
- }
- _createClass(TextSprite, [{
- key: "updatePose",
- value: function updatePose() {
- this.sprite.waitUpdate();
- }
- }, {
- key: "setText",
- value: function setText(text) {
- if (text == void 0) text = '';
- if (this.text !== text) {
- if (!(text instanceof Array)) {
- this.text = (text + '').split('\n'); //如果是input手动输入的\n这里会是\\n且不会被拆分, 绘制的依然是\n。
- //this.text = [text + '']
- } else this.text = text;
- this.updateTexture();
- }
- }
- }, {
- key: "setPos",
- value: function setPos(pos) {
- this.position.copy(pos);
- this.sprite.waitUpdate();
- }
- }, {
- key: "setTextColor",
- value: function setTextColor(color) {
- this.textColor = color;
- this.updateTexture();
- }
- }, {
- key: "tranColor",
- value: function tranColor(c) {
- var a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- if (c.isVector4) a = c.w;else if (!c.isColor) c = new THREE.Color(c);
- return {
- r: c.r * 255,
- g: c.g * 255,
- b: c.b * 255,
- a
- };
- }
- }, {
- key: "setBorderColor",
- value: function setBorderColor(color) {
- this.borderColor = color;
- this.updateTexture();
- }
- }, {
- key: "setBackgroundColor",
- value: function setBackgroundColor(color) {
- this.backgroundColor = color;
- this.updateTexture();
- }
- }, {
- key: "setVisible",
- value: function setVisible(v) {
- this.visible = v;
- }
- }, {
- key: "setUniforms",
- value: function setUniforms(name, value) {
- this.sprite.setUniforms(name, value);
- }
- }, {
- key: "updateTexture",
- value: function updateTexture() {
- var _this2 = this;
- //canvas原点在左上角
- var canvas = document.createElement('canvas');
- var context = canvas.getContext('2d');
- var r = window.devicePixelRatio; //不乘会模糊
- context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; //context["font-weight"] = 100; //语法与 CSS font 属性相同。
- var textMaxWidth = 0,
- infos = [];
- context.textBaseline = 'alphabetic';
- var textHeightAll = 0;
- var texts = [];
- if (this.maxLineWidth) {
- this.text.forEach(function (words) {
- if (!words) {
- texts.push('');
- return;
- }
- texts = texts.concat(
- /*breakLinesForCanvas */
- wrapText(words, context, _this2.maxLineWidth * r, _this2.dontBreakWords));
- });
- } else {
- texts = this.text;
- }
- var _iterator = _createForOfIteratorHelper$d(texts),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var text = _step.value;
- var metrics = context.measureText(text);
- var textWidth = metrics.width;
- infos.push(metrics);
- textMaxWidth = Math.max(textMaxWidth, textWidth);
- textHeightAll += metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent; //文字真实高度
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- var margin = (this.margin ? new THREE.Vector2().copy(this.margin) : new THREE.Vector2(this.fontsize, this.fontsize * 0.8)).multiplyScalar(r);
- var lineSpace = (this.lineSpace || this.fontsize * 0.5) * r;
- var rectBorderThick = this.rectBorderThick * r,
- textBorderThick = this.textBorderThick * r;
- var spriteWidth = 2 * (margin.x + rectBorderThick + textBorderThick) + textMaxWidth; //还要考虑this.textshadowColor,太麻烦了不写了
- var spriteHeight = 2 * (margin.y + rectBorderThick + textBorderThick * texts.length) + lineSpace * (texts.length - 1) + textHeightAll; //canvas宽高只会向下取整数,所以为了防止拉伸模糊这里必须先取整
- spriteWidth = Math.floor(spriteWidth);
- spriteHeight = Math.floor(spriteHeight);
- context.canvas.width = spriteWidth;
- context.canvas.height = spriteHeight;
- context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; //为何要再写一遍??
- context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' + this.borderColor.b + ',' + this.borderColor.a + ')';
- context.lineWidth = rectBorderThick;
- context.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' + this.backgroundColor.b + ',' + this.backgroundColor.a + ')';
- this.roundRect(context, rectBorderThick / 2, rectBorderThick / 2, spriteWidth - rectBorderThick, spriteHeight - rectBorderThick, this.borderRadius * r);
- context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' + this.textColor.b + ',' + this.textColor.a + ')';
- var y = margin.y + rectBorderThick;
- for (var i = 0; i < texts.length; i++) {
- //文字y向距离从textBaseline向上算
- var actualBoundingBoxAscent = infos[i].fontBoundingBoxAscent == void 0 ? this.fontsize * r * 0.8 : infos[i].fontBoundingBoxAscent; //有的流览器没有。只能大概给一个
- y += actualBoundingBoxAscent + textBorderThick;
- var textLeftSpace = this.textAlign == 'center' ? (textMaxWidth - infos[i].width) / 2 : this.textAlign == 'left' ? 0 : textMaxWidth - infos[i].width;
- var x = rectBorderThick + textBorderThick + margin.x + textLeftSpace; // text color
- if (this.textBorderThick) {
- context.strokeStyle = 'rgba(' + this.textBorderColor.r + ',' + this.textBorderColor.g + ',' + this.textBorderColor.b + ',' + this.textBorderColor.a + ')';
- context.lineWidth = this.textBorderThick * r;
- context.strokeText(texts[i], x, y);
- }
- if (this.textshadowColor) {
- context.shadowOffsetX = 0;
- context.shadowOffsetY = 0;
- context.shadowColor = this.textshadowColor; //'red'
- context.shadowBlur = (this.textShadowBlur || this.fontsize / 6) * r;
- }
- context.fillText(texts[i], x, y);
- var actualBoundingBoxDescent = infos[i].fontBoundingBoxDescent == void 0 ? this.fontsize * r * 0.2 : infos[i].fontBoundingBoxDescent;
- y += actualBoundingBoxDescent + textBorderThick + lineSpace;
- }
- var map = this.sprite.material.map;
- map.image = canvas;
- {
- map.anisotropy++;
- map.dispose(); // 关键!释放旧 GPU 纹理, 否则贴图更新不完整(这个版本THREE会这样)
- map.needsUpdate = true;
- this.sprite.onBeforeRender = function () {
- var _map$_listeners, _map$_listeners$dispo;
- //有的还需要这样改anisotropy再恢复,如Tag3d,不知为何
- 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) {
- map.anisotropy = map.anisotropy__; //console.log('onBeforeRender')
- _this2.sprite.onBeforeRender = function () {};
- }
- };
- }
- var oldScale = this.sprite.scale.clone();
- this.sprite.scale.set(spriteWidth * 0.01 / r, spriteHeight * 0.01 / r, 1.0);
- if (!oldScale.equals(this.sprite.scale)) {
- this.updateTransform2D();
- this.sprite.waitUpdate(); //重新计算各个viewport的matrix
- }
- }
- }, {
- key: "roundRect",
- value: function roundRect(ctx, x, y, w, h, r) {
- ctx.beginPath();
- ctx.moveTo(x + r, y);
- ctx.lineTo(x + w - r, y);
- ctx.arcTo(x + w, y, x + w, y + r, r); //圆弧。前四个参数同quadraticCurveTo
- //ctx.quadraticCurveTo(x + w, y, x + w, y + r); //二次贝塞尔曲线需要两个点。第一个点是用于二次贝塞尔计算中的控制点,第二个点是曲线的结束点。
- ctx.lineTo(x + w, y + h - r);
- ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
- ctx.lineTo(x + r, y + h);
- ctx.arcTo(x, y + h, x, y + h - r, r);
- ctx.lineTo(x, y + r);
- ctx.arcTo(x, y, x + r, y, r);
- ctx.closePath();
- ctx.fill();
- ctx.stroke();
- }
- }, {
- key: "updateTransform2D",
- value: function updateTransform2D() {
- var _this3 = this;
- if (this.transform2Dpercent) {
- ['x', 'y'].forEach(function (axis) {
- var percent = _this3.transform2Dpercent[axis];
- _this3.sprite.position.y = _this3.sprite.scale.y * percent;
- });
- }
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.sprite.material.map.dispose();
- this.parent && this.parent.remove(this);
- this.sprite.dispatchEvent({
- type: 'dispose'
- });
- this._listeners = [];
- }
- }]);
- return TextSprite;
- }(THREE.Object3D); // 文字换行算法
- function wrapText(text, context, maxWidth, dontBreakWords) {
- //deepseek版 dontBreakWords: for english 一个单词不要分开,符号不要换到下一行开头(也无法单独一行……)
- var lines = [];
- var words = dontBreakWords ? text.split(' ') : [text];
- var currentLine = '';
- for (var i = 0; i < words.length; i++) {
- var word = words[i];
- var width = context.measureText(currentLine + word).width;
- if (width < maxWidth) {
- currentLine += (currentLine ? ' ' : '') + word;
- } else {
- // 处理标点符号不能在行首的情况 dontBreakWords时失效,干脆去掉( 还依赖空格,效果不好)
- if (!dontBreakWords && /^[.,!?;:)]/.test(word)) {
- // 将标点符号移到上一行末尾
- var lastLine = lines.pop() || '';
- lines.push(lastLine + word.charAt(0));
- word = word.substring(1);
- } // 如果单词本身超过最大宽度,强制拆分
- if (context.measureText(word).width > maxWidth) {
- if (currentLine) lines.push(currentLine);
- currentLine = '';
- while (word.length > 0) {
- var splitIndex = 1;
- while (splitIndex < word.length && context.measureText(word.substring(0, splitIndex)).width < maxWidth) {
- splitIndex++;
- }
- lines.push(word.substring(0, splitIndex));
- word = word.substring(splitIndex);
- }
- } else {
- if (currentLine) lines.push(currentLine);
- currentLine = word;
- }
- }
- }
- if (currentLine) {
- lines.push(currentLine);
- }
- return lines;
- } //------
- //'使用很寻常的二分查找,如果某一个位置之前的文字宽度小于等于设定的宽度,并且它之后一个字之前的文字宽度大于设定的宽度,那么这个位置就是文本的换行点。上面只是找到一个换行点,对于输入的一段文本,需要循环查找,直到不存在这样的换行点为止, 完整的代码如下',
- 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; } } }; }
- 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); }
- 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; }
- var lastCallTime = 0;
- var common = {
- delayOneFrame(e) {
- window.setTimeout(e, 1);
- },
- normalizeUrl(e) {
- return e.replace('https://', 'http://');
- },
- domainFromUrl(e) {
- var t = /^([^:]*:\/\/)?(www\.)?([^\/]+)/.exec(e);
- return t ? t[3] : e;
- },
- average(e, t) {
- if (0 === e.length) return null;
- for (var i = 0, n = 0, r = 0; r < e.length; r++) {
- var o = t ? e[r][t] : e[r];
- i += o, n++;
- }
- return i / n;
- },
- countUnique(e) {
- for (var t = {}, i = 0; i < e.length; i++) {
- t[e[i]] = 1 + (t[e[i]] || 0);
- }
- return Object.keys(t).length;
- },
- averageVectors(e, t) {
- var i = new THREE.Vector3();
- if (0 === e.length) return i;
- for (var r = 0, o = 0; o < e.length; o++) {
- var a = t ? e[o][t] : e[o];
- i.add(a), r++;
- }
- return i.divideScalar(r);
- },
- equalLists(e, t) {
- if (e.length !== t.length) return !1;
- for (var i = 0; i < e.length; i++) {
- if (e[i] !== t[i]) return !1;
- }
- return !0;
- },
- lowerMedian(e, t) {
- if (0 === e.length) return null;
- t = t || 2, e.sort(function (e, t) {
- return e - t;
- });
- var i = Math.floor(e.length / t);
- return e[i];
- },
- stableSort(e, t) {
- return e.map(function (e, t) {
- return {
- value: e,
- index: t
- };
- }).sort(function (e, i) {
- var n = t(e.value, i.value);
- return 0 !== n ? n : e.index - i.index;
- }).map(function (e) {
- return e.value;
- });
- },
- sortByScore: function sortByScore(list, request, rank) {
- var i = request ? common.filterAll(list, request) : list;
- return 0 === i.length ? [] : i = i.map(function (e) {
- var scores = rank.map(function (f) {
- return f(e);
- }); //add
- return {
- item: e,
- scores,
- score: scores.reduce(function (t, i) {
- return t + i;
- }, 0)
- };
- }).sort(function (e, t) {
- return t.score - e.score;
- });
- },
- filterAll(e, t) {
- return e.filter(function (e) {
- return t.every(function (t) {
- return t(e);
- });
- });
- },
- formatDate(e) {
- return [e.getFullYear(), e.getMonth() + 1, e.getDate()].join('-');
- },
- formatDatetime(e) {
- return [e.getFullYear(), e.getMonth() + 1, e.getDate(), e.getHours(), e.getMinutes()].join('-');
- },
- randomString(e) {
- for (var t = '', i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', n = 0; n < e; n++) {
- t += i.charAt(Math.floor(Math.random() * i.length));
- }
- return t;
- },
- uint8ToBase64(e, t) {
- t && 'number' == typeof t || (t = 8192);
- for (var i = [], n = 0; n < e.length; n += t) {
- i.push(String.fromCharCode.apply(null, e.subarray(n, n + t)));
- }
- return btoa(i.join(''));
- },
- uuid4: function e(t) {
- return t ? (t ^ 16 * Math.random() >> t / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, e);
- },
- nth(e) {
- return e %= 10, 1 === e ? e + 'st' : 2 === e ? e + 'nd' : 3 === e ? e + 'rd' : e + 'th';
- },
- extendObject(e, t) {
- return Object.keys(t).forEach(function (i) {
- e[i] = t[i];
- }), e;
- },
- deepExtend: function e(t) {
- t = t || {};
- for (var i = 1; i < arguments.length; i++) {
- var n = arguments[i];
- if (n) for (var r in n) {
- n.hasOwnProperty(r) && ('object' == typeof n[r] ? t[r] = e(t[r], n[r]) : t[r] = n[r]);
- }
- }
- return t;
- },
- inherit(e, t) {
- e.prototype = Object.create(t.prototype), e.prototype.constructor = e;
- },
- extend(e, t) {
- for (var i in t.prototype) {
- e.prototype[i] = t.prototype[i];
- }
- },
- //额外添加的
- extendObject(e, t) {
- if (!(t instanceof Object)) return; //许钟文 加 ie有遇到非object的数据
- return Object.keys(t).forEach(function (i) {
- e[i] = t[i];
- }), e;
- },
- _textureCache: {},
- loadTextureFromCache(c, onLoad_) {
- var _this = this;
- if (this._textureCache[c]) {
- //xzw 改 同时加载同一张图,都会执行回调
- if (this._textureCache[c].image) {
- onLoad_ && setTimeout(function () {
- onLoad_(_this._textureCache[c]);
- }, 1); //wait, return tex first
- } else {
- onLoad_ && this._textureCache[c].loadCallbacks.push(onLoad_);
- }
- } else {
- this._textureCache[c] = getTexture(c);
- this._textureCache[c].loadCallbacks = [];
- onLoad_ && this._textureCache[c].loadCallbacks.push(onLoad_);
- }
- return this._textureCache[c]; //return this._textureCache[c] || (this._textureCache[c] = getTexture(c, onLoad)), this._textureCache[c]
- },
- extend(c, d) {
- for (var f in d.prototype) {
- c.prototype[f] = d.prototype[f];
- }
- },
- valueFromHash(e, t) {
- var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
- n = i.exec(window.location.href);
- if (!n) return t;
- var r = n[1];
- return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
- },
- deepFreeze(o) {
- var _this2 = this;
- Object.freeze(o);
- Object.getOwnPropertyNames(o).forEach(function (prop) {
- if (o.hasOwnProperty(prop) && o[prop] !== null && (typeof o[prop] === 'object' || typeof o[prop] === 'function') && !Object.isFrozen(o[prop])) {
- _this2.deepFreeze(o[prop]);
- }
- });
- return o;
- },
- defaultValue(value) {
- if (value != void 0 && typeof value === 'object') {
- return Array.isArray(value) ? [] : {};
- }
- },
- randomUnique() {
- return crypto.getRandomValues(new Uint32Array(1))[0];
- },
- debounce(fn, delay) {
- var isImmediateCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var timer = null; // 上次调用的时刻
- if (isImmediateCall) {
- return function () {
- var context = this;
- var currentTime = Date.now();
- if (currentTime - lastCallTime >= delay) {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- fn.apply(context, args);
- lastCallTime = currentTime;
- }
- };
- } else {
- return function () {
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
- args[_key2] = arguments[_key2];
- }
- if (timer) {
- clearTimeout(timer);
- }
- var context = this;
- timer = setTimeout(function () {
- fn.apply(context, args);
- }, delay);
- };
- }
- },
- getMixedSet: function getMixedSet(arr1, arr2) {
- //交集
- return arr1.filter(function (item) {
- return arr2.includes(item);
- });
- },
- getUnionSet: function getUnionSet(arr1, arr2) {
- //并集
- return arr1.concat(arr2.filter(function (item) {
- return !arr1.includes(item);
- }));
- },
- getDifferenceSet: function getDifferenceSet(arr1, arr2) {
- //差集 不能识别重复的,如getDifferenceSet([1,2,2],[1,1,2]) 为空
- var arr11 = arr1.filter(function (item) {
- return !arr2.includes(item);
- });
- var arr22 = arr2.filter(function (item) {
- return !arr1.includes(item);
- });
- return arr11.concat(arr22);
- },
- getDifferenceSetMuti: function getDifferenceSetMuti(arr) {
- //收集绝对没有重复的元素,也就是判断出现次数=1的
- var set = [];
- arr.forEach(function (arr1) {
- arr1.forEach(function (item) {
- var index = set.indexOf(item);
- if (index > -1) {
- set.splice(index, 1);
- } else {
- set.push(item);
- }
- });
- });
- return set;
- },
- pushToGroupAuto: function pushToGroupAuto(items, groups, recognizeFunction, judgeRelationFun) {
- //自动分组。 items是将分到一起的组合。items.length = 1 or 2.
- var isSame = function isSame(a, b) {
- return a == b || recognizeFunction && recognizeFunction(a, b);
- };
- var atGroups = groups.filter(function (group) {
- return group.find(function (item) {
- return (isSame(item, items[0]) || isSame(item, items[1])) && (!judgeRelationFun || judgeRelationFun(group));
- } //根据关系进一步判断是否应该一组
- );
- });
- if (atGroups.length) {
- //在不同组
- //因为items是一组的,所以先都放入组1
- items.forEach(function (item) {
- if (!atGroups[0].includes(item)) atGroups[0].push(item);
- });
- if (atGroups.length > 1) {
- //如果在不同组,说明这两个组需要合并
- var combineGroup = [];
- combineGroup.relationships = [items.slice()];
- atGroups.forEach(function (group) {
- var relationships = common.getUnionSet(combineGroup.relationships, group.relationships);
- combineGroup = common.getUnionSet(combineGroup, group);
- combineGroup.relationships = relationships;
- groups.splice(groups.indexOf(group), 1);
- });
- groups.push(combineGroup);
- } else {
- atGroups[0].relationships.push(items.slice());
- }
- } else {
- //直接加入为一组
- items.relationships = [items.slice()];
- groups.push(items);
- }
- },
- disconnectGroup: function disconnectGroup(pairs, groups, recognizeFunction) {
- //将atGroup中的pairs关系解除,然后重新分组
- var isSame = function isSame(a, b) {
- return a == b || recognizeFunction && recognizeFunction(a, b);
- };
- var oldGroups = groups.slice();
- pairs.forEach(function (items) {
- var relationship;
- var atGroup = groups.find(function (group) {
- var r = group.relationships.find(function (arr) {
- return items.every(function (e) {
- return arr.some(function (a) {
- return isSame(a, e);
- });
- });
- });
- if (r) {
- relationship = r;
- return true;
- }
- }); //能找到relationships 有包含items的, 代表它们有绑定关系
- if (!atGroup) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
- groups.splice(groups.indexOf(atGroup), 1); //删除
- atGroup.relationships.splice(atGroup.relationships.indexOf(relationship), 1);
- var newGroups_ = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
- atGroup.relationships.forEach(function (pair) {
- //然后再重新生成这两个和组的关系,各自分组
- common.pushToGroupAuto(pair, newGroups_, recognizeFunction);
- });
- groups.push.apply(groups, newGroups_);
- });
- var newGroups = groups.filter(function (e) {
- return !oldGroups.includes(e);
- });
- return {
- newGroups
- };
- },
- removeFromGroup: function removeFromGroup(items, atGroup, groups, recognizeFunction) {
- //将该组移除items中的所有元素,以及包含它的关系
- var isSame = function isSame(a, b) {
- return a == b || recognizeFunction && recognizeFunction(a, b);
- };
- var newRelations = atGroup.relationships.filter(function (arr) {
- return !arr.some(function (e) {
- return items.some(function (item) {
- return isSame(e, item);
- });
- });
- });
- if (newRelations.length == atGroup.relationships) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
- groups.splice(groups.indexOf(atGroup), 1); //删除
- var newGroups = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
- atGroup.relationships.forEach(function (pair) {
- //然后再重新生成这两个和组的关系,各自分组
- common.pushToGroupAuto(pair, newGroups, recognizeFunction);
- });
- groups.push.apply(groups, newGroups);
- return {
- newGroups
- };
- }
- };
- common.getMAXCUBETEXTURESIZE = function () {
- try {
- var e = document.createElement('canvas'),
- t = e.getContext('webgl');
- t || (t = e.getContext('experimental-webgl'));
- var i = t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE);
- return i;
- } catch (e) {
- return 0;
- }
- };
- var getTexture = function () {
- var textureLoader = new THREE.TextureLoader();
- textureLoader.setCrossOrigin('Anonymous');
- textureLoader.crossOrigin = true;
- return function (url
- /* , onLoad, onProgress, onError */
- ) {
- var onLoad = function onLoad() {
- var _map$loadCallbacks;
- //xzw add
- (_map$loadCallbacks = map.loadCallbacks) === null || _map$loadCallbacks === void 0 ? void 0 : _map$loadCallbacks.forEach(function (e) {
- return e(map);
- });
- };
- var map = textureLoader.load(url, onLoad
- /* , onProgress, onError */
- ); //map.magFilter = map.minFilter = THREE.LinearFilter
- map.needsUpadte = true;
- return map;
- };
- }();
- common.dataURLtoBlob = function (dataurl) {
- //将base64转换blob
- var arr = dataurl.split(','),
- mime = arr[0].match(/:(.*?);/)[1],
- bstr = atob(arr[1]),
- n = bstr.length,
- u8arr = new Uint8Array(n);
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n);
- }
- return new Blob([u8arr], {
- type: mime
- });
- };
- common.dataURLtoFile = function (dataurl, filename) {
- //将base64转换为文件
- var arr = dataurl.split(','),
- mime = arr[0].match(/:(.*?);/)[1],
- bstr = atob(arr[1]),
- n = bstr.length,
- u8arr = new Uint8Array(n);
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n);
- }
- return new File([u8arr], filename, {
- type: mime
- });
- };
- common.saveFile = function (data, filename, cb) {
- var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
- save_link.href = data;
- save_link.download = filename;
- var event = document.createEvent('MouseEvents');
- event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- save_link.dispatchEvent(event);
- cb && cb();
- };
- common.PrefixPng = 'data:image/png;base64,';
- common.getBlobSrc = function (base64, addPre) {
- //base64 --> blobsrc
- var blob = common.dataURLtoBlob((addPre ? common.PrefixPng : '') + base64);
- return window.URL.createObjectURL(blob);
- };
- common.replaceAll = function (str, f, e) {
- //f全部替换成e
- var reg = new RegExp(f, 'g'); //创建正则RegExp对象
- return str.replace(reg, e);
- };
- common.randomWord = function (randomFlag, min, max) {
- //随机字符串
- var str = '',
- range = min,
- 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'];
- if (randomFlag) {
- // 随机长度
- range = Math.round(Math.random() * (max - min)) + min;
- }
- for (var i = 0; i < range; i++) {
- var pos = Math.round(Math.random() * (arr.length - 1));
- str += arr[pos];
- }
- return str;
- };
- common.getRandomSid = function () {
- //5-7位随机字符串 + 6位时间 为热点准备
- var pre = common.randomWord(true, 5, 7);
- var post = new Date().getTime() + '';
- var len = post.length;
- post = post.substring(len - 8, len - 5) + post.substring(len - 3, len); //其实还是有可能重复的....
- return pre + post;
- };
- common.getTime = function (second) {
- //秒
- var str = ''; //不支持大于60分钟的时间哟
- var minute = Math.round(second / 60);
- if (minute < 10) str += '0';
- str += minute;
- second = Math.round(second % 60) + '';
- if (second.length == 1) second = '0' + second;
- str = str + ':' + second;
- return str;
- };
- common.CloneJson = function (data) {
- var str = JSON.stringify(data);
- return JSON.parse(str);
- }, common.CloneObject = function (copyObj, isSimpleCopy) {
- var _this3 = this;
- var simpleCopyList = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
- var judgeSimpleCopyFun = arguments.length > 3 ? arguments[3] : undefined;
- //isSimpleCopy 只复制最外层
- //复制json result的可能:普通数字或字符串、普通数组、复杂对象
- simpleCopyList.includes(THREE.Object3D) || simpleCopyList.push(THREE.Object3D); //遇到simpleCopyList中的类直接使用不拷贝
- judgeSimpleCopyFun || (judgeSimpleCopyFun = function judgeSimpleCopyFun() {});
- if (!copyObj || typeof copyObj == 'number' || typeof copyObj == 'string' || copyObj instanceof Function || simpleCopyList.some(function (className) {
- return copyObj instanceof className;
- }) || judgeSimpleCopyFun(copyObj)) {
- return copyObj;
- }
- if (copyObj instanceof Array) {
- return copyObj.map(function (e) {
- return _this3.CloneObject(e, isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);
- });
- } else {
- if (copyObj.clone instanceof Function) {
- //解决一部分
- return copyObj.clone();
- }
- }
- var result = {};
- for (var key in copyObj) {
- if (copyObj[key] instanceof Object && !isSimpleCopy) result[key] = this.CloneObject(copyObj[key], isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);else result[key] = copyObj[key]; //如果是函数类同基本数据,即复制引用
- }
- return result;
- }, common.CloneClassObject = function (copyObj) {
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- _ref$ignoreList = _ref.ignoreList,
- ignoreList = _ref$ignoreList === void 0 ? [] : _ref$ignoreList,
- _ref$simpleCopyList = _ref.simpleCopyList,
- simpleCopyList = _ref$simpleCopyList === void 0 ? [] : _ref$simpleCopyList;
- //复杂类对象
- var newobj = new copyObj.constructor();
- this.CopyClassObject(newobj, copyObj, {
- ignoreList,
- simpleCopyList
- });
- return newobj;
- }, common.CopyClassObject = function (targetObj, copyObj) {
- var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- _ref2$ignoreList = _ref2.ignoreList,
- ignoreList = _ref2$ignoreList === void 0 ? [] : _ref2$ignoreList,
- _ref2$simpleCopyList = _ref2.simpleCopyList,
- simpleCopyList = _ref2$simpleCopyList === void 0 ? [] : _ref2$simpleCopyList;
- //复杂类对象
- for (var i in copyObj) {
- if (i in copyObj.__proto__) break; //到函数了跳出
- if (ignoreList.includes(i)) {
- continue;
- } else if (simpleCopyList.includes(i)) {
- targetObj[i] = copyObj[i];
- } else {
- targetObj[i] = this.CloneObject(copyObj[i], false, simpleCopyList);
- }
- }
- }, common.ifSame = function (object1, object2) {
- var simpleEqualClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
- var orderRequest = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- //对于复杂的类对象,若能简单判断就直接写进simpleEqualClass
- if (object1 == object2) return true; // 0 != undefined , 0 == ''
- else if (!object1 || !object2) return false;else if (object1.constructor != object2.constructor) {
- return false;
- } else if (simpleEqualClass.some(function (className) {
- return object1 instanceof className;
- })) {
- return object1 == object2;
- } else if (object1 instanceof Array) {
- if (object1.length != object2.length) return false;
- var _object2 = object2.slice(0);
- if (orderRequest) {
- for (var i = 0; i < object1.length; i++) {
- if (!common.ifSame(object1[i], _object2[i], simpleEqualClass, orderRequest)) return false;
- }
- } else {
- var _loop = function _loop(_i) {
- u = _object2.findIndex(function (e) {
- return common.ifSame(object1[_i], e, simpleEqualClass, orderRequest);
- });
- if (u == -1) return {
- v: false
- };else {
- _object2.splice(u, 1);
- }
- };
- for (var _i = 0; _i < object1.length; _i++) {
- var u;
- var _ret = _loop(_i);
- if (typeof _ret === "object") return _ret.v;
- }
- }
- return true;
- } else if (object1.equals instanceof Function) {
- //复杂数据仅支持这种,其他的可能卡住?
- return object1.equals(object2);
- } else if (typeof object1 == 'number' || typeof object1 == 'string') {
- if (isNaN(object1) && isNaN(object2)) return true;else return object1 == object2;
- } else if (typeof object1 == 'object') {
- var keys1 = Object.keys(object1);
- var keys2 = Object.keys(object2);
- if (!common.ifSame(keys1, keys2, simpleEqualClass, orderRequest)) return false;
- for (var _i2 in object1) {
- var same = common.ifSame(object1[_i2], object2[_i2], simpleEqualClass, orderRequest);
- if (!same) return false;
- }
- return true;
- } else {
- console.log('isSame出现例外');
- }
- };
- common.canvasToImg = function (canvas) {
- var compressRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- var download = arguments.length > 2 ? arguments[2] : undefined;
- var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'image/jpeg';
- var filename = arguments.length > 4 ? arguments[4] : undefined;
- // 图片导出为 png 格式
- var imgData = canvas.toDataURL(type, compressRatio); // 加工image data,替换mime type
- if (download) {
- this.saveTex(imgData, type, filename);
- }
- return imgData;
- };
- var _fixType = function _fixType(type) {
- type = type.toLowerCase().replace(/jpg/i, 'jpeg');
- var r = type.match(/png|jpeg|bmp|gif/)[0];
- return 'image/' + r;
- };
- common.saveTex = function (imgData) {
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'image/jpeg';
- var filename = arguments.length > 2 ? arguments[2] : undefined;
- return function (filename) {
- imgData = imgData.replace(_fixType(type), 'image/octet-stream'); // 下载后的图片名
- var filename = filename || '4dage_' + new Date().getTime() + (type == 'png' ? '.png' : '.jpg'); // download
- common.saveFile(imgData, filename);
- }(filename);
- };
- common.compressImg = /*#__PURE__*/function () {
- var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(img, maxWidth) {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- return _context.abrupt("return", new Promise(function (resolve, reject) {
- if (img.width > maxWidth || img.height > maxWidth) {
- var ratio = maxWidth / Math.max(img.width, img.height);
- console.log('compress img', img.width, img.height, 'to', maxWidth);
- var width = Math.round(img.width * ratio);
- var height = Math.round(img.height * ratio);
- var canvas = document.createElement('canvas');
- var context = canvas.getContext('2d');
- context.canvas.width = width;
- context.canvas.height = height;
- context.drawImage(img, 0, 0, width, height);
- var url = common.canvasToImg(canvas, 1);
- var newImg = new Image();
- newImg.src = url;
- newImg.onload = function () {
- resolve(newImg);
- };
- } else {
- resolve(img);
- }
- }));
- case 1:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function (_x, _x2) {
- return _ref3.apply(this, arguments);
- };
- }();
- common.imgAddLabel = function (img, labelImg) {
- var labelInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- //图上加另一张小图,用于添加水印
- var canvas = document.createElement('canvas');
- var context = canvas.getContext('2d');
- context.canvas.width = img.width;
- context.canvas.height = img.height;
- context.drawImage(img, 0, 0, img.width, img.height); //widthRatioToImg:label的width占img的width的比例
- var labelWidth = labelInfo.widthRatioToImg ? img.width * labelInfo.widthRatioToImg : labelImg.width; //widthRatioToImg:label的width占img的width的比例
- var labelHeight = labelWidth * labelImg.height / labelImg.width;
- if (labelInfo.leftRatioToImg == void 0 && labelInfo.rightRatioToImg != void 0) {
- labelInfo.leftRatioToImg = 1 - labelInfo.rightRatioToImg - (labelInfo.widthRatioToImg || labelImg.width / img.width);
- }
- if (labelInfo.topRatioToImg == void 0 && labelInfo.bottomRatioToImg != void 0) {
- labelInfo.topRatioToImg = 1 - labelInfo.bottomRatioToImg - labelHeight / img.height;
- }
- var labelLeft = img.width * labelInfo.leftRatioToImg; //leftRatioToImg:label的left占img的width的比例
- var labelTop = img.height * labelInfo.topRatioToImg; //topRatioToImg:label的top占img的height的比例
- context.globalAlpha = labelInfo.opacity != void 0 ? labelInfo.opacity : 1;
- context.drawImage(labelImg, labelLeft, labelTop, labelWidth, labelHeight);
- return common.canvasToImg(canvas, labelInfo.quality || 0.95);
- };
- common.imgAddText = /*#__PURE__*/function () {
- var _ref4 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(img, text, labelInfo) {
- var label, labelImg;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- label = new TextSprite(Object.assign({
- //如果直接在canvas里写字,要另外写很多和canvas.drawText有关的,所以还是借助textSprite吧
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- margin: {
- x: 3,
- y: 3
- },
- renderOrder: 50,
- fontsize: 20,
- text,
- borderRadius: 0
- }, labelInfo));
- labelImg = new Image();
- labelImg.src = label.sprite.material.map.image.toDataURL('image/png', 1);
- return _context2.abrupt("return", new Promise(function (resolve, reject) {
- labelImg.onload = function () {
- if (labelInfo.horizonCenter) {
- //水平居中(对img来说)
- labelInfo.leftRatioToImg = 0.5 - labelImg.width / img.width / 2;
- }
- var result = common.imgAddLabel(img, labelImg, labelInfo);
- label.dispose();
- resolve(result);
- };
- }));
- case 4:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2);
- }));
- return function (_x3, _x4, _x5) {
- return _ref4.apply(this, arguments);
- };
- }();
- common.pixelsArrayToDataUrl = function (pixels, width, height) {
- var compressRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.7;
- var dontFlipY = arguments.length > 4 ? arguments[4] : undefined;
- var canvas = document.createElement('canvas');
- canvas.width = width;
- canvas.height = height;
- var context = canvas.getContext('2d');
- pixels = new pixels.constructor(pixels);
- if (!dontFlipY) {
- var bytesPerLine = width * 4;
- for (var i = 0; i < parseInt(height / 2); i++) {
- var j = height - i - 1;
- var lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);
- var lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);
- pixels.set(lineJ, i * bytesPerLine);
- pixels.set(lineI, j * bytesPerLine);
- }
- }
- var imageData = context.createImageData(width, height);
- imageData.data.set(pixels);
- context.putImageData(imageData, 0, 0);
- var dataURL = canvas.toDataURL('image/png', compressRatio);
- return dataURL;
- };
- common.renderTargetToDataUrl = function (renderTarget, width, height, renderer) {
- var compressRatio = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.7;
- var dontFlipY = arguments.length > 5 ? arguments[5] : undefined;
- var pixelCount = width * height;
- var buffer = new Uint8Array(4 * pixelCount);
- renderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer); //耗时
- var dataUrl = this.pixelsArrayToDataUrl(buffer, width, height, compressRatio, dontFlipY);
- return dataUrl;
- };
- common.screenPass = new function () {
- this.screenScene = new THREE.Scene();
- this.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 1));
- this.screenQuad.material.depthTest = true;
- this.screenQuad.material.depthWrite = true;
- this.screenQuad.material.transparent = true;
- this.screenScene.add(this.screenQuad);
- this.camera = new THREE.Camera();
- this.render = function (renderer, material, target) {
- this.screenQuad.material = material; //material.premultipliedAlpha = true //每次都要吗
- var alpha = renderer.getClearAlpha();
- renderer.setClearAlpha(0);
- if (typeof target === 'undefined') {
- renderer.render(this.screenScene, this.camera);
- } else {
- var oldTarget = renderer.getRenderTarget();
- renderer.setRenderTarget(target);
- renderer.clear();
- renderer.render(this.screenScene, this.camera);
- renderer.setRenderTarget(oldTarget);
- /* let data = common.renderTargetToDataUrl(target, target.width, target.height, renderer)
- common.saveTex(data) */
- }
- renderer.setClearAlpha(alpha);
- };
- }();
- common.renderTex = function (material, renderer, size) {
- var rt = new THREE.WebGLRenderTarget(size.x, size.y, {
- minFilter: THREE.LinearMipmapLinearFilter,
- generateMipmaps: true,
- format: THREE.RGBAFormat
- });
- this.screenPass.render(renderer, material, rt);
- /* setTimeout(()=>{
- rt.texture = null //rt.dispose报错
- rt.dispose() //直接dispose图就没了
- },3000) */
- //rt的texture没有监听dispose,刚好可以给加一个,反向dispose rt
- rt.texture.renderTarget__ = rt; //add
- var dispose = function dispose() {
- rt.dispose();
- rt.texture.removeEventListener('dispose', dispose);
- };
- rt.texture.addEventListener('dispose', dispose); //add
- return rt.texture;
- }; //根据原因更新显示,便于将每种显示操作打上标签,管理优先级
- common.updateVisible = function (object, reason, ifShow) {
- var level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
- var type = arguments.length > 4 ? arguments[4] : undefined;
- if (!object) return; //当所有加入的条件都不为false时才显示. reason='force'一般是强制、临时的
- if (!object.unvisibleReasons) object.unvisibleReasons = []; //如果length>0代表不可见
- if (!object.visibleReasons) object.visibleReasons = []; //在同级时,优先可见
- var update = function update() {
- //先按从高到低的level排列
- object.unvisibleReasons = object.unvisibleReasons.sort(function (a, b) {
- return b.level - a.level;
- });
- object.visibleReasons = object.visibleReasons.sort(function (a, b) {
- return b.level - a.level;
- });
- var maxVisiLevel = object.visibleReasons[0] ? object.visibleReasons[0].level : -1;
- var maxunVisiLevel = object.unvisibleReasons[0] ? object.unvisibleReasons[0].level : -1;
- var shouldVisi = maxVisiLevel >= maxunVisiLevel;
- var visiBefore = object.visible;
- if (visiBefore != shouldVisi) {
- object.visible = shouldVisi;
- object.dispatchEvent && object.dispatchEvent({
- type: 'isVisible',
- visible: shouldVisi,
- reason
- });
- }
- };
- if (ifShow) {
- var index = object.unvisibleReasons.findIndex(function (e) {
- return e.reason == reason;
- });
- if (index > -1) {
- type = 'cancel';
- object.unvisibleReasons.splice(index, 1);
- }
- if (type == 'add') {
- if (!object.visibleReasons.some(function (e) {
- return e.reason == reason;
- })) {
- object.visibleReasons.push({
- reason,
- level
- });
- }
- }
- } else {
- var index = object.visibleReasons.findIndex(function (e) {
- return e.reason == reason;
- });
- if (index > -1) {
- type = 'cancel';
- object.visibleReasons.splice(index, 1);
- }
- if (type != 'cancel') {
- if (!object.unvisibleReasons.some(function (e) {
- return e.reason == reason;
- })) {
- object.unvisibleReasons.push({
- reason,
- level
- });
- }
- }
- }
- update();
- };
- common.getObjVisiByReason = function (object, reason) {
- //获取在某条件下是否可见. 注: 用户在数据集选择可不可见为"datasetSelection"
- if (object.visible) return true;else {
- return !object.unvisibleReasons || !object.unvisibleReasons.some(function (e) {
- return e.reason == reason;
- });
- }
- };
- common.setCameraLayers = function (camera, enableLayers) {
- var extraEnableLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
- //设置相机或raycaster的layers
- camera.layers.disableAll();
- enableLayers.concat(extraEnableLayers).forEach(function (layerName) {
- var layer = RenderLayers[layerName];
- if (layer == void 0) {
- console.error('setCameraLayer没找到layer!');
- return;
- }
- camera.layers.enable(layer);
- });
- };
- common.setObjectLayers = function (object, layerName) {
- //设置物体的layers
- var layer = RenderLayers[layerName];
- if (layer == void 0) {
- console.error('setCameraLayer没找到layer!');
- return;
- }
- object.traverse(function (e) {
- e.layers.set(layer);
- });
- };
- common.intervalTool = {
- //延时update,防止卡顿
- list: [],
- isWaiting: function isWaiting(name, func, delayTime) {
- var _this4 = this;
- var item = this.list.find(function (e) {
- return e.name == name;
- });
- if (!item) {
- //如果没有该项, 则加入循环
- var ifContinue = func();
- item = {
- name
- };
- this.list.push(item);
- setTimeout(function () {
- var a = _this4.list.indexOf(item);
- _this4.list.splice(a, 1);
- if (item.requestUpdate || ifContinue) _this4.isWaiting(name, func, delayTime); //循环
- }, delayTime);
- } else {
- //如果有该项,说明现在请求下一次继续更新
- /* if(delayTime == 0){//想立刻更新一次
- func()
- }else{ */
- item.requestUpdate = true; //}
- }
- }
- };
- common.batchHandling = {
- //分批处理
- lists: [],
- getSlice: function getSlice(name, items, _ref5) {
- var stopWhenAllUsed = _ref5.stopWhenAllUsed,
- _ref5$minCount = _ref5.minCount,
- minCount = _ref5$minCount === void 0 ? 5 : _ref5$minCount,
- _ref5$maxCount = _ref5.maxCount,
- maxCount = _ref5$maxCount === void 0 ? 100 : _ref5$maxCount,
- durBound1 = _ref5.durBound1,
- durBound2 = _ref5.durBound2,
- maxUseCount = _ref5.maxUseCount;
- if (items.length == 0 || (maxUseCount = maxUseCount == void 0 ? common.getBestCount({
- name,
- minCount,
- maxCount,
- durBound1,
- durBound2,
- ifLog: false
- }) : maxUseCount, !maxUseCount) //本次最多可以使用的个数
- ) {
- return {
- list: []
- };
- }
- if (!this.lists[name]) this.lists[name] = {
- list: []
- }; //更新列表项目,但不变原来的顺序
- var list = this.lists[name].list.filter(function (a) {
- return items.some(function (item) {
- return a.item == item;
- });
- }); //去掉已经不在items里的项目
- this.lists[name].list = list;
- items.forEach(function (item) {
- //增加新的项目。
- if (!list.some(function (a) {
- return a.item == item;
- })) {
- list.push({
- item,
- count: 0
- });
- }
- }); //至此,在后排的都是未使用的
- var unUsed = list.filter(function (e) {
- return e.count == 0;
- }); //未使用的项目(count为0)优先
- var result = [];
- unUsed.slice(0, maxUseCount).forEach(function (e) {
- result.push(e.item);
- e.count++;
- });
- if (unUsed.length > maxUseCount) ; else {
- //所有项目都能使用一次
- if (!stopWhenAllUsed) {
- //若不是全部使用就停止
- var wholeCount = Math.min(items.length, maxUseCount);
- var restCount = wholeCount - result.length; //补齐
- list.slice(0, restCount).forEach(function (e) {
- result.push(e.item);
- e.count++;
- });
- }
- list.forEach(function (e) {
- return e.count--;
- }); //复原,等待新的循环
- }
- return {
- list: result
- };
- },
- addSliceListen(_ref6) {
- var getList = _ref6.getList,
- callback = _ref6.callback,
- minCount = _ref6.minCount,
- maxCount = _ref6.maxCount;
- _ref6.durBound1;
- _ref6.durBound2;
- _ref6.maxHistory;
- var player = _ref6.player;
- var unUpdate, lastUpdate;
- player.on('update', function (e) {
- if (player.flying) return;
- var waitForUpdate = getList();
- var stopWhenAllUsed = !player.lastFrameChanged;
- var standardUpdate = player.lastFrameChanged || !lastUpdate; //相机变化或第一次
- var list;
- if (standardUpdate) {
- list = waitForUpdate;
- unUpdate = null;
- } else {
- if (!unUpdate) {
- unUpdate = common.getDifferenceSet(waitForUpdate, lastUpdate); //unUpdate = unUpdate.filter(e => e.visible) //如飞出后最后一次更新之后,都隐藏了,隐藏的就不用更新了
- }
- list = unUpdate;
- }
- var result = common.batchHandling.getSlice('ifVideoInsight', list, {
- stopWhenAllUsed,
- minCount,
- maxCount,
- durBound1: 3,
- durBound2: 13,
- maxHistory: 3
- }); //iphonex稳定后大概在7-10。
- var updateList = result.list; //updateList.length && console.log(updateList.map(e=>e.sid))
- updateList.forEach(callback);
- if (!standardUpdate) {
- //相机停止变化后只更新还未更新的
- unUpdate = common.getDifferenceSet(unUpdate, updateList);
- }
- lastUpdate = updateList;
- });
- }
- };
- common.getBestCount = function () {
- var lastCount = {};
- return function (_ref7) {
- var name = _ref7.name,
- _ref7$minCount = _ref7.minCount,
- minCount = _ref7$minCount === void 0 ? 1 : _ref7$minCount,
- _ref7$maxCount = _ref7.maxCount,
- maxCount = _ref7$maxCount === void 0 ? 6 : _ref7$maxCount,
- _ref7$durBound = _ref7.durBound1,
- durBound1 = _ref7$durBound === void 0 ? 1 : _ref7$durBound,
- _ref7$durBound2 = _ref7.durBound2,
- durBound2 = _ref7$durBound2 === void 0 ? 4 : _ref7$durBound2,
- ifLog = _ref7.ifLog,
- maxHistory = _ref7.maxHistory;
- var timeStamp = performance.getEntriesByName('loop-start');
- var count;
- if (timeStamp.length) {
- var dur = performance.now() - timeStamp[timeStamp.length - 1].startTime;
- /*let k = -(maxCount - minCount) / (durBound2 - durBound1)
- let m = maxCount - durBound1 * k
- count = THREE.MathUtils.clamp(Math.round(k * dur + m), minCount, maxCount) //dur在iphoneX中静止有7,pc是2
- */
- count = Math.round(math$2.linearClamp(dur, durBound1, durBound2, maxCount, minCount));
- if (maxHistory) {
- if (!lastCount[name]) lastCount[name] = [];
- if (count == 0 && lastCount[name].length > maxHistory - 1 && !lastCount[name].some(function (e) {
- return e > 0;
- })) {
- count = 1;
- }
- lastCount[name].push(count);
- if (lastCount[name].length > maxHistory) lastCount[name].splice(0, 1);
- }
- ifLog && console.log(name, count, ' ,dur:', dur.toFixed(3));
- } else {
- count = maxCount; // ?
- } //主要在手机端有效果。
- return count;
- };
- }();
- common.timeMeasuring = {
- reportTimings: false,
- collection: {},
- registerCollect(name, o) {
- this.collection[name] = o;
- o.measures = [];
- o.sum = 0;
- },
- addTimeMark: function addTimeMark(name, type, ifLog) {
- var record = this.collection[name];
- var now = performance.now();
- var needRecord = record && (record.measures.length < record.minCount || now - record.lastAddTime > record.refreshTime); //间隔时间超过refreshTime重新收集
- if (needRecord || this.reportTimings) {
- if (type == 'end' && performance.getEntriesByName(name + '-start').length == 0) return;
- performance.mark(name + '-' + type);
- if (type == 'end') {
- var measure = performance.measure(name, name + '-start', name + '-end');
- if (!measure) {
- //console.error('没找到measure',name) //可能是其他地方报错了没进行下去所以找不到
- return;
- }
- if (ifLog) console.log(name, '耗时', measure.duration.toFixed(3));
- if (needRecord) {
- if (record.measures.length >= record.minCount) {
- //先清空上一轮的
- record.measures = [];
- record.sum = 0;
- }
- record.measures.push(measure.duration);
- record.sum += measure.duration;
- record.mean = record.sum / record.measures.length;
- record.measures.sort(function (a, b) {
- return a - b;
- });
- record.median = record.measures[parseInt(record.measures.length / 2)];
- record.lastAddTime = now;
- if (record.measures.length == record.minCount) ;
- }
- }
- }
- },
- report: function report(timestamp) {
- //原resolveTimings
- //打印用时。 注:performance手机的精度只到整数位
- if (!this.toggle) {
- this.toggle = timestamp;
- }
- var duration = timestamp - this.toggle;
- if (duration > 1000.0) {
- if (this.reportTimings) {
- var measures = performance.getEntriesByType('measure');
- var names = new Set();
- var _iterator = _createForOfIteratorHelper$c(measures),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var measure = _step.value;
- names.add(measure.name);
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- var groups = new Map();
- var _iterator2 = _createForOfIteratorHelper$c(names),
- _step2;
- try {
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
- var name = _step2.value;
- groups.set(name, {
- measures: [],
- sum: 0,
- n: 0,
- min: Infinity,
- max: -Infinity
- });
- }
- } catch (err) {
- _iterator2.e(err);
- } finally {
- _iterator2.f();
- }
- var _iterator3 = _createForOfIteratorHelper$c(measures),
- _step3;
- try {
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
- var _measure = _step3.value;
- var group = groups.get(_measure.name);
- group.measures.push(_measure);
- group.sum += _measure.duration;
- group.n++;
- group.min = Math.min(group.min, _measure.duration);
- group.max = Math.max(group.max, _measure.duration);
- }
- } catch (err) {
- _iterator3.e(err);
- } finally {
- _iterator3.f();
- }
- var _iterator4 = _createForOfIteratorHelper$c(groups),
- _step4;
- try {
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
- var _step4$value = _slicedToArray(_step4.value, 2),
- _name = _step4$value[0],
- _group = _step4$value[1];
- _group.mean = _group.sum / _group.n;
- _group.measures.sort(function (a, b) {
- return a.duration - b.duration;
- });
- if (_group.n === 1) {
- _group.median = _group.measures[0].duration;
- } else if (_group.n > 1) {
- _group.median = _group.measures[parseInt(_group.n / 2)].duration;
- }
- }
- } catch (err) {
- _iterator4.e(err);
- } finally {
- _iterator4.f();
- }
- var cn = Array.from(names).reduce(function (a, i) {
- return Math.max(a, i.length);
- }, 0) + 5;
- var cmin = 5;
- var cmed = 5;
- var cmax = 5;
- var csam = 4;
- 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");
- message += " ".concat('-'.repeat(message.length), "\n");
- names = Array.from(names).sort();
- var _iterator5 = _createForOfIteratorHelper$c(names),
- _step5;
- try {
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
- var _name2 = _step5.value;
- var _group2 = groups.get(_name2);
- var min = _group2.min.toFixed(2);
- var median = _group2.median.toFixed(2);
- var max = _group2.max.toFixed(2);
- var n = _group2.n;
- var ave = _group2.mean.toFixed(2); //add
- 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");
- }
- } catch (err) {
- _iterator5.e(err);
- } finally {
- _iterator5.f();
- }
- console.log(message);
- }
- performance.clearMarks();
- performance.clearMeasures();
- this.toggle = timestamp;
- }
- }
- };
- common.isVideoPlayed = function (video) {
- return !video.paused && !isNaN(video.duration); //注意,有的手机首次play时会立即paused为false,但其实没加载好, duration为NAN
- };
- common.GifTexDeal = {
- animateObjects: [],
- animateTexs: [],
- addAnimation: function addAnimation(texture, owner) {
- var info = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
- delay: 0
- };
- var id = arguments.length > 3 ? arguments[3] : undefined;
- /* if(this.animateObjects.find(e=>
- e.texture == texture && !ifSame(info, e.info)
- )) */
- var animation;
- var tex = this.animateTexs.find(function (e) {
- return e.texture == texture;
- });
- if (tex) {
- animation = tex;
- } else {
- animation = {
- texture,
- info
- };
- this.animateTexs.push(animation);
- this.setRepeart(animation);
- }
- var object = {
- animation,
- //默认相同的texture对应的info是一样的, 对应一个animation
- owner,
- id
- };
- this.animateObjects.push(object);
- return object;
- },
- remove: function remove(object) {
- var index = this.animateObjects.indexOf(object);
- if (index > -1) {
- this.animateObjects.splice(index, 1);
- if (!this.animateObjects.find(function (e) {
- return e.animation == object.animation;
- })) {
- var i = this.animateTexs.indexOf(object.animation);
- this.animateTexs.splice(i, 1);
- object.animation.texture.repeat.set(1, 1);
- }
- this.stop(object);
- }
- },
- setRepeart: function setRepeart(animation) {
- animation.texture.repeat.set(1 / animation.info.cellXcount, 1 / animation.info.cellYcount);
- },
- start: function start(object) {
- var _this5 = this;
- if (!object || object.started) return;
- object.started = true;
- if (object.animation.started) return;
- object.animation.started = true;
- var info = object.animation.info;
- var count = info.cellXcount * info.cellYcount - (info.voidCount || 0);
- if (count <= 1) return;
- if (object.startCallback) object.startCallback();
- var duration = info.duration + info.delay;
- var delay = info.delay / duration;
- transitions$1.start(function (progress) {
- var index = Math.floor((count - 1) * progress);
- var indexX = index % info.cellXcount;
- var indexY = info.cellYcount - Math.floor(index / info.cellXcount) - 1; //uv.offset.y是从下到上的
- object.animation.texture.offset.x = indexX / info.cellXcount;
- object.animation.texture.offset.y = indexY / info.cellYcount; //console.log(object.id + " : "+ index, indexX, indexY /* object.texture.offset.toArray() */)
- }, duration
- /* * -1 */
- , function () {
- //done (-1):循环
- //先停在最后一帧
- object.started = false;
- object.animation.started = false;
- info.waitNextLoop = setTimeout(function () {
- //从头开始
- /* object.animation.texture.offset.x = 0;
- object.animation.texture.offset.y = 0; */
- _this5.start(object);
- }, info.waitNextTime || 0);
- }, delay, null, object.id, 'gif_' + object.animation.texture.id);
- },
- stop: function stop(object) {
- if (!object || !object.started) return;
- object.started = false; //只有该object对应的texture对应的所有object都停止了,才能真的停止动画:
- if (this.animateObjects.find(function (e) {
- return e.animation == object.animation && e.started;
- })) return;
- transitions$1.cancelById('gif_' + object.animation.texture.id);
- object.animation.texture.offset.set(0, 0);
- object.animation.started = false;
- clearTimeout(object.animation.info.waitNextLoop);
- }
- };
- common.getNestedValue = function (obj, path) {
- // Split the path string into an array of keys.
- var keys = path.split('.'); // Iterate over the keys and access the nested values.
- var current = obj;
- var _iterator6 = _createForOfIteratorHelper$c(keys),
- _step6;
- try {
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
- var key = _step6.value;
- // If the current value is an array and the key is an index, access the array element.
- if (Array.isArray(current) && !isNaN(parseInt(key))) {
- current = current[parseInt(key)];
- } else {
- // If the current value is an object, access the property.
- current = current[key];
- } // If the current value is undefined, return undefined.
- if (current === undefined) {
- return undefined;
- }
- }
- } catch (err) {
- _iterator6.e(err);
- } finally {
- _iterator6.f();
- }
- return current;
- };
- common.watch = function (object, propName, initialValue) {
- //监听某个属性的变化
- var v = initialValue;
- Object.defineProperty(object, propName, {
- get: function get() {
- return v;
- },
- set: function set(e) {
- console.warn('watch:', propName, e);
- v = e;
- }
- });
- };
- common.getDealedUrl = function (url, app, now) {
- var clearCache = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- //前端传过来的src总是要处理下
- if (url.indexOf('http') != -1 || url.indexOf('/') === 0) {
- return url;
- } else {
- if (typeof url === 'string' && (url.substring(0, 4) == 'blob' || url.substring(0, 10) == 'data:image')) {
- return url;
- } else {
- return app.resource.getUserResourceURL(url, clearCache, now);
- }
- }
- };
- var common$1 = common;
- /*
- * @Author: Rindy
- * @Date: 2021-05-12 12:05:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-10-20 11:09:29
- * @Description: decorators
- */
- /**
- * 集成EventEmitter
- * @param {*} target
- */
- var Emitter = function Emitter(target) {
- common$1.extend(target, EventEmitter);
- };
- var browser$1 = {
- mobileVersion(e, t) {
- var i = window.navigator.userAgent,
- n = i.match(e);
- return n = n ? n[1].split(t) : [], {
- major: parseInt(n[0]) || 0,
- minor: parseInt(n[1]) || 0,
- patch: parseInt(n[2]) || 0
- };
- },
- isFullscreen() {
- return document.fullscreenElement || document.mozFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
- },
- supportsFullscreen() {
- return document.fullscreenEnabled || document.mozFullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled;
- },
- isPointerLocked() {
- return document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement;
- },
- requestFullscreen(dom, t) {
- 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);
- },
- requestPointerLock() {
- var e;
- if (document.fullscreenElement) e = document.fullscreenElement();else if (document.mozFullscreenElement) e = document.mozFullscreenElement();else if (document.mozFullScreenElement) e = document.mozFullScreenElement();else {
- if (!document.webkitFullscreenElement) return;
- e = document.webkitFullscreenElement();
- }
- e.requestPointerLock = e.requestPointerLock || e.mozRequestPointerLock || e.webkitRequestPointerLock, e.requestPointerLock(), $(document).off('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', this);
- },
- exitPointerLock() {
- document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock, document.exitPointerLock();
- },
- exitFullscreen() {
- document.exitFullscreen ? document.exitFullscreen() : document.msExitFullscreen ? document.msExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.webkitExitFullscreen && document.webkitExitFullscreen();
- },
- details() {
- var e = navigator.userAgent.match('(Firefox|Chrome|Safari)/([\\d]+)');
- return e ? {
- name: e[1],
- version: parseInt(e[2]),
- platform: navigator.platform
- } : {};
- },
- is(e) {
- return this.details() && this.details().name === e;
- },
- inIframe() {
- return window.parent !== window;
- },
- aspectRatio() {
- var e = window.innerWidth / window.innerHeight;
- return isFinite(e) ? e : 0;
- },
- userAgent() {
- return window.navigator.userAgent;
- },
- isMobile() {
- var e = navigator.userAgent || navigator.vendor || window.opera;
- 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));
- },
- isLandscape() {
- return this.isMobile && this.aspectRatio() > 1;
- },
- isSmallScreen() {
- var e = screen.width / window.devicePixelRatio;
- return e < 240;
- },
- detectWeixin: function detectWeixin() {
- //微信 包括PC的微信
- return window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
- },
- detectWeixinMiniProgram: function detectWeixinMiniProgram() {
- return window.navigator.userAgent.match('miniProgram');
- },
- detectIE() {
- var e = window.navigator.userAgent,
- t = e.indexOf('MSIE ');
- return t !== -1 || !!navigator.userAgent.match(/Trident.*rv\:11\./);
- },
- detectSafari() {
- var e = window.navigator.userAgent,
- t = e.indexOf('Safari');
- return t !== -1 && !this.detectChrome();
- },
- detectFirefox() {
- var e = window.navigator.userAgent;
- return e.indexOf('Firefox') !== -1;
- },
- detectChrome() {
- var e = window.navigator.userAgent;
- return e.indexOf('Chrome') !== -1 && !this.detectOpera();
- },
- detectOpera() {
- var e = window.navigator.userAgent;
- return e.indexOf('OPR') !== -1;
- },
- detectIOS() {
- return this.detectIPhone() || this.detectIPad() || this.detectIPod();
- },
- detectIPad() {
- var e = window.navigator.userAgent,
- t = /iPad/;
- return t.test(e);
- },
- detectIPod() {
- var e = window.navigator.userAgent,
- t = /iPod/;
- return t.test(e);
- },
- detectIPhone() {
- var e = window.navigator.userAgent,
- t = /iPhone/;
- return t.test(e);
- },
- detectAndroid() {
- var e = window.navigator.userAgent;
- return e.indexOf('Android') !== -1;
- },
- detectAndroidMobile() {
- var e = window.navigator.userAgent;
- return this.detectAndroid() && e.indexOf('Mobile') !== -1;
- },
- detectSamsungNative() {
- var e = window.navigator.userAgent;
- return e.indexOf('SM-G900H') !== -1 || e.indexOf('GT-I9500') !== -1 || e.indexOf('SM-N900') !== -1;
- },
- detectSamsungS6() {
- var e = window.navigator.userAgent;
- return e.indexOf('SM-G92') !== -1;
- },
- /************************************************************徐世廷*************************************************************/
- detectHUAWEI5X() {
- return -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
- },
- /*******************************************************************************************************************************/
- detectWebVR() {
- return !(!window.navigator.getVRDisplays || !window.VRDisplay);
- },
- getVRDisplay() {
- var _this = this;
- // var e = $.Deferred()
- // return this.detectWebVR()
- // ? (navigator.getVRDisplays().then(function (t) {
- // t.length >= 1 && e.resolve(t[0]), e.reject(null)
- // }),
- // e)
- // : e.reject(null)
- return new Promise(function (resolve, reject) {
- if (_this.detectWebVR()) {
- navigator.getVRDisplays().then(function (t) {
- if (t.length >= 1) {
- resolve(t[0]);
- } else {
- reject(null);
- }
- }).catch(function () {
- return reject(null);
- });
- } else {
- reject(null);
- }
- });
- },
- iosVersion() {
- if (!this.detectIOS()) throw new DeviceMismatchException('Did not detect an iDevice');
- var e = /((?:\d+\_?){1,3}) like Mac OS/,
- t = '_';
- return this.mobileVersion(e, t);
- },
- androidVersion() {
- if (!this.detectAndroid()) throw new DeviceMismatchException('Did not detect an Android based device');
- var e = /Android ((?:\d+\.?){1,3})/,
- t = '.';
- return this.mobileVersion(e, t);
- },
- valueFromCookie(e, t) {
- var i = new RegExp(e + '=([0-9a-f]+)(; ?|$)').exec(document.cookie);
- if (!i) return t;
- var n = i[1];
- return 'boolean' == typeof t ? 'true' === n || '1' === n : 'number' == typeof t ? parseFloat(n) : n;
- },
- valueFromHash(e, t) {
- var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
- n = i.exec(window.location.href);
- if (!n) return t;
- var r = n[1];
- return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
- },
- valueFromUrl(key) {
- return this.urlHasValue(key, true);
- },
- urlHasValue: function urlHasValue(key, isGetValue) {
- var querys = window.location.search.substr(1).split('&');
- if (isGetValue) {
- for (var i = 0; i < querys.length; i++) {
- var split = querys[i].indexOf('=');
- var param = querys[i].substring(0, split);
- var value = querys[i].substring(split + 1);
- if (param == key && value) {
- return value;
- }
- }
- return '';
- } else {
- //return window.location.search.match("&" + key + "|\\?" + key) != null 有bug
- for (var _i = 0; _i < querys.length; _i++) {
- var keypair = querys[_i].split('=');
- if (keypair[0] == key) {
- return true;
- }
- }
- return false;
- }
- },
- maybeQilin() {
- //可能是银河麒麟桌面系统,webgl容易出bug 2024.10
- return window.navigator.userAgent.toLowerCase().includes('linux');
- }
- };
- var Colors = {
- //green: new THREE.Color('#00c8aF'),
- green: new THREE.Color('#15FFE2'),
- yellow: new THREE.Color('#F6FE14'),
- lightGreen: new THREE.Color('#09e1c0'),
- newBlue: new THREE.Color('#007BFF'
- /* '#00c8ae' */
- ),
- //new THREE.Color(4967932),
- altBlue: new THREE.Color(47355),
- tagDefault: new THREE.Color(223357),
- classicBlue: new THREE.Color(53759),
- mpYellow: new THREE.Color(16502016),
- mpOrange: new THREE.Color(16428055),
- mpBlue: new THREE.Color(12096),
- mpLtGrey: new THREE.Color(13751252),
- mpDkGrey: new THREE.Color(10000019),
- mpRed: new THREE.Color(12525854),
- mpOrangeDesat: new THREE.Color(16764529),
- mpBlueDesat: new THREE.Color(4034734),
- mpRedDesat: new THREE.Color(14705505),
- white: new THREE.Color(16777215),
- black: new THREE.Color(0),
- _desat(e, t) {
- var i = t || 0.3,
- r = new THREE.Color().copy(e).getHSL(e);
- return new THREE.Color().setHSL(r.h, r.s * (1 - i), r.l);
- },
- _darken(e, t) {
- var i = t || 0.2,
- r = e.getHSL(e);
- return new THREE.Color().setHSL(r.h, r.s, r.l * (1 - i));
- }
- };
- Colors.mainColor = Colors.newBlue; //当前主题色
- var WarpStyle = {
- BLACK: 'black',
- STD: 'std',
- WALK: 'walk'
- };
- Math.sign = function (e) {
- return e < 0 ? -1 : 1;
- };
- var constants$4 = {
- signedUrlDefaultExpireTime: 24e4,
- signedUrlCheckInterval: 1e4,
- signedUrlRefreshBuffer: 15e3,
- dollhouseFOV: browser$1.isMobile() ? 90 : 70,
- dollhouseNear: 1,
- dollhouseFar: 5e3,
- insideFOV: browser$1.isMobile() ? 90 : 70,
- insideFOVMax: 120,
- insideNear: 0.1,
- insideFar: 5e3,
- insideLookSpeed: 0.12,
- //产品说放开俯仰角
- insideLookLimitUp: 89.8,
- //60// browser.isMobile() ? 15 : 25, //browser.valueFromUrl('ai') == 'sds' ? 50 : browser.isMobile() ? 15 : 25,
- insideLookLimitDown: -89.8,
- //browser.valueFromUrl('ai') == 'sds' ? -50 : browser.isMobile() ? -15 : -25,
- orthoNear: 1,
- orthoFar: 5e3,
- orthoBase: 10,
- planeHeightShift: 0.1,
- narrowLandscapeHeight: 290,
- reallyNarrowLandscapeHeight: 250,
- visionTilingStartDate: new Date('8/26/2016'),
- visionTilingStartVersion: '1.1.407.13667',
- windowHeightHighQualityThreshold: 900,
- tourStepDelayDefault: 3500,
- tourStepDelaySlideShow: 5e3,
- workshopApsect: 9 / 16,
- highQualityMaxZoom: 2,
- ultraHighQualityMaxZoom: 3
- };
- var labelorder = 8;
- var RenderOrder = {
- boundingSkybox: 1,
- visibleFloor: 1,
- highTileCube: 2,
- panoMarker: 2,
- //不能遮挡住overlay等物体
- line: 4,
- overlay: 5,
- //panoLabel: 6,
- footIcon: 6,
- reticule: 7,
- tagStem: 8,
- tagDisc: 9,
- ribbon: 9,
- ghostFloor: 10,
- //透明的不能在不透明(visibleFloor、videoTag)之前渲染否则会遮住
- cad: 11,
- //floorplan
- vrMarker: 12,
- view: 13,
- entryArrow: 14,
- monitorPlane: 20,
- tag: {
- label: labelorder,
- spot: labelorder,
- line: labelorder - 1,
- onMesh: {
- line: labelorder,
- spot: labelorder - 1
- }
- },
- measure: {
- marker: 16,
- subLabel: 14,
- label: 15,
- ruler: 14
- },
- magnifier: 21
- };
- /*
- renderOrder并非大的就一定能盖住小的, 透明的反而需要后渲染,否则会盖住先渲染的。
- */
- var settings$2 = {
- visions: 2,
- //2有下相机
- debug: false,
- version: '2.23.8-0-g24ec69e',
- skyboxRadius: 2500,
- job: 'dacf7dfa24ae47fab8fcebfe4dc41ab9',
- preTexture: '_50k_texture_jpg_high1',
- format: '_50k.dam',
- skyboxRadius: 2500,
- modelBoundsPadding: 5,
- showNeighbors: !1,
- useWheel: browser$1.valueFromHash('wh', !0),
- crossOrigin: 'anonymous',
- fancierTransition: !1,
- wireframe: !1,
- skyboxWireframe: !1,
- modelAlpha: 1,
- highlightPanoSelection: !1,
- showSweeps: !0,
- showSkyboxes: !1,
- showMesh: !0,
- showFloors: !1,
- showFloorDuration: 300,
- showFloorDelay: 300,
- hideFloorDuration: 300,
- hideFloorDelay: 0,
- reticuleOpacityTransitionTime: 250,
- reticuleColor: Colors.mainColor,
- markerOpacityTransitionTime: 500,
- guiAnimationSpeed: 250,
- highlightAnimationDuration: 500,
- modelComponentLoadSpinnerDelay: 150,
- captureErrors: !1,
- maxMobileTextures: 6,
- minimalMemoryMode: browser$1.valueFromHash('m3', browser$1.isMobile()),
- startupFlyinDelay: 3e3,
- vrEnabled: false,
- overlay: {
- width: 1,
- height: 0.5,
- depth: 0.04
- },
- dollhouseDefault: {
- minDistance: 15,
- maxDistance: 50,
- minPolarAngle: THREE.MathUtils.degToRad(10),
- maxPolarAngle: THREE.MathUtils.degToRad(90)
- },
- hideReticuleTimeout: 1e3,
- analytics: {
- inactivityThreshold: 30,
- sessionTrackingRate: 0.15,
- maxTrackedErrors: 20,
- sessionDurationPingFrequency: 10,
- sessionDurationTimeout: 15
- },
- flydown: {
- movementEasing: 'easeInOutQuad',
- movementDelay: 0.001,
- rotationEasing: 'easeInOutQuad',
- rotationDelay: 0.5,
- modelTextureDelay: 0.75,
- skyboxDelay: 0.75
- },
- transition: {
- /* flySpeed: 0.0037, //匀速行走的速度,稍微比正常过渡快一些 //0.01,
- flyTime: 300, //750, 最小时间
- flytimeMaxDistanceThreshold: 7, //5,
- flytimeDistanceMultiplier: 300, //120,//150, */
- flySpeed: 0.0043,
- //匀速行走的速度,稍微比正常过渡快一些 //0.01,
- flyTime: 650,
- //750, 最小时间
- flytimeMaxDistanceThreshold: 10,
- //5,
- flytimeDistanceMultiplier: 120,
- //120,//150,
- maxRotSpeed: 1.2,
- //add
- aimTime: 1500,
- aimSlowFactor: 1.5,
- blur: 0.8,
- movementEasing: 'easeOutSine',
- //'easeOutSine',//'easeInOutQuad',
- blendEasing: 'easeInOutQuad',
- fastForwardFactor: browser$1.valueFromHash('mfis', 3)
- },
- show360Views: {
- enabled: !0,
- transitionTime: 1e3
- },
- quickstart: {
- enabled: 1,
- //1 === browser.valueFromHash('qust', 0) || 1 === browser.valueFromHash('qs', 0),
- animation: 1400,
- showTextDelay: 500,
- fadeOutDelay: 3e3,
- fovChange: 10
- },
- appConfig: {
- webvr_version: null,
- segment_key: null,
- embedly_key: null,
- branch_key: null,
- keen_write_key: null,
- keen_project_id: null
- },
- input: {
- longTapThreshold: 200,
- moveToleranceNDC: 0.08,
- touchMoveThreshold: 25
- },
- labels: {
- enabled: !1,
- hideUntilStart: !0,
- fadeInDuration: 250,
- fadeInDelay: 250,
- fadeOutDuration: 250,
- fadeOutDelay: 0,
- zoomHideThreshhold: {
- mobile: browser$1.isSmallScreen() ? 0.45 : 0.6,
- desktop: 2
- },
- zoomTruncateThreshhold: {
- mobile: browser$1.isSmallScreen() ? 0.35 : 0.45,
- desktop: 0.85
- },
- minLengthForTruncate: 16,
- truncateLength: 12,
- truncateSuffix: '...'
- },
- tags: {
- enabled: browser$1.valueFromHash('mt', 1),
- startup: {
- hideUntilStart: !0,
- fadeInDuration: 500,
- fadeInDelay: 100
- },
- visibility: {
- anyDistance: !0,
- visibleDistance: 8,
- cameraClearance: 0.1,
- alphaTestLevel: 0.05,
- hideViaFloor: !0,
- hideOffScreenDisc: !1,
- hideOffScreenObject: !1
- },
- disc: {
- opacity: 1,
- disabledOpacity: 0.5,
- scale: {
- nearBound: 1.5,
- farBound: 4.8,
- linkFarBound: !1,
- linkPercent: 40,
- maxSize: 80,
- minSize: 40,
- baseViewportSize: 800,
- responsiveness: 100
- }
- },
- pole: {
- enabled: !0,
- height: 0.5,
- width: 2,
- opacity: 0.5,
- color: 'white'
- },
- navigate: {
- nearestPano: !0,
- lineOfSight: !0,
- reactivate: !0,
- aimAt: 'disc',
- tiltTolerance: 25,
- rotateSpeedFactor: 0.6
- }
- },
- view360: {
- //xzw add
- circleDisToCenter: 2.4,
- visibleDisAtView: 15
- },
- boundExpandLength: 1.5,
- path: {
- color: Colors.mainColor,
- colorUp: Colors._desat(Colors.mainColor, 0.5),
- colorDown: Colors._darken(Colors.mainColor, 0.35),
- opacity: 0.5,
- style: 'ribbon',
- height: 0.025,
- ribbonWidth: 0.24,
- outsideHeight: 0.5,
- waypointRadius: 0.5,
- waypointIndoorRadius: 0.24,
- waypointPulse: 1e3,
- typ: WarpStyle.BLACK,
- meshFree: browser$1.valueFromHash('mf', 1),
- mapGuides: browser$1.valueFromHash('guides', !0),
- fadeInTime: 400,
- fadeOutTime: 300
- },
- warp: {
- nearPanoDist: 0.1,
- matchCam: !1,
- blur: 0.33,
- fastTime: 1500,
- teleportTime: 1500,
- outsideTime: 2e3,
- lookAheadMax: 0.3,
- lookAheadDist: 2.5,
- softPushDist: 0.37,
- softPushEnd: 0.3,
- softBendAngle: 8,
- softBendTilt: 4,
- softBendEnd: 0.3,
- doBurns: browser$1.valueFromHash('kb', !0),
- burnsAngle: 35,
- minBurnsAngle: 35,
- minDownAngle: -35,
- maxTurnPerSec: 280,
- maxAimPerSec: 35,
- minRotation: 12,
- maxAimRotation: 33.2,
- turnFriction: 0.2,
- flySpeed: 0.01,
- minWarpTime: 1200,
- warpInterruptionRedirectTime: 500,
- tourStepDelay: browser$1.valueFromHash('st', 0),
- walkDelay: 0,
- walkMaxDist: 50,
- walkMinDist: 0.8,
- walkSlideShowThreshhold: 3e3,
- walkExtraPanosDistance: 0.4,
- timePerMeter: 800,
- motionLeadTime: 500,
- movementEasing: 'easeInOutQuad',
- blendEasing: 'easeInOutQuad',
- showBunny: !1,
- loop: browser$1.valueFromHash('lp', !1),
- auto: browser$1.valueFromHash('ts', -1),
- eOrder: 'YXZ',
- stepFactor: 0.25,
- brakeStrength: 2,
- minBrakeAngle: 0.1,
- maxBrakeAngle: 1.8,
- climbEffort: 4
- },
- rotationFriction: browser$1.isMobile() ? 0.08 : 0.05,
- rotationAccelerationInside: 4.5,
- rotationAccelerationOutside: 0.15,
- rotationAfterMoveMultiplierX: browser$1.isMobile() ? 120 : 40,
- rotationAfterMoveMultiplierY: 40,
- rotationAfterMoveHistoryCount: 5,
- panFriction: 0.09,
- panAccelerationOutside: 60,
- //onload: browser.valueFromHash('onload', Viewmode.PANORAMA),
- zoomNearLimit: 0.1,
- zoomFarLimit: 10,
- navigation: {
- panoScores: !1,
- mouseDirection: !0,
- filterStrictness: 0.75,
- angleFactor: -30,
- directionFactor: 10,
- distanceFactor: -1,
- optionalityFactor: 3
- },
- sdkInit: !1,
- secretPanelWord: [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],
- console: browser$1.valueFromHash('console', !1),
- noMeshFloorPositionOffset: new THREE.Vector3(0, -1.2, 0),
- panoramaNeighbourMaxDistance: 5,
- panoFloorClickRadius: 0.35,
- showScreenshotLocations: !1,
- showAxis: !1,
- showNeighbourRaycasts: !1,
- colorMarkerOnLoad: !1,
- colorMarkerByFloor: !1,
- tiling: {
- panoPreRenderRepeatDelay: 2500,
- panoPreRenderDelay: 500,
- preRenderTourPanos: browser$1.valueFromHash('tileprerender', 0),
- tilingFlagNames: ['usetiles', 'tiles'],
- maxNavPanoQuality: browser$1.valueFromHash('maxtileq', null),
- maxZoomPanoQuality: browser$1.valueFromHash('maxztileq', null),
- overlayStyle: browser$1.valueFromHash('tileoverlay', 0),
- uploadIntervalDelay: browser$1.valueFromHash('tileupdelay', 10),
- initialIntervalDelay: browser$1.valueFromHash('itiledelay', 0),
- maxNonBaseUploadsPerFrame: browser$1.valueFromHash('maxnbtpf', 2),
- maxBaseUploadsPerFrame: browser$1.valueFromHash('maxbtpf', 6),
- customCompression: browser$1.valueFromHash('tilecustcomp', 0),
- mobileHighQualityOverride: !1,
- allowUltraHighResolution: !0
- },
- zoom: {
- enabled: !0,
- forceOff: browser$1.valueFromHash('nozoom', 0),
- overridemax: browser$1.valueFromHash('maxzoom', null),
- overridemin: browser$1.valueFromHash('minzoom', null),
- max: constants$4.highQualityMaxZoom,
- min: 1,
- transitionStyle: browser$1.valueFromHash('zoomtrans', 1),
- activationThreshold: 1.1,
- restoreTime: 500,
- zoomToDefaultWhenToPano: true //add
- },
- profiling: {
- enabled: browser$1.valueFromHash('mem', !1)
- }
- /*
- insideFOV: browser.valueFromHash("fov", constants.insideFOV),
- insideFOVMax: browser.valueFromHash("fovmax", constants.insideFOVMax),
- panorama: {
- transitionTime: 1e3,
- modelAlpha: 0,
- modelAlphaDelay: .75,
- modelAlphaLength: 1,
- skyboxOpacity: 1,
- skyboxOpacityDelay: .75,
- skyboxOpacityLength: .9,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: .8,
- cameraMatrixDelay: 0,
- cameraMatrixEase: easing.easeInCubic,
- reticuleOpacity: 1,
- markerOpacity: .3,
- markerOpacityOnHover: 1
- },
- dollhouse: {
- transitionTime: 1e3,
- modelAlpha: 1,
- modelAlphaDelay: 0,
- modelAlphaLength: 1 - .75,
- skyboxOpacity: 0,
- skyboxOpacityDelay: 0,
- skyboxOpacityLength: 1 - .75,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: .8,
- cameraMatrixDelay: .3,
- cameraMatrixEase: easing.easeInCubic,
- reticuleOpacity: 1,
- markerOpacity: 0,
- markerOpacityOnHover: 0
- },
- floorplan: {
- transitionTime: 1e3,
- modelAlpha: 1,
- modelAlphaDelay: 0,
- modelAlphaLength: 1 - .75,
- skyboxOpacity: 0,
- skyboxOpacityDelay: 0,
- skyboxOpacityLength: 1 - .75,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: .5,
- cameraMatrixDelay: 0,
- cameraMatrixEase: easing.easeOutCubic,
- reticuleOpacity: 1,
- markerOpacity: 0,
- markerOpacityOnHover: 0,
- cameraHeight: 50
- },
- transitioning: {
- reticuleOpacity: 0,
- markerOpacity: .3,
- markerOpacityOnHover: 1
- },
- "floorplan-dollhouse": {
- rotationDelay: 0,
- rotationDuration: 1
- },
- "floorplan-panorama": {
- rotationDelay: .5,
- rotationDuration: 1
- },
- "dollhouse-panorama": {
- rotationDelay: .5,
- rotationDuration: 1
- },
- "dollhouse-floorplan": {
- rotationDelay: 0,
- rotationDuration: 1,
- cameraMatrixDuration: 1.05,
- cameraMatrixDelay: .5
- },
- "panorama-dollhouse": {
- rotationDelay: 0,
- rotationDuration: .5
- },
- "panorama-floorplan": {
- transitionTime: 1500,
- rotationDelay: 0,
- rotationDuration: .5
- }
- */
- };
- settings$2 = common$1.deepExtend(settings$2, constants$4, {
- insideFOV: browser$1.valueFromHash('fov', constants$4.insideFOV),
- insideFOVMax: browser$1.valueFromHash('fovmax', constants$4.insideFOVMax),
- panorama: {
- transitionTime: 1e3,
- modelAlpha: 0,
- modelAlphaDelay: settings$2.flydown.modelTextureDelay,
- modelAlphaLength: 1,
- skyboxOpacity: 1,
- skyboxOpacityDelay: settings$2.flydown.skyboxDelay,
- skyboxOpacityLength: 0.9,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: 0.8,
- cameraMatrixDelay: 0,
- cameraMatrixEase: easing.easeInCubic,
- reticuleOpacity: 1,
- markerOpacity: 0.3,
- markerOpacityOnHover: 1
- },
- dollhouse: {
- transitionTime: 1e3,
- modelAlpha: 1,
- modelAlphaDelay: 0,
- modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
- skyboxOpacity: 0,
- skyboxOpacityDelay: 0,
- skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: 0.8,
- cameraMatrixDelay: 0.3,
- cameraMatrixEase: easing.easeInQuint,
- //原先的ease模型较大时效果不好
- reticuleOpacity: 1,
- markerOpacity: 0,
- markerOpacityOnHover: 0
- },
- floorplan: {
- transitionTime: 1e3,
- modelAlpha: 1,
- modelAlphaDelay: 0,
- modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
- skyboxOpacity: 0,
- skyboxOpacityDelay: 0,
- skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
- fovLength: 1,
- fovDelay: 0,
- cameraMatrixDuration: 0.5,
- cameraMatrixDelay: 0,
- cameraMatrixEase: easing.easeOutQuint,
- //easing.easeOutCubic,
- reticuleOpacity: 1,
- markerOpacity: 0,
- markerOpacityOnHover: 0,
- cameraHeight: 50
- },
- transitioning: {
- reticuleOpacity: 0,
- markerOpacity: 0.3,
- markerOpacityOnHover: 1
- },
- 'floorplan-dollhouse': {
- rotationDelay: 0,
- rotationDuration: 1,
- cameraMatrixEase: easing.easeInQuint //原先的ease模型较大时效果不好
- },
- 'floorplan-panorama': {
- rotationDelay: 0.5,
- rotationDuration: 1
- },
- 'dollhouse-panorama': {
- rotationDelay: 0.5,
- rotationDuration: 1
- },
- 'dollhouse-floorplan': {
- rotationDelay: 0,
- rotationDuration: 1,
- cameraMatrixDuration: 1.05,
- cameraMatrixDelay: 0.5
- },
- 'panorama-dollhouse': {
- rotationDelay: 0,
- rotationDuration: 0.5,
- cameraMatrixEase: easing.easeInOutQuad //fov渐变
- },
- 'panorama-floorplan': {
- transitionTime: 1500,
- rotationDelay: 0,
- rotationDuration: 0.5
- },
- //底图版
- /* floorMat: {
- //楼层材质
- 'stardard-hide': {
- //没有plane时的隐藏楼层
- opacity: 0.2,
- brightness: 0.12,
- mixRatio: 0.7,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor, //透明在上层
- //transparent:true
- },
- 'stardard-show': {
- //没有plane时的所有显示楼层
- opacity: 1,
- brightness: 0,
- mixRatio: 0,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.visibleFloor,
- //transparent:true
- },
- 'hasPlane-normal': {
- //有plane时的其他楼层
- opacity: 0.024,
- brightness: 0.6,
- mixRatio: 1,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.visibleFloor,
- //transparent:true
- },
- 'hasPlane-curFloor': {
- //有plane时的当前楼层
- opacity: 1,
- brightness: 0.3, //0.11,
- mixRatio: 0.78, //0.94,
- depthTest: false,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor, //当前楼在上层,所以和之前反一下
- //transparent:true
- },
- }, */
- //修改depthTest超黑版,但会引起其他物体遮挡混乱
- /* 'stardard-hide': {
- //没有plane时的隐藏楼层
- opacity: 0.2,
- brightness: 0.12,
- mixRatio: 0.7,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor, //透明在上层
- //transparent:true
- },
- 'stardard-show': {
- //没有plane时的所有显示楼层
- opacity: 1,
- brightness: 0,
- mixRatio: 0,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.visibleFloor,
- //transparent:true
- },
- 'hasPlane-normal': {
- //有plane时的其他楼层
- opacity: 0.024,
- brightness: 0.6,
- mixRatio: 1,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor ,
- //transparent:true
- },
- 'hasPlane-curFloor': {
- //有plane时的当前楼层
- opacity: 1,
- brightness: 0.1, //0.11,
- mixRatio: 0.98, //0.94,
- depthTest: false,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor+1, //当前楼在上层,所以和之前反一下
- //transparent:true
- }, */
- floorMat: {
- //楼层材质
- 'stardard-hide': {
- //没有plane时的隐藏楼层
- opacity: 0.2,
- brightness: 0.12,
- mixRatio: 0.7,
- depthTest: true,
- renderOrder: RenderOrder.ghostFloor //透明在上层
- },
- 'stardard-show': {
- //没有plane时的所有显示楼层
- opacity: 1,
- brightness: 0,
- mixRatio: 0,
- depthTest: true,
- renderOrder: RenderOrder.visibleFloor
- },
- 'hasPlane-normal': {
- //有plane时的其他楼层
- opacity: 0.024,
- brightness: 0.6,
- mixRatio: 1,
- depthTest: true,
- //depthWrite: false,
- renderOrder: RenderOrder.ghostFloor
- },
- 'hasPlane-curFloor': {
- //有plane时的当前楼层
- opacity: 1,
- brightness: 0.1,
- //0.11,
- mixRatio: 0.98,
- //0.94,
- depthTest: true,
- renderOrder: RenderOrder.visibleFloor
- }
- }
- });
- settings$2.path.meshFree && (settings$2.path.typ = WarpStyle.WALK);
- settings$2.zoom.max = settings$2.zoom.overridemax || settings$2.zoom.max;
- settings$2.zoom.min = settings$2.zoom.overridemin || settings$2.zoom.min;
- settings$2.HorizontalBlurShader = new THREE.ShaderPass(THREE.HorizontalBlurShader);
- settings$2.VerticalBlurShader = new THREE.ShaderPass(THREE.VerticalBlurShader);
- settings$2.VerticalBlurShader.renderToScreen;
- settings$2.aspect = window.innerWidth / window.innerHeight;
- isNaN(constants$4.aspect) && (constants$4.aspect = 1); //settings.sphereBufferGeometry = new THREE.SphereBufferGeometry(0.1)
- settings$2.planeBufferGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
- settings$2.freeze = Object.freeze({
- FlyToPano: transitions$1.getUniqueId(),
- FlyToNewMode: transitions$1.getUniqueId(),
- FlyToSameMode: transitions$1.getUniqueId(),
- FlyToViewFloor: transitions$1.getUniqueId(),
- LookTransition: transitions$1.getUniqueId(),
- ZoomTransition: transitions$1.getUniqueId(),
- LookRotationForPlay: transitions$1.getUniqueId(),
- wallLineShine: transitions$1.getUniqueId(),
- spotShine: transitions$1.getUniqueId(),
- rulerShine: transitions$1.getUniqueId(),
- outsideFocus: transitions$1.getUniqueId(),
- shopCircle: transitions$1.getUniqueId()
- });
- var settings$3 = settings$2;
- var _class$1, _class2, _temp;
- var _root = getScriptURL();
- var components = {};
- function defineComponent(name, component) {
- if (typeof components[name] !== 'undefined') {
- console.warn("Identifier component.".concat(name, " has already been declared"));
- }
- if (typeof component !== 'function') {
- throw TypeError("argument component not a function");
- }
- components[name] = component;
- }
- var KanKan = Emitter(_class$1 = (_temp = _class2 = /*#__PURE__*/function () {
- function KanKan(options) {
- _classCallCheck(this, KanKan);
- this.uid = KanKan.uid++;
- this.env = KanKan.env;
- this.version = KanKan.version;
- this.dom = null;
- this.$plugins = null;
- this.core = new Component(this);
- this.config = KanKan.config(options, {});
- this.Plugins = new Plugins(this);
- this.gui = new GUI(this);
- if (this.config.vr.markerHeight != null) {
- settings$3.vrMarkerHeight = this.config.vr.markerHeight;
- }
- if (this.config.scene.markerOpacity != null) {
- settings$3.panorama.markerOpacity = this.config.scene.markerOpacity;
- }
- if (this.config.scene.pathEndColor != null) {
- settings$3.path.color = this.config.scene.pathEndColor;
- }
- }
- _createClass(KanKan, [{
- key: "withConfig",
- value: function withConfig(options) {
- this.config = deepExtend(this.config, options || {}); //deepMergeObject(this.config, options || {})
- }
- }, {
- key: "withDom",
- value: function withDom() {
- if (this.dom) {
- // 已经初始化好,不再创建dom
- return;
- }
- var container = typeof this.config.dom === 'string' ? document.querySelector(this.config.dom) : this.config.dom;
- if (!container) {
- throw new Error('options.dom must be require');
- }
- var dom = document.createElement('div');
- dom.className = 'kankan-app';
- var plugins = document.createElement('div');
- plugins.id = "kankan-plugins__".concat(this.uid);
- plugins.className = 'kankan-plugins';
- plugins.style.position = 'absolute';
- plugins.style.top = 0;
- plugins.style.left = 0;
- plugins.style.width = '100%';
- plugins.style.height = '100%';
- plugins.style.pointerEvents = 'none';
- plugins.style.zIndex = 10;
- var player_a = document.createElement('div');
- player_a.className = 'player';
- player_a.setAttribute('name', 'main');
- var player_b = document.createElement('div');
- player_b.className = 'player';
- player_b.setAttribute('name', 'copy');
- var player_mark = document.createElement('div');
- player_mark.className = 'player-mark';
- player_mark.style.backgroundImage = "url(".concat(this.resource.base('images/tag_pointer.png'), ")");
- player_a.appendChild(player_mark);
- player_b.appendChild(player_mark.cloneNode());
- dom.appendChild(plugins);
- dom.appendChild(player_a);
- dom.appendChild(player_b);
- container.appendChild(dom);
- this.dom = dom;
- this.$plugins = plugins;
- }
- }, {
- key: "withComponent",
- value: function withComponent(name) {
- var factory = components[name];
- if (typeof factory === 'undefined') {
- console.warn("component[".concat(name, "] not a function"));
- return;
- }
- var Instance = factory();
- Instance.prototype.$app = this;
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
- this.core.add(name, _construct(Instance, args));
- }
- }, {
- key: "withNewComponent",
- value: function withNewComponent(name) {
- var factory = components[name];
- if (typeof factory === 'undefined') {
- console.warn("component[".concat(name, "] not a function"));
- return;
- }
- var Instance = factory();
- Instance.prototype.$app = this;
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- args[_key2 - 1] = arguments[_key2];
- }
- return _construct(Instance, args);
- }
- }], [{
- key: "root",
- value: function root(path) {
- return _root + path;
- }
- }, {
- key: "config",
- value: function config(options, target) {
- if (typeof options !== 'object') {
- return config$6;
- }
- if (target) {
- target = Object.assign(target, config$6);
- }
- for (var key in options) {
- if (['env', 'version'].indexOf(key) != -1) {
- continue;
- }
- if (typeof config$6[key] === 'undefined') {
- continue;
- }
- if (target) {
- target[key] = options[key];
- }
- config$6[key] = options[key];
- }
- return target || config$6;
- }
- }]);
- return KanKan;
- }(), _class2.uid = 1, _class2.env = config$6.env, _class2.version = config$6.version, _class2.Config = config$6, _temp)) || _class$1;
- var MathLight = {};
- MathLight.RADIANS_PER_DEGREE = Math.PI / 180;
- MathLight.DEGREES_PER_RADIAN = 180 / Math.PI;
- MathLight.Vector3 = function (e, t, i) {
- this.x = e || 0, this.y = t || 0, this.z = i || 0;
- };
- MathLight.Matrix4 = function () {
- 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.');
- };
- MathLight.Matrix4.prototype = {
- identity: function identity() {
- return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this;
- },
- copy: function copy(e) {
- return this.elements.set(e.elements), this;
- },
- applyToVector3: function applyToVector3(e) {
- var t = e.x,
- i = e.y,
- n = e.z,
- r = this.elements;
- 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;
- },
- getInverse: function getInverse(e, t) {
- var i = this.elements,
- n = e.elements,
- r = n[0],
- o = n[1],
- a = n[2],
- s = n[3],
- l = n[4],
- c = n[5],
- h = n[6],
- u = n[7],
- d = n[8],
- p = n[9],
- f = n[10],
- g = n[11],
- m = n[12],
- v = n[13],
- A = n[14],
- y = n[15],
- C = p * A * u - v * f * u + v * h * g - c * A * g - p * h * y + c * f * y,
- I = m * f * u - d * A * u - m * h * g + l * A * g + d * h * y - l * f * y,
- E = d * v * u - m * p * u + m * c * g - l * v * g - d * c * y + l * p * y,
- b = m * p * h - d * v * h - m * c * f + l * v * f + d * c * A - l * p * A,
- w = r * C + o * I + a * E + s * b;
- if (0 === w) {
- var _ = "MathLight.Matrix4.getInverse(): can't invert matrix, determinant is 0";
- if (t) throw new Error(_);
- return console.warn(_), this.identity();
- }
- var T = 1 / w;
- 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;
- },
- makeRotationFromQuaternion: function makeRotationFromQuaternion(e) {
- var t = this.elements,
- i = e.x,
- n = e.y,
- r = e.z,
- o = e.w,
- a = i + i,
- s = n + n,
- l = r + r,
- c = i * a,
- h = i * s,
- u = i * l,
- d = n * s,
- p = n * l,
- f = r * l,
- g = o * a,
- m = o * s,
- v = o * l;
- 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;
- }
- };
- MathLight.Quaternion = function (e, t, i, n) {
- this._x = e || 0, this._y = t || 0, this._z = i || 0, this._w = void 0 !== n ? n : 1;
- };
- MathLight.Quaternion.prototype = {
- get x() {
- return this._x;
- },
- set x(e) {
- this._x = e;
- },
- get y() {
- return this._y;
- },
- set y(e) {
- this._y = e;
- },
- get z() {
- return this._z;
- },
- set z(e) {
- this._z = e;
- },
- get w() {
- return this._w;
- },
- set w(e) {
- this._w = e;
- },
- copy: function copy(e) {
- this._x = e.x, this._y = e.y, this._z = e.z, this._w = e.w;
- },
- inverse: function inverse() {
- return this.conjugate().normalize();
- },
- conjugate: function conjugate() {
- return this._x *= -1, this._y *= -1, this._z *= -1, this;
- },
- length: function length() {
- return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
- },
- normalize: function normalize() {
- var e = this.length();
- 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;
- },
- setFromAxisAngle: function setFromAxisAngle(e, t) {
- var i = t / 2,
- n = Math.sin(i);
- return this._x = e.x * n, this._y = e.y * n, this._z = e.z * n, this._w = Math.cos(i), this;
- },
- setFromUnitVectors: function () {
- var e,
- t,
- i = 1e-6;
- return function (n, o) {
- 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();
- };
- }(),
- multiply: function multiply(e) {
- return this.multiplyQuaternions(this, e);
- },
- premultiply: function premultiply(e) {
- return this.multiplyQuaternions(e, this);
- },
- multiplyQuaternions: function multiplyQuaternions(e, t) {
- var i = e._x,
- n = e._y,
- r = e._z,
- o = e._w,
- a = t._x,
- s = t._y,
- l = t._z,
- c = t._w;
- 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;
- }
- };
- MathLight.convertWorkshopVector = function (e) {
- return new MathLight.Vector3(-e.x, e.y, e.z);
- };
- MathLight.convertWorkshopQuaternion = function (e) {
- 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));
- };
- MathLight.convertWorkshopOrthoZoom = function (e) {
- return e === -1 ? -1 : e / 16 * (window.innerWidth / window.innerHeight) / constants$4.workshopApsect;
- };
- MathLight.convertWorkshopPanoramaQuaternion = function (e) {
- 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));
- };
- MathLight.normalize = function (e) {
- var t = e.x * e.x + e.y * e.y + e.z * e.z,
- i = Math.sqrt(t);
- e.x /= i, e.y /= i, e.z /= i;
- };
- MathLight.dot = function (e, t) {
- return e.x * t.x + e.y * t.y + e.z * t.z;
- };
- MathLight.cross = function (e, t, i) {
- var n = e.x,
- r = e.y,
- o = e.z;
- i.x = r * t.z - o * t.y, i.y = o * t.x - n * t.z, i.z = n * t.y - r * t.x;
- };
- MathLight.setVector = function (e, t, i, n) {
- e.x = t, e.y = i, e.z = n;
- };
- MathLight.copyVector = function (e, t) {
- t.x = e.x, t.y = e.y, t.z = e.z;
- };
- MathLight.addVector = function (e, t) {
- e.x += t.x, e.y += t.y, e.z += t.z;
- };
- MathLight.subVector = function (e, t) {
- e.x -= t.x, e.y -= t.y, e.z -= t.z;
- };
- MathLight.applyQuaternionToVector = function (e, t) {
- var i = t.x,
- n = t.y,
- r = t.z,
- o = e.x,
- a = e.y,
- s = e.z,
- l = e.w,
- c = l * i + a * r - s * n,
- h = l * n + s * i - o * r,
- u = l * r + o * n - a * i,
- d = -o * i - a * n - s * r;
- 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;
- };
- MathLight.angleBetweenVectors = function (e, t) {
- return Math.acos(MathLight.dot(e, t));
- };
- MathLight.closeTo = function (e1, e2, precision) {
- //xzw add 判断e1,e2是否接近
- var prec = Math.pow(10, -(precision || 4));
- var s1 = Math.abs(e1.x - e2.x) < prec && Math.abs(e1.y - e2.y) < prec && Math.abs(e1.z - e2.z) < prec;
- if (e1.w) {
- return s1 && Math.abs(e1.w - e2.w) < prec;
- } else return s1;
- };
- /**
- * 日志输出
- */
- var logger$1 = {
- info() {
- var _console;
- (_console = console).log.apply(_console, arguments);
- },
- debug() {
- var _console2;
- (_console2 = console).debug.apply(_console2, arguments);
- },
- error() {
- var _console3;
- (_console3 = console).error.apply(_console3, arguments);
- },
- warn() {
- var _console4;
- (_console4 = console).warn.apply(_console4, arguments);
- },
- time(s) {
- console.time(s);
- },
- timeEnd(s) {
- console.timeEnd(s);
- },
- message(s) {
- alert(s);
- }
- };
- var BlackoutStyle$1 = {
- NONE: 0,
- MIDDLE: 1,
- END: 2,
- BEGINNING: 3,
- FADEIN: 4
- };
- var ZoomStats = function ZoomStats() {
- this.actionSequence = [], this.actionSequenceInProgress = !1;
- }; // function r(e, t, i, n) {
- ZoomStats.prototype.reset = function (e) {
- this.actionSequenceInProgress = !1, this.actionSequence.length = 0;
- };
- ZoomStats.prototype.addZoomAction = function () {
- var e = null,
- t = null,
- i = !1,
- n = function n() {
- if (e = null, this.actionSequence.length > 0) {
- this.actionSequence[0].start;
- this.actionSequence[this.actionSequence.length - 1].end;
- }
- this.reset();
- };
- return function (r, o, a) {
- if (r !== o) {
- i || (n = n.bind(this), i = !0), e && (window.clearTimeout(e), e = null), a === t && this.actionSequenceInProgress || (this.reset(), t = a), this.actionSequenceInProgress = !0;
- var s = {
- start: r,
- end: o
- };
- this.actionSequence.push(s), e = window.setTimeout(n, 150);
- }
- };
- }();
- var Joystick = {
- UP: 1,
- DOWN: -1,
- LEFT: 'L',
- RIGHT: 'R',
- FORWARD: 'F',
- BACK: 'B',
- reverse: {},
- opposite: function opposite(e) {
- return this.reverse[e.toString()];
- }
- };
- !function () {
- 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;
- }();
- var History$1 = /*#__PURE__*/function () {
- function History() {
- _classCallCheck(this, History);
- this.events = [];
- this.valid = !1;
- }
- _createClass(History, [{
- key: "push",
- value: function push(e, t) {
- this.events.push({
- direction: e,
- pano: t
- });
- this.valid = !0;
- }
- }, {
- key: "pop",
- value: function pop(e) {
- var t = this.events.pop();
- return this.events.length < 1 && (this.valid = !1), t;
- }
- }, {
- key: "peek",
- value: function peek() {
- return this.events.length ? this.events[this.events.length - 1] : {
- direction: null,
- pano: null
- };
- }
- }, {
- key: "invalidate",
- value: function invalidate() {
- this.events = [];
- this.valid = !1;
- }
- }, {
- key: "reversePano",
- value: function reversePano(e) {
- if (!this.valid) return null;
- var t = this.peek();
- return Joystick.opposite(e) === t.direction ? (this.pop(), t.pano) : null;
- }
- }]);
- return History;
- }();
- var Viewmode$1 = {
- PANORAMA: 'panorama',
- DOLLHOUSE: 'dollhouse',
- FLOORPLAN: 'floorplan',
- TRANSITIONING: 'transitioning'
- };
- Viewmode$1.toInt = function (mode) {
- switch (mode) {
- case this.PANORAMA:
- return 1;
- case this.DOLLHOUSE:
- return 2;
- case this.FLOORPLAN:
- return 3;
- case this.TRANSITIONING:
- return -1;
- }
- throw new Error('未知模式: ' + c);
- };
- Viewmode$1.fromInt = function (mode) {
- switch (mode) {
- case '1':
- case 1:
- return this.PANORAMA;
- case '2':
- case 2:
- return this.DOLLHOUSE;
- case '3':
- case 3:
- return this.FLOORPLAN;
- }
- throw new Error('未知模式: ' + c);
- };
- var ModelUrls = /*#__PURE__*/function () {
- function ModelUrls(projectNum, app) {
- _classCallCheck(this, ModelUrls);
- this.version = 1;
- this.cache = null;
- this.expires = 0;
- this.projectNum = projectNum;
- this.app = app;
- }
- _createClass(ModelUrls, [{
- key: "validate",
- value: function validate(e) {
- return 'catalog.json' in e && Object.keys(e).length > 0;
- }
- }, {
- key: "update",
- value: function update(e) {
- this.cache = e;
- this.expires = Date.now() + constants.signedUrlDefaultExpireTime;
- return Deferred$1.when();
- }
- }, {
- key: "get",
- value: function get(e) {
- return this.app.resource.getViewImagesURL(e);
- }
- }]);
- return ModelUrls;
- }();
- var IndexedCollection = /*#__PURE__*/function () {
- function IndexedCollection() {
- _classCallCheck(this, IndexedCollection);
- this.list = [];
- this.index = {};
- Object.defineProperty(this, 'length', {
- get: function get() {
- return this.list.length;
- }
- });
- if (typeof this.getIndex != 'function') {
- throw new Error('IndexedCollection.getIndex not implemented in subclass.');
- }
- }
- _createClass(IndexedCollection, [{
- key: "forEach",
- value: function forEach(e) {
- this.list.forEach(e);
- }
- }, {
- key: "add",
- value: function add(pano) {
- this.list.push(pano);
- this.index[this.getIndex(pano)] = pano;
- }
- }, {
- key: "extend",
- value: function extend(e) {
- for (var t = 0; t < e.length; t++) {
- this.add(e[t]);
- }
- }
- }, {
- key: "get",
- value: function get(panoId) {
- return this.index[panoId];
- }
- }, {
- key: "first",
- value: function first() {
- return this.list[0];
- }
- }, {
- key: "last",
- value: function last() {
- return this.list[this.list.length - 1];
- }
- }, {
- key: "reIndex",
- value: function reIndex() {
- this.index = {};
- var e = this;
- this.forEach(function (t) {
- e.index[e.getIndex(t)] = t;
- });
- }
- }, {
- key: "filter",
- value: function filter(e) {
- var t = this.list.filter(e);
- return this.reIndex(), t;
- }
- }, {
- key: "reduce",
- value: function reduce(e, t) {
- return this.list.reduce(e, t);
- }
- }, {
- key: "sort",
- value: function sort(e) {
- return this.list.sort(e);
- }
- }, {
- key: "indexOf",
- value: function indexOf(e) {
- for (var t = 0; t < this.list.length; ++t) {
- if (this.list[t] === e) return t;
- }
- return -1;
- }
- }, {
- key: "clone",
- value: function clone() {
- //xzw add
- var newobj = new this.constructor();
- newobj.extend(this.list);
- return newobj;
- }
- }]);
- return IndexedCollection;
- }();
- var ChunkedCollider = /*#__PURE__*/function () {
- function ChunkedCollider(chunksize) {
- _classCallCheck(this, ChunkedCollider);
- this.chunksize = chunksize || 10;
- this.chunks = {};
- this.boundingBoxes = {};
- this.children = [];
- this.offset = new THREE.Vector3(0, 0.5, 0);
- this.material = new THREE.MeshBasicMaterial({
- color: 16777215 * Math.random(),
- side: THREE.DoubleSide
- });
- }
- _createClass(ChunkedCollider, [{
- key: "add",
- value: function add(geometry) {
- var vertices,
- index,
- o,
- a,
- s,
- l,
- c,
- h,
- u,
- d,
- p,
- f,
- g,
- attributes = geometry.attributes;
- if (attributes) {
- vertices = attributes.position.array;
- index = void 0 !== geometry.index ? geometry.index.array : void 0;
- } else {
- vertices = geometry.vertices;
- }
- var v = new THREE.Vector3();
- if (index) {
- for (o = 0, a = index.length; o < a; o += 3) {
- var triangleIndex1 = 3 * index[o],
- triangleIndex2 = 3 * index[o + 1],
- triangleIndex3 = 3 * index[o + 2];
- s = (vertices[triangleIndex1] + vertices[triangleIndex2] + vertices[triangleIndex3]) / 3;
- l = (vertices[triangleIndex1 + 1] + vertices[triangleIndex2 + 1] + vertices[triangleIndex3 + 1]) / 3;
- c = (vertices[triangleIndex1 + 2] + vertices[triangleIndex2 + 2] + vertices[triangleIndex3 + 2]) / 3;
- h = Math.floor(s / this.chunksize);
- u = Math.floor(l / this.chunksize);
- d = Math.floor(c / this.chunksize);
- p = h + '.' + u + '.' + d;
- if (p in this.chunks) {
- g = this.chunks[p];
- f = this.boundingBoxes[p];
- } else {
- g = this.chunks[p] = [];
- f = this.boundingBoxes[p] = new THREE.Box3();
- }
- 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]);
- f.expandByPoint(v.set(vertices[triangleIndex1], vertices[triangleIndex1 + 1], vertices[triangleIndex1 + 2]));
- f.expandByPoint(v.set(vertices[triangleIndex2], vertices[triangleIndex2 + 1], vertices[triangleIndex2 + 2]));
- f.expandByPoint(v.set(vertices[triangleIndex3], vertices[triangleIndex3 + 1], vertices[triangleIndex3 + 2]));
- }
- } else {
- for (o = 0, a = vertices.length; o < a; o += 9) {
- 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;
- if (p in this.chunks) {
- g = this.chunks[p];
- f = this.boundingBoxes[p];
- } else {
- g = this.chunks[p] = [];
- f = this.boundingBoxes[p] = new THREE.Box3();
- }
- 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]);
- f.expandByPoint(v.set(vertices[o], vertices[o + 1], vertices[o + 2]));
- f.expandByPoint(v.set(vertices[o + 3], vertices[o + 4], vertices[o + 5]));
- f.expandByPoint(v.set(vertices[o + 6], vertices[o + 7], vertices[o + 8]));
- }
- }
- }
- }, {
- key: "build",
- value: function build() {
- var object3D = new THREE.Object3D();
- object3D.material = this.material;
- object3D.name = 'colliderGroup';
- for (var t in this.chunks) {
- var chunk = this.chunks[t],
- bufferGeometry = new THREE.BufferGeometry();
- bufferGeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk), 3));
- bufferGeometry.boundingBox = this.boundingBoxes[t];
- var mesh = new THREE.Mesh(bufferGeometry, this.material);
- mesh.material.visible = !1;
- mesh.name = 'collider';
- object3D.add(mesh);
- this.chunks[t] = [];
- }
- return object3D;
- }
- }]);
- return ChunkedCollider;
- }();
- 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); }; }
- 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; } }
- var Floor$1 = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Floor, _THREE$Object3D);
- var _super = _createSuper$1O(Floor);
- function Floor(model, floorIndex, name) {
- var _this;
- _classCallCheck(this, Floor);
- _this = _super.call(this);
- _this.model = model;
- _this.floorIndex = floorIndex;
- _this.name = name || '楼层' + (floorIndex + 1);
- _this.panos = [];
- _this.chunksDam = [];
- _this.tiles = [];
- _this.colliderBuilder = new ChunkedCollider(3);
- _this.collider = null;
- _this.center = null;
- _this.boundingBox = new THREE.Box3();
- _this.size = null;
- _this.hidden = !1;
- _this.display = true;
- _this.conservativeBoundingBox = new THREE.Box3();
- _this.debugColor = 16777215 * Math.random();
- _this.transition = null;
- _this.entryArrow = [];
- _this.views = [];
- return _this;
- }
- _createClass(Floor, [{
- key: "chunks",
- get: function get() {
- if (this.chunksDam.length) {
- // Dam
- return this.chunksDam;
- } else {
- // 3dTiles
- var chunks = [];
- this.tiles.forEach(function (tile) {
- tile.traverse(function (obj) {
- if (obj.isChunk) {
- chunks.push(obj);
- }
- });
- });
- return chunks;
- }
- }
- /**
- * 设置为当前楼层
- */
- }, {
- key: "enter",
- value: function enter(mode) {
- // setFloor会设置楼层显隐
- this.model.setFloor(this, mode);
- }
- /**
- * 显示该楼层
- */
- }, {
- key: "show",
- value: function show() {
- var _this2 = this;
- var player = this.model.$app.core.get('Player');
- this.hidden = !1; //transparent恒为true才能设置遮挡
- /* this.chunks.forEach(chunk => {
- chunk.material.transparent = !1
- }) */
- // 显示该楼层的球幕marker(locked时、飞入时、编辑cad时不显示),
- var canShowVideoMarker = this.model.$app.core.get('PanoVideoRenderer').canShowMarker();
- player.modeTran.split('-')[1] == 'panorama' || player.locked || canShowVideoMarker && this.panos.forEach(function (pano) {
- return pano.hasVideo && pano.hasNeighbor() && (pano.marker.material.opacity = 1);
- }); // 显示楼层label和overlay等
- setTimeout(function () {
- // setTimeout用于防止flyToNewModel前执行show
- player.mode == 'floorplan' && _this2.model.floorplanCadImg.showCadPlane(); // 显示cad
- _this2.setMaterial();
- player.labelManager && player.labelManager.show(_this2.floorIndex);
- player.OverlayManager && player.OverlayManager.show(_this2.floorIndex, true);
- player.GLTFEditor && player.GLTFEditor.show(_this2.floorIndex, true);
- _this2.model.$app.Camera.monitor.control.showAll(_this2.floorIndex);
- }, 1); // console.error('显示楼层:' + this.floorIndex)
- }
- /**
- * 隐藏该楼层
- */
- }, {
- key: "hide",
- value: function hide() {
- var _this3 = this;
- this.hidden = !0;
- /* this.chunks.forEach(chunk => {
- chunk.material.transparent = !0
- }) */
- this.setMaterial(); // 隐藏该楼层的球幕marker
- this.panos.forEach(function (pano) {
- return pano.hasVideo && (pano.marker.material.opacity = 0);
- }); // 隐藏楼层label和overlay等
- var player = this.model.$app.core.get('Player');
- setTimeout(function () {
- player.labelManager && player.labelManager.hide(_this3.floorIndex);
- player.OverlayManager && player.OverlayManager.hide(_this3.floorIndex);
- player.GLTFEditor && player.GLTFEditor.hide(_this3.floorIndex);
- _this3.model.$app.Camera.monitor.control.hideAll(_this3.floorIndex);
- }, 1); // console.error('隐藏楼层:' + this.floorIndex)
- }
- /**
- * 切换该楼层显隐
- */
- }, {
- key: "toggle",
- value: function toggle(ifShow) {
- //switch状态
- if (ifShow === void 0) ifShow = this.hidden;
- ifShow ? this.show() : this.hide();
- }
- /**
- * chunks(Dam)
- */
- }, {
- key: "addChunk",
- value: function addChunk(chunk) {
- //chunk.renderOrder = RenderOrder.ghostFloor
- this.add(chunk);
- this.chunksDam.push(chunk);
- this.boundingBox.union(chunk.geometry.boundingBox);
- var size = new THREE.Vector3();
- this.boundingBox.getSize(size);
- this.size = size;
- this.colliderBuilder.add(chunk.geometry);
- chunk.floor = this;
- }
- /**
- * tiles
- */
- }, {
- key: "addTile",
- value: function addTile(tileContent) {
- var _this4 = this;
- tileContent.floorIndex = this.floorIndex;
- this.tiles.push(tileContent);
- this.add(tileContent);
- tileContent.modified = '';
- tileContent.traverse(function (obj) {
- if (obj.isChunk) {
- obj.setMode(_this4.model.mode, _this4.model.$app.core.get('Player').modeTran); //obj.renderOrder = RenderOrder.ghostFloor
- _this4.setMaterial(obj); // floor显隐判断
- // floor显隐判断
- /* if(this.hidden){
- obj.material.uniforms.opacity.value = settings.floorMat['stardard-hide'].opacity
- obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-hide'].mixRatio )
- obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-hide'].brightness )
- }else{
- obj.material.uniforms.opacity.value = settings.floorMat['stardard-show'].opacity
- obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-show'].mixRatio )
- obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-show'].brightness )
- } */
- //obj.material.transparent = this.hidden
- // todo 关于3dtiles的boundingBox和collider
- _this4.boundingBox.union(obj.geometry.boundingBox);
- var size = new THREE.Vector3();
- _this4.boundingBox.getSize(size);
- _this4.size = size;
- _this4.colliderBuilder && _this4.colliderBuilder.add(obj.geometry);
- }
- });
- }
- }, {
- key: "removeTile",
- value: function removeTile(tileContent) {
- this.tiles = this.tiles.filter(function (tile) {
- return tile !== tileContent;
- });
- tileContent.traverse(function (obj) {
- if (obj.isChunk) {
- obj.geometry.dispose();
- obj.material.dispose();
- obj.material.uniforms.map.value && obj.material.uniforms.map.value.dispose();
- }
- });
- this.remove(tileContent);
- tileContent.modified = 'remove';
- }
- /**
- * panos
- */
- }, {
- key: "addPano",
- value: function addPano(pano) {
- this.panos.push(pano); //this.add(pano.skyboxMesh)
- pano.marker && this.add(pano.marker);
- var t = new THREE.Vector3(1, 1, 1),
- i = new THREE.Box3().setFromCenterAndSize(pano.position, t);
- this.boundingBox.union(i);
- }
- }, {
- key: "removePano",
- value: function removePano(pano) {
- var index = this.panos.indexOf(pano);
- index > -1 && this.panos.splice(index, 1);
- }
- /**
- * 场景关联
- */
- }, {
- key: "addView",
- value: function addView(view) {
- this.views.push(view);
- }
- }, {
- key: "removeView",
- value: function removeView(view) {
- var index = this.views.indexOf(view);
- index > -1 && this.views.splice(index, 1);
- }
- /**
- * 初始化
- */
- }, {
- key: "build",
- value: function build() {
- this.collider = this.colliderBuilder.build(!0);
- this.collider.floor = this; //this.add(this.collider)
- var center = new THREE.Vector3();
- this.boundingBox.getCenter(center);
- this.center = center;
- this.conservativeBoundingBox.copy(this.boundingBox);
- this.conservativeBoundingBox.min.y = common$1.lowerMedian(this.collider.children.map(function (mesh) {
- return mesh.geometry.boundingBox.min.y;
- }), 5);
- this.conservativeBoundingBox.max.y = common$1.lowerMedian(this.collider.children.map(function (mesh) {
- return mesh.geometry.boundingBox.max.y;
- }), 5);
- this.colliderBuilder = null;
- }
- }, {
- key: "toShortString",
- value: function toShortString() {
- return common$1.nth(this.floorIndex + 1);
- }
- }, {
- key: "toString",
- value: function toString() {
- return this.name;
- }
- }, {
- key: "setMaterial",
- value: function setMaterial(mesh) {
- var matPropName, meshes;
- if (mesh) {
- matPropName = this.matPropName, meshes = [mesh];
- } else {
- this.model.$app.core.get('Player').modeTran;
- /* let hasCadPlane =
- modeTran.split('-')[1] == 'floorplan' && this.model.currentFloor.shouldShowPlane && !this.model.currentFloor.imgLoadFailed && this.model.$app.store.getValue('metadata').floorPlanUser //需要展示cad(默认floorplan没有all的可能)
- */
- var hasCadPlane = false; //cad的也不变暗
- matPropName = this.matPropName = hasCadPlane ? this.hidden ? 'hasPlane-normal' : 'hasPlane-curFloor' : this.hidden ? 'stardard-hide' : 'stardard-show';
- meshes = this.chunks; //console.log(matPropName, hasCadPlane)
- }
- var matProps = settings$3.floorMat[matPropName];
- meshes.forEach(function (chunk) {
- for (var name in matProps) {
- if (name == 'renderOrder') {
- chunk.renderOrder = matProps[name];
- } else if (name == 'depthTest' || name == 'depthWrite' || name == 'transparent') {
- //不知道为什么当前楼层不能完全遮住其他楼层,即使更改了depthTest等
- chunk.materialOutside[name] = matProps[name];
- } else {
- chunk.materialOutside.extraValues[name] = chunk.materialOutside.uniforms[name].value = matProps[name];
- }
- }
- });
- }
- }]);
- return Floor;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- var FloorCollection = /*#__PURE__*/function (_IndexedCollection) {
- _inherits(FloorCollection, _IndexedCollection);
- var _super = _createSuper$1N(FloorCollection);
- function FloorCollection(model) {
- var _this;
- _classCallCheck(this, FloorCollection);
- _this = _super.call(this);
- _this.model = model;
- _this.exploded = !1;
- return _this;
- }
- _createClass(FloorCollection, [{
- key: "add",
- value: function add(floor) {
- _get(_getPrototypeOf(FloorCollection.prototype), "add", this).call(this, floor);
- this.model.add(floor);
- }
- }, {
- key: "getIndex",
- value: function getIndex(floor) {
- return floor.floorIndex;
- }
- }, {
- key: "build",
- value: function build() {
- this.list.forEach(function (floor) {
- floor.build();
- });
- }
- }, {
- key: "nextFloor",
- value: function nextFloor(e, t) {
- return this.index[e.floorIndex + t] || null;
- }
- }, {
- key: "getOrMakeFloor",
- value: function getOrMakeFloor(floorIndex) {
- var floor = this.index[floorIndex];
- if (!floor) {
- floor = new Floor$1(this.model, floorIndex);
- this.add(floor);
- }
- return floor;
- }
- }, {
- key: "hide",
- value: function hide() {
- this.list.forEach(function (floor) {
- floor.hide();
- });
- }
- }, {
- key: "show",
- value: function show() {
- this.list.forEach(function (floor) {
- floor.show();
- });
- }
- }, {
- key: "getFloorAtPoint",
- value: function getFloorAtPoint(e) {
- for (var t = null, i = 1 / 0, n = 0; n < this.list.length; n++) {
- var r = this.list[n],
- o = r.distanceToPoint(e);
- (!t || i > o) && (i = o, t = r);
- }
- return t;
- }
- }]);
- return FloorCollection;
- }(IndexedCollection);
- var lerp = {
- vector: function vector(e, t, f) {
- //xzw change, add f
- var i = e.clone();
- return t = t.clone(), function (n) {
- e.set(i.x * (1 - n) + t.x * n, i.y * (1 - n) + t.y * n, i.z * (1 - n) + t.z * n);
- f && f(e, n);
- };
- },
- quaternion: function quaternion(e, t, f) {
- //xzw change, add f
- var i = e.clone();
- return function (n) {
- e.copy(i).slerp(t, n);
- f && f(e, n);
- };
- },
- color: function color(e, t, f) {
- var i = e.clone();
- return function (n) {
- e.copy(i).lerp(t, n);
- f && f(e, n);
- };
- },
- property(e, t, i, n) {
- var r = e[t];
- return function (o) {
- e[t] = r * (1 - o) + i * o, n && n(e[t]);
- };
- },
- uniform(e, t, i) {
- var n = e.material.uniforms[t].value;
- return function (r) {
- e.material.uniforms[t] && (e.material.uniforms[t].value = n * (1 - r) + i * r);
- };
- },
- matrix4(e, t) {
- var i = e.clone();
- return function (n) {
- for (var r = e.elements, o = i.elements, a = t.elements, s = 0; s < 16; s++) {
- r[s] = o[s] * (1 - n) + a[s] * n;
- }
- };
- },
- allUniforms(e, t, i) {
- var n = e.map(function (e) {
- return this.uniform(e, t, i);
- }.bind(this));
- return function (e) {
- n.forEach(function (t) {
- t(e);
- });
- };
- }
- };
- var PanoRendererEvents = {
- PanoRenderComplete: 'panorama.render.complete',
- TileRenderFailure: 'panorama.tile.render.failed',
- TileRenderSuccess: 'panorama.tile.render.success',
- TileUploadAttempted: 'panorama.tile.upload.attempted',
- UploadAttemptedForAllTiles: 'panorama.upload.attempted.all.tiles',
- ZoomLevelRenderStarted: 'panorama.zoom.render.started'
- };
- var PanoramaEvents = {
- LoadComplete: 'panorama.load.complete',
- LoadFailed: 'panorama.load.failed',
- TileLoaded: 'panorama.tile.loaded'
- };
- var PanoSizeClass = {
- BASE: 1,
- STANDARD: 2,
- HIGH: 3,
- ULTRAHIGH: 4
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:49:49
- * @Description: 注释
- */
- var basicTextured = {
- uniforms: {
- tDiffuse: {
- type: 't',
- value: null
- },
- alpha: {
- type: 'f',
- value: 1
- }
- },
- 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 }",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:50:38
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:51:20
- * @Description: 注释
- */
- var copyCubeMap = {
- uniforms: {
- tDiffuse: {
- type: 't',
- value: null
- },
- alpha: {
- type: 'f',
- value: 1
- }
- },
- 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}',
- 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}'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:52:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:53:00
- * @Description: 注释
- */
- var cube = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 1
- }
- },
- vertexShader: 'varying vec3 vWorldPosition;\n\nvoid main() {\n vWorldPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:02:08
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:02:27
- * @Description: 注释
- */
- var customDepth = {
- uniforms: {
- panoPosition: {
- type: 'v3',
- value: new THREE.Vector3()
- }
- },
- 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',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:52:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-12 15:35:23
- * @Description: 注释
- */
- var modelPaint = {
- fragmentShader: {
- 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 ",
- Buffer: "\n \n varying vec2 vUv;\n \n void main()\n {\n vec2 uv = vUv;\n gl_FragColor = modelPaint(uv, 0);\n }\n "
- }
- };
- /*
- 裁剪
- */
- var clipBox = {
- fragmentShader: {
- 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 ",
- 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 "
- }
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:52:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-12 15:35:23
- * @Description: 注释
- */
- var model$1 = {
- //非fish
- uniforms: {
- //许钟文加 和编辑墙有关
- minOpa: {
- //最小透明度系数
- type: 'f',
- value: 0.14
- },
- minDistance: {
- //最小距离控制
- type: 'f',
- value: 2.5
- },
- maxDistance: {
- //最大距离控制
- type: 'f',
- value: 4
- },
- //---------------
- map: {
- // 模型贴图(即dollhouse贴图);当定义了BasePanoMap后,它就是全景贴图,但用的是普通映射
- type: 't',
- value: null
- },
- repeatInfoMap: {
- //重复比率图 sxz
- type: 't',
- value: null
- },
- modelAlpha: {
- type: 'f',
- value: settings$3.modelAlpha
- },
- baseColor: {
- //用来调试的颜色
- type: 'v3',
- value: new THREE.Color(1, 1, 1)
- },
- opacity: {
- type: 'f',
- value: 1
- },
- progress: {
- type: 'f',
- value: 0
- },
- blackout: {
- type: 'i',
- value: 0
- },
- // pano0Map和pano1Map的区分是为了过渡,pano0Map是上一个点位全景图,pano1Map是下一个。一般取pano1Map为当前点位。
- pano0Map: {
- type: 't',
- value: null
- },
- pano0Position: {
- type: 'v3',
- value: new THREE.Vector3()
- },
- pano0Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- },
- pano1Map: {
- type: 't',
- value: null
- },
- pano1Position: {
- type: 'v3',
- value: new THREE.Vector3()
- },
- pano1Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- },
- /**球幕视频 */
- videoReady: {
- type: '',
- value: 0
- },
- videoTexture: {
- type: 't',
- value: null
- },
- exposure: {
- type: 'f',
- value: 1
- },
- parameters: {
- type: 'm4',
- 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)
- },
- clipRect: {
- type: 'v4',
- value: new THREE.Vector4(0.1, 0.1, 0.5, 0.5)
- },
- blendFov: {
- type: 'f',
- value: 5
- },
- // 用于判断球幕视频是否横竖旋转
- bFlag: {
- type: 'i',
- value: 1
- },
- /**马赛克 */
- paint1Map: {
- type: 't',
- value: null
- },
- paint0Map: {
- type: 't',
- value: null
- },
- iShowBrush: {
- type: 'i',
- value: 0
- },
- iMouse: {
- type: 'v4',
- value: new THREE.Vector4()
- },
- iResolution: {
- type: 'v2',
- value: new THREE.Vector2()
- },
- iChannel0: {
- type: 't',
- value: null
- },
- iChannel1: {
- type: 't',
- value: null
- },
- iBrushType: {
- type: 'i',
- value: 1
- },
- iBrushSize: {
- type: 'f',
- value: null
- },
- // 相机的上下转角和左右转角
- iAngle: {
- type: 'f',
- value: null
- },
- iPitch: {
- type: 'f',
- value: null
- },
- /**滤镜 */
- // [-1.0, 1.0] 亮度 对比度 饱和度
- filterBase0: {
- type: 'v3',
- value: new THREE.Vector3(0, 0, 0) // brightness contrast saturation
- },
- // [-1.0, 1.0] 色温调节范围,[ 冷 -- 暖 ]
- filterTemperature0: {
- type: 'f',
- value: 0
- },
- filterBase1: {
- type: 'v3',
- value: new THREE.Vector3(0, 0, 0)
- },
- filterTemperature1: {
- type: 'f',
- value: 0
- },
- //裁剪
- clipBoxType: {
- type: 'a',
- value: null
- },
- clipBoxPoints: {
- type: 'a',
- value: null
- }
- },
- //全景贴图的shader不同-许钟文-----------------
- /* fragmentShader: prefixFragment + (config.scene_version == 1 ? "\n#define Not_Cube\n":"") +
- "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);}"
- */
- 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 ",
- 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 ",
- fragmentBufferShader: modelPaint.fragmentShader.Common + modelPaint.fragmentShader.Buffer
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:01:31
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-12 15:35:42
- * @Description: 注释
- */
- var modelDebug = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- modelAlpha: {
- type: 'f',
- value: settings$3.modelAlpha
- },
- depthmapRatio: {
- type: 'f',
- value: 0
- },
- opacity: {
- type: 'f',
- value: 1
- },
- progress: {
- type: 'f',
- value: 0
- },
- considerOcclusion: {
- type: 'i',
- value: settings$3.fancierTransition
- },
- highlightPanoSelection: {
- type: 'i',
- value: 0
- },
- useThirdPano: {
- type: 'i',
- value: settings$3.useThirdPano
- },
- pano0Map: {
- type: 't',
- value: null
- },
- pano0Depth: {
- type: 't',
- value: null
- },
- pano0Position: {
- type: 'v3',
- value: new THREE.Vector3()
- },
- pano0Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- },
- pano0Weight: {
- type: 'f',
- value: settings$3.transition.pano0Weight
- },
- pano1Map: {
- type: 't',
- value: null
- },
- pano1Depth: {
- type: 't',
- value: null
- },
- pano1Position: {
- type: 'v3',
- value: new THREE.Vector3()
- },
- pano1Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- },
- pano1Weight: {
- type: 'f',
- value: settings$3.transition.pano1Weight
- },
- pano2Map: {
- type: 't',
- value: null
- },
- pano2Depth: {
- type: 't',
- value: null
- },
- pano2Position: {
- type: 'v3',
- value: new THREE.Vector3()
- },
- pano2Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- },
- pano2Weight: {
- type: 'f',
- value: settings$3.transition.pano2Weight
- }
- },
- 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',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:52:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:59:37
- * @Description: 注释
- */
- var modelOutside = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 1
- },
- brightness: {
- type: 'f',
- value: 0.23
- },
- mixRatio: {
- type: 'f',
- value: 0.3
- },
- //裁剪
- clipBoxType: {
- type: 'a',
- value: null
- },
- clipBoxPoints: {
- type: 'a',
- value: null
- }
- },
- // vertexShader: 'varying vec2 vUv;\n\nvoid main() {\n\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
- 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 }",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:59:59
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-12 15:36:01
- * @Description: 注释
- */
- var ribbon = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 1
- },
- color: {
- type: 'c',
- value: new THREE.Color(settings$3.path.color)
- }
- },
- 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',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:02:38
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:03:01
- * @Description: 注释
- */
- var skysphere = {
- uniforms: {
- radius: {
- type: 'f',
- value: 0
- }
- },
- 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',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:03:13
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:03:51
- * @Description: 注释
- */
- var tagDisc = {
- uniforms: {
- opacity: {
- type: 'f',
- value: 0
- },
- color: {
- type: 'c',
- value: new THREE.Color()
- },
- bg: {
- type: 't',
- value: null
- },
- mask: {
- type: 't',
- value: null
- }
- },
- vertexShader: 'varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}',
- 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'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:03:13
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:03:51
- * @Description: 注释
- */
- var tagDiscDefault = {
- uniforms: {
- uTime: {
- value: 0
- },
- opacity: {
- value: 1
- },
- dark: {
- type: 'i',
- value: 0
- },
- openning: {
- type: 'f',
- value: 0
- },
- uColor: {
- value: new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216)
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:03:13
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:03:51
- * @Description: 注释
- */
- var tagDiscCustom = {
- uniforms: {
- opacity: {
- type: 'f',
- value: 1
- },
- dark: {
- //hover时会颜色会变深
- type: 'i',
- value: 0
- },
- map: {
- type: 't',
- value: null
- },
- uTime: {
- value: 0
- },
- openning: {
- type: 'f',
- value: 0
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:03:13
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 16:03:51
- * @Description: 注释 videoPano Tag的shader 视频播放按钮
- */
- var tagVideoMarker = {
- // uniforms: {
- // opacity: {
- // type: 'f',
- // value: 1,
- // },
- // dark: {
- // //hover时会颜色会变深
- // type: 'i',
- // value: 0,
- // },
- // map: {
- // type: 't',
- // value: null,
- // },
- // uTime: {
- // value: 0,
- // },
- // openning: {
- // type: 'f',
- // value: 0,
- // },
- // },
- uniforms: {
- progress: {
- type: 'f',
- value: 0
- },
- bigCircleProgress: {
- type: 'f',
- value: 0
- },
- smallCircleProgress: {
- type: 'f',
- value: 0
- },
- map: {
- type: 't',
- value: null
- },
- map0: {
- type: 't',
- value: null
- },
- map1: {
- type: 't',
- value: null
- },
- map2: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 0
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 16:00:54
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-12 15:36:15
- * @Description: 注释
- */
- var waypoint = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 1
- },
- pulse: {
- type: 'f',
- value: 1
- },
- nearFade: {
- type: 'v2',
- value: new THREE.Vector2(2 * settings$3.insideNear, 2 * settings$3.path.waypointIndoorRadius)
- },
- color: {
- type: 'c',
- value: new THREE.Color('#fff')
- }
- },
- 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',
- 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'
- };
- //球上的鱼眼(无过渡):
- var skybox = {
- uniforms: {
- opacity: {
- type: 'f',
- value: 1
- },
- pano1Map: {
- type: 't',
- value: null
- },
- pano1Matrix: {
- type: 'm4',
- value: new THREE.Matrix4()
- }
- },
- vertexShader: 'uniform mat4 pano1Matrix;varying vec3 vWorldPosition;void main(){vWorldPosition=(vec4(position,1.0)*pano1Matrix).xyz;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}',
- 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);}'
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: zhou enguang
- * @LastEditTime: 2022-01-12 16:49:49
- * @Description: 注释
- */
- var videoLoading = {
- uniforms: {
- uColor: {
- type: 'vec4',
- value: null
- },
- uTime: {
- type: 'f',
- value: 0
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: zhou enguang
- * @LastEditTime: 2022-01-12 16:49:49
- * @Description: 注释
- */
- var videoMakerWidget = {
- uniforms: {
- opacity: {
- type: 'f',
- value: 1
- },
- dark: {
- //hover时会颜色会变深
- type: 'i',
- value: 0
- },
- map: {
- type: 't',
- value: null
- },
- position: {
- value: new THREE.Vector3(0, 0, 0)
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: zhou enguang
- * @LastEditTime: 2022-01-12 16:49:49
- * @Description: 注释 videoPano marker 的shader
- */
- var videoPanoMarker = {
- uniforms: {
- progress: {
- type: 'f',
- value: 0
- },
- bigCircleProgress: {
- type: 'f',
- value: 0
- },
- smallCircleProgress: {
- type: 'f',
- value: 0
- },
- map: {
- type: 't',
- value: null
- },
- /* map0: {
- type: 't',
- value: null,
- },
- map1: {
- type: 't',
- value: null
- },
- map2: {
- type: 't',
- value: null
- }, */
- opacity: {
- type: 'f',
- value: 0
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: xst
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: xst
- * @LastEditTime: 2022-01-12 16:49:49
- * @Description: 注释
- */
- var videoStemLine = {
- uniforms: {
- progress: {
- type: 'f',
- value: 0
- },
- bigCircleProgress: {
- type: 'f',
- value: 0
- },
- smallCircleProgress: {
- type: 'f',
- value: 0
- },
- map: {
- type: 't',
- value: null
- },
- map0: {
- type: 't',
- value: null
- },
- map1: {
- type: 't',
- value: null
- },
- map2: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 0
- }
- },
- 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 ",
- 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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:49:49
- * @Description: 注释
- */
- var linkSpot = {
- //balloon
- uniforms: {
- /* isActive: {
- type: 'i',
- value: 0,
- }, */
- activeProgress: {
- type: 'f',
- value: 0
- },
- mapIn: {
- type: 't',
- value: null
- },
- mapOut: {
- type: 't',
- value: null
- },
- mapOut2: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 0
- },
- changeMap: {
- type: 'i',
- value: 0
- }
- },
- 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",
- 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 "
- /* fragmentShader: `
- varying vec2 vUv;
- uniform sampler2D mapOut;
- uniform sampler2D mapOut2;
- uniform sampler2D mapIn;
- uniform float opacity;
- uniform int isActive;
- uniform int changeMap; //是否有mapIn贴图,有的话就是中间要换成mapIn
- void main(){
-
- vec4 mapColor = texture2D(mapOut,vUv);
- vec4 mapColor2 = texture2D(mapOut2,vUv);//用于分区的贴图
- vec4 sumColor = vec4(1.24,1.24,1.24,2.0);//用于中心部分反转黑白的颜色
- float x1=0.2333, x2=0.76669, y1=0.388, y2=0.9333;
- vec2 vUvInside = vec2((vUv.x-x1)/(x2-x1), (vUv.y-y1)/(y2-y1));
-
-
-
- //绿色的 r=0 白色r=1
- //where: 0是外层, 1是环, 2是中间层
- int where = mapColor2.a <= 0.0 ? 0 : (mapColor2.r <= 0.0 || mapColor2.a<1.0) ? 1 : 2; //2中包含1-2的过渡,待平滑
-
-
- vec4 green = vec4(0.0, 0.7843137, 0.6823529, mapColor.a);
- vec4 white = vec4(1.0, 1.0, 1.0, mapColor.a);
-
- if(isActive!=1){ //普通
- if(where == 1){
- gl_FragColor = vec4(1.0,1.0,1.0,mapColor.a);
- }else{
- if(changeMap == 1){
- if(where == 2){
- vec4 color = texture2D(mapIn,vUvInside);
- if(mapColor2.r==1.0){gl_FragColor = color;}
- else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
- }
- else gl_FragColor = mapColor;
- }else{
- if(where == 2){
- vec4 color = sumColor-mapColor;
- if(mapColor2.r==1.0){gl_FragColor = color;}
- else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
- }
- else gl_FragColor = mapColor;
- }
- }
-
- }else{//hover时
- if(changeMap == 1){
- if(where == 2){
- vec4 color = texture2D(mapIn,vUvInside);
- if(mapColor2.r==1.0){gl_FragColor = color;}
- else gl_FragColor = mix(green, color, mapColor2.r);//平滑内边缘
- }
- else if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green; //因为开启了抗锯齿,导致外边缘有点问题,所以自己绘制
- else gl_FragColor = mapColor;
- }else{
- if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green;
- else gl_FragColor = mapColor;
- }
- }
-
- gl_FragColor.a *= opacity;
-
-
- }
- `, */
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:48:57
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:49:49
- * @Description: 注释
- */
- var linkSpotInside = {
- //circle
- uniforms: {
- circleRadius: {
- //UV内半径的平方
- type: 'f',
- value: 0.785 //0.815,
- },
- progress: {
- type: 'f',
- value: 0
- },
- mapOut: {
- type: 't',
- value: null
- },
- mapIn: {
- type: 't',
- value: null
- },
- changeMap: {
- type: 'i',
- value: 0
- }
- },
- vertexShader:
- /* prefixVertex + */
- " \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",
- fragmentShader:
- /* prefixFragment + */
- "\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 "
- };
- var sphereRenderToCube = {
- uniforms: {
- tDiffuse: {
- type: 't',
- value: null
- }
- /* ,
- panoMatrix:{
- type:'m4',
- value:new THREE.Matrix4
- } */
- },
- vertexShader:
- /* prefixVertex + */
- " \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",
- fragmentShader:
- /* prefixFragment + */
- "\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 "
- };
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:44:55
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-08 16:01:48
- * @Description: 注释
- */
- function mergePrefixVertex(vertex) {
- 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;
- }
- function mergePrefixFragment(fragment) {
- return 'precision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n' + fragment;
- }
- function margePrefix(shader) {
- if (shader.vertexShader) {
- shader.vertexShader = mergePrefixVertex(shader.vertexShader);
- }
- if (shader.fragmentShader) {
- shader.fragmentShader = mergePrefixFragment(shader.fragmentShader);
- shader == model$1 && (shader.fragmentBufferShader = mergePrefixFragment(shader.fragmentBufferShader));
- }
- }
- margePrefix(cube);
- margePrefix(customDepth);
- margePrefix(model$1);
- margePrefix(modelDebug);
- margePrefix(modelOutside);
- margePrefix(ribbon);
- margePrefix(skysphere);
- margePrefix(tagDisc);
- margePrefix(tagDiscDefault);
- margePrefix(tagDiscCustom);
- margePrefix(tagVideoMarker);
- margePrefix(waypoint);
- margePrefix(skybox);
- margePrefix(videoLoading);
- margePrefix(videoMakerWidget);
- margePrefix(videoPanoMarker);
- margePrefix(videoStemLine);
- margePrefix(linkSpot);
- margePrefix(linkSpotInside);
- margePrefix(sphereRenderToCube);
- var shaders = {
- cube,
- customDepth,
- model: model$1,
- modelDebug,
- modelOutside,
- ribbon,
- skysphere,
- tagDisc,
- tagDiscDefault,
- tagDiscCustom,
- tagVideoMarker,
- waypoint,
- basicTextured,
- copyCubeMap,
- skybox,
- videoLoading,
- videoMakerWidget,
- videoPanoMarker,
- videoStemLine,
- linkSpot,
- linkSpotInside,
- sphereRenderToCube
- }; //
- var bind$1 = function bind(fn, thisArg) {
- return function wrap() {
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i];
- }
- return fn.apply(thisArg, args);
- };
- };
- /*global toString:true*/
- // utils is a library of generic helper functions non-specific to axios
- var toString = Object.prototype.toString;
- /**
- * Determine if a value is an Array
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is an Array, otherwise false
- */
- function isArray$3(val) {
- return toString.call(val) === '[object Array]';
- }
- /**
- * Determine if a value is undefined
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if the value is undefined, otherwise false
- */
- function isUndefined(val) {
- return typeof val === 'undefined';
- }
- /**
- * Determine if a value is a Buffer
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Buffer, otherwise false
- */
- function isBuffer$2(val) {
- return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
- }
- /**
- * Determine if a value is an ArrayBuffer
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is an ArrayBuffer, otherwise false
- */
- function isArrayBuffer(val) {
- return toString.call(val) === '[object ArrayBuffer]';
- }
- /**
- * Determine if a value is a FormData
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is an FormData, otherwise false
- */
- function isFormData(val) {
- return typeof FormData !== 'undefined' && val instanceof FormData;
- }
- /**
- * Determine if a value is a view on an ArrayBuffer
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
- */
- function isArrayBufferView(val) {
- var result;
- if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
- result = ArrayBuffer.isView(val);
- } else {
- result = val && val.buffer && val.buffer instanceof ArrayBuffer;
- }
- return result;
- }
- /**
- * Determine if a value is a String
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a String, otherwise false
- */
- function isString$2(val) {
- return typeof val === 'string';
- }
- /**
- * Determine if a value is a Number
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Number, otherwise false
- */
- function isNumber$1(val) {
- return typeof val === 'number';
- }
- /**
- * Determine if a value is an Object
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is an Object, otherwise false
- */
- function isObject$3(val) {
- return val !== null && typeof val === 'object';
- }
- /**
- * Determine if a value is a plain Object
- *
- * @param {Object} val The value to test
- * @return {boolean} True if value is a plain Object, otherwise false
- */
- function isPlainObject(val) {
- if (toString.call(val) !== '[object Object]') {
- return false;
- }
- var prototype = Object.getPrototypeOf(val);
- return prototype === null || prototype === Object.prototype;
- }
- /**
- * Determine if a value is a Date
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Date, otherwise false
- */
- function isDate$1(val) {
- return toString.call(val) === '[object Date]';
- }
- /**
- * Determine if a value is a File
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a File, otherwise false
- */
- function isFile(val) {
- return toString.call(val) === '[object File]';
- }
- /**
- * Determine if a value is a Blob
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Blob, otherwise false
- */
- function isBlob$1(val) {
- return toString.call(val) === '[object Blob]';
- }
- /**
- * Determine if a value is a Function
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Function, otherwise false
- */
- function isFunction$1(val) {
- return toString.call(val) === '[object Function]';
- }
- /**
- * Determine if a value is a Stream
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a Stream, otherwise false
- */
- function isStream(val) {
- return isObject$3(val) && isFunction$1(val.pipe);
- }
- /**
- * Determine if a value is a URLSearchParams object
- *
- * @param {Object} val The value to test
- * @returns {boolean} True if value is a URLSearchParams object, otherwise false
- */
- function isURLSearchParams(val) {
- return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
- }
- /**
- * Trim excess whitespace off the beginning and end of a string
- *
- * @param {String} str The String to trim
- * @returns {String} The String freed of excess whitespace
- */
- function trim(str) {
- return str.replace(/^\s*/, '').replace(/\s*$/, '');
- }
- /**
- * Determine if we're running in a standard browser environment
- *
- * This allows axios to run in a web worker, and react-native.
- * Both environments support XMLHttpRequest, but not fully standard globals.
- *
- * web workers:
- * typeof window -> undefined
- * typeof document -> undefined
- *
- * react-native:
- * navigator.product -> 'ReactNative'
- * nativescript
- * navigator.product -> 'NativeScript' or 'NS'
- */
- function isStandardBrowserEnv() {
- if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || navigator.product === 'NativeScript' || navigator.product === 'NS')) {
- return false;
- }
- return typeof window !== 'undefined' && typeof document !== 'undefined';
- }
- /**
- * Iterate over an Array or an Object invoking a function for each item.
- *
- * If `obj` is an Array callback will be called passing
- * the value, index, and complete array for each item.
- *
- * If 'obj' is an Object callback will be called passing
- * the value, key, and complete object for each property.
- *
- * @param {Object|Array} obj The object to iterate
- * @param {Function} fn The callback to invoke for each item
- */
- function forEach(obj, fn) {
- // Don't bother if no value provided
- if (obj === null || typeof obj === 'undefined') {
- return;
- } // Force an array if not already something iterable
- if (typeof obj !== 'object') {
- /*eslint no-param-reassign:0*/
- obj = [obj];
- }
- if (isArray$3(obj)) {
- // Iterate over array values
- for (var i = 0, l = obj.length; i < l; i++) {
- fn.call(null, obj[i], i, obj);
- }
- } else {
- // Iterate over object keys
- for (var key in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
- fn.call(null, obj[key], key, obj);
- }
- }
- }
- }
- /**
- * Accepts varargs expecting each argument to be an object, then
- * immutably merges the properties of each object and returns result.
- *
- * When multiple objects contain the same key the later object in
- * the arguments list will take precedence.
- *
- * Example:
- *
- * ```js
- * var result = merge({foo: 123}, {foo: 456});
- * console.log(result.foo); // outputs 456
- * ```
- *
- * @param {Object} obj1 Object to merge
- * @returns {Object} Result of all merge properties
- */
- function merge() {
- var result = {};
- function assignValue(val, key) {
- if (isPlainObject(result[key]) && isPlainObject(val)) {
- result[key] = merge(result[key], val);
- } else if (isPlainObject(val)) {
- result[key] = merge({}, val);
- } else if (isArray$3(val)) {
- result[key] = val.slice();
- } else {
- result[key] = val;
- }
- }
- for (var i = 0, l = arguments.length; i < l; i++) {
- forEach(arguments[i], assignValue);
- }
- return result;
- }
- /**
- * Extends object a by mutably adding to it the properties of object b.
- *
- * @param {Object} a The object to be extended
- * @param {Object} b The object to copy properties from
- * @param {Object} thisArg The object to bind function to
- * @return {Object} The resulting value of object a
- */
- function extend$1(a, b, thisArg) {
- forEach(b, function assignValue(val, key) {
- if (thisArg && typeof val === 'function') {
- a[key] = bind$1(val, thisArg);
- } else {
- a[key] = val;
- }
- });
- return a;
- }
- /**
- * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
- *
- * @param {string} content with BOM
- * @return {string} content value without BOM
- */
- function stripBOM(content) {
- if (content.charCodeAt(0) === 0xFEFF) {
- content = content.slice(1);
- }
- return content;
- }
- var utils = {
- isArray: isArray$3,
- isArrayBuffer: isArrayBuffer,
- isBuffer: isBuffer$2,
- isFormData: isFormData,
- isArrayBufferView: isArrayBufferView,
- isString: isString$2,
- isNumber: isNumber$1,
- isObject: isObject$3,
- isPlainObject: isPlainObject,
- isUndefined: isUndefined,
- isDate: isDate$1,
- isFile: isFile,
- isBlob: isBlob$1,
- isFunction: isFunction$1,
- isStream: isStream,
- isURLSearchParams: isURLSearchParams,
- isStandardBrowserEnv: isStandardBrowserEnv,
- forEach: forEach,
- merge: merge,
- extend: extend$1,
- trim: trim,
- stripBOM: stripBOM
- };
- function encode$5(val) {
- return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
- }
- /**
- * Build a URL by appending params to the end
- *
- * @param {string} url The base of the url (e.g., http://www.google.com)
- * @param {object} [params] The params to be appended
- * @returns {string} The formatted url
- */
- var buildURL = function buildURL(url, params, paramsSerializer) {
- /*eslint no-param-reassign:0*/
- if (!params) {
- return url;
- }
- var serializedParams;
- if (paramsSerializer) {
- serializedParams = paramsSerializer(params);
- } else if (utils.isURLSearchParams(params)) {
- serializedParams = params.toString();
- } else {
- var parts = [];
- utils.forEach(params, function serialize(val, key) {
- if (val === null || typeof val === 'undefined') {
- return;
- }
- if (utils.isArray(val)) {
- key = key + '[]';
- } else {
- val = [val];
- }
- utils.forEach(val, function parseValue(v) {
- if (utils.isDate(v)) {
- v = v.toISOString();
- } else if (utils.isObject(v)) {
- v = JSON.stringify(v);
- }
- parts.push(encode$5(key) + '=' + encode$5(v));
- });
- });
- serializedParams = parts.join('&');
- }
- if (serializedParams) {
- var hashmarkIndex = url.indexOf('#');
- if (hashmarkIndex !== -1) {
- url = url.slice(0, hashmarkIndex);
- }
- url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
- }
- return url;
- };
- function InterceptorManager() {
- this.handlers = [];
- }
- /**
- * Add a new interceptor to the stack
- *
- * @param {Function} fulfilled The function to handle `then` for a `Promise`
- * @param {Function} rejected The function to handle `reject` for a `Promise`
- *
- * @return {Number} An ID used to remove interceptor later
- */
- InterceptorManager.prototype.use = function use(fulfilled, rejected) {
- this.handlers.push({
- fulfilled: fulfilled,
- rejected: rejected
- });
- return this.handlers.length - 1;
- };
- /**
- * Remove an interceptor from the stack
- *
- * @param {Number} id The ID that was returned by `use`
- */
- InterceptorManager.prototype.eject = function eject(id) {
- if (this.handlers[id]) {
- this.handlers[id] = null;
- }
- };
- /**
- * Iterate over all the registered interceptors
- *
- * This method is particularly useful for skipping over any
- * interceptors that may have become `null` calling `eject`.
- *
- * @param {Function} fn The function to call for each interceptor
- */
- InterceptorManager.prototype.forEach = function forEach(fn) {
- utils.forEach(this.handlers, function forEachHandler(h) {
- if (h !== null) {
- fn(h);
- }
- });
- };
- var InterceptorManager_1 = InterceptorManager;
- /**
- * Transform the data for a request or a response
- *
- * @param {Object|String} data The data to be transformed
- * @param {Array} headers The headers for the request or response
- * @param {Array|Function} fns A single function or Array of functions
- * @returns {*} The resulting transformed data
- */
- var transformData = function transformData(data, headers, fns) {
- /*eslint no-param-reassign:0*/
- utils.forEach(fns, function transform(fn) {
- data = fn(data, headers);
- });
- return data;
- };
- var isCancel = function isCancel(value) {
- return !!(value && value.__CANCEL__);
- };
- var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) {
- utils.forEach(headers, function processHeader(value, name) {
- if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
- headers[normalizedName] = value;
- delete headers[name];
- }
- });
- };
- /**
- * Update an Error with the specified config, error code, and response.
- *
- * @param {Error} error The error to update.
- * @param {Object} config The config.
- * @param {string} [code] The error code (for example, 'ECONNABORTED').
- * @param {Object} [request] The request.
- * @param {Object} [response] The response.
- * @returns {Error} The error.
- */
- var enhanceError = function enhanceError(error, config, code, request, response) {
- error.config = config;
- if (code) {
- error.code = code;
- }
- error.request = request;
- error.response = response;
- error.isAxiosError = true;
- error.toJSON = function toJSON() {
- return {
- // Standard
- message: this.message,
- name: this.name,
- // Microsoft
- description: this.description,
- number: this.number,
- // Mozilla
- fileName: this.fileName,
- lineNumber: this.lineNumber,
- columnNumber: this.columnNumber,
- stack: this.stack,
- // Axios
- config: this.config,
- code: this.code
- };
- };
- return error;
- };
- /**
- * Create an Error with the specified message, config, error code, request and response.
- *
- * @param {string} message The error message.
- * @param {Object} config The config.
- * @param {string} [code] The error code (for example, 'ECONNABORTED').
- * @param {Object} [request] The request.
- * @param {Object} [response] The response.
- * @returns {Error} The created error.
- */
- var createError = function createError(message, config, code, request, response) {
- var error = new Error(message);
- return enhanceError(error, config, code, request, response);
- };
- /**
- * Resolve or reject a Promise based on response status.
- *
- * @param {Function} resolve A function that resolves the promise.
- * @param {Function} reject A function that rejects the promise.
- * @param {object} response The response.
- */
- var settle = function settle(resolve, reject, response) {
- var validateStatus = response.config.validateStatus;
- if (!response.status || !validateStatus || validateStatus(response.status)) {
- resolve(response);
- } else {
- reject(createError('Request failed with status code ' + response.status, response.config, null, response.request, response));
- }
- };
- var cookies = utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie
- function standardBrowserEnv() {
- return {
- write: function write(name, value, expires, path, domain, secure) {
- var cookie = [];
- cookie.push(name + '=' + encodeURIComponent(value));
- if (utils.isNumber(expires)) {
- cookie.push('expires=' + new Date(expires).toGMTString());
- }
- if (utils.isString(path)) {
- cookie.push('path=' + path);
- }
- if (utils.isString(domain)) {
- cookie.push('domain=' + domain);
- }
- if (secure === true) {
- cookie.push('secure');
- }
- document.cookie = cookie.join('; ');
- },
- read: function read(name) {
- var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
- return match ? decodeURIComponent(match[3]) : null;
- },
- remove: function remove(name) {
- this.write(name, '', Date.now() - 86400000);
- }
- };
- }() : // Non standard browser env (web workers, react-native) lack needed support.
- function nonStandardBrowserEnv() {
- return {
- write: function write() {},
- read: function read() {
- return null;
- },
- remove: function remove() {}
- };
- }();
- /**
- * Determines whether the specified URL is absolute
- *
- * @param {string} url The URL to test
- * @returns {boolean} True if the specified URL is absolute, otherwise false
- */
- var isAbsoluteURL = function isAbsoluteURL(url) {
- // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
- // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
- // by any combination of letters, digits, plus, period, or hyphen.
- return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
- };
- /**
- * Creates a new URL by combining the specified URLs
- *
- * @param {string} baseURL The base URL
- * @param {string} relativeURL The relative URL
- * @returns {string} The combined URL
- */
- var combineURLs = function combineURLs(baseURL, relativeURL) {
- return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL;
- };
- /**
- * Creates a new URL by combining the baseURL with the requestedURL,
- * only when the requestedURL is not already an absolute URL.
- * If the requestURL is absolute, this function returns the requestedURL untouched.
- *
- * @param {string} baseURL The base URL
- * @param {string} requestedURL Absolute or relative URL to combine
- * @returns {string} The combined full path
- */
- var buildFullPath = function buildFullPath(baseURL, requestedURL) {
- if (baseURL && !isAbsoluteURL(requestedURL)) {
- return combineURLs(baseURL, requestedURL);
- }
- return requestedURL;
- };
- // Headers whose duplicates are ignored by node
- // c.f. https://nodejs.org/api/http.html#http_message_headers
- 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'];
- /**
- * Parse headers into an object
- *
- * ```
- * Date: Wed, 27 Aug 2014 08:58:49 GMT
- * Content-Type: application/json
- * Connection: keep-alive
- * Transfer-Encoding: chunked
- * ```
- *
- * @param {String} headers Headers needing to be parsed
- * @returns {Object} Headers parsed into an object
- */
- var parseHeaders = function parseHeaders(headers) {
- var parsed = {};
- var key;
- var val;
- var i;
- if (!headers) {
- return parsed;
- }
- utils.forEach(headers.split('\n'), function parser(line) {
- i = line.indexOf(':');
- key = utils.trim(line.substr(0, i)).toLowerCase();
- val = utils.trim(line.substr(i + 1));
- if (key) {
- if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
- return;
- }
- if (key === 'set-cookie') {
- parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
- } else {
- parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
- }
- }
- });
- return parsed;
- };
- var isURLSameOrigin = utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test
- // whether the request URL is of the same origin as current location.
- function standardBrowserEnv() {
- var msie = /(msie|trident)/i.test(navigator.userAgent);
- var urlParsingNode = document.createElement('a');
- var originURL;
- /**
- * Parse a URL to discover it's components
- *
- * @param {String} url The URL to be parsed
- * @returns {Object}
- */
- function resolveURL(url) {
- var href = url;
- if (msie) {
- // IE needs attribute set twice to normalize properties
- urlParsingNode.setAttribute('href', href);
- href = urlParsingNode.href;
- }
- urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
- return {
- href: urlParsingNode.href,
- protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
- host: urlParsingNode.host,
- search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
- hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
- hostname: urlParsingNode.hostname,
- port: urlParsingNode.port,
- pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
- };
- }
- originURL = resolveURL(window.location.href);
- /**
- * Determine if a URL shares the same origin as the current location
- *
- * @param {String} requestURL The URL to test
- * @returns {boolean} True if URL shares the same origin, otherwise false
- */
- return function isURLSameOrigin(requestURL) {
- var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
- return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
- };
- }() : // Non standard browser envs (web workers, react-native) lack needed support.
- function nonStandardBrowserEnv() {
- return function isURLSameOrigin() {
- return true;
- };
- }();
- var xhr = function xhrAdapter(config) {
- return new Promise(function dispatchXhrRequest(resolve, reject) {
- var requestData = config.data;
- var requestHeaders = config.headers;
- if (utils.isFormData(requestData)) {
- delete requestHeaders['Content-Type']; // Let the browser set it
- }
- var request = new XMLHttpRequest(); // HTTP basic authentication
- if (config.auth) {
- var username = config.auth.username || '';
- var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
- requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
- }
- var fullPath = buildFullPath(config.baseURL, config.url);
- request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS
- request.timeout = config.timeout; // Listen for ready state
- request.onreadystatechange = function handleLoad() {
- if (!request || request.readyState !== 4) {
- return;
- } // The request errored out and we didn't get a response, this will be
- // handled by onerror instead
- // With one exception: request that using file: protocol, most browsers
- // will return status as 0 even though it's a successful request
- if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
- return;
- } // Prepare the response
- var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
- var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
- var response = {
- data: responseData,
- status: request.status,
- statusText: request.statusText,
- headers: responseHeaders,
- config: config,
- request: request
- };
- settle(resolve, reject, response); // Clean up request
- request = null;
- }; // Handle browser request cancellation (as opposed to a manual cancellation)
- request.onabort = function handleAbort() {
- if (!request) {
- return;
- }
- reject(createError('Request aborted', config, 'ECONNABORTED', request)); // Clean up request
- request = null;
- }; // Handle low level network errors
- request.onerror = function handleError() {
- // Real errors are hidden from us by the browser
- // onerror should only fire if it's a network error
- reject(createError('Network Error', config, null, request)); // Clean up request
- request = null;
- }; // Handle timeout
- request.ontimeout = function handleTimeout() {
- var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';
- if (config.timeoutErrorMessage) {
- timeoutErrorMessage = config.timeoutErrorMessage;
- }
- reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', request)); // Clean up request
- request = null;
- }; // Add xsrf header
- // This is only done if running in a standard browser environment.
- // Specifically not if we're in a web worker, or react-native.
- if (utils.isStandardBrowserEnv()) {
- // Add xsrf header
- var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined;
- if (xsrfValue) {
- requestHeaders[config.xsrfHeaderName] = xsrfValue;
- }
- } // Add headers to the request
- if ('setRequestHeader' in request) {
- utils.forEach(requestHeaders, function setRequestHeader(val, key) {
- if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
- // Remove Content-Type if data is undefined
- delete requestHeaders[key];
- } else {
- // Otherwise add header to the request
- request.setRequestHeader(key, val);
- }
- });
- } // Add withCredentials to request if needed
- if (!utils.isUndefined(config.withCredentials)) {
- request.withCredentials = !!config.withCredentials;
- } // Add responseType to request if needed
- if (config.responseType) {
- try {
- request.responseType = config.responseType;
- } catch (e) {
- // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
- // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
- if (config.responseType !== 'json') {
- throw e;
- }
- }
- } // Handle progress if needed
- if (typeof config.onDownloadProgress === 'function') {
- request.addEventListener('progress', config.onDownloadProgress);
- } // Not all browsers support upload events
- if (typeof config.onUploadProgress === 'function' && request.upload) {
- request.upload.addEventListener('progress', config.onUploadProgress);
- }
- if (config.cancelToken) {
- // Handle cancellation
- config.cancelToken.promise.then(function onCanceled(cancel) {
- if (!request) {
- return;
- }
- request.abort();
- reject(cancel); // Clean up request
- request = null;
- });
- }
- if (!requestData) {
- requestData = null;
- } // Send the request
- request.send(requestData);
- });
- };
- var DEFAULT_CONTENT_TYPE = {
- 'Content-Type': 'application/x-www-form-urlencoded'
- };
- function setContentTypeIfUnset(headers, value) {
- if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
- headers['Content-Type'] = value;
- }
- }
- function getDefaultAdapter() {
- var adapter;
- if (typeof XMLHttpRequest !== 'undefined') {
- // For browsers use XHR adapter
- adapter = xhr;
- } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
- // For node use HTTP adapter
- adapter = xhr;
- }
- return adapter;
- }
- var defaults = {
- adapter: getDefaultAdapter(),
- transformRequest: [function transformRequest(data, headers) {
- normalizeHeaderName(headers, 'Accept');
- normalizeHeaderName(headers, 'Content-Type');
- if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
- return data;
- }
- if (utils.isArrayBufferView(data)) {
- return data.buffer;
- }
- if (utils.isURLSearchParams(data)) {
- setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
- return data.toString();
- }
- if (utils.isObject(data)) {
- setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
- return JSON.stringify(data);
- }
- return data;
- }],
- transformResponse: [function transformResponse(data) {
- /*eslint no-param-reassign:0*/
- if (typeof data === 'string') {
- try {
- data = JSON.parse(data);
- } catch (e) {
- /* Ignore */
- }
- }
- return data;
- }],
- /**
- * A timeout in milliseconds to abort a request. If set to 0 (default) a
- * timeout is not created.
- */
- timeout: 0,
- xsrfCookieName: 'XSRF-TOKEN',
- xsrfHeaderName: 'X-XSRF-TOKEN',
- maxContentLength: -1,
- maxBodyLength: -1,
- validateStatus: function validateStatus(status) {
- return status >= 200 && status < 300;
- }
- };
- defaults.headers = {
- common: {
- 'Accept': 'application/json, text/plain, */*'
- }
- };
- utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
- defaults.headers[method] = {};
- });
- utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
- defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
- });
- var defaults_1 = defaults;
- /**
- * Throws a `Cancel` if cancellation has been requested.
- */
- function throwIfCancellationRequested(config) {
- if (config.cancelToken) {
- config.cancelToken.throwIfRequested();
- }
- }
- /**
- * Dispatch a request to the server using the configured adapter.
- *
- * @param {object} config The config that is to be used for the request
- * @returns {Promise} The Promise to be fulfilled
- */
- var dispatchRequest = function dispatchRequest(config) {
- throwIfCancellationRequested(config); // Ensure headers exist
- config.headers = config.headers || {}; // Transform request data
- config.data = transformData(config.data, config.headers, config.transformRequest); // Flatten headers
- config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers);
- utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
- delete config.headers[method];
- });
- var adapter = config.adapter || defaults_1.adapter;
- return adapter(config).then(function onAdapterResolution(response) {
- throwIfCancellationRequested(config); // Transform response data
- response.data = transformData(response.data, response.headers, config.transformResponse);
- return response;
- }, function onAdapterRejection(reason) {
- if (!isCancel(reason)) {
- throwIfCancellationRequested(config); // Transform response data
- if (reason && reason.response) {
- reason.response.data = transformData(reason.response.data, reason.response.headers, config.transformResponse);
- }
- }
- return Promise.reject(reason);
- });
- };
- /**
- * Config-specific merge-function which creates a new config-object
- * by merging two configuration objects together.
- *
- * @param {Object} config1
- * @param {Object} config2
- * @returns {Object} New object resulting from merging config2 to config1
- */
- var mergeConfig = function mergeConfig(config1, config2) {
- // eslint-disable-next-line no-param-reassign
- config2 = config2 || {};
- var config = {};
- var valueFromConfig2Keys = ['url', 'method', 'data'];
- var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
- 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'];
- var directMergeKeys = ['validateStatus'];
- function getMergedValue(target, source) {
- if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
- return utils.merge(target, source);
- } else if (utils.isPlainObject(source)) {
- return utils.merge({}, source);
- } else if (utils.isArray(source)) {
- return source.slice();
- }
- return source;
- }
- function mergeDeepProperties(prop) {
- if (!utils.isUndefined(config2[prop])) {
- config[prop] = getMergedValue(config1[prop], config2[prop]);
- } else if (!utils.isUndefined(config1[prop])) {
- config[prop] = getMergedValue(undefined, config1[prop]);
- }
- }
- utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
- if (!utils.isUndefined(config2[prop])) {
- config[prop] = getMergedValue(undefined, config2[prop]);
- }
- });
- utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
- utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
- if (!utils.isUndefined(config2[prop])) {
- config[prop] = getMergedValue(undefined, config2[prop]);
- } else if (!utils.isUndefined(config1[prop])) {
- config[prop] = getMergedValue(undefined, config1[prop]);
- }
- });
- utils.forEach(directMergeKeys, function merge(prop) {
- if (prop in config2) {
- config[prop] = getMergedValue(config1[prop], config2[prop]);
- } else if (prop in config1) {
- config[prop] = getMergedValue(undefined, config1[prop]);
- }
- });
- var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropertiesKeys).concat(defaultToConfig2Keys).concat(directMergeKeys);
- var otherKeys = Object.keys(config1).concat(Object.keys(config2)).filter(function filterAxiosKeys(key) {
- return axiosKeys.indexOf(key) === -1;
- });
- utils.forEach(otherKeys, mergeDeepProperties);
- return config;
- };
- /**
- * Create a new instance of Axios
- *
- * @param {Object} instanceConfig The default config for the instance
- */
- function Axios(instanceConfig) {
- this.defaults = instanceConfig;
- this.interceptors = {
- request: new InterceptorManager_1(),
- response: new InterceptorManager_1()
- };
- }
- /**
- * Dispatch a request
- *
- * @param {Object} config The config specific for this request (merged with this.defaults)
- */
- Axios.prototype.request = function request(config) {
- /*eslint no-param-reassign:0*/
- // Allow for axios('example/url'[, config]) a la fetch API
- if (typeof config === 'string') {
- config = arguments[1] || {};
- config.url = arguments[0];
- } else {
- config = config || {};
- }
- config = mergeConfig(this.defaults, config); // Set config.method
- if (config.method) {
- config.method = config.method.toLowerCase();
- } else if (this.defaults.method) {
- config.method = this.defaults.method.toLowerCase();
- } else {
- config.method = 'get';
- } // Hook up interceptors middleware
- var chain = [dispatchRequest, undefined];
- var promise = Promise.resolve(config);
- this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
- chain.unshift(interceptor.fulfilled, interceptor.rejected);
- });
- this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
- chain.push(interceptor.fulfilled, interceptor.rejected);
- });
- while (chain.length) {
- promise = promise.then(chain.shift(), chain.shift());
- }
- return promise;
- };
- Axios.prototype.getUri = function getUri(config) {
- config = mergeConfig(this.defaults, config);
- return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
- }; // Provide aliases for supported request methods
- utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
- /*eslint func-names:0*/
- Axios.prototype[method] = function (url, config) {
- return this.request(mergeConfig(config || {}, {
- method: method,
- url: url,
- data: (config || {}).data
- }));
- };
- });
- utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
- /*eslint func-names:0*/
- Axios.prototype[method] = function (url, data, config) {
- return this.request(mergeConfig(config || {}, {
- method: method,
- url: url,
- data: data
- }));
- };
- });
- var Axios_1 = Axios;
- /**
- * A `Cancel` is an object that is thrown when an operation is canceled.
- *
- * @class
- * @param {string=} message The message.
- */
- function Cancel(message) {
- this.message = message;
- }
- Cancel.prototype.toString = function toString() {
- return 'Cancel' + (this.message ? ': ' + this.message : '');
- };
- Cancel.prototype.__CANCEL__ = true;
- var Cancel_1 = Cancel;
- /**
- * A `CancelToken` is an object that can be used to request cancellation of an operation.
- *
- * @class
- * @param {Function} executor The executor function.
- */
- function CancelToken(executor) {
- if (typeof executor !== 'function') {
- throw new TypeError('executor must be a function.');
- }
- var resolvePromise;
- this.promise = new Promise(function promiseExecutor(resolve) {
- resolvePromise = resolve;
- });
- var token = this;
- executor(function cancel(message) {
- if (token.reason) {
- // Cancellation has already been requested
- return;
- }
- token.reason = new Cancel_1(message);
- resolvePromise(token.reason);
- });
- }
- /**
- * Throws a `Cancel` if cancellation has been requested.
- */
- CancelToken.prototype.throwIfRequested = function throwIfRequested() {
- if (this.reason) {
- throw this.reason;
- }
- };
- /**
- * Returns an object that contains a new `CancelToken` and a function that, when called,
- * cancels the `CancelToken`.
- */
- CancelToken.source = function source() {
- var cancel;
- var token = new CancelToken(function executor(c) {
- cancel = c;
- });
- return {
- token: token,
- cancel: cancel
- };
- };
- var CancelToken_1 = CancelToken;
- /**
- * Syntactic sugar for invoking a function and expanding an array for arguments.
- *
- * Common use case would be to use `Function.prototype.apply`.
- *
- * ```js
- * function f(x, y, z) {}
- * var args = [1, 2, 3];
- * f.apply(null, args);
- * ```
- *
- * With `spread` this example can be re-written.
- *
- * ```js
- * spread(function(x, y, z) {})([1, 2, 3]);
- * ```
- *
- * @param {Function} callback
- * @returns {Function}
- */
- var spread = function spread(callback) {
- return function wrap(arr) {
- return callback.apply(null, arr);
- };
- };
- /**
- * Determines whether the payload is an error thrown by Axios
- *
- * @param {*} payload The value to test
- * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
- */
- var isAxiosError = function isAxiosError(payload) {
- return typeof payload === 'object' && payload.isAxiosError === true;
- };
- /**
- * Create an instance of Axios
- *
- * @param {Object} defaultConfig The default config for the instance
- * @return {Axios} A new instance of Axios
- */
- function createInstance(defaultConfig) {
- var context = new Axios_1(defaultConfig);
- var instance = bind$1(Axios_1.prototype.request, context); // Copy axios.prototype to instance
- utils.extend(instance, Axios_1.prototype, context); // Copy context to instance
- utils.extend(instance, context);
- return instance;
- } // Create the default instance to be exported
- var axios$1 = createInstance(defaults_1); // Expose Axios class to allow class inheritance
- axios$1.Axios = Axios_1; // Factory for creating new instances
- axios$1.create = function create(instanceConfig) {
- return createInstance(mergeConfig(axios$1.defaults, instanceConfig));
- }; // Expose Cancel & CancelToken
- axios$1.Cancel = Cancel_1;
- axios$1.CancelToken = CancelToken_1;
- axios$1.isCancel = isCancel; // Expose all/spread
- axios$1.all = function all(promises) {
- return Promise.all(promises);
- };
- axios$1.spread = spread; // Expose isAxiosError
- axios$1.isAxiosError = isAxiosError;
- var axios_1 = axios$1; // Allow use of default import syntax in TypeScript
- var _default$1 = axios$1;
- axios_1.default = _default$1;
- var axios = axios_1;
- var fetch$1 = null;
- var config$5 = null;
- var instance = null;
- Promise.prototype.done = Promise.prototype.then;
- Promise.prototype.fail = Promise.prototype.catch; // TextDecoder polyfills for lower browser
- if (undefined === window.TextEncoder) {
- window.TextEncoder = /*#__PURE__*/function () {
- function _TextEncoder() {
- _classCallCheck(this, _TextEncoder);
- }
- _createClass(_TextEncoder, [{
- key: "encode",
- value: function encode(s) {
- return unescape(encodeURIComponent(s)).split('').map(function (val) {
- return val.charCodeAt();
- });
- }
- }]);
- return _TextEncoder;
- }();
- window.TextDecoder = /*#__PURE__*/function () {
- function _TextDecoder() {
- _classCallCheck(this, _TextDecoder);
- }
- _createClass(_TextDecoder, [{
- key: "decode",
- value: function decode(code_arr) {
- return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)));
- }
- }]);
- return _TextDecoder;
- }();
- }
- var http = {
- retry(func) {
- var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
- return new Promise(function (resolve, reject) {
- func().then(resolve).catch(function (error) {
- if (retries <= 1) {
- reject(error);
- } else {
- setTimeout(function () {
- http.retry(func, retries - 1, delay).then(resolve).catch(reject);
- }, delay);
- }
- });
- });
- },
- get(url, data) {
- if (data && typeof data === 'object') {
- if (url.indexOf('?') == -1) {
- url += '?';
- } else {
- url += '&';
- }
- url += new URLSearchParams(data).toString();
- }
- return fetch$1.get(url);
- },
- getImage(url) {
- var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
- if (config$5.region == 'aws') {
- if (url.indexOf('x-oss-process=image') != -1) {
- var arr = url.split('?');
- url = arr[0] + encodeURIComponent('?' + arr[1].replace(/\//g, '@'));
- }
- }
- return http.retry(function () {
- return new Promise(function (resolve, reject) {
- var img = new Image();
- img.crossOrigin = 'anonymous';
- img.src = url;
- img.onload = function () {
- resolve(img);
- };
- img.onerror = function () {
- reject("[".concat(url, "] load fail"));
- };
- });
- }, retries);
- },
- getText(url) {
- return fetch$1.get(url, {
- responseType: 'text'
- });
- },
- getBueffer(url) {
- return fetch$1.get(url, {
- responseType: 'arraybuffer'
- });
- },
- getBlob(url) {
- return fetch$1.get(url, {
- responseType: 'blob'
- });
- },
- post(url, data) {
- return fetch$1.post(url, data);
- },
- postFile(url, data, json) {
- var form = new FormData();
- var cb = null;
- if (data.onUploadProgress) {
- cb = data.onUploadProgress;
- delete data.onUploadProgress;
- }
- for (var key in data) {
- if (key === 'files' && data[key].length > 0) {
- for (var i = 0; i < data[key].length; i++) {
- var file = data[key][i];
- if (file instanceof File) {
- form.append(key, file);
- } else if (file.file) {
- if (file.filename) {
- form.append(key, file.file, file.filename);
- } else {
- form.append(key, file.file);
- }
- } else {
- console.warn('file is wong !', data);
- }
- }
- } else if (key == 'file' || key === 'filename') {
- if (key == 'file') {
- if (data.filename) {
- form.append('file', data[key], data.filename);
- } else {
- form.append('file', data[key]);
- }
- }
- } else {
- form.append(key, data[key]);
- }
- } // if (json) {
- // for (let jsonKey in json) {
- // // const blob = json[jsonKey]
- // // form.append(
- // // jsonKey,
- // // new Blob([blob], {
- // // type: 'application/json',
- // // })
- // // )
- // form.append(jsonKey, JSON.stringify(json[jsonKey]))
- // }
- // }
- return fetch$1.post(url, form, {
- headers: {
- 'Content-Type': 'multipart/form-data'
- },
- onUploadProgress: cb
- });
- }
- };
- function setup$1(app) {
- if (!app || instance) {
- return;
- }
- config$5 = app.config;
- instance = app;
- fetch$1 = axios.create({
- // baseURL: 'https://v4-test.4dkankan.com',
- // baseURL: 'http://192.168.0.47',
- baseURL: config$5.server || ''
- });
- fetch$1.interceptors.request.use(function (config) {
- if (config.url.indexOf('/service/') != -1) {
- var token = browser$1.valueFromUrl('token') || localStorage.getItem('token') || '';
- if (token) {
- config.headers['token'] = token;
- }
- }
- return config;
- }, function (error) {
- return Promise.reject(error);
- });
- fetch$1.interceptors.response.use(function (response) {
- // 正常的文件流
- if (!/json/gi.test(response.headers['content-type'])) {
- return response.data;
- } // 以文件流方式请求但是返回json,需要解析为JSON对象
- if (response.request.responseType === 'arraybuffer') {
- var enc = new TextDecoder('utf-8');
- var res = JSON.parse(enc.decode(new Uint8Array(response.data)));
- return res;
- }
- if (instance && response.data.success === false) {
- instance.Scene.emit('error', {
- type: 'network',
- code: response.data.code,
- message: response.data.message
- });
- }
- return response.data;
- }, function (error) {
- if (instance) {
- var data = null;
- if (error.response && error.response.data) {
- data = error.response.data;
- } else {
- data = {
- code: 500,
- message: error
- };
- }
- if (error.config && error.config.url.indexOf('data/mapping') == -1 && error.config.url.indexOf('floorplan.json') == -1 && error.config.url.indexOf('vision2.modeldata') == -1) {
- instance.Scene.emit('error', {
- type: 'network',
- code: data.code,
- message: data.message
- });
- }
- }
- if (error.response && error.response.data) {
- return Promise.reject(error.response);
- }
- return Promise.reject(error);
- });
- }
- var sdk_domain = getScriptURL(); //.match(/^http(s)?:\/\/(.*?)\//)[0]
- var texture = {
- data: {}
- };
- texture.load = function (imgUrl, addTextureFunc, failFnc) {
- var _texture = texture.data[imgUrl];
- if (_texture) {
- addTextureFunc && setTimeout(function () {
- addTextureFunc(_texture);
- }, 1);
- return _texture;
- } else {
- _texture = new THREE.Texture();
- if (settings$3.minimalMemoryMode) {
- _texture.minFilter = THREE.LinearFilter;
- _texture.magFilter = THREE.LinearFilter;
- _texture.generateMipmaps = !1;
- }
- _texture.sourceFile = imgUrl;
- texture.data[imgUrl] = _texture;
- http.getImage(imgUrl).then(function (img) {
- _texture.image = img;
- _texture.needsUpdate = !0;
- addTextureFunc && addTextureFunc(_texture);
- }).catch(failFnc);
- return _texture;
- }
- };
- texture.loadWithoutUpdate = /*#__PURE__*/function () {
- var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(imgUrl, addTextureFunc, failFnc) {
- var _texture;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _texture = texture.data[imgUrl.split('?')[0]];
- if (!_texture) {
- _context.next = 6;
- break;
- }
- addTextureFunc && addTextureFunc(_texture);
- return _context.abrupt("return", _texture);
- case 6:
- _texture = new THREE.Texture();
- if (settings$3.minimalMemoryMode) {
- _texture.minFilter = THREE.LinearFilter;
- _texture.magFilter = THREE.LinearFilter;
- _texture.generateMipmaps = !1;
- }
- _texture.sourceFile = imgUrl;
- texture.data[imgUrl.split('?')[0]] = _texture;
- _context.next = 12;
- return http.getImage(imgUrl).then(function (img) {
- _texture.image = img;
- _texture.needsUpdate = !0;
- addTextureFunc && addTextureFunc(_texture);
- }).catch(failFnc);
- case 12:
- return _context.abrupt("return", _texture);
- case 13:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function (_x, _x2, _x3) {
- return _ref.apply(this, arguments);
- };
- }();
- texture.loadBase64 = function (base64, fileType) {
- fileType = fileType || 'png';
- var _texture = new THREE.Texture();
- _texture.image = document.createElement('img');
- _texture.image.setAttribute('src', 'data:image/' + fileType + ';base64,' + base64);
- if (settings$3.minimalMemoryMode) {
- _texture.minFilter = THREE.LinearFilter;
- _texture.magFilter = THREE.LinearFilter;
- _texture.generateMipmaps = !1;
- }
- _texture.needsUpdate = !0;
- return _texture;
- };
- texture.isLoaded = function (imgUrl) {
- return !!texture.data[imgUrl];
- };
- texture.getImageURL = function (path) {
- if (path && path.indexOf('http') === 0) {
- return path;
- }
- return sdk_domain + path;
- };
- var warnImg = {};
- texture.getWarnImg = function (name, text, maxLineWidth, dontBreakWords) {
- if (!warnImg[name]) {
- var label = new TextSprite({
- //如果直接在canvas里写字,要另外写很多和canvas.drawText有关的,所以还是借助textSprite吧
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- margin: {
- x: 50,
- y: 100
- },
- renderOrder: 50,
- fontsize: 30,
- text,
- maxLineWidth,
- borderRadius: 0,
- dontBreakWords
- });
- warnImg[name] = label.sprite.material.map.image;
- label.dispose();
- }
- return warnImg[name];
- };
- 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); }; }
- 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; } }
- /**
- * @author WestLangley / http://github.com/WestLangley
- *
- * parameters = {
- * color: <hex>,
- * lineWidth: <float>,
- * dashed: <boolean>,
- * dashScale: <float>,
- * dashSize: <float>,
- * gapSize: <float>,
- * resolution: <Vector2>, // to be set by renderer
- * }
- */
- var line = {
- lineWidth: {
- value: 1,
- type: 'f'
- },
- resolution: {
- value: new THREE.Vector2(300, 300),
- type: 'v2'
- },
- dashScale: {
- value: 1,
- type: 'f'
- },
- dashSize: {
- value: 1,
- type: 'f'
- },
- gapSize: {
- value: 1,
- type: 'f'
- } // todo FIX - maybe change to totalSize
- };
- var shaderLib = {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, line]),
- 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} ',
- 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 }'
- };
- var lineMats = [],
- resolution = new THREE.Vector2(300, 300);
- var LineMaterial = /*#__PURE__*/function (_THREE$ShaderMaterial) {
- _inherits(LineMaterial, _THREE$ShaderMaterial);
- var _super = _createSuper$1M(LineMaterial);
- function LineMaterial(parameters) {
- var _this;
- _classCallCheck(this, LineMaterial);
- parameters.resolution || (parameters.resolution = resolution.clone());
- _this = _super.call(this, {
- type: 'LineMaterial',
- uniforms: THREE.UniformsUtils.clone(shaderLib.uniforms),
- vertexShader: shaderLib.vertexShader,
- fragmentShader: shaderLib.fragmentShader
- }); // 因为opacity会与ShaderMaterial.opacity冲突,所以必须放在super之后
- Object.defineProperties(_assertThisInitialized(_this), {
- opacity: {
- enumerable: true,
- get: function get() {
- return this.uniforms.opacity.value;
- },
- set: function set(value) {
- this.uniforms.opacity.value = value;
- }
- }
- });
- _this.isLineMaterial = true;
- _this.dashed = false;
- _this.setValues(parameters); //add:
- lineMats.push(_assertThisInitialized(_this));
- _this.addEventListener('dispose', function () {
- var i = lineMats.indexOf(_assertThisInitialized(_this));
- i > -1 && lineMats.splice(i, 1);
- });
- return _this;
- }
- _createClass(LineMaterial, [{
- key: "color",
- get: function get() {
- return this.uniforms.diffuse.value;
- },
- set: function set(value) {
- this.uniforms.diffuse.value = value;
- }
- }, {
- key: "lineWidth",
- get: function get() {
- return this.uniforms.lineWidth.value;
- },
- set: function set(value) {
- this.uniforms.lineWidth.value = value;
- }
- }, {
- key: "dashScale",
- get: function get() {
- return this.uniforms.dashScale.value;
- },
- set: function set(value) {
- this.uniforms.dashScale.value = value;
- }
- }, {
- key: "dashSize",
- get: function get() {
- return this.uniforms.dashSize.value;
- },
- set: function set(value) {
- this.uniforms.dashSize.value = value;
- }
- }, {
- key: "gapSize",
- get: function get() {
- return this.uniforms.gapSize.value;
- },
- set: function set(value) {
- this.uniforms.gapSize.value = value;
- }
- }, {
- key: "resolution",
- get: function get() {
- return this.uniforms.resolution.value;
- },
- set: function set(value) {
- this.uniforms.resolution.value.copy(value);
- }
- }, {
- key: "dashed",
- get: function get() {
- return 'USE_DASH' in this.defines;
- },
- set: function set(value) {
- if (value) {
- this.defines.USE_DASH = '';
- } else {
- delete this.defines.USE_DASH;
- }
- this.needsUpdate = true;
- }
- }, {
- key: "copy",
- value: function copy(source) {
- THREE.ShaderMaterial.prototype.copy.call(this, source);
- this.color.copy(source.color);
- this.lineWidth = source.lineWidth;
- this.resolution = source.resolution; // todo
- return this;
- }
- }], [{
- key: "init",
- value: function init(app) {
- app.core.get('SceneRenderer').addComponent(this);
- }
- }, {
- key: "setSize",
- value: function setSize(x, y) {
- resolution.set(x, y); //暂时只用在这一个viewport里渲染
- lineMats.forEach(function (e) {
- e.resolution = new THREE.Vector2(x, y);
- });
- }
- }]);
- return LineMaterial;
- }(THREE.ShaderMaterial); // LineMaterial.prototype = Object.create(THREE.ShaderMaterial.prototype)
- // LineMaterial.prototype.constructor = THREE.LineMaterial
- // LineMaterial.prototype.isLineMaterial = true
- /**
- * @author WestLangley / http://github.com/WestLangley
- *
- */
- var LineSegmentsGeometry = /*#__PURE__*/function (_THREE$InstancedBuffe) {
- _inherits(LineSegmentsGeometry, _THREE$InstancedBuffe);
- var _super2 = _createSuper$1M(LineSegmentsGeometry);
- function LineSegmentsGeometry() {
- var _this2;
- _classCallCheck(this, LineSegmentsGeometry);
- _this2 = _super2.call(this);
- _this2.computeBoundingBox = function () {
- var box = new THREE.Box3();
- return function () {
- if (_this2.boundingBox === null) {
- _this2.boundingBox = new THREE.Box3();
- }
- var start = _this2.attributes.instanceStart;
- var end = _this2.attributes.instanceEnd;
- if (start !== undefined && end !== undefined) {
- _this2.boundingBox.setFromBufferAttribute(start);
- box.setFromBufferAttribute(end);
- _this2.boundingBox.union(box);
- }
- };
- }();
- _this2.computeBoundingSphere = function () {
- var vector = new THREE.Vector3();
- return function () {
- if (_this2.boundingSphere === null) {
- _this2.boundingSphere = new THREE.Sphere();
- }
- if (_this2.boundingBox === null) {
- _this2.computeBoundingBox();
- }
- var start = _this2.attributes.instanceStart;
- var end = _this2.attributes.instanceEnd;
- if (start !== undefined && end !== undefined) {
- var center = _this2.boundingSphere.center;
- _this2.boundingBox.getCenter(center);
- var maxRadiusSq = 0;
- for (var i = 0, il = start.count; i < il; i++) {
- vector.fromBufferAttribute(start, i);
- maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
- vector.fromBufferAttribute(end, i);
- maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
- }
- _this2.boundingSphere.radius = Math.sqrt(maxRadiusSq);
- if (isNaN(_this2.boundingSphere.radius)) {
- console.error('LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', _assertThisInitialized(_this2));
- }
- }
- };
- }();
- _this2.type = 'LineSegmentsGeometry';
- new THREE.BufferGeometry();
- 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];
- var uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2];
- 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);
- _this2.setIndex(index);
- _this2.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
- _this2.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
- _this2.isLineSegmentsGeometry = true;
- return _this2;
- }
- _createClass(LineSegmentsGeometry, [{
- key: "applyMatrix",
- value: function applyMatrix(matrix) {
- var start = this.attributes.instanceStart;
- var end = this.attributes.instanceEnd;
- if (start !== undefined) {
- matrix.applyToBufferAttribute(start);
- matrix.applyToBufferAttribute(end);
- start.data.needsUpdate = true;
- }
- if (this.boundingBox !== null) {
- this.computeBoundingBox();
- }
- if (this.boundingSphere !== null) {
- this.computeBoundingSphere();
- }
- return this;
- }
- }, {
- key: "setPositions",
- value: function setPositions(array) {
- var lineSegments;
- if (array instanceof Float32Array) {
- lineSegments = array;
- } else if (Array.isArray(array)) {
- lineSegments = new Float32Array(array);
- }
- var instanceBuffer = new THREE.InstancedInterleavedBuffer(lineSegments, 6, 1); // xyz, xyz
- this.setAttribute('instanceStart', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 0)); // xyz
- this.setAttribute('instanceEnd', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 3)); // xyz
- //
- this.computeBoundingBox();
- this.computeBoundingSphere();
- return this;
- }
- }, {
- key: "setColors",
- value: function setColors(array) {
- var colors;
- if (array instanceof Float32Array) {
- colors = array;
- } else if (Array.isArray(array)) {
- colors = new Float32Array(array);
- }
- var instanceColorBuffer = new THREE.InstancedInterleavedBuffer(colors, 6, 1); // rgb, rgb
- this.setAttribute('instanceColorStart', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 0)); // rgb
- this.setAttribute('instanceColorEnd', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 3)); // rgb
- return this;
- }
- }, {
- key: "fromWireframeGeometry",
- value: function fromWireframeGeometry(geometry) {
- this.setPositions(geometry.attributes.position.array);
- return this;
- }
- }, {
- key: "fromEdgesGeometry",
- value: function fromEdgesGeometry(geometry) {
- this.setPositions(geometry.attributes.position.array);
- return this;
- }
- }, {
- key: "fromMesh",
- value: function fromMesh(mesh) {
- this.fromWireframeGeometry(new THREE.WireframeGeometry(mesh.geometry)); // set colors, maybe
- return this;
- }
- }, {
- key: "fromLineSegements",
- value: function fromLineSegements(lineSegments) {
- var geometry = lineSegments.geometry;
- if (geometry.isGeometry) {
- this.setPositions(geometry.vertices);
- } else if (geometry.isBufferGeometry) {
- this.setPositions(geometry.position.array); // assumes non-indexed
- } // set colors, maybe
- return this;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {// todo
- }
- }, {
- key: "clone",
- value: function clone() {// todo
- }
- }, {
- key: "copy",
- value: function copy(source) {
- // todo
- return this;
- }
- }]);
- return LineSegmentsGeometry;
- }(THREE.InstancedBufferGeometry);
- /**
- * @author WestLangley / http://github.com/WestLangley
- *
- */
- var LineGeometry = /*#__PURE__*/function (_LineSegmentsGeometry) {
- _inherits(LineGeometry, _LineSegmentsGeometry);
- var _super3 = _createSuper$1M(LineGeometry);
- function LineGeometry() {
- var _this3;
- _classCallCheck(this, LineGeometry);
- _this3 = _super3.call(this);
- _this3.type = 'LineGeometry';
- _this3.isLineGeometry = true;
- return _this3;
- }
- _createClass(LineGeometry, [{
- key: "setPositions",
- value: function setPositions(arr) {
- // converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format
- var length = arr.length - 3;
- var points = new Float32Array(2 * length);
- for (var i = 0; i < length; i += 3) {
- points[2 * i] = arr[i];
- points[2 * i + 1] = arr[i + 1];
- points[2 * i + 2] = arr[i + 2];
- points[2 * i + 3] = arr[i + 3];
- points[2 * i + 4] = arr[i + 4];
- points[2 * i + 5] = arr[i + 5];
- }
- _get(_getPrototypeOf(LineGeometry.prototype), "setPositions", this).call(this, points);
- return this;
- }
- }, {
- key: "setColors",
- value: function setColors(array) {
- // converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format
- var length = array.length - 3;
- var colors = new Float32Array(2 * length);
- for (var i = 0; i < length; i += 3) {
- colors[2 * i] = array[i];
- colors[2 * i + 1] = array[i + 1];
- colors[2 * i + 2] = array[i + 2];
- colors[2 * i + 3] = array[i + 3];
- colors[2 * i + 4] = array[i + 4];
- colors[2 * i + 5] = array[i + 5];
- }
- _get(_getPrototypeOf(LineGeometry.prototype), "setColors", this).call(this, colors);
- return this;
- }
- }, {
- key: "fromLine",
- value: function fromLine(line) {
- var geometry = line.geometry;
- if (geometry.isGeometry) {
- this.setPositions(geometry.vertices);
- } else if (geometry.isBufferGeometry) {
- this.setPositions(geometry.position.array); // assumes non-indexed
- } // set colors, maybe
- return this;
- }
- }, {
- key: "copy",
- value: function copy(source) {
- // todo
- return this;
- }
- }]);
- return LineGeometry;
- }(LineSegmentsGeometry);
- /**
- * @author WestLangley / http://github.com/WestLangley
- *
- */
- new THREE.Vector3();
- new THREE.Vector3();
- var _start4 = new THREE.Vector4();
- var _end4 = new THREE.Vector4();
- var _ssOrigin = new THREE.Vector4();
- var _ssOrigin3 = new THREE.Vector3();
- var _mvMatrix = new THREE.Matrix4();
- var _line = new THREE.Line3();
- var _closestPoint = new THREE.Vector3();
- var _box = new THREE.Box3();
- var _sphere = new THREE.Sphere();
- var _clipToWorldVector = new THREE.Vector4();
- var _ray, _lineWidth; // Returns the margin required to expand by in world space given the distance from the camera,
- // line width, resolution, and camera projection
- function getWorldSpaceHalfWidth(camera, distance, resolution) {
- // transform into clip space, adjust the x and y values by the pixel width offset, then
- // transform back into world space to get world offset. Note clip space is [-1, 1] so full
- // width does not need to be halved.
- _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix);
- _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w);
- _clipToWorldVector.x = _lineWidth / resolution.width;
- _clipToWorldVector.y = _lineWidth / resolution.height;
- _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse);
- _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w);
- return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y));
- }
- function raycastScreenSpace(lineSegments, camera, intersects) {
- var projectionMatrix = camera.projectionMatrix;
- var material = lineSegments.material;
- var resolution = material.resolution;
- var matrixWorld = lineSegments.matrixWorld;
- var geometry = lineSegments.geometry;
- var instanceStart = geometry.attributes.instanceStart;
- var instanceEnd = geometry.attributes.instanceEnd;
- var near = -camera.near; //
- // pick a point 1 unit out along the ray to avoid the ray origin
- // sitting at the camera origin which will cause "w" to be 0 when
- // applying the projection matrix.
- _ray.at(1, _ssOrigin); // ndc space [ - 1.0, 1.0 ]
- _ssOrigin.w = 1;
- _ssOrigin.applyMatrix4(camera.matrixWorldInverse);
- _ssOrigin.applyMatrix4(projectionMatrix);
- _ssOrigin.multiplyScalar(1 / _ssOrigin.w); // screen space
- _ssOrigin.x *= resolution.x / 2;
- _ssOrigin.y *= resolution.y / 2;
- _ssOrigin.z = 0;
- _ssOrigin3.copy(_ssOrigin);
- _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld);
- for (var i = 0, l = instanceStart.count; i < l; i++) {
- _start4.fromBufferAttribute(instanceStart, i);
- _end4.fromBufferAttribute(instanceEnd, i);
- _start4.w = 1;
- _end4.w = 1; // camera space
- _start4.applyMatrix4(_mvMatrix);
- _end4.applyMatrix4(_mvMatrix); // skip the segment if it's entirely behind the camera
- var isBehindCameraNear = _start4.z > near && _end4.z > near;
- if (isBehindCameraNear) {
- continue;
- } // trim the segment if it extends behind camera near
- if (_start4.z > near) {
- var deltaDist = _start4.z - _end4.z;
- var t = (_start4.z - near) / deltaDist;
- _start4.lerp(_end4, t);
- } else if (_end4.z > near) {
- var _deltaDist = _end4.z - _start4.z;
- var _t = (_end4.z - near) / _deltaDist;
- _end4.lerp(_start4, _t);
- } // clip space
- _start4.applyMatrix4(projectionMatrix);
- _end4.applyMatrix4(projectionMatrix); // ndc space [ - 1.0, 1.0 ]
- _start4.multiplyScalar(1 / _start4.w);
- _end4.multiplyScalar(1 / _end4.w); // screen space
- _start4.x *= resolution.x / 2;
- _start4.y *= resolution.y / 2;
- _end4.x *= resolution.x / 2;
- _end4.y *= resolution.y / 2; // create 2d segment
- _line.start.copy(_start4);
- _line.start.z = 0;
- _line.end.copy(_end4);
- _line.end.z = 0; // get closest point on ray to segment
- var param = _line.closestPointToPointParameter(_ssOrigin3, true);
- _line.at(param, _closestPoint); // check if the intersection point is within clip space
- var zPos = THREE.MathUtils.lerp(_start4.z, _end4.z, param);
- var isInClipSpace = zPos >= -1 && zPos <= 1;
- var isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5;
- if (isInClipSpace && isInside) {
- _line.start.fromBufferAttribute(instanceStart, i);
- _line.end.fromBufferAttribute(instanceEnd, i);
- _line.start.applyMatrix4(matrixWorld);
- _line.end.applyMatrix4(matrixWorld);
- var pointOnLine = new THREE.Vector3();
- var point = new THREE.Vector3();
- _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine);
- intersects.push({
- point: point,
- pointOnLine: pointOnLine,
- distance: _ray.origin.distanceTo(point),
- object: lineSegments,
- face: null,
- faceIndex: i,
- uv: null,
- uv2: null
- });
- }
- }
- }
- var LineSegments2 = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(LineSegments2, _THREE$Mesh);
- var _super4 = _createSuper$1M(LineSegments2);
- function LineSegments2(_geometry, material) {
- var _this4;
- _classCallCheck(this, LineSegments2);
- _this4 = _super4.call(this, _geometry, material);
- _this4.computeLineDistances = function () {
- // for backwards-compatability, but could be a method of LineSegmentsGeometry...
- var start = new THREE.Vector3();
- var end = new THREE.Vector3();
- return function () {
- var geometry = _this4.geometry;
- var instanceStart = geometry.attributes.instanceStart;
- var instanceEnd = geometry.attributes.instanceEnd;
- var lineDistances = new Float32Array(2 * instanceStart.data.count);
- for (var i = 0, j = 0, l = instanceStart.data.count; i < l; i++, j += 2) {
- start.fromBufferAttribute(instanceStart, i);
- end.fromBufferAttribute(instanceEnd, i);
- lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1];
- lineDistances[j + 1] = lineDistances[j] + start.distanceTo(end);
- }
- var instanceDistanceBuffer = new THREE.InstancedInterleavedBuffer(lineDistances, 2, 1); // d0, d1
- geometry.setAttribute('instanceDistanceStart', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)); // d0
- geometry.setAttribute('instanceDistanceEnd', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)); // d1
- return _assertThisInitialized(_this4);
- };
- }();
- _this4.type = 'LineSegments2';
- _this4.isLineSegments2 = true;
- _this4.geometry = _geometry !== undefined ? _geometry : new LineSegmentsGeometry();
- _this4.material = material !== undefined ? material : new LineMaterial({
- color: Math.random() * 0xffffff
- });
- return _this4;
- }
- _createClass(LineSegments2, [{
- key: "raycast",
- value: function raycast(raycaster, intersects) {
- var worldUnits = this.material.worldUnits;
- var camera = raycaster.camera;
- if (camera === null && !worldUnits) {
- console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');
- }
- var threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0;
- _ray = raycaster.ray;
- var matrixWorld = this.matrixWorld;
- var geometry = this.geometry;
- var material = this.material;
- _lineWidth = material.lineWidth + threshold;
- geometry.attributes.instanceStart;
- geometry.attributes.instanceEnd; // check if we intersect the sphere bounds
- if (geometry.boundingSphere === null) {
- geometry.computeBoundingSphere();
- }
- _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld); // increase the sphere bounds by the worst case line screen space width
- var sphereMargin;
- if (worldUnits) {
- sphereMargin = _lineWidth * 0.5;
- } else {
- var distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin));
- sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution);
- }
- _sphere.radius += sphereMargin;
- if (_ray.intersectsSphere(_sphere) === false) {
- return;
- } // check if we intersect the box bounds
- if (geometry.boundingBox === null) {
- geometry.computeBoundingBox();
- }
- _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld); // increase the box bounds by the worst case line width
- var boxMargin;
- if (worldUnits) {
- boxMargin = _lineWidth * 0.5;
- } else {
- var distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin));
- boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution);
- }
- _box.expandByScalar(boxMargin);
- if (_ray.intersectsBox(_box) === false) {
- return;
- }
- if (worldUnits) {
- raycastWorldUnits(this, intersects);
- } else {
- raycastScreenSpace(this, camera, intersects);
- }
- }
- }, {
- key: "copy",
- value: function copy(source) {
- // todo
- return this;
- }
- }]);
- return LineSegments2;
- }(THREE.Mesh);
- var Fatline = /*#__PURE__*/function (_LineSegments) {
- _inherits(Fatline, _LineSegments);
- var _super5 = _createSuper$1M(Fatline);
- function Fatline(geometry, material) {
- var _this5;
- _classCallCheck(this, Fatline);
- _this5 = _super5.call(this, geometry, material);
- _this5.type = 'Fatline';
- _this5.isFatline = true;
- _this5.geometry = geometry !== undefined ? geometry : new LineGeometry();
- _this5.material = material !== undefined ? material : new LineMaterial({
- color: Math.random() * 0xffffff
- });
- return _this5;
- }
- _createClass(Fatline, [{
- key: "copy",
- value: function copy(source) {
- // todo
- return this;
- }
- }]);
- return Fatline;
- }(LineSegments2);
- var defaultColor$1 = Colors.lightGreen;
- var player$o = null;
- var LineDraw = {
- /*
- 多段普通线 (第二个点和第三个点之间是没有线段的, 所以不用在意线段顺序)
- */
- createLine: function createLine(posArr) {
- var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var mat;
- if (o.mat) {
- mat = o.mat;
- } else {
- var _o$transparent, _o$depthTest, _o$depthWrite;
- var prop = {
- color: o.color || defaultColor$1,
- /* transparent: o.dontAlwaysSeen ? false : true,
- depthTest: o.dontAlwaysSeen ? true : false, */
- transparent: (_o$transparent = o.transparent) !== null && _o$transparent !== void 0 ? _o$transparent : false,
- depthTest: (_o$depthTest = o.depthTest) !== null && _o$depthTest !== void 0 ? _o$depthTest : true,
- depthWrite: (_o$depthWrite = o.depthWrite) !== null && _o$depthWrite !== void 0 ? _o$depthWrite : true
- };
- if (o.deshed) {
- prop.lineWidth = o.lineWidth || 1; //windows无效。 似乎mac/ios上粗细有效 ?
- prop.dashSize = o.dashSize || 0.1;
- prop.gapSize = o.gapSize || 0.1;
- }
- mat = new THREE[o.deshed ? 'LineDashedMaterial' : 'LineBasicMaterial'](prop);
- }
- var line = new THREE.LineSegments(new THREE.BufferGeometry(), mat);
- line.renderOrder = o.renderOrder || 4;
- this.moveLine(line, posArr);
- return line;
- },
- moveLine: function moveLine(line, posArr) {
- var position = [];
- posArr.forEach(function (e) {
- return position.push(e.x, e.y, e.z);
- });
- line.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(position), 3));
- line.geometry.attributes.position.needsUpdate = true;
- line.geometry.computeBoundingSphere();
- if (line.material instanceof THREE.LineDashedMaterial) {
- line.computeLineDistances();
- }
- },
- createFatLineMat: function createFatLineMat(o) {
- var matParam = Object.assign({}, {
- //默认
- lineWidth: 5,
- color: 0xffffff,
- transparent: true,
- depthWrite: false,
- depthTest: false,
- dashSize: 0.1,
- gapSize: 0.1
- }, o, {//修正覆盖:
- // dashed
- /* polygonOffset: true, //是否开启多边形偏移 for not cover the lineMesh
- polygonOffsetFactor: -o.width * 2.5 || -5, //多边形偏移因子
- polygonOffsetUnits: -4.0, //多边形偏移单位 */
- });
- var mat = new LineMaterial(matParam);
- return mat;
- },
- /*
- 创建可以改变粗细的线。
- */
- createFatLine: function createFatLine(posArr, o) {
- var geometry = new LineGeometry();
- geometry.setColors(o.color || [1, 1, 1]);
- var matLine = o.material || this.createFatLineMat(o);
- var line = new Fatline(geometry, matLine); //line.computeLineDistances();
- line.scale.set(1, 1, 1);
- line.renderOrder = 2;
- this.moveFatLine(line, posArr);
- return line;
- },
- /* createFatLine: function (posArr, o) {
- var geometry = new THREE.BufferGeometry()
- geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(posArr), 3))
- geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(o.color || [1, 1, 1]), 3))
- var matLine = o.material || this.createFatLineMat(o)
- var line = new THREE.Line(geometry, matLine)
- line.computeLineDistances()
- line.scale.set(1, 1, 1)
- line.renderOrder = 2
- return line
- }, */
- moveFatLine: function moveFatLine(line, posArr) {
- var geometry = line.geometry;
- var positions = [];
- posArr.forEach(function (e) {
- return positions.push(e.x, e.y, e.z);
- });
- if (positions.length > 0) {
- if (!geometry) {
- geometry = line.geometry = new LineGeometry();
- }
- if (geometry.attributes.instanceEnd && geometry.attributes.instanceEnd.data.array.length != positions.length) {
- //positions个数改变会有部分显示不出来,所以重建
- geometry.dispose();
- geometry = new LineGeometry();
- line.geometry = geometry;
- }
- geometry.setPositions(positions);
- if (line.material.dashed) {
- line.computeLineDistances();
- }
- line.geometry.computeBoundingSphere();
- } else {
- geometry.dispose();
- line.geometry = new LineGeometry();
- }
- },
- updateLine: function updateLine(line, posArr) {
- if (line.material instanceof LineMaterial) {
- LineDraw.moveFatLine(line, posArr);
- } else {
- LineDraw.moveLine(line, posArr);
- }
- },
- /*
- 为line创建用于检测鼠标的透明mesh,实际是个1-2段圆台。
- 由于近大远小的原因,假设没有透视畸变、创建的是等粗的圆柱的话, 所看到的线上每个位置的粗细应该和距离成反比。所以将圆柱改为根据距离线性渐变其截面半径的圆台,在最近点(相机到线的垂足)最细。如果最近点在线段上,则分成两段圆台,否则一段。
- */
- createBoldLine: function createBoldLine(points, o, p) {
- player$o = p;
- o = o || {};
- var cylinder = o && o.cylinder;
- var CD = points[1].clone().sub(points[0]);
- var rotate = function rotate() {
- //根据端点旋转好模型
- cylinder.lastVector = CD; //记录本次的端点向量
- var AB = new THREE.Vector3(0, -1, 0);
- var axisVec = AB.clone().cross(CD).normalize(); //得到垂直于它们的向量,也就是旋转轴
- var rotationAngle = AB.angleTo(CD);
- cylinder.quaternion.setFromAxisAngle(axisVec, rotationAngle);
- };
- if (o && o.type == 'init') {
- cylinder = new THREE.Mesh();
- cylinder.material = o.mat;
- if (CD.length() == 0) return cylinder;
- rotate();
- }
- if (CD.length() == 0) return cylinder;
- if (o.type != 'update') {
- var CDcenter = points[0].clone().add(points[1]).multiplyScalar(0.5);
- cylinder.position.copy(CDcenter);
- if (!cylinder.lastVector || o.type == 'moveAndRotate') rotate();else if (cylinder.lastVector && CD.angleTo(cylinder.lastVector) > 0) rotate(); //线方向改了or线反向了 重新旋转一下模型
- // if (config.isEdit && !objects.mainDesign.editing) return cylinder //节省初始加载时间?
- } //为了保证线段任何地方的可检测点击范围看起来一样大,更新圆台的结构(但是在镜头边缘会比中心看起来大)
- var height = points[0].distanceTo(points[1]);
- var standPos = o && o.standPos || player$o.position;
- var k = config$6.isMobile ? 20 : 40;
- var dis1 = points[0].distanceTo(standPos);
- var dis2 = points[1].distanceTo(standPos);
- var foot = math$2.getFootPoint(standPos, points[0], points[1]); //垂足
- if (o.constantBold || player$o.mode != 'panorama') {
- var width = 0.1; //0.08;
- var pts = [new THREE.Vector2(width, height / 2), new THREE.Vector2(width, -height / 2)];
- } else if (foot.clone().sub(points[0]).dot(foot.clone().sub(points[1])) > 0) {
- //foot不在线段上
- var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis2 / k, -height / 2)];
- } else {
- //在线段上的话,要在垂足这加一个节点,因它距离站位最近,而两端较远
- var dis3 = foot.distanceTo(standPos);
- var len = foot.distanceTo(points[0]);
- var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis3 / k, height / 2 - len), new THREE.Vector2(dis2 / k, -height / 2)];
- }
- cylinder.geometry && cylinder.geometry.dispose(); //若不删除会占用内存
- cylinder.geometry = new THREE.LatheBufferGeometry(pts, 4
- /* Math.min(dis1,dis2)<10?4:3 */
- );
- cylinder.renderOrder = 2;
- return cylinder;
- },
- updateBoldLine: function updateBoldLine(cylinder, points, type, standPos, constantBold) {
- this.createBoldLine(points, {
- type: type,
- cylinder: cylinder,
- standPos: standPos,
- constantBold
- }, player$o); //type:move:平移 会改长短 , type:update根据距离和角度更新 不改长短
- },
- Fatline,
- fatLineGeometry: LineGeometry
- };
- 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); }; }
- 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; } }
- var markerGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
- var stemLineLen = 0.5;
- var config$4, player$n;
- var videoPanoTags = [];
- var getStemMat = function () {
- var stemMat;
- return function () {
- return stemMat || (stemMat = new VideoLineMaterial(), stemMat);
- };
- }();
- var getVideoSpotMat = function () {
- var spotMat;
- return function () {
- return spotMat || (spotMat = new VideoPlayerMaterial(), spotMat);
- };
- }();
- var getVideoMarkerMat = function () {
- var mat;
- return function () {
- return mat || (mat = new VideoPanoMarkerMaterial(), mat);
- };
- }();
- var getMarkerTex = function () {
- var markerTex;
- return function (name) {
- if (!markerTex) {
- markerTex = common$1.loadTextureFromCache(texture.getImageURL(config$4.scene.markerURL || 'images/marker.png'));
- markerTex.minFilter = THREE.LinearMipMapLinearFilter;
- markerTex.generateMipmaps = true;
- markerTex.anisotropy = 4; // 各向异性过滤 .防止倾斜模糊
- }
- return markerTex;
- };
- }();
- /* var getVideTex = (function () {
- let markerTex
- return function (name) {
- if (!markerTex) {
- markerTex = common.loadTextureFromCache(texture.getImageURL(config.scene.markerURL || 'images/marker.png'))
- markerTex.minFilter = THREE.LinearMipMapLinearFilter
- markerTex.generateMipmaps = true
- markerTex.anisotropy = 4 // 各向异性过滤 .防止倾斜模糊
- }
- return markerTex
- })()
- */
- var initOpacityProp = function initOpacityProp(material, marker) {
- var opa = material.opacity;
- Object.defineProperty(material, 'opacity', {
- get: function get() {
- return opa;
- },
- set: function set(o) {
- if (material instanceof VideoPanoMarkerMaterial) {
- marker = material.marker; //仅有一个,切换到不同pano上
- }
- opa = o; //if(o>0)console.log('o>0',this.pano.id)
- common$1.updateVisible(marker, 'hideWhenZeroOpa', o != 0);
- }
- });
- };
- var Marker = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(Marker, _THREE$Mesh);
- var _super = _createSuper$1L(Marker);
- function Marker(pano) {
- var _this;
- _classCallCheck(this, Marker);
- _this = _super.call(this);
- player$n = pano.$app.core.get('Player');
- _this.pano = pano;
- _this.config = config$4 = pano.$app.config;
- _this.geometry = markerGeometry;
- _this.widget = null;
- _this.material = new THREE.MeshBasicMaterial({
- map: getMarkerTex('normalMarker'),
- side: THREE.DoubleSide,
- opacity: 0,
- //许钟文 change
- transparent: !0,
- depthWrite: !1,
- depthTest: false
- });
- _this.visible = false; //add 加速加载
- _this.renderOrder = RenderOrder.panoMarker;
- _this.name = 'marker';
- _this.layers.set(RenderLayers.PANOMARKERS);
- _this.updateMatrixWorld();
- _this.initAnimate();
- settings$3.colorMarkerOnLoad && _this.on('load', function () {
- this.marker.material.color.set(65280);
- }); //xzw
- {
- initOpacityProp(_this.material, _assertThisInitialized(_this));
- var vis = _this.visible;
- Object.defineProperty(_assertThisInitialized(_this), 'visible', {
- get: function get() {
- return vis;
- },
- set: function set(v) {
- if (pano.flagSpot) {
- v ? pano.flagSpot.show() : pano.flagSpot.hide(); //console.log('marker Visi', pano.id, v)
- }
- vis = v;
- }
- });
- }
- return _this;
- }
- _createClass(Marker, [{
- key: "updateStyle",
- value: function updateStyle(model, type) {
- //console.log('updateStyle', this.pano.id, type)
- var oldOpacity = this.material.opacity;
- if (type == 'animate') {
- var videoMarkerMat = getVideoMarkerMat();
- videoMarkerMat.marker = this;
- if (this.material != videoMarkerMat) {
- this.normalMaterial = this.material;
- this.material = videoMarkerMat;
- }
- } else {
- this.normalMaterial && (this.material = this.normalMaterial);
- if (type == 'video') {
- this.setWidget(model, this.pano, type);
- } else {
- this.pano.oldFlagSpot = this.pano.flagSpot;
- this.pano.flagSpot = null;
- this.pano.oldFlagSpot && this.pano.oldFlagSpot.hide();
- }
- }
- this.material.opacity = oldOpacity;
- }
- }, {
- key: "setWidget",
- value: function setWidget(model, pano, type) {
- // 球幕播放图标
- if (type == 'video') {
- if (pano.oldFlagSpot) {
- pano.flagSpot = pano.oldFlagSpot;
- } else if (!pano.flagSpot) {
- var tag = new VideoPanoTag(model, 'flagSpot___' + pano.id, {
- position: pano.position.clone(),
- state: 'videoPanoFlag',
- sid: 'flagSpot___' + pano.id,
- style: 'videoMarker',
- pano
- });
- tag.style = 'videoMarker'; // 球幕图标线
- var line = tag.createMarkLine({
- type: 'flagSpot',
- stemLineLen,
- markerPos: this.position
- });
- line.marker = this;
- 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)))
- videoPanoTags.push(tag); // 用于animate
- pano.flagSpot = tag;
- if (!this.visible) tag.hide(); //初始化可见性
- }
- }
- }
- }, {
- key: "initAnimate",
- value: function initAnimate() {
- if (animateInited) return;
- player$n.on('update', function () {
- animate();
- });
- animateInited = true;
- }
- }]);
- return Marker;
- }(THREE.Mesh);
- var animateMaterialQuene = [];
- var progress = 0; //let minProgress = 0;
- //let maxProgress = 0;
- var bigCircleProgress = 0;
- var smallCircleProgress0 = -0.12; //间隔
- var smallCircleProgress = smallCircleProgress0;
- var animateInited;
- var speed = 0.0045;
- var noGif = true;
- function animate() {
- for (var i = 0; i < animateMaterialQuene.length; i++) {
- animateMaterialQuene[i].uniforms['progress'].value = progress;
- animateMaterialQuene[i].uniforms['bigCircleProgress'].value = bigCircleProgress;
- animateMaterialQuene[i].uniforms['smallCircleProgress'].value = smallCircleProgress;
- }
- videoPanoTags.forEach(function (tag) {
- return tag.update();
- });
- if (progress > 1) {
- progress = 0;
- }
- progress += speed;
- if (bigCircleProgress > 1.0) {
- if (noGif) {
- //为false的话在别处调控
- bigCircleProgress = 0;
- smallCircleProgress = smallCircleProgress0; //间隔
- }
- } else {
- bigCircleProgress += speed;
- smallCircleProgress += speed;
- }
- }
- var VideoPanoTag = /*#__PURE__*/function (_EventEmitter) {
- _inherits(VideoPanoTag, _EventEmitter);
- var _super2 = _createSuper$1L(VideoPanoTag);
- function VideoPanoTag(model, sid, tagData) {
- var _this2;
- _classCallCheck(this, VideoPanoTag);
- _this2 = _super2.call(this);
- _this2.model = model;
- _this2.sid = sid;
- _this2.floor = null;
- _this2.floors = [];
- _this2.position = new THREE.Vector3().copy(tagData.position); //position最好提到外面,像pano的position一样,因为有的计算函数就是这么用的
- _this2.content = {};
- _this2.initContent(tagData);
- _this2.snapInfo = tagData.snapInfo;
- _this2.style = tagData.style || 'default';
- _this2.color = new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216);
- tagData.color && _this2.color.setStyle(tagData.color);
- _this2.styleImageURL = tagData.styleImageURL;
- _this2.hoverColor = Colors._darken(_this2.content.color, 0.2);
- _this2.animTime = 0;
- _this2.animated = false;
- _this2.openning = 0;
- _this2.openTransition = null;
- _this2.mode = Viewmode$1.PANORAMA;
- _this2.obj3d = null; //THREE.Object3D 类型
- _this2.disc = null; //mesh类型
- _this2.discWorldPosition = null;
- _this2.discScale = 0.06;
- _this2.floorIndex = tagData.floorIndex;
- _this2.visibleTransition = null;
- _this2.hoveringDisc = !1;
- _this2.state = tagData.state;
- _this2.videoPano = tagData.pano;
- _this2.build();
- return _this2;
- }
- _createClass(VideoPanoTag, [{
- key: "initContent",
- value: function initContent(tagData) {
- //和billboard有关
- this.content.description = tagData.description;
- this.content.label = tagData.label;
- this.content.link = tagData.link;
- this.content.outLink = tagData.outLink;
- this.content.color = new THREE.Color().set(tagData.color || Colors.tagDefault); //this.content.floorIndex = tagData.floorIndex || 0;
- this.content.fileName = tagData.fileName || {}; //存储音频视频原文件名
- this.content.fileSrc = tagData.fileSrc || {}; //存储音频视频的完整地址。原先是七牛,现在是阿里云的oss了
- this.content.media = tagData.media || [];
- }
- }, {
- key: "getFloors",
- value: function getFloors() {
- var _this3 = this;
- //根据floor和visiblePanos 得到热点所在的所有可能楼层。 包括原先所在的floor和所有可见点所在楼层。
- this.floors = []; //拥有多楼层的原因: 热点会在tagVisibleOnCurrentFloor来隐藏热点,会使楼道间的热点只在部分位置可见。
- this.visiblePanos && this.visiblePanos.forEach(function (id) {
- if (_this3.model.panos.index[id]) {
- if (!_this3.floors.includes(_this3.model.panos.index[id].floor)) {
- _this3.floors.push(_this3.model.panos.index[id].floor);
- }
- }
- });
- if (this.floor && !this.floors.includes(this.floor)) this.floors.push(this.floor);
- }
- }, {
- key: "rePos",
- value: function rePos(pos) {
- //add by xzw 重新定位置
- this.position.copy(pos);
- this.obj3d.position.copy(pos);
- }
- }, {
- key: "createMarkLine",
- value: function createMarkLine(o) {
- this.markLine = new VideoMarkLine({
- type: o.type,
- stemLineLen: o.stemLineLen,
- markerPos: o.markerPos,
- tag: this,
- model: this.model
- });
- return this.markLine;
- }
- }, {
- key: "build",
- value: function build() {
- this.floor = this.videoPano.floor;
- this.floorIndex = this.floor.floorIndex;
- if (this.floor) {
- this.obj3d = this.buildObject3D();
- this.floor.add(this.obj3d);
- }
- this.getFloors();
- return this;
- }
- }, {
- key: "buildObject3D",
- value: function buildObject3D() {
- var _this4 = this;
- var group = new THREE.Object3D();
- group.position.copy(this.position);
- var config = this.model.$app.config;
- this.animated = true;
- var planeGeo = config.isMobile ? new THREE.PlaneBufferGeometry(2.4, 2.4) : new THREE.PlaneBufferGeometry(1, 1);
- this.disc = new THREE.Mesh(planeGeo, getVideoSpotMat());
- this.disc.layers.set(RenderLayers.PANOMARKERS);
- this.disc.renderOrder = RenderOrder.panoMarker; //tagDisc 不要遮住overlay等
- player$n.on('mode.changing', function (from, to) {
- _this4.disc.renderOrder = to != 'floorplan' ? RenderOrder.panoMarker : 5; //floorplan时需要提高,其他时候需要比透明楼层低
- });
- this.disc.tag = this;
- this.disc.pano = this.videoPano;
- this.disc.name = 'disc';
- group.add(this.disc);
- group.name = 'tagGroup';
- return group;
- }
- }, {
- key: "hide",
- value: function hide(e, t) {
- if (this.hidden) return;else this.hidden = true; // var i = KanKan.Deferred()
- // if (0 === this.disc.material.uniforms.opacity.value && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
- // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
- if (this.markLine) this.markLine.hide(); //add
- //xst
- if (this.disc) {
- this.disc.visible = false;
- }
- }
- }, {
- key: "show",
- value: function show(e, t) {
- if (!this.hidden) return;else this.hidden = false; // var i = KanKan.Deferred()
- // if (this.disc.material.uniforms.opacity.value === 1 && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
- // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
- if (this.markLine) this.markLine.show(); //add
- //xst
- if (this.disc) {
- this.disc.visible = true;
- }
- }
- }, {
- key: "update",
- value: function update() {
- if (!this.disc) return;
- this.discWorldPosition = this.disc.getWorldPosition(new THREE.Vector3());
- this.updateDisc();
- }
- /* 更新disc的大小和朝向
- 朝向: billboard的效果,只需要mesh.quaternion = camera.quaternion
- 大小:在保证距离不变的情况下,要消除屏幕边缘放大的效果,需要结合camera和屏幕(应该和projection有关),如下一顿操作
- 然后再考虑距离,smoothstep化近大远小
- */
- }, {
- key: "updateDisc",
- value: function updateDisc() {
- var mode = this.model.mode;
- var camera = this.model.player.mode == 'floorplan' ? this.model.player.cameraControls.activeControl.camera : this.model.player.camera; //floorplan 时要用到OrthographicCamera
- var u = settings$3.tags.visibility,
- d = settings$3.tags.disc.scale,
- p = mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN ? settings$3.tags.visibility.visibleDistance : camera.position.distanceTo(this.discWorldPosition); //改 许钟文
- // 只是用来设置obj3d.visible。显隐控制要设置marker
- 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));
- if (this.obj3d.visible && this.disc.visible) {
- //add this.disc.visible
- //this.markLine.stemLine.quaternion.copy(camera.quaternion)
- 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)
- var _player = this.model.$app.core.get('Player');
- if (_player.modeTran.split('-')[1] == 'floorplan') {
- this.disc.quaternion.copy(camera.quaternion);
- } else {
- this.disc.lookAt(camera.position); //for video tag 看起来和marker一样有点歪斜、立体点
- } //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
- //scale:
- var scale = math$2.getScaleForConstantSize({
- maxSize: d.maxSize,
- minSize: this.state == 'videoPanoFlag' && mode != Viewmode$1.PANORAMA ? 30 : d.minSize,
- nearBound: d.nearBound,
- farBound: d.farBound,
- position: this.discWorldPosition,
- player: _player
- });
- var response = 1 + settings$3.tags.disc.scale.responsiveness / 100 * (VideoPanoTag.viewportScale() - 1);
- this.discScale = scale * response;
- try {
- //editor player可能还没有
- if (this.model.player.linkEditor.setTagVisible) {
- //许钟文add 编辑热点可视时放大热点
- this.discScale *= 1.5; // config.isMobile ? 2 : 1.5
- } else if (this.isMeasurePoint) {
- this.discScale *= 0.9;
- } else if (this.model.$app.TagManager.editHandle && this.model.$app.TagManager.editHandle.editing) {
- this.discScale *= 2.5;
- }
- } catch (mode) {}
- this.disc.scale.set(2 * this.discScale, 2 * this.discScale, 2 * this.discScale); //使stem的顶部在圆圈底部
- var circleRadius = this.discScale * 0.95;
- this.markLine.stemLine.scale.y = (stemLineLen - circleRadius) / stemLineLen; //不要覆盖住圆圈
- this.markLine.stemLine.position.copy(this.markLine.stemLine.originPos);
- this.markLine.stemLine.position.y -= circleRadius / 2; // if (this.animated) {
- // this.animTime += 0.016
- // this.disc.material.uniforms['uTime'].value = this.animTime
- // }
- }
- }
- }, {
- key: "tagVisibleOnCurrentFloor",
- value: function tagVisibleOnCurrentFloor(e) {
- return !(e === Viewmode$1.DOLLHOUSE || e === Viewmode$1.FLOORPLAN) || this.model.allFloorsVisible || !!this.floors.find(function (floor) {
- return !floor.hidden;
- });
- } // updateVideoFlagVisible() {
- // if (!this.obj3d.visible || this.model.player.mode != 'dollhouse') return
- // if (this.model.allFloorsVisible && convertTool.ifShelter(this.position, this.model.player, null, null, this.model.currentFloor.floorIndex)) {
- // this.videoPano.marker.visible = false
- // } else {
- // this.videoPano.marker.visible = !!this.videoPano.marker.visibleOri
- // }
- // }
- }], [{
- key: "viewportScale",
- value: function viewportScale() {
- var player = document.getElementsByClassName('player')[0];
- 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;
- }
- }]);
- return VideoPanoTag;
- }(EventEmitter);
- var VideoMarkLine = /*#__PURE__*/function () {
- function VideoMarkLine(o) {
- _classCallCheck(this, VideoMarkLine);
- this.tag = o.tag;
- this.groundPoint = o.groundPoint || o.markerPos; //垂线和地面交点
- // this.stemLine = LineDraw.createLine([o.stemLineLen ? this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen, 0)) : o.tag.position, this.groundPoint], {
- // width: 2,
- // color: o.stemLineColor || '#eee',
- // }) //垂线
- this.stemLine = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.006, o.stemLineLen), getStemMat());
- this.stemLine.position.copy(this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen / 2, 0)));
- this.stemLine.originPos = this.stemLine.position.clone();
- this.stemLine.name = 'markGroup-stemLine';
- this.stemLine.layers.set(RenderLayers.PANOMARKERS);
- this.stemLine.renderOrder = RenderOrder.panoMarker;
- this.tag.obj3d.parent.add(this.stemLine);
- }
- _createClass(VideoMarkLine, [{
- key: "hide",
- value: function hide() {
- this.stemLine.visible = false;
- }
- }, {
- key: "show",
- value: function show() {
- this.stemLine.visible = true;
- }
- }]);
- return VideoMarkLine;
- }(); //闪烁的marker
- var VideoPanoMarkerMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
- _inherits(VideoPanoMarkerMaterial, _THREE$RawShaderMater);
- var _super3 = _createSuper$1L(VideoPanoMarkerMaterial);
- function VideoPanoMarkerMaterial() {
- var _this5;
- _classCallCheck(this, VideoPanoMarkerMaterial);
- _this5 = _super3.call(this);
- var u = THREE.UniformsUtils.clone(shaders.videoPanoMarker.uniforms);
- u.map.value = getMarkerTex('normalMarker');
- u.opacity.value = 1;
- _this5.vertexShader = shaders.videoPanoMarker.vertexShader;
- _this5.fragmentShader = shaders.videoPanoMarker.fragmentShader;
- _this5.uniforms = u;
- _this5.transparent = true;
- _this5.depthTest = false; //browser.detectIOS() && (this.defines['useColor2'] = '')
- initOpacityProp(_assertThisInitialized(_this5));
- animateMaterialQuene.push(_assertThisInitialized(_this5));
- return _this5;
- }
- return VideoPanoMarkerMaterial;
- }(THREE.RawShaderMaterial);
- var VideoLineMaterial = /*#__PURE__*/function (_THREE$RawShaderMater2) {
- _inherits(VideoLineMaterial, _THREE$RawShaderMater2);
- var _super4 = _createSuper$1L(VideoLineMaterial);
- function VideoLineMaterial() {
- var _this6;
- _classCallCheck(this, VideoLineMaterial);
- _this6 = _super4.call(this);
- var u = THREE.UniformsUtils.clone(shaders.videoStemLine.uniforms);
- _this6.vertexShader = shaders.videoStemLine.vertexShader, _this6.fragmentShader = shaders.videoStemLine.fragmentShader, _this6.uniforms = u;
- _this6.transparent = true;
- _this6.depthTest = false;
- _this6.side = THREE.DoubleSide;
- animateMaterialQuene.push(_assertThisInitialized(_this6));
- return _this6;
- }
- return VideoLineMaterial;
- }(THREE.RawShaderMaterial);
- /* //视频播放按钮
- class VideoPlayerMaterial extends THREE.RawShaderMaterial {
- constructor() {
- super()
- var u = THREE.UniformsUtils.clone(shaders.tagVideoMarker.uniforms)
- ;(this.vertexShader = shaders.tagVideoMarker.vertexShader), (this.fragmentShader = shaders.tagVideoMarker.fragmentShader), (this.uniforms = u)
- this.transparent = true
- this.depthTest = false
- this.side = THREE.DoubleSide
- this.uniforms.map.value = getMarkerTex('shineMarker')
- animateMaterialQuene.push(this)
- }
- }
- */
- var VideoPlayerMaterial = /*#__PURE__*/function (_THREE$MeshBasicMater) {
- _inherits(VideoPlayerMaterial, _THREE$MeshBasicMater);
- var _super5 = _createSuper$1L(VideoPlayerMaterial);
- function VideoPlayerMaterial() {
- var _this7;
- _classCallCheck(this, VideoPlayerMaterial);
- var map = texture.load(texture.getImageURL('images/videoTag.png'));
- var animateInfo = {
- cellXcount: 6,
- cellYcount: 5,
- voidCount: 0,
- loop: true,
- duration: 1200,
- //动画时长
- delay: 600,
- //延迟
- waitNextTime: 1700 //间隔
- };
- _this7 = _super5.call(this, {
- map,
- transparent: true,
- depthTest: false
- }); //飞出要被模型遮挡
- _this7.animation = common$1.GifTexDeal.addAnimation(map, _assertThisInitialized(_this7), animateInfo, 0);
- _this7.animation.startCallback = function () {
- bigCircleProgress = 0;
- smallCircleProgress = smallCircleProgress0; //间隔
- };
- noGif = false;
- common$1.GifTexDeal.start(_this7.animation);
- player$n.on('mode.changing', function (from, to) {
- _this7.depthTest = to != 'floorplan' && to != 'panorama'; //因为即使提高了renderOrder还是会被透明的楼层遮住所以设置一下这个(renderOrder需要比透明楼层低才能不被遮,但又要比当前楼层高,而当前楼层要比透明的高,所以不可能)
- });
- return _this7;
- }
- return VideoPlayerMaterial;
- }(THREE.MeshBasicMaterial);
- var GLCubeFaces$1 = {
- GL_TEXTURE_CUBE_MAP_POSITIVE_X: 0,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 2,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 3,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 4,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5
- };
- var TileUtils = {
- TILE_SIZE: 512,
- FACES_PER_PANO: 6,
- LocationOnTile: {
- Center: 0,
- UpperLeft: 1,
- UpperRight: 2,
- LowerRight: 3,
- LowerLeft: 4
- },
- /* initTileClass(tileClass){//add
- this.tileClass = tileClass
- }, */
- getTileSize(panoSize) {
- return panoSize == 6144 ? 768 : TileUtils.TILE_SIZE;
- }
- }
- /*
- * 获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的指定位置)。spherical通过先求uv,再直接得到dir
- * @param {*} size 面分辨率
- * @param {*} cubeFace 所在面
- * @param {*} Center 在tile上的目标位置,默认为中心,其他位置就是四个顶点
- * @param {*} c 似乎是在tile的缩进百分比,根据所在面的不同,分别向不同方向缩进,但都是向tile的中心
- * @param {*} dir 所求方向
- */
- ;
- TileUtils.getTileVector = function () {
- //获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的中心)
- return function (size, tileSize, cubeFace, tileX, tileY, Center, c, dir) {
- //c似乎是缩进百分比
- Center = Center || TileUtils.LocationOnTile.Center; //假设该cube边长为2:
- var u = size / tileSize,
- d = tileX / u;
- tileY = -tileY + (u - 1);
- var p = tileY / u,
- f = tileSize / size,
- g = 2 * f,
- //一个tile的宽度 (乘以2是因为cube边长是2)
- m = g / 2,
- v = 2 * d - 1 + m,
- A = 2 * p - 1 + m;
- switch (Center //计算在tile中指定位置带来的偏移
- ) {
- case TileUtils.LocationOnTile.UpperLeft:
- v -= m, A += m, v += c * g; //似乎是向内缩进
- break;
- case TileUtils.LocationOnTile.UpperRight:
- v += m, A += m, A -= c * g;
- break;
- case TileUtils.LocationOnTile.LowerRight:
- v += m, A -= m, v -= c * g;
- break;
- case TileUtils.LocationOnTile.LowerLeft:
- v -= m, A -= m, A += c * g;
- break;
- case TileUtils.LocationOnTile.Center: //0
- }
- switch (cubeFace) {
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- MathLight.setVector(dir, -1, A, -v);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- MathLight.setVector(dir, 1, A, v);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- //顶面
- MathLight.setVector(dir, -v, 1, -A);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- MathLight.setVector(dir, -v, -1, A);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- MathLight.setVector(dir, -v, A, 1);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- MathLight.setVector(dir, v, A, -1);
- }
- MathLight.normalize(dir);
- };
- }(), TileUtils.getFaceForTile = function (size, index) {
- //获取该tile在第几个面
- var tileSize = this.getTileSize(size); //xzw改
- size < TileUtils.TILE_SIZE && (tileSize = size);
- var n = Math.floor(size / tileSize),
- sum = n * n; //得每个面tile总数
- return Math.floor(index / sum);
- }, TileUtils.getTileLocation = function (size, t, result) {
- var tileSize = this.getTileSize(size); //xzw改
- size < TileUtils.TILE_SIZE && (tileSize = size);
- var r = TileUtils.getFaceForTile(size, t),
- a = Math.floor(size / tileSize),
- s = a * a,
- l = t - r * s;
- result.tileX = l % a;
- result.tileY = Math.floor(l / a);
- result.face = r;
- result.faceTileIndex = l;
- if (result.tileY > 20) {
- console.log(333);
- }
- return result; //add
- }, TileUtils.getTileCountForSize = function (size) {
- //没招了,硬写. 传不了TILE_SIZE。
- var tileSize = this.getTileSize(size);
- if (size <= tileSize) return TileUtils.FACES_PER_PANO;
- var t = Math.floor(size / tileSize),
- i = t * t,
- n = i * TileUtils.FACES_PER_PANO;
- return n;
- }, TileUtils.getRelativeDirection = function () {
- var e = new MathLight.Matrix4(),
- t = new MathLight.Quaternion();
- return function (i, n) {
- //i是pano.quaternion, n是camera的direction
- t.copy(i), t.inverse(), e.makeRotationFromQuaternion(t), e.applyToVector3(n), MathLight.normalize(n);
- };
- }(), TileUtils.matchingTilesInDirection = function () {
- var e = new MathLight.Vector3(),
- t = new MathLight.Vector3(0, 0, -1),
- i = new MathLight.Quaternion(),
- n = function n(e, t) {
- e.push({
- face: t.face,
- faceTileIndex: t.faceTileIndex,
- tileX: t.tileX,
- tileY: t.tileY
- });
- },
- a = function () {
- var e = {
- face: -1,
- faceTileIndex: -1,
- tileX: -1,
- tileY: -1
- };
- return function (size, i, r) {
- for (var a = TileUtils.getTileCountForSize(size), s = 0, l = 0; l < a; l++) {
- TileUtils.getTileLocation(size, l, e), i && !i(e) || (s++, r && n(r, e));
- }
- return s;
- };
- }();
- return function (pano, size, dir, hFov, vFov, result) {
- var d = size < TileUtils.TILE_SIZE ? size : TileUtils.TILE_SIZE; //TileUtils.getTileCountForSize(size);
- if (!hFov && !vFov) return a(size, null, result);
- var p = !!vFov;
- 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);
- if (p) {
- //如果有vFov hFov
- i.setFromUnitVectors(e, t);
- var f = function f(e) {
- return TileUtils.isTileWithinFrustum(size, d, e.face, e.tileX, e.tileY, i, hFov, vFov); //在视野中的
- };
- return a(size, f, result);
- }
- var g = function g(t) {
- //如果仅有hFov
- return TileUtils.isTileWithinFOV(size, d, t.face, t.tileX, t.tileY, e, hFov);
- };
- return a(size, g, result);
- };
- }(), TileUtils.isTileWithinFrustum = function () {
- var e = new MathLight.Vector3(),
- t = 1e-5;
- return function (i, n, a, s, l, c, h, u) {
- 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++) {
- TileUtils.getTileVector(i, n, m, s, l, b, 0, e), //get e // size, tileSize, cubeFace, tileX, tileY, Center, c, dir
- MathLight.applyQuaternionToVector(c, e);
- if (e.z >= -t) //似乎是在相机背面
- ;else {
- var w = -1 / e.z,
- _ = e.x * w,
- T = e.y * w;
- T > d ? v++ : T < p && A++, //这四种似乎代表在这个画框之外,如在左、在上、在下、在右
- _ > f ? y++ : _ < g && C++, E++;
- }
- }
- return A !== E && v !== E && y !== E && C !== E; //如果有一项和E相等代表要么是在相机背面要么是tile的四个顶点都画在画布的同一边,所以肯定不在画布上
- };
- }(), TileUtils.isTileWithinFOV = function () {
- var e = new MathLight.Vector3(),
- t = new MathLight.Vector3(0, 1, 0),
- i = new MathLight.Vector3(1, 0, 0);
- return function (panoSize, tileSize, face, tileX, tileY, direction, fov) {
- //direction是作用了pano.quaternion的camera.direction
- var d = TileUtils.mapFaceToCubemapFace(face);
- MathLight.cross(direction, t, i); //get i 好像没用到
- TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, TileUtils.LocationOnTile.Center, 0, e);
- if (TileUtils.isWithinFOV(e, direction, fov, null)) //先判断tile中心在不在FOV内
- return !0;
- for (var p = fov / 360, f = Math.floor(1 / p), g = 0, m = 0; m < f; m++) {
- for (var v = TileUtils.LocationOnTile.UpperLeft; v <= TileUtils.LocationOnTile.LowerLeft; v++) {
- if (TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, v, g, e), TileUtils.isWithinFOV(e, direction, fov, null)) return !0;
- }
- g += p; //可能是考虑到有可能tile比fov覆盖了fov(虽然一般不可能,除非fov特别小),所以将tile分成若干段,取tile中的点再检测下
- }
- return !1;
- };
- }(), TileUtils.isWithinFOV = function () {
- var e = new MathLight.Vector3(),
- t = new MathLight.Vector3();
- return function (dir, cameraDir, fov, a) {
- if (MathLight.copyVector(dir, t), a) {
- MathLight.copyVector(a, e), MathLight.normalize(e);
- var s = MathLight.dot(e, dir);
- e.x *= s, e.y *= s, e.z *= s, MathLight.subVector(t, e);
- }
- var l = fov / 2 * MathLight.RADIANS_PER_DEGREE,
- c = Math.cos(l),
- h = MathLight.dot(t, cameraDir);
- return h >= c;
- };
- }(), TileUtils.mapFaceToCubemapFace = function () {
- var e = {
- 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
- 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
- 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
- 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
- 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
- 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
- };
- return function (t) {
- return e[t];
- };
- }();
- var Vectors$1 = {
- UP: new THREE.Vector3(0, 1, 0),
- DOWN: new THREE.Vector3(0, -1, 0),
- LEFT: new THREE.Vector3(-1, 0, 0),
- RIGHT: new THREE.Vector3(1, 0, 0),
- FORWARD: new THREE.Vector3(0, 0, -1),
- BACK: new THREE.Vector3(0, 0, 1),
- ZERO: new THREE.Vector3(0, 0, 0)
- };
- 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); }; }
- 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; } }
- var rot90$1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 2);
- var labelProp$1 = {
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- //textBorderColor:{r:30 , g:30, b: 30, a: 1 },
- //textBorderThick:3,
- //textshadowColor: '#888',
- fixOrient: true,
- renderOrder: RenderOrder.panoMarker,
- //panoLabel,
- fontsize: 30
- };
- var labelProp2 = {
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0.4
- },
- textColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- },
- borderRadius: 15,
- renderOrder: RenderOrder.panoMarker
- }; // 显示点位
- var addLabel$3 = browser$1.urlHasValue('panoLabel');
- var Panorama = /*#__PURE__*/function (_EventEmitter) {
- _inherits(Panorama, _EventEmitter);
- var _super = _createSuper$1K(Panorama);
- function Panorama($app, sweepuuid, sweepLocation, videoInfo, supportsTiles) {
- var _this;
- _classCallCheck(this, Panorama);
- _this = _super.call(this);
- _this.raycastToFindFloor = function () {
- 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)];
- return function () {
- //logger.warn("Performance warning: Raycasting to find floor index");
- for (var t = 0; t < e.length; t++) {
- var i = new THREE.Raycaster(this.position.clone(), e[t].clone()),
- n = i.intersectObjects(this.model.colliders);
- if (n.length) return n[0].object.parent.floor;
- }
- return null;
- };
- }();
- _this.findNeighourPanos = function () {
- return this.model.panos.setNeighbour(this.id, this.id, !1), this.model.panos.forEach(function (e) {
- if (e !== this && (!this.model.panos.neighbourMap[this.id] || void 0 === this.model.panos.neighbourMap[this.id][e.id])) {
- var t = this.position.distanceTo(e.position);
- if (t > settings$3.panoramaNeighbourMaxDistance) return this.model.panos.setNeighbour(this, e, !1), void Panorama.raycastsSkipped++;
- var i = e.position.clone().sub(this.position).normalize(),
- o = new THREE.Raycaster(this.position, i.clone(), 0, t),
- s = o.intersectObjects(this.model.colliders);
- 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)));
- }
- }.bind(this)), this.model.panos.neighbourMap[this.id];
- };
- _this.enter = function () {
- /* var e = null
- return function () {
- this.setZoomed(!1),
- this.emit('enter', {
- oldPano: e,
- newPano: this,
- }),
- (e = this)
- } */
- var old = null;
- return function () {
- this.setZoomed(!1), this.emit(PanoramaEvents.Enter, old, this), old = this;
- this.model.setHighMap(this); //add
- this.model.dispatchEvent({
- type: 'panoEntered'
- });
- };
- }();
- _this.loadTiledPano = function () {
- var downloaded = {},
- eventAdded = {},
- latestPartialRequest = {}; //每个pano对应一组这些
- return function (size, dir, fov, o, a, s) {
- null !== o && void 0 !== o || (o = !0), null !== a && void 0 !== a || (a = !0);
- var l = this.getWaitDeferred(size),
- c = l.deferred,
- h = null,
- u = null;
- fov && ('number' == typeof fov ? h = fov : (h = fov.hFov, u = fov.vFov));
- if (!this.isLoaded(size)) {
- //console.log('开始加载贴图', this.id, size )
- if (!l.active) {
- l.active = !0;
- var name = this.id + ':' + size;
- downloaded[name] = downloaded[name] || [];
- /*
- this.downloaded = downloaded
- this.latestPartialRequest = latestPartialRequest
- */
- latestPartialRequest[name] = null;
- if (fov) {
- var tileArr = []; //add
- var d = TileUtils.matchingTilesInDirection(this, size, dir, h, u, tileArr);
- latestPartialRequest[name] = tileArr;
- downloaded[name].forEach(function (e) {
- var item = latestPartialRequest[name].find(function (a) {
- return e.faceTileIndex == a.faceTileIndex && e.face == a.face;
- });
- if (item) {
- item.loaded = true;
- }
- });
- if (!latestPartialRequest[name].some(function (e) {
- return !e.loaded;
- })) {
- //所需要的全部加载成功
- //let total = TileUtils.getTileCountForSize(size)
- //this.onPanoRendered(this.id, size, total, !0);
- c.resolve(size
- /* , total */
- );
- this.resetWaitDeferred(size); //console.log('该部分早已经加载好了'+size, this.id)
- latestPartialRequest[name] = null;
- }
- logger$1.info('Loading partial pano: ' + this.id + ' with ' + d + ' tiles');
- }
- if (!eventAdded[this.id]) {
- eventAdded[this.id] = !0;
- this.on(PanoramaEvents.LoadComplete, function (e, t) {
- //本次任务全部加载完毕
- //console.warn('点位(可能部分)下载完成 ', 'id:' + this.id, 'count:' + t)
- var i = this.getWaitDeferred(e).deferred; //"pending"为还未完成
- i && 'pending' === i.state() && this.highestPartialTileRenderOpCompleted >= e && (i.resolve(e, t), this.resetWaitDeferred(e)); //恢复active为false
- }.bind(this));
- this.on(PanoramaEvents.LoadFailed, function (e) {
- var t = this.getWaitDeferred(e).deferred;
- t && 'pending' === t.state() && this.highestPartialTileRenderOpCompleted >= e && (t.reject(e), this.resetWaitDeferred(e)); //恢复active为false
- }.bind(this));
- this.on(PanoramaEvents.TileLoaded, function (size, tileIndex, total) {
- //每张加载完时
- //size == 512 && console.log('tileLoaded', 'id:' + this.id, 'size:' + size, 'index:' + tileIndex, this.copyForSplitView ? 'isCopy' : '')
- var name = this.id + ':' + size;
- downloaded[name] = downloaded[name] || []; //不是所有的加载都是从loadTiledPano获取的所以会有未定义的情况
- var _TileUtils$getTileLoc = TileUtils.getTileLocation(size, tileIndex, {}),
- faceTileIndex = _TileUtils$getTileLoc.faceTileIndex,
- face = _TileUtils$getTileLoc.face;
- downloaded[name].push({
- faceTileIndex,
- face
- });
- var r = this.getWaitDeferred(size).deferred;
- if (r && 'pending' === r.state()) {
- r.notify(size, tileIndex, total);
- if (latestPartialRequest[name]) {
- var item = latestPartialRequest[name].find(function (e) {
- return e.faceTileIndex == faceTileIndex && e.face == face;
- });
- item && (item.loaded = true);
- if (!latestPartialRequest[name].some(function (e) {
- return !e.loaded;
- })) {
- //所需要的局部tiles全部加载成功
- this.onPanoRendered(this.id, size, total, !0); //onPanoRendered还会触发 PanoramaEvents.LoadComplete
- r.resolve(size, total);
- this.resetWaitDeferred(size); //console.log('该部分加载好了'+size, this.id)
- latestPartialRequest[name] = null;
- }
- }
- }
- }.bind(this));
- }
- }
- this.tileDownloader.clearForceQueue();
- this.tileDownloader.forceQueueTilesForPano(this, size, dir, h, u, s);
- var quality = this.curTileQuality || this.qualityManager.getMaxNavPanoSize(); //xzw: add quality
- this.tiledPanoRenderTarget = this.panoRenderer.activateTiledPano(this, quality, o);
- this.panoRenderer.renderPanoTiles(this.id, dir, a, null, quality);
- } else {
- //console.log('早已经全加载好了' + size, this.id)
- c.resolve(size);
- }
- return c.promise();
- };
- }();
- _this.id = sweepuuid;
- _this.panoType = sweepLocation.panoType; //标记特殊 如 'assistant'校准热点时的相机协助点 '360view' 独立全景
- //alignmentType是用来标记户外的拍摄点是否校准了,这个数据存放在vision.modeldata里,我们四维看看没有这个数据
- //UNKNOWN = 0;ALIGNED = 1;UNALIGNED = 2;MANUALLY_PLACED = 3;
- //this.alignmentType = sweepLocation.alignmentType || AlignmentType.ALIGNED;
- _this.neighbourUUIDs = sweepLocation.neighbours || []; //null
- _this.neighbourPanos = null;
- _this.floor = null;
- _this.floorIndex = sweepLocation.subgroup || 0;
- _this.failedLoadingAt = 0;
- _this.maxLoadRetries = 4;
- _this.origin = sweepLocation.position.clone(); //this.position = this.alignmentType === AlignmentType.UNALIGNED ? new THREE.Vector3(0,-5,0) : sweepLocation.position.clone();
- _this.position = sweepLocation.position.clone();
- _this.quaternion = sweepLocation.quaternion.clone();
- _this.appId = sweepLocation.index + 1;
- _this.$app = $app;
- _this.model = _this.$app.core.get('Player').model;
- /*
- this.skyboxMesh = new THREE.Mesh(settings.sphereBufferGeometry) //skyboxMesh飞出后能表示当前position的小球
- this.skyboxMesh.position.copy(this.position)
- this.skyboxMesh.name = 'skybox'
- */
- _this.debugColor = new THREE.Color().setHSL(0.06 + 0.53 * Math.random(), 0.8 + 0.2 * Math.random(), 0.5 + 0.2 * Math.random());
- _this.floorPosition = sweepLocation.puck ? sweepLocation.puck.clone() : null;
- _this.marker = null; //许钟文:
- _this.noBlockPanos = []; //不穿墙 sweepLocation.noBlocks,//算法很不准,不用了
- _this.blocks = []; //会导致穿墙的mesh
- _this.seeMarkers = sweepLocation.seeMarkers;
- _this.tiled = sweepLocation.tiled != void 0 ? sweepLocation.tiled : _this.model.supportsTiles;
- if (_this.isAligned()) {
- _this.marker = new Marker(_assertThisInitialized(_this));
- }
- var rot90qua = new THREE.Quaternion().multiplyQuaternions(_this.quaternion, rot90$1); //改 为球目全景照片而改
- var rot90Matrix = new THREE.Matrix4().compose(_this.position, rot90qua, new THREE.Vector3(1, 1, 1)); //转90度后的
- if (_this.tiled) {
- /*var quaternion = new THREE.Quaternion().multiplyQuaternions(this.quaternion, rot90) //改 为球目全景照片而改
-
- this.skyboxMesh.quaternion.copy(quaternion)
- this.skyboxMesh.updateMatrix()
- this.skyboxMesh.updateMatrixWorld()
- this.rot90Matrix = this.skyboxMesh.matrixWorld.clone()
- */
- //this.panoMatrix = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion)
- _this.rot90Matrix = rot90Matrix; // 给热点校准用 因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- _this.matrixWorld = new THREE.Matrix4().compose(_this.position, _this.quaternion, new THREE.Vector3(1, 1, 1));
- } else {
- _this.solidSkybox = new THREE.Texture([null, null, null, null, null, null]);
- _this.solidSkybox.flipY = !1;
- if (settings$3.minimalMemoryMode) {
- _this.solidSkybox.minFilter = THREE.LinearFilter;
- _this.solidSkybox.magFilter = THREE.LinearFilter;
- _this.solidSkybox.generateMipmaps = !1;
- } //-------许钟文-----全景贴图的quaternion不同-----
- /* var quaternion = sweepLocation.quaternion.clone()
- //var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,1,0), -Math.PI/2);
- this.quaternion = new THREE.Quaternion().multiplyQuaternions(quaternion, rot90) //改 为球目全景照片而改
- */
- _this.quaternion = rot90qua;
- _this.matrixWorld = rot90Matrix;
- }
- /* this.skyboxMesh.material.color = new THREE.Color(1, 1, 1)
- this.skyboxMesh.quaternion.copy(this.quaternion)
- this.skyboxMesh.name = 'skybox'
- this.skyboxMesh.visible = !1
- this.skyboxMesh.updateMatrix()
- this.skyboxMesh.updateMatrixWorld() */
- _this.zoomed = !1;
- _this.panoRenderer = null;
- _this.qualityManager = null;
- _this.tileDownloader = null;
- _this.tiledPanoRenderTarget = null;
- _this.resolutionPromise = {};
- _this.minimumTiledPanoLoaded = !1;
- _this.highestPartialTileRenderOpCompleted = 0;
- _this.highestFullTileRenderOpCompleted = 0;
- _this.shouldRedrawOnBaseLoaded = !1;
- _this.lockUntilRenderingComplete = !1;
- if (videoInfo) {
- _this.hasVideo = true; //是否有球幕视频
- _this.videoInfo = videoInfo;
- } else {
- _this.hasVideo = false; //是否有球幕视频
- }
- _this.panoVideo = false; //是否有去绿布视频
- /* settings.colorMarkerOnLoad && this.on('load', function () {
- this.marker.material.color.set(65280)
- }) */
- _this.filterEffect = {
- brightness: 0,
- contrast: 0,
- saturation: 0,
- temperature: 0
- };
- return _this;
- }
- _createClass(Panorama, [{
- key: "hasFilter",
- get: function get() {
- var _ref = this.$app.FilterManager.filterTemp[this.id] || this.filterEffect,
- brightness = _ref.brightness,
- contrast = _ref.contrast,
- saturation = _ref.saturation,
- temperature = _ref.temperature;
- return brightness !== 0 || contrast !== 0 || saturation !== 0 || temperature !== 0;
- }
- }, {
- key: "exit",
- value: function exit() {
- //console.log('exit', this.id)
- if (this.tiled) {
- this.clearWaitDeferreds();
- this.minimumTiledPanoLoaded = !1;
- this.tiledPanoRenderTarget = null;
- this.setZoomed(!1);
- this.panoRenderer.deactivateTiledPano(this);
- this.highestPartialTileRenderOpCompleted = 0;
- this.highestFullTileRenderOpCompleted = 0;
- } else {
- this.solidSkybox.dispose();
- this.solidSkybox.loaded = !1;
- this.solidSkybox.version = 0;
- }
- this.emit('exit');
- }
- }, {
- key: "hoverOn",
- value: function hoverOn(e) {
- if (
- /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
- settings$3[e].markerOpacityOnHover == 0 || this.$app.core.get('Player').locked) return;
- if (this.marker) {
- transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacityOnHover), 250);
- }
- }
- }, {
- key: "hoverOff",
- value: function hoverOff(e) {
- if (
- /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
- settings$3[e].markerOpacity == 0 || this.$app.core.get('Player').locked) return;
- this.marker && transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacity), 250);
- }
- }, {
- key: "build1",
- value: function build1() {
- this.floor = this.floor || this.model.floors.get(this.floorIndex) || this.raycastToFindFloor() || this.model.floors.list[0]; //this.model.getFloorAtPoint(this.position)
- if (this.floor) {
- this.floorIndex = this.floor.floorIndex; //xzw add 2023.12.28 否则wallManager错的楼层获取的错的data
- this.floor.addPano(this);
- if (settings$3.colorMarkerByFloor && this.marker) {
- this.marker.material.color.set(this.floor.debugColor);
- }
- }
- this.floorPosition = this.floorPosition || this.raycastFloorPosition();
- this.neighbourPanos = this.neighbourPanos || this.findNeighourPanos();
- }
- }, {
- key: "build2",
- value: function build2() {
- var _this2 = this;
- this.floorPosition = this.floorPosition || this.interpolateFloorPosition();
- this.height = this.position.distanceTo(this.floorPosition);
- this.placeMarker();
- if (this.isAligned()) {
- this.$app.config.view || this.addLabel();
- setTimeout(function () {
- addLabel$3 && _this2.addLabel2();
- }, 1);
- }
- }
- }, {
- key: "placeMarker",
- value: function placeMarker() {
- if (this.marker) {
- this.marker.position.copy(this.floorPosition);
- this.marker.position.y += 0.01;
- this.marker.lookAt(new THREE.Vector3(0, 1, 0).add(this.marker.position));
- }
- }
- }, {
- key: "attachToPanoRenderer",
- value: function attachToPanoRenderer(panoRenderer) {
- this.panoRenderer = panoRenderer;
- this.panoRenderer.on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
- this.panoRenderer.on(PanoRendererEvents.PanoRenderComplete, this.onPanoRendered.bind(this));
- this.panoRenderer.on(PanoRendererEvents.TileRenderFailure, this.onTileRenderFail.bind(this));
- this.panoRenderer.on(PanoRendererEvents.UploadAttemptedForAllTiles, this.onUploadAttemptedForAllTiles.bind(this));
- }
- }, {
- key: "updateMakerStyle",
- value: function updateMakerStyle(type) {
- if (!this.marker) return;
- if (type == 'animate') {
- this.marker.updateStyle(this.model, 'animate', this);
- } else if (this.hasVideo && this.panoVideoRenderer.ifEnable() || this.panoVideo) {
- this.marker.updateStyle(this.model, 'video', this);
- } else {
- this.marker.updateStyle(this.model, 'normal', this);
- }
- }
- /* updateMarkerVisible(ifShow, player) {
- //video
- if (!this.flagSpot) return
- if (!this.isAligned()) return
- // 强制隐藏
- if (!ifShow) {
- this.marker.visible = false
- return
- }
- // 漫游可行时要全部显示
- if (player.linkEditor && player.linkEditor.setPanoVisible) {
- this.marker.visible = true
- return
- }
- // 没有邻居点时隐藏
- if (!player.linkEditor.checkHasNeighbor(this)) {
- this.marker.visible = false
- // if (player.mode != 'panorama') this.marker.visible = true
- // if (!this.flagSpot) this.marker.visible = false
- return
- }
- // PANORAMA时,当前点位不可视时隐藏
- if (player.currentPano == Viewmode.PANORAMA && !this.neighbourPanos[player.currentPano.id]) {
- this.marker.visible = false
- return
- }
- this.marker.visible = true
- // if (this.flagSpot) this.flagSpot.updateVideoFlagVisible() //注:不用hasVideo来判断,因有的手机没有flagSpot
- } */
- }, {
- key: "createVrMarker",
- value: function createVrMarker(vrTexture, player) {
- var _this3 = this;
- if (this.isAligned()) {
- this.vrMarker = new THREE.Sprite(new THREE.SpriteMaterial({
- color: new THREE.Color('#00c8af'),
- //16777215,
- transparent: !0,
- opacity: 0.55,
- map: vrTexture,
- depthTest: false
- }));
- this.vrMarker.name = 'vrMarker';
- this.vrMarker.scale.set(0.16, 0.16, 1), this.vrMarker.boluoType = 'vr'; //this.vrMarker.position.z = 1,
- this.vrMarker.position.copy(this.position), this.vrMarker.position.y -= 0.2, this.vrMarker.enabled = !0;
- this.vrMarker.visible = !1;
- this.vrMarker.renderOrder = RenderOrder.vrMarker //add
- ;
- this.vrMarker.pano = this, //xzw add
- this.model.vrMarkers.push(this.vrMarker);
- this.model.add(this.vrMarker);
- this.vrMarker.addEventListener('click', function () {
- if (window.VRScreenType != 'portrait') {
- player.flyToPano({
- pano: _this3
- });
- }
- });
- }
- }
- }, {
- key: "hasNeighbor",
- value: function hasNeighbor() {
- var _this4 = this;
- return this.neighbourUUIDs.filter(function (id) {
- return id != _this4.id;
- }).length > 0;
- }
- /**
- * lv yuanyuan
- * 球幕视频
- */
- }, {
- key: "attachToPanoVideoRenderer",
- value: function attachToPanoVideoRenderer(panoVideoRenderer) {
- if (!this.hasVideo) return;
- this.panoVideoRenderer = panoVideoRenderer; //this.panoVideoRenderer.on(PanoVideoRendererEvents.ResumeRender, this.onVideoRendered.bind(this));
- this.on(PanoramaEvents.Enter, panoVideoRenderer.onVideoPanoramasEnter.bind(panoVideoRenderer));
- this.on(PanoramaEvents.Exit, panoVideoRenderer.onVideoPanoramasExit.bind(panoVideoRenderer));
- }
- }, {
- key: "getWaitDeferred",
- value: function getWaitDeferred(size) {
- var t = this.resolutionPromise[this.id];
- t || (t = {}, this.resolutionPromise[this.id] = t);
- var i = t[size];
- return i || (i = {
- deferred: Deferred$1(),
- active: !1
- }, t[size] = i), i;
- }
- }, {
- key: "resetWaitDeferred",
- value: function resetWaitDeferred(e) {
- var t = this.getWaitDeferred(e);
- t.active = !1;
- t.deferred = Deferred$1();
- }
- }, {
- key: "clearWaitDeferreds",
- value: function clearWaitDeferreds() {
- var e = this.resolutionPromise[this.id];
- e || (e = {}, this.resolutionPromise[this.id] = e);
- for (var t in e) {
- if (e.hasOwnProperty(t)) {
- var i = e[t];
- i.active = !1, i.deferred = Deferred$1();
- }
- }
- }
- }, {
- key: "onUploadAttemptedForAllTiles",
- value: function onUploadAttemptedForAllTiles(e, t, i) {
- if (e === this.id) {
- var n = this.qualityManager.getPanoSize(PanoSizeClass.BASE);
- if (t === n && this.shouldRedrawOnBaseLoaded) {
- this.shouldRedrawOnBaseLoaded = !1;
- this.panoRenderer.resetRenderStatus(this.id, !0, !1);
- this.panoRenderer.renderPanoTiles(this.id, null, !0, !0);
- }
- }
- }
- }, {
- key: "onTileRendered",
- value: function onTileRendered(e, t, i, n) {
- e === this.id && this.emit(PanoramaEvents.TileLoaded, t, i, n);
- }
- }, {
- key: "onPanoRendered",
- value: function onPanoRendered(e, t, i, n) {
- if (e === this.id) {
- //console.log('onPanoRendered', this.id)
- this.minimumTiledPanoLoaded = !0;
- this.updateSkyboxForZoomLevel();
- t > this.highestPartialTileRenderOpCompleted && (this.highestPartialTileRenderOpCompleted = t);
- !n && t > this.highestFullTileRenderOpCompleted && (this.highestFullTileRenderOpCompleted = t);
- this.emit('load', t);
- this.model.emit('load', this);
- this.emit(PanoramaEvents.LoadComplete, t, i);
- }
- }
- }, {
- key: "setZoomed",
- value: function setZoomed(e) {
- this.zoomed = e;
- this.updateSkyboxForZoomLevel();
- if (e) {
- //add
- if (this.$app.core.get('QualityManager').navTileClass != '1k') {
- this.model.showHighMap();
- }
- } else {
- this.model.hideHighMap();
- }
- }
- }, {
- key: "ensureSkyboxReadyForRender",
- value: function ensureSkyboxReadyForRender() {
- if (this.tiled) ; else {
- this.solidSkybox.loaded || (this.solidSkybox.needsUpdate = !0);
- this.solidSkybox.loaded = !0;
- }
- }
- }, {
- key: "updateSkyboxForZoomLevel",
- value: function updateSkyboxForZoomLevel() {
- this.minimumTiledPanoLoaded && this.model.updateProjectedPanos(this); //xzw add this
- }
- }, {
- key: "getSkyboxTexture",
- value: function getSkyboxTexture() {
- if (this.tiled) {
- if (this.minimumTiledPanoLoaded) {
- if (this.zoomed && this.qualityManager.maxRenderTargetSize > this.qualityManager.maxNavPanoSize) {
- //change 如果放大后和不放大都是2k就不用这个
- return this.panoRenderer.zoomRenderTarget.texture;
- } else {
- return this.tiledPanoRenderTarget && this.tiledPanoRenderTarget.texture;
- }
- } else {
- return null;
- }
- } else {
- return this.solidSkybox;
- }
- }
- }, {
- key: "onTileRenderFail",
- value: function onTileRenderFail(e, t, i) {
- e === this.id && this.emit(PanoramaEvents.LoadFailed, t);
- } //e是'high'或者'low'
- /* isLoaded(e) {
- if (this.tiled) {
- if (e && 'string' == typeof e) throw new BasicException('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass')
- return !!this.minimumTiledPanoLoaded && (!e || this.highestPartialTileRenderOpCompleted >= e)
- }
- if (e && 'number' == typeof e) {
- console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.')
- }
- return !!this.solidSkybox.high || e in this.solidSkybox
- } */
- }, {
- key: "isLoaded",
- value: function isLoaded(e) {
- if (this.tiled) {
- if (e && 'string' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass');
- return !!this.minimumTiledPanoLoaded && (!e || this.highestFullTileRenderOpCompleted >= e); //改:原本是:this.highestPartialTileRenderOpCompleted >= e, 希望这代表全部加载完
- }
- if (e && 'number' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.');
- return !!this.solidSkybox.high || e in this.solidSkybox;
- }
- /* loadCube(e) {//旧的加载六张
- if (this.isLoaded(e)) {
- logger.info('Skipping load of pano, already loaded')
- return Deferred().when()
- }
- this.emit('loading', e)
- this.model.emit('loading', this)
- var t = this.getCubemapUrls(this.id, e),
- i = t.filter(function (e) {
- return !e
- })
- if ('low' === e && i.length > 0) {
- logger.info('Pano', this.id, 'not available in low res, loading high res right away')
- e = 'high'
- t = this.getCubemapUrls(this.id, e)
- }
-
-
- var n = 0,
- r = [0, 1, 2, 3, 4, 5].map(
- function (e, i, n) {
- return this.loadCubeImage(t[i])
- }.bind(this)
- )
- return Deferred()
- .when(r[0], r[1], r[2], r[3], r[4], r[5])
- .then(
- function (t, i, n, r, o, a) {
- return (
- (this.solidSkybox[e] = [t, i, n, r, o, a]),
- ('high' !== e && this.solidSkybox.high) || ((this.solidSkybox.image = this.solidSkybox[e]), (this.solidSkybox.low = null)),
- (this.solidSkybox.needsUpdate = !0),
- this.emit('load', e),
- this.model.emit('load', this),
- this
- )
- }.bind(this),
- function () {
- logger.error('Downloading cubemap for pano', this.id, 'failed'), (this.failedLoadingAt = Date.now())
- }.bind(this),
- function () {
- return Deferred().when(++n, 6)
- }
- )
- } */
- }, {
- key: "loadCube",
- value: function () {
- var _loadCube = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(imgRatio) {
- var cubeImgUrl, player, ext;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- if (!this.isLoaded(imgRatio)) {
- _context2.next = 3;
- break;
- }
- logger$1.info('Skipping load of pano, already loaded');
- return _context2.abrupt("return", Defer.when());
- case 3:
- this.emit('loading', imgRatio);
- this.model.emit('loading', this);
- cubeImgUrl = this.getCubemapUrls(imgRatio);
- if (!(this.panoType == '360view')) {
- _context2.next = 12;
- break;
- }
- //xzw add
- //cubeImgUrl = cubeImgUrl.replace("tiles/", (config.isEdit ? ("panorama_edit/"+this.id) : ("panorama/"+this.id) ) + "/tiles/" );
- player = this.$app.core.get('Player');
- if (player.viewLinkManager.views[this.id]) {
- _context2.next = 10;
- break;
- }
- return _context2.abrupt("return");
- case 10:
- ext = player.viewLinkManager.views[this.id].panoImgVersion;
- ext && (cubeImgUrl += '&' + ext);
- case 12:
- return _context2.abrupt("return", http.getImage(cubeImgUrl).then( /*#__PURE__*/function () {
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(imgData) {
- var maxWidth;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- if (!this.mapSrc) {
- _context.next = 5;
- break;
- }
- //360view edit preview
- maxWidth = browser$1.maybeQilin() ? 4096 : 8192;
- _context.next = 4;
- return common$1.compressImg(imgData, maxWidth);
- case 4:
- imgData = _context.sent;
- case 5:
- this.solidSkybox[imgRatio] = imgData;
- this.solidSkybox.minFilter = THREE.LinearFilter; //1006 防止竖条纹
- // "high" !== imgRatio && this.solidSkybox.high || (this.solidSkybox.image = this.solidSkybox[imgRatio],
- // this.solidSkybox.low = null),
- //1006 防止竖条纹
- // "high" !== imgRatio && this.solidSkybox.high || (this.solidSkybox.image = this.solidSkybox[imgRatio],
- // this.solidSkybox.low = null),
- if ('high' !== imgRatio && this.solidSkybox.high) ; else {
- this.solidSkybox.image = this.solidSkybox[imgRatio];
- this.solidSkybox.low = null;
- }
- this.solidSkybox.dispose(); //xzw add 需要加这句,否则在从外部飞入后,low无法切换为high,会警告Offset overflows texture dimensions. 似乎是因为在使用贴图时切换image尺寸造成的。
- //xzw add 需要加这句,否则在从外部飞入后,low无法切换为high,会警告Offset overflows texture dimensions. 似乎是因为在使用贴图时切换image尺寸造成的。
- this.solidSkybox.needsUpdate = !0;
- this.emit('load', imgRatio);
- this.model.emit('load', this); //this.emit(PanoramaEvents.LoadComplete,/* t, i */) //?
- return _context.abrupt("return", this);
- case 13:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- return function (_x2) {
- return _ref2.apply(this, arguments);
- };
- }().bind(this), function () {
- logger$1.error('Downloading cubemap for pano', this.id, 'failed'), this.failedLoadingAt = Date.now();
- }.bind(this), function () {
- console.log('load cubeTex 出现问题?'); //return $.when(++n, 6)//什么?
- }));
- case 13:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this);
- }));
- function loadCube(_x) {
- return _loadCube.apply(this, arguments);
- }
- return loadCube;
- }()
- }, {
- key: "loadCubeImage",
- value: function loadCubeImage(c) {
- var h = Deferred$1(),
- i = new Image();
- return i.onerror = function () {
- h.reject();
- }, i.onload = function () {
- h.resolve(i);
- }, i.crossOrigin = THREE.ImageUtils.crossOrigin, i.src = c, h;
- }
- }, {
- key: "getCubemapUrls",
- value: function getCubemapUrls(type) {
- /* return [2, 4, 0, 5, 1, 3].map(
- function (h) {
- return config.getResourceImageURL(this.model.sid + '/pan/' + type + '/' + this.id + '_skybox' + h + '.jpg')
- }.bind(this)
- ) */
- if (this.mapSrc) return this.mapSrc; // 360 edit
- // 判断随心装同屏需要降低全景图分辨率,否则过渡会卡顿
- var splitup = false;
- if (browser$1.valueFromUrl('m') && browser$1.valueFromUrl('m2')) {
- var metadata = this.$app.store.getValue('metadata');
- if (metadata.sceneFrom == 'sxz') {
- splitup = true;
- }
- }
- return this.$app.resource.getViewImagesURL("pan/".concat(type, "/").concat(this.id, ".jpg").concat(splitup ? '?x-oss-process=image/resize,m_lfit,w_4096' : ''));
- }
- }, {
- key: "worldPosition",
- value: function worldPosition() {
- return this.position;
- }
- }, {
- key: "isAligned",
- value: function isAligned() {
- return !this.panoType; //this.alignmentType === AlignmentType.ALIGNED
- }
- }, {
- key: "updateTileQuality",
- value:
- /* updateTileQuality(state, min) {
- let player = this.$app.core.get('Player')
- let navSize = this.qualityManager.getMaxNavPanoSize()
- if(typeof(state) == 'number'){
- this.curTileQuality = state
- }else if (state == 'full') {
- this.curTileQuality = navSize
- } else if (state == 'standard') {
- this.curTileQuality = player.lowTile == 'level2' ? 512 : player.lowTile ? 1024 : 2048
- } else if (state == 'low') {
- this.curTileQuality = 512
- }
- this.curTileQuality = Math.min(this.curTileQuality, navSize)
- if (min) this.curTileQuality = Math.min(this.curTileQuality, min)
- return this.curTileQuality
- } */
- function updateTileQuality(size) {
- this.$app.core.get('Player');
- var navSize = this.qualityManager.getMaxNavPanoSize();
- this.curTileQuality = Math.min(size, navSize);
- }
- }, {
- key: "getVideoFilter",
- value: function getVideoFilter(type) {
- var _this5 = this;
- //视频漫游点角度范围内隐藏遮挡物
- var panoVideoFilter, angle, dir;
- if (this.hasVideo && this.$app.core.get('PanoVideoRenderer').ifEnable()) {
- if (this.videoInfo.dir) {
- dir = this.videoInfo.dir.clone();
- angle = THREE.MathUtils.degToRad(this.videoInfo.hfov / 2);
- } else {
- var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
- var lookAtPoint = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(this.quaternion)).add(this.position);
- dir = lookAtPoint.clone().sub(this.position);
- angle = THREE.MathUtils.degToRad(65 / 2);
- }
- } else if (this.panoVideo) {
- dir = this.panoVideo.dir.clone();
- angle = THREE.MathUtils.degToRad(this.panoVideo.hfov / 2);
- }
- if (dir) {
- if (type == 'across') {
- //传送两个点,看是否在这两个点区间内包含视频
- panoVideoFilter = function panoVideoFilter(p1, p2) {
- var dir1 = new THREE.Vector3().subVectors(p1, _this5.position).setY(0).normalize();
- var dir2 = new THREE.Vector3().subVectors(p2, _this5.position).setY(0).normalize();
- var midVec = new THREE.Vector3().addVectors(dir1, dir2).normalize(); //以此反向假扮视频区域
- var angle_ = dir1.angleTo(midVec);
- var midPoint = new THREE.Vector3().addVectors(_this5.position, dir); //视频中点
- return Panorama.filters.isInFanAngle(_this5.position, midVec, angle_)(midPoint); //看视频中点是否落在p1p2区间
- };
- } else {
- panoVideoFilter = Panorama.filters.isInFanAngle(this.position, dir, angle);
- }
- }
- return panoVideoFilter;
- }
- }, {
- key: "addLabel",
- value: function addLabel() {
- //圈内的数字
- this.label = new TextSprite(Object.assign({
- player: this.$app.core.get('Player')
- }, labelProp$1, {
- text: this.appId
- }));
- var s = math$2.linearClamp(this.label.text.length, 2, 6, 0.4, 0.2); //应该不会多于6位数
- this.label.scale.set(s, s, s);
- this.marker.add(this.label);
- }
- }, {
- key: "addLabel2",
- value: function addLabel2() {
- //漂浮的数字
- this.removeLabel();
- this.label2 = new TextSprite(Object.assign({
- player: this.$app.core.get('Player'),
- sizeInfo: {
- minSize: 50,
- maxSize: 300,
- nearBound: 0.2,
- farBound: Math.max(20, this.model.size.length() / 3),
- farBoundPlan: 250
- }
- }, labelProp2, {
- text: "".concat(this.id, "-f").concat(this.floorIndex)
- })); //this.label2.sprite.material.depthTest = true
- var position = this.floorPosition.clone();
- position.y += 0.4;
- this.label2.position.copy(position);
- this.floor.add(this.label2);
- }
- }, {
- key: "removeLabel",
- value: function removeLabel() {
- this.label2 && (this.floor.remove(this.label2), this.label2.material.dispose(), this.label2 = null);
- }
- }]);
- return Panorama;
- }(EventEmitter);
- Panorama.raycastsSkipped = 0;
- Panorama.raycastsDone = 0;
- Panorama.filters = {
- inDirection: function inDirection(e, t, i) {
- return function (n) {
- var r = n.position.clone().sub(e).normalize();
- return r.dot(t) > i;
- };
- },
- inFloorDirection: function inFloorDirection(e, t, i) {
- return function (n) {
- var r = n.floorPosition.clone().sub(e).normalize();
- return r.dot(t) > i;
- };
- },
- inFloorDirection_2d: function inFloorDirection_2d(e, t, i) {
- return function (n) {
- var origin = new THREE.Vector2(n.floorPosition.x, n.floorPosition.z);
- var target = new THREE.Vector2(e.x, e.z); //var r = n.floorPosition.clone().sub(e).normalize()
- var r = origin.sub(target).normalize();
- return r.dot(new THREE.Vector2(t.x, t.z)) > i;
- };
- },
- inPanoDirection: function inPanoDirection(e, t, i) {
- return i = settings$3.navigation.panoScores ? settings$3.navigation.filterStrictness : i, function (n) {
- var r = n.floorPosition.clone().sub(e).normalize(),
- o = n.position.clone().sub(e).normalize();
- return r.dot(t) > i || o.dot(t) > i;
- };
- },
- atFloor: function atFloor(e) {
- return function (t) {
- return !e || t.floor === e;
- };
- },
- not: function not(e) {
- return function (t) {
- return t !== e;
- };
- },
- notIn: function notIn(e) {
- return function (t) {
- return e.indexOf(t) === -1;
- };
- },
- isLoaded: function isLoaded() {
- return function (e) {
- return e.isLoaded();
- };
- },
- isNotLoaded: function isNotLoaded() {
- return function (e) {
- return !e.isLoaded();
- };
- },
- isCloseEnoughTo: function isCloseEnoughTo(e, t) {
- return function (i) {
- return e.distanceTo(i.floorPosition) < t;
- };
- },
- isClampDisSquaredTo: function isClampDisSquaredTo(e, min, max) {
- //add
- return function (i) {
- var dis = e.distanceToSquared(i.floorPosition);
- return dis > min && dis < max;
- };
- },
- hasMinimumHeightDifferenceTo: function hasMinimumHeightDifferenceTo(e, t) {
- return function (i) {
- return Math.abs(i.position.y - e.y) > t;
- };
- },
- isNotBehindNormal: function isNotBehindNormal(e, t) {
- var i = new THREE.Vector3();
- return t = t.clone(), function (n) {
- var r = i.copy(n.position).sub(e).normalize();
- return r.dot(t) > 0;
- };
- },
- isNeighbourPanoTo: function isNeighbourPanoTo(e) {
- return function (t) {
- return !e || !e.neighbourPanos || !!e.neighbourPanos[t.id];
- };
- },
- isNeighbourOfNeighbourTo: function isNeighbourOfNeighbourTo(e) {
- return function (t) {
- return !!e.neighbourPanos[t.id] || e.neighbourUUIDs.some(function (i) {
- var n = e.model.panos.get(i);
- return !!n && n.neighbourPanos[t.id];
- });
- };
- },
- isNotRecentlyFailed: function isNotRecentlyFailed(e) {
- return function (t) {
- return Date.now() - t.failedLoadingAt > e;
- };
- },
- isOnVisibleFloor: function isOnVisibleFloor() {
- return function (e) {
- return !e.floor.hidden;
- };
- },
- isPanoAligned: function isPanoAligned() {
- return function (e) {
- return e.isAligned();
- };
- },
- /* isInFanAngle: function (curPos, dir, maxAngle) {
- //是否和中心方向的dir的角度不超过maxAngle
- return function (position) {
- var v1 = dir.setY(0)
- var v2 = position.clone().sub(curPos).setY(0)
- return v1.angleTo(v2) <= maxAngle
- }
- }, */
- isInFanAngle: function isInFanAngle(curPos, dir, maxAngle) {
- //是否和中心方向的dir的角度不超过maxAngle
- return function (position) {
- var v1 = dir.setY(0);
- var v2 = position.clone().sub(curPos).setY(0);
- return v1.angleTo(v2) <= maxAngle;
- };
- }
- };
- Panorama.sortFunctions = {
- distanceToPoint: function distanceToPoint(e) {
- return function (t, i) {
- return t.position.distanceTo(e) - i.position.distanceTo(e);
- };
- },
- floorDistanceToPoint: function floorDistanceToPoint(e) {
- return function (t, i) {
- return t.floorPosition.distanceTo(e) - i.floorPosition.distanceTo(e);
- };
- },
- choose: function choose(e) {
- return function (t, i) {
- return e.id === t.id ? -1 : e.id === i.id ? 1 : 0;
- };
- }
- };
- Panorama.scoreFunctions = {
- distance: function distance(e, t) {
- return t = t || settings$3.navigation.distanceFactor, function (i) {
- return e ? e.position.distanceTo(i.position) * t : 0;
- };
- },
- distanceSquared: function distanceSquared(e, t) {
- return t = t || settings$3.navigation.distanceFactor, function (i) {
- return e ? e.position.distanceToSquared(i.position) * t : 0;
- };
- },
- direction: function direction(e, t, r) {
- return function (i) {
- var n = i.position.clone().sub(e).normalize();
- return n.dot(t) * (r || settings$3.navigation.directionFactor);
- };
- },
- directionFloor: function directionFloor(e, t) {
- //add
- return function (i) {
- var n = i.floorPosition.clone().sub(e).normalize();
- return n.dot(t) * settings$3.navigation.directionFactor;
- };
- },
- angle: function angle(e, t) {
- return function (i) {
- var n = i.position.clone().sub(e).normalize();
- return n.angleTo(t) * settings$3.navigation.angleFactor;
- };
- },
- inFieldOfView: function inFieldOfView(e, t) {
- return function (i) {
- var n = i.position.clone().sub(e).normalize();
- return n.dot(t) > 0.75 ? 10 : -1;
- };
- },
- optionality: function optionality(e) {
- return function (t) {
- var i = t.neighbourUUIDs.filter(function (t) {
- return !(t in e.neighbourUUIDs) && t !== e.id;
- });
- return i.length * settings$3.navigation.optionalityFactor;
- };
- },
- penalizeHeightDifferenceUnder: function penalizeHeightDifferenceUnder(e, t) {
- return function (i) {
- return e.y - i.position.y < t ? -20 : 0;
- };
- }
- };
- 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); }; }
- 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; } }
- var PanoramaCollection = /*#__PURE__*/function (_IndexedCollection) {
- _inherits(PanoramaCollection, _IndexedCollection);
- var _super = _createSuper$1J(PanoramaCollection);
- function PanoramaCollection(app) {
- var _this;
- _classCallCheck(this, PanoramaCollection);
- _this = _super.call(this);
- _this.neighbourMap = {};
- _this.map = null;
- _this.animatePanoId = null;
- app && app.TourManager.player.then(function (player) {
- player.on('play2', function () {
- _this.list.forEach(function (e) {
- e.label && common$1.updateVisible(e.label, 'recordTour', false); //为了防止录屏时将点位录入 2023.10.8
- });
- });
- player.on('end', function () {
- _this.list.forEach(function (e) {
- e.label && common$1.updateVisible(e.label, 'recordTour', true);
- });
- });
- player.on('pause', function () {
- _this.list.forEach(function (e) {
- e.label && common$1.updateVisible(e.label, 'recordTour', true);
- });
- });
- });
- return _this;
- }
- _createClass(PanoramaCollection, [{
- key: "getIndex",
- value: function getIndex(pano) {
- return pano.id;
- }
- }, {
- key: "find",
- value: function find(e, t) {
- var i = common$1.filterAll(this.list, e);
- return 0 === i.length ? null : (t && t.forEach(function (e) {
- i = common$1.stableSort(i, e);
- }), i[0]);
- }
- /* sortByScore(e, t) {
- var i = common.filterAll(this.list, e)
- return 0 === i.length
- ? null
- : (i = i
- .map(function (e) {
- return {
- pano: e,
- score: t.reduce(function (t, i) {
- return t + i(e)
- }, 0),
- }
- })
- .sort(function (e, t) {
- return t.score - e.score
- }))
- } */
- }, {
- key: "lowestByScore",
- value: function lowestByScore(e, t, i) {
- return this.findRankedByScore(0, e, t, i);
- }
- }, {
- key: "findRankedByScore",
- value: function findRankedByScore(e, t, i, n) {
- n && (n.candidates = null, n.pano = null), e || (e = 0);
- var r = common$1.sortByScore(this.list, t, i);
- return !r || 0 === r.length || e >= r.length ? null : (n && (n.candidates = r, n.pano = r[e].item), r[e].item);
- }
- }, {
- key: "getNeighbours",
- value: function getNeighbours(pano) {
- return this.neighbourMap[pano.id];
- }
- }, {
- key: "setNeighbour",
- value: function setNeighbour(pano, neighbourPano, isNeighbour) {
- this.neighbourMap[pano.id] || (this.neighbourMap[pano.id] = {});
- this.neighbourMap[neighbourPano.id] || (this.neighbourMap[neighbourPano.id] = {});
- this.neighbourMap[pano.id][pano.id] = !0;
- this.neighbourMap[neighbourPano.id][neighbourPano.id] = !0;
- this.neighbourMap[pano.id][neighbourPano.id] = isNeighbour;
- this.neighbourMap[neighbourPano.id][pano.id] = isNeighbour;
- return this.neighbourMap[pano.id];
- }
- }, {
- key: "findClosest",
- value: function findClosest(position, t) {
- var func = [Panorama.filters.isPanoAligned()];
- t && func.push(Panorama.filters.inDirection(position, t, 0.75));
- return this.find(func, [Panorama.sortFunctions.distanceToPoint(position)]);
- }
- }, {
- key: "fadeMarkerOpacity",
- value: function fadeMarkerOpacity(e, t, gr) {
- //许钟文 改
- transitions$1.cancelById('fadeMarkerOpacity');
- var n = this.list.findIndex(function (e) {
- //why? 难道没有marker的pano吗 findeIndex:获取数组中函数返回值不为fasle的第一个元素索引位置
- return e.marker;
- });
- if (n < 0) {
- logger.info('marker findIndex<0');
- return;
- }
- var group;
- var tran = function tran(list, index) {
- list.member = list.member.filter(function (m) {
- return m.marker && m.marker.material.opacity != list.toOp;
- });
- transitions$1.trigger({
- func: function (e, t) {
- //e:0-1
- list.member.forEach(function (m) {
- var o = m.marker.oldOpacity;
- var i = o + e * (list.toOp - o);
- m.marker && (m.marker.material.opacity = i);
- });
- }.bind(this),
- duration: void 0 == t ? settings$3.markerOpacityTransitionTime : t,
- name: '_fpm_' + index,
- id: 'fadeMarkerOpacity'
- });
- };
- this.forEach(function (e) {
- //先记录旧的opacity
- e.marker && (e.marker.oldOpacity = e.marker.material.opacity);
- });
- e = void 0 == e ? settings$3.panorama.markerOpacity : e;
- if (e > 0 && gr) {
- group = gr;
- } else {
- group = [{
- member: this.list,
- toOp: e
- }];
- }
- for (var i = 0; i < group.length; i++) {
- tran(group[i], i);
- }
- }
- }, {
- key: "closestPanoTowardPoint",
- value: function closestPanoTowardPoint(o) {
- //改自closestPanoTowardTag by:xzw
- var point = o.point,
- require = o.require || [],
- temp = {
- position: point
- },
- a = new THREE.Vector3(),
- rank = o.rank || [Panorama.scoreFunctions.distanceSquared(temp, -2)];
- o.force;
- var getAll = o.getAll,
- angleTolerDecrease = o.angleTolerDecrease || 2; // let player = window.kankan.core.get('Player')
- // if (player.linkEditor && !player.linkEditor.noPanoHasNeighbor) {
- // //xzw add 如果不是全孤立点的话,就要避开孤立点
- // require.push(pano => {
- // return player.linkEditor.checkHasNeighbor(pano)
- // })
- // }
- require.push(Panorama.filters.isPanoAligned());
- require.push(function (pano) {
- return pano.hasNeighbor();
- /* || pano == this.$app.core.get('Scene').firstView.pano */
- });
- require.push(function (pano) {
- a.copy(point).sub(pano.position);
- var angle = -THREE.MathUtils.radToDeg(Math.atan(a.y / Math.sqrt(a.x * a.x + a.z * a.z))),
- tolerance = settings$3.insideFOV / 2 - angleTolerDecrease;
- var a1 = settings$3.insideLookLimitDown - tolerance;
- var a2 = settings$3.insideLookLimitUp + tolerance;
- return a1 < angle && angle < a2;
- /* if(angle < settings.insideLookLimitDown){
- return -10 * (angle-settings.insideLookLimitDown)
- }else if(angle > settings.insideLookLimitUp){
- return -10 * (angle-settings.insideLookLimitDown)
- } */
- });
- if (o.floor) require.push(Panorama.filters.atFloor(o.floor));
- var g = common$1.sortByScore(this.list, require, rank); //console.log(g)
- if (getAll) return g;
- return g && g.length > 0 && g[0].item;
- }
- }]);
- return PanoramaCollection;
- }(IndexedCollection);
- 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); }; }
- 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; } }
- //skybox
- var BoundingMesh = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(BoundingMesh, _THREE$Mesh);
- var _super = _createSuper$1I(BoundingMesh);
- function BoundingMesh(boundingBox, material) {
- var _this;
- var skyHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 50;
- _classCallCheck(this, BoundingMesh);
- //boundingBox = boundingBox.clone().expandByScalar(0.01) //许钟文改: 稍微放大了一丢丢的,避免和其他mesh冲突闪烁。尤其在飞入飞出时,地面闪烁一下,好像是和chunk冲突。过去是和marker冲突。
- //大部分没有mesh的都是户外,所以放大些,作为天空盒背景. 另外地板因为可能破损,所以position向上提升使最低高度不变
- boundingBox = boundingBox.clone().expandByVector(new THREE.Vector3(skyHeight, skyHeight, skyHeight));
- var size = new THREE.Vector3();
- boundingBox.getSize(size);
- var geometry = new THREE.BoxGeometry(size.x, size.y, size.z); //geometry.boundingBox = boundingBox; //xzw delete 较早:这句加上不对。因为后面算鼠标与skybox交点时 要用到的是boundingbox加上position才是真实skybox真实位置,所以boundingbox要居中的,而不应该是整体模型所在的位置。
- geometry.computeBoundingBox(); //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
- _this = _super.call(this, geometry, material);
- var center = new THREE.Vector3();
- boundingBox.getCenter(center);
- skyHeight && (center.y += skyHeight - 0.1);
- _this.position.copy(center);
- _this.frustumCulled = !1; //flag && this.add(new THREE.WireframeHelper(this))
- return _this;
- }
- return BoundingMesh;
- }(THREE.Mesh);
- 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); }; }
- 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; } }
- /**
- * 全景贴图材质
- */
- var ModelTextureMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
- _inherits(ModelTextureMaterial, _THREE$RawShaderMater);
- var _super = _createSuper$1H(ModelTextureMaterial);
- /* constructor(parameters) {
- parameters = parameters || {}
- super(
- common.extendObject(
- {
- fragmentShader: shaders.model.fragmentShader,
- vertexShader: shaders.model.vertexShader,
- uniforms: THREE.UniformsUtils.clone(shaders.model.uniforms),
- name: 'ModelTextureMaterial',
- },
- parameters
- )
- )
-
- } */
- function ModelTextureMaterial(parameters, matName) {
- var _this;
- _classCallCheck(this, ModelTextureMaterial);
- parameters = parameters || {}; //使用的是单张全景图,不是cube型的
- if (parameters.not_Cube) {
- var defines = parameters.defines || {};
- defines.Not_Cube = '';
- parameters.defines = defines;
- }
- var matName = matName || 'model';
- _this = _super.call(this, common$1.extendObject({
- fragmentShader: shaders[matName].fragmentShader,
- vertexShader: shaders[matName].vertexShader,
- uniforms: THREE.UniformsUtils.clone(shaders[matName].uniforms),
- name: 'ModelTextureMaterial'
- }, parameters));
- if (_this.uniforms.progress) {
- var progress = 0;
- Object.defineProperty(_this.uniforms.progress, 'value', {
- get: function get() {
- return progress;
- },
- set: function set(e) {
- if (e < 1) {
- if (!('usePanoMap0' in _this.defines)) {
- _this.defines.usePanoMap0 = '';
- _this.needsUpdate = true;
- }
- } else {
- if ('usePanoMap0' in _this.defines) {
- delete _this.defines.usePanoMap0;
- _this.needsUpdate = true;
- }
- }
- progress = e;
- }
- });
- } //-------------------------------------
- return _this;
- }
- /**
- * 用于点位跳转
- * 跳转后,pano0和pano1都会被赋值为currentPano,uniforms.progress由0过渡为1
- * @param {*} pano0 跳转前的点位
- * @param {*} pano1 跳转后的点位
- * @param {*} flag 将progress重置为0
- */
- _createClass(ModelTextureMaterial, [{
- key: "setProjectedPanos",
- value: function setProjectedPanos(pano0, pano1, flag) {
- var _this2 = this;
- if (!('BasePanoMap' in this.defines)) {
- flag && (this.uniforms.progress.value = 0); // pano0的贴图、坐标、旋转
- pano0.ensureSkyboxReadyForRender();
- pano1.ensureSkyboxReadyForRender();
- this.updateTexDefines(pano0, pano1); // 判断是全景图还是六面图
- }
- this.uniforms.pano0Map.value = pano0.getSkyboxTexture();
- this.uniforms.pano0Position.value.copy(pano0.position);
- this.uniforms.pano0Matrix.value.copy(pano0.matrixWorld);
- this.uniforms.pano1Map.value = pano1.getSkyboxTexture();
- this.uniforms.pano1Position.value.copy(pano1.position);
- this.uniforms.pano1Matrix.value.copy(pano1.matrixWorld);
- delete this.defines['HasVideo'];
- if (pano1.hasVideo) {
- // 存在球幕视频
- this.uniforms.exposure.value = pano1.videoInfo.exposure || 1; // 曝光
- this.uniforms.blendFov.value = pano1.videoInfo.blendFov || 5; // 目前全都取默认值
- // 球幕区域
- 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);
- this.defines['VideoMapping'] = pano1.videoInfo.mapping || 0; // 球幕视频与全景图混合方式
- this.defines['HasVideo'] = pano1.videoInfo.cameraType || 8; // 业务需求:bFlag用于判断当球幕视频宽大于高时,需要翻转90度
- var videoPlayer = pano1.panoVideoRenderer.videoPlayer;
- var video = videoPlayer._resource ? videoPlayer._resource.get(pano1.id).video : videoPlayer.instances.get(pano1.id).videoElement;
- if (video.readyState == 0) {
- video.addEventListener('resize', function (ev) {
- _this2.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
- }, false);
- } else this.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
- } // 没有hasFilter时,会绕过滤镜相关代码,节省gpu
- // 考虑到过渡效果,pano1和pano0任意一个hasFilter,就要执行滤镜代码
- if (pano1.hasFilter || pano0.hasFilter) {
- this.defines['hasFilter'] = true;
- } else {
- delete this.defines['hasFilter'];
- }
- this.needsUpdate = true; //console.log('setProjectedPanos', pano0.id, pano1.id)
- } // 判断pano贴图是全景图还是六面图
- }, {
- key: "updateTexDefines",
- value: function updateTexDefines(pano0, pano1) {
- var _this3 = this;
- var hasChanged = false;
- var change = function change(pano, index) {
- if (!pano.tiled) {
- // 全景图
- if (_this3.defines['Not_Cube_' + index] == void 0) {
- _this3.defines['Not_Cube_' + index] = '';
- hasChanged = true;
- }
- } else {
- // 六面图
- if (_this3.defines['Not_Cube_' + index] != void 0) {
- delete _this3.defines['Not_Cube_' + index];
- hasChanged = true;
- }
- }
- };
- change(pano0, 0);
- change(pano1, 1);
- hasChanged && (this.needsUpdate = true);
- }
- }]);
- return ModelTextureMaterial;
- }(THREE.RawShaderMaterial);
- 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); }; }
- 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; } }
- var BoundingTextureSkybox = /*#__PURE__*/function (_BoundingMesh) {
- _inherits(BoundingTextureSkybox, _BoundingMesh);
- var _super = _createSuper$1G(BoundingTextureSkybox);
- function BoundingTextureSkybox(bounding, skyHeight) {
- var _this;
- _classCallCheck(this, BoundingTextureSkybox);
- logger$1.time('Computing a nice bounding cubemap');
- var material = new ModelTextureMaterial({
- side: THREE.BackSide,
- transparent: !0
- });
- material.uniforms.modelAlpha.value = 0;
- material.uniforms.opacity.value = 1 - settings$3.modelAlpha;
- _this = _super.call(this, bounding, material, skyHeight);
- _this.renderOrder = RenderOrder.boundingSkybox;
- logger$1.timeEnd('Computing a nice bounding cubemap');
- return _this;
- }
- return BoundingTextureSkybox;
- }(BoundingMesh);
- function E$1() {// Keep this empty so it's easier to inherit from
- // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
- }
- E$1.prototype = {
- on: function on(name, callback, ctx) {
- var e = this.e || (this.e = {});
- (e[name] || (e[name] = [])).push({
- fn: callback,
- ctx: ctx
- });
- return this;
- },
- once: function once(name, callback, ctx) {
- var self = this;
- function listener() {
- self.off(name, listener);
- callback.apply(ctx, arguments);
- }
- listener._ = callback;
- return this.on(name, listener, ctx);
- },
- emit: function emit(name) {
- var data = [].slice.call(arguments, 1);
- var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
- var i = 0;
- var len = evtArr.length;
- for (i; i < len; i++) {
- evtArr[i].fn.apply(evtArr[i].ctx, data);
- }
- return this;
- },
- off: function off(name, callback) {
- var e = this.e || (this.e = {});
- var evts = e[name];
- var liveEvents = [];
- if (evts && callback) {
- for (var i = 0, len = evts.length; i < len; i++) {
- if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
- }
- } // Remove event from queue to prevent memory leak
- // Suggested by https://github.com/lazd
- // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
- liveEvents.length ? e[name] = liveEvents : delete e[name];
- return this;
- }
- };
- var tinyEmitter = E$1;
- var TinyEmitter = E$1;
- tinyEmitter.TinyEmitter = TinyEmitter;
- /*
- * @Author: Rindy
- * @Date: 2021-05-07 15:52:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-07 15:53:00
- * @Description: 注释
- */
- /**
- * 地面logo
- */
- var floorLogo = {
- uniforms: {
- map: {
- type: 't',
- value: null
- },
- opacity: {
- type: 'f',
- value: 1
- },
- opaRadius: {
- //百分比
- type: 'f',
- value: 0.2
- }
- },
- vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",
- 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 "
- };
- 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); }; }
- 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; } }
- var texLoader$2 = new THREE.TextureLoader();
- var settings$1 = {
- floorLogo: {
- name: 'floorLogoImg.png',
- geometry: new THREE.Vector4(2.5, 2.5, 1, 1),
- size: 100,
- position: new THREE.Vector3(0, -1.49, 0),
- renderOrder: 99
- }
- };
- var planeGeo$5 = new THREE.PlaneGeometry(2.5, 2.5, 1, 1);
- var FloorLogos = /*#__PURE__*/function (_Emiter) {
- _inherits(FloorLogos, _Emiter);
- var _super = _createSuper$1F(FloorLogos);
- function FloorLogos(app) {
- var _this;
- _classCallCheck(this, FloorLogos);
- _this = _super.call(this);
- _this.changefloorLogoOpa = function (o) {
- var logo = o.index == 0 ? this.firstLogo : this.secondLogo;
- transitions$1.cancelById('flOpa_' + o.index); //先停止之前该logo的透明度变化
- if (o.from != void 0) logo.material.opacity = o.from; //初始透明度
- if (!o.dur) {
- //立刻
- logo.material.opacity = o.opa;
- } else {
- transitions$1.start(lerp.property(logo.material, 'opacity', o.opa), o.dur || 0, null, o.delay || 0, easing['easeInQuad'], 'changefloorLogoOpa', 'flOpa_' + o.index);
- }
- };
- _this.updateFloorlogo = function () {
- new THREE.Quaternion();
- return function (Q) {
- if (this.fixDirection) return;
- if (!Q || !this.ready) return;
- var rotation, visible;
- if (this.firstLogo.visible || this.firstLogo.material.opacity != 0 || this.secondLogo.visible || this.secondLogo.material.opacity != 0) {
- visible = true;
- }
- if (!visible) {
- return; //如果两个都不可见,就不更改,如果有一个可见,就都改
- } //因为导览时有直接更改quaternion而不是lon的情况 所以更改为下面的
- var yaw = this.app.core.get('Player').yaw - Math.PI / 2; //水平方向朝向
- if (this.isCompass && this.compassArrow1) {
- rotation = new THREE.Euler(0, 0, yaw - this.firstLogo.rotation.z);
- this.compassArrow1.rotation.copy(rotation);
- this.compassArrow2.rotation.copy(rotation);
- } else {
- rotation = new THREE.Euler(-Math.PI / 2, 0, yaw);
- this.firstLogo.rotation.copy(rotation);
- this.secondLogo.rotation.copy(rotation);
- } //console.log('floorlogo changed')
- };
- }();
- _this.setDir = function (angle) {
- //根据compass设置北方向
- if (!this.fixDirection) return;
- this.firstLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
- this.secondLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
- };
- _this.app = app;
- _this.ready = false;
- _this.fixDirection = false; //固定东南西北朝向
- _this.baseSize = 1;
- _this.curSize = 1;
- _this.firstLogo = new THREE.Mesh(planeGeo$5, new THREE.MeshBasicMaterial({
- transparent: true,
- depthWrite: !1,
- depthTest: false //改 在chunk\skybox外也可看到
- }));
- _this.secondLogo = _this.firstLogo.clone();
- _this.secondLogo.material = _this.firstLogo.material.clone();
- common$1.updateVisible(_this.secondLogo, 'flyToPano', false);
- _this.app.store.on('flooruser', function (data) {
- //在cad页面 点击保存后,compass更新旋转后这里也同步
- setTimeout(function () {
- _this.setCompassAngle();
- }, 30);
- });
- return _this;
- }
- _createClass(FloorLogos, [{
- key: "bindEvents",
- value: function bindEvents() {}
- }, {
- key: "createFloorLogo",
- value: function createFloorLogo() {
- var _this2 = this;
- //const { url, scale = size / 100 } = this.getLogo()
- var logoMeta = this.getLogo();
- var url = logoMeta.url;
- var scale = logoMeta.size / 100;
- this.setSize(scale);
- this.setLogoMesh(this.firstLogo);
- this.setLogoMesh(this.secondLogo);
- var done = function done() {
- _this2.firstLogo.material.needsUpdate = true;
- _this2.secondLogo.material.needsUpdate = true;
- common$1.updateVisible(_this2.firstLogo, 'unready', true);
- common$1.updateVisible(_this2.secondLogo, 'unready', true);
- _this2.emit('ready');
- _this2.ready = true;
- };
- if (logoMeta.isCompass) {
- //this.app.core.get('Player').cameraControls.controls.panorama.insideLookLimitDown = -60
- this.changeToCompass(done);
- } else {
- var map = texLoader$2.load(url, function () {
- _this2.changeTex(map);
- done();
- });
- }
- }
- }, {
- key: "setLogoMesh",
- value: function setLogoMesh(logo) {
- logo.name = 'floorlogo';
- logo.position.set(settings$1.floorLogo.position.x, settings$1.floorLogo.position.y, settings$1.floorLogo.position.z);
- logo.rotation.set(-Math.PI / 2, 0, 0);
- logo.renderOrder = settings$1.floorLogo.renderOrder; //cover the videoSkybox
- common$1.updateVisible(logo, 'unready', false);
- common$1.updateVisible(logo, 'outside', false);
- return logo;
- }
- }, {
- key: "changeTex",
- value: function changeTex(tex, opaRadius) {
- var material = this.firstLogo.material;
- material.map && material.map.dispose();
- var outputTex = this.getTex(tex, opaRadius);
- this.firstLogo.material.map = outputTex;
- this.secondLogo.material.map = outputTex;
- }
- }, {
- key: "changeToCompass",
- value: function changeToCompass(done) {
- var _this3 = this;
- this.isCompass = true;
- var count = 0;
- var loaded = function loaded(tex) {
- count++;
- if (count == 2) {
- _this3.changeTex(compassMap, 1);
- if (!_this3.compassArrow1) {
- _this3.compassArrow1 = new THREE.Mesh(planeGeo$5, new THREE.MeshBasicMaterial({
- map: arrowMap,
- transparent: true,
- side: THREE.SingleSide,
- depthTest: false
- }));
- _this3.compassArrow1.name = 'compassArrow';
- _this3.firstLogo.add(_this3.compassArrow1);
- _this3.compassArrow1.position.set(0, 0, 0.01);
- _this3.compassArrow2 = _this3.compassArrow1.clone();
- _this3.secondLogo.add(_this3.compassArrow2);
- _this3.compassArrow1.renderOrder = _this3.compassArrow2.renderOrder = settings$1.floorLogo.renderOrder + 1;
- }
- _this3.compassArrow1.visible = _this3.compassArrow2.visible = true;
- _this3.setCompassAngle();
- _this3.baseSize = 0.64; //缩小
- _this3.setSize();
- done && done();
- }
- };
- var arrowMap = texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/compass_arrow.png"), loaded);
- var compassMap = texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/compass_floor.png"), loaded);
- }
- }, {
- key: "setCompassAngle",
- value: function setCompassAngle() {
- if (!this.isCompass) return;
- var angle = -THREE.MathUtils.degToRad(this.app.core.get('Player').compass.angle);
- this.firstLogo.rotation.set(-Math.PI / 2, 0, angle);
- this.secondLogo.rotation.set(-Math.PI / 2, 0, angle);
- }
- }, {
- key: "changeFloorLogo",
- value: function changeFloorLogo(logo) {
- if (!this.ready) {
- return;
- } //logo.isCompass = true
- if (logo.isCompass
- /* && !logo.size */
- ) {
- this.changeToCompass();
- } else if ('url' in logo || 'id' in logo || 'image' in logo) {
- this.isCompass = false;
- this.compassArrow1 && (this.compassArrow1.visible = this.compassArrow2.visible = false);
- if (logo.url) {
- texLoader$2.load(logo.url, this.changeTex.bind(this));
- } else if (logo.id) {
- texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/".concat(logo.id, ".png")), this.changeTex.bind(this));
- } else if (logo.image) {
- var tex = new THREE.Texture(logo.image);
- tex.needsUpdate = !0;
- this.changeTex(tex);
- }
- }
- if (logo.size) {
- this.setSize(logo.size / 100);
- }
- }
- }, {
- key: "setSize",
- value: function setSize(s) {
- s && (this.curSize = s);
- var scale = this.curSize * this.baseSize;
- this.firstLogo.scale.set(scale, scale, scale);
- this.secondLogo.scale.set(scale, scale, scale);
- }
- }, {
- key: "getTex",
- value: function getTex(map, opaRadius) {
- var uniforms = THREE.UniformsUtils.clone(floorLogo.uniforms);
- uniforms.map.value = map;
- var materialFirst = new THREE.ShaderMaterial({
- fragmentShader: floorLogo.fragmentShader,
- vertexShader: floorLogo.vertexShader,
- uniforms: uniforms,
- side: THREE.SingleSide,
- transparent: !0,
- premultipliedAlpha: true // !!! 不加这句的话透明部分会变黑
- });
- opaRadius != void 0 && (materialFirst.uniforms.opaRadius.value = opaRadius);
- materialFirst.needsUpdate = true;
- var tex = common$1.renderTex(materialFirst, this.app.core.get('SceneRenderer').renderer, {
- x: map.image.width,
- y: map.image.height
- });
- materialFirst.dispose();
- tex.anisotropy = 5; //防止倾斜模糊
- return tex;
- }
- }, {
- key: "getLogo",
- value: function getLogo() {
- var metadata = this.app.store.getValue('metadata');
- var url = '',
- size = metadata.floorLogoSize || 100;
- var isCompass = parseInt(metadata.floorLogoType) === 0;
- if (!isCompass) {
- var logo = this.app.config.scene.floorlogoId || metadata.floorLogo || '0';
- if (this.app.config.lang != 'zh') {
- logo = 'en/' + logo;
- }
- if (this.app.config.region == 'aws') {
- logo = 'aws/' + logo;
- }
- if (metadata.floorLogo === 'user') {
- url = this.app.resource.getUserResourceURL(metadata.floorLogoFile);
- } else {
- url = this.app.resource.getAppURL("images/floorlogos/".concat(logo, ".png"));
- }
- }
- return {
- url,
- size,
- isCompass
- };
- } //渐变opacity
- }]);
- return FloorLogos;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var BoxBufferGeometry = THREE.BoxBufferGeometry,
- BufferGeometry = THREE.BufferGeometry,
- Color = THREE.Color,
- CylinderBufferGeometry = THREE.CylinderBufferGeometry,
- DoubleSide = THREE.DoubleSide,
- Euler = THREE.Euler,
- Float32BufferAttribute$1 = THREE.Float32BufferAttribute,
- Line$1 = THREE.Line;
- THREE.LineBasicMaterial;
- var Matrix4$1 = THREE.Matrix4,
- Mesh = THREE.Mesh,
- MeshBasicMaterial = THREE.MeshBasicMaterial,
- Object3D = THREE.Object3D,
- OctahedronBufferGeometry = THREE.OctahedronBufferGeometry,
- PlaneBufferGeometry = THREE.PlaneBufferGeometry,
- Quaternion$1 = THREE.Quaternion;
- THREE.Raycaster;
- var TorusBufferGeometry = THREE.TorusBufferGeometry;
- var changeEvent, mouseDownEvent, mouseMoveEvent, mouseUpEvent, objectChangeEvent; // Reusable utility variables
- var ray$2 = new THREE.Raycaster();
- var _tempVector = new THREE.Vector3();
- var _tempVector2 = new THREE.Vector3();
- var _tempQuaternion = new THREE.Quaternion();
- var _unit = {
- X: new THREE.Vector3(1, 0, 0),
- Y: new THREE.Vector3(0, 1, 0),
- Z: new THREE.Vector3(0, 0, 1)
- };
- var pointStart = new THREE.Vector3();
- var pointEnd = new THREE.Vector3();
- var offset = new THREE.Vector3();
- var rotationAxis = new THREE.Vector3();
- var startNorm = new THREE.Vector3();
- var endNorm = new THREE.Vector3();
- var rotationAngle = 0;
- var cameraPosition = new THREE.Vector3();
- var cameraQuaternion = new THREE.Quaternion();
- var cameraScale = new THREE.Vector3();
- var parentPosition = new THREE.Vector3();
- var parentQuaternion = new THREE.Quaternion();
- var parentQuaternionInv = new THREE.Quaternion();
- var parentScale = new THREE.Vector3();
- var worldPositionStart = new THREE.Vector3();
- var worldQuaternionStart = new THREE.Quaternion();
- var worldScaleStart = new THREE.Vector3();
- var worldPosition = new THREE.Vector3();
- var worldQuaternion = new THREE.Quaternion();
- var worldQuaternionInv = new THREE.Quaternion();
- var worldScale = new THREE.Vector3();
- var eye = new THREE.Vector3();
- var positionStart = new THREE.Vector3();
- var quaternionStart = new THREE.Quaternion();
- var scaleStart = new THREE.Vector3();
- var _gizmo, _plane;
- var lastRotationAngle = 0; // 用于计算旋转时的deltaAngle
- var TransformControls = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(TransformControls, _THREE$Object3D);
- var _super = _createSuper$1E(TransformControls);
- function TransformControls(camera, domElement, options) {
- var _this;
- _classCallCheck(this, TransformControls);
- _this = _super.call(this);
- if (domElement === undefined) {
- console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.');
- domElement = document;
- }
- _this.visible = false;
- _this.domElement = domElement;
- _gizmo = new TransformControlsGizmo(options);
- _this.add(_gizmo);
- _plane = new TransformControlsPlane(options);
- _this.add(_plane);
- _this.player = options.player; //xzw add
- _this.options = options; //xzw add
- changeEvent = {
- type: 'change'
- };
- mouseDownEvent = {
- type: 'mouseDown'
- };
- mouseUpEvent = {
- type: 'mouseUp',
- mode: _this.mode
- };
- mouseMoveEvent = {
- type: 'mousing'
- };
- objectChangeEvent = {
- type: 'objectChange'
- }; // Define properties with getters/setter
- // Setting the defined property will automatically trigger change event
- // Defined properties are passed down to gizmo and plane
- _this.defineProperty('camera', camera);
- _this.defineProperty('object', undefined);
- _this.defineProperty('enabled', true);
- _this.defineProperty('axis', null);
- _this.defineProperty('mode', 'translate');
- _this.defineProperty('translationSnap', null);
- _this.defineProperty('rotationSnap', null);
- _this.defineProperty('scaleSnap', null);
- _this.defineProperty('space', 'world');
- _this.defineProperty('spaceForRotate', null);
- _this.defineProperty('size', 1);
- _this.defineProperty('dragging', false);
- _this.defineProperty('showX', true);
- _this.defineProperty('showY', true);
- _this.defineProperty('showZ', true); // TODO: remove properties unused in plane and gizmo
- _this.defineProperty('worldPosition', worldPosition);
- _this.defineProperty('worldPositionStart', worldPositionStart);
- _this.defineProperty('worldQuaternion', worldQuaternion);
- _this.defineProperty('worldQuaternionStart', worldQuaternionStart);
- _this.defineProperty('cameraPosition', cameraPosition);
- _this.defineProperty('cameraQuaternion', cameraQuaternion);
- _this.defineProperty('pointStart', pointStart);
- _this.defineProperty('pointEnd', pointEnd);
- _this.defineProperty('rotationAxis', rotationAxis);
- _this.defineProperty('rotationAngle', rotationAngle);
- _this.defineProperty('eye', eye);
- domElement.addEventListener('mousedown', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchstart', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('mousemove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchmove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchmove', _this.onPointerMove.bind(_assertThisInitialized(_this)), false);
- window.addEventListener('mouseup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
- window.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchend', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchcancel', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
- domElement.addEventListener('touchleave', _this.onPointerUp.bind(_assertThisInitialized(_this)), false); // this.player.$app.core.get('SceneRenderer').addComponent(this)
- _this.isTransformControls = true;
- return _this;
- }
- _createClass(TransformControls, [{
- key: "dispose",
- value: function dispose() {
- domElement.removeEventListener('mousedown', this.onPointerDown.bind(this));
- domElement.removeEventListener('touchstart', this.onPointerDown.bind(this));
- domElement.removeEventListener('mousemove', this.onPointerHover.bind(this));
- document.removeEventListener('mousemove', this.onPointerMove.bind(this));
- domElement.removeEventListener('touchmove', this.onPointerHover.bind(this));
- domElement.removeEventListener('touchmove', this.onPointerMove.bind(this));
- window.removeEventListener('mouseup', this.onPointerUp.bind(this), false);
- window.removeEventListener('pointerup', this.onPointerUp.bind(this), false);
- domElement.removeEventListener('touchend', this.onPointerUp.bind(this));
- domElement.removeEventListener('touchcancel', this.onPointerUp.bind(this));
- domElement.removeEventListener('touchleave', this.onPointerUp.bind(this));
- this.traverse(function (child) {
- if (child.geometry) child.geometry.dispose();
- if (child.material) child.material.dispose();
- });
- } // Set current object
- // 通过设置object的width和depth来设置箭头偏移
- }, {
- key: "attach",
- value: function attach(object) {
- this.object = object;
- this.visible = true;
- config$6.isTyping = true; //add
- return this;
- } // Detatch from object
- }, {
- key: "detach",
- value: function detach() {
- this.object = undefined;
- this.visible = false;
- this.axis = null;
- config$6.isTyping = false; //add
- return this;
- } //add
- }, {
- key: "setSize",
- value: function setSize(x, y) {}
- }, {
- key: "switchEditState",
- value: function switchEditState(state) {
- var oldScaleAxis = JSON.stringify(this.options.scaleAxis);
- if (state == 'overlay') {
- this.options.NoScaleZ = true;
- this.options.scaleAxis = ['x', 'y'];
- } else if (state == 'panovideo') {
- this.mode = 'scale';
- this.options.NoScaleZ = true;
- this.options.scaleAxis = ['x', 'y'];
- } else if (state == 'decoration') {
- this.options.NoScaleZ = false;
- this.options.scaleAxis = ['x', 'y', 'z'];
- } else if (state == 'clipbox') {
- this.options.NoScaleZ = false;
- this.options.scaleAxis = ['x', 'y', 'z'];
- } else if (state == 'css3dpanel') {
- this.options.NoScaleZ = false;
- this.options.scaleAxis = ['x', 'y'];
- }
- if (oldScaleAxis != JSON.stringify(this.options.scaleAxis)) {
- this.rebuildAxis('scale');
- }
- this.editState = state; //this.visible = true
- }
- }, {
- key: "filterRotateAxis",
- value: function filterRotateAxis(axisArr) {
- var oldRotateAxis = JSON.stringify(this.options.rotateAxis);
- this.options.rotateAxis = axisArr;
- if (oldRotateAxis != JSON.stringify(this.options.rotateAxis)) {
- this.rebuildAxis('rotate');
- }
- }
- }, {
- key: "rebuildAxis",
- value: function rebuildAxis(transType) {
- _gizmo.gizmo[transType].removeFromParent();
- _gizmo.picker[transType].removeFromParent();
- _gizmo.gizmo[transType].traverse(function (child) {
- if (child.geometry) child.geometry.dispose();
- if (child.material) child.material.dispose();
- });
- _gizmo.picker[transType].traverse(function (child) {
- if (child.geometry) child.geometry.dispose();
- if (child.material) child.material.dispose();
- });
- var _gizmo2 = _gizmo['update' + transType.charAt(0).toUpperCase() + transType.slice(1)](),
- gizmo = _gizmo2.gizmo,
- picker = _gizmo2.picker; // updateScale()、updateRotate()
- _gizmo.add(_gizmo.gizmo[transType] = _gizmo.setupGizmo(gizmo));
- _gizmo.add(_gizmo.picker[transType] = _gizmo.setupGizmo(picker));
- _gizmo.picker[transType].visible = false;
- }
- }, {
- key: "handleDragStart",
- value: function handleDragStart() {
- this.editState && this.onPointerDown();
- }
- }, {
- key: "handleDragging",
- value: function handleDragging() {
- this.editState && this.onPointerMove();
- }
- }, {
- key: "handleDragEnd",
- value: function handleDragEnd() {
- this.editState && this.onPointerUp();
- } //-------------------
- // Defined getter, setter and store for a property
- }, {
- key: "defineProperty",
- value: function defineProperty(propName, defaultValue) {
- var propValue = defaultValue;
- Object.defineProperty(this, propName, {
- get: function get() {
- return propValue !== undefined ? propValue : defaultValue;
- },
- set: function set(value) {
- if (propValue !== value) {
- propValue = value;
- _plane[propName] = value;
- _gizmo[propName] = value;
- this.dispatchEvent({
- type: propName + '-changed',
- value: value
- });
- this.dispatchEvent(changeEvent);
- }
- }
- });
- this[propName] = defaultValue;
- _plane[propName] = defaultValue;
- _gizmo[propName] = defaultValue;
- } // updateMatrixWorld updates key transformation variables
- }, {
- key: "updateMatrixWorld",
- value: function updateMatrixWorld() {
- if (this.object !== undefined) {
- this.object.updateMatrixWorld();
- this.object.parent.matrixWorld.decompose(parentPosition, parentQuaternion, parentScale);
- this.object.matrixWorld.decompose(worldPosition, worldQuaternion, worldScale);
- parentQuaternionInv.copy(parentQuaternion).invert();
- worldQuaternionInv.copy(worldQuaternion).invert();
- }
- this.camera.updateMatrixWorld();
- this.camera.matrixWorld.decompose(cameraPosition, cameraQuaternion, cameraScale);
- eye.copy(cameraPosition).sub(worldPosition).normalize();
- Object3D.prototype.updateMatrixWorld.call(this);
- }
- }, {
- key: "pointerHover",
- value: function pointerHover(pointer) {
- if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
- var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
- ray$2.set(origin, this.player.getMouseDirection(pointer));
- var intersect = ray$2.intersectObjects(_gizmo.picker[this.mode].children, true)[0] || false;
- if (intersect) {
- this.axis = intersect.object.name;
- this.intersect = intersect.object; //add
- this.player.domElement.style.cursor = 'pointer';
- } else {
- this.intersect = null;
- this.axis = null;
- this.player.domElement.style.cursor = '';
- }
- }
- }, {
- key: "pointerDown",
- value: function pointerDown(pointer) {
- if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return;
- if ((pointer.button === 0 || pointer.button === undefined) && this.axis !== null) {
- //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
- var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
- ray$2.set(origin, this.player.getMouseDirection(pointer));
- var planeIntersect = ray$2.intersectObjects([_plane], true)[0] || false;
- if (planeIntersect) {
- var space = this.space;
- if (this.mode === 'scale') {
- space = 'local';
- } else if (this.axis === 'E' || this.axis === 'XYZE' || this.axis === 'XYZ') {
- space = 'world';
- }
- if (space === 'local' && this.mode === 'rotate') {
- var snap = this.rotationSnap;
- if (this.axis === 'X' && snap) this.object.rotation.x = Math.round(this.object.rotation.x / snap) * snap;
- if (this.axis === 'Y' && snap) this.object.rotation.y = Math.round(this.object.rotation.y / snap) * snap;
- if (this.axis === 'Z' && snap) this.object.rotation.z = Math.round(this.object.rotation.z / snap) * snap;
- }
- this.object.updateMatrixWorld();
- this.object.parent.updateMatrixWorld();
- positionStart.copy(this.object.position);
- quaternionStart.copy(this.object.quaternion);
- scaleStart.copy(this.object.scale);
- this.object.matrixWorld.decompose(worldPositionStart, worldQuaternionStart, worldScaleStart);
- pointStart.copy(planeIntersect.point).sub(worldPositionStart);
- if (this.player.cameraControls.activeControl) {
- //this.player.cameraControls.activeControl.locked = true; //add
- this.player.cameraControls.activeControl.enabled = false; //add
- }
- }
- this.dragging = true;
- mouseDownEvent.mode = this.mode;
- this.dispatchEvent(mouseDownEvent);
- }
- }
- }, {
- key: "pointerMove",
- value: function pointerMove(pointer) {
- var axis = this.axis;
- var mode = this.mode;
- var object = this.object;
- var space = this.space;
- if (mode === 'scale') {
- space = 'local';
- } else if (axis === 'E' || axis === 'XYZE' || axis === 'XYZ') {
- space = 'world';
- } //console.log(axis)
- if (object === undefined || axis === null || this.dragging === false || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
- var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
- ray$2.set(origin, this.player.getMouseDirection(pointer));
- var planeIntersect = ray$2.intersectObjects([_plane], true)[0] || false;
- if (planeIntersect === false) return;
- pointEnd.copy(planeIntersect.point).sub(worldPositionStart);
- if (mode === 'translate') {
- // Apply translate
- offset.copy(pointEnd).sub(pointStart);
- if (space === 'local' && axis !== 'XYZ') {
- offset.applyQuaternion(worldQuaternionInv);
- }
- if (axis.indexOf('X') === -1) offset.x = 0;
- if (axis.indexOf('Y') === -1) offset.y = 0;
- if (axis.indexOf('Z') === -1) offset.z = 0;
- if (space === 'local' && axis !== 'XYZ') {
- offset.applyQuaternion(quaternionStart).divide(parentScale);
- } else {
- offset.applyQuaternion(parentQuaternionInv).divide(parentScale);
- }
- if (object.overlayType) {
- // overlay高度略小于地面高度时会出bug
- var heightProtect = object.floor.boundingBox.min.y - offset.y - positionStart.y;
- if (heightProtect > 0 && heightProtect < 0.024) offset.y = object.floor.boundingBox.min.y - positionStart.y;
- } // 当scale缩放为负时,offset得出的y、z值符号相反,原因不明,目前先打个补丁
- offset.y *= Math.sign(object.scale.y);
- offset.z *= Math.sign(object.scale.z);
- object.position.copy(offset).add(positionStart); // Apply translation snap
- if (this.translationSnap) {
- if (space === 'local') {
- object.position.applyQuaternion(_tempQuaternion.copy(quaternionStart).invert());
- if (axis.search('X') !== -1) {
- object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
- }
- if (axis.search('Y') !== -1) {
- object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
- }
- if (axis.search('Z') !== -1) {
- object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
- }
- object.position.applyQuaternion(quaternionStart);
- }
- if (space === 'world') {
- if (object.parent) {
- object.position.add(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
- }
- if (axis.search('X') !== -1) {
- object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
- }
- if (axis.search('Y') !== -1) {
- object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
- }
- if (axis.search('Z') !== -1) {
- object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
- }
- if (object.parent) {
- object.position.sub(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
- }
- }
- }
- } else if (mode === 'scale') {
- if (axis.search('XYZ') !== -1) {
- var d = pointEnd.length() / pointStart.length();
- if (pointEnd.dot(pointStart) < 0) d *= -1;
- if (this.options.NoScaleZ) {
- //xzw add
- _tempVector2.set(d, d, 1);
- } else {
- _tempVector2.set(d, d, d);
- }
- } else if (axis.search('XY') !== -1) {
- //add 等比例for plane
- var d = pointEnd.length() / pointStart.length();
- if (pointEnd.dot(pointStart) < 0) d *= -1;
- _tempVector2.set(d, d, 1);
- } else {
- _tempVector.copy(pointStart);
- _tempVector2.copy(pointEnd);
- _tempVector.applyQuaternion(worldQuaternionInv);
- _tempVector2.applyQuaternion(worldQuaternionInv);
- _tempVector2.divide(_tempVector);
- if (axis.search('X') === -1) {
- _tempVector2.x = 1;
- }
- if (axis.search('Y') === -1) {
- _tempVector2.y = 1;
- }
- if (axis.search('Z') === -1) {
- _tempVector2.z = 1;
- }
- } // Apply scale
- /*if (this.editState == 'overlay' ) {
- // 将视频缩放大小限制在0.1到10之间
- if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) < 0.1) return
- if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) > 10) return
- if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) < 0.1) return
- if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) > 10) return
- }
- if (this.editState == 'decoration') {
- // 将模型缩放大小限制在0.1到10之间
- if (Math.abs(scaleStart.x * _tempVector2.x) < 0.1) return
- if (Math.abs(scaleStart.x * _tempVector2.x) > 10) return
- if (Math.abs(scaleStart.y * _tempVector2.y) < 0.1) return
- if (Math.abs(scaleStart.y * _tempVector2.y) > 10) return
- if (Math.abs(scaleStart.z * _tempVector2.z) < 0.1) return
- if (Math.abs(scaleStart.z * _tempVector2.z) > 10) return
- } */
- if (this.editState == 'overlay' || this.editState == 'decoration') {
- // 将模型缩放大小限制在0.1到10之间
- var min = 0.1,
- max = 10;
- if (this.editState == 'overlay') {
- //先暂乘以geo长宽比率,修改为真实大小
- scaleStart.x *= settings$3.overlay.width;
- scaleStart.y *= settings$3.overlay.height;
- }
- var axises = ['x', 'y', 'z'];
- var result = {
- min: {
- v: Infinity
- },
- max: {
- v: -Infinity
- }
- };
- axises.forEach(function (e) {
- _tempVector2[e] = Math.abs(_tempVector2[e]); //先保证都是非负
- if (_tempVector2[e] != 1) {
- var v = _tempVector2[e] * scaleStart[e];
- if (v < result.min.v) {
- result.min.axis = e, result.min.v = v;
- } else if (v > result.min.v) {
- result.max.axis = e, result.max.v = v;
- }
- }
- }); //已知_tempVector2 的三个轴的值除了1其他的都一样
- var newS;
- if (result.min.v < min) {
- //用最小的得到最小比值
- newS = min / scaleStart[result.min.axis];
- } else if (result.max.v > max) {
- //用最大的得到最大比值
- newS = max / scaleStart[result.max.axis];
- } //newS && console.log('newS',newS,result)
- newS && axises.forEach(function (e) {
- if (_tempVector2[e] != 1) {
- //1的是绝对不能更改的轴
- _tempVector2[e] = newS;
- }
- });
- if (this.editState == 'overlay') {
- //恢复
- scaleStart.x /= settings$3.overlay.width;
- scaleStart.y /= settings$3.overlay.height;
- } //注,拖拽缩小时,容易缩放不到0(如0.3)就直接变大,因为需要无限接近原点才行。
- }
- if (this.editState == 'clipbox') ;
- object.scale.copy(scaleStart).multiply(_tempVector2);
- if (this.scaleSnap) {
- if (axis.search('X') !== -1) {
- object.scale.x = Math.round(object.scale.x / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
- }
- if (axis.search('Y') !== -1) {
- object.scale.y = Math.round(object.scale.y / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
- }
- if (axis.search('Z') !== -1) {
- object.scale.z = Math.round(object.scale.z / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
- }
- } //add
- if (this.editState == 'overlay') {
- object.width = settings$3.overlay.width * object.scale.x;
- object.height = settings$3.overlay.height * object.scale.y;
- this.player.EditOverlay.updateOverlayScaleDisplay();
- }
- } else if (mode === 'rotate') {
- offset.copy(pointEnd).sub(pointStart);
- if (this.player.mode == 'floorplan') {
- var flcamera = this.player.cameraControls.cameras.floorplan;
- var eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
- var ROTATION_SPEED = 5 / eyeDistance;
- } else var ROTATION_SPEED = 5 / worldPosition.distanceTo(_tempVector.setFromMatrixPosition(this.camera.matrixWorld));
- if (axis === 'E') {
- rotationAxis.copy(eye);
- rotationAngle = pointEnd.angleTo(pointStart);
- startNorm.copy(pointStart).normalize();
- endNorm.copy(pointEnd).normalize();
- rotationAngle *= endNorm.cross(startNorm).dot(eye) < 0 ? 1 : -1;
- } else if (axis === 'XYZE') {
- rotationAxis.copy(offset).cross(eye).normalize();
- rotationAngle = offset.dot(_tempVector.copy(rotationAxis).cross(this.eye)) * ROTATION_SPEED;
- } else if (axis === 'X' || axis === 'Y' || axis === 'Z') {
- rotationAxis.copy(_unit[axis]);
- _tempVector.copy(_unit[axis]);
- if (space === 'local') {
- _tempVector.applyQuaternion(worldQuaternion);
- }
- rotationAngle = offset.dot(_tempVector.cross(eye).normalize()) * ROTATION_SPEED;
- } // Apply rotation snap
- if (this.rotationSnap) rotationAngle = Math.round(rotationAngle / this.rotationSnap) * this.rotationSnap;
- this.rotationAngle = rotationAngle; // Apply rotate
- var isLocalSpace = space === 'local';
- if (this.spaceForRotate) {
- if (axis === 'X') isLocalSpace = this.spaceForRotate.x === 'local';
- if (axis === 'Y') isLocalSpace = this.spaceForRotate.y === 'local';
- if (axis === 'Z') isLocalSpace = this.spaceForRotate.z === 'local';
- }
- if (isLocalSpace && axis !== 'E' && axis !== 'XYZE') {
- object.quaternion.copy(quaternionStart);
- object.quaternion.multiply(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle)).normalize();
- } else {
- rotationAxis.applyQuaternion(parentQuaternionInv);
- object.quaternion.copy(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle));
- object.quaternion.multiply(quaternionStart).normalize();
- }
- }
- this.dispatchEvent(Object.assign(mouseMoveEvent, {
- mode: this.mode,
- state: this.editState,
- axis,
- angle: rotationAngle,
- deltaAngle: rotationAngle - lastRotationAngle
- }));
- this.dispatchEvent(changeEvent);
- this.dispatchEvent(objectChangeEvent);
- lastRotationAngle = rotationAngle;
- }
- }, {
- key: "pointerUp",
- value: function pointerUp(pointer) {
- if (this.object === undefined) return; //if ( pointer.button !== undefined && pointer.button !== 0 ) return;
- if (this.dragging && this.axis !== null) {
- mouseUpEvent.mode = this.mode;
- this.dispatchEvent(mouseUpEvent);
- }
- this.dragging = false;
- if (pointer.button === undefined) this.axis = null;
- if (this.player.cameraControls.activeControl) {
- //this.player.cameraControls.activeControl.locked = false; //add
- this.player.cameraControls.activeControl.pointerDragOn = false; //add
- this.player.cameraControls.activeControl.enabled = true;
- }
- lastRotationAngle = 0;
- } // normalize mouse / touch pointer and remap {x,y} to view space.
- }, {
- key: "getPointer",
- value: function getPointer(event) {
- if (!event) {
- console.log('hhahhhahah');
- return;
- }
- if (document.pointerLockElement) {
- return {
- x: 0,
- y: 0,
- button: event.button
- };
- } else {
- var pointer = event.changedTouches ? event.changedTouches[0] : event;
- var rect = domElement.getBoundingClientRect();
- return {
- x: (pointer.clientX - rect.left) / rect.width * 2 - 1,
- y: -(pointer.clientY - rect.top) / rect.height * 2 + 1,
- button: event.button
- };
- }
- } // mouse / touch event handlers
- }, {
- key: "onPointerHover",
- value: function onPointerHover(event) {
- if (!this.enabled) return; //this.pointerHover( getPointer( event ) );
- this.pointerHover(this.player.mouse);
- }
- }, {
- key: "onPointerDown",
- value: function onPointerDown(event) {
- if (!this.enabled) return; //document.addEventListener( "mousemove", onPointerMove, false );
- /* this.pointerHover( getPointer( event ) );
- this.pointerDown( getPointer( event ) ); */
- this.pointerHover(this.player.mouse);
- this.pointerDown(this.player.mouse);
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove(event) {
- if (!this.enabled || !this.dragging) return; //xzw change
- //this.pointerMove( getPointer( event ) );
- this.pointerMove(this.player.mouse);
- }
- }, {
- key: "onPointerUp",
- value: function onPointerUp(event) {
- if (!this.enabled) return; //document.removeEventListener( "mousemove", onPointerMove, false );
- //this.pointerUp( getPointer( event ) );
- this.pointerUp(this.player.mouse);
- } // TODO: deprecate
- }, {
- key: "getMode",
- value: function getMode() {
- return this.mode;
- }
- }, {
- key: "setMode",
- value: function setMode(mode) {
- this.mode = mode;
- }
- }, {
- key: "setTranslationSnap",
- value: function setTranslationSnap(translationSnap) {
- this.translationSnap = translationSnap;
- }
- }, {
- key: "setRotationSnap",
- value: function setRotationSnap(rotationSnap) {
- this.rotationSnap = rotationSnap;
- }
- }, {
- key: "setScaleSnap",
- value: function setScaleSnap(scaleSnap) {
- this.scaleSnap = scaleSnap;
- }
- /* this.setSize = function ( size ) {
- this.size = size;
- }; */
- }, {
- key: "setSpace",
- value: function setSpace(space) {
- this.space = space;
- }
- }, {
- key: "update",
- value: function update() {
- console.warn('THREE.TransformControls: update function has no more functionality and therefore has been deprecated.');
- }
- }]);
- return TransformControls;
- }(THREE.Object3D); // TransformControls.prototype = Object.assign(Object.create(Object3D.prototype), {
- // constructor: TransformControls,
- // isTransformControls: true,
- // })
- var TransformControlsGizmo = /*#__PURE__*/function (_THREE$Object3D2) {
- _inherits(TransformControlsGizmo, _THREE$Object3D2);
- var _super2 = _createSuper$1E(TransformControlsGizmo);
- function TransformControlsGizmo(options) {
- var _this2;
- _classCallCheck(this, TransformControlsGizmo);
- _this2 = _super2.call(this);
- _this2.type = 'TransformControlsGizmo';
- _this2.options = options;
- _this2.player = options.player; // shared materials
- var gizmoMaterial = new THREE.MeshBasicMaterial({
- depthTest: false,
- depthWrite: false,
- transparent: true,
- side: DoubleSide,
- fog: false
- });
- var gizmoLineMaterial = new THREE.LineBasicMaterial({
- depthTest: false,
- depthWrite: false,
- transparent: true,
- linewidth: 1,
- fog: false
- }); // Make unique material for each axis/color
- var matInvisible = gizmoMaterial.clone();
- matInvisible.opacity = 0.35;
- var matHelper = gizmoMaterial.clone();
- matHelper.opacity = 0.1; //��
- var matRed = gizmoMaterial.clone();
- matRed.color.set(0xff0000);
- var matGreen = gizmoMaterial.clone();
- matGreen.color.set(0x00ff00);
- var matBlue = gizmoMaterial.clone();
- matBlue.color.set(0x0000ff);
- var matWhiteTransparent = gizmoMaterial.clone();
- matWhiteTransparent.opacity = 0.75;
- matWhiteTransparent.color.set(0xf0f0f0); // matWhiteTransparent.color.set(0x00d0fd) //xzw add
- var matYellowTransparent = matWhiteTransparent.clone();
- matYellowTransparent.color.set(0xffff00);
- var matCyanTransparent = matWhiteTransparent.clone();
- matCyanTransparent.color.set(0x00ffff);
- var matMagentaTransparent = matWhiteTransparent.clone();
- matMagentaTransparent.color.set(0xff00ff);
- var matYellow = gizmoMaterial.clone();
- matYellow.color.set(0xffff00);
- var matLineRed = gizmoLineMaterial.clone();
- matLineRed.color.set(0xff0000);
- var matLineGreen = gizmoLineMaterial.clone();
- matLineGreen.color.set(0x00ff00);
- var matLineBlue = gizmoLineMaterial.clone();
- matLineBlue.color.set(0x0000ff);
- var matLineCyan = gizmoLineMaterial.clone();
- matLineCyan.color.set(0x00ffff);
- var matLineMagenta = gizmoLineMaterial.clone();
- matLineMagenta.color.set(0xff00ff);
- var matLineYellow = gizmoLineMaterial.clone();
- matLineYellow.color.set(0xffff00);
- var matLineGray = gizmoLineMaterial.clone();
- matLineGray.color.set(0x787878);
- var matLineYellowTransparent = matLineYellow.clone();
- matLineYellowTransparent.opacity = 0.25; // reusable geometry
- var arrowGeometry = new CylinderBufferGeometry(0, 0.07, 0.2, 12, 1, false);
- var scaleHandleGeometry = new BoxBufferGeometry(0.125, 0.125, 0.125);
- var lineGeometry = new BufferGeometry();
- lineGeometry.setAttribute('position', new Float32BufferAttribute$1([0, 0, 0, 1, 0, 0], 3)); //--------------- xzw add fatLines: -----------------
- var fatLinePoints = {
- 'x+': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 0.5,
- y: 0,
- z: 0
- }],
- 'x-': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: -0.5,
- y: 0,
- z: 0
- }],
- 'y+': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 0,
- y: 0.5,
- z: 0
- }],
- 'y-': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 0,
- y: -0.5,
- z: 0
- }],
- 'z+': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 0,
- y: 0,
- z: 0.5
- }],
- 'z-': [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 0,
- y: 0,
- z: -0.5
- }]
- };
- var fatLineGeos = {};
- var fatLintMats = {
- x: LineDraw.createFatLineMat({
- lineWidth: 3,
- color: 0xff0000,
- depthTest: false,
- opacity: 0.9
- }),
- y: LineDraw.createFatLineMat({
- lineWidth: 3,
- color: 0x00ff00,
- depthTest: false,
- opacity: 0.9
- }),
- z: LineDraw.createFatLineMat({
- lineWidth: 3,
- color: 0x0000ff,
- depthTest: false,
- opacity: 0.9
- })
- };
- var getFatLine = function getFatLine(geoName, matName) {
- var points = fatLinePoints[geoName];
- var material = fatLintMats[matName];
- var line = LineDraw.createFatLine(points, {
- material
- });
- fatLineGeos[geoName] = line.geometry; //record
- line.renderOrder = 4;
- return line;
- }; //--------------------------------------------------
- var CircleGeometry = function CircleGeometry(radius, arc) {
- var geometry = new BufferGeometry();
- var vertices = [];
- for (var i = 0; i <= 64 * arc; ++i) {
- vertices.push(0, Math.cos(i / 32 * Math.PI) * radius, Math.sin(i / 32 * Math.PI) * radius);
- }
- geometry.setAttribute('position', new Float32BufferAttribute$1(vertices, 3));
- return geometry;
- }; // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position
- var TranslateHelperGeometry = function TranslateHelperGeometry() {
- var geometry = new BufferGeometry();
- geometry.setAttribute('position', new Float32BufferAttribute$1([0, 0, 0, 1, 1, 1], 3));
- return geometry;
- }; // Gizmo definitions - custom hierarchy definitions for setupGizmo() function
- var gizmoTranslate = {
- 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' ],
- [getFatLine('x+', 'x')
- /* new Line( lineGeometry, matLineRed ) */
- ]],
- 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' ],
- [getFatLine('y+', 'y')
- /* new Line( lineGeometry, matLineGreen ) */
- ]],
- 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' ],
- [getFatLine('z+', 'z')
- /* new Line( lineGeometry, matLineBlue ) */
- ]]
- /* XYZ: [
- [ new Mesh( new OctahedronBufferGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]]
- ],
- XY: [
- [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]],
- [ new Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]
- ],
- YZ: [
- [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],
- [ new Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
- ],
- XZ: [
- [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],
- [ new Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
- ]*/
- };
- var pickerTranslate = {
- X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
- Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
- Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]]
- /* XYZ: [
- [ new Mesh( new OctahedronBufferGeometry( 0.2, 0 ), matInvisible ) ]
- ],
- XY: [
- [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]]
- ],
- YZ: [
- [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]
- ],
- XZ: [
- [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]
- ]*/
- };
- var helperTranslate = {
- START: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
- END: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
- DELTA: [[new Line$1(TranslateHelperGeometry(), matHelper), null, null, null, 'helper']],
- X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
- Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
- Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
- };
- _this2.updateRotate = function () {
- var gizmoRotate = {
- 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]]],
- 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]]],
- 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]]],
- /* E: [
- [ new Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]],
- [ 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 ]],
- [ 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 ]],
- [ 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 ]],
- [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]],
- ] , */
- XYZE: [[new Line$1(CircleGeometry(1, 1), matLineGray), null, [0, Math.PI / 2, 0]]]
- };
- var helperRotate = {
- AXIS: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']]
- };
- var pickerRotate = {
- X: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, -Math.PI / 2, -Math.PI / 2]]],
- Y: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [Math.PI / 2, 0, 0]]],
- Z: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, 0, -Math.PI / 2]]]
- /*E: [
- [ new Mesh( new TorusBufferGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]
- ] ,
- XYZE: [
- [ new Mesh( new SphereBufferGeometry( 0.7, 10, 8 ), matInvisible ) ]
- ] */
- };
- if (options.rotateAxis) {
- if (options.rotateAxis.indexOf('x') < 0) {
- delete gizmoRotate.X;
- delete gizmoRotate.XYZE;
- delete pickerRotate.X;
- }
- if (options.rotateAxis.indexOf('y') < 0) {
- delete gizmoRotate.Y;
- delete gizmoRotate.XYZE;
- delete pickerRotate.Y;
- }
- if (options.rotateAxis.indexOf('z') < 0) {
- delete gizmoRotate.Z;
- delete gizmoRotate.XYZE;
- delete pickerRotate.Z;
- }
- }
- return {
- gizmo: gizmoRotate,
- picker: pickerRotate,
- helper: helperRotate
- };
- };
- _this2.updateScale = function () {
- var gizmoScale = {
- 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
- ],
- Y: [[new Mesh(scaleHandleGeometry, matGreen), [0, 0.5, 0]], [getFatLine('y-', 'y')]],
- 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]]],
- /*XY: [[ new Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]],
- [ new Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]],
- YZ: [[ new Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]],
- [ new Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
- XZ: [[ new Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]],
- [ new Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]],
- [ new Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]], */
- /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]],],
- XYZY: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]],] ,
- XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]],] */
- XY: [[new Mesh(scaleHandleGeometry, matYellowTransparent), [0.5, 0.5, 0]]],
- YZ: [[new Mesh(scaleHandleGeometry, matCyanTransparent), [0, 0.5, 0.5]]],
- XZ: [[new Mesh(scaleHandleGeometry, matMagentaTransparent), [0.5, 0, 0.5]]],
- XYZX: [[new Mesh(new BoxBufferGeometry(0.125, 0.125, 0.125), matWhiteTransparent.clone()), [0.5, 0.5, 0.5]]]
- };
- var pickerScale = {
- X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
- Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
- Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]],
- /*XY: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]],],
- YZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]],],
- XZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]],], */
- /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]],],
- XYZY: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]],] ,
- XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]],] */
- XY: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0.5, 0]]],
- YZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0, 0.5, 0.5]]],
- XZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0, 0.5]]],
- XYZX: [[new Mesh(new BoxBufferGeometry(0.2, 0.2, 0.2), matInvisible), [0.5, 0.5, 0.5]]]
- };
- if (options.scaleAxis) {
- if (options.scaleAxis.indexOf('z') < 0) {
- delete gizmoScale.Z;
- delete gizmoScale.YZ;
- delete gizmoScale.XZ;
- delete gizmoScale.XYZX;
- delete pickerScale.Z;
- delete pickerScale.YZ;
- delete pickerScale.XZ;
- delete pickerScale.XYZX;
- }
- if (options.scaleAxis.indexOf('x') > -1 && options.scaleAxis.indexOf('y') > -1 && options.scaleAxis.indexOf('z') > -1) {
- delete gizmoScale.XY;
- delete gizmoScale.YZ;
- delete gizmoScale.XZ;
- delete pickerScale.XY;
- delete pickerScale.YZ;
- delete pickerScale.XZ;
- }
- }
- var helperScale = {
- X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
- Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
- Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
- };
- return {
- gizmo: gizmoScale,
- picker: pickerScale,
- helper: helperScale
- };
- }; // Creates an Object3D with gizmos described in custom hierarchy definition.
- _this2.setupGizmo = function (gizmoMap) {
- var gizmo = new Object3D();
- for (var name in gizmoMap) {
- for (var i = gizmoMap[name].length; i--;) {
- var object = gizmoMap[name][i][0];
- var position = gizmoMap[name][i][1];
- var rotation = gizmoMap[name][i][2];
- var scale = gizmoMap[name][i][3];
- var tag = gizmoMap[name][i][4];
- if (object.type != 'Fatline') {
- //xzw add for fatline
- object = object.clone();
- } // name and tag properties are essential for picking and updating logic.
- object.name = name;
- object.tag = tag;
- if (position) {
- object.position.set(position[0], position[1], position[2]);
- }
- if (rotation) {
- object.rotation.set(rotation[0], rotation[1], rotation[2]);
- }
- if (scale) {
- object.scale.set(scale[0], scale[1], scale[2]);
- }
- object.updateMatrix();
- if (object.geometry.clone()) {
- var tempGeometry = object.geometry.clone();
- tempGeometry.applyMatrix4(object.matrix);
- object.geometry = tempGeometry;
- } else {
- object.geometry.applyMatrix4(object.matrix);
- }
- object.renderOrder = Infinity;
- object.position.set(0, 0, 0);
- object.rotation.set(0, 0, 0);
- object.scale.set(1, 1, 1);
- gizmo.add(object);
- }
- }
- return gizmo;
- }; // Reusable utility variables
- var tempVector = new THREE.Vector3(0, 0, 0);
- var tempEuler = new Euler();
- var alignVector = new THREE.Vector3(0, 1, 0);
- var zeroVector = new THREE.Vector3(0, 0, 0);
- var lookAtMatrix = new Matrix4$1();
- var tempQuaternion = new Quaternion$1();
- var tempQuaternion2 = new Quaternion$1();
- var identityQuaternion = new Quaternion$1();
- var unitX = new THREE.Vector3(1, 0, 0);
- var unitY = new THREE.Vector3(0, 1, 0);
- var unitZ = new THREE.Vector3(0, 0, 1); // Gizmo creation
- _this2.gizmo = {};
- _this2.picker = {};
- _this2.helper = {};
- _this2.add(_this2.gizmo['translate'] = _this2.setupGizmo(gizmoTranslate));
- _this2.add(_this2.gizmo['rotate'] = _this2.setupGizmo(_this2.updateRotate().gizmo));
- _this2.add(_this2.gizmo['scale'] = _this2.setupGizmo(_this2.updateScale().gizmo));
- _this2.add(_this2.picker['translate'] = _this2.setupGizmo(pickerTranslate));
- _this2.add(_this2.picker['rotate'] = _this2.setupGizmo(_this2.updateRotate().picker));
- _this2.add(_this2.picker['scale'] = _this2.setupGizmo(_this2.updateScale().picker));
- _this2.add(_this2.helper['translate'] = _this2.setupGizmo(helperTranslate));
- _this2.add(_this2.helper['rotate'] = _this2.setupGizmo(_this2.updateRotate().helper));
- _this2.add(_this2.helper['scale'] = _this2.setupGizmo(_this2.updateScale().helper)); // Pickers should be hidden always
- _this2.picker['translate'].visible = false;
- _this2.picker['rotate'].visible = false;
- _this2.picker['scale'].visible = false; // updateMatrixWorld will update transformations and appearance of individual handles
- _this2.updateMatrixWorld = function () {
- var space = this.space;
- if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
- var quaternion = space === 'local' ? this.worldQuaternion : identityQuaternion; // Show only gizmos for current transform mode
- this.gizmo['translate'].visible = this.mode === 'translate';
- this.gizmo['rotate'].visible = this.mode === 'rotate';
- this.gizmo['scale'].visible = this.mode === 'scale';
- this.helper['translate'].visible = this.mode === 'translate';
- this.helper['rotate'].visible = this.mode === 'rotate';
- this.helper['scale'].visible = this.mode === 'scale';
- var handles = [];
- handles = handles.concat(this.picker[this.mode].children);
- handles = handles.concat(this.gizmo[this.mode].children);
- handles = handles.concat(this.helper[this.mode].children);
- var eyeDistance = this.worldPosition.distanceTo(this.cameraPosition); //俯视图的透视和距离无关,因此在两种相机切换切换时大小过渡比较困难
- if (this.player.mode == 'transitioning' && (this.player.modeTran.split('-')[0] == 'floorplan' || this.player.modeTran.split('-')[1] == 'floorplan')) {
- var flcamera = this.player.cameraControls.cameras.floorplan;
- var min = (flcamera.right - flcamera.left) / flcamera.aspect;
- eyeDistance = Math.min(eyeDistance, min);
- } else if (this.player.mode == 'floorplan') {
- var flcamera = this.player.cameraControls.cameras.floorplan;
- eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
- }
- var scale = eyeDistance * this.size / 7;
- for (var i = 0; i < handles.length; i++) {
- var handle = handles[i]; // hide aligned to camera
- handle.visible = true;
- handle.rotation.set(0, 0, 0);
- handle.position.copy(this.worldPosition);
- handle.scale.set(1, 1, 1).multiplyScalar(scale);
- /* if(this.mode == "translate" && this.parent.object){
-
- if(handle.name == "X"){
- //handle.position.copy(handle.initPos || new THREE.Vector3).add(new THREE.Vector3( this.parent.object.width / 2 / scale, 0,0));
- handle.position.add(new THREE.Vector3( this.parent.object.width / 2 , 0,0));
-
-
- }else if(handle.name == "Y"){
- //handle.position.set(0, this.parent.object.height / 2 / scale,0);
- }else if(handle.name == "Z"){
- //handle.position.set( 0,0,this.parent.object.depth / scale);
- }
-
-
- }
- */
- // TODO: simplify helpers and consider decoupling from gizmo
- if (handle.tag === 'helper') {
- handle.visible = false;
- if (handle.name === 'AXIS') {
- handle.position.copy(this.worldPositionStart);
- handle.visible = !!this.axis;
- if (this.axis === 'X') {
- tempQuaternion.setFromEuler(tempEuler.set(0, 0, 0));
- handle.quaternion.copy(quaternion).multiply(tempQuaternion);
- if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
- handle.visible = false;
- }
- }
- if (this.axis === 'Y') {
- tempQuaternion.setFromEuler(tempEuler.set(0, 0, Math.PI / 2));
- handle.quaternion.copy(quaternion).multiply(tempQuaternion);
- if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
- handle.visible = false;
- }
- }
- if (this.axis === 'Z') {
- tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
- handle.quaternion.copy(quaternion).multiply(tempQuaternion);
- if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
- handle.visible = false;
- }
- }
- if (this.axis === 'XYZE') {
- tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
- alignVector.copy(this.rotationAxis);
- handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(zeroVector, alignVector, unitY));
- handle.quaternion.multiply(tempQuaternion);
- handle.visible = this.dragging;
- }
- if (this.axis === 'E') {
- handle.visible = false;
- }
- } else if (handle.name === 'START') {
- handle.position.copy(this.worldPositionStart);
- handle.visible = this.dragging;
- } else if (handle.name === 'END') {
- handle.position.copy(this.worldPosition);
- handle.visible = this.dragging;
- } else if (handle.name === 'DELTA') {
- handle.position.copy(this.worldPositionStart);
- handle.quaternion.copy(this.worldQuaternionStart);
- tempVector.set(1e-10, 1e-10, 1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1);
- tempVector.applyQuaternion(this.worldQuaternionStart.clone().invert());
- handle.scale.copy(tempVector);
- handle.visible = this.dragging;
- } else {
- handle.quaternion.copy(quaternion);
- if (this.dragging) {
- handle.position.copy(this.worldPositionStart);
- } else {
- handle.position.copy(this.worldPosition);
- }
- if (this.axis) {
- handle.visible = this.axis.search(handle.name) !== -1;
- }
- } // If updating helper, skip rest of the loop
- continue;
- } // Align handles to current local or world rotation
- handle.quaternion.copy(quaternion);
- if (this.mode === 'translate' || this.mode === 'scale') {
- // Hide translate and scale axis facing the camera
- var AXIS_HIDE_TRESHOLD = 0.99;
- var PLANE_HIDE_TRESHOLD = 0.2;
- var AXIS_FLIP_TRESHOLD = 0.0;
- if (options.dontHideWhenFaceCamera) ; else {
- if (handle.name === 'X' || handle.name === 'XYZX') {
- if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- if (handle.name === 'Y' || handle.name === 'XYZY') {
- if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- if (handle.name === 'Z' || handle.name === 'XYZZ') {
- if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- if (handle.name === 'XY') {
- if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- if (handle.name === 'YZ') {
- if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- if (handle.name === 'XZ') {
- if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
- handle.scale.set(1e-10, 1e-10, 1e-10);
- handle.visible = false;
- }
- }
- } // Flip translate and scale axis ocluded behind another axis
- var zReverse = false;
- if (alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
- zReverse = true;
- } //xzw modify : remove backward arrow
- if (handle.name.search('X') !== -1) {
- if (alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
- /* if ( handle.tag === 'fwd' ) {
- handle.visible = false;
- } else {
- handle.scale.x *= - 1;
- }
- } else if ( handle.tag === 'bwd' ) {
- handle.visible = false;*/
- //反向
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['x-'];
- } else {
- handle.scale.x *= -1;
- }
- if (this.space == 'world') {
- handle.position.add(new THREE.Vector3(-0.1, 0, 0));
- } else {
- if (this.parent.object) {
- //放置在边缘
- 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));
- }
- }
- } else {
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['x+'];
- }
- if (this.space == 'world') {
- handle.position.add(new THREE.Vector3(0.1, 0, 0));
- } else {
- if (this.parent.object) {
- //放置在边缘
- 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));
- }
- }
- }
- }
- if (handle.name.search('Y') !== -1) {
- if (alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
- /* if ( handle.tag === 'fwd' ) {
- handle.visible = false;
- } else {
- handle.scale.y *= - 1;
- }
- } else if ( handle.tag === 'bwd' ) {
- handle.visible = false;
- */
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['y-'];
- } else handle.scale.y *= -1;
- 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));
- } else {
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['y+'];
- }
- 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));
- }
- }
- if (handle.name.search('Z') !== -1) {
- if (zReverse) {
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['z-'];
- } else handle.scale.z *= -1;
- if (this.space == 'world') handle.position.add(new THREE.Vector3(0, 0, -0.1));
- } else {
- if (handle.type == 'Fatline') {
- handle.geometry = fatLineGeos['z+'];
- }
- /* if(this.parent.object ){
- if(this.mode != "scale" ){
- handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
- }else{
- handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
- }
- } */
- 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));
- }
- }
- } else if (this.mode === 'rotate') {
- // Align handles to current local or world rotation
- tempQuaternion2.copy(quaternion);
- alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
- if (handle.name.search('E') !== -1) {
- handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(this.eye, zeroVector, unitY));
- }
- if (handle.name === 'X') {
- if (this.spaceForRotate) {
- quaternion = this.spaceForRotate.x === 'local' ? this.worldQuaternion : identityQuaternion;
- tempQuaternion2.copy(quaternion);
- alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
- }
- tempQuaternion.setFromAxisAngle(unitX, Math.atan2(-alignVector.y, alignVector.z));
- tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
- handle.quaternion.copy(tempQuaternion);
- }
- if (handle.name === 'Y') {
- if (this.spaceForRotate) {
- quaternion = this.spaceForRotate.y === 'local' ? this.worldQuaternion : identityQuaternion;
- tempQuaternion2.copy(quaternion);
- alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
- }
- tempQuaternion.setFromAxisAngle(unitY, Math.atan2(alignVector.x, alignVector.z));
- tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
- handle.quaternion.copy(tempQuaternion);
- }
- if (handle.name === 'Z') {
- if (this.spaceForRotate) {
- quaternion = this.spaceForRotate.z === 'local' ? this.worldQuaternion : identityQuaternion;
- tempQuaternion2.copy(quaternion);
- alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
- }
- tempQuaternion.setFromAxisAngle(unitZ, Math.atan2(alignVector.y, alignVector.x));
- tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
- handle.quaternion.copy(tempQuaternion);
- }
- } // Hide disabled axes
- handle.visible = handle.visible && (handle.name.indexOf('X') === -1 || this.showX);
- handle.visible = handle.visible && (handle.name.indexOf('Y') === -1 || this.showY);
- handle.visible = handle.visible && (handle.name.indexOf('Z') === -1 || this.showZ);
- handle.visible = handle.visible && (handle.name.indexOf('E') === -1 || this.showX && this.showY && this.showZ); // highlight selected axis
- handle.material._opacity = handle.material._opacity || handle.material.opacity;
- handle.material._color = handle.material._color || handle.material.color.clone();
- handle.material.color.copy(handle.material._color);
- handle.material.opacity = handle.material._opacity;
- if (!this.enabled) {
- handle.material.opacity *= 0.5;
- handle.material.color.lerp(new Color(1, 1, 1), 0.5);
- } else if (this.axis) {
- if (handle.name === this.axis) {
- handle.material.opacity = 1.0;
- handle.material.color.lerp(new Color(1, 1, 1), 0.5);
- } else if (this.axis.split('').some(function (a) {
- return handle.name === a;
- })) {
- handle.material.opacity = 1.0;
- handle.material.color.lerp(new Color(1, 1, 1), 0.5);
- } else {
- handle.material.opacity *= 0.25;
- handle.material.color.lerp(new Color(1, 1, 1), 0.5);
- }
- }
- }
- Object3D.prototype.updateMatrixWorld.call(this);
- };
- return _this2;
- }
- return TransformControlsGizmo;
- }(THREE.Object3D); // TransformControlsGizmo.prototype = Object.assign(Object.create(Object3D.prototype), {
- // constructor: TransformControlsGizmo,
- // isTransformControlsGizmo: true,
- // })
- var unitX = new THREE.Vector3(1, 0, 0);
- var unitY = new THREE.Vector3(0, 1, 0);
- var unitZ = new THREE.Vector3(0, 0, 1);
- var tempVector$1 = new THREE.Vector3();
- var dirVector = new THREE.Vector3();
- var alignVector = new THREE.Vector3();
- var tempMatrix = new THREE.Matrix4();
- var identityQuaternion = new THREE.Quaternion();
- var unitX = new THREE.Vector3(1, 0, 0);
- var unitY = new THREE.Vector3(0, 1, 0);
- var unitZ = new THREE.Vector3(0, 0, 1);
- var tempVector$1 = new THREE.Vector3();
- var dirVector = new THREE.Vector3();
- var alignVector = new THREE.Vector3();
- var tempMatrix = new THREE.Matrix4();
- var identityQuaternion = new THREE.Quaternion();
- var TransformControlsPlane = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(TransformControlsPlane, _THREE$Mesh);
- var _super3 = _createSuper$1E(TransformControlsPlane);
- function TransformControlsPlane(options) {
- var _this3;
- _classCallCheck(this, TransformControlsPlane);
- _this3 = _super3.call(this, new PlaneBufferGeometry(10000, 10000, 2, 2), new MeshBasicMaterial({
- color: '#ff0000',
- visible: false,
- wireframe: false,
- side: DoubleSide,
- transparent: true,
- opacity: 0.6
- }));
- _this3.type = 'TransformControlsPlane';
- return _this3;
- }
- _createClass(TransformControlsPlane, [{
- key: "updateMatrixWorld",
- value: function updateMatrixWorld() {
- var space = this.space; //this.position.copy( this.worldPosition );//xzw ��
- this.parent.intersect ? this.position.copy(this.parent.intersect.position) : this.position.copy(this.worldPosition);
- if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
- unitX.set(1, 0, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
- unitY.set(0, 1, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
- unitZ.set(0, 0, 1).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion); // Align the plane for current transform mode, axis and space.
- alignVector.copy(unitY);
- switch (this.mode) {
- case 'translate':
- case 'scale':
- switch (this.axis) {
- case 'X':
- alignVector.copy(this.eye).cross(unitX);
- 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 ));
- break;
- case 'Y':
- alignVector.copy(this.eye).cross(unitY);
- dirVector.copy(unitY).cross(alignVector);
- break;
- case 'Z':
- alignVector.copy(this.eye).cross(unitZ);
- dirVector.copy(unitZ).cross(alignVector);
- break;
- case 'XY':
- dirVector.copy(unitZ);
- break;
- case 'YZ':
- dirVector.copy(unitX);
- break;
- case 'XZ':
- alignVector.copy(unitZ);
- dirVector.copy(unitY);
- break;
- case 'XYZ':
- case 'E':
- default:
- //xzw add for scale xyzz
- dirVector.set(0, 0, 0);
- break;
- }
- break;
- case 'rotate':
- default:
- // special case for rotate
- dirVector.set(0, 0, 0);
- } //this.axis && console.log(this.axis)
- if (dirVector.length() === 0) {
- // If in rotate mode, make the plane parallel to camera
- this.quaternion.copy(this.cameraQuaternion);
- } else {
- tempMatrix.lookAt(tempVector$1.set(0, 0, 0), dirVector, alignVector);
- this.quaternion.setFromRotationMatrix(tempMatrix);
- }
- Object3D.prototype.updateMatrixWorld.call(this);
- }
- }]);
- return TransformControlsPlane;
- }(THREE.Mesh); // TransformControlsPlane.prototype = Object.assign(Object.create(Mesh.prototype), {
- 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); }; }
- 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; } }
- var History = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(History, _THREE$EventDispatche);
- var _super = _createSuper$1D(History);
- function History(o) {
- var _this;
- _classCallCheck(this, History);
- _this = _super.call(this);
- _this.undoList = [];
- _this.redoList = [];
- _this.applyData = o.applyData; //应用数据的方法
- _this.getData = o.getData; //获取数据的方法
- _this.dataBefore;
- o.player.domElement.addEventListener('keydown', function (e) {
- if (e.keyCode == 90 && e.ctrlKey) {
- //Z
- _this.undo();
- } else if (e.keyCode == 89 && e.ctrlKey) {
- //Y
- _this.redo();
- }
- });
- return _this;
- }
- _createClass(History, [{
- key: "undo",
- value: function undo() {
- //回退
- var length = this.undoList.length;
- if (length > 0) {
- var unExist;
- var last = this.undoList.pop();
- this.applyData && (unExist = !this.applyData(last.before));
- unExist || this.redoList.push(last);
- unExist && this.undo(); //找不到就回退下一个。
- this.dispatchEvent('undo'); //console.log('undo',last)
- }
- }
- }, {
- key: "redo",
- value: function redo() {
- //撤销回退
- this.undoList.length;
- var last = this.redoList.pop();
- if (last) {
- //注意:每行的顺序不能乱
- this.undoList.push(last);
- this.applyData && this.applyData(last.after);
- this.dispatchEvent('redo'); //console.log('redo',last)
- }
- }
- }, {
- key: "beforeChange",
- value: function beforeChange(o) {
- //在变化之前(可能执行好几次直到变化完,但只有第一次有效)。 o的内容完全根据getData怎么定义
- if (!this.dataBefore) {
- var data = this.getData(o);
- data && (this.dataBefore = data);
- }
- }
- }, {
- key: "afterChange",
- value: function afterChange(o) {
- //变化结束,从beforeChange到此算一次操作。
- if (this.dataBefore) {
- this.writeIn({
- before: this.dataBefore,
- after: this.getData(o)
- }); //写入某物体变化前和变化后的状态
- this.dataBefore = null;
- }
- }
- }, {
- key: "writeIn",
- value: function writeIn(data) {
- this.redoList.length = 0; //一旦录入新的操作,就不允许undo了
- this.undoList.push(data); //console.log('新增undo', data)
- }
- }, {
- key: "clear",
- value: function clear() {
- this.redoList.length = 0;
- this.undoList.length = 0;
- this.dataBefore = null;
- }
- }]);
- return History;
- }(THREE.EventDispatcher);
- var CursorDeal = {
- priorityEvent: [//在前面的优先级高
- {
- hoverFirstMarker: 'pointer'
- }, {
- polygon_isIntersectSelf: 'not-allowed'
- }, {
- polygon_AtWrongPlace: 'not-allowed'
- }, {
- markerMove: 'grab'
- }, {
- crosshair: 'crosshair'
- }, {
- grabbing: 'grabbing'
- }, //通用
- {
- hoverGrab: 'grab'
- }, //通用
- {
- moving: 'move'
- }, //通用
- //grab move crosshair not-allowed
- {
- hoverTag3d: 'pointer'
- }, {
- polygonMark_move: 'move'
- }, {
- polygonMark_hover: 'pointer'
- }, {
- polygonMark_subPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_sub.png') + '),auto'
- }, {
- polygonMark_addPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_add.png') + '),auto'
- }, {
- polygonMark_pen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen.png') + '),auto'
- }, {
- hoverTranHandle: 'grab'
- }, {
- dragOverlay: 'move'
- }, {
- hoverOverlay: 'pointer'
- }, {
- hoverMonitor: 'pointer'
- }, {
- addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
- }, {
- addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
- }, {
- hoverFootMarker: 'pointer'
- }, {
- hoverView: 'pointer'
- }, {
- dragView: 'move'
- }, {
- viewChoosePos: 'pointer'
- }],
- list: [],
- //当前存在的cursor状态
- currentCursorIndex: null,
- init: function init(player) {
- /* app.Scene.on('loaded', () => {
- player = this.app.core.get('Player')
- this.domElements = [player.domeElement];
- }) */
- this.domElements = [player.domElement];
- },
- add: function add(name) {
- var priorityItem = this.priorityEvent.find(function (e) {
- return e[name];
- });
- if (!priorityItem) {
- console.error('CursorDeal 未定义优先级 name:' + name);
- return;
- }
- if (!this.list.includes(name)) {
- this.judge({
- addItem: priorityItem,
- name
- });
- this.list.push(name);
- }
- },
- remove: function remove(name) {
- var index = this.list.indexOf(name);
- if (index > -1) {
- this.list.splice(index, 1);
- this.judge();
- }
- },
- judge: function judge() {
- var _this = this;
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //console.log(o,this.list)
- if (o.addItem) {
- var addIndex = this.priorityEvent.indexOf(o.addItem);
- if (addIndex < this.currentCursorIndex || this.currentCursorIndex == void 0) {
- //console.log(o.addItem[o.name])
- this.domElements.forEach(function (e) {
- return e.style.cursor = o.addItem[o.name];
- });
- this.currentCursorIndex = addIndex;
- }
- } else {
- var levelMax = {
- index: Infinity,
- cursor: null
- };
- this.list.forEach(function (name) {
- var priorityItem = _this.priorityEvent.find(function (e) {
- return e[name];
- });
- var index = _this.priorityEvent.indexOf(priorityItem);
- if (index < levelMax.index) {
- levelMax.index = index;
- levelMax.cursor = priorityItem[name];
- }
- });
- this.currentCursorIndex = levelMax.index;
- this.domElements.forEach(function (e) {
- return e.style.cursor = levelMax.cursor || '';
- }); //console.log(levelMax.cursor)
- }
- }
- };
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var OpaWhenNotSelect = 0.6;
- var ScaleRatio = 3;
- var OutlineColor = 0x666666;
- var config$3 = {
- axis: {
- x: {
- color: '#ea3f3f'
- },
- xyz: {
- color: '#ccc'
- },
- y: {
- color: '#86c215'
- },
- z: {
- color: '#3396f8'
- }
- }
- };
- var TransformationTool = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(TransformationTool, _THREE$Object3D);
- var _super = _createSuper$1C(TransformationTool);
- function TransformationTool(player) {
- var _this;
- _classCallCheck(this, TransformationTool);
- _this = _super.call(this);
- _this.player = player;
- _this.modesEnabled = {}; //add
- _this.visible = false;
- _this.selection = [];
- _this.pivot = new THREE.Vector3();
- _this.dragging = false;
- _this.showPickVolumes = false;
- /*
- this.viewer.addEventListener('global_touchstart',(e)=>{ //add
- this.update()
- })
- this.viewer.addEventListener('global_mousemove',(e)=>{ //add
- this.onPointerMove()
- }) */
- _this.player.on('update', _this.update.bind(_assertThisInitialized(_this)));
- var red = config$3.axis.x.color;
- var green = config$3.axis.y.color;
- var blue = config$3.axis.z.color;
- var white = config$3.axis.xyz.color;
- _this.activeHandle = null;
- _this.scaleHandles = {
- 'scale.x+': {
- name: 'scale.x+',
- node: new THREE.Object3D(),
- color: red,
- alignment: [+1, +0, +0]
- },
- 'scale.x-': {
- name: 'scale.x-',
- node: new THREE.Object3D(),
- color: red,
- alignment: [-1, +0, +0]
- },
- 'scale.y+': {
- name: 'scale.y+',
- node: new THREE.Object3D(),
- color: green,
- alignment: [+0, +1, +0]
- },
- 'scale.y-': {
- name: 'scale.y-',
- node: new THREE.Object3D(),
- color: green,
- alignment: [+0, -1, +0]
- },
- 'scale.z+': {
- name: 'scale.z+',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [+0, +0, +1]
- },
- 'scale.z-': {
- name: 'scale.z-',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [+0, +0, -1]
- },
- lines: {
- name: 'lines',
- node: new THREE.Object3D(),
- dontScale: true
- } //add
- };
- _this.focusHandles = {
- 'focus.x+': {
- name: 'focus.x+',
- node: new THREE.Object3D(),
- color: red,
- alignment: [+1, +0, +0]
- },
- 'focus.x-': {
- name: 'focus.x-',
- node: new THREE.Object3D(),
- color: red,
- alignment: [-1, +0, +0]
- },
- 'focus.y+': {
- name: 'focus.y+',
- node: new THREE.Object3D(),
- color: green,
- alignment: [+0, +1, +0]
- },
- 'focus.y-': {
- name: 'focus.y-',
- node: new THREE.Object3D(),
- color: green,
- alignment: [+0, -1, +0]
- },
- 'focus.z+': {
- name: 'focus.z+',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [+0, +0, +1]
- },
- 'focus.z-': {
- name: 'focus.z-',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [+0, +0, -1]
- }
- };
- _this.translationHandles = {
- 'translation.x': {
- name: 'translation.x',
- node: new THREE.Object3D(),
- color: red,
- alignment: [1, 0, 0]
- },
- 'translation.y': {
- name: 'translation.y',
- node: new THREE.Object3D(),
- color: green,
- alignment: [0, 1, 0]
- },
- 'translation.z': {
- name: 'translation.z',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [0, 0, 1]
- },
- //add
- 'translation.xyz': {
- name: 'translation.xyz',
- node: new THREE.Object3D(),
- color: white,
- alignment: [0, 0, 0],
- alignment2: [1, 1, 1]
- },
- 'translation.plane.xy': {
- name: 'translation.plane.xy',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [0, 0, 1],
- alignment2: [1, 1, 0]
- },
- 'translation.plane.yz': {
- name: 'translation.plane.yz',
- node: new THREE.Object3D(),
- color: red,
- alignment: [1, 0, 0],
- alignment2: [0, 1, 1]
- },
- 'translation.plane.xz': {
- name: 'translation.plane.xz',
- node: new THREE.Object3D(),
- color: green,
- alignment: [0, 1, 0],
- alignment2: [1, 0, 1]
- }
- };
- _this.rotationHandles = {
- 'rotation.x': {
- name: 'rotation.x',
- node: new THREE.Object3D(),
- color: red,
- alignment: [1, 0, 0]
- },
- 'rotation.y': {
- name: 'rotation.y',
- node: new THREE.Object3D(),
- color: green,
- alignment: [0, 1, 0]
- },
- 'rotation.z': {
- name: 'rotation.z',
- node: new THREE.Object3D(),
- color: blue,
- alignment: [0, 0, 1]
- }
- };
- _this.handles = Object.assign({}, _this.scaleHandles, {} , _this.translationHandles, _this.rotationHandles);
- _this.pickVolumes = [];
- _this.initializeScaleHandles();
- _this.initializeFocusHandles();
- _this.initializeTranslationHandles();
- _this.initializeRotationHandles();
- /* let boxFrameGeometry = new THREE.Geometry();
- {
- // bottom
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
- // top
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
- // sides
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
- boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
- } */
- var boxFrameGeometry = new THREE.BufferGeometry();
- {
- var vertices = []; // bottom
- vertices.push(-0.5, -0.5, 0.5);
- vertices.push(0.5, -0.5, 0.5);
- vertices.push(0.5, -0.5, 0.5);
- vertices.push(0.5, -0.5, -0.5);
- vertices.push(0.5, -0.5, -0.5);
- vertices.push(-0.5, -0.5, -0.5);
- vertices.push(-0.5, -0.5, -0.5);
- vertices.push(-0.5, -0.5, 0.5); // top
- vertices.push(-0.5, 0.5, 0.5);
- vertices.push(0.5, 0.5, 0.5);
- vertices.push(0.5, 0.5, 0.5);
- vertices.push(0.5, 0.5, -0.5);
- vertices.push(0.5, 0.5, -0.5);
- vertices.push(-0.5, 0.5, -0.5);
- vertices.push(-0.5, 0.5, -0.5);
- vertices.push(-0.5, 0.5, 0.5); // sides
- vertices.push(-0.5, -0.5, 0.5);
- vertices.push(-0.5, 0.5, 0.5);
- vertices.push(0.5, -0.5, 0.5);
- vertices.push(0.5, 0.5, 0.5);
- vertices.push(0.5, -0.5, -0.5);
- vertices.push(0.5, 0.5, -0.5);
- vertices.push(-0.5, -0.5, -0.5);
- vertices.push(-0.5, 0.5, -0.5);
- var positions = new Float32Array(vertices);
- boxFrameGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
- }
- _this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({
- color: 0xffff00
- }));
- _this.add(_this.frame); //------------------add-----------------------
- _this.setModeEnable(['translation']); //init
- //Potree.Utils.setObjectLayers(this.root, 'transformationTool' )
- _this.traverse(function (e) {
- e.pickDontCheckDis = true; //pick时不需要识别是否在点云之上
- });
- {
- var exist = function exist(object) {
- //是否没被删除(暂时不考虑换了parent)
- while (object.parent) {
- object = object.parent;
- }
- if (object instanceof THREE.Scene) {
- return true;
- }
- };
- _this.history = new History({
- //也可以写到全局,但需要加个判断物品是否存在的函数
- applyData: function applyData(data) {
- if (exist(data.object)) {
- data.matrix.decompose(data.object.position, data.object.quaternion, data.object.scale);
- data.object.matrix.copy(data.matrix);
- _this.dispatchEvent({
- type: 'changeByHistory',
- data
- });
- return true;
- }
- },
- getData: function getData(data) {
- return data;
- },
- player: _this.player
- });
- _this.addEventListener('transformed', function (e) {
- var object = _this.selection[0];
- _this.history.beforeChange({
- object,
- matrix: e.matrixBefore.clone()
- });
- });
- _this.addEventListener('stopDrag', function (e) {
- var object = _this.selection[0];
- object && _this.history.afterChange({
- object,
- matrix: object.matrix.clone()
- });
- });
- }
- return _this;
- }
- _createClass(TransformationTool, [{
- key: "attach",
- value: function attach(object) {
- //add
- this.selection = [object];
- }
- }, {
- key: "detach",
- value: function detach(object) {
- //add
- if (!object) return this.selection = [];
- var index = this.selection.indexOf(object);
- this.selection.splice(index, 1);
- }
- }, {
- key: "setModeEnable",
- value: function setModeEnable() {
- var _this2 = this;
- var enableModes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
- //xzw add
- var length = 0;
- ['translation', 'scale', 'rotation'].forEach(function (mode) {
- var handels = _this2[mode + 'Handles'];
- var enable = enableModes.includes(mode);
- for (var o in handels) {
- common$1.updateVisible(handels[o].node, 'modeForce', !!enable);
- }
- _this2.modesEnabled[mode] = !!enable;
- enable && length++;
- });
- if (this.style != 'mixedModes' && length > 1) {
- this.changeStyle('mixedModes');
- } else if (this.style != 'singleMode' && length == 1) {
- this.changeStyle('singleMode');
- }
- }
- }, {
- key: "changeStyle",
- value: function changeStyle(style) {
- var _this3 = this;
- // 切换单个mode & 多个mode混合 风格(因多个混合比较拥挤,需要做调整)
- var s1 = style == 'singleMode' ? 30 : 25;
- var s2 = style == 'singleMode' ? 15 : 10;
- ['x', 'y', 'z'].forEach(function (axis) {
- _this3.translationHandles['translation.' + axis].node.children.forEach(function (mesh) {
- if (mesh.name.includes('arrow')) {
- common$1.updateVisible(mesh, 'modeStyle', style == 'singleMode');
- } else if (mesh.name.includes('handle')) {
- mesh.material.lineWidth = style == 'singleMode' ? 5 : 7;
- }
- });
- _this3.rotationHandles['rotation.' + axis].translateNode.scale.set(s1, s1, s1);
- });
- ['xy', 'yz', 'xz'].forEach(function (axis) {
- var handle = _this3.translationHandles['translation.plane.' + axis];
- handle.node.children[0].scale.set(s2, s2, s2);
- handle.node.children[0].position.fromArray(handle.alignment2).multiplyScalar(s2 * 1.5);
- });
- common$1.updateVisible(this.scaleHandles['lines'].node, 'modeStyle', style == 'singleMode');
- this.style = style;
- }
- }, {
- key: "initializeTranslationHandles",
- value: function initializeTranslationHandles() {
- var _this4 = this;
- //大改
- var boxGeometry = new THREE.BoxGeometry(1, 1, 1);
- var length = 100,
- arrowRadius = 4,
- arrowHeight = 10;
- var arrowGeometry = new THREE.CylinderBufferGeometry(0, arrowRadius, arrowHeight, 12, 1, false); //add 箭头朝(0,1,0)
- var arrowInitialQua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2); //先将qua旋转到朝向0,0,-1, 因为一般quaternion不设置时默认表示朝向0,0,-1,
- var octahedronGeometry = new THREE.OctahedronBufferGeometry(5, 0);
- var planeGeometry = new THREE.PlaneBufferGeometry(1, 1);
- var _loop = function _loop() {
- var handleName = _Object$keys[_i];
- var handle = _this4.handles[handleName];
- var node = handle.node;
- _this4.add(node);
- node.name = handleName; //add
- var alignment = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
- var geometry = void 0,
- mesh = void 0,
- pickVolume = void 0,
- pickScale = void 0,
- position = void 0,
- lookAtPoint = void 0,
- hasPick = true,
- meshPickable = false,
- renderOrder = void 0;
- var matProp = {
- color: handle.color,
- opacity: OpaWhenNotSelect,
- transparent: true,
- side: handleName.includes('plane') ? THREE.DoubleSide : THREE.FrontSide
- };
- var material = new THREE.MeshBasicMaterial(matProp);
- var pickMaterial = new THREE.MeshNormalMaterial({
- opacity: 0.2,
- transparent: true,
- visible: _this4.showPickVolumes
- });
- if (handleName.includes('xyz')) {
- geometry = octahedronGeometry;
- meshPickable = true;
- renderOrder = 12;
- } else if (handleName.includes('plane')) {
- geometry = planeGeometry;
- meshPickable = true;
- position = _construct(THREE.Vector3, _toConsumableArray(handle.alignment2));
- lookAtPoint = alignment;
- if (handleName.includes('xy')) ; else if (handleName.includes('yz')) ; else if (handleName.includes('xz')) ;
- } else {
- geometry = boxGeometry;
- var point = new THREE.Vector3(0, 0, length / 2); //new THREE.Vector3().copy(alignment).multiplyScalar(length/2)
- mesh = LineDraw.createFatLine([point, point.clone().negate()], Object.assign(matProp, {
- lineWidth: 6
- }));
- lookAtPoint = alignment;
- renderOrder = 10;
- pickScale = new THREE.Vector3(4, 4, length + arrowHeight * 2); //pickScale = new THREE.Vector3(4, 4, 1.2)
- {
- var _arrow$position;
- var arrow = new THREE.Mesh(arrowGeometry, material);
- arrow.name = "".concat(handleName, ".arrow");
- arrow.renderOrder = 11;
- (_arrow$position = arrow.position).set.apply(_arrow$position, _toConsumableArray(handle.alignment)).multiplyScalar(length / 2 + arrowHeight / 2);
- arrow.lookAt(0, 0, 0);
- node.add(arrow);
- var arrow2 = arrow.clone();
- arrow2.position.negate();
- arrow2.lookAt(0, 0, 0);
- node.add(arrow2);
- arrow.quaternion.multiply(arrowInitialQua); //乘上初始旋转
- arrow2.quaternion.multiply(arrowInitialQua);
- }
- }
- mesh || (mesh = new THREE.Mesh(geometry, material));
- mesh.name = "".concat(handleName, ".handle");
- node.add(mesh);
- renderOrder && (mesh.renderOrder = renderOrder);
- lookAtPoint && mesh.lookAt(lookAtPoint);
- position && mesh.position.copy(position);
- if (!meshPickable && hasPick) {
- pickVolume = new THREE.Mesh(geometry, pickMaterial);
- pickScale && pickVolume.scale.copy(pickScale);
- } else if (meshPickable) {
- pickVolume = mesh;
- }
- if (pickVolume) {
- if (mesh != pickVolume) {
- mesh.add(pickVolume);
- pickVolume.name = "".concat(handleName, ".pick_volume");
- } else {
- pickVolume.name += ' & pick_volume';
- }
- pickVolume.handle = handleName;
- _this4.pickVolumes.push(pickVolume);
- }
- node.setOpacity = function (target) {
- if (handleName.includes('plane')) {
- var more = 1.5; //减掉更多,使min更低,max还是1
- target = 1 - (1 - target) * more;
- }
- var opacity = {
- x: material.opacity
- };
- var t = new TWEEN.Tween(opacity).to({
- x: target
- }, 0);
- t.onUpdate(function () {
- mesh.visible = opacity.x > 0;
- pickVolume && (pickVolume.visible = opacity.x > 0);
- material.opacity = opacity.x;
- mesh.material.opacity = opacity.x; //outlineMaterial.opacity = opacity.x;
- pickMaterial.opacity = opacity.x * 0.5;
- });
- t.start();
- };
- pickVolume.addEventListener('drag', function (e) {
- _this4.dragTranslationHandle(e);
- });
- pickVolume.addEventListener('drop', function (e) {
- _this4.dropTranslationHandle(e);
- });
- };
- for (var _i = 0, _Object$keys = Object.keys(this.translationHandles); _i < _Object$keys.length; _i++) {
- _loop();
- }
- }
- }, {
- key: "initializeScaleHandles",
- value: function initializeScaleHandles() {
- var _this5 = this;
- var sgSphere = new THREE.SphereGeometry(1, 32, 32);
- var sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);
- var _loop2 = function _loop2() {
- var _node$position;
- var handleName = _Object$keys2[_i2];
- var handle = _this5.scaleHandles[handleName];
- var node = handle.node;
- node.name = handleName; //add
- _this5.add(node);
- if (handleName == 'lines') {
- ['x', 'y', 'z'].forEach(function (axis) {
- var handle1_ = _this5.scaleHandles['scale.' + axis + '+'];
- var handle2_ = _this5.scaleHandles['scale.' + axis + '-'];
- var line = LineDraw.createFatLine([new THREE.Vector3().fromArray(handle1_.alignment).multiplyScalar(0.5), new THREE.Vector3().fromArray(handle2_.alignment).multiplyScalar(0.5)], {
- color: handle1_.color,
- lineWidth: 4
- } // , dontAlwaysSeen:true
- );
- node.add(line);
- });
- node.setOpacity = function (opacity) {
- opacity *= 0.6;
- node.children.forEach(function (e) {
- return e.material.opacity = opacity;
- });
- };
- return "continue";
- }
- (_node$position = node.position).set.apply(_node$position, _toConsumableArray(handle.alignment)).multiplyScalar(0.5);
- var material = new THREE.MeshBasicMaterial({
- color: handle.color,
- side: THREE.DoubleSide,
- //xzw add
- opacity: OpaWhenNotSelect,
- transparent: true
- });
- var outlineMaterial = new THREE.MeshBasicMaterial({
- color: OutlineColor,
- side: THREE.BackSide,
- opacity: OpaWhenNotSelect,
- transparent: true
- });
- var pickMaterial = new THREE.MeshNormalMaterial({
- opacity: 0.2,
- transparent: true,
- side: THREE.DoubleSide,
- //xzw add for orthoCam, 缩小画面时因球体放大导致到相机背面去了而看不到球体正面
- visible: _this5.showPickVolumes
- });
- var sphere = new THREE.Mesh(sgSphere, material);
- sphere.scale.set(5, 5, 5);
- sphere.name = "".concat(handleName, ".handle");
- node.add(sphere);
- sphere.renderOrder = 10;
- /* let outline = new THREE.Mesh(sgSphere, outlineMaterial);
- outline.scale.set(1.1, 1.1, 1.1);
- outline.name = `${handleName}.outline`;
- sphere.add(outline); */
- var pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);
- pickSphere.name = "".concat(handleName, ".pick_volume");
- pickSphere.scale.set(1.5, 1.5, 1.5);
- sphere.add(pickSphere);
- pickSphere.handle = handleName;
- _this5.pickVolumes.push(pickSphere);
- node.setOpacity = function (target) {
- var opacity = {
- x: material.opacity
- };
- var t = new TWEEN.Tween(opacity).to({
- x: target
- }, 0); //xzw改 原100毫秒,因为太慢容易选错
- t.onUpdate(function () {
- sphere.visible = opacity.x > 0;
- pickSphere.visible = opacity.x > 0;
- material.opacity = opacity.x;
- outlineMaterial.opacity = opacity.x;
- pickSphere.material.opacity = opacity.x * 0.5;
- });
- t.start();
- };
- pickSphere.addEventListener('drag', function (e) {
- return _this5.dragScaleHandle(e);
- });
- pickSphere.addEventListener('drop', function (e) {
- return _this5.dropScaleHandle(e);
- });
- };
- for (var _i2 = 0, _Object$keys2 = Object.keys(this.scaleHandles); _i2 < _Object$keys2.length; _i2++) {
- var _ret = _loop2();
- if (_ret === "continue") continue;
- }
- }
- }, {
- key: "initializeRotationHandles",
- value: function initializeRotationHandles() {
- var _this6 = this;
- var boldAdjust = 2.3;
- 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);
- var pickGeometry = new THREE.TorusGeometry(1.3, boldAdjust * 0.06, 6, 4, Math.PI / 2);
- var _loop3 = function _loop3() {
- var handleName = _Object$keys3[_i3];
- var handle = _this6.handles[handleName];
- var node = handle.node;
- _this6.add(node);
- node.name = handleName; //add
- var material = new THREE.MeshBasicMaterial({
- color: handle.color,
- opacity: OpaWhenNotSelect,
- transparent: true
- });
- /* let outlineMaterial = new THREE.MeshBasicMaterial({
- color: OutlineColor,
- side: THREE.BackSide,
- opacity: OpaWhenNotSelect,
- transparent: true
- }); */
- var pickMaterial = new THREE.MeshNormalMaterial({
- opacity: 0.2,
- transparent: true,
- visible: _this6.showPickVolumes
- });
- var box = new THREE.Mesh(torusGeometry, material);
- box.name = "".concat(handleName, ".handle");
- box.scale.set(30, 30, 30);
- box.lookAt(_construct(THREE.Vector3, _toConsumableArray(handle.alignment)));
- node.add(box);
- handle.translateNode = box;
- /* let outline = new THREE.Mesh(outlineGeometry, outlineMaterial);
- outline.name = `${handleName}.outline`;
- outline.scale.set(1, 1, 1);
- outline.renderOrder = 0;
- box.add(outline);
- */
- var pickVolume = new THREE.Mesh(pickGeometry, pickMaterial);
- pickVolume.name = "".concat(handleName, ".pick_volume");
- pickVolume.scale.set(1, 1, 1);
- pickVolume.handle = handleName;
- box.add(pickVolume);
- _this6.pickVolumes.push(pickVolume);
- node.setOpacity = function (target) {
- var opacity = {
- x: material.opacity
- };
- var t = new TWEEN.Tween(opacity).to({
- x: target
- }, 0);
- t.onUpdate(function () {
- box.visible = opacity.x > 0;
- pickVolume.visible = opacity.x > 0;
- material.opacity = opacity.x; //outlineMaterial.opacity = opacity.x;
- pickMaterial.opacity = opacity.x * 0.5;
- });
- t.start();
- };
- pickVolume.addEventListener('drag', function (e) {
- _this6.dragRotationHandle(e);
- });
- pickVolume.addEventListener('drop', function (e) {
- _this6.dropRotationHandle(e);
- });
- };
- for (var _i3 = 0, _Object$keys3 = Object.keys(this.rotationHandles); _i3 < _Object$keys3.length; _i3++) {
- _loop3();
- }
- }
- }, {
- key: "initializeFocusHandles",
- value: function initializeFocusHandles() {
- return; //add
- }
- }, {
- key: "dragRotationHandle",
- value: function dragRotationHandle(e) {
- var drag = e.drag;
- var handle = this.activeHandle;
- this.player.camera;
- if (!handle || !handle.name.includes('rotation')) {
- return;
- }
- var localNormal = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
- var n = new THREE.Vector3();
- n.copy(_construct(THREE.Vector4, _toConsumableArray(localNormal.toArray()).concat([0])).applyMatrix4(handle.node.matrixWorld));
- n.normalize();
- if (!drag.intersectionStart) {
- drag.intersectionStart = drag.point;
- drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());
- drag.handle = handle;
- var plane = new THREE.Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart);
- drag.dragPlane = plane;
- drag.pivot = drag.intersectionStart;
- } else {
- handle = drag.handle;
- }
- if (!drag.dragPlane) return; //xzw add 因有时候没有
- this.dragging = true;
- /* let pointer = this.player.inputHandler.pointer
- let domElement = this.player.renderer.domElement;
- let ray = Utils.mouseToRay(pointer, camera, domElement.clientWidth, domElement.clientHeight); */
- var ray = this.player.raycaster.ray;
- var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
- if (I) {
- var center = this.getWorldPosition(new THREE.Vector3()); //bounding中心
- var from = drag.pivot;
- var to = I;
- var v1 = from.clone().sub(center).normalize();
- var v2 = to.clone().sub(center).normalize();
- var angle = Math.acos(v1.dot(v2));
- var sign = Math.sign(v1.cross(v2).dot(n));
- angle = angle * sign;
- if (Number.isNaN(angle)) {
- return;
- }
- var matrixBefore = this.selection[0].matrix.clone();
- var normal = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
- var _iterator = _createForOfIteratorHelper$b(this.selection),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var selection = _step.value;
- //直接修改matrix,使整体绕boundingBox中心旋转。 xzw
- var quaternion = selection.quaternion.clone();
- var diffQua = new THREE.Quaternion().setFromAxisAngle(normal, angle); //变化量,参考 selection.rotateOnAxis(normal, angle);
- var moveToZero = new THREE.Matrix4().setPosition(center.clone().negate()); //先将boundingBox中心(整体)移动到原点
- var rotM = new THREE.Matrix4().makeRotationFromQuaternion(quaternion.clone().invert().premultiply(diffQua).premultiply(quaternion)); //再旋转。根据selection.rotateOnAxis,应该是旧的qua 右乘 diffQua,所以先用invert消掉旧的qua
- var moveBack = new THREE.Matrix4().setPosition(center.clone()); //移动回去,使boundingBox中心位置还原
- selection.matrix.premultiply(moveToZero).premultiply(rotM).premultiply(moveBack);
- selection.matrix.decompose(selection.position, selection.quaternion, selection.scale); //记录 (scale基本不变)
- selection.updateMatrixWorld(); //xzw add 保险起见立即update
- selection.dispatchEvent({
- type: 'orientation_changed',
- object: selection
- });
- selection.dispatchEvent({
- //当boundingBox中心不在原点时
- type: 'position_changed',
- object: selection
- });
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- this.dispatchEvent({
- type: 'transformed',
- changeType: ['orientation'],
- matrixBefore
- }); //add
- drag.pivot = I;
- }
- }
- }, {
- key: "dropRotationHandle",
- value: function dropRotationHandle(e) {
- this.dragging = false;
- this.setActiveHandle(null);
- this.dispatchEvent({
- type: 'stopDrag',
- handle: 'rotation'
- }); //add
- }
- }, {
- key: "dragTranslationHandle",
- value: function dragTranslationHandle(e) {
- //---大改,参考transformControls,为了加上xyz xy yz xz 这四个方向的变换。 (但感觉好像plane上有丢丢延迟?是因为drag延迟还是worldmatrix没更新)
- var drag = e.drag;
- var handle = this.activeHandle;
- this.player.camera;
- var direction = this.player.getDirection();
- if (handle && handle.name.includes('translation') && this.selection[0]) {
- var posWorld = this.getWorldPosition(new THREE.Vector3()); //bounding中心
- if (!drag.intersectionStart) {
- drag.intersectionStart = drag.point;
- drag.worldPositionStart = this.selection[0].getWorldPosition(new THREE.Vector3());
- drag.objectQua = this.selection[0].quaternion.clone(); //不考虑父级
- drag.objectQuaInv = drag.objectQua.clone().invert();
- this.dragging = true;
- }
- if (drag.intersectionStart) {
- var ray = this.player.raycaster.ray; //方向滑动所在面
- var normal;
- var axisName = handle.name.split('.').pop();
- if (axisName == 'xyz') {
- // 平行于屏幕滑动
- normal = direction;
- } else {
- var alignVector = new THREE.Vector3();
- normal = new THREE.Vector3();
- var unitX = new THREE.Vector3(1, 0, 0).applyQuaternion(drag.objectQua);
- var unitY = new THREE.Vector3(0, 1, 0).applyQuaternion(drag.objectQua);
- var unitZ = new THREE.Vector3(0, 0, 1).applyQuaternion(drag.objectQua);
- switch (axisName) {
- case 'x':
- alignVector.copy(direction).cross(unitX);
- normal.copy(unitX).cross(alignVector);
- break;
- case 'y':
- alignVector.copy(direction).cross(unitY);
- normal.copy(unitY).cross(alignVector);
- break;
- case 'z':
- alignVector.copy(direction).cross(unitZ);
- normal.copy(unitZ).cross(alignVector);
- break;
- case 'xy':
- normal.copy(unitZ);
- break;
- case 'yz':
- normal.copy(unitX);
- break;
- case 'xz':
- normal.copy(unitY);
- break;
- } //参考transformControls.使跟手
- }
- drag.dragPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, posWorld); //过center的与视线垂直的平面
- var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
- if (I) {
- var offset = new THREE.Vector3().subVectors(I, drag.worldPositionStart); //let offset = new THREE.Vector3().subVectors(iOnLine, drag.worldPositionStart);
- if (!drag.pointStart) {
- drag.pointStart = offset;
- } else {
- drag.pointEnd = offset;
- var diff = new THREE.Vector3().subVectors(drag.pointEnd, drag.pointStart);
- diff.applyQuaternion(drag.objectQuaInv); // 得到在该物体local空间上的offset
- if (!handle.name.includes('x')) diff.x = 0;
- if (!handle.name.includes('y')) diff.y = 0;
- if (!handle.name.includes('z')) diff.z = 0; //恢复为world offset
- diff.applyQuaternion(drag.objectQua); //-------------
- var matrixBefore = this.selection[0].matrix.clone();
- this.selection[0].position.copy(diff).add(drag.worldPositionStart);
- var _iterator2 = _createForOfIteratorHelper$b(this.selection),
- _step2;
- try {
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
- var selection = _step2.value;
- selection.updateMatrixWorld(); //xzw add 保险起见立即update
- selection.dispatchEvent({
- type: 'position_changed',
- object: selection
- });
- }
- } catch (err) {
- _iterator2.e(err);
- } finally {
- _iterator2.f();
- }
- this.dispatchEvent({
- type: 'transformed',
- changeType: ['position'],
- matrixBefore
- }); //add
- }
- }
- }
- }
- }
- }, {
- key: "dropTranslationHandle",
- value: function dropTranslationHandle(e) {
- this.dragging = false;
- this.setActiveHandle(null);
- this.dispatchEvent({
- type: 'stopDrag',
- handle: 'translation'
- }); //add
- }
- }, {
- key: "dropScaleHandle",
- value: function dropScaleHandle(e) {
- this.dragging = false;
- this.setActiveHandle(null);
- this.dispatchEvent({
- type: 'stopDrag',
- handle: 'scale'
- }); //add
- }
- }, {
- key: "dragScaleHandle",
- value: function dragScaleHandle(e) {
- var drag = e.drag;
- var handle = this.activeHandle;
- if (!handle || !handle.name.includes('scale')) return;
- var camera = this.player.camera;
- if (!drag.intersectionStart) {
- drag.intersectionStart = drag.point;
- drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());
- drag.handle = handle;
- var start = drag.intersectionStart;
- var dir = _construct(THREE.Vector4, _toConsumableArray(handle.alignment).concat([0])).applyMatrix4(this.matrixWorld);
- var end = new THREE.Vector3().addVectors(start, dir);
- var line = new THREE.Line3(start.clone(), end.clone());
- drag.line = line;
- var normal;
- if (camera.type == 'OrthographicCamera') {
- //xzw add
- normal = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion);
- } else {
- var camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());
- normal = new THREE.Vector3().subVectors(camera.position, camOnLine);
- }
- var plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); //过轴线的一个能铺满屏幕的平面
- drag.dragPlane = plane;
- drag.pivot = drag.intersectionStart; //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);
- } else {
- handle = drag.handle;
- }
- this.dragging = true;
- if (drag.dragPlane) {
- //xzw add 因有时候没有
- /* let pointer = this.viewer.inputHandler.pointer
- let domElement = this.viewer.renderer.domElement;
- let ray = Utils.mouseToRay(pointer, camera, domElement.clientWidth, domElement.clientHeight); */
- var ray = this.player.raycaster.ray;
- var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
- if (I) {
- var iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());
- var direction = handle.alignment.reduce(function (a, v) {
- return a + v;
- }, 0);
- var toObjectSpace = this.selection[0].matrixWorld.clone().invert();
- var iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace);
- var pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace);
- var diffOS = new THREE.Vector3().subVectors(iOnLineOS, pivotOS);
- var dragDirectionOS = diffOS.clone().normalize();
- if (iOnLine.distanceTo(drag.pivot) === 0) {
- dragDirectionOS.set(0, 0, 0);
- }
- var dragDirection = dragDirectionOS.dot(_construct(THREE.Vector3, _toConsumableArray(handle.alignment)));
- var alignment = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
- var diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);
- var diffScale = alignment.clone().multiplyScalar(diff.length() * direction * dragDirection); //let diffPosition = diff.clone().multiplyScalar(0.5); //这个仅当bound包含原点才准确。
- var matrixBefore = this.selection[0].matrix.clone();
- var _iterator3 = _createForOfIteratorHelper$b(this.selection),
- _step3;
- try {
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
- var selection = _step3.value;
- //xzw 改:否则不跟手
- var _selection$boundingBo = selection.boundingBox,
- min = _selection$boundingBo.min,
- max = _selection$boundingBo.max;
- var fixPoint = alignment.x != 0 ? (alignment.x > 0 ? min : max).clone().setY(0).setZ(0) //要保证另一边不能移动
- : alignment.y != 0 ? (alignment.y > 0 ? min : max).clone().setX(0).setZ(0) : (alignment.z > 0 ? min : max).clone().setX(0).setY(0);
- var fixPointBefore = fixPoint.clone().applyMatrix4(selection.matrixWorld);
- var size = selection.boundingBox.getSize(new THREE.Vector3());
- var diffScale_ = diffScale.clone().divide(size);
- size.x == 0 && (diffScale_.x = 0); //add 若为0,不改此轴大小
- size.y == 0 && (diffScale_.y = 0);
- size.z == 0 && (diffScale_.z = 0);
- selection.scale.add(diffScale_);
- selection.scale.max(new THREE.Vector3(0.1, 0.1, 0.1)); //selection.position.add(diffPosition);
- selection.updateMatrixWorld();
- var fixPointAfter = fixPoint.clone().applyMatrix4(this.selection[0].matrixWorld);
- selection.position.sub(new THREE.Vector3().subVectors(fixPointAfter, fixPointBefore)); //保证另一边不能移动所需要的位移
- selection.updateMatrixWorld(); //xzw add 保险起见立即update
- selection.dispatchEvent({
- type: 'position_changed',
- object: selection
- });
- selection.dispatchEvent({
- type: 'scale_changed',
- object: selection
- });
- }
- } catch (err) {
- _iterator3.e(err);
- } finally {
- _iterator3.f();
- }
- this.dispatchEvent({
- type: 'transformed',
- changeType: ['position', 'scale'],
- matrixBefore
- }); //add
- drag.pivot.copy(iOnLine); //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);
- }
- }
- }
- }, {
- key: "setActiveHandle",
- value: function setActiveHandle(handle) {
- if (this.dragging) {
- return;
- }
- if (this.activeHandle === handle) {
- return;
- }
- this.activeHandle = handle;
- if (handle === null) {
- for (var _i5 = 0, _Object$keys5 = Object.keys(this.handles); _i5 < _Object$keys5.length; _i5++) {
- var handleName = _Object$keys5[_i5];
- var _handle = this.handles[handleName];
- _handle.node.setOpacity(0);
- }
- }
- this.activeHandle ? CursorDeal.add('hoverTranHandle') : CursorDeal.remove('hoverTranHandle');
- for (var _i7 = 0, _Object$keys7 = Object.keys(this.translationHandles); _i7 < _Object$keys7.length; _i7++) {
- var _handleName2 = _Object$keys7[_i7];
- var _handle3 = this.translationHandles[_handleName2];
- if (this.activeHandle === _handle3) {
- _handle3.node.setOpacity(1.0);
- } else {
- _handle3.node.setOpacity(OpaWhenNotSelect);
- }
- }
- for (var _i8 = 0, _Object$keys8 = Object.keys(this.rotationHandles); _i8 < _Object$keys8.length; _i8++) {
- var _handleName3 = _Object$keys8[_i8];
- var _handle4 = this.rotationHandles[_handleName3]; //if(this.activeHandle === handle){
- // handle.node.setOpacity(1.0);
- //}else{
- // handle.node.setOpacity(OpaWhenNotSelect)
- //}
- _handle4.node.setOpacity(OpaWhenNotSelect);
- }
- for (var _i9 = 0, _Object$keys9 = Object.keys(this.scaleHandles); _i9 < _Object$keys9.length; _i9++) {
- var _handleName4 = _Object$keys9[_i9];
- var _handle5 = this.scaleHandles[_handleName4];
- if (this.activeHandle === _handle5) {
- _handle5.node.setOpacity(1.0);
- for (var _i10 = 0, _Object$keys10 = Object.keys(this.translationHandles); _i10 < _Object$keys10.length; _i10++) {
- var translationHandleName = _Object$keys10[_i10];
- var translationHandle = this.translationHandles[translationHandleName];
- translationHandle.node.setOpacity(OpaWhenNotSelect);
- } //let relatedTranslationHandle = this.translationHandles[
- // handle.name.replace("scale", "translation").replace(/[+-]/g, "")];
- //let relatedTranslationNode = relatedTranslationHandle.node;
- //relatedTranslationNode.setOpacity(OpaWhenNotSelect);
- } else {
- _handle5.node.setOpacity(OpaWhenNotSelect);
- }
- }
- if (handle) {
- handle.node.setOpacity(1.0);
- }
- }
- }, {
- key: "update",
- value: function update() {
- var _this8 = this;
- if (this.selection.length === 1) {
- this.visible = true;
- this.updateMatrix();
- this.updateMatrixWorld();
- var selected = this.selection[0]; //selected.updateMatrixWorld();//add 否则scale的sphere抖动
- selected.matrixWorld;
- var camera = this.player.camera; //this.viewer.scene.getActiveCamera();
- var domElement = this.player.domElement;
- var center = selected.boundingBox.getCenter(new THREE.Vector3()).clone().applyMatrix4(selected.matrixWorld);
- var scale = selected.boundingBox.getSize(new THREE.Vector3()).multiply(selected.scale);
- scale.max(new THREE.Vector3(0.1, 0.1, 0.1)); //xzw add 如果是plane,没有厚度,会导致该tool消失
- this.scale.copy(scale);
- this.position.copy(center);
- this.rotation.copy(selected.rotation); //这里只考虑当前子级的scale rotation
- //如果是世界坐标 (缩放方向有bug。)
- /*
- let boundingBox = selected.boundingBox.clone().applyMatrix4(selected.matrixWorld);
- let center = boundingBox.getCenter(new THREE.Vector3())
- this.position.copy(center);
- this.scale.copy(boundingBox.getSize(new THREE.Vector3()));
-
- */
- this.updateMatrixWorld();
- {
- // adjust rotation handles
- if (!this.dragging) {
- if (this.modesEnabled.rotation || this.modesEnabled.translation) {
- var tWorld = this.matrixWorld;
- var tObject = tWorld.clone().invert();
- var camObjectPos = camera.getWorldPosition(new THREE.Vector3()).applyMatrix4(tObject);
- if (this.modesEnabled.translation) {
- ['xy', 'yz', 'xz'].forEach(function (axis) {
- var handle = _this8.translationHandles['translation.plane.' + axis];
- var pos = handle.node.children[0].position;
- camObjectPos.x && (pos.x = Math.sign(camObjectPos.x) * Math.abs(pos.x));
- camObjectPos.y && (pos.y = Math.sign(camObjectPos.y) * Math.abs(pos.y));
- camObjectPos.z && (pos.z = Math.sign(camObjectPos.z) * Math.abs(pos.z));
- });
- }
- if (this.modesEnabled.rotation) {
- var above = camObjectPos.z > 0;
- var below = !above;
- var PI_HALF = Math.PI / 2;
- var x = this.rotationHandles['rotation.x'].node.rotation;
- var y = this.rotationHandles['rotation.y'].node.rotation;
- var z = this.rotationHandles['rotation.z'].node.rotation;
- x.order = 'ZYX';
- y.order = 'ZYX';
- if (above) {
- if (camObjectPos.x > 0 && camObjectPos.y > 0) {
- x.x = 1 * PI_HALF;
- y.y = 3 * PI_HALF;
- z.z = 0 * PI_HALF;
- } else if (camObjectPos.x < 0 && camObjectPos.y > 0) {
- x.x = 1 * PI_HALF;
- y.y = 2 * PI_HALF;
- z.z = 1 * PI_HALF;
- } else if (camObjectPos.x < 0 && camObjectPos.y < 0) {
- x.x = 2 * PI_HALF;
- y.y = 2 * PI_HALF;
- z.z = 2 * PI_HALF;
- } else if (camObjectPos.x > 0 && camObjectPos.y < 0) {
- x.x = 2 * PI_HALF;
- y.y = 3 * PI_HALF;
- z.z = 3 * PI_HALF;
- }
- } else if (below) {
- if (camObjectPos.x > 0 && camObjectPos.y > 0) {
- x.x = 0 * PI_HALF;
- y.y = 0 * PI_HALF;
- z.z = 0 * PI_HALF;
- } else if (camObjectPos.x < 0 && camObjectPos.y > 0) {
- x.x = 0 * PI_HALF;
- y.y = 1 * PI_HALF;
- z.z = 1 * PI_HALF;
- } else if (camObjectPos.x < 0 && camObjectPos.y < 0) {
- x.x = 3 * PI_HALF;
- y.y = 1 * PI_HALF;
- z.z = 2 * PI_HALF;
- } else if (camObjectPos.x > 0 && camObjectPos.y < 0) {
- x.x = 3 * PI_HALF;
- y.y = 0 * PI_HALF;
- z.z = 3 * PI_HALF;
- }
- }
- }
- }
- } // adjust scale of components
- for (var _i11 = 0, _Object$keys11 = Object.keys(this.handles); _i11 < _Object$keys11.length; _i11++) {
- var handleName = _Object$keys11[_i11];
- var handle = this.handles[handleName];
- var node = handle.node; //xzw add:---- -当该轴正对相机时隐藏。(主要针对ortho类型camera。
- if (!common$1.getObjVisiByReason(node, 'modeForce')) continue;
- var alignment = handle.alignment;
- if (alignment && (!handleName.includes('rotation') || camera.type == 'OrthographicCamera')) {
- //旋转的话正常都应该显示
- var normal = void 0;
- var dir = _construct(THREE.Vector3, _toConsumableArray(alignment)).applyQuaternion(this.quaternion);
- if (camera.type == 'OrthographicCamera') {
- normal = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion);
- } else {
- normal = new THREE.Vector3().subVectors(center, camera.position).normalize();
- }
- var ifOnLine = void 0;
- if (handleName.includes('rotation') || handleName.includes('plane')) {
- // 旋转轴和视线垂直时隐藏
- ifOnLine = Math.abs(dir.dot(normal)) < 0.1;
- } else {
- ifOnLine = Math.abs(dir.dot(normal)) > 0.995;
- }
- common$1.updateVisible(node, 'faceToCamHide', !ifOnLine);
- } else {
- common$1.updateVisible(node, 'faceToCamHide', true);
- }
- if (!node.visible) continue; //------------------------------------------------------------------------
- if (handle.dontScale) continue; //add
- var handlePos = node.getWorldPosition(new THREE.Vector3());
- var distance = handlePos.distanceTo(camera.position);
- var pr = convertTool.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);
- var ws = node.parent.getWorldScale(new THREE.Vector3());
- var s = ScaleRatio / pr;
- var _scale = new THREE.Vector3(s, s, s).divide(ws);
- var rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation); //需要使用到旋转,所以我把设置scale的移到旋转后了,否则在视图上下旋转的分界线处rotateHandel会被拉长从而闪烁。
- var rotInv = rot.clone().invert();
- _scale.applyMatrix4(rotInv);
- _scale.x = Math.abs(_scale.x);
- _scale.y = Math.abs(_scale.y);
- _scale.z = Math.abs(_scale.z);
- node.scale.copy(_scale);
- }
- }
- } else {
- this.visible = false;
- }
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove() {
- var _this9 = this;
- //let pointer = this.viewer.inputHandler.pointer;
- this.player.camera;
- if (this.selection.length === 1) {
- //xzw 添加dragging条件
- if (!this.dragging) {
- //let ray = Utils.mouseToRay(pointer, camera );
- /* let raycaster = new THREE.Raycaster(ray.origin, ray.direction);
- raycaster.layers.enableAll()//add */
- var raycaster = this.player.raycaster;
- var pickVolumes = this.pickVolumes.filter(function (v) {
- var mode = v.handle.split('.')[0];
- if (!_this9.modesEnabled[mode]) return;
- return v.parent.parent.visible; //可能被隐藏该轴
- });
- var intersects = raycaster.intersectObjects(pickVolumes, true);
- intersects = intersects.sort(function (a, b) {
- var order2 = b.object.renderOrder || 0;
- var order1 = a.object.renderOrder || 0;
- return order2 - order1;
- }); // 降序
- if (intersects.length > 0) {
- var I = intersects[0];
- var handleName = I.object.handle; //console.log(handleName)
- this.setActiveHandle(this.handles[handleName]);
- this.intersect = I;
- } else {
- this.intersect;
- this.setActiveHandle(null);
- this.intersect = null;
- }
- } else {
- if (this.intersect) {
- this.intersect.object.dispatchEvent({
- type: 'drag',
- drag: this.drag
- });
- }
- }
- }
- }
- }, {
- key: "handleDragStart",
- value: function handleDragStart() {
- //add
- if (this.selection.length === 1) {
- //搜寻有加事件的object 发送事件 参考potree的inputHandler
- if (this.intersect) {
- this.drag = this.intersect;
- this.intersect.object.dispatchEvent({
- type: 'drag',
- drag: this.drag
- });
- if (this.player.cameraControls.activeControl) {
- //this.player.cameraControls.activeControl.locked = true; //add
- this.player.cameraControls.activeControl.enabled = false; //add
- }
- }
- /* let target = && this.hoveredElements.find(el => (//只有左键能拖拽
- el.object._listeners &&
- el.object._listeners['drag'] &&
- el.object._listeners['drag'].length > 0));
- if (target) {
- this.startDragging(target.object, {location: target.point});
- } else {
- this.startDragging(null);
- } */
- }
- }
- }, {
- key: "handleDragEnd",
- value: function handleDragEnd() {
- //add
- if (this.drag) {
- this.drag.object.dispatchEvent({
- type: 'drop'
- });
- this.drag = null;
- if (this.player.cameraControls.activeControl) {
- //this.player.cameraControls.activeControl.locked = true; //add
- this.player.cameraControls.activeControl.enabled = true; //add
- }
- }
- }
- }]);
- return TransformationTool;
- }(THREE.Object3D);
- /*
- note:
-
- transformationTool.scene会跟随选中物体,其scale就是boundingbox的大小。因此transformationTool.frame这个框也会跟着缩放
-
-
- */
- var PlayerEvents = {
- Move: 'move',
- Rotate: 'rotate',
- //xst
- Zoom: 'zoom',
- //xst
- EndRotation: 'endRotation',
- //xst
- MoveModel: 'moveModel',
- //xst
- MoveComplete: 'move.complete',
- ModeChanged: 'mode.changed',
- ModeChanging: 'mode.changing',
- PanoChosen: 'pano.chosen',
- ClosestPanoChanging: 'closest.pano.changing',
- WarpStarted: 'warp.started',
- WarpInterrupted: 'warp.interrupted',
- WarpEnded: 'warp.ended',
- FlyinFinished: 'flyin.finished',
- FlyingStarted: 'flying.started',
- FlyingInterrupted: 'flying.interrupted',
- FlyingEnded: 'flying.ended',
- Ready: 'ready',
- StartInside: 'start.inside',
- StartOutside: 'start.outside',
- ViewChanged: 'view.changed',
- WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
- InputStart: 'input.start'
- };
- new THREE.TextureLoader();
- var showForOpacity = 1;
- var hideForOpacity = 0;
- var planeGeo$4 = new THREE.PlaneBufferGeometry(1, 1);
- var FloorplanCadImg = /*#__PURE__*/function () {
- function FloorplanCadImg(app) {
- _classCallCheck(this, FloorplanCadImg);
- this.app = app;
- this.config = this.app.config;
- this.show = true;
- this.done = 0;
- this.ready = false;
- this.center = new THREE.Vector3();
- this.deferred = Deferred$1();
- }
- _createClass(FloorplanCadImg, [{
- key: "getCadInfo",
- value: function getCadInfo(index) {
- var cadInfo = this.app.store.getValue('flooruser').cadInfo;
- if (cadInfo instanceof Array) {
- //初始加载时没有id, 所以用下标;等保存时会有subgroup,一般就是单层的subgroup和下标不一样,所以使用subgroup
- if (this.model.floors.list.length == 1) {
- cadInfo = cadInfo[0];
- } else {
- var info = cadInfo.find(function (info) {
- return info.subgroup == index;
- });
- info || (info = cadInfo[index]);
- cadInfo = info;
- }
- } else if (!cadInfo) {
- //console.error('no cadInfo,可能是导入的平面图', index)
- return null;
- }
- return cadInfo;
- } //临时改变所有楼层的floorplane图的显示
- }, {
- key: "changeCadVisible",
- value: function changeCadVisible(v) {
- var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- if (o.show != void 0) this.show = o.show; //编辑页面的设置开关控制show
- this.model.floors.forEach(function (floor) {
- if (floor.plane) {
- floor.plane.visible = !!v;
- } else {
- console.warn('还没有创建plane');
- }
- });
- }
- /****************************************************************************************************************************************************************/
- }, {
- key: "deleteCustomFloorTexture",
- value: function deleteCustomFloorTexture(index) {
- console.log('deleteCustomFloorTexture!查看是否有问题', index);
- var floor = this.model.floors.index[index];
- floor.plane.visible = false;
- floor.plane.material.opacity = hideForOpacity;
- floor.plane.material.map = null;
- floor.plane.material.needsUpdate = !0;
- }
- /* addCustomFloorTexture(index, url) {
- let floor = this.model.floors.index[index]
- floor.plane.material = new THREE.MeshBasicMaterial({
- map: loader.load(url),
- opacity: showForOpacity,
- transparent: !0,
- side: THREE.DoubleSide,
- depthTest: false //防止遮挡热点等物体
- })
- floor.plane.visible = true
- floor.plane.material.needsUpdate = !0
- } */
- }, {
- key: "updateCustomFloorTexture",
- value: function updateCustomFloorTexture(index, url) {
- console.log('updateCustomFloorTexture!', index);
- this.floorPlanImgUrls[index] = url;
- this.updateCadPlane(index);
- /* let floor = this.model.floors.index[index]
- let plane = floor.plane
- plane.material = new THREE.MeshBasicMaterial({
- map: loader.load(url),
- opacity: showForOpacity,
- transparent: !0,
- side: THREE.DoubleSide,
- depthTest: false //防止遮挡热点等物体
- })
- let boundingBox = floor.boundingBox
- let center = boundingBox.getCenter(this.center)
- plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
- let size = boundingBox.getSize(new THREE.Vector3())
- plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
- if (this.model.currentFloor.floorIndex != index) {
- floor.plane.visible = false
- floor.plane.material.opacity = hideForOpacity
- } else {
- floor.plane.visible = true
- floor.plane.material.opacity = showForOpacity
- } */
- }
- /* createCustomPlane(index, url) {
- let floor = this.model.floors.index[index]
- let boundingBox = floor.boundingBox
- let center = boundingBox.getCenter(this.center)
- let size = boundingBox.getSize(new THREE.Vector3())
- let plane = floor.plane
- if (!plane) {
- var geometry = new THREE.PlaneBufferGeometry(1, 1)
- var material = new THREE.MeshBasicMaterial({
- //map: THREE.ImageUtils.loadTexture(url),
- map: texture.load(url),
- opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
- //opacity: 1,
- transparent: !0,
- side: THREE.DoubleSide,
- depthTest: false //防止遮挡热点等物体
- })
- material.needsUpdate = !0
- plane = new THREE.Mesh(geometry, material)
- plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
- plane.name = 'floorplanImg'
- plane.rotateX(-Math.PI / 2)
- this.model.add(plane)
- } else {
- plane.material = new THREE.MeshBasicMaterial({
- //map: THREE.ImageUtils.loadTexture(url),
- map: loader.load(url),
- opacity: showForOpacity,
- transparent: !0,
- side: THREE.DoubleSide,
- depthTest: false //防止遮挡热点等物体
- })
- plane.visible = true
- plane.material.needsUpdate = !0
- }
- plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
- plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
- floor.plane = plane
- if (this.model.currentFloor.floorIndex != index) {
- floor.plane.visible = false
- }
- } */
- }, {
- key: "createCustomPlane",
- value: function createCustomPlane(index, url) {
- this.floorPlanImgUrls[index] = url;
- this.updateCadPlane(index);
- /* if (this.model.currentFloor.floorIndex != index) {
- floor.plane.visible = false
- } */
- }
- }, {
- key: "changeModelOpacity",
- value: function changeModelOpacity() {
- //console.log('changeModelOpacity', type)
- return;
- }
- /*changeModelOpacity(type) {
- let setOpacity = e => {
- // if (e.parent.hidden && value > 0.5) {
- // return
- // }
- // if (value == showForModelOpacity) {
- // e.visible = false
- // } else {
- // e.visible = true
- // }
- // ;(e.materialInside.uniforms.opacity.value = value), (e.materialOutside.uniforms.opacity.value = value)
- if (visible) {
- e.material.uniforms.opacity.value = 1
- e.material.transparent = !1
- } else {
- e.material.uniforms.opacity.value = 0
- e.material.transparent = !0
- }
- }
- if (this.player.modeTran.split('-')[1] === Viewmode.FLOORPLAN) {
- // FLOORPLAN模式下修改模型透明度,仅限当前楼层
- this.model.currentFloor.chunks.forEach(setOpacity)
- } else {
- this.model.chunks.forEach(setOpacity)
- }
- }*/
- /********************************************************************重构***************************************************************************************/
- }, {
- key: "init",
- value: function init(model) {
- var _this = this;
- this.player = this.app.core.get('Player');
- this.model = model;
- var floorplan = this.app.store.getValue('flooruser');
- if (floorplan) {
- //获取所有楼层的cad图片的url
- this.getCadImgUrl(floorplan); //创建多楼层平面
- //this.createCadAllPlanes(floorplan)
- } else {
- this.app.store.on('flooruser', function (floor) {
- //获取所有楼层的cad图片的url
- _this.getCadImgUrl(floor); //创建多楼层平面
- //this.createCadAllPlanes(floor)
- });
- }
- this.player.on(PlayerEvents.ModeChanging, function (lastMode, mode, pano, dur) {
- if (mode == Viewmode$1.FLOORPLAN) {
- var view360ShowDur = 1000;
- _this.shouldShowPlane = true;
- setTimeout(function () {
- _this.shouldShowPlane && _this.showCadPlane();
- }, Math.min(view360ShowDur, dur));
- } else {
- _this.shouldShowPlane = false; //console.log('mode',mode, 'hideCadPlane')
- _this.hideCadPlane();
- _this.changeModelOpacity('hidePlane'); //恢复材质
- }
- });
- this.ready = true;
- } //创建多楼层平面
- }, {
- key: "createCadAllPlanes",
- value: function createCadAllPlanes(cadData) {
- var _this2 = this;
- //采用用户上传的图片
- if (cadData.type == 'image') {
- cadData.floors.forEach(function (floor) {
- _this2.createCustomPlane(floor.subgroup, _this2.app.resource.getUserResourceURL(floor.filename));
- });
- this.ready = true;
- } //采用矢量数据
- else {
- // 初始数据,不能加载图片
- if (!this.app.store.getValue('metadata').floorPlanUser) {
- this.ready = true;
- this.deferred.resolve();
- return;
- }
- this.model.floors.forEach(function (floor) {
- //创建每个楼层的平面
- _this2.createCadPlane(floor.floorIndex);
- });
- }
- }
- }, {
- key: "createCadPlane",
- value: function createCadPlane(floorIndex) {
- this.updateCadPlane(floorIndex);
- } //更新某个户型图
- }, {
- key: "updateCadPlane",
- value: function updateCadPlane(floorIndex) {
- var _this3 = this;
- var opacity = 0;
- var imgUrl = this.floorPlanImgUrls[floorIndex];
- var floor = this.model.floors.index[floorIndex]; //有图片才会有plane
- console.log("\u5F00\u59CB\u52A0\u8F7Dfloorplan_".concat(floorIndex, ".png, imgUrl: ").concat(imgUrl));
- if (imgUrl) {
- var deferred = floor.deferred = new Deferred$1();
- opacity = this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity;
- texture.load(imgUrl, function (texture) {
- //加载完成:
- if (!texture.image || floor.deferred != deferred) return; //还没加载完或又重新加载了
- floor.cadImg = texture.image;
- if (floor.shouldShowPlane) {
- texture.needsUpdate = !0;
- console.warn("\u52A0\u8F7D\u5B8C\u6BD5floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
- } else {
- texture.dispose();
- console.error('dispose Tex');
- texture = null;
- }
- var plane = floor.plane; //之前没有plane的话,得创建
- if (!plane) {
- var material = _this3.createCadPlaneMaterial(texture, opacity);
- plane = new THREE.Mesh(planeGeo$4, material);
- floor.shouldShowPlane || (plane.visible = false);
- } else {
- plane.material.map = texture;
- plane.material.needsUpdate = true;
- }
- _this3.model.add(plane);
- floor.plane = plane;
- _this3.setCadPlanePose(plane, floorIndex); //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
- floor.deferred = null;
- deferred.resolve(true);
- }, function (xhr) {
- floor.deferred = null;
- floor.imgLoadFailed = true;
- deferred.resolve(false); //当显示户型图平面的时候,需要修改模型材质
- _this3.changeModelOpacity('hidePlane');
- console.warn("\u6CA1\u6709floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
- });
- return floor.deferred;
- } //没有图片,但是之前已经有了plane,这时候需要删除
- else {
- this.deleteCadPlane(floor);
- floor.imgLoadFailed = true; //没有图也算加载失败
- }
- }
- }, {
- key: "createCadPlaneMaterial",
- value: function createCadPlaneMaterial(floorTexture, opacity) {
- var material = new THREE.MeshBasicMaterial({
- map: floorTexture,
- opacity: opacity,
- transparent: !0,
- side: THREE.DoubleSide,
- depthTest: false //防止遮挡热点等物体
- });
- return material;
- } //floorplanData表示户型数据
- }, {
- key: "getCadImgUrl",
- value: function getCadImgUrl(cadData) {
- var _this4 = this;
- this.floorPlanImgUrls = [];
- if (this.app.store.getValue('metadata').floorPlanUser) {
- this.model.floors.forEach(function (floor) {
- var floorIndex = floor.floorIndex; //如果是用户自己上传的图片
- if (cadData.type == 'image') {
- // 如果是颠倒楼层会出现楼层与图片不对应的bug,需要重新获取对应的图片
- var findFloorIndex = cadData.floors.findIndex(function (c) {
- return c.subgroup == floorIndex;
- });
- if (findFloorIndex == -1) {
- findFloorIndex = floorIndex;
- }
- if (!cadData.floors[findFloorIndex]) {
- return console.error('cad缺少此楼层数据,楼层:', findFloorIndex);
- }
- _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL(cadData.floors[findFloorIndex].filename);
- } else {
- _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL("floor-cad-".concat(floorIndex, ".png"));
- }
- });
- }
- } //设置cad面的坐标,大小和角度,确保与模型对准
- }, {
- key: "setCadPlanePose",
- value: function setCadPlanePose(plane, index) {
- var floor = this.model.floors.index[index];
- var boundingBox = floor.boundingBox;
- var center = boundingBox.getCenter(this.center);
- var size = boundingBox.getSize(new THREE.Vector3()); //plane.rotateX(-Math.PI / 2)
- plane.rotation.x = -Math.PI / 2; //靠这参数设置plane的大小和位置
- var cadInfo; //let info = this.app.store.getValue('metadata').floorPlanUser
- var data = this.app.store.getValue('flooruser');
- if (data.type != 'image') {
- //非导入
- cadInfo = this.getCadInfo(index);
- if (cadInfo && cadInfo.bound) {
- size.x = cadInfo.bound.right - cadInfo.bound.left;
- size.z = cadInfo.bound.bottom - cadInfo.bound.top;
- center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2;
- center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2; //本来不需要旋转的(导入的就不用),但cad那边转了之后也改了size,这里就要旋转
- var metadata = this.app.store.getValue('metadata');
- var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0); //plane.rotateZ(floorPlanAngle)
- plane.rotation.z = floorPlanAngle;
- }
- }
- plane.renderOrder = RenderOrder.cad; //盖住模型,否则其他层模型会影响它
- plane.name = 'floorplanImg';
- this.adjustModelForPlane(boundingBox, index, size, center, false, cadInfo);
- }
- }, {
- key: "adjustModelForPlane",
- value: function adjustModelForPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
- var floor = this.model.floors.index[index];
- if (onlyHeight) {
- floor.plane.position.y = boundingBox.max.y + constants$4.planeHeightShift;
- return;
- }
- size = size || boundingBox.getSize(new THREE.Vector3());
- center = center || boundingBox.getCenter(new THREE.Vector3());
- if (cadInfo) {
- /* if (!floor.plane.material || !floor.plane.material.map || !floor.plane.material.map.image) {
- return
- } */
- //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
- var floorPlanImgWidth = floor.cadImg.width;
- var floorPlanImgHeight = floor.cadImg.height; //let floorPlanImgWidth = 3840
- //let floorPlanImgHeight = 2160
- var ratio = floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right); //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
- //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
- var width = ratio * floorPlanImgWidth;
- var height = ratio * floorPlanImgHeight;
- this.width = width;
- this.height = height;
- var shiftX = (cadInfo.left - cadInfo.right) / 2 * ratio; //偏移中心的距离
- var shiftY = (cadInfo.top - cadInfo.bottom) / 2 * ratio;
- floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants$4.planeHeightShift, center.z - shiftY);
- floor.plane.scale.set(width, height, 1); //this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
- } else {
- //导入的平面图
- //floor.plane.scale.set(size.x, size.z, 1)
- //xzw改为 保持图比例,不拉伸 2025.10 bugID=54182 不知道会不会影响之前的
- var _floor$plane$material = floor.plane.material.map.image,
- _width = _floor$plane$material.width,
- _height = _floor$plane$material.height;
- var k = Math.sqrt(size.x * size.z / _width / _height);
- floor.plane.scale.set(_width * k, _height * k, 1);
- floor.plane.position.copy(center).setY(boundingBox.max.y + constants$4.planeHeightShift);
- }
- } //设置是否可见
- }, {
- key: "setVisibleForCadImg",
- value: function setVisibleForCadImg() {
- var _this5 = this;
- // 是否隐藏户型图
- var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
- if (!this.show || hideBigMap) {
- return;
- }
- if (!this.ready) {
- return this.deferred.then(function () {
- return _this5.showCadPlane();
- });
- } // 不显示户型图
- if (this.app.TagManager.showTagsVisible || // 热点可视
- this.app.ViewLinkEdit.markView || // 编辑场景关联
- this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
- this.player.GLTFEditor.adding || this.player.GLTFEditor.selecting // 编辑空间模型
- ) {
- this.hideCadPlane();
- }
- } //显示某楼层的户型图
- }, {
- key: "showCadPlane",
- value: function showCadPlane(floorIndex) {
- var _this6 = this;
- // 是否隐藏户型图
- var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
- if (floorIndex == void 0) {
- floorIndex = this.model.currentFloor.floorIndex;
- }
- var floor = this.model.floors.index[floorIndex]; // 这些情况下,即使调用了也不显示户型图
- if (!this.show || hideBigMap || this.app.TagManager.showTagsVisible || // 热点可视
- this.app.ViewLinkEdit.markView || // 编辑场景关联
- this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
- 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且非导入的平面图
- ) return floor.shouldShowPlane = false;
- if (floor.deferred) {
- //仍在加载
- return;
- /* floor.deferred.then(() => { //done就不重复写了,加载完会执行原先的
- this.showCadPlane(floorIndex)
- }) */
- } //先隐藏其他楼层的cad
- if (this.model.floors.list.length > 1) {
- this.hideCadPlane({
- ignoreFloor: floor
- });
- }
- floor.shouldShowPlane = true;
- var plane = floor.plane;
- if (!plane && !floor.imgLoadFailed) {
- var deferred = this.updateCadPlane(floorIndex);
- if (deferred) {
- return deferred.then(function () {
- floor.shouldShowPlane && _this6.showCadPlane(floorIndex);
- });
- } else {
- return this.changeModelOpacity(); //改为普通材质
- }
- } //当显示户型图平面的时候,需要修改模型材质
- this.changeModelOpacity();
- var showModel = this.model.showOnFloorplan; // || this.player.linkEditor?.setPanoVisible || this.player.linkEditor?.setTagVisible
- this.model.setModelDisplay(showModel, 'hideOnfloorplan');
- if (plane) {
- plane.material.opacity = showForOpacity;
- plane.visible = true; //console.log(' plane.visible = true')
- if (!plane.material.map) {
- //恢复
- plane.material.map = new THREE.Texture(floor.cadImg);
- plane.material.map.needsUpdate = true; //为什么不加这句显示不出
- plane.material.needsUpdate = true;
- }
- }
- } //隐藏户型图
- }, {
- key: "hideCadPlane",
- value: function hideCadPlane() {
- var _this7 = this;
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- ignoreFloor = _ref.ignoreFloor;
- if (!this.ready) {
- return this.deferred.then(function () {
- return _this7.hideCadPlane();
- });
- }
- this.model.floors.forEach(function (floor) {
- if (ignoreFloor == floor) return;
- floor.shouldShowPlane = false;
- if (floor.plane) {
- //if(floor.plane.visible)console.log('visible = false')
- floor.plane.visible = false; //floor.plane.material.opacity = hideForOpacity
- if (floor.plane.material.map) {
- //dispose
- floor.plane.material.map.dispose();
- floor.plane.material.map = null;
- floor.plane.material.needsUpdate = true;
- }
- }
- });
- this.changeModelOpacity();
- }
- /**
- * 手动显示/隐藏户型图
- * @param {*} show
- */
- }, {
- key: "displayCadPlane",
- value: function displayCadPlane(show) {
- this.setVisible(show);
- show ? this.showCadPlane() : this.hideCadPlane();
- } //cad编辑模块那里,因为允许用户重置,所以这里可以删除cad图片
- }, {
- key: "deleteAllCadPlanes",
- value: function deleteAllCadPlanes() {
- var _this8 = this;
- this.model.floors.forEach( /*#__PURE__*/function () {
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(floor) {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _this8.deleteCadPlane(floor);
- case 1:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function (_x) {
- return _ref2.apply(this, arguments);
- };
- }());
- }
- }, {
- key: "deleteCadPlane",
- value: function deleteCadPlane(floor) {
- if (floor.plane) {
- floor.plane.geometry.dispose();
- floor.plane.material.map && floor.plane.material.map.dispose();
- floor.plane.material.dispose();
- this.model.remove(floor.plane);
- floor.plane = null;
- }
- floor.cadImg = null;
- floor.imgLoadFailed = false;
- } //更新全部楼层的户型图
- //cad编辑模块那里,有时候会重新载入数据,这时候等于重新执行createCadAllPlanes,但是plane可能已经创建好了,只是需要更新图片即可
- }, {
- key: "updateAllCadPlanes",
- value: function updateAllCadPlanes() {
- var _this9 = this;
- //重新获取cad矢量数据
- var floorplan = this.app.store.getValue('flooruser');
- this.getCadImgUrl(floorplan);
- this.model.floors.forEach(function (floor) {
- //创建每个楼层的平面
- /* floor.cadImg = null
- floor.imgLoadFailed = false
- this.updateCadPlane(floor.floorIndex) */
- _this9.deleteCadPlane(floor);
- });
- } //设置模型的透明度
- }, {
- key: "setModelOpacity",
- value: function setModelOpacity(floorIndex) {}
- }, {
- key: "getVisible",
- value: function getVisible() {
- return this.show;
- }
- }, {
- key: "setVisible",
- value: function setVisible(value) {
- this.show = value;
- }
- }, {
- key: "planUserChange",
- value: function planUserChange(floorPlanUser) {
- var _this$app$core$get$mo;
- //保存cad后执行
- //__sdk.store.getValue('metadata').floorPlanUser 是否保存过cad
- //console.log('planUserChange' )
- 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('-');
- if (modes && modes.includes('floorplan')) {
- //从绘图导入的平面图不显示痕迹物证
- var visible = this.app.store.getValue('flooruser').type != 'image' || modes[0] == 'floorplan';
- this.app.TagManager.switchLabels({
- type: 'traces',
- visible
- }, null, 'onFloorplan');
- this.app.TagManager.switchLabels({
- type: 'billboards',
- visible
- }, null, 'onFloorplan');
- }
- }
- }]);
- return FloorplanCadImg;
- }();
- // init2(model) {
- // this.player = this.app.core.get('Player')
- // this.model = model
- // // 保证数据加载后调用
- // if (this.app.store.getValue('flooruser')) {
- // this.createCad(this.app.store.getValue('flooruser'))
- // } else {
- // this.app.store.on('flooruser', floor => this.createCad(floor))
- // }
- // this.player.on(PlayerEvents.ModeChanging, (lastMode, mode, pano, dur) => {
- // if (mode == Viewmode.FLOORPLAN) {
- // let view360ShowDur = 1000
- // setTimeout(this.showCad.bind(this), Math.min(view360ShowDur, dur))
- // } else {
- // this.hideCad()
- // }
- // })
- // }
- // /**
- // * 显示户型图
- // * @returns
- // */
- // showCad() {
- // // 是否隐藏户型图
- // const hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0
- // if (!this.show || hideBigMap) {
- // return
- // }
- // if (!this.ready) {
- // return this.deferred.then(() => this.showCad())
- // }
- // // 不显示户型图
- // if (
- // this.app.TagManager.showTagsVisible || // 热点可视
- // this.app.ViewLinkEdit.markView || // 编辑场景关联
- // this.player.EditOverlay.isAdding ||
- // this.player.EditOverlay.editPlane || // 编辑空间贴图
- // this.player.GLTFEditor.adding ||
- // this.player.GLTFEditor.selecting // 编辑空间模型
- // )
- // return
- // this.hideCad()
- // // console.log('showCad ' + this.model.currentFloor.floorIndex)
- // let plane = this.model.floors.index[this.model.currentFloor.floorIndex].plane
- // if (plane) {
- // plane.material.opacity = showForOpacity
- // plane.visible = true
- // this.changeModelOpacity(showForModelOpacity)
- // }
- // }
- // /**
- // * 隐藏户型图
- // * @returns
- // */
- // hideCad() {
- // if (!this.ready) {
- // return this.deferred.then(() => this.hideCad())
- // }
- // // console.log('hideCad ' + this.model.currentFloor.floorIndex)
- // this.model.floors.forEach(floor => {
- // if (floor.plane) {
- // floor.plane.visible = false
- // floor.plane.material.opacity = hideForOpacity
- // } else {
- // console.warn('还没有创建plane')
- // }
- // })
- // this.changeModelOpacity(hideForModelOpacity)
- // }
- // /**
- // * 手动显示/隐藏户型图
- // * @param {*} show
- // */
- // displayCad(show) {
- // this.show = show
- // this.show ? this.showCad() : this.hideCad()
- // }
- // /**
- // * 创建户型图的贴图
- // */
- // createCad(floor) {
- // if (floor.type == 'image') {
- // // 图片模式
- // floor.floors.forEach(floor => {
- // this.createCustomPlane(floor.subgroup, this.app.resource.getUserResourceURL(floor.filename))
- // })
- // this.ready = true
- // } else {
- // // CAD模式
- // if (!this.app.store.getValue('metadata').floorPlanUser) {
- // this.ready = true
- // this.deferred.resolve()
- // return
- // }
- // this.model.floors.forEach(floor => {
- // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
- // texture.load(
- // this.app.resource.getUserResourceURL(`floor-cad-${floor.floorIndex}.png`),
- // texture => {
- // //加载完成:
- // texture.needsUpdate = !0
- // floor.floorTexture = texture
- // this.createPlane(floor.floorIndex)
- // },
- // xhr => {
- // if (++this.done == this.model.floors.length) {
- // this.ready = true
- // this.deferred.resolve()
- // }
- // console.warn(`没有floorplan_${floor.floorIndex}.png`)
- // }
- // )
- // })
- // }
- // }
- // createPlane(index) {
- // var floor = this.model.floors.index[index]
- // var needAdjust = false
- // var boundingBox = floor.boundingBox
- // needAdjust = true
- // var center = boundingBox.getCenter(this.center)
- // var size = boundingBox.getSize(new THREE.Vector3())
- // var geometry = new THREE.PlaneBufferGeometry(1, 1)
- // var plane = null
- // var cadInfo = this.getCadInfo(index)
- // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
- // plane = new THREE.Mesh(
- // geometry,
- // new THREE.MeshBasicMaterial({
- // map: null,
- // opacity: 0,
- // transparent: !0,
- // side: THREE.DoubleSide,
- // depthTest: false, //防止遮挡热点等物体
- // visible: false,
- // })
- // )
- // } else {
- // var material = new THREE.MeshBasicMaterial({
- // map: floor.floorTexture,
- // opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
- // //opacity: 1,
- // transparent: !0,
- // side: THREE.DoubleSide,
- // depthTest: false, //防止遮挡热点等物体
- // })
- // material.needsUpdate = !0
- // plane = new THREE.Mesh(geometry, material)
- // if (cadInfo.bound) {
- // size.x = cadInfo.bound.right - cadInfo.bound.left
- // size.z = cadInfo.bound.bottom - cadInfo.bound.top
- // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
- // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
- // }
- // }
- // // TRANSITIONING时add会造成动画卡顿
- // //if (this.player.mode !== Viewmode.TRANSITIONING) this.model.add(plane)
- // //else this.player.once('mode.afterChange', () => this.model.add(plane))
- // this.model.add(plane)
- // floor.plane = plane
- // plane.rotateX(-Math.PI / 2)
- // const metadata = this.app.store.getValue('metadata')
- // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
- // plane.rotateZ(floorPlanAngle)
- // plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
- // plane.name = 'floorplanImg'
- // if (cadInfo) {
- // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
- // }
- // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
- // this.changeCadVisible(null, { autoJudge: true })
- // if (++this.done == this.model.floors.length) {
- // this.ready = true
- // this.deferred.resolve()
- // if (this.player.mode == Viewmode.FLOORPLAN) {
- // this.showCad()
- // }
- // }
- // }
- // deletePlanes() {
- // this.model.floors.forEach(async floor => {
- // floor.plane.geometry.dispose()
- // floor.plane.material.dispose()
- // this.model.remove(floor.plane)
- // floor.plane = null
- // })
- // }
- // updatePlanes() {
- // this.model.floors.forEach(async floor => {
- // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
- // if (!floor.plane) {
- // this.createCad(floor.floorIndex)
- // }
- // if (floor.plane) {
- // floor.plane.material.opacity = hideForOpacity
- // floor.plane.material.map = null
- // floor.plane.material.needsUpdate = !0
- // floor.plane.material.visible = false
- // let imgName = null
- // let flooruser = this.app.store.getValue('flooruser')
- // //cad绘图保存的时候
- // if (flooruser.type != 'image') {
- // imgName = `floor-cad-${floor.floorIndex}.png`
- // loader.load(
- // this.app.resource.getUserResourceURL(imgName, true),
- // //this.app.resource.getUserResourceURL(imgName, true),
- // texture => {
- // //加载完成:
- // texture.needsUpdate = !0
- // floor.floorTexture = texture
- // this.updatePlane(floor.floorIndex, texture)
- // },
- // xhr => {
- // if (++this.done == this.model.floors.length) {
- // this.ready = true
- // this.deferred.resolve()
- // }
- // console.warn(`没有 floorplan_${floor.floorIndex}.png`)
- // }
- // )
- // } else {
- // let data = flooruser.floors.find(c => c.subgroup == floor.floorIndex)
- // imgName = data.filename
- // floor.plane.material = new THREE.MeshBasicMaterial({
- // map: loader.load(this.app.resource.getUserResourceURL(imgName, true)),
- // opacity: showForOpacity,
- // transparent: !0,
- // side: THREE.DoubleSide,
- // depthTest: false, //防止遮挡热点等物体
- // })
- // floor.plane.material.needsUpdate = !0
- // }
- // }
- // })
- // }
- // updatePlane(index, texture) {
- // var floor = this.model.floors.index[index]
- // var needAdjust = false
- // var boundingBox = floor.boundingBox
- // needAdjust = true
- // var center = boundingBox.getCenter(this.center)
- // var size = boundingBox.getSize(new THREE.Vector3())
- // if (floor.plane) {
- // floor.plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
- // floor.plane.name = 'floorplanImg'
- // const metadata = this.app.store.getValue('metadata')
- // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
- // floor.plane.rotation.z = 0
- // floor.plane.rotateZ(floorPlanAngle)
- // }
- // var cadInfo = this.getCadInfo(index)
- // console.log(cadInfo, '----after')
- // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
- // if (floor.plane) {
- // floor.plane.material.opacity = hideForOpacity
- // floor.plane.material.map = null
- // floor.plane.material.needsUpdate = !0
- // floor.plane.material.visible = false
- // }
- // } else if (cadInfo.bound) {
- // size.x = cadInfo.bound.right - cadInfo.bound.left
- // size.z = cadInfo.bound.bottom - cadInfo.bound.top
- // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
- // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
- // if (floor.plane) {
- // floor.plane.material.map = texture
- // floor.plane.material.needsUpdate = !0
- // floor.plane.material.visible = true
- // }
- // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
- // }
- // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
- // this.changeCadVisible(null, { autoJudge: true })
- // if (++this.done == this.model.floors.length) {
- // this.ready = true
- // this.deferred.resolve()
- // }
- // }
- // adjustPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
- // var floor = this.model.floors.index[index]
- // if (onlyHeight) {
- // floor.plane.position.y = boundingBox.max.y + constants.planeHeightShift
- // return
- // }
- // size = size || boundingBox.getSize(new THREE.Vector3())
- // center = center || boundingBox.getCenter(new THREE.Vector3())
- // if (floor.floorTexture.image == null) {
- // return
- // }
- // //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
- // let floorPlanImgWidth = floor.floorTexture.image.width
- // let floorPlanImgHeight = floor.floorTexture.image.height
- // //let floorPlanImgWidth = 3840
- // //let floorPlanImgHeight = 2160
- // var ratio = (floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
- // //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
- // var width = ratio * floorPlanImgWidth
- // var height = ratio * floorPlanImgHeight
- // this.width = width
- // this.height = height
- // var shiftX = ((cadInfo.left - cadInfo.right) / 2) * ratio //偏移中心的距离
- // var shiftY = ((cadInfo.top - cadInfo.bottom) / 2) * ratio
- // floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants.planeHeightShift, center.z - shiftY)
- // floor.plane.scale.set(width, height, 1)
- // this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
- // }
- var cameraLight = {
- clampVFOV: function clampVFOV(currentFov, maxHFov, width, height) {
- //限制currentFov, 使之造成的横向fov不大于指定值maxHFov
- var r = cameraLight.getHFOVFromVFOV(currentFov, width, height);
- return r > maxHFov ? cameraLight.getVFOVFromHFOV(maxHFov, width, height) : currentFov;
- },
- getHFOVForCamera: function getHFOVForCamera(camera, width, height, getRad) {
- if (!width) width = camera.aspect, height = width / camera.aspect;
- return cameraLight.getHFOVFromVFOV(camera.fov, width, height, getRad);
- },
- getHFOVFromVFOV: function getHFOVFromVFOV(fov, width, height, getRad) {
- var hfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (width / height));
- return getRad ? hfov : hfov * MathLight.DEGREES_PER_RADIAN;
- },
- getVFOVFromHFOV: function getVFOVFromHFOV(fov, width, height, getRad) {
- var vfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (height / width));
- return getRad ? vfov : vfov * MathLight.DEGREES_PER_RADIAN;
- }
- /* clampVFOV: function(fov, t, i, n) {
- var r = cameraLight.getHFOVFromVFOV(fov, i, n);
- return r > t ? cameraLight.getVFOVFromHFOV(t, i, n) : fov
- },
- getHFOVForCamera: function(e, t, i) {
- return cameraLight.getHFOVFromVFOV(e.fov, t, i)
- },
- getHFOVFromVFOV: function(fov, t, i) {
- var n = t
- , o = i
- , a = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (n / o)) * MathLight.DEGREES_PER_RADIAN;
- return a
- },
- getVFOVFromHFOV: function(e, t, i) {
- var n = t
- , o = i
- , a = 2 * Math.atan(Math.tan(e * MathLight.RADIANS_PER_DEGREE / 2) * (o / n)) * MathLight.DEGREES_PER_RADIAN;
- return a
- } */
- };
- /*
- 二维的标尺。
- 主要难度是将三维线段转化为二维。
- 因此需要知道三维线段两个端点对应的二维点。 但是它们不一定同时可求。
- 如果两个端点都不可求,姑且不显示这条线段(因为概率很小,虽然利用线上任意两点)
- 如果一个可求一个不可求,可以利用可求点和线上任意一个可求点作一条直线,和屏幕边缘求交点,即可画出。 目前使用的是线段中点,如果中点不可求,继续尝试可求点到中点的中点……
- 求出二维点后,算出和某个基准线的夹角,即可用transfrom来变换element。
-
- */
- function CornerRuler(o, player) {
- var _this = this;
- this.sid = o.sid;
- this.showSid = o.showSid;
- this.text = o.text || '';
- this.state = o.state || 'active';
- this.player = player;
- this.app = player.$app;
- this.elem = document.createElement('div');
- this.elem.className = 'ruler';
- this.elem.setAttribute('data-name', '');
- this.elem.style.display = 'none';
- 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");
- this.setPoints(o.points);
- this.player.cornerRulers.push(this);
- var count = 0;
- var tryAppend = function tryAppend() {
- if (document.querySelector('.widgets-rulers')) {
- document.querySelector('.widgets-rulers').append(_this.elem);
- } else if (count++ < 4) {
- setTimeout(tryAppend, 500);
- }
- };
- tryAppend();
- }
- CornerRuler.prototype.setPoints = function (p) {
- if (this.points && this.points[0].equals(p[0]) && this.points[1].equals(p[1])) return;
- this.points = p;
- this.updateText();
- };
- CornerRuler.prototype.updateText = function () {
- {
- //试试自动计算长度 在mp的场景应该很准确
- this.length = Math.round(this.points[0].distanceTo(this.points[1]) * 100) / 100;
- this.text = this.app.config.i18n('common.about') + this.length + this.app.config.i18n('common.meter') + (this.showSid ? ' | ' + this.sid : '');
- }
- this.elem.querySelector('.ruler-label-name').innerText = this.text;
- };
- CornerRuler.prototype.remove = function () {
- this.elem.remove();
- };
- CornerRuler.prototype.getCrossPoint = function (posIn, posOut) {
- //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
- var W = this.player.domElement.clientWidth;
- var H = this.player.domElement.clientHeight;
- var x, y, border;
- var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
- var getX = function getX(y) {
- return r * (y - posIn.y) + posIn.x;
- };
- var getY = function getY(x) {
- return 1 / r * (x - posIn.x) + posIn.y;
- };
- if (posOut.x > W || posOut.x < 0) {
- //x超出的情况
- if (posOut.x > W) border = W;else border = 0;
- if (posOut.y < 0 || posOut.y > H) {
- //y也超出
- if (posOut.y < 0) y = 0;else y = H;
- x = getX(y);
- if (x > W || x < 0) {
- x = border;
- y = getY(x);
- }
- } else {
- x = border;
- y = getY(x);
- }
- } else {
- //只有y超出,x没有超出
- if (posOut.y < 0) y = 0;else y = H;
- x = getX(y);
- }
- return new THREE.Vector2(x, y);
- }; //getCrossPoint的posIn版本
- CornerRuler.prototype.getPosInCrossPoint = function (p1, aim) {
- //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
- var W = this.player.domElement.clientWidth;
- var H = this.player.domElement.clientHeight;
- return math$2.getCrossPointAtRect(p1, aim, W, H, 0, 0);
- };
- CornerRuler.prototype.getPosAtSphere = function (toPos) {
- //fish
- this.fishPoints = [];
- this.points.forEach(function (p) {
- var pos = convertTool.getPosAtSphere(p.clone(), toPos);
- this.fishPoints.push(pos);
- }.bind(this));
- };
- var reTryCount$1 = 1;
- CornerRuler.prototype.getPosInScreen = function (p1, p2, count) {
- // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
- var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
- var pos2d = convertTool.getPos2d(center, this.player);
- if (pos2d.trueSide) {
- var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
- if (pos2d.inSight) {
- pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
- pos2d.vector = null;
- /* console.log("pos2d.inSight") */
- } //要求它在边界上的点才行,否则范围被缩小
- return {
- result: 'p1p2',
- p1: visi,
- p2: pos2d
- };
- } else {
- if (count + 1 > reTryCount$1) return; //最多重复次数
- var trueSide = p1.pos2d.trueSide ? p1 : p2;
- return this.getPosInScreen(trueSide, {
- point: center,
- pos2d: pos2d
- }, ++count);
- }
- };
- CornerRuler.prototype.update = function () {
- // Todo 有bug 先注释
- if (this.player.mode != 'panorama' || this.state != 'active') {
- this.elem.style.display = 'none';
- return;
- } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
- var p1 = convertTool.getPos2d(this.points[0], this.player);
- var p2 = convertTool.getPos2d(this.points[1], this.player);
- if (!p1.trueSide || !p2.trueSide) {
- //背面点处理
- if (!p1.trueSide && !p2.trueSide) {
- //这种情况一般都是线段背离相机了,基本不用考虑
- this.elem.style.display = 'none';
- return;
- }
- var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
- {
- point: this.points[0],
- pos2d: p1
- }, {
- point: this.points[1],
- pos2d: p2
- }, 0);
- if (!retry) {
- this.elem.style.display = 'none';
- return;
- }
- p1 = retry.p1;
- p2 = retry.p2;
- }
- var pos1 = p1.pos,
- pos2 = p2.pos;
- var len = pos1.distanceTo(pos2);
- if (len == 0) {
- console.warn('ruler间距为0!');
- return;
- } //计算BA和水平向右的向量间的夹角0-180
- var angle = Math.acos((pos1.x - pos2.x) / len);
- angle %= 360;
- angle *= 180 / Math.PI; //计算angle方向是顺时针还是逆时针(画出4种情况即可发现有这两个方向)
- var BA1 = pos1.clone().sub(pos2);
- var BA = new THREE.Vector3(BA1.x, BA1.y, 0);
- var BC = new THREE.Vector3(1, 0, 0);
- var dir = BA.cross(BC).z > 0 ? 1 : -1;
- angle *= dir; //更新尺子的位置 具体绘图见笔记 //以第二个点B为基准
- {
- var lineElem = this.elem.querySelector('.ruler-line');
- lineElem.style.width = len + 'px', lineElem.style.left = p2.pos.x + 'px';
- lineElem.style.top = p2.pos.y + 'px', lineElem.style.transform = 'rotate(' + -angle + 'deg)';
- } //更新label箭头的中心位置
- var centerX,
- centerY,
- ratio = 0.5,
- W = this.player.domElement.clientWidth,
- H = this.player.domElement.clientHeight;
- if (!p1.inSight || !p2.inSight) {
- var pos1inSight, pos2inSight; //屏幕可见线段端点。
- if (!p1.inSight) {
- //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
- pos1inSight = this.getCrossPoint(pos2, pos1);
- } else {
- pos1inSight = pos1.clone();
- }
- if (!p2.inSight) {
- pos2inSight = this.getCrossPoint(pos1, pos2);
- } else {
- pos2inSight = pos2.clone();
- }
- var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
- centerX = center.x;
- centerY = center.y;
- if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
- //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
- this.elem.style.display = 'none';
- return;
- } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
- if (pos2.x == pos1.x) {
- if (pos2.y == pos1.y) {
- console.warn('pos1和2一样???');
- return;
- } else {
- if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
- }
- } else {
- if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
- else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
- }
- if (ratio < 0 || ratio > 1) {
- this.elem.style.display = 'none';
- return;
- } //如果ratio超出范围,说明可见中心脱离线段
- } else {
- centerX = (pos1.x + pos2.x) / 2;
- }
- this.elem.style.display = ''; //更新label的方向是左侧还是右侧
- var labelElem = this.elem.querySelector('.ruler-label');
- if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
- labelElem.classList.add('reverse');
- } else {
- labelElem.classList.remove('reverse');
- }
- labelElem.style.transform = 'rotate(' + angle + 'deg)';
- labelElem.style.left = ratio * 100 + '%';
- };
- var SceneRendererEvents = {
- ContextCreated: 'scene-renderer-context-created',
- AfterRender: 'after-render',
- MemoryUsageUpdated: 'scene-renderer-memory-usage-updated'
- };
- var addLabel$2 = browser$1.urlHasValue('pointLabel');
- var horRulerShowSid = addLabel$2;
- var labelProp = {
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0.4
- },
- textColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- },
- borderRadius: 15,
- renderOrder: 50
- };
- var player$m;
- var WallManager = /*#__PURE__*/function () {
- function WallManager(app) {
- _classCallCheck(this, WallManager);
- this.app = app;
- this.roomInfo = {};
- this.rulerVisi = false;
- this.version = 2;
- this.cad = null;
- this.planeNeedAdjust = [];
- this.appType = null;
- this.showRulers = addLabel$2; //true
- this.updateList = [];
- }
- _createClass(WallManager, [{
- key: "init",
- value: function init(model) {
- this.model = model;
- player$m = this.app.core.get('Player');
- if (Object.keys(this.roomInfo).length && this.roomInfo[Object.keys(this.roomInfo)[0]].rooms.length) {
- return false; //已经创建了?
- }
- var metadata = this.app.store.getValue('metadata');
- var floorJson = this.app.store.getValue('flooruser');
- this.initRoomInfo(common$1.CloneJson(floorJson));
- if (metadata && metadata.controls.showScale) {
- this.showRulers = true;
- return true;
- }
- }
- }, {
- key: "switchDisplay",
- value: function switchDisplay(ifShow) {
- this.showRulers = !!ifShow;
- this.updateRulersVisi();
- } // 加额外显示的label 如房间名 标尺
- }, {
- key: "initRoomInfo",
- value: function initRoomInfo(floorJson) {
- var _this = this;
- new THREE.MeshBasicMaterial({
- transparent: true,
- wireframe: true,
- opacity: 0.3,
- color: '#ff9999',
- depthTest: false,
- side: THREE.DoubleSide
- });
- var oriRoomGroup = new THREE.Object3D();
- this.model.add(oriRoomGroup);
- oriRoomGroup.visible = false;
- this.cad = floorJson;
- this.initFloorPlan(floorJson);
- /* performance.mark('ifPanoSeePoints-start')
-
- this.model.panos.list.forEach((pano)=>{
- this.ifPanoSeePoints(pano);
- })
-
- performance.mark('ifPanoSeePoints-end')
- performance.measure('ifPanoSeePoints', 'ifPanoSeePoints-start', 'ifPanoSeePoints-end')
- */
- {
- var update = function update() {
- //console.log('update', this.updateList.length)
- _this.updateList.forEach(function (ruler) {
- ruler.update();
- });
- };
- this.app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
- if (player$m.lastFrameChanged) {
- common$1.intervalTool.isWaiting('updateRulersVisi_' + _this.app.resource.num, function () {
- _this.updateRulersVisi();
- }, 500);
- update();
- }
- });
- }
- }
- }, {
- key: "initFloorPlan",
- value: function initFloorPlan(floorCad) {
- var _this2 = this;
- common$1.timeMeasuring.addTimeMark('initFloorPlan', 'start');
- floorCad.floors.forEach(function (floorJson, floorIndex) {
- var floor = player$m.model.floors.index[floorIndex];
- if (!floor) {
- console.error('没找到floor', floorJson);
- return;
- }
- var bottom = floor.boundingBox.min.y;
- var top = floor.boundingBox.max.y;
- floorJson.bottom = bottom;
- floorJson.top = top;
- for (var id in floorJson.points) {
- var point = floorJson.points[id];
- var walls = point.parent;
- var btmPos = _this2.getPos3dFrom2d(point, bottom);
- var topPos = _this2.getPos3dFrom2d(point, top);
- var pointRulerInfo = {
- point,
- horizons: [],
- verti: null
- };
- pointRulerInfo.verti = _this2.addRuler(btmPos, topPos, "floor".concat(floorIndex, "-p").concat(id, "-verti"));
- for (var wall in walls) {
- //这个不准
- /* let p2type = walls[wall] == 'start' ? 'end' : 'start'
- let rulerInfo = this.getHorRuler(id, floorJson.walls[wall][p2type], floorIndex, bottom)
- */
- //监控错误:
- if (wall == 'null' || !floorJson.walls[wall]) {
- console.warn('该点有wall == null的walls', point);
- continue;
- }
- walls[wall] == 'start' ? 'end' : 'start';
- var realp2Type = floorJson.walls[wall].start == id ? 'end' : 'start'; //if (p2type != realp2Type) console.error('p2type != realp2Type', wall, id)
- var p2Id = floorJson.walls[wall][realp2Type];
- var rulerInfo = _this2.getHorRuler(id, p2Id, floorIndex, bottom); //
- pointRulerInfo.horizons.push(rulerInfo);
- }
- pointRulerInfo.horizons = pointRulerInfo.horizons.sort(function (r1, r2) {
- return r1.angle - r2.angle;
- });
- point.pointRulerInfo = pointRulerInfo;
- addLabel$2 && _this2.addLabel(point, btmPos, floor);
- }
- });
- common$1.timeMeasuring.addTimeMark('initFloorPlan', 'end', true);
- }
- }, {
- key: "getHorRuler",
- value: function getHorRuler(p1Id, p2Id, floorIndex, bottom) {
- if (p1Id == p2Id) {
- console.error('p1Id == p2Id');
- }
- var id1 = p1Id.split('Point')[1];
- var id2 = p2Id.split('Point')[1];
- var sid1 = "f".concat(floorIndex, "-").concat(id1, "-").concat(id2, "-hor");
- var sid2 = "f".concat(floorIndex, "-").concat(id2, "-").concat(id1, "-hor");
- var ruler = player$m.cornerRulers.find(function (e) {
- return e.sid == sid1;
- });
- if (ruler) return {
- ruler,
- angle: ruler.angle
- }; //多半找不到,因为一条线最多只能从两个点找到,getHorRuler应该是创建完就从反方向get了
- else ruler = player$m.cornerRulers.find(function (e) {
- return e.sid == sid2;
- });
- if (ruler) return {
- ruler,
- angle: (ruler.angle + Math.PI) % (2 * Math.PI)
- };else {
- var json = this.cad.floors[floorIndex];
- var p1 = json.points[p1Id];
- var p2 = json.points[p2Id];
- ruler = this.addRuler(this.getPos3dFrom2d(p1, bottom), this.getPos3dFrom2d(p2, bottom), sid1, horRulerShowSid);
- ruler.angle = new THREE.Vector2().subVectors(p2, p1).angle(); //用来排序角度
- ruler.pointIds = [p1Id, p2Id];
- return {
- ruler,
- angle: ruler.angle
- };
- }
- }
- }, {
- key: "addRuler",
- value: function addRuler(startPos, endPos, sid, showSid) {
- var ruler = new CornerRuler({
- sid,
- points: [startPos, endPos],
- state: 'unable',
- showSid
- }, player$m);
- return ruler;
- }
- }, {
- key: "addLabel",
- value: function addLabel(point, pos, model) {
- //this.removeLabel()
- var label = new TextSprite(Object.assign({}, labelProp, {
- text: point.vectorId.split('Point')[1],
- player: player$m
- }));
- label.sprite.material.depthTest = true;
- var position = pos.clone();
- position.y += 0.2;
- label.position.copy(position);
- model.add(label);
- labelProp.scale || (labelProp.scale = math$2.linearClamp(this.model.size.length(), 10, 500, 0.5, 7));
- var s = labelProp.scale;
- label.scale.set(s, s, s);
- }
- }, {
- key: "getPos3dFrom2d",
- value: function getPos3dFrom2d(point2d, height) {
- return new THREE.Vector3(point2d.x, height, -point2d.y);
- }
- }, {
- key: "getPos2dFrom3d",
- value: function getPos2dFrom3d(point3d) {
- return new THREE.Vector2(point3d.x, -point3d.z);
- }
- }, {
- key: "isShelter",
- value: function isShelter(floorJson, point1, point2) {
- //walls数量多时耗时
- var line1 = [point1, point2];
- var atWalls = [];
- point1.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point1.parent)));
- point2.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point2.parent)));
- var intersecPoint;
- var intersectLine = Object.values(floorJson.walls).find(function (wall) {
- if (atWalls.some(function (e) {
- return e == wall.vectorId;
- })) return;
- var point1_ = floorJson.points[wall.start];
- var point2_ = floorJson.points[wall.end];
- var line2 = [point1_, point2_];
- intersecPoint = math$2.isLineIntersect(line1, line2);
- if (intersecPoint) {
- 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)) {
- //console.log('a',point1_.vectorId, point2_.vectorId)
- return; //点在线上,不算, 相当于atWall
- } else return intersecPoint;
- }
- });
- return !!intersectLine;
- } //注:如果有两条线看起来相交,但其实没有共用交点;或线重叠了一部分。这样很容易识别为true,导致ruler不显示。如果要根据点是否在线上来排除,要计算getFootPoint,太复杂了。所以需要人为把cad调整规范
- /*
- !假定:
- 1 每个漫游点只能看到一个point的一组边,且这两条边相邻。
- 可推断:
- 1 pano的可见group可以提前得到,因为和视角无关,只和位置有关
- */
- }, {
- key: "ifPanoSeePoints",
- value: function ifPanoSeePoints(pano) {
- var _this3 = this;
- //差不多每个pano用时0.5-2ms(在无console时)。很大的场景可能达到100ms, 还好连续漫游时只要加载不停顿就不会触发计算
- common$1.timeMeasuring.addTimeMark('ifPanoSeePoints', 'start');
- var panoVideoFilter = pano.getVideoFilter(); //视频漫游点角度范围内隐藏ruler
- pano.visibleRulerInfos = [];
- var panoPos2d = this.getPos2dFrom3d(pano.position);
- var floor = this.cad.floors[pano.floorIndex];
- if (!floor) {
- if (!player$m.model.floors.index[pano.floorIndex] && player$m.model.floors.length == 1) {
- floor = player$m.model.floors.list[0];
- } else {
- console.error('ifPanoSeePoints 没找到楼层');
- return;
- }
- }
- var bottom = floor.bottom;
- var r1 = 1 / (2 * Math.sin(THREE.MathUtils.degToRad(5))); //5是最小可见deg的一半。假设只有一个horizon且和panoToPoint垂直
- var minRad = THREE.MathUtils.degToRad(5);
- var _loop = function _loop(id) {
- var point = floor.points[id];
- var horizons = point.pointRulerInfo.horizons; //angle已经从小到大排序
- var panoAngle = new THREE.Vector2().subVectors(panoPos2d, point).angle(); //类同horizons求角度,用来排序
- var neibourHorizons = []; //要挑选的在当前pano能见的该point的边
- if (horizons.length > 2) {
- //选择两条在pano两边最近的线
- var h1 = horizons.find(function (e) {
- return e.angle > panoAngle;
- });
- if (h1) {
- var h1Index = horizons.indexOf(h1);
- if (h1Index == 0) {
- //pano在第一个之前
- neibourHorizons = [h1, horizons[horizons.length - 1]]; //选择第一个和最后一个
- } else {
- neibourHorizons = [horizons[h1Index - 1], h1]; //选择h1和它前面那个
- }
- } else {
- //在最后一个之后
- neibourHorizons = [horizons[0], horizons[horizons.length - 1]]; //也是选择第一个和最后一个
- } //选完后依旧是从小到大
- } else {
- neibourHorizons = horizons;
- }
- if (panoPos2d.distanceTo(point) > neibourHorizons.reduce(function (w, c) {
- return w + c.ruler.length;
- }, 0) * r1) {
- //console.log('排除'/* , point.vectorId, pano.id */); //提前排除一些距离远的,基本看不到。但可能误伤
- return "continue";
- }
- var mid = _this3.getPos3dFrom2d(point, bottom);
- if (panoVideoFilter && panoVideoFilter(mid)) {
- //遮住pano视频了
- addLabel$2 && console.log('点在视频区域内', point);
- return "continue";
- }
- /* if(this.isShelter(floor, point, panoPos2d ) ){//墙角容易遮挡,不算了(尤其是特意编辑好的户型里)
- addLabel && console.log('isShelter', id, pano.id)
- continue
- } */
- var info = [];
- neibourHorizons.forEach(function (r, i) {
- info[i] = {};
- r.anotherPoint2d = floor.points[r.ruler.pointIds.find(function (pid) {
- return pid != id;
- })];
- r.anotherPoint = _this3.getPos3dFrom2d(r.anotherPoint2d, bottom);
- var mid2 = new THREE.Vector2().addVectors(r.anotherPoint2d, point).multiplyScalar(0.5); //用中点而不是端点是因为端点容易被遮住,如点靠在别的线上,或仅被墙角遮住一点点
- if (_this3.isShelter(floor, mid2,
- /* r.anotherPoint2d, */
- panoPos2d)) {
- addLabel$2 && console.log('isShelter线段中点被遮挡', r.ruler.pointIds, pano.id);
- info[i].lineShelter = true;
- return;
- }
- if (panoVideoFilter && panoVideoFilter(r.anotherPoint)) {
- //点在视频区域内
- addLabel$2 && console.log('端点在视频区域内', r);
- info[i].coverVideo = true;
- return;
- }
- if (panoVideoFilter && pano.getVideoFilter('across').apply(void 0, _toConsumableArray(r.ruler.points))) {
- //线横跨视频区域
- addLabel$2 && console.log('线横跨视频区域', r);
- info[i].coverVideo = true;
- return;
- }
- info[i].panoToSidePoint = new THREE.Vector3().subVectors(r.anotherPoint, pano.position).setY(0); //端点方向
- info[i].panoToSidePoint.normalize();
- });
- neibourHorizons = neibourHorizons.filter(function (r, i) {
- return !info[i].coverVideo && !info[i].lineShelter;
- });
- if (neibourHorizons.length == 0) return "continue";
- info = info.filter(function (r, i) {
- return !r.coverVideo && !r.lineShelter;
- });
- panoToPoint = new THREE.Vector3().subVectors(mid, pano.position).setY(0); //方向
- var disSquaredToPano = panoToPoint.lengthSq();
- panoToPoint.normalize();
- var backSide = void 0,
- coverRad = void 0,
- midVec = void 0,
- sidePanoVec1 = void 0,
- sidePanoVec2 = void 0; //pano到两端的向量
- if (neibourHorizons.length == 2) {
- ruler1Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[0].anotherPoint).setY(0);
- ruler2Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[1].anotherPoint).setY(0);
- panoToPoint.clone().cross(ruler1Vec).y;
- panoToPoint.clone().cross(ruler2Vec).y;
- /*backSide = axis1 * axis2 > 0
- if(axis1 * axis2 > 0){//必须一个顺时针一个逆时针才能两个墙壁都看到 (但是这样遇到柱子经常只能看到远的那边)//已计算遮挡这段不需要了
- continue;
- }
- if(axis1>0){
- neibourHorizons = [neibourHorizons[1], neibourHorizons[0] ]//调换顺序,使第一个在左边,第二个在右边
- } */
- //已知:0的angle小于1的angle,所以当pano在两个angle之间时就是正常的0为左1为右;但若pano在包含角度为0的这边就要反一下
- if (panoAngle >= 0 && panoAngle < neibourHorizons[0].angle || panoAngle > neibourHorizons[1].angle && panoAngle < Math.PI * 2) {
- neibourHorizons = [neibourHorizons[1], neibourHorizons[0]]; //调换顺序,使第一个在左边,第二个在右边
- }
- sidePanoVec1 = info[0].panoToSidePoint;
- sidePanoVec2 = info[1].panoToSidePoint;
- } else {
- sidePanoVec1 = info[0].panoToSidePoint;
- sidePanoVec2 = panoToPoint;
- } //计算覆盖角度
- midVec = new THREE.Vector3().addVectors(sidePanoVec1, sidePanoVec2).normalize(); //到两端方向的中间方向
- coverRad = Math.acos(sidePanoVec1.dot(sidePanoVec2)); //在界面上覆盖的角度
- if (panoToPoint.dot(midVec) < 0) {
- //中心方向和panoToPoint夹角大于90度,需要反向
- midVec.negate();
- coverRad = 2 * Math.PI - coverRad;
- }
- if (coverRad < minRad) {
- addLabel$2 && console.log('coverRad过小', id, pano.id, coverRad.toFixed(3));
- return "continue"; //在界面上覆盖的角度过小
- }
- pano.visibleRulerInfos.push({
- pId: point.vectorId,
- point,
- neibourHorizons,
- coverRad,
- panoToPoint,
- disSquaredToPano,
- backSide,
- midVec
- });
- };
- for (var id in floor.points) {
- var panoToPoint;
- var ruler1Vec;
- var ruler2Vec;
- var _ret = _loop(id);
- if (_ret === "continue") continue;
- }
- common$1.timeMeasuring.addTimeMark('ifPanoSeePoints', 'end', true);
- }
- }, {
- key: "updateRulersVisi",
- value: function updateRulersVisi() {
- this.lastShowRulers && this.lastShowRulers.forEach(function (ruler) {
- ruler.state = 'unable';
- });
- var pano = player$m.currentPano;
- this.updateList = this.lastShowRulers || []; //player.cornerRulers
- if (this.showRulers && !player$m.flying && player$m.mode == 'panorama' && pano.isAligned() && !(settings$3.vrEnabled && settings$3.vrSplitScreen)) {
- if (!pano.visibleRulerInfos) {
- this.ifPanoSeePoints(pano);
- }
- var playerDir = player$m.getDirection().setY(0).normalize();
- player$m.position;
- var playerPos2d = this.getPos2dFrom3d(player$m.position);
- var hfov = cameraLight.getHFOVForCamera(player$m.cameraControls.activeControl.camera, null, null, true);
- var results = common$1.sortByScore(pano.visibleRulerInfos, [], [function (group) {
- //离相机方向角度越小越好, ruler角度跨越越大越好
- var shiftRad = Math.acos(group.midVec.dot(playerDir)); //ruler中心偏移屏幕(相机)水平中心方向的角度
- //计算在屏幕中(水平)所占的fov, 它由镜头方向左侧和右侧部分组成, 假设镜头相对标尺中心偏左边(实际偏哪边结果都一样)
- var leftRad = Math.min(group.coverRad / 2 + shiftRad, hfov / 2);
- var righRad = Math.min(group.coverRad / 2 - shiftRad, hfov / 2);
- var v = leftRad + righRad; //由于有的墙角很小,比不上旁边墙所占的fov,但focus它的时候还是希望显示它,所以加一点奖励
- var v2 = (Math.PI - shiftRad) * 0.5;
- var d = 5 + group.disSquaredToPano / 30;
- var a = Math.pow(1 + v + v2, 3) * 3; //(+1是因为底数要大于1 . 另外所有参数都要是正数)
- var w = a / d; //if(group.backSide) w = Math.min(w-2, w *= 0.8)
- group.logMsg = "v ".concat(v, ", v2 ").concat(v2, ", v\u590D\u5408").concat(a, ", dis\u590D\u5408 ").concat(d, ", ");
- return w;
- }]);
- addLabel$2 && console.log(results);
- if (results[0]) {
- {
- //矫正高度,因模型崎岖不平,之前使用的最低点一般都低于真实值
- results[0].item.neibourHorizons.forEach(function (e) {
- return e.ruler.points.forEach(function (p) {
- return p.y = pano.floorPosition.y;
- });
- });
- results[0].item.point.pointRulerInfo.verti.points[0].y = pano.floorPosition.y;
- results[0].item.point.pointRulerInfo.verti.updateText(); //这样房间高度会一直变会不会很奇怪?虽然可以计算所有相同neibourHorizon的pano的低高中位数,但是因为是走一个算一个所以也在变。
- }
- var visiRulers = results[0].item.neibourHorizons.map(function (e) {
- return e.ruler;
- }).concat(results[0].item.point.pointRulerInfo.verti);
- visiRulers.forEach(function (ruler) {
- ruler.dir = null, ruler.state = 'active';
- });
- this.lastShowRulers = visiRulers;
- this.updateList = common$1.getUnionSet(this.updateList, visiRulers); //有些字靠的近容易打架。 故左边的朝左,右边的朝右
- if (results[0].item.neibourHorizons.length == 2) {
- var dis = playerPos2d.distanceTo(results[0].item.point);
- var left = results[0].item.neibourHorizons[0].ruler;
- var right = results[0].item.neibourHorizons[1].ruler;
- if (left.length < dis / 2) left.dir = 'left';
- if (right.length < dis / 2) right.dir = 'right';
- }
- }
- } else this.lastShowRulers = [];
- this.updateList.forEach(function (ruler) {
- ruler.update();
- });
- }
- }]);
- return WallManager;
- }(); // const wallManager = new WallManager()
- 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); }; }
- 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; } }
- /*
- z
- |
- |
- |
- |
- x <-------| 中心为点云position加boudingbox中心
- /
- /
- y
- */
- var lineLen = 3,
- stemLen = 1.5,
- arrowLen = 0.5,
- lineDisToStem = 0.5;
- var Axis = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Axis, _THREE$Object3D);
- var _super = _createSuper$1B(Axis);
- // 坐标轴
- function Axis(app) {
- var _this;
- _classCallCheck(this, Axis);
- _this = _super.call(this);
- _this.app = app;
- _this.getArrow();
- _this.createArrows();
- return _this;
- }
- _createClass(Axis, [{
- key: "getArrow",
- value: function getArrow() {
- var arrowGroup = new THREE.Object3D();
- var line = LineDraw.createLine([new THREE.Vector3(), new THREE.Vector3(0, 0, lineLen)]);
- var stem = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.1, stemLen));
- stem.position.set(0, 0, lineLen + lineDisToStem + stemLen / 2);
- 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
- arrow.position.set(0, 0, lineLen + lineDisToStem + stemLen + arrowLen / 2);
- arrow.rotation.set(Math.PI / 2, 0, 0);
- arrowGroup.add(stem);
- arrowGroup.add(line);
- arrowGroup.add(arrow);
- this.arrowGroup = arrowGroup;
- }
- }, {
- key: "createArrows",
- value: function createArrows() {
- var _this2 = this;
- new THREE.MeshBasicMaterial({
- color: '#00d7df',
- side: 2,
- transparent: true,
- opacity: 0.8,
- depthWrite: false
- });
- var colors = {
- x: '#ea3f3f',
- y: '#86c215',
- z: '#3396f8'
- };
- ['x', 'y', 'z'].forEach(function (axisText) {
- var color = new THREE.Color().set(colors[axisText]);
- var group = _this2.arrowGroup.clone();
- group.children.forEach(function (e) {
- e.material = e.material.clone();
- /* e.material.opacity = opacity
- e.material.transparent = true */
- e.material.color.copy(color);
- });
- var label = _this2.createLabel(axisText, color);
- label.position.set(0, 0, (lineLen + stemLen + arrowLen + lineDisToStem + 0.5) * 1.05);
- group.add(label);
- var meter = _this2.createLabel('1m', color, 20, 0.4);
- meter.position.set(0, 0, 1);
- group.add(meter);
- if (axisText == 'y') {
- group.rotation.x = -Math.PI / 2;
- } else if (axisText == 'x') {
- group.rotation.y = Math.PI / 2;
- }
- _this2.add(group);
- });
- }
- }, {
- key: "createLabel",
- value: function createLabel(text, color) {
- var fontsize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 120;
- var scale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1.2;
- var label = new TextSprite({
- //无法解决 因其祖先有设定quaternion, 无法对着镜头
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0
- },
- textColor: {
- r: color.r * 255,
- g: color.g * 255,
- b: color.b * 255,
- a: 1
- },
- fontsize,
- //useDepth : true ,
- renderOrder: 5,
- // pickOrder:5,
- player: this.app.core.get('Player'),
- text,
- name: 'axis'
- });
- label.scale.set(scale, scale, scale);
- return label;
- }
- }]);
- return Axis;
- }(THREE.Object3D);
- var _class;
- 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); }; }
- 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; } }
- var highMapAddColor = browser$1.urlHasValue('highMapColor');
- var Model = Emitter(_class = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Model, _THREE$Object3D);
- var _super = _createSuper$1A(Model);
- function Model(app) {
- var _this;
- _classCallCheck(this, Model);
- _this = _super.call(this);
- _this.setupCustomProperties = function () {
- var e = settings$3.modelAlpha;
- Object.defineProperty(this, 'alpha', {
- get: function get() {
- return e;
- },
- set: function set(t) {
- e = t; //console.log('modelalpha', t)
- this.chunks.forEach(function (chunk) {
- if (chunk.material && chunk.material.uniforms.modelAlpha) {
- chunk.material.uniforms.modelAlpha.value = e; //修改一下defines,为了在不需要map时不加载map。 by xzw
- if (e) {
- if (!('useModelMap' in chunk.material.defines)) {
- chunk.material.defines.useModelMap = '';
- chunk.material.needsUpdate = true;
- }
- } else {
- if ('useModelMap' in chunk.material.defines) {
- delete chunk.material.defines.useModelMap;
- chunk.material.needsUpdate = true; //chunk.material.uniforms.map.value.dispose() //防止崩溃(但是因为这样飞出要等待时间所以被去掉了)
- }
- }
- }
- });
- }
- });
- };
- _this.build = function () {
- var _this2 = this;
- this.currentFloor = this.floors.last();
- this.floors.build();
- this.colliders = this.floors.reduce(function (array, floor) {
- return array.concat(floor.collider.children);
- }, []);
- this.panos.forEach(function (pano) {
- pano.build1(), pano.on('enter', function () {
- pano.floor !== _this2.currentFloor && _this2.setFloor(pano.floor);
- });
- });
- this.panos.forEach(function (pano) {
- pano.build2();
- });
- this.floors.forEach(function (floor) {
- this.boundingBox.union(floor.boundingBox);
- }.bind(this));
- var size = new THREE.Vector3();
- var center = new THREE.Vector3();
- this.boundingBox.getSize(size);
- this.boundingBox.getCenter(center);
- this.size = size;
- this.center = center;
- this.floors.forEach(function (floor) {
- logger$1.info('Floor ' + floor + ': ' + floor.children.length + ' chunks, ' + floor.panos.length + ' panos.');
- }.bind(this)); //this.panos.populate_path_graph();
- this.skybox = new BoundingTextureSkybox(this.boundingBox);
- this.skybox.matrixWorldNeedsUpdate = !0;
- this.add(this.skybox);
- {
- this.skyBoxTight = new BoundingTextureSkybox(this.boundingBox, 2);
- /* this.skyBoxTight = new THREE.Mesh(new THREE.BoxGeometry(size.x, size.y, size.z))
- this.skyBoxTight.computeBoundingBox() //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
- this.skyBoxTight.position.copy(center) */
- }
- logger$1.debug('Done building model');
- if (Panorama.raycastsDone > 0) {
- logger$1.warn('raycasts: ' + Panorama.raycastsDone);
- logger$1.warn('raycasts skipped: ' + Panorama.raycastsSkipped);
- } //创建floorLogo
- this.floorLogos.createFloorLogo();
- this.add(this.floorLogos.firstLogo);
- this.add(this.floorLogos.secondLogo);
- if (browser$1.urlHasValue('axis')) {
- this.add(new Axis(this.$app));
- }
- setTimeout(function () {
- _this2.floorplanCadImg.init(_this2);
- _this2.wallManager.init(_this2);
- }, 100);
- this.addHighMapCube();
- var videoInfo = this.$app.core.get('PanoVideoRenderer').videosInfo;
- if (videoInfo) {
- var parameters = videoInfo.parameters;
- this.updateVideoRenderParameters(parameters);
- }
- this.builded = true; //xzw
- this.dispatchEvent({
- type: 'builded'
- });
- this.texSizeBlock = this.chunks.reduce(function (w, e) {
- var tex = e.material.uniforms.map.value;
- return w + Math.pow(tex.image.width / 512, 2);
- }, 0).toFixed(1); //注:初始时还没有_listeners
- if (this.$app.config.mobile && browser$1.urlHasValue('vlog')) {
- setInterval(function () {
- var count = _this2.getDrawedTexCount().toFixed(1);
- var title = document.querySelector('#app .information .title span');
- if (title) {
- title.innerText = count + '|' + _this2.$app.core.get('Player').lowTile;
- }
- }, 1000);
- var right = document.querySelector('#app .information .right');
- if (right) {
- right.addEventListener('click', function () {
- window.logEnable = !window.logEnable;
- });
- }
- }
- if (this.texSizeBlock > 40) {
- setTimeout(function () {
- //防止大的场景在首次飞出时卡顿一下,提前渲染 。控制未dispose的贴图块数
- var player = _this2.$app.core.get('Player'); //虽然渲染的和没渲染的都有一个期望值,但是因为它们必须满足 和大于总数,所以不能随意设置。优先考虑满足飞出不卡顿,那么只考虑没渲染即可。在保证当前未渲染小于某个值的情况下向总数的一半靠拢。
- var maxHasnt = _this2.$app.config.mobile ? 100 : 60; //最大能接受的飞出时不停顿的数字(大的场景稍微等待半秒、pc可以加载多点尽量不等待)
- var hopeHas = _this2.texSizeBlock - Math.min(_this2.texSizeBlock * 0.5, maxHasnt); //console.log('hopeHas', hopeHas)
- var lastChunkToRender,
- historyRen = [];
- var update = {
- update: function update() {
- if (player.mode == 'panorama' && !player.flying && !player.lastFrameChanged) {
- if (lastChunkToRender) {
- delete lastChunkToRender.material.defines.useModelMap;
- lastChunkToRender.material.needsUpdate = true;
- lastChunkToRender = null;
- }
- var c = _this2.getDrawedTexCount();
- var chunk;
- if (c > hopeHas) {
- chunk = _this2.chunks.find(function (e) {
- var tex = e.material.uniforms.map.value;
- return tex && tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0;
- });
- if (chunk) {
- chunk.material.uniforms.map.value.dispose(); //console.log('dispose', c)
- }
- } else if (c < hopeHas) {
- var r = common$1.sortByScore(_this2.chunks, [function (e) {
- if (historyRen.includes(e)) return; //historyRen用于记录这一次尝试渲染的chunk,万一哪个不成功就不要重复渲染
- var tex = e.material.uniforms.map.value;
- return tex && !(tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0) && Math.pow(tex.image.width / 512, 2) + c <= hopeHas;
- }], [function (e) {
- var s = 0;
- if (e.floor == _this2.currentFloor) {
- s += 1;
- }
- if (math$2.isInsideFrustum(e.geometry.boundingBox, player.camera)) {
- s += 1;
- }
- return s;
- }]);
- if (r.length) {
- chunk = r[0].item;
- chunk.material.defines.useModelMap = ''; //暂时放开,使渲染
- chunk.material.needsUpdate = true;
- lastChunkToRender = chunk;
- historyRen.push(chunk); //console.log('render', c, chunk.tileId ? chunk.tileId.split('3dtiles/')[1] : chunk.name)
- }
- }
- } else {
- historyRen.length = 0; //清空
- }
- }
- };
- _this2.$app.core.get('SceneRenderer').addComponent(update);
- }, 1000);
- }
- return Promise.resolve(this);
- };
- _this.toggleAlpha = function () {
- this.alpha < 1 ? this.alpha = 1 : this.alpha = 0;
- };
- _this.waitForLoad = function (pano, isLoadedCallbackFunc) {
- if (!isLoadedCallbackFunc()) {
- this.waitQueue.push({
- object: pano,
- isLoadedCallback: isLoadedCallbackFunc
- }), 1 === this.waitQueue.length && this.emit('waiting');
- }
- };
- _this.hide = function () {
- this.floors.hide();
- };
- _this.show = function () {
- this.floors.show();
- };
- _this.floorNames = function () {
- return this.floors.names();
- };
- _this.setFloor = function (floor, mode) {
- this.allFloorsVisible && this.emit('allfloors.toggled', !1, this.currentFloor);
- this.allFloorsVisible = !1;
- this._setFloor(floor, mode);
- };
- _this.toggleAllFloors = function (e) {
- this.allFloorsVisible = void 0 !== e ? e : !this.allFloorsVisible;
- this.emit('allfloors.toggled', this.allFloorsVisible, this.currentFloor);
- this._setFloor(this.currentFloor);
- };
- _this._setFloor = function (floor, mode) {
- var _this3 = this;
- mode = mode || this.mode;
- var old = this.currentFloor;
- this.currentFloor = floor;
- this.$app.core.get('Player').mode;
- if (mode === Viewmode$1.PANORAMA) {
- this.show();
- } else if ( // mode === Viewmode.FLOORPLAN ||
- // (mode === Viewmode.DOLLHOUSE && lastMode == mode) // UI在setMode时已让DOLLHOUSE楼层全显示,所以这里不做更改
- mode === Viewmode$1.FLOORPLAN || mode === Viewmode$1.DOLLHOUSE) {
- this.floors.list.forEach(function (floor, index) {
- var flag = floor === this.currentFloor || this.allFloorsVisible;
- floor.toggle(flag);
- }.bind(this));
- }
- this.emit('floor.changed', this.currentFloor, mode, old); // 楼层显隐tile需要改变,要更新一下
- setTimeout(function () {
- return _this3.$app.core.get('SceneRenderer').update3dTiles({
- force: true
- });
- }, 10);
- };
- _this.toggleExplode = function () {
- this.floors.toggleExplodeHorizontal();
- };
- _this.toggleExplodeUp = function () {
- this.floors.toggleExplodeVertical();
- };
- _this.nextFloor = function (nextfloor) {
- return this.floors.nextFloor(this.currentFloor, nextfloor);
- };
- _this.addFloor = function (floor) {
- this.floors.add(floor);
- };
- _this.getFloorAtPoint = function (position) {
- return this.floors.getFloorAtPoint(position);
- };
- _this.addTile = function (floorIndex, tileContent) {
- this.floors.getOrMakeFloor(floorIndex).addTile(tileContent);
- };
- _this.removeTile = function (tileContent) {
- this.floors.getOrMakeFloor(tileContent.floorIndex).removeTile(tileContent);
- };
- _this.addChunk = function (floorIndex, chunk) {
- this.floors.getOrMakeFloor(floorIndex).addChunk(chunk); // this.chunks.push(chunk)
- };
- _this.setMode = function (mode) {
- var _this4 = this;
- if (!this.supportedModes[mode]) {
- throw new BasicException('Mode not supported for this model: ' + mode);
- }
- this.mode = mode;
- this.chunks.forEach(function (chunk) {
- chunk.setMode(mode, _this4.player.modeTran); // 根据mode选择materialInside/materialOutside以及单双面显隐
- });
- };
- _this.updateProjectedPanos = function (pano) {
- //xzw 改 for 无缝过渡
- if (this.projectedPano0 && this.projectedPano1 && (pano == this.projectedPano0 || pano == this.projectedPano1)) {
- this.setProjectedPanos(this.projectedPano0, this.projectedPano1, !1);
- }
- };
- _this.setProjectedPanos = function (pano0, pano1, restoreFlag) {
- void 0 !== restoreFlag && null !== restoreFlag || (restoreFlag = !0);
- restoreFlag = !!restoreFlag;
- this.projectedPano0 = pano0;
- this.projectedPano1 = pano1;
- this.skybox.material.setProjectedPanos(pano0, pano1, restoreFlag);
- this.chunks.forEach(function (chunk) {
- chunk.materialInside.setProjectedPanos(pano0, pano1, restoreFlag);
- });
- this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
- tile.material.setProjectedPanos(pano0, pano1, restoreFlag);
- }); //console.log('setProjectedPanos')
- };
- _this.setSide = function (side) {
- this.floors.forEach(function (floor) {
- floor.collider.material.side = side;
- });
- };
- _this.fadePanoMarkers = function (opacity, dur) {
- var _this5 = this;
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- mode = _ref.mode,
- hideVideoFlag = _ref.hideVideoFlag;
- if (!this.player) return;
- var currentPano = this.player.currentPano;
- if (settings$3.vrEnabled && window.VRScreenType != 'portrait') {
- this.updateVrMarker();
- return;
- } //console.log("fadePanoMarkers", opacity,dur,o.vrCustomer)
- // // customer时保持marker隐藏
- // let role = location.search.match(new RegExp('[\\?,&]role=(.*?)[&,$]'))
- // if (role && role[1] == 'customer') {
- // // zeg 这部分如无必要只在customer时用,否则影响正常player的lock
- // if (o.vrCustomer != void 0) {
- // //vr被带看的走动时不显示marker
- // this.markerUnable = !!o.vrCustomer
- // }
- // if (this.markerUnable && o.vrCustomer == void 0) {
- // return
- // }
- // return
- // }
- var canShowVideoMarker = this.$app.core.get('PanoVideoRenderer').canShowMarker();
- var hideWhenFlyOut = function hideWhenFlyOut() {
- var shows = [],
- hides = [];
- _this5.player.model.panos.forEach(function (pano) {
- if (pano.hasVideo || pano.panoVideo) {
- if (hideVideoFlag || !pano.hasNeighbor() || pano.floor.hidden || !canShowVideoMarker) {
- hides.push(pano);
- } else {
- //console.log('show',pano.id)
- shows.push(pano);
- }
- } else hides.push(pano);
- });
- _this5.panos.fadeMarkerOpacity(1, dur, [{
- toOp: 0,
- member: hides
- }, {
- toOp: settings$3.panorama.markerOpacity,
- member: shows
- }]);
- };
- if (opacity == 0) {
- hideWhenFlyOut();
- } else {
- if ((mode || this.player.mode) == Viewmode$1.PANORAMA && currentPano) {
- var shows = [],
- //shows2 = [],
- hides = [],
- panoVideoFilter = currentPano.getVideoFilter(); //视频漫游点角度范围内隐藏marker
- this.player.model.panos.forEach(function (pano) {
- //是邻近点就显示否则隐藏
- if ((!panoVideoFilter || !panoVideoFilter(pano.position)) && currentPano.seeMarkers.indexOf(pano.id) > -1) {
- /* if (pano.hasVideo || pano.panoVideo) {//videomarker已经改为普通的,所以删除
- // if (objects.panoVideoRenderer.ifEnable())
- if (this.$app.core.get('PanoVideoRenderer').ifEnable()) pano.marker.visible = true
- } else { */
- shows.push(pano); //}
- } else {
- /* if (pano.hasVideo || pano.panoVideo) pano.marker.visible = false
- else */
- hides.push(pano);
- }
- });
- this.panos.fadeMarkerOpacity(opacity, dur, [{
- toOp: settings$3.panorama.markerOpacity,
- member: shows
- }, {
- toOp: 0,
- member: hides
- }]);
- } else if (this.player.modeTran.split('-')[1] != 'panorama') {
- //飞出后marker隐藏
- hideWhenFlyOut();
- }
- }
- };
- _this.outsideAllowed = function () {
- return this.supportedModes[Viewmode$1.DOLLHOUSE] && this.supportedModes[Viewmode$1.FLOORPLAN];
- };
- _this.getOption = function ($app) {
- return {
- autoload: false,
- floors: true,
- local: false,
- url: $app.config.num,
- urlFiles: 'http://www.4dage.com/BigScene7niu/api/player/models/' + $app.config.num + '/files',
- useVisionModelData: true
- };
- };
- _this.getModelMeta = function ($app) {
- return {
- sid: $app.config.num,
- name: '四维时代',
- status: 'viewable',
- floors: '',
- metainfo: {
- allowed_methods: ['GET', 'OPTIONS', 'HEAD']
- },
- image: 'http://7xo6he.com2.z0.glb.qiniucdn.com/images/images1/07.13.2015_16.22.30.jpg',
- images: [],
- job: {
- uuid: 'dacf7dfa24ae47fab8fcebfe4dc41ab9'
- },
- layers: []
- };
- };
- var options = _this.getOption(app);
- var modelData = _this.getModelMeta(app);
- _this.$app = app;
- _this.sid = modelData.sid;
- _this.data = modelData;
- _this.options = options;
- _this.urls = new ModelUrls(_this.sid, app);
- _this.outdoorPanoLocations = [];
- _this.floors = new FloorCollection(_assertThisInitialized(_this));
- _this.floorsEnabled = void 0 === options.floors || options.floors;
- _this.changingFloor = !1; // this.chunks = []
- _this.panos = new PanoramaCollection(app);
- _this.colliders = [];
- _this.loadPanosPromise = null;
- _this.loadMeshTexturesPromise = null;
- _this.mesh3dTilesLoaded = !1;
- _this.meshTexturesLoaded = !1;
- _this.meshTextures = [];
- _this.tags = new THREE.Object3D(), _this.add(_this.tags), _this.tags.name = 'tags';
- _this.measurements = new THREE.Object3D(), _this.add(_this.measurements), _this.measurements.name = 'measures';
- _this.measureRulers = new THREE.Object3D(), _this.add(_this.measureRulers), _this.measureRulers.name = 'measureRulers' // 双屏添加的老版本测量
- ;
- _this.paths = new THREE.Object3D(), _this.add(_this.paths), _this.paths.name = 'paths';
- _this.supportedModes = {};
- _this.supportedModes[Viewmode$1.PANORAMA] = !0;
- _this.supportedModes[Viewmode$1.DOLLHOUSE] = !modelData.player_options || modelData.player_options.dollhouse && browser$1.valueFromHash('dh', 1);
- _this.supportedModes[Viewmode$1.FLOORPLAN] = !modelData.player_options || modelData.player_options.floor_plan && browser$1.valueFromHash('dh', 1);
- _this.supportedModes[Viewmode$1.TRANSITIONING] = !0;
- _this.supportsTiles = true;
- _this.supportsVR = modelData.is_vr;
- _this.mode = Viewmode$1.DOLLHOUSE;
- _this.size = null;
- _this.center = null;
- _this.boundingBox = new THREE.Box3();
- _this.currentFloor = null;
- _this.allFloorsVisible = !0;
- _this.projectedPano0 = null;
- _this.projectedPano1 = null;
- _this.chunkDisplay = {
- visible: true
- };
- _this.floorsEnabled && modelData.floors && modelData.floors.indexOf(',') !== -1 && modelData.floors.split(',').forEach(function (e, t) {
- this.addFloor(new Floor(this, t, e.trim()));
- }.bind(_assertThisInitialized(_this)));
- _this.waitQueue = [];
- _this.on('load', function (e) {
- 0 !== this.waitQueue.length && (this.waitQueue = this.waitQueue.filter(function (e) {
- return !e.isLoadedCallback();
- }), 0 === this.waitQueue.length && this.emit('waiting-done'));
- }.bind(_assertThisInitialized(_this)));
- _this.setupCustomProperties(); //this.labels = new LabelCollection(this);
- //other:
- _this.vrMarkers = [];
- _this.floorLogos = new FloorLogos(_this.$app);
- _this.floorplanCadImg = new FloorplanCadImg(_this.$app);
- _this.wallManager = new WallManager(_this.$app);
- return _this;
- }
- _createClass(Model, [{
- key: "chunks",
- get: function get() {
- var chunks = [];
- this.floors.forEach(function (floor) {
- return chunks.push.apply(chunks, _toConsumableArray(floor.chunks));
- });
- return chunks;
- }
- }, {
- key: "getDrawedTexCount",
- value: function getDrawedTexCount() {
- return this.chunks.reduce(function (w, e) {
- var tex = e.material.uniforms.map.value;
- if (!tex) return w;
- return w + (tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0 ? Math.pow(tex.image.width / 512, 2) : 0);
- }, 0);
- }
- }, {
- key: "createTranControl",
- value: function createTranControl(player) {
- //初始化控件
- var options = {
- player,
- dontHideWhenFaceCamera: true,
- scaleAxis: ['x', 'y'],
- //隐藏了z轴。虽然参数没用上
- NoScaleZ: true //整体缩放时只缩放xy轴。
- };
- this.transformControls = new TransformControls(player.camera, player.domElement, options);
- this.transformControls.space = 'local';
- this.transformControls.setSize(1.2);
- this.add(this.transformControls);
- this.transformControls.visible = false; //------ for clip
- this.transformTool = new TransformationTool(player);
- this.add(this.transformTool);
- }
- }, {
- key: "updateVideoTexture",
- value: function updateVideoTexture(texture) {
- if (this.skybox) {
- this.skybox.material.uniforms.videoTexture.value = texture;
- }
- this.chunks.forEach(function (item) {
- item.materialInside.uniforms.videoTexture.value = texture;
- });
- this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
- tile.material.uniforms.videoTexture.value = texture;
- });
- }
- }, {
- key: "suspendVideoRender",
- value: function suspendVideoRender() {
- if (this.skybox) {
- this.skybox.material.uniforms.videoReady.value = 0;
- }
- this.chunks.forEach(function (item) {
- item.materialInside.uniforms.videoReady.value = 0;
- });
- this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
- tile.material.uniforms.videoReady.value = 0;
- });
- }
- }, {
- key: "resumeVideoRender",
- value: function resumeVideoRender() {
- if (this.skybox) {
- this.skybox.material.uniforms.videoReady.value = 1;
- this.skybox.material.uniforms.progress.value = 1;
- }
- this.chunks.forEach(function (item) {
- item.materialInside.uniforms.videoReady.value = 1;
- item.materialInside.uniforms.progress.value = 1;
- });
- this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
- tile.material.uniforms.videoReady.value = 1;
- tile.material.uniforms.progress.value = 1;
- });
- }
- /* updateVideoRenderParameters(parameters) {
- 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
- )
- if (parameters.cameraType == 8) {
- this.skybox.material.defines.HasVideo = 8 //8目
- } else if (parameters.cameraType == 2) {
- this.skybox.material.defines.HasVideo = 2 //2目
- } else if (parameters.cameraType == 3) {
- //转台双目
- this.skybox.material.defines.HasVideo = 3
- }
- this.skybox.material.defines.VideoMapping = parameters.mapping
- this.skybox.material.needsUpdate = true
- this.chunks.forEach(item => {
- item.materialInside.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
- )
- if (parameters.cameraType == 8) {
- item.materialInside.defines.HasVideo = 8 //8目
- } else if (parameters.cameraType == 2) {
- item.materialInside.defines.HasVideo = 2 //2目
- } else if (parameters.cameraType == 3) {
- //转台双目
- this.skybox.material.defines.HasVideo = 3
- }
- item.materialInside.defines.VideoMapping = parameters.mapping
- item.materialInside.needsUpdate = true
- })
- } */
- }, {
- key: "updateVideoRenderParameters",
- value: function updateVideoRenderParameters(parameters) {
- var mats = [this.skybox.material].concat(_toConsumableArray(this.chunks.map(function (e) {
- return e.materialInside;
- })));
- this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
- mats.push(tile.material);
- });
- mats.forEach(function (material) {
- 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);
- if (parameters.cameraType == 8) {
- material.defines.HasVideo = 8; //8目
- } else if (parameters.cameraType == 2) {
- material.defines.HasVideo = 2; //2目
- } else if (parameters.cameraType == 3) {
- //转台双目
- material.defines.HasVideo = 3;
- }
- material.defines.VideoMapping = parameters.mapping;
- material.needsUpdate = true;
- });
- }
- }, {
- key: "updateVrMarker",
- value: //更新vr的漂浮球位置
- function updateVrMarker(enable) {
- var _this6 = this;
- //enable代表vrEnable
- if (!this.player.currentPano.isAligned()) return; //在全景图里的话会先出来再updateVrMarker
- enable = enable == void 0 ? settings$3.vrEnabled : enable;
- if (enable) {
- for (var i in this.panos.index) {
- var pano = this.panos.index[i];
- if (pano.isAligned()) pano.marker.opacity = 0;
- }
- } else {
- this.fadePanoMarkers(null, null);
- }
- this.vrMarkers.forEach(function (v) {
- var visi = enable && _this6.player.currentPano.id != v.pano.id && !!_this6.player.currentPano.neighbourPanos[v.pano.id]; //!! 是防止undefined
- common$1.updateVisible(v, 'vr', visi);
- });
- }
- }, {
- key: "addHighMapCube",
- value: function addHighMapCube() {
- var _this7 = this;
- //创建8*8的tile cube
- var tileClass = this.$app.core.get('QualityManager').tileClass[0];
- if (tileClass >= 4 && this.$app.core.get('QualityManager').maxRenderTargetSize == 2048) {
- //this.$app.store.getValue('metadata').sceneResolution == 'tiles/4k'
- var geo = new THREE.PlaneGeometry(1, 1, 1, 1);
- var cube = new THREE.Object3D();
- cube.tiles = [];
- for (var cubeIndex = 0; cubeIndex < 6; cubeIndex++) {
- var face = new THREE.Object3D();
- for (var i = 0; i < 8; i++) {
- for (var j = 0; j < 8; j++) {
- var tile = new THREE.Mesh(geo, //new THREE.MeshBasicMaterial({ side: 2, depthTest: false, depthWrite: false }))
- new ModelTextureMaterial({
- side: THREE.DoubleSide,
- depthTest: false,
- //防止chunk比cube近从而被遮 且能不遮住box视频和viewlink等
- transparent: true,
- //遮蔽
- defines: {
- BasePanoMap: '' //普通贴图当做全景图
- }
- }));
- tile.material.uniforms.progress.value = 1;
- tile.material.uniforms.modelAlpha.value = 0;
- tile.position.set(i - 3.5, j - 3.5, -4);
- if (highMapAddColor) {
- tile.material.uniforms.opacity.value = 0.4;
- var colorHue = Math.random();
- tile.material.uniforms.baseColor.value = new THREE.Color().setHSL(colorHue, 0.8, 0.9);
- /* 0.5, 0.95) */
- /* tile.scoreLabel = new TextSprite( {
- backgroundColor: { r: 0, g: 0, b: 0, a: 0 },
- textColor: { r: 0, g: 0, b: 0, a: 1 },
- borderRadius: 15,
- renderOrder: 50, fontsize : 13,
- text: ''
- })
- tile.add(tile.scoreLabel) */
- }
- tile.visible = false;
- tile.tileX = i;
- tile.tileY = j;
- tile.cubeFace = cubeIndex;
- tile.renderOrder = RenderOrder.highTileCube;
- cube.tiles.push(tile);
- face.add(tile);
- }
- }
- switch (cubeIndex) {
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- face.rotation.set(0, Math.PI / 2, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- face.rotation.set(0, -Math.PI / 2, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
- var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2);
- face.quaternion.copy(rot1).multiply(rot2);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
- var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2);
- face.quaternion.copy(rot1).multiply(rot2);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- face.rotation.set(0, Math.PI, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- face.rotation.set(0, 0, 0);
- }
- face.scale.set(1, -1, 1);
- face.cubeFace = cubeIndex;
- cube.add(face);
- }
- cube.name = 'highMapCube';
- this.highMapCube = cube;
- this.add(cube);
- cube.scale.set(0.21, 0.21, 0.21); //camera.near is 0.1
- this.highMapCube.visible = false;
- this.highMapCube.texLoadedCount = 0;
- this.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
- if (_this7.highMapCube.visibleTiles) {
- _this7.updateTiles(); //逐步将visibleTiles加载完
- }
- if (_this7.player && _this7.player.lastFrameChanged) {
- //重新获取visibleTiles
- common$1.intervalTool.isWaiting('update4kTiles_' + _this7.$app.resource.num, function () {
- var vectorForward = _this7.player.getDirection();
- _this7.updateTiles(vectorForward);
- }, 500);
- }
- });
- }
- }
- /*
- highMapCube会遮住场景中所有物体, 如果一定要显示的话,只能类似potree中的那样渲染一个深度贴图出来(model无需贴图),然后其他所有物体的shader中都加入一段代码。(貌似本身已经支持了?)
- */
- }, {
- key: "isHighMapLoaded",
- value: function isHighMapLoaded(cubeFace, tileX, tileY) {
- var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
- return !!tile.material.uniforms.map.value;
- }
- }, {
- key: "updateTiles",
- value: function updateTiles(direction) {
- var _this8 = this;
- if (!this.highMapCube || !this.highMapCube.visible) return;
- if (this.highMapCube.tiles.filter(function (e) {
- return e.image;
- }).length <= 10) return; //加载的太少了
- //performance.mark('updateTiles-start')
- if (direction) {
- var camera = this.player.cameraControls.cameras.panorama;
- /* let hfov = cameraLight.getHFOVForCamera(camera, null, null, true) / 2
- let vfov = THREE.MathUtils.degToRad(camera.fov) / 2 */
- var frustumMatrix = new THREE.Matrix4();
- frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
- var frustum = new THREE.Frustum();
- frustum.setFromProjectionMatrix(frustumMatrix);
- new THREE.Vector3();
- var list = this.highMapCube.tiles;
- list.forEach(function (e) {
- //屏幕外的不显示
- var a = frustum.intersectsObject(e); //外包围球粗略判断
- if (a) {
- //显示所有在屏幕上有显示的tile
- e.score = 1;
- } else e.score = -100;
- if (e.score == -100) {
- _this8.resetTile(e);
- }
- });
- this.highMapCube.visibleTiles = list.filter(function (e) {
- return e.score > -100;
- }); //list.forEach(e=>e.scoreLabel.setText(e.scores))
- }
- var needRecover = this.highMapCube.visibleTiles.filter(function (e) {
- return !e.material.uniforms.map.value;
- });
- if (needRecover.length) {
- var maxCount = common$1.getBestCount({
- name: '4kmaxTileRecover',
- minCount: 0,
- maxCount: 2,
- durBound1: 1.5,
- durBound2: 6,
- ifLog: false,
- maxHistory: 2
- });
- var count = 0;
- needRecover.forEach(function (e, i) {
- //只更新若干个,因为太耗时了, 其余的等下帧更新
- if (count >= maxCount) return;
- var r = _this8.recoverTile(e);
- if (r) count++;
- });
- }
- /*if(recoverList.length == 0)this.highMapCube.restNeedRecover = []
- else{
- let maxCount = common.getBestCount({name:'4kmaxTileRecover', minCount : 0, maxCount : 2, durBound1 : 1.5, durBound2 : 6, ifLog:false, maxHistory:2 } )
- let count = 0,index = -1
- recoverList.forEach((e,i)=>{ //只更新若干个,因为太耗时了
- if(count>=maxCount)return
- let r = this.recoverTile(e)
- if(r) count ++
- index = i
- })
- this.highMapCube.restNeedRecover = recoverList.slice(index+1) //其余的等下帧更新
-
-
- }*/
- /* performance.mark('updateTiles-end')
- let measure = performance.measure('updateTiles', 'updateTiles-start', 'updateTiles-end')
- console.log('updateTiles', measure.duration.toFixed(3)) */
- }
- }, {
- key: "getHighImage",
- value: function getHighImage(image, cubeFace, tileX, tileY) {
- var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
- tile.image = image; //先记录下来
- }
- }, {
- key: "updateHighMap",
- value: function updateHighMap(image, cubeFace, tileX, tileY) {
- var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
- if (image) tile.image = image; //先记录下来
- var uniforms = tile.material.uniforms;
- if (uniforms.map.value) return;
- if (this.highMapCube.visibleTiles && !this.highMapCube.visibleTiles.includes(tile)
- /* this.highMapCube.texLoadedCount >= this.getMaxTileCount() */
- ) {
- return;
- } //简易创建贴图
- /* var tex = this.$app.core.get('SceneRenderer').initSizedTexture2D(512, THREE.ClampToEdgeWrapping)
- //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(tile.cubeFace, tile.tileX, tile.tileY)
- this.$app.core.get('SceneRenderer').uploadTexture2D(image, tex, 0, 0, 512, 512) //只替换tex对应的img,不新建
- */
- var tex = new THREE.Texture();
- tex.image = image;
- tex.flipY = false;
- tex.wrapS = tex.wrapT = THREE.ClampToEdgeWrapping;
- tex.generateMipmaps = false;
- tex.minFilter = THREE.LinearFilter;
- tex.needsUpdate = true;
- uniforms.map.value = tex;
- if (highMapAddColor) {
- uniforms.opacity.value = 1;
- }
- tile.visible = true;
- tile.material.needsUpdate = true; //发现每次开始放大但还未放大到4k时也会把之前加载过的4k加载
- //console.log('updateHighMap',cubeFace, tileX, tileY)
- }
- }, {
- key: "recoverTile",
- value: function recoverTile(tile) {
- if (tile.material.uniforms.map.value) return;
- if (tile.image) {
- this.updateHighMap(tile.image, tile.cubeFace, tile.tileX, tile.tileY);
- return true;
- }
- }
- }, {
- key: "resetTile",
- value: function resetTile(tile, kill) {
- if (kill) {
- //完全消灭
- tile.image = null;
- }
- var map = tile.material.uniforms.map.value;
- if (map) {
- map.dispose(); //这句执行了以后,h.__webglTexture一直就是undefined
- map.loaded = !1;
- map.version = 0; //保底再执行一下这个,类似app.sceneRenderer.deallocateCubeTexture(tile.material.map)
- var h = this.$app.core.get('SceneRenderer').renderer.properties.get(map); //console.log('__webglTexture',!!h.__webglTexture)
- this.$app.core.get('SceneRenderer').renderer.getContext().deleteTexture(h.__webglTexture);
- tile.material.uniforms.map.value = null;
- if (highMapAddColor) {
- tile.material.uniforms.opacity.value = 0.4;
- }
- tile.material.needsUpdate = true;
- tile.visible = false; //this.highMapCube.texLoadedCount --
- //console.log('resetTile'/* , tile.cubeFace, tile.tileX, tile.tileY */)
- }
- }
- }, {
- key: "resetHighMap",
- value: function resetHighMap() {
- var _this9 = this;
- if (!this.highMapCube) return;
- this.highMapCube.children.forEach(function (e) {
- return e.children.forEach(function (tile) {
- _this9.resetTile(tile, true);
- });
- }); //this.highMapCube.texLoadedCount = 0
- this.highMapCube.visibleTiles = null;
- this.hideHighMap(); //console.log('resetHighMap')
- }
- }, {
- key: "setHighMap",
- value: function setHighMap(pano) {
- if (!this.highMapCube) return;
- this.highMapCube.position.copy(pano.position);
- this.highMapCube.quaternion.copy(pano.quaternion);
- }
- }, {
- key: "showHighMap",
- value: function showHighMap() {
- if (!this.highMapCube) return;
- this.highMapCube.visible = true; //console.log('showHighMap')
- }
- }, {
- key: "hideHighMap",
- value: function hideHighMap() {
- if (!this.highMapCube) return;
- this.highMapCube.visible = false; //console.log('hideHighMap')
- } //缩小后继续显示cube呢还是不显示? 不显示的话,就要把cube上的复制到renderTarget上……会不会又崩溃,or没加载的显示???
- }, {
- key: "showLowestTile",
- value: function showLowestTile(isLowest) {
- // 只显示最低精度的瓦片
- if (this._3dTilesRuntime) {
- this._3dTilesRuntime.pauseTilesetUpdate(false); // 最低精度时,暂停_3dTilesRuntime的update
- var sceneRenderer = this.$app.core.get('SceneRenderer');
- sceneRenderer.autoUpdate3dTiles = !isLowest;
- sceneRenderer.autoUpdate3dTiles && sceneRenderer.update3dTiles({
- force: true
- }); // 立即更新一次相机位置
- this._3dTilesRuntime.limit2lowestDepth(isLowest); // 只显示最低瓦片精度
- this._3dTilesRuntime.ingoreVisibleCompute(isLowest); // 最低精度时,忽略瓦片是否在屏幕外
- this._3dTilesRuntime.pauseTilesetUpdate(isLowest);
- }
- }
- }, {
- key: "setModelDisplay",
- value: function setModelDisplay(show) {
- var _this10 = this;
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'force';
- var level = arguments.length > 2 ? arguments[2] : undefined;
- var type = arguments.length > 3 ? arguments[3] : undefined;
- //console.error('setModelDisplay', show, reason, level)
- var oldVisi = this.chunkDisplay.visible;
- common$1.updateVisible(this.chunkDisplay, reason, show, level, type);
- if (oldVisi != this.chunkDisplay.visible) {
- if (this._3dTilesRuntime) {
- this._3dTilesRuntime.getTileset().visible = this.chunkDisplay.visible;
- } else {
- this.chunks.forEach(function (e) {
- return common$1.updateVisible(e, reason, _this10.chunkDisplay.visible);
- });
- }
- }
- }
- }, {
- key: "showOnFloorplan",
- get: function get() {
- var showTexture = this.$app.store.getValue('metadata').controls.showTexture;
- return showTexture || showTexture == void 0; //默认展示
- }
- }]);
- return Model;
- }(THREE.Object3D)) || _class;
- /*
- note:
- 目前highMap 4k放大 是会遮住所有marker、viewLink等mesh的
- */
- 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); }; }
- 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; } }
- var View = /*#__PURE__*/function (_EventEmitter) {
- _inherits(View, _EventEmitter);
- var _super = _createSuper$1z(View);
- function View(e) {
- var _this;
- _classCallCheck(this, View);
- _this = _super.call(this);
- e = e || {};
- _this.position = new THREE.Vector3();
- _this.quaternion = new THREE.Quaternion();
- _this.update(e);
- return _this;
- }
- _createClass(View, [{
- key: "isValid",
- value: function isValid() {
- return !!this.cameraMode;
- }
- }, {
- key: "update",
- value: function update(e) {
- 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;
- }
- }]);
- return View;
- }(EventEmitter);
- 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); }; }
- 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; } }
- var Reticule = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(Reticule, _THREE$Mesh);
- var _super = _createSuper$1y(Reticule);
- function Reticule(player) {
- var _this;
- _classCallCheck(this, Reticule);
- _this = _super.call(this);
- var uniform = THREE.UniformsUtils.clone(shaders.waypoint.uniforms); //uniform.map.value = settings.blueReticule;
- uniform.map.value = common$1.loadTextureFromCache(texture.getImageURL('images/blueReticle.png'));
- uniform.map.value.minFilter = THREE.LinearMipMapLinearFilter;
- uniform.map.value.anisotropy = 4;
- uniform.opacity.value = 0; //uniform.color.value.set(settings.reticuleColor)
- _this = _super.call(this, new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1), new THREE.RawShaderMaterial({
- side: THREE.DoubleSide,
- depthWrite: !1,
- depthTest: !1,
- transparent: !0,
- vertexShader: shaders.waypoint.vertexShader,
- fragmentShader: shaders.waypoint.fragmentShader,
- uniforms: uniform,
- name: 'waypoint',
- opacity: 0
- }));
- _this.layers.set(RenderLayers.RETICULE);
- _this.renderOrder = RenderOrder.reticule;
- _this.player = player;
- _this.direction = new THREE.Vector3();
- _this.hidden = !0;
- _this.mouseLastMoveTime = Date.now(); //this.alwaysShow = true //for test
- return _this;
- }
- _createClass(Reticule, [{
- key: "move",
- value: function move(e, t, i) {
- this.hidden = i, this.mouseLastMoveTime = Date.now();
- }
- }, {
- key: "hide",
- value: function hide() {
- this.hidden || (this.hidden = !0, transitions$1.start(lerp.property(this.material.uniforms.opacity, 'value', 0), settings$3.reticuleOpacityTransitionTime));
- }
- }, {
- key: "show",
- value: function show() {
- 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);
- }
- }, {
- key: "update",
- value: function update() {
- Date.now() - this.mouseLastMoveTime > settings$3.hideReticuleTimeout && !this.hidden && this.hide();
- }
- }, {
- key: "updatePosition",
- value: function updatePosition(e, t) {
- var _t$face;
- if (!this.hidden && t !== null && t !== void 0 && (_t$face = t.face) !== null && _t$face !== void 0 && _t$face.normal) {
- if (!t) return this.hide();
- var i = t.point,
- n = e.distanceTo(i),
- r = 1 + 0.01 * n;
- n < 1 && (r -= 1 - n), this.show();
- this.scale.set(r, r, r);
- this.direction = this.direction.multiplyScalar(0.8);
- this.direction.add(t.face.normal.clone().multiplyScalar(0.2));
- this.position.copy(i).add(t.face.normal.clone().multiplyScalar(0.01));
- this.lookAt(this.position.clone().add(this.direction));
- }
- }
- }]);
- return Reticule;
- }(THREE.Mesh);
- var ControlEvents = {
- Move: 'move',
- InteractionDirect: 'interaction.direct',
- InteractionKey: 'interaction.key',
- InteractionGui: 'interaction.gui',
- FlyInDirection: 'fly.direction',
- InputStart: 'input.start',
- Pinch: 'input.pinch',
- Scroll: 'input.scroll',
- AutoPanInterrupt: 'autopan.interrupt',
- AutoPanComplete: 'autopan.complete',
- AutoPanClamped: 'autopan.clamped',
- LongTap: 'longtap'
- };
- var DownloadStatus = Object.freeze({
- None: 0,
- Queued: 1,
- ForceQueued: 2,
- Downloading: 3,
- Downloaded: 4,
- DownloadFailed: 5
- });
- var h$1 = Object.freeze({
- None: 0,
- DirectionalFOV: 1
- });
- var u$1 = function () {
- var e = function e(t, i) {
- var n = e._panoSpaceDir,
- r = e._fovThreshold,
- o = e._fovThresholdNarrow,
- a = Math.max(Math.min(n.dot(t.direction), 1), -1),
- s = Math.max(Math.min(n.dot(i.direction), 1), -1);
- 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);
- };
- return e._panoSpaceDir = new THREE.Vector3(), e._fovThreshold = -1, e._fovThresholdNarrow = -1, e;
- }();
- var TilePrioritizer = /*#__PURE__*/function () {
- function TilePrioritizer(_e, _t, _i, _o, _a) {
- _classCallCheck(this, TilePrioritizer);
- this.filterAndPrioritize = function () {
- var e = [],
- t = [],
- i = [];
- return function (r, o, a) {
- var maxCount = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
- //判断哪些临近点要加载512,以及当前点的哪些tile要加载
- //console.log('filterAndPrioritize', this.priorityCriteria.pano.model.sid)
- if (this.priorityCriteria.pano.panoType != '360view') {
- //view没有相邻(如果加上了visibleView, 使用upcomingPanos)
- this.populateNeighborPanos(this.priorityCriteria.pano, o, e);
- this.populateScoredPanos(this.priorityCriteria.pano, o, t, this.priorityCriteria.cameraDir, TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER);
- }
- var s = this.baseSize,
- //512
- l = this.standardSize,
- //1024
- c = this.highSize,
- //2048
- h = this.ultraHighSize; //4096
- this.queueTilesForPano(r, a, this.priorityCriteria.pano, s);
- if (this.priorityCriteria.upcomingPanos) {
- //512
- this.queueTilesForPanos(r, this.priorityCriteria.upcomingPanos, a, s, TilePrioritizer.MAX_UPCOMING_PANOS_TOADD);
- } //把当前pano角度范围内的tile按照分辨率从低到高加入队列
- {
- //1024
- i.length = 0;
- if (this.canDownloadSize(l) && r.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
- }
- TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
- TilePrioritizer.appendQueue(r, i); //i->r
- } //添加邻近点t 512的tiles
- this.queueTilesForPanos(r, t, a, s, TilePrioritizer.MAX_SCORED_PANOS_TOADD);
- i.length = 0;
- if (r.length < maxCount) {
- //120deg
- //2048
- if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
- } //4096
- if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
- }
- TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
- TilePrioritizer.appendQueue(r, i);
- i.length = 0;
- }
- if (r.length < maxCount) {
- //180deg
- if (this.canDownloadSize(l) && r.length + i.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
- }
- if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
- }
- if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
- this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
- }
- TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
- TilePrioritizer.appendQueue(r, i);
- } //r.length && console.log(r.map(e=>e.pano.id + '-' + e.panoSize))
- this.queueTilesForPanos(r, e, a, s);
- };
- }();
- this.queueTilesForPano = function () {
- var e = {
- filter: h$1.None
- };
- return function (t, i, n, r) {
- if (!n.tiled) return; //xzw add
- return this.filterAndQueueTileDownloadDescriptors(t, i, n, r, e);
- };
- }();
- this.queueTilesForPanosInDirection = function () {
- var e = new THREE.Vector3();
- return function (t, i, n, r, o, a, s, l) {
- for (var h = 0, u = 0; u < n.length; u++) {
- var d = n[u];
- e.copy(d.position), e.sub(o), e.normalize();
- var p = Math.max(Math.min(a.dot(e), 1), -1),
- f = c.getFOVDotThreshold(s);
- if (p >= f) {
- var g = this.queueTilesInDirectionForPano(t, i, d, r, o, a, s);
- if (h += g > 0 ? 1 : 0, l && h >= l) break;
- }
- }
- return h;
- };
- }();
- this.queueTilesInDirectionForPano = function () {
- var e = {
- filter: h$1.DirectionalFOV,
- direction: new THREE.Vector3(),
- fov: 60
- },
- t = new THREE.Vector3();
- return function (i, n, r, o, a, s, c) {
- if (!r.tiled) return; //xzw add
- t.copy(s);
- TileUtils.getRelativeDirection(r.quaternion, t);
- e.direction.copy(t);
- e.fov = c;
- return this.filterAndQueueTileDownloadDescriptors(i, n, r, o, e);
- };
- }();
- this.filterAndQueueTileDownloadDescriptors = function () {
- var e = [];
- return function (t, i, n, r, o) {
- var a = i.getTileDownloadDescriptors(n, r);
- e.length = 0, this.filterTileDownloadDescriptors(n, a, e, o);
- for (var s = 0, l = 0; l < e.length; l++) {
- var c = e[l];
- if (c) {
- t.push(c);
- s++;
- }
- }
- return s;
- };
- }();
- this.filterTileDownloadDescriptors = function () {
- new THREE.Vector3();
- return function (e, t, i, n) {
- var r, o;
- switch (n.filter) {
- case h$1.DirectionalFOV:
- for (r = 0; r < t.length; r++) {
- o = t[r], TileUtils.isTileWithinFOV(o.panoSize, o.tileSize, o.face, o.tileX, o.tileY, n.direction, n.fov) && i.push(o);
- }
- break;
- default:
- for (r = 0; r < t.length; r++) {
- o = t[r], i.push(o);
- }
- }
- for (r = 0; r < i.length; r++) {
- o = i[r], this.canIncludeDescriptor(o) || (i[r] = null);
- }
- };
- }();
- this.qualityManager = _e;
- this.maxNavQuality = this.qualityManager.getMaxNavPanoSize();
- this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
- this.baseSize = _t;
- this.standardSize = _i;
- this.highSize = _o;
- this.ultraHighSize = _a;
- this.priorityCriteria = new TilePrioritizer.PriorityCriteria(null, new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 0, -1));
- }
- _createClass(TilePrioritizer, [{
- key: "updateCriteria",
- value: function updateCriteria(pano, t, i, n) {
- this.priorityCriteria.pano = pano;
- this.priorityCriteria.cameraPosition.copy(t);
- this.priorityCriteria.cameraDir.copy(i);
- this.priorityCriteria.upcomingPanos = n;
- this.maxNavQuality = this.qualityManager.limitQuality && pano.curTileQuality ? pano.curTileQuality : this.qualityManager.getMaxNavPanoSize(); //xzw : quality 表示在漫游过程中手机端先只加载低质量,静止片刻后再加载2k
- this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
- }
- }, {
- key: "canDownloadSize",
- value: function canDownloadSize(e) {
- return this.maxNavQuality >= e || this.maxZoomQuality >= e && this.zoomingActive;
- }
- }, {
- key: "populateNeighborPanos",
- value: function populateNeighborPanos(e, t, i) {
- i = i || [], i.length = 0;
- var n = t.getNeighbours(e);
- for (var r in n) {
- if (n.hasOwnProperty(r)) {
- var o = t.get(r);
- i.push(o);
- }
- }
- return i;
- }
- }, {
- key: "populateScoredPanos",
- value: function populateScoredPanos(e, t, i, r, a) {
- i = i || [], i.length = 0;
- var s = [Panorama.filters.inPanoDirection(e.position, r, TilePrioritizer.DIRECTION_SCORE_STRICTNESS), Panorama.filters.not(e)],
- l = [Panorama.scoreFunctions.distanceSquared(e), Panorama.scoreFunctions.direction(e.position, r)],
- c = common$1.sortByScore(t.list, s, l);
- if (c) for (var h = 0; h < c.length && h < a; h++) {
- var u = c[h].item;
- i.push(u);
- }
- return i;
- }
- }, {
- key: "queueTilesForPanos",
- value: function queueTilesForPanos(e, t, i, n, r) {
- for (var o = 0, a = 0; a < t.length; a++) {
- var s = t[a],
- l = this.queueTilesForPano(e, i, s, n);
- if (o += l > 0 ? 1 : 0, r && o >= r) break;
- }
- return o;
- }
- }, {
- key: "queueTilesInDirectionForPanos",
- value: function queueTilesInDirectionForPanos(e, t, i, n, r, o, a, s) {
- for (var l = 0, c = 0; c < i.length; c++) {
- var h = i[c],
- u = this.queueTilesInDirectionForPano(e, t, h, n, o, a);
- if (l += u > 0 ? 1 : 0, s && l >= s) break;
- }
- return l;
- }
- }, {
- key: "canIncludeDescriptor",
- value: function canIncludeDescriptor(e) {
- return e.status !== DownloadStatus.Downloading && e.status !== DownloadStatus.Downloaded;
- }
- }, {
- key: "canIncludePano",
- value: function canIncludePano(e, t) {
- return !e.isLoaded(t);
- }
- }, {
- key: "setZoomingActive",
- value: function setZoomingActive(e) {
- e !== this.zoomingActive && (this.zoomingActive = e);
- }
- }], [{
- key: "PriorityCriteria",
- value: function PriorityCriteria(e, t, i, n, o) {
- this.pano = e;
- this.cameraPosition = new THREE.Vector3().copy(t);
- this.cameraDir = new THREE.Vector3().copy(i);
- this.panoSpaceDir = new THREE.Vector3().copy(n);
- this.upcomingPanos = o;
- this.copy = function (e) {
- this.pano = e.pano;
- this.cameraPosition.copy(e.cameraPosition);
- this.cameraDir.copy(e.cameraDir);
- this.panoSpaceDir.copy(e.panoSpaceDir);
- this.upcomingPanos = o;
- }, this.zoomingActive = !1;
- }
- }, {
- key: "appendQueue",
- value: function appendQueue(e, t) {
- if (e && t) for (var i = 0; i < t.length; i++) {
- e.push(t[i]);
- }
- }
- }, {
- key: "getFOVDotThreshold",
- value: function getFOVDotThreshold(e) {
- return Math.cos(THREE.MathUtils.degToRad(e / 2));
- }
- }, {
- key: "sortPanoTiles",
- value: function sortPanoTiles(e, t, i) {
- 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);
- }
- }, {
- key: "insertSortedPanoTile",
- value: function insertSortedPanoTile(e, t, i, r) {
- 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);
- for (var o = -1, a = 0; a < e.length; a++) {
- var s = u$1(t, e[a]);
- if (s <= 0) {
- o = a;
- break;
- }
- }
- if (o === -1) e[e.length] = t;else {
- for (var h = e.length; h > o; h--) {
- e[h] = e[h - 1];
- }
- e[o] = t;
- }
- }
- }]);
- return TilePrioritizer;
- }();
- TilePrioritizer.DIRECTIONAL_FOV = 180;
- TilePrioritizer.DIRECTIONAL_FOV_NARROW = 120;
- TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER = 6;
- TilePrioritizer.MAX_SCORED_PANOS_TOADD = 2;
- TilePrioritizer.MAX_UPCOMING_PANOS_TOADD = 3;
- TilePrioritizer.DIRECTION_SCORE_STRICTNESS = 0.75;
- var Keys = {
- ZERO: 48,
- ONE: 49,
- TWO: 50,
- THREE: 51,
- FOUR: 52,
- FIVE: 53,
- SIX: 54,
- SEVEN: 55,
- EIGHT: 56,
- NINE: 57,
- LEFTARROW: 37,
- UPARROW: 38,
- RIGHTARROW: 39,
- DOWNARROW: 40,
- A: 65,
- B: 66,
- C: 67,
- D: 68,
- E: 69,
- F: 70,
- G: 71,
- H: 72,
- I: 73,
- J: 74,
- K: 75,
- L: 76,
- M: 77,
- N: 78,
- O: 79,
- P: 80,
- Q: 81,
- R: 82,
- S: 83,
- T: 84,
- U: 85,
- V: 86,
- W: 87,
- X: 88,
- Y: 89,
- Z: 90,
- SPACE: 32,
- RETURN: 13,
- SEMICOLON: 186,
- PLUSEQUALS: 187,
- DASHUNDERSCORE: 189,
- OPENBRACKET: 219
- };
- if (browser$1.detectFirefox()) {
- Keys.SEMICOLON = 59;
- Keys.PLUSEQUALS = 61;
- Keys.DASHUNDERSCORE = 173;
- }
- var ModelManagerEvents = {
- ModelAdded: 'model-added',
- ActiveModelChanged: 'active-model-changed'
- };
- 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); }; }
- 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; } }
- var Snapshot = /*#__PURE__*/function (_View) {
- _inherits(Snapshot, _View);
- var _super = _createSuper$1x(Snapshot);
- function Snapshot(objectSet) {
- var _this;
- _classCallCheck(this, Snapshot);
- _this = _super.call(this, objectSet);
- _this.panoId = objectSet.panoId;
- _this.orthoZoom = objectSet.orthoZoom;
- _this.floorVisibility = objectSet.floorVisibility;
- _this.thumbUrl = objectSet.thumbUrl;
- _this.name = objectSet.name;
- return _this;
- }
- _createClass(Snapshot, [{
- key: "isPano",
- value: function isPano() {
- return this.panoId && '' !== this.panoId;
- }
- }]);
- return Snapshot;
- }(View);
- //导览时路径上出现的mesh 现在只用到了currentPanoMarker
- var ShowPath = /*#__PURE__*/function () {
- function ShowPath(director, player, controls) {
- _classCallCheck(this, ShowPath);
- this.flightStepWalk = function (e, t, i) {
- var n = 0.001,
- o = 1,
- a = 1.2,
- s = new THREE.Vector3(),
- h = new THREE.Vector3(),
- u = function u(e, t) {
- var i = Math.min(this.player.position.distanceTo(e.position), settings$3.transition.flytimeMaxDistanceThreshold),
- r = i * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
- h.copy(Vectors$1.FORWARD), this.player.getDirection(h), s.copy(t).sub(e.position).normalize();
- var l = s.dot(h),
- u = Math.acos(l),
- d = u / r;
- return d > n && (r *= d / n, u < o && (r *= a)), r;
- };
- return function (e, t, i) {
- 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) {
- var n = {
- pano: e,
- lookAtPoint: t,
- duration: null,
- maxDistanceOverride: settings$3.warp.walkMaxDist,
- skipWarpingCheck: !1,
- constantMoveSpeed: !0
- };
- n.duration = u.call(this, e, t), this.player.nonInterruptingFlyToPano(n, i);
- } else i && i();
- };
- }();
- this.warpTravel_WALK = function () {
- var e = [];
- return function (t) {
- var i = this.player.model.panos;
- e.length = 0;
- for (var n = null, o = !1, a = 0; a < this.nodes.length; a++) {
- var s = this.nodes[a],
- l = i.get(s);
- a === this.nodes.length - 1;
- o = n && l.position.distanceTo(n.position) < settings$3.warp.walkMinDist, n && o || (e.push(s), n = l);
- }
- o && this.nodes.length > 1 && (e[e.length - 1] = this.nodes[this.nodes.length - 1]);
- var h = e.length,
- u = i.get(e[h - 1]),
- d = new Array(h + 1);
- d[d.length - 1] = function () {
- t && t();
- }.bind(this);
- for (var p = h - 1, f = d.length - 1; f > 0; f -= 1) {
- var g = e[p];
- u = i.get(g);
- var m = new THREE.Vector3();
- this.getLookAtForWalkingTourNode(e, p, m), d[f - 1] = this.makeWalkFlightFunc(u, m, d[f]), p--;
- }
- d[0]();
- };
- }();
- this.getLookAtForWalkingTourNode = function () {
- var e = new THREE.Vector3(),
- t = new THREE.Vector3(),
- i = new THREE.Vector3(),
- n = new THREE.Vector3(),
- o = new THREE.Vector3(),
- a = 0.65,
- s = 0.75,
- l = 0.2,
- c = 0.4,
- h = 0.2,
- u = 3;
- return function (r, d, p) {
- var f = r.length;
- if (d >= f) return !1;
- var g = 1,
- m = 1;
- t.set(0, 0, 0), o.set(0, 0, 0);
- for (var v = null, A = d; A < d + u && !(A >= f); A++) {
- if (v = this.player.model.panos.get(r[A]), this.getOrientationForWalkingTourNode(r, A, i), A === d && e.copy(i), n.copy(i), A > d) {
- var y = n.dot(e) < a;
- g *= y ? l : s, m *= y ? h : c;
- }
- i.multiplyScalar(g), t.add(i), o.lerp(v.position, m);
- }
- return t.normalize(), p.copy(o), p.add(t), !0;
- };
- }();
- 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;
- this.pathImg = {};
- this.brushPrefs = {
- linewidth: 7,
- strokeWidth: 15,
- cvSegments: 48,
- paveStep: 0.1,
- paveWidth: 0.2,
- lookBlendDist: 3,
- maxTurn: THREE.MathUtils.degToRad(2)
- };
- this.hintPrefs = {
- rad: 0.18,
- width: 0.0125,
- depth: 0.0625,
- setBack: -0.04,
- markRad: 0.25,
- markInnerRad: 0.16
- };
- this.init();
- }
- _createClass(ShowPath, [{
- key: "init",
- value: function init() {
- //this.pathImg.path = common.loadTextureFromCache(config.path);//没用到
- this.pathImg.pathEnd = common$1.loadTextureFromCache(texture.getImageURL('images/pathEnd.png')); //this.pathImg.pathStart = common.loadTextureFromCache(config.pathStart);//没用到
- }
- }, {
- key: "setScene",
- value: function setScene(scene) {
- this.createCpm(scene); //this.createBunnyObj(scene);
- }
- }, {
- key: "updateModel",
- value: function updateModel() {
- this.model = this.modelManager.getActiveModel();
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- this.modelManager.on(ModelManagerEvents.ActiveModelChanged, this.updateModel.bind(this));
- }
- }, {
- key: "pointPathDistance",
- value: function pointPathDistance(points) {
- for (var distance = 0, i = 1; i < points.length; i += 1) {
- distance += points[i - 1].distanceTo(points[i]);
- }
- return distance;
- }
- }, {
- key: "pointPathLengths",
- value: function pointPathLengths(points) {
- for (var t = [0], i = 1; i < points.length; i += 1) {
- t.push(t[i - 1] + points[i - 1].distanceTo(points[i]));
- }
- return t;
- }
- }, {
- key: "interpAlongPath",
- value: function interpAlongPath(e, t, i) {
- var n,
- o = new THREE.Vector3(),
- a = t[t.length - 1];
- if (i < 1) {
- n = i * a;
- for (var s = 1; s < t.length; s += 1) {
- if (t[s] > n) {
- var l = (n - t[s - 1]) / (t[s] - t[s - 1]);
- return o.copy(e[s]), o.sub(e[s - 1]), o.multiplyScalar(l), o.add(e[s - 1]), o;
- }
- }
- } else o.copy(e[e.length - 1]);
- return o;
- }
- }, {
- key: "pathHeight",
- value: function pathHeight() {
- return settings$3.path.height; //this.player.mode !== ViewMode.FLOORPLAN ? settings.path.height : settings.path.outsideHeight
- //outsideHeight为0.5, 导致floorplan->dollhouse下升高很多 ( 原版也是 )
- }
- }, {
- key: "createBunnyObj",
- value: function createBunnyObj(e) {
- 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);
- }
- }, {
- key: "createCpm",
- value: function createCpm(e) {
- if (!this.currentPanoMarker) {
- var t = this.makeWaypointObj(this.pathImg.pathEnd, 'Current');
- t.material.uniforms.opacity.value = 0, this.currentPanoMarker = {
- mesh: t,
- placed: !1
- };
- }
- this.currentPanoMarker.mesh.parent && this.currentPanoMarker.mesh.parent.remove(this.currentPanoMarker.mesh), this.placeCpm(), this.currentPanoMarker.mesh.parent || e.add(this.currentPanoMarker.mesh);
- }
- }, {
- key: "placeCpm",
- value: function placeCpm() {
- if (settings$3.path.mapGuides && this.player.currentPano && this.player.currentPano.isAligned()) {
- var e = this.player.currentPano.floor;
- 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);
- /*
- if(edit && publicObjectSet.editor.mainDesign.editing){//如果底部高度不一致 另说
- var mainDesign = publicObjectSet.editor.mainDesign;
- mainDesign.atRoom && this.currentPanoMarker.mesh.position.setY(mainDesign.rooms[mainDesign.atRoom].bottom);
- }
- */
- this.currentPanoMarker.mesh.position.y += this.pathHeight();
- this.currentPanoMarker.placed = !0;
- } else {
- this.popOutCpm();
- }
- }
- }, {
- key: "fadeInCpm",
- value: function fadeInCpm(e) {
- 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);
- }
- }, {
- key: "fadeOutCpm",
- value: function fadeOutCpm(e) {
- transitions$1.start(lerp.property(this.currentPanoMarker.mesh.material.uniforms.opacity, 'value', 0), e);
- }
- }, {
- key: "popInCpm",
- value: function popInCpm() {
- settings$3.path.mapGuides && this.currentPanoMarker.placed && this.fadeInCpm(2);
- }
- }, {
- key: "popOutCpm",
- value: function popOutCpm() {
- this.fadeOutCpm(2);
- }
- /* panoPathDistance(e){
- var t = this.model.panos;
- if (!e || e.length < 2)
- return 0;
- for (var i = [], n = 0; n < e.length; n += 1)
- i.push(t.get(e[n]).floorPosition);
- return this.pointPathDistance(i)
- }
- loadTileTexture(e){
- var t = texture.load(e, function(t) {
- t.wrapS = THREE.RepeatWrapping,
- t.wrapT = THREE.RepeatWrapping,
- t.needsUpdate = !0,
- logger.debug('path texture "' + e + '" is ready')
- }, function() {
- logger.error('path texture "' + e + '" failed')
- });
- return t.mapping = THREE.UVMapping,
- t
- } */
- }, {
- key: "buildWarpDestinationDescriptor",
- value: function buildWarpDestinationDescriptor(e, t, i, n, r, o) {
- var a = {
- cameraMode: n,
- position: e,
- quaternion: t,
- panoId: i,
- orthoZoom: o,
- floorVisibility: r,
- thumbUrl: null,
- name: null
- };
- return new Snapshot(a);
- }
- }, {
- key: "buildWarpDestinationDescriptorFromHero",
- value: function buildWarpDestinationDescriptorFromHero(e) {
- return this.buildWarpDestinationDescriptor(e.position, e.quaternion, this.getHeroId(e), e.cameraMode, e.floorVisibility, e.orthoZoom);
- }
- }, {
- key: "setWarpDestination",
- value: function setWarpDestination(e) {
- this.warpDestHeroLoc = e;
- }
- }, {
- key: "setWarpDestinationByHeroIndex",
- value: function setWarpDestinationByHeroIndex(e) {
- var t = this.getHeroDescriptorByHeroIndex(e);
- return null !== t && (this.setWarpDestination(t), !0);
- }
- }, {
- key: "setWarpDestinationByPano",
- value: function setWarpDestinationByPano(e, t) {
- var i = this.model.panos.get(e.id);
- return !!i && this.setWarpDestinationByPanoId(e.id, t);
- }
- }, {
- key: "setWarpDestinationByPanoId",
- value: function setWarpDestinationByPanoId(e, t) {
- var i = this.model.panos.get(e);
- if (i) {
- t = t || new THREE.Quaternion();
- var n = this.buildWarpDestinationDescriptor(i.position, t, i.id, 'panorama', [], -1);
- return this.setWarpDestination(n), !0;
- }
- return !1;
- }
- }, {
- key: "getHeroDescriptorByHeroIndex",
- value: function getHeroDescriptorByHeroIndex(e) {
- var t = objects.play.heroCount();
- if (null !== this.warpDestHeroLoc && t < 2) return logger$1.info('ShowPath.getHeroDescriptorByHeroIndex() -> Only one hero location is available.'), this.model.getHeroDescriptorByIndex(0);
- var hero = this.model.getHeroDescriptorByIndex(e);
- hero = util.getPlayDataItem(e);
- var playData = objects.store.getters['guide/plays'];
- if (playData[e].type == 1) {
- hero = util.getPlayDataItem(e, 0);
- }
- var obj = util.convertHighlight(hero);
- var i = new Snapshot(obj);
- if (i) {
- var n = i.isPano() ? i.panoId : i.cameraMode;
- logger$1.debug('ShowPath.getHeroDescriptorByHeroIndex() -> New brush/warp destination: "' + n + '" out of ' + t + ' choices.');
- }
- return i;
- }
- }, {
- key: "getHeroDescriptorByPano",
- value: function getHeroDescriptorByPano(e) {
- var t = this.model.panos.get(e.id);
- return t ? this.getHeroDescriptorByPanoId(e.id) : null;
- }
- }, {
- key: "getHeroDescriptorByPanoId",
- value: function getHeroDescriptorByPanoId(e) {
- var t = this.getHeroIndexFromPanoId(e);
- return this.getHeroDescriptorByHeroIndex(t);
- }
- }, {
- key: "getHeroIndexFromPanoId",
- value: function getHeroIndexFromPanoId(e) {
- for (var t = 0; t < this.model.heroLocations.length; t++) {
- var i = this.model.heroLocations[t],
- n = this.getHeroId(i);
- if (n && n === e) return t;
- }
- return -1;
- }
- }, {
- key: "getHeroPano",
- value: function getHeroPano(e) {
- if (null === e) return logger$1.warn('getHeroPano(): no destination'), null;
- var t = this.getHeroId(e),
- i = this.model.panos.get(t);
- return void 0 === i && (i = null, '' !== t && logger$1.debug('unable to find pano "' + t + '"')), i;
- }
- }, {
- key: "getHeroId",
- value: function getHeroId(e) {
- return e.panoId;
- }
- }, {
- key: "setWarpDestPano",
- value: function setWarpDestPano() {
- return this.warpDestPano = this.getHeroPano(this.warpDestHeroLoc), this.warpDestPano;
- }
- /* brushToWarpPano(e,t){
- if (this.discardPathObject(),
- !this.setWarpDestPano())
- return !1;
- if (this.warpDestHeroLoc.cameraMode !== ViewMode.PANORAMA && logger.warn("Can only brush from pano to pano"),
- !this.warpDestPano)
- return logger.info("No brush"),
- !1;
- if (!this.player.currentPano)
- return logger.debug("No current pano, visibility undefined"),
- !1;
- if (!this.warpDestPano)
- return logger.info("No wPano, visibility undefined"),
- !1;
- if (!this.warpDestPano.isAligned())
- return logger.debug("Cannot brush to unaligned pano"),
- !1;
- var i = (e === WarpStyle.STD || e === WarpStyle.WALK) && settings.path.mapGuides
- , n = !0;
- if (this.player.currentPano.id === this.warpDestPano.id)
- logger.debug("Already at destination pano");
- else {
- this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano),
- n = void 0 === this.nodes || null === this.nodes || this.nodes.length < 1,
- this.obj3d = new THREE.Object3D,
- logger.debug('Brushing from "' + this.player.currentPano.id + '" to "' + this.warpDestPano.id + '" (' + (this.nodes ? this.nodes.length : 0) + ")"),
- n ? (logger.info('No "walkable" route, using fall-back warp style transition'),
- e = t) : (this.setPathHulls(this.nodes),
- this.setFloorCurves(),
- 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)))),
- this.player.currentPano.floor.add(this.obj3d);
- var o = this.player.mode === ViewMode.DOLLHOUSE || this.player.mode === ViewMode.FLOORPLAN
- , s = e === WarpStyle.STD;
- if (!n && (i || s)) {
- if (o) {
- var h = this.makeStartMarker(this.floorHull[0], this.floorCurvePoints);
- this.obj3d.add(h)
- }
- var u = this.makeEndMarker(this.floorHull[this.floorHull.length - 1]);
- this.obj3d.add(u)
- }
- this.appearSlow()
- }
- return this.upcomingTransType = e,
- !n
- } */
- }, {
- key: "findShortestPath",
- value: function findShortestPath(e, t) {
- if (!e || !t) return null;
- var i = settings$3.warp.walkExtraPanosDistance,
- n = e.id + ':' + t.id + ':' + i;
- if (this.shortPaths.hasOwnProperty(n)) return this.shortPaths[n] ? this.shortPaths[n].slice() : null;
- var r = t.id + ':' + e.id + ':' + i;
- if (this.shortPaths.hasOwnProperty(r)) return this.shortPaths[r] ? this.shortPaths[r].slice().reverse() : null;
- var o = this.model.panos.aStarSearch(e, t);
- return this.model.panos.includeNodesNearPath(o, i), this.shortPaths[n] = o ? o.slice() : null, o;
- }
- }, {
- key: "makePathHulls",
- value: function makePathHulls(e) {
- var t,
- i,
- n,
- r,
- o,
- a = 0,
- s = [],
- l = [],
- h = [],
- u = this.model.panos;
- t = u.get(e[0]), r = t.floor.floorIndex;
- for (var d = 0; d < e.length; d += 1) {
- 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));
- }
- return a > this.longestStep && (this.longestStep = a, logger$1.debug('path contains ' + a + ' meter segment')), {
- floor: s,
- camera: l,
- color: h
- };
- }
- }, {
- key: "makeFloorCurves",
- value: function makeFloorCurves(points, colors, i) {
- var radius = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
- distance = this.pointPathDistance(points) - 2 * radius,
- s = points.slice(0),
- l = s[1].clone().sub(s[0]);
- 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);
- var h = new THREE.CatmullRomCurve3(s),
- u = Math.floor(distance / i);
- u = 4 * Math.floor(u / 4), u = Math.max(4, u);
- for (var d, p, f, g = h.getSpacedPoints(u), m = [], v = new THREE.Vector3(), A = 0; A < g.length; A += 1) {
- f = 0, d = g[A].distanceTo(points[0]);
- for (var y = 1; y < points.length; y += 1) {
- v.copy(g[A]).sub(points[y]), v.y *= 4, p = v.length(), p < d && (f = y);
- }
- m.push(colors[f]);
- }
- return {
- distance: distance,
- points: g,
- colors: m
- };
- }
- }, {
- key: "makeCameraCurvePoints",
- value: function makeCameraCurvePoints(points, t) {
- var distance = this.pointPathDistance(points),
- n = new THREE.CatmullRomCurve3(points);
- return n.getSpacedPoints(Math.max(2, Math.floor(distance / t)));
- }
- }, {
- key: "setPathHulls",
- value: function setPathHulls(e) {
- var t = this.makePathHulls(e);
- this.floorHull = t.floor, this.cameraHull = t.camera, this.colorHull = t.color;
- }
- }, {
- key: "setFloorCurves",
- value: function setFloorCurves() {
- var e = this.makeFloorCurves(this.floorHull, this.colorHull, this.brushPrefs.paveStep);
- this.floorPathDistance = e.distance, this.floorCurvePoints = e.points, this.floorCurveColors = e.colors;
- }
- }, {
- key: "setCameraCurvePoints",
- value: function setCameraCurvePoints() {
- this.camCurvePoints = this.makeCameraCurvePoints(this.cameraHull, settings$3.warp.stepFactor * this.brushPrefs.paveStep);
- }
- }, {
- key: "chooseWarpPath",
- value: function chooseWarpPath(e) {
- var t,
- i,
- n,
- o = this.playerControls.cameras[Viewmode$1.PANORAMA];
- if (this.player.currentPano === this.warpDestPano || !e) {
- this.warpPathPoints = null;
- this.warpLength = 0;
- return !1;
- }
- this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano);
- this.setPathHulls(this.nodes);
- if (void 0 === this.nodes || null === this.nodes || this.nodes.length < 1) {
- logger$1.debug('warp path to unreachable node');
- t = this.warpDestPano.position.clone().sub(o.position);
- i = t.clone().negate();
- t.multiplyScalar(0.15).add(o.position);
- i.multiplyScalar(0.15).add(this.warpDestPano.position);
- t.y = o.position.y;
- i.y = this.warpDestPano.position.y;
- n = new THREE.CubicBezierCurve3(o.position.clone(), t, i, this.warpDestPano.position.clone());
- this.warpPathPoints = n.getSpacedPoints(this.brushPrefs.cvSegments);
- } else {
- logger$1.debug('follow warp path (path distance was ' + this.nodes.length + ' nodes, ' + this.floorPathDistance + ')');
- this.setCameraCurvePoints();
- this.warpPathPoints = this.camCurvePoints.slice(0);
- }
- this.warpLength = 0, this.warpPathLengths = [0];
- 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) {
- s.copy(this.warpPathPoints[d - 1]).sub(this.warpPathPoints[d]);
- var p = s.length();
- s.y *= settings$3.warp.climbEffort;
- var f = s.length() / p;
- if (d > 1) {
- s.setY(0).normalize(), l.copy(this.warpPathPoints[d - 2]).sub(this.warpPathPoints[d - 1]).setY(0).normalize();
- var g = Math.min(1, s.dot(l)),
- m = 1 + (settings$3.warp.brakeStrength - 1) * (1 - THREE.MathUtils.smoothstep(g, u, h));
- f = Math.max(m, f);
- }
- this.warpLength += p * f, this.warpPathLengths[d] = this.warpLength;
- }
- return !0;
- }
- }, {
- key: "drawPathRibbon",
- value: function drawPathRibbon(e, t) {
- this.bunnyObj.visible = settings$3.warp.showBunny;
- 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) {
- 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);
- var d = new THREE.Vector3().copy(e[u]).add(o);
- d.sub(n), l.vertices.push(d), d = new THREE.Vector3().copy(e[u]).add(o), d.add(n), l.vertices.push(d);
- }
- var p,
- f = 0;
- for (u = 0; u < e.length - 1; u += 1) {
- var g = 2 * u,
- v = f;
- f += e[u + 1].distanceTo(e[u]);
- var y = f,
- C = t[u],
- I = t[u + 1];
- 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)]);
- }
- l.computeFaceNormals(), l.computeVertexNormals();
- var E, b;
- 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({
- side: THREE.DoubleSide,
- depthWrite: !1,
- transparent: !0,
- vertexShader: shaders.ribbon.vertexShader,
- fragmentShader: shaders.ribbon.fragmentShader,
- uniforms: b,
- name: 'ribbonT',
- opacity: 0
- })) : E = new THREE.MeshBasicMaterial({
- color: 16777215,
- side: THREE.DoubleSide,
- name: 'ribbonOut',
- vertexColors: THREE.VertexColors
- });
- var _ = new THREE.Mesh(l, E);
- return _.name = 'ribbon', this.player.mode === Viewmode$1.PANORAMA && (_.renderOrder = RenderOrder.ribbon), _;
- }
- }, {
- key: "drawPathPavement",
- value: function drawPathPavement(e) {
- 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) {
- 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);
- }
- var h, u, d;
- for (l = 0; l < e.length - 1; l += 1) {
- 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)]);
- }
- var p = this.player.mode === Viewmode$1.PANORAMA ? new THREE.MeshBasicMaterial({
- color: settings$3.path.color,
- side: THREE.DoubleSide,
- transparent: !0,
- depthWrite: !1,
- opacity: 0,
- name: 'paveT',
- map: this.pathImg.path
- }) : new THREE.MeshBasicMaterial({
- color: settings$3.path.color,
- side: THREE.DoubleSide,
- transparent: !0,
- depthWrite: !1,
- opacity: 1,
- name: 'paveO',
- map: this.pathImg.path
- });
- return new THREE.Mesh(o, p);
- }
- }, {
- key: "makeWaypointObj",
- value: function makeWaypointObj(e, t) {
- var n = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
- o = this.pathHeight(),
- 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))
- // i.setAttribute('uv', new THREE.BufferAttribute(new Float32Array([0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0], 0, 2), 2))
- // i.setIndex(new THREE.BufferAttribute(new Uint32Array([0, 1, 2, 2, 3, 0], 0, 1), 1))
- var s = THREE.UniformsUtils.clone(shaders.waypoint.uniforms);
- s.map.value = e, s.opacity.value = 0, s.color.value.set(settings$3.path.color);
- var l = {
- side: THREE.DoubleSide,
- depthWrite: !1,
- depthTest: false,
- //许钟文 加
- transparent: !0,
- vertexShader: shaders.waypoint.vertexShader,
- fragmentShader: shaders.waypoint.fragmentShader,
- uniforms: s,
- name: 'waypoint',
- opacity: 0
- };
- this.player.mode !== Viewmode$1.PANORAMA && (l.depthTest = !1, l.name = 'wayPtOut');
- var h = new THREE.RawShaderMaterial(l),
- u = new THREE.Mesh(i, h);
- u.renderOrder = RenderOrder.ribbon + 1; // .panoMarker ////许钟文加 否则在编辑模型时会时隐时现
- return u.name = t, u;
- }
- }, {
- key: "makeStartMarker",
- value: function makeStartMarker(e, t) {
- var i = new THREE.Vector3().copy(t[1]).sub(t[0]);
- i.y = 0, i.normalize();
- var n = Math.acos(i.x),
- o = this.makeWaypointObj(this.pathImg.pathStart, 'Start');
- return o.rotateOnAxis(new THREE.Vector3(0, 1, 0), n), o.position.copy(e), o;
- }
- }, {
- key: "makeEndMarker",
- value: function makeEndMarker(e) {
- var t = this.makeWaypointObj(this.pathImg.pathEnd, 'End'),
- i = this.model.panos.get(this.nodes[0]).floor.floorIndex,
- n = this.model.panos.get(this.nodes[this.nodes.length - 1]).floor.floorIndex;
- 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;
- }
- }, {
- key: "pathClean",
- value: function pathClean(e) {
- if (e) {
- for (var t in e.children) {
- this.pathClean(e.children[t]);
- }
- e.geometry && e.geometry.dispose(), e.material && e.material.dispose();
- }
- }
- }, {
- key: "discardPathObject",
- value: function discardPathObject() {
- if (this.obj3d) {
- var e = this.obj3d.parent;
- e && e.remove(this.obj3d), this.pathClean(this.obj3d);
- }
- this.obj3d = null, this.popInCpm();
- }
- }, {
- key: "discardSlow",
- value: function discardSlow() {
- if (this.obj3d) {
- if (this.player.mode !== Viewmode$1.PANORAMA) return void this.discardPathObject();
- for (var e, t = this, i = 0, n = function () {
- this.discardPathObject();
- }.bind(this), r = 0; r < t.obj3d.children.length; r += 1) {
- 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);
- }
- 0 === i && this.discardPathObject(), this.player.mode !== Viewmode$1.PANORAMA && this.fadeInCpm(settings$3.path.fadeInTime - 3);
- }
- }
- }, {
- key: "appearSlow",
- value: function appearSlow() {
- var e,
- t = this;
- this.fadeOutCpm(settings$3.path.fadeInTime);
- for (var i = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.opacity : 1, n = 0; n < t.obj3d.children.length; n += 1) {
- 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]));
- }
- }
- }, {
- key: "update",
- value: function update() {
- this.obj3d && this.obj3d.updateMatrixWorld();
- }
- }, {
- key: "calcBurnsAmount",
- value: function calcBurnsAmount(e) {
- var t = THREE.MathUtils.degToRad(settings$3.warp.burnsAngle);
- if (this.player.mode === Viewmode$1.PANORAMA) {
- var i = this.burnsDir * t;
- if (this.upcomingTransType === WarpStyle.BLACK) return i;
- var n = e;
- if (null === n) return logger$1.warn('Transition request for non-highlight'), i;
- var o = this.getHeroDescriptorByHeroIndex(n);
- if (null === o) return i;
- if (!o.isPano()) return i;
- var s = this.getHeroPano(o),
- h = this.playerControls.cameras[Viewmode$1.PANORAMA],
- u = Vectors$1.FORWARD.clone().applyQuaternion(h.quaternion).setY(0).normalize(),
- d = Math.min(THREE.MathUtils.degToRad(settings$3.warp.minBurnsAngle), t),
- p = function p(e) {
- var i = Math.acos(Math.min(1, e.dot(u))),
- n = new THREE.Vector3().crossVectors(u, e);
- return Math.max(d, Math.min(Math.abs(i), t)) * Math.sign(n.y);
- };
- if (s === this.player.currentPano) return i = p(Vectors$1.FORWARD.clone().applyQuaternion(o.quaternion).setY(0).normalize());
- var f = this.findShortestPath(this.player.currentPano, s);
- if (void 0 === f || null === f || f.length < 1) return logger$1.debug('Empty path ahead...'), i;
- var g = this.makePathHulls(f),
- m = new THREE.CatmullRomCurve3(g.camera),
- v = Math.min(0.1, settings$3.warp.lookAheadDist / m.getLength());
- return i = p(m.getPointAt(v).clone().sub(h.position).setY(0).normalize());
- }
- return this.player.mode === Viewmode$1.DOLLHOUSE ? 0.02 * this.burnsDir : this.burnsDir;
- }
- }, {
- key: "waitNextStep",
- value: function waitNextStep(e, t) {
- var i = settings$3.warp.tourStepDelay;
- i || (i = this.lastTransType === WarpStyle.BLACK ? constants.tourStepDelaySlideShow : constants.tourStepDelayDefault);
- var n = new THREE.Euler(),
- o = new THREE.Vector3();
- logger$1.debug('Starting wait: ' + (void 0 !== t));
- var s = this.calcBurnsAmount(e),
- h = function () {
- this.endWarpState(), this.player.mode === Viewmode$1.DOLLHOUSE && (this.playerControls.cameras[Viewmode$1.DOLLHOUSE].controls.rotationAcceleration.x = 0), t && t();
- }.bind(this),
- u = function (e, t) {
- if (this.warpInterrupted) return h(), !0;
- var r = t || 1e3 / 60;
- if (settings$3.warp.doBurns) if (this.player.mode === Viewmode$1.PANORAMA) {
- var camera = this.playerControls.cameras[Viewmode$1.PANORAMA];
- n.setFromQuaternion(WarpcameraStyle.quaternion, settings$3.warp.eOrder);
- var u = r * s / i;
- 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);
- } 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;
- }.bind(this);
- this.startWarpState(), transitions$1.start(u, i, h, 0, easing.easeInOutQuad, 'wait');
- }
- }, {
- key: "warpToNonPano",
- value: function warpToNonPano(e) {
- if (this.discardPathObject(), this.warpDestHeroLoc.cameraMode === Viewmode$1.DOLLHOUSE || this.warpDestHeroLoc.cameraMode === Viewmode$1.FLOORPLAN) {
- var t = function () {
- e && e();
- }.bind(this);
- this.player.flyToNewMode({
- mode: this.warpDestHeroLoc.cameraMode,
- duration: settings$3.warp.outsideTime,
- warpDest: this.warpDestHeroLoc,
- callback: t,
- force: !0
- });
- } else logger$1.warn('no warp destination!!!'), e && e();
- }
- }, {
- key: "_resetWarpShaderParams",
- value: function _resetWarpShaderParams(e) {
- 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));
- }
- }, {
- key: "_clearWarpShading",
- value: function _clearWarpShading() {
- for (var e = this.model.chunks, t = 0; t < e.length; t += 1) {
- this._resetWarpShaderParams(e[t]), e[t].visible = !0;
- }
- this._resetWarpShaderParams(this.model.skybox);
- }
- }, {
- key: "_warpStopFlying",
- value: function _warpStopFlying() {
- this.activeTransType = null, this.placeCpm();
- }
- }, {
- key: "_wrapupTravelOnlyBits",
- value: function _wrapupTravelOnlyBits() {
- this._warpStopFlying(), this.warpPathPoints && (this.player.currentPano.exit(), this.warpDestPano.enter(), this.player.currentPano = this.warpDestPano), //this.player.spider.draw(),
- this.placeCpm();
- }
- }, {
- key: "_wrapupTravel",
- value: function _wrapupTravel(e) {
- this._wrapupTravelOnlyBits(), this.warpCameraAim(e);
- }
- }, {
- key: "_wrapupWarpShading",
- value: function _wrapupWarpShading(e) {
- this._clearWarpShading(), this._wrapupTravel(e);
- }
- }, {
- key: "wrapupWarpShadingOnly",
- value: function wrapupWarpShadingOnly(e, t) {
- t !== BlackoutStyle$1.END && this._clearWarpShading(), this._wrapupTravelOnlyBits(), this.upcomingTransType = null, e && e();
- }
- }, {
- key: "_warpCameraAim",
- value: function _warpCameraAim(e, t) {
- var i = this.warpDestHeroLoc.quaternion,
- n = this.playerControls.cameras[Viewmode$1.PANORAMA],
- o = new THREE.Vector3(0, 0, 1).applyQuaternion(i).normalize(),
- s = new THREE.Vector3(0, 0, 1).applyQuaternion(n.quaternion).normalize(),
- l = s.dot(o),
- u = THREE.MathUtils.radToDeg(Math.acos(l)),
- f = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(i, settings$3.warp.eOrder),
- g = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
- m = new THREE.Euler(f.x - g.x, f.y - g.y, f.z - g.z, settings$3.warp.eOrder);
- m.y = math$2.constrainedTurn(m.y), this.burnsDir = Math.sign(m.y);
- var v = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
- A = new THREE.Vector3(),
- C = function (e, t) {
- 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));
- }.bind(this);
- if (u > settings$3.warp.minRotation) {
- return transitions$1.start(C, e, t, 0, easing[settings$3.warp.movementEasing]);
- } else {
- logger$1.debug('Aim angle only is ' + u.toPrecision(3) + ' degrees, skipping explicit re-aim');
- return void (t && t());
- }
- }
- }, {
- key: "_warpBendAim",
- value: function _warpBendAim(e, t, i, n) {
- var o = n || 0,
- s = this.playerControls.cameras[Viewmode$1.PANORAMA],
- l = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
- u = new THREE.Euler().setFromQuaternion(s.quaternion, settings$3.warp.eOrder),
- f = new THREE.Euler(l.x - u.x, l.y - u.y, l.z - u.z, settings$3.warp.eOrder);
- f.y = math$2.constrainedTurn(f.y);
- var g = Math.min(THREE.MathUtils.degToRad(settings$3.warp.softBendTilt), Math.abs(f.x));
- 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;
- var m = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
- v = new THREE.Vector3(),
- A = function (e, t) {
- 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 {
- var i = (1 - e) * settings$3.warp.softBendEnd;
- m.x = l.x - i * f.x, m.y = l.y - i * f.y, m.z = l.z - i * f.z;
- }
- v.set(0, 0, -1), v.applyEuler(m), v.add(s.position), s.controls.lookAt(v), s.controls.lookVector.copy(v), s.lookAt(v);
- }.bind(this);
- return transitions$1.start(A, t, i, o, easing[settings$3.warp.movementEasing]);
- }
- }, {
- key: "_warpStepCameraAim",
- value: function _warpStepCameraAim(e, t, i) {
- var n = this.playerControls.cameras[Viewmode$1.PANORAMA],
- o = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
- s = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
- l = new THREE.Euler(o.x - s.x, o.y - s.y, o.z - s.z, settings$3.warp.eOrder);
- l.y = math$2.constrainedTurn(l.y), this.burnsDir = Math.sign(l.y);
- var u = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
- f = new THREE.Vector3(),
- g = function (e, t) {
- 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);
- }.bind(this);
- return transitions$1.start(g, t, i, 0, easing[settings$3.warp.movementEasing]);
- }
- }, {
- key: "setBurnsDir",
- value: function setBurnsDir() {
- var e = this.playerControls.cameras[Viewmode$1.PANORAMA],
- t = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
- i = new THREE.Euler().setFromQuaternion(e.quaternion, settings$3.warp.eOrder),
- n = new THREE.Euler(t.x - i.x, t.y - i.y, t.z - i.z, settings$3.warp.eOrder);
- n.y = math$2.constrainedTurn(n.y), this.burnsDir = Math.sign(n.y);
- }
- }, {
- key: "stepWarpPath",
- value: function stepWarpPath(firstPos, e
- /* t */
- ) {
- //black过渡时的camera位置过渡
- var i = this.playerControls.cameras[Viewmode$1.PANORAMA];
- var n = this.warpPathPoints ? this.warpPathPoints[0] : firstPos; //xzw add firstPos
- if (!n) {
- return i.position.copy(this.warpDestPano.position), !0;
- }
- /* if (!this.warpPathPoints) {
- i.position.copy(this.warpDestPano.position)
- return !0
- } */
- var o = this.warpDestPano.position;
- if (null !== this.nodes && this.cameraHull && this.cameraHull.length > 1) {
- var s = new THREE.Vector3();
- 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);
- i.position.copy(s);
- } else {
- e < 0.5 ? i.position.copy(n) : i.position.copy(o);
- }
- }
- }, {
- key: "interruptAndFastForward",
- value: function interruptAndFastForward(e, t) {
- 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));
- }
- }, {
- key: "warpCameraAim",
- value: function warpCameraAim(e) {
- var t = settings$3.warp.minWarpTime;
- if (this.upcomingTransType === WarpStyle.BLACK) t = settings$3.warp.teleportTime;else {
- var i = this.playerControls.cameras[Viewmode$1.PANORAMA],
- n = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
- o = new THREE.Euler().setFromQuaternion(i.quaternion, settings$3.warp.eOrder),
- s = new THREE.Euler(n.x - o.x, n.y - o.y, n.z - o.z, settings$3.warp.eOrder);
- s.y = math$2.constrainedTurn(s.y);
- var u = 1e3 * Math.abs(s.y) / THREE.MathUtils.degToRad(settings$3.warp.maxAimPerSec);
- t = Math.max(t, u);
- }
- var d = function () {
- this._warpStopFlying(), this.discardSlow(), e && e();
- }.bind(this);
- this._warpCameraAim(t, d);
- }
- }, {
- key: "warpCommonParameters",
- value: function warpCommonParameters(e, t, i, n) {
- this.model.skybox.material.uniforms.blackout.value = n;
- var r = lerp.uniform(this.model.skybox, 'progress', 1),
- o = lerp.allUniforms(this.model.chunks, 'progress', 1),
- a = !1,
- s = function () {
- if (this.warpInterrupted) return a = !0, !0;
- }.bind(this),
- l = function (e, t) {
- return i && a ? (this.model.skybox.material.uniforms.progress.value = 0, !0) : void r(e, t);
- }.bind(this),
- h = function (e, t) {
- return i && a ? (o(0), !0) : void o(e, t);
- }.bind(this);
- 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');
- }
- }, {
- key: "warpTravel_STD",
- value: function warpTravel_STD(e) {
- var t,
- i = Math.min(settings$3.warp.lookAheadMax, settings$3.warp.lookAheadDist / this.warpLength),
- n = this.playerControls.cameras[a.PANORAMA],
- o = (Math.min(0.25, 3 / this.warpLength), Math.min(0.35, 7 / this.warpLength)),
- s = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
- f = new THREE.Vector3(),
- m = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
- v = new THREE.Euler().copy(m),
- C = n.position.clone(),
- E = new THREE.Matrix4(),
- b = new THREE.Euler(),
- w = settings$3.warp.minWarpTime;
- w += this.warpLength * settings$3.warp.timePerMeter, settings$3.warp.flySpeed > 0.01 && (w = 1e3 * this.warpLength / settings$3.warp.flySpeed);
- var _ = !1,
- T = this.warpDestHeroLoc.quaternion,
- x = new THREE.Vector3(0, 0, -1).applyQuaternion(T).normalize(),
- S = this.warpPathPoints[this.warpPathPoints.length - 1].clone().sub(this.warpPathPoints[this.warpPathPoints.length - 2]).normalize(),
- M = S.dot(x),
- R = THREE.MathUtils.radToDeg(Math.acos(M)),
- P = function P(e) {
- var t = o,
- i = THREE.MathUtils.smoothstep(e, 0, t) * (1 - THREE.MathUtils.smoothstep(e, 1 - t, 1));
- return i;
- },
- O = function () {
- 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);
- }.bind(this),
- L = function (e, t) {
- if (this.warpInterrupted) return _ = !0, !0;
- }.bind(this),
- D = function (e, t) {
- return _ || !this.warpPathPoints ? (effects.blur(0), !0) : void effects.blur(e);
- }.bind(this),
- N = lerp.allUniforms(this.model.chunks, 'modelAlpha', 1),
- B = function (e, t) {
- return _ || !this.warpPathPoints ? (N(0), !0) : void N(e, t);
- }.bind(this),
- F = function (e, t) {
- if (!this.warpPathPoints) return n.position.copy(this.warpDestPano.position), !0;
- if (_) return !0;
- var i = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, e);
- n.position.copy(i), C = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, 0.99 * e);
- }.bind(this),
- V = function (e, n) {
- return this.warpPathPoints ? !!_ || void (t = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, Math.min(e + i, 1))) : (logger$1.debug('Lost bunny.'), !0);
- }.bind(this),
- U = function (e, o) {
- if (_) return logger$1.debug('>>>> Walkthrough interupted at t=' + e), !0;
- if (!this.warpPathPoints) return !0;
- var a = this.warpLength * e,
- l = THREE.MathUtils.smoothstep(a, 0, this.brushPrefs.lookBlendDist),
- u = THREE.MathUtils.smoothstep(a, this.warpLength - this.brushPrefs.lookBlendDist, this.warpLength);
- 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);
- var d = THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec) * o / 1e3;
- 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);
- var p = t.clone().sub(C).normalize();
- if (R < settings$3.warp.maxAimRotation && u > 0) {
- var g = 1 - u;
- 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();
- }
- 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));
- }.bind(this),
- k = function () {
- _ ? (this.discardSlow(), this.upcomingTransType = l.BLACK, this.warpTravel_BLACK(-0.5, this.warpInterruptionTravelTime, BlackoutStyle$1.BEGINNING, e)) : this._wrapupWarpShading(e);
- }.bind(this);
- V(0);
- var H = settings$3.warp.motionLeadTime + 1e3 * Math.abs(O()) / THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec);
- w += H;
- var G = H / w;
- 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');
- }
- }, {
- key: "warpTravel_BLACK",
- value: function warpTravel_BLACK(e, t, i, n) {
- this.player.model.floorLogos.firstLogo.visible = false;
- this.player.model.floorLogos.secondLogo.visible = false; //this.player.tagManager.hideAllTags();
- var r = e || 0;
- void 0 !== t && null !== t || (t = settings$3.warp.teleportTime), this.warpCommonParameters(t, r, !1, i), this.model.chunks.forEach(function (e) {
- e.material.uniforms.blackout.value = i;
- }), this._warpBendAim(null, t, null, r);
- var o = function () {
- this.wrapupWarpShadingOnly(n, i);
- }.bind(this);
- var firstPos = this.player.position.clone(); //add
- transitions$1.start(this.stepWarpPath.bind(this, firstPos), t, o, r, easing[settings$3.warp.blendEasing], 'stepMotion');
- }
- }, {
- key: "makeWalkFlightFunc",
- value: function makeWalkFlightFunc(e, t, i) {
- return this.flightStepWalk.bind(this, e, t, i);
- }
- }, {
- key: "getOrientationForWalkingTourNode",
- value: function getOrientationForWalkingTourNode(e, t, i) {
- var n = e.length;
- if (t >= n) return !1;
- if (t === n - 1) i.copy(Vectors$1.FORWARD).applyQuaternion(this.warpDestHeroLoc.quaternion);else {
- var r = this.player.model.panos.get(e[t]),
- o = this.player.model.panos.get(e[t + 1]);
- i.copy(o.position).sub(r.position);
- }
- return i.normalize(), !0;
- }
- }, {
- key: "warpCameraTravel",
- value: function warpCameraTravel(e, t, i, n) {
- if (this.activeTransType = this.upcomingTransType, this.lastTransType = this.activeTransType, this.upcomingTransType = null, !e) {
- var r = function () {
- this._wrapupTravel(n);
- }.bind(this),
- o = {
- pano: this.warpDestPano,
- lookAtPoint: null,
- duration: null,
- maxDistanceOverride: null,
- skipWarpingCheck: !1
- };
- return void this.player.flyToPano(o, r);
- }
- this.activeTransType === WarpStyle.BLACK ? this.warpTravel_BLACK(null, i, t, n) : this.activeTransType === WarpStyle.WALK ? this.warpTravel_WALK(function () {
- this._clearWarpShading(), this._warpStopFlying(), this.player.spider.draw(), this.placeCpm(), n && n();
- }.bind(this)) : this.warpTravel_STD(n);
- }
- }, {
- key: "startWarpState",
- value: function startWarpState() {
- this.warping = !0, this.warpInterrupted = !1, this.warpInterruptionBlackoutStyle = null, this.warpInterruptionTravelTime = null;
- }
- }, {
- key: "endWarpState",
- value: function endWarpState() {
- this.warping = !1;
- }
- }, {
- key: "warpToPano",
- value: function warpToPano(e, t, i, n) {
- if (this.warping) return void logger$1.warn('Cannot warp when already warping');
- if (this.upcomingTransType = e, this.activeTransType = null, !this.setWarpDestPano()) return this.upcomingTransType = null, void this.warpToNonPano(n);
- if (this.player.mode !== Viewmode$1.PANORAMA) return this.upcomingTransType = null, this.discardSlow(), void this.player.flyToNewMode({
- mode: Viewmode$1.PANORAMA,
- pano: this.warpDestPano,
- duration: settings$3.warp.outsideTime,
- warpDest: this.warpDestHeroLoc,
- callback: n,
- force: !0
- });
- if (!this.warpDestPano) return logger$1.warn('no warp destination, callback dropped'), void (this.upcomingTransType = null);
- 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),
- o = this.chooseWarpPath(r);
- if (o && this.upcomingTransType !== WarpStyle.WALK) {
- var s = function () {
- this.waitingToWarp = !1, this.warpToPano(e, t, i, n);
- }.bind(this);
- if (this.player.checkAndWaitForPanoLoad(this.warpDestPano, 'high', 'low', this.player.basePanoSize, s)) return void (this.waitingToWarp = !0);
- }
- 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);
- if (this.upcomingTransType !== WarpStyle.WALK) {
- this.player.emit(PlayerEvents.PanoChosen, this.player.currentPano, this.warpDestPano);
- }
- this.startWarpState();
- var h = function () {
- this.endWarpState(), n && n();
- }.bind(this);
- o ? this.warpCameraTravel(r, t, i, h) : this.warpCameraAim(h);
- this.player.smoothZoomToDefault(settings$3.zoom.restoreTime);
- }
- }]);
- return ShowPath;
- }();
- var ZoomEvents = {
- ZoomIn: 'zoom.in',
- ZoomOut: 'zoom.out',
- ZoomMax: 'zoom.max',
- ZoomMin: 'zoom.min'
- };
- 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); }; }
- 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; } }
- var _taskCache$1 = new WeakMap();
- var DRACOLoader = /*#__PURE__*/function (_Loader) {
- _inherits(DRACOLoader, _Loader);
- var _super = _createSuper$1w(DRACOLoader);
- function DRACOLoader(manager) {
- var _this;
- _classCallCheck(this, DRACOLoader);
- _this = _super.call(this, manager);
- _this.decoderPath = '';
- _this.decoderConfig = {};
- _this.decoderBinary = null;
- _this.decoderPending = null;
- _this.workerLimit = 4;
- _this.workerPool = [];
- _this.workerNextTaskID = 1;
- _this.workerSourceURL = '';
- _this.defaultAttributeIDs = {
- position: 'POSITION',
- normal: 'NORMAL',
- color: 'COLOR',
- uv: 'TEX_COORD'
- };
- _this.defaultAttributeTypes = {
- position: 'Float32Array',
- normal: 'Float32Array',
- color: 'Float32Array',
- uv: 'Float32Array'
- };
- return _this;
- }
- _createClass(DRACOLoader, [{
- key: "setDecoderPath",
- value: function setDecoderPath(path) {
- this.decoderPath = path;
- return this;
- }
- }, {
- key: "setDecoderConfig",
- value: function setDecoderConfig(config) {
- this.decoderConfig = config;
- return this;
- }
- }, {
- key: "setWorkerLimit",
- value: function setWorkerLimit(workerLimit) {
- this.workerLimit = workerLimit;
- return this;
- }
- }, {
- key: "load",
- value: function load(url, onLoad, onProgress, onError) {
- var _this2 = this;
- var loader = new THREE$1.FileLoader(this.manager);
- loader.setPath(this.path);
- loader.setResponseType('arraybuffer');
- loader.setRequestHeader(this.requestHeader);
- loader.setWithCredentials(this.withCredentials);
- loader.load(url, function (buffer) {
- _this2.decodeDracoFile(buffer, onLoad).catch(onError);
- }, onProgress, onError);
- }
- }, {
- key: "decodeDracoFile",
- value: function decodeDracoFile(buffer, callback, attributeIDs, attributeTypes) {
- var taskConfig = {
- attributeIDs: attributeIDs || this.defaultAttributeIDs,
- attributeTypes: attributeTypes || this.defaultAttributeTypes,
- useUniqueIDs: !!attributeIDs
- };
- return this.decodeGeometry(buffer, taskConfig).then(callback);
- }
- }, {
- key: "decodeGeometry",
- value: function decodeGeometry(buffer, taskConfig) {
- var _this3 = this;
- var taskKey = JSON.stringify(taskConfig); // Check for an existing task using this buffer. A transferred buffer cannot be transferred
- // again from this thread.
- if (_taskCache$1.has(buffer)) {
- var cachedTask = _taskCache$1.get(buffer);
- if (cachedTask.key === taskKey) {
- return cachedTask.promise;
- } else if (buffer.byteLength === 0) {
- // Technically, it would be possible to wait for the previous task to complete,
- // transfer the buffer back, and decode again with the second configuration. That
- // is complex, and I don't know of any reason to decode a Draco buffer twice in
- // different ways, so this is left unimplemented.
- throw new Error('THREE.DRACOLoader: Unable to re-decode a buffer with different ' + 'settings. Buffer has already been transferred.');
- }
- } //
- var worker;
- var taskID = this.workerNextTaskID++;
- var taskCost = buffer.byteLength; // Obtain a worker and assign a task, and construct a geometry instance
- // when the task completes.
- var geometryPending = this._getWorker(taskID, taskCost).then(function (_worker) {
- worker = _worker;
- return new Promise(function (resolve, reject) {
- worker._callbacks[taskID] = {
- resolve,
- reject
- };
- worker.postMessage({
- type: 'decode',
- id: taskID,
- taskConfig,
- buffer
- }, [buffer]); // this.debug();
- });
- }).then(function (message) {
- return _this3._createGeometry(message.geometry);
- }); // Remove task from the task list.
- // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)
- geometryPending.catch(function () {
- return true;
- }).then(function () {
- if (worker && taskID) {
- _this3._releaseTask(worker, taskID); // this.debug();
- }
- }); // Cache the task result.
- _taskCache$1.set(buffer, {
- key: taskKey,
- promise: geometryPending
- });
- return geometryPending;
- }
- }, {
- key: "_createGeometry",
- value: function _createGeometry(geometryData) {
- var geometry = new THREE$1.BufferGeometry();
- if (geometryData.index) {
- geometry.setIndex(new THREE$1.BufferAttribute(geometryData.index.array, 1));
- }
- for (var i = 0; i < geometryData.attributes.length; i++) {
- var attribute = geometryData.attributes[i];
- var name = attribute.name;
- var array = attribute.array;
- var itemSize = attribute.itemSize;
- geometry.setAttribute(name, new THREE$1.BufferAttribute(array, itemSize));
- }
- return geometry;
- }
- }, {
- key: "_loadLibrary",
- value: function _loadLibrary(url, responseType) {
- var loader = new THREE$1.FileLoader(this.manager);
- loader.setPath(this.decoderPath);
- loader.setResponseType(responseType);
- loader.setWithCredentials(this.withCredentials);
- return new Promise(function (resolve, reject) {
- loader.load(url, resolve, undefined, reject);
- });
- }
- }, {
- key: "preload",
- value: function preload() {
- this._initDecoder();
- return this;
- }
- }, {
- key: "_initDecoder",
- value: function _initDecoder() {
- var _this4 = this;
- if (this.decoderPending) return this.decoderPending;
- var useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';
- var librariesPending = [];
- if (useJS) {
- librariesPending.push(this._loadLibrary('draco_decoder.js', 'text'));
- } else {
- librariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text'));
- librariesPending.push(this._loadLibrary('draco_decoder.wasm', 'arraybuffer'));
- }
- this.decoderPending = Promise.all(librariesPending).then(function (libraries) {
- var jsContent = libraries[0];
- if (!useJS) {
- _this4.decoderConfig.wasmBinary = libraries[1];
- }
- var fn = DRACOWorker.toString();
- var body = ['/* draco decoder */', jsContent, '', '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))].join('\n');
- _this4.workerSourceURL = URL.createObjectURL(new Blob([body]));
- });
- return this.decoderPending;
- }
- }, {
- key: "_getWorker",
- value: function _getWorker(taskID, taskCost) {
- var _this5 = this;
- return this._initDecoder().then(function () {
- if (_this5.workerPool.length < _this5.workerLimit) {
- var _worker2 = new Worker(_this5.workerSourceURL);
- _worker2._callbacks = {};
- _worker2._taskCosts = {};
- _worker2._taskLoad = 0;
- _worker2.postMessage({
- type: 'init',
- decoderConfig: _this5.decoderConfig
- });
- _worker2.onmessage = function (e) {
- var message = e.data;
- switch (message.type) {
- case 'decode':
- _worker2._callbacks[message.id].resolve(message);
- break;
- case 'error':
- _worker2._callbacks[message.id].reject(message);
- break;
- default:
- console.error('THREE.DRACOLoader: Unexpected message, "' + message.type + '"');
- }
- };
- _this5.workerPool.push(_worker2);
- } else {
- _this5.workerPool.sort(function (a, b) {
- return a._taskLoad > b._taskLoad ? -1 : 1;
- });
- }
- var worker = _this5.workerPool[_this5.workerPool.length - 1];
- worker._taskCosts[taskID] = taskCost;
- worker._taskLoad += taskCost;
- return worker;
- });
- }
- }, {
- key: "_releaseTask",
- value: function _releaseTask(worker, taskID) {
- worker._taskLoad -= worker._taskCosts[taskID];
- delete worker._callbacks[taskID];
- delete worker._taskCosts[taskID];
- }
- }, {
- key: "debug",
- value: function debug() {
- console.log('Task load: ', this.workerPool.map(function (worker) {
- return worker._taskLoad;
- }));
- }
- }, {
- key: "dispose",
- value: function dispose() {
- for (var i = 0; i < this.workerPool.length; ++i) {
- this.workerPool[i].terminate();
- }
- this.workerPool.length = 0;
- return this;
- }
- }]);
- return DRACOLoader;
- }(THREE$1.Loader);
- /* WEB WORKER */
- function DRACOWorker() {
- var decoderConfig;
- var decoderPending;
- onmessage = function onmessage(e) {
- var message = e.data;
- switch (message.type) {
- case 'init':
- decoderConfig = message.decoderConfig;
- decoderPending = new Promise(function (resolve
- /*, reject*/
- ) {
- decoderConfig.onModuleLoaded = function (draco) {
- // Module is Promise-like. Wrap before resolving to avoid loop.
- resolve({
- draco: draco
- });
- };
- DracoDecoderModule(decoderConfig); // eslint-disable-line no-undef
- });
- break;
- case 'decode':
- var buffer = message.buffer;
- var taskConfig = message.taskConfig;
- decoderPending.then(function (module) {
- var draco = module.draco;
- var decoder = new draco.Decoder();
- var decoderBuffer = new draco.DecoderBuffer();
- decoderBuffer.Init(new Int8Array(buffer), buffer.byteLength);
- try {
- var geometry = decodeGeometry(draco, decoder, decoderBuffer, taskConfig);
- var buffers = geometry.attributes.map(function (attr) {
- return attr.array.buffer;
- });
- if (geometry.index) buffers.push(geometry.index.array.buffer);
- self.postMessage({
- type: 'decode',
- id: message.id,
- geometry
- }, buffers);
- } catch (error) {
- console.error(error);
- self.postMessage({
- type: 'error',
- id: message.id,
- error: error.message
- });
- } finally {
- draco.destroy(decoderBuffer);
- draco.destroy(decoder);
- }
- });
- break;
- }
- };
- function decodeGeometry(draco, decoder, decoderBuffer, taskConfig) {
- var attributeIDs = taskConfig.attributeIDs;
- var attributeTypes = taskConfig.attributeTypes;
- var dracoGeometry;
- var decodingStatus;
- var geometryType = decoder.GetEncodedGeometryType(decoderBuffer);
- if (geometryType === draco.TRIANGULAR_MESH) {
- dracoGeometry = new draco.Mesh();
- decodingStatus = decoder.DecodeBufferToMesh(decoderBuffer, dracoGeometry);
- } else if (geometryType === draco.POINT_CLOUD) {
- dracoGeometry = new draco.PointCloud();
- decodingStatus = decoder.DecodeBufferToPointCloud(decoderBuffer, dracoGeometry);
- } else {
- throw new Error('THREE.DRACOLoader: Unexpected geometry type.');
- }
- if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
- throw new Error('THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg());
- }
- var geometry = {
- index: null,
- attributes: []
- }; // Gather all vertex attributes.
- for (var attributeName in attributeIDs) {
- var attributeType = self[attributeTypes[attributeName]];
- var attribute = void 0;
- var attributeID = void 0; // A Draco file may be created with default vertex attributes, whose attribute IDs
- // are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,
- // a Draco file may contain a custom set of attributes, identified by known unique
- // IDs. glTF files always do the latter, and `.drc` files typically do the former.
- if (taskConfig.useUniqueIDs) {
- attributeID = attributeIDs[attributeName];
- attribute = decoder.GetAttributeByUniqueId(dracoGeometry, attributeID);
- } else {
- attributeID = decoder.GetAttributeId(dracoGeometry, draco[attributeIDs[attributeName]]);
- if (attributeID === -1) continue;
- attribute = decoder.GetAttribute(dracoGeometry, attributeID);
- }
- geometry.attributes.push(decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute));
- } // Add index.
- if (geometryType === draco.TRIANGULAR_MESH) {
- geometry.index = decodeIndex(draco, decoder, dracoGeometry);
- }
- draco.destroy(dracoGeometry);
- return geometry;
- }
- function decodeIndex(draco, decoder, dracoGeometry) {
- var numFaces = dracoGeometry.num_faces();
- var numIndices = numFaces * 3;
- var byteLength = numIndices * 4;
- var ptr = draco._malloc(byteLength);
- decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
- var index = new Uint32Array(draco.HEAPF32.buffer, ptr, numIndices).slice();
- draco._free(ptr);
- return {
- array: index,
- itemSize: 1
- };
- }
- function decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute) {
- var numComponents = attribute.num_components();
- var numPoints = dracoGeometry.num_points();
- var numValues = numPoints * numComponents;
- var byteLength = numValues * attributeType.BYTES_PER_ELEMENT;
- var dataType = getDracoDataType(draco, attributeType);
- var ptr = draco._malloc(byteLength);
- decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, attribute, dataType, byteLength, ptr);
- var array = new attributeType(draco.HEAPF32.buffer, ptr, numValues).slice();
- draco._free(ptr);
- return {
- name: attributeName,
- array: array,
- itemSize: numComponents
- };
- }
- 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;
- }
- }
- }
- var GLTFLoader$2 = new THREE.GLTFLoader();
- var dracoLoader = new DRACOLoader();
- dracoLoader.setDecoderPath(texture.getImageURL('images/loaders/DRACOLoader/draco/'));
- GLTFLoader$2.setDRACOLoader(dracoLoader);
- var loaders = {
- gltf: function gltf(url, func) {
- GLTFLoader$2.load(url, func);
- }
- };
- 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); }; }
- 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; } }
- var bracketModels = {}; // 支架模型数据
- /**
- * 空间贴图边框
- */
- var OverlayFrame = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(OverlayFrame, _THREE$Object3D);
- var _super = _createSuper$1v(OverlayFrame);
- function OverlayFrame(type) {
- var _this;
- _classCallCheck(this, OverlayFrame);
- _this = _super.call(this);
- _this.parts = {
- body: null,
- // 随overlay缩放或旋转的部分
- foot: null,
- // 不随overlay缩放或旋转的部分
- line: null // 线框
- };
- /**
- * 目前有:
- * 边框:wall1, wall2, wall3,
- * 支架:ground1, ground2
- */
- _this.type = type;
- _this.addEventListener('createDone', function () {
- _this.traverse(function (e) {
- if (e.isMesh) {
- e.renderOrder = RenderOrder.overlay - 1; //低于plane的,为了让plane的透明部分不会遮住画框。若要相反的效果需要保证完全重叠
- e.material.transparent = true;
- }
- }); //xzw:遮住marker
- });
- if (_this.type.indexOf('ground') > -1) {
- _this.createBracket();
- } else {
- _this.createFrame();
- }
- return _this;
- } // // 用于TransfromControl
- // get width() {
- // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.width
- // else return
- // }
- // get height() {
- // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.height
- // else return
- // }
- // get depth() {
- // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.depth
- // else return
- // }
- _createClass(OverlayFrame, [{
- key: "show",
- value: function show() {
- // overlay隐藏时不显示
- if (!this.overlay.visible) {
- this.visible = false;
- return;
- } // wall_1厚度为0时不显示
- if (this.type == 'wall_1' && this.overlay.depthTemp == 0) {
- this.visible = false;
- return;
- }
- this.visible = true;
- }
- }, {
- key: "hide",
- value: function hide() {
- this.visible = false;
- } // 设置厚度
- }, {
- key: "setFrameThickness",
- value: function setFrameThickness(thickness) {
- if (this.type == 'wall_1') {
- isNaN(thickness) && (thickness = 0);
- /* settings.overlay.depth */
- this.overlay.depthTemp = thickness; // 当厚度为0时隐藏frame
- !!thickness ? this.show() : this.hide();
- } else if (this.type.indexOf('wall') > -1) {
- thickness = settings$3.overlay.depth; // 其他贴墙固定0.04
- } else {
- thickness = 0; // 贴地默认无厚度
- }
- this.overlay.depth = thickness;
- this.overlay.plane.position.set(0, 0, thickness);
- this.update({
- mode: 'scale'
- });
- }
- }, {
- key: "setOverlay",
- value: function setOverlay(overlay, isFromInfo) {
- this.overlay = overlay;
- overlay.frame = this;
- this.visible = overlay.visible;
- if (!isFromInfo) {
- this.position.copy(this.overlay.position);
- this.quaternion.copy(this.overlay.quaternion); // 根据overlayFrame修正overlay坐标
- var _this$computeOverlayT = this.computeOverlayTransform(),
- position = _this$computeOverlayT.position,
- quaternion = _this$computeOverlayT.quaternion;
- this.overlay.position.copy(position);
- this.overlay.quaternion.copy(quaternion);
- } else {
- // 初始化数据库数据时,倒推出overlay修正前坐标,作为overlayFrame位置
- var _this$computeOverlayT2 = this.computeOverlayTransform({
- reverse: true
- }),
- _position = _this$computeOverlayT2.position,
- _quaternion = _this$computeOverlayT2.quaternion;
- this.position.copy(_position);
- this.quaternion.copy(_quaternion);
- }
- this.update({
- mode: 'scale'
- });
- }
- /**
- * 改变overlay坐标和旋转使它适应overlayFrame
- * @param {*} options
- * @returns
- */
- }, {
- key: "computeOverlayTransform",
- value: function computeOverlayTransform() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var position = this.overlay.position.clone();
- var quaternion = this.overlay.quaternion.clone();
- var reverse = options.reverse ? -1 : 1;
- var height = settings$3.overlay.height * this.overlay.scale.y;
- switch (this.type) {
- case 'ground_1':
- position.add(new THREE.Vector3(0, (bracketModels[this.type].height + height / 2) * reverse, 0).applyQuaternion(this.overlay.quaternion));
- break;
- case 'ground_2':
- quaternion.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 6 * reverse));
- position.add(new THREE.Vector3(0, bracketModels[this.type].height * reverse, 0).applyQuaternion(reverse == 1 ? this.quaternion : quaternion));
- break;
- case 'wall_0':
- case 'wall_1':
- case 'wall_2':
- case 'wall_3':
- position.add(new THREE.Vector3(0, (height / 2 + this.getFrameModelData().border) * reverse, 0).applyQuaternion(this.quaternion)); // 边框上移
- break;
- }
- this.setFrameThickness(this.overlay.depth);
- return {
- position,
- quaternion
- };
- } // 创建支架
- }, {
- key: "createBracket",
- value: function createBracket() {
- var _this2 = this;
- var hideMaterial = new THREE.MeshPhongMaterial({
- color: 0x000000
- });
- hideMaterial.visible = false;
- if (this.type == 'ground_1') {
- this.parts.body = new THREE.Group(); // 背面
- var plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
- plane.scale.z = -1;
- this.parts.body.backFace = plane;
- var base = new THREE.Group();
- this.parts.body.bottom = base;
- this.parts.body.add(base, plane);
- this.add(this.parts.body);
- this.initBracketMeshData(function (object) {
- base.add(object); // 背面替换为底座相同材质
- var material = object.children[1].material;
- plane.material = material;
- _this2.dispatchEvent({
- type: 'createDone'
- });
- });
- } else {
- // 可移动支架
- this.parts.body = new THREE.Group();
- this.parts.body.rotateX(-Math.PI / 6);
- this.add(this.parts.body); // 竖杆
- var cube = new THREE.Mesh(new THREE.BoxGeometry(0.02, settings$3.overlay.height, 0.02), hideMaterial);
- cube.position.z -= 0.01; // 上横杆
- var cube1 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
- cube1.position.y += settings$3.overlay.height / 2 + 0.005; // 下横杆
- var cube2 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
- cube2.position.y -= settings$3.overlay.height / 2 + 0.005; // 背面
- var _plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
- _plane.scale.z = -1;
- this.parts.body.middle = cube;
- this.parts.body.top = cube1;
- this.parts.body.bottom = cube2;
- this.parts.body.backFace = _plane;
- this.parts.body.add(cube, cube1, cube2, _plane); // 底座支架
- this.parts.foot = new THREE.Group();
- this.parts.foot.position.z -= 0.02;
- this.add(this.parts.foot);
- this.initBracketMeshData(function (object) {
- _this2.parts.foot.add(object); // 可移动支架替换为底座相同材质
- var material = object.children[0].material;
- cube.material = cube1.material = cube2.material = _plane.material = material;
- _this2.dispatchEvent({
- type: 'createDone'
- });
- }); // bracketModels需要先init
- this.parts.body.position.y += bracketModels[this.type].height;
- }
- } // 创建边框
- }, {
- key: "createFrame",
- value: function createFrame() {
- var body = new THREE.Mesh();
- this.parts.body = body;
- var _this$getFrameModelDa = this.getFrameModelData(),
- vertices = _this$getFrameModelDa.vertices,
- indexs = _this$getFrameModelDa.indexs,
- uvs = _this$getFrameModelDa.uvs,
- normals = _this$getFrameModelDa.normals;
- body.geometry = new THREE.BufferGeometry();
- body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
- body.geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
- body.geometry.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
- if (normals) body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));else body.geometry.computeVertexNormals();
- if (this.type == 'wall_0') {
- // let frameFace = new THREE.Mesh(frameGeo, new THREE.MeshBasicMaterial({ map: texture.load(texture.getImageURL('images/zzz.jpg')) }))
- body.material = new THREE.MeshPhongMaterial({
- color: '#eeeeee'
- });
- this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({
- color: 0x000000
- }));
- this.add(this.parts.line);
- } else if (this.type == 'wall_3') {
- body.material = new THREE.MeshStandardMaterial({
- color: '#222222'
- });
- } else if (this.type == 'wall_2' || this.type == 'wall_1') {
- body.material = new THREE.MeshLambertMaterial({
- color: '#cccccc'
- }); // this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({ color: 0xcccccc, transparent: true, opacity: 0.4}))
- // this.add(this.parts.line)
- }
- body.position.z -= 0.001; // 向后移1mm,防止和overlay以及边框重叠
- this.add(body);
- this.dispatchEvent({
- type: 'createDone'
- });
- }
- /**
- * overlayFrame和overlay之间互相影响变换
- * @param {*} data TransformControls变换数据
- */
- }, {
- key: "update",
- value: function update(data) {
- var width = Math.abs(settings$3.overlay.width * this.overlay.scale.x);
- var height = Math.abs(settings$3.overlay.height * this.overlay.scale.y); // ground: 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
- // wall: 更新overlayFrame,随overlay变换(需要根据长宽高更新transfromControl)
- if (!data || data.mode == 'translate') {
- switch (this.type) {
- case 'ground_1':
- this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
- break;
- case 'ground_2':
- this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
- break;
- case 'wall_0':
- case 'wall_1':
- case 'wall_2':
- case 'wall_3':
- this.position.copy(this.overlay.position).add(new THREE.Vector3(0, -height / 2 - this.getFrameModelData().border, 0).applyQuaternion(this.quaternion)); // 边框上移
- break;
- default:
- this.overlay.position.copy(this.position);
- break;
- }
- } // 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
- if (!data || data.mode == 'rotate') {
- switch (this.type) {
- case 'ground_1':
- this.overlay.rotation.copy(this.rotation);
- this.overlay.position.set(0, bracketModels[this.type].height + height / 2, 0).applyQuaternion(this.quaternion).add(this.position);
- break;
- case 'ground_2':
- this.overlay.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0).applyQuaternion(this.overlay.quaternion), -Math.PI / 6).multiply(this.quaternion);
- this.parts.body.quaternion.copy(this.quaternion).invert().multiply(this.overlay.quaternion); // local quaternion
- this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
- break;
- case 'wall_0':
- case 'wall_1':
- case 'wall_2':
- case 'wall_3':
- this.overlay.rotation.copy(this.rotation);
- this.overlay.position.set(0, this.getFrameModelData().border + height / 2, 0).applyQuaternion(this.quaternion).add(this.position); // 边框上移
- break;
- default:
- this.overlay.rotation.copy(this.rotation);
- break;
- }
- } // 更新overlayFrame,随overlay变换(因为ground_2模型需要如此)
- if (!data || data.mode == 'scale') {
- switch (this.type) {
- case 'ground_1':
- this.parts.body.bottom.scale.x = this.overlay.scale.x;
- this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
- this.parts.body.backFace.position.set(0, height / 2 + bracketModels[this.type].height, 0);
- this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
- break;
- case 'ground_2':
- this.parts.body.middle.scale.y = this.overlay.scale.y;
- this.parts.body.top.position.y = height / 2 + 0.005;
- this.parts.body.bottom.position.y = -height / 2 - 0.005;
- this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
- break;
- case 'wall_0':
- case 'wall_1':
- case 'wall_2':
- case 'wall_3':
- var _this$getFrameModelDa2 = this.getFrameModelData(width, height),
- vertices = _this$getFrameModelDa2.vertices,
- normals = _this$getFrameModelDa2.normals;
- this.parts.body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
- normals && this.parts.body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
- this.position.set(0, -this.getFrameModelData().border - height / 2, 0).applyQuaternion(this.quaternion).add(this.overlay.position); // 边框上移
- if (this.parts.line) {
- this.parts.line.geometry.dispose();
- this.parts.line.geometry = new THREE.EdgesGeometry(this.parts.body.geometry);
- }
- break;
- }
- }
- } // 边框模型数据
- }, {
- key: "getFrameModelData",
- value: function getFrameModelData(width, height) {
- var depth = this.overlay && !isNaN(this.overlay.depth) ? this.overlay.depth : settings$3.overlay.depth;
- !width && (width = settings$3.overlay.width);
- !height && (height = settings$3.overlay.height);
- var bufferAttributesJson = {
- wall_0: {
- border: 0.05,
- vertices: [width / 2, height / 2, depth, // 0
- width / 2 + 0.01, height / 2 + 0.01, depth + 0.02, // 1
- width / 2 + 0.05, height / 2 + 0.05, depth + 0.02, // 2
- width / 2, -height / 2, depth, // 3
- width / 2 + 0.01, -height / 2 - 0.01, depth + 0.02, // 4
- width / 2 + 0.05, -height / 2 - 0.05, depth + 0.02, // 5
- -width / 2, -height / 2, depth, // 6
- -width / 2 - 0.01, -height / 2 - 0.01, depth + 0.02, // 7
- -width / 2 - 0.05, -height / 2 - 0.05, depth + 0.02, // 8
- -width / 2, height / 2, depth, // 9
- -width / 2 - 0.01, height / 2 + 0.01, depth + 0.02, // 10
- -width / 2 - 0.05, height / 2 + 0.05, depth + 0.02, // 11
- width / 2 + 0.05, height / 2 + 0.05, 0, // 12
- width / 2 + 0.05, -height / 2 - 0.05, 0, // 13
- -width / 2 - 0.05, -height / 2 - 0.05, 0, // 14
- -width / 2 - 0.05, height / 2 + 0.05, 0 // 15
- ],
- 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]
- },
- wall_1: {
- border: 0,
- vertices: [width / 2, height / 2, depth, // 0
- width / 2, height / 2, 0, // 1
- width / 2, -height / 2, depth, // 2
- width / 2, -height / 2, 0, // 3
- -width / 2, -height / 2, depth, // 4
- -width / 2, -height / 2, 0, // 5
- -width / 2, height / 2, depth, // 6
- -width / 2, height / 2, 0 // 7
- ],
- 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],
- 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]
- },
- wall_2: {
- border: 0.06,
- vertices: [width / 2 + 0.02, height / 2 + 0.02, depth, // 0
- width / 2 + 0.02, height / 2 + 0.02, depth + 0.03, // 1
- width / 2 + 0.06, height / 2 + 0.06, depth, // 2
- width / 2 + 0.02, -height / 2 - 0.02, depth, // 3
- width / 2 + 0.02, -height / 2 - 0.02, depth + 0.03, // 4
- width / 2 + 0.06, -height / 2 - 0.06, depth, // 5
- -width / 2 - 0.02, -height / 2 - 0.02, depth, // 6
- -width / 2 - 0.02, -height / 2 - 0.02, depth + 0.03, // 7
- -width / 2 - 0.06, -height / 2 - 0.06, depth, // 8
- -width / 2 - 0.02, height / 2 + 0.02, depth, // 9
- -width / 2 - 0.02, height / 2 + 0.02, depth + 0.03, // 10
- -width / 2 - 0.06, height / 2 + 0.06, depth, // 11
- width / 2 + 0.06, height / 2 + 0.06, 0, // 12
- width / 2 + 0.06, -height / 2 - 0.06, 0, // 13
- -width / 2 - 0.06, -height / 2 - 0.06, 0, // 14
- -width / 2 - 0.06, height / 2 + 0.06, 0 // 15
- ],
- 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],
- 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]
- },
- wall_3: {
- border: 0.05,
- vertices: [width / 2, height / 2, depth, // 0
- width / 2 + 0.05, height / 2 + 0.05, depth, // 1
- width / 2, -height / 2, depth, // 2
- width / 2 + 0.05, -height / 2 - 0.05, depth, // 3
- -width / 2, -height / 2, depth, // 4
- -width / 2 - 0.05, -height / 2 - 0.05, depth, // 5
- -width / 2, height / 2, depth, // 6
- -width / 2 - 0.05, height / 2 + 0.05, depth, // 7
- width / 2 + 0.05, height / 2 + 0.05, 0, // 8
- width / 2 + 0.05, -height / 2 - 0.05, 0, // 9
- -width / 2 - 0.05, -height / 2 - 0.05, 0, // 10
- -width / 2 - 0.05, height / 2 + 0.05, 0 // 11
- ],
- 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],
- 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]
- }
- };
- var attrs = bufferAttributesJson[this.type]; // 边框上移
- for (var i = 1; i < attrs.vertices.length; i += 3) {
- attrs.vertices[i] += height / 2 + attrs.border;
- }
- attrs.uvs = [];
- for (var _i = 0; _i < attrs.vertices.length * (2 / 3) / 8; _i++) {
- attrs.uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
- }
- return attrs;
- }
- /**
- * 加载支架模型
- * @param {*} func
- * @returns
- */
- }, {
- key: "initBracketMeshData",
- value: function initBracketMeshData(func) {
- var _this3 = this;
- // 使用已有模型数据,注意需要clone
- if (bracketModels[this.type] && bracketModels[this.type].loaded) {
- func && func(bracketModels[this.type].object.clone());
- return;
- }
- if (this.type == 'ground_1') {
- // 长度2.44m,高度0.58m
- var scaleYZ = 0.2;
- bracketModels[this.type] = {
- object: null,
- height: 0.58 * scaleYZ,
- loaded: false
- };
- loaders.gltf(texture.getImageURL('images/brackets/bracket_1.glb'), function (model) {
- var object = model.scene;
- object.position.y *= scaleYZ;
- object.rotateY(Math.PI / 2);
- object.scale.set(scaleYZ, scaleYZ, 1 / 2.44);
- object.children.forEach(function (mesh) {
- if (mesh.name !== 'Plane') mesh.material.color.setRGB(0.3, 0.3, 0.3);
- });
- bracketModels[_this3.type].object = object;
- bracketModels[_this3.type].loaded = true;
- func && func(object);
- });
- return bracketModels[this.type];
- }
- if (this.type == 'ground_2') {
- // 高度1.56m
- var scaleXYZ = 0.5;
- bracketModels[this.type] = {
- object: null,
- height: 1.59 * scaleXYZ,
- loaded: false
- };
- loaders.gltf(texture.getImageURL('images/brackets/bracket_2.glb'), function (model) {
- var object = model.scene;
- object.children.forEach(function (mesh) {
- if (mesh.name == 'dizuo001') mesh.material.opacity = 0.6;else mesh.material.color.setRGB(0.3, 0.3, 0.3);
- });
- object.scale.set(scaleXYZ, scaleXYZ, scaleXYZ);
- object.position.y += 0.01;
- bracketModels[_this3.type].object = object;
- bracketModels[_this3.type].loaded = true;
- func && func(object);
- });
- }
- }
- }, {
- key: "switchTranformControls",
- value: function switchTranformControls(controls) {
- // switch (this.type) {
- // case 'ground_1':
- // // 只允许沿y轴旋转
- // controls.filterRotateAxis(['y'])
- // break
- // default:
- // controls.filterRotateAxis()
- // break
- // }
- // switch (this.type) {
- // case 'ground_2':
- // // 沿着水平面平移
- // controls.space = controls.mode == 'translate' ? 'world' : 'local'
- // break
- // default:
- // controls.space = 'local'
- // break
- // }
- // switch (this.type) {
- // case 'ground_2':
- // // y轴旋转整个支架,沿世界坐标系旋转;x轴z轴只旋转parts.body,沿本地坐标系旋转
- // controls.spaceForRotate = { x: 'local', y: 'world', z: 'local' }
- // break
- // default:
- // controls.spaceForRotate = null
- // break
- // }
- // 变换TranformControls对象
- if (controls.mode == 'scale' || controls.mode == 'translate' && this.type.indexOf('wall') > -1) {
- // 缩放、边框位移:以overlay为对象
- controls.attach(this.overlay);
- } else {
- // 旋转、支架位移:以overlayFrame为对象
- controls.attach(this);
- }
- } // 移除
- }, {
- key: "remove",
- value: function remove(isFromInfo) {
- this.removeFromParent();
- if (!isFromInfo) {
- // 数据回退时,坐标已变为数据库数据,无需重新计算
- // 重新计算overlay坐标
- var _this$computeOverlayT3 = this.computeOverlayTransform({
- reverse: true
- }),
- position = _this$computeOverlayT3.position,
- quaternion = _this$computeOverlayT3.quaternion;
- this.overlay.position.copy(position);
- this.overlay.quaternion.copy(quaternion);
- }
- } // 销毁
- }, {
- key: "dispose",
- value: function dispose(isFromInfo) {
- this.remove(isFromInfo);
- this.traverse(function (obj) {
- if (obj.isMesh) {
- obj.geometry.dispose();
- obj.material.dispose();
- }
- });
- }
- }]);
- return OverlayFrame;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- /*
- 目前只有box视频一种。分为带厚度和不带厚度两种。不带厚度时只有一个plane,带厚度时要加上一个五个面的box,这样刚好组成完整的box(变换中心调整至box背部)。
- */
- var isEdit$1;
- var fileSizeMax = {
- photo: 10,
- video: 50
- };
- var Overlay = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Overlay, _THREE$Object3D);
- var _super = _createSuper$1u(Overlay);
- function Overlay(player, info, videoPlayer) {
- var _this;
- _classCallCheck(this, Overlay);
- _this = _super.call(this);
- isEdit$1 = !player.$app.config.view;
- _this.player = player;
- _this._planeGeometry = new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height, 1, 1);
- _this._boxGeometry = new THREE.BoxBufferGeometry(settings$3.overlay.width, settings$3.overlay.height, settings$3.overlay.depth); //ie的mesh 加了polygonOffset也是会重叠。所以去掉前面的face: (但是突然ie又播放不了videoTexture)
- var newIndex = _toConsumableArray(_this._boxGeometry.index.array);
- newIndex.splice(4 * 6, 6);
- _this._boxGeometry.setIndex(new THREE.BufferAttribute(new Uint16Array(newIndex), 1));
- _this._boxMat = new THREE.MeshBasicMaterial({
- //MeshStandardMaterial
- color: '#eeeeee',
- transparent: !0,
- opacity: 0.8
- });
- _this.videoPlayer = videoPlayer;
- _this.isHidden = false; // 用于标识是否设置可视
- info.reverse == void 0 && (info.reverse = false);
- info.limitToOnlyPano == void 0 && (info.limitToOnlyPano = false); //仅在当前点显示
- _this.cornerPoints = [];
- _this.info = info;
- _this.sid = info.sid;
- _this.build(info);
- _this.name = 'overlay_' + _this.sid;
- _this.floor = _this.player.model.floors.get(info.subgroup || info.floorIndex) || _this.raycastToFindFloor();
- _this.updateVisibleOnFloor();
- _this.addEventListener('isVisible', function (e) {
- if (_this.player.EditOverlay.editPlane != _assertThisInitialized(_this)) return;
- _this.player.EditOverlay.controlSelectOverlay(e.visible ? _assertThisInitialized(_this) : null);
- });
- return _this;
- }
- _createClass(Overlay, [{
- key: "show",
- value: function show() {
- var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- //console.error('show', reason)
- common$1.updateVisible(this, reason, true);
- this.frame && this.frame.show();
- if (reason == 'forceHide') {
- this.isHidden = false;
- }
- }
- }, {
- key: "hide",
- value: function hide() {
- var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- //console.error('hide', reason)
- common$1.updateVisible(this, reason, false);
- this.frame && this.frame.hide();
- if (reason == 'forceHide') {
- this.isHidden = true;
- }
- }
- }, {
- key: "raycastToFindFloor",
- value: function raycastToFindFloor() {
- //add
- this.floor = convertTool.raycastToFindFloor(this.player, this.plane.getWorldPosition(new THREE.Vector3()));
- if (!this.floor) {
- console.error('Overlay raycastToFindFloor cannot find floor?');
- this.floor = this.player.model.floors.first();
- }
- return this.floor;
- }
- }, {
- key: "updateVisibleOnFloor",
- value: function updateVisibleOnFloor(info) {
- //仅飞出后需要按楼层显示
- 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)) ||
- //this.info.hide
- ) {
- this.hide('visiOnFloor');
- } else {
- this.show('visiOnFloor');
- }
- } //注:楼层切换时的控制写在floor.show里
- }, {
- key: "build",
- value: function build(info) {
- var _this2 = this;
- this.modified = info.modified;
- var plane = new THREE.Mesh(this._planeGeometry, new THREE.MeshBasicMaterial({
- //MeshStandardMaterial
- color: Colors.mainColor,
- opacity: 0.4,
- transparent: !0,
- polygonOffset: true,
- //是否开启多边形偏移 //ie不开启时blank也不会闪烁
- polygonOffsetFactor: -0.9,
- //多边形偏移因子
- polygonOffsetUnits: -4.0 //多边形偏移单位
- }));
- plane.renderOrder = RenderOrder.overlay;
- this.add(plane);
- this.plane = plane;
- this.player.OverlayManager.add(this);
- if (config$6.mobile && info.fileSize > (1 << 20) * fileSizeMax[info.media[0]]) {
- info.type = 'photo';
- info.media = texture.getWarnImg('overWeight', config$6.i18n('viewer.toast.mobileFileMaxToast') || '抱歉,文件较大手机无法展示,建议用电脑打开。', 420, true); //['抱歉,文件较大手机无法展示,', '建议用电脑打开。']
- plane.material.color = new THREE.Color(1, 1, 1);
- info.overWeight = true;
- this.dispatchEvent({
- type: 'mapLoaded'
- });
- } else {
- if (info.media) {
- // console.error(info)
- if (info.media.includes('video')) {
- info.type = 'video';
- if (isEdit$1) {
- this.loadVideo();
- this.videoControl(true);
- } else {
- //展示页面延迟加载,且监控,可见才播放(如果支持多个视频,这段要去掉,改为overlayManager里addSliceListen的那段)
- this.player.on('view.changed', function () {
- var time = _this2.info.media instanceof HTMLVideoElement ? 1000 : 200; //加载需要时间,所以未加载时缩短判断间隔
- common$1.intervalTool.isWaiting('overlayInsight_' + _this2.player.model.sid, function () {
- //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
- if (!_this2.player.flying) {
- //飞行时不判断
- if (_this2.visible && _this2.inSight()) {
- _this2.videoControl(true);
- } else {
- _this2.videoControl(false);
- }
- }
- }, time);
- });
- }
- } else if (info.media.includes('photo')) {
- var img = new Image();
- img.crossOrigin = 'anonymous';
- if (this.info.isBillboard) {
- img.src = this.getMapSrc();
- } else {
- img.src = this.player.$app.resource.getUserResourceURL(info.poster);
- }
- img.onload = function () {
- _this2.dispatchEvent({
- type: 'mapLoaded'
- });
- };
- info.media = img;
- info.type = 'photo';
- }
- plane.material.color = new THREE.Color(1, 1, 1);
- }
- }
- if (info.width == void 0) info.width = settings$3.overlay.width;
- if (info.height == void 0) info.height = settings$3.overlay.height;
- this.setFromInfo(info);
- }
- }, {
- key: "loadVideo",
- value: function loadVideo() {
- if (this.info.media instanceof HTMLVideoElement) return this.info.media; //已加载
- this.info.media = this.videoPlayer.getVideo(this.info.sid, null, this.info.url); //注:部分视频手机播放不了(.webm的之前没转为mp4, 得用url,但是flv也无,也要判断下)
- this.info.media.addEventListener('ended', function () {
- info.media.play();
- if (info.media.paused) ;
- });
- this.setFromInfo(this.info);
- this.plane.material.needsUpdate = true; //console.log('loadVideo成功')
- return this.info.media;
- }
- }, {
- key: "setFromInfo",
- value: function setFromInfo(info) {
- var _this3 = this;
- //1 恢复到编辑之前 2 初始加载
- var plane = this.plane;
- info.width && (this.scale.setX(info.width / settings$3.overlay.width), this.width = info.width);
- info.height && (this.scale.setY(info.height / settings$3.overlay.height), this.height = info.height);
- !isNaN(info.depth) && (this.depth = info.depth);
- info.pos instanceof Array && (info.pos = new THREE.Vector3().fromArray(info.pos));
- info.qua instanceof Array && (info.qua = new THREE.Quaternion().fromArray(info.qua));
- info.pos && this.position.copy(info.pos);
- info.qua && this.quaternion.copy(info.qua);
- info.reverse && (this.scale.x *= -1);
- this.isHidden = info.hide;
- common$1.updateVisible(this, 'forceHide', !this.isHidden);
- if (info.type) {
- if (!plane.material.map) {
- if (info.type == 'video') {
- if (!(this.info.media instanceof HTMLVideoElement)) return;
- var map = new THREE.VideoTexture(info.media);
- plane.material.map = map;
- if (!isEdit$1) {
- var needsUpdate_ = map.needsUpdate;
- Object.defineProperty(map, 'needsUpdate', {
- get: function get() {
- return needsUpdate_;
- },
- set: function set(value) {
- needsUpdate_ = !_this3.info.media.paused && value; //增加判断:是否在播放,不在播放就不更新贴图
- if (needsUpdate_) {
- //old set needsUpdate
- map.version++;
- map.source.needsUpdate = true;
- }
- }
- });
- }
- } else {
- plane.material.map = new THREE.Texture(info.media);
- if (info.overWeight) {
- var _plane$material$map$i = plane.material.map.image,
- width = _plane$material$map$i.width,
- height = _plane$material$map$i.height;
- var repeat = new THREE.Vector2(1, 1),
- offset = new THREE.Vector2(0, 0);
- var r1 = width / height,
- r2 = info.width / info.height;
- if (r1 > r2) {
- repeat.y = r1 / r2;
- offset.y = -repeat.y / 2;
- } else {
- repeat.x = r2 / r1;
- }
- plane.material.map.repeat.copy(repeat);
- plane.material.map.offset.set(-(repeat.x - 1) / 2, -(repeat.y - 1) / 2);
- }
- plane.material.map.needsUpdate = true;
- }
- plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
- plane.material.map.minFilter = THREE.LinearFilter; //LinearMipMapLinearFilter 会被缩放到power of 2
- plane.material.map.magFilter = THREE.LinearFilter;
- plane.material.map.anisotropy = 4;
- plane.material.map.generateMipmaps = false;
- plane.material.opacity = 1;
- } else {
- plane.material.map.image = info.media; //plane.material.map.needsUpdate = true
- plane.material.map.dispose(); //为什么要加这句才能替换成功
- }
- this.file = info.file;
- }
- this.overlayType = info.type;
- if (!info.frameType && !this.info.isBillboard) info.frameType = 'wall_1'; // 兼容旧数据
- this.info.isBillboard || this.addFrame(info.frameType, this.modified !== 'new'); // 需要区分新增数据还是数据库数据
- this.limitToOnlyPano = info.limitToOnlyPano ? this.player.model.panos.index[info.limitToOnlyPano] : false;
- this.limitToOnlyPano && this.limitToOnlyPano != this.player.currentPano && this.hide('limitToOnlyPano');
- this.visiblePanos = convertTool.getVisiblePano(this.plane.getWorldPosition(new THREE.Vector3()), this.player.model); //console.log('visiblePanos',this.sid, this.visiblePanos.map(e=>e.id))
- }
- }, {
- key: "addFrame",
- value: function addFrame(frameType, isFromInfo) {
- // 没有边框直接添加,有不同的边框先删旧的再添加
- if (!this.frame || this.frame.type !== frameType || isFromInfo) {
- if (this.frame) {
- this.frame.dispose(isFromInfo);
- this.frame = null;
- }
- if (frameType) {
- // 其他边框替换为wall_1时要重新赋值厚度,初始化或回退的时候不用管
- if (!isFromInfo && frameType == 'wall_1') {
- // depth是实际厚度,depthTemp用于暂存wall_1的厚度
- this.depth = this.depthTemp;
- }
- var frame = new OverlayFrame(frameType);
- frame.setOverlay(this, isFromInfo);
- this.player.OverlayManager.frameGroup.add(frame);
- }
- } else {
- // 相同边框 根据overlay重新计算frame
- var _this$frame$computeOv = this.frame.computeOverlayTransform({
- reverse: true
- }),
- position = _this$frame$computeOv.position,
- quaternion = _this$frame$computeOv.quaternion;
- this.frame.position.copy(position);
- this.frame.quaternion.copy(quaternion);
- }
- }
- }, {
- key: "dispose",
- value: function dispose() {
- if (this.plane.material.map) {
- //清空video
- var video = this.plane.material.map.image;
- if (video && video.load) {
- video.src = '';
- video.load();
- }
- }
- this.plane.material.dispose();
- this.plane.material.map = null;
- this.parent.remove(this);
- }
- }, {
- key: "inSight",
- value: function inSight() {
- if (isEdit$1) return true; // 太容易move了
- if (this.player.mode == 'panorama' && this.player.currentPano) {
- if (this.visiblePanos && !this.visiblePanos.includes(this.player.currentPano)) return false; //最好保存下visiblePanos
- if (!this.player.camera) return;
- var cornerPointInfo = this.getCornerPoint();
- var cornerPoint;
- var min = new THREE.Vector2(2, 2);
- var scaleRatio = 1 / this.player.zoomLevel; //根据media原始大小来调整阈值: media的原始大小能代表期望显示的大小,如果显示大小的远小于期望大小,就不显示(此时能感受到贴图锯齿严重,清晰度被浪费)。比如如果gif是一个很小的按钮,即使diffLon很小也要显示。缺点:需要用户根据所需上传合适清晰度的图。
- var size = this.getMediaSize();
- if (size.x > 0) {
- scaleRatio *= Math.sqrt(size.x * size.y) / 1000;
- }
- min.multiplyScalar(scaleRatio);
- if (cornerPointInfo.diffLon < min.x || cornerPointInfo.diffLat < min.y) {
- //console.log('two far and small')
- return false;
- }
- if (cornerPointInfo.diffLon < 15 && cornerPointInfo.diffLat < 15) {
- //当很小的时候,只判断中心点即可
- cornerPoint = [cornerPointInfo.cornerPoint[0]];
- } else {
- cornerPoint = cornerPointInfo.cornerPoint;
- }
- for (var i = 0, j = cornerPoint.length; i < j; i++) {
- //只要有一点可见就算看见
- var pos2d = convertTool.getPos2d(cornerPoint[i], this.player);
- if (pos2d.trueSide && pos2d.inSight) return true;
- }
- } else {
- //飞出 只判断在不在画面内
- var frustumMatrix = new THREE.Matrix4();
- frustumMatrix.multiplyMatrices(this.player.camera.projectionMatrix, this.player.camera.matrixWorldInverse);
- var frustum = new THREE.Frustum();
- frustum.setFromProjectionMatrix(frustumMatrix);
- if (!this.plane.geometry.boundingBox) {
- this.plane.geometry.computeBoundingBox();
- }
- var bounding = this.plane.geometry.boundingBox.clone().applyMatrix4(this.matrixWorld);
- return frustum.intersectsBox(bounding);
- }
- }
- }, {
- key: "getMediaSize",
- value: function getMediaSize() {
- var size = new THREE.Vector2();
- if (this.info.media instanceof Image) {
- size.x = this.info.media.width;
- size.y = this.info.media.height;
- } else if (this.info.media instanceof HTMLVideoElement) {
- size.x = this.info.media.videoWidth || 1000;
- size.y = this.info.media.videoHeight || 1000;
- } else {
- size.x = 1000;
- size.y = 1000;
- }
- return size;
- }
- }, {
- key: "getCornerPoint",
- value: function getCornerPoint() {
- var _this4 = this;
- //获取在每个漫游点上的视觉边界点 可以打开boxHelper和addBall来观测是否准确
- if (this.cornerPoints[this.player.currentPano.id]) {
- return this.cornerPoints[this.player.currentPano.id];
- } else {
- var boundPoint, cornerPoint;
- var center; //中心点
- if (this.plane) {
- center = this.plane.getWorldPosition(new THREE.Vector3());
- 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)];
- }
- var maxLon = -Infinity;
- var minLon = +Infinity;
- var maxLat = -Infinity;
- var minLat = +Infinity;
- var pos1 = this.player.currentPano.position.clone();
- center = this.position.clone(); //模型bound的中心点已经位移到了hot中心点。 注意不能用getWorldPosition,得到的会是偏移的
- var dir = center.clone().sub(pos1).normalize();
- var centerDirInfo = {};
- this.player.cameraControls.controls.panorama.lookAt.call(centerDirInfo, null, dir);
- boundPoint.forEach(function (e) {
- //lon左右
- var point = e.applyMatrix4(_this4.plane.matrixWorld);
- var dir = point.clone().sub(pos1).normalize();
- var dirInfo = {};
- _this4.player.cameraControls.controls.panorama.lookAt.call(dirInfo, null, dir);
- var diffLon = (dirInfo.lon - centerDirInfo.lon) % 360;
- if (Math.abs(diffLon) > 180) {
- //因为有时需要根据符号判断是在中心的左边还是右边,所以限制在180内
- diffLon += diffLon > 0 ? -360 : 360;
- }
- var diffLat = dirInfo.lat - centerDirInfo.lat;
- maxLon = Math.max(diffLon, maxLon);
- minLon = Math.min(diffLon, minLon);
- maxLat = Math.max(diffLat, maxLat);
- minLat = Math.min(diffLat, minLat);
- });
- var diffLon = maxLon - minLon;
- var diffLat = maxLat - minLat;
- if (diffLat > 180) {
- //可能是到了反面。不好算,直接返回所有boundPoint
- cornerPoint = boundPoint;
- } else {
- //读取lon lat的最大最小值,勾勒出一个没有倾斜的矩形 。它比boundPoint看起来范围更大些
- maxLon = maxLon + centerDirInfo.lon;
- maxLat = maxLat + centerDirInfo.lat;
- minLon = minLon + centerDirInfo.lon;
- minLat = minLat + centerDirInfo.lat;
- var dirs = [math$2.getDirByLonLat(maxLon, maxLat), math$2.getDirByLonLat(minLon, minLat), math$2.getDirByLonLat(maxLon, minLat), math$2.getDirByLonLat(minLon, maxLat)];
- cornerPoint = dirs.map(function (a) {
- return a.negate().add(pos1);
- });
- cornerPoint = [center].concat(_toConsumableArray(cornerPoint)); //最后增加一个中心点
- }
- /* if(this.objObject){
- cornerPoint = [pos2, ...cornerPoint]
- } */
- //addPoints(cornerPoint)
- this.cornerPoints[this.player.currentPano.id] = {
- cornerPoint,
- diffLon,
- diffLat
- };
- return this.cornerPoints[this.player.currentPano.id];
- }
- }
- }, {
- key: "videoControl",
- value: function videoControl(state) {
- var video = this.info.media; //console.log('videoControl',state, this.sid)
- this.shouldPlay = state;
- if (!state || state == 'stop') {
- if (video instanceof HTMLVideoElement && !video.paused) {
- video.pause();
- console.log('videoControl paused ');
- }
- /* if(state == 'stop'){
- video.currentTime = 0;
- } */
- } else if (state) {
- if (video.paused || !(video instanceof HTMLVideoElement)) {
- console.log('videoControl play ');
- video = this.loadVideo();
- video.play(); //if (common.isVideoPlayed(video)) console.log('played ')
- }
- }
- }
- }]);
- return Overlay;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- function exitFullScreen() {
- if (document.fullscreenElement && document.fullscreenElement.tagName === 'VIDEO' && document.fullscreenElement.getAttribute('unfullscreen')) {
- if (document.exitFullscreen) {
- document.exitFullscreen();
- } else if (document.msExitFullscreen) {
- document.msExitFullscreen();
- } else if (document.mozCancelFullScreen) {
- document.mozCancelFullScreen();
- } else if (document.oRequestFullscreen) {
- document.oCancelFullScreen();
- } else if (document.webkitExitFullscreen) {
- document.webkitExitFullscreen();
- } else if (document.webkitCancelFullScreen) {
- document.webkitCancelFullScreen();
- }
- setTimeout(function () {
- exitFullScreen();
- }, 250);
- }
- }
- if (browser$1.detectAndroidMobile()) {
- //针对Android横屏时video会自动全屏播放的bug #39505 #43421
- window.addEventListener('resize', function () {
- //resize时如果全屏元素为video, 退出全屏
- setTimeout(function () {
- exitFullScreen();
- }, 500); //太快可能检测不到document.fullscreenElement
- });
- window.addEventListener('orientationchange', function (e) {
- // 空间视频横屏时会触发自动全屏
- if (window.orientation == 0 || window.orientation == 180) {
- //竖屏
- var videos = document.querySelectorAll('video[box]'); //只针对有box属性的video标签(空间视频)
- videos.forEach(function (item) {
- item.remove();
- });
- setTimeout(function () {
- videos.forEach(function (i) {
- document.body.appendChild(i);
- i.play();
- });
- }, 500);
- } else {
- // 横屏
- var _videos = document.querySelectorAll('video[box]');
- _videos.forEach(function (item) {
- item.remove();
- });
- setTimeout(function () {
- _videos.forEach(function (i) {
- document.body.appendChild(i);
- i.play();
- });
- }, 500);
- }
- });
- }
- var FlvVideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
- _inherits(FlvVideoPlayerBase, _EventEmitter);
- var _super = _createSuper$1t(FlvVideoPlayerBase);
- function FlvVideoPlayerBase(player) {
- var _this;
- _classCallCheck(this, FlvVideoPlayerBase);
- _this = _super.call(this);
- _this.player = player;
- _this.instances = new Map();
- _this.video = null;
- return _this;
- } //overlay info -- [metadata.overlay]
- _createClass(FlvVideoPlayerBase, [{
- key: "addVideo",
- value: function addVideo(sid) {
- var instance = this._createVideo(this._getVideoPath(sid));
- this.instances.set(sid, instance);
- instance.videoElement.masters = []; //一个video可以对应多个主体,因为它们链接一样
- return instance;
- }
- }, {
- key: "getVideo",
- value: function getVideo(sid, master) {
- var instance = this.instances.get(sid);
- if (!instance) {
- instance = this.addVideo(sid);
- }
- master && instance.videoElement.masters.push(master);
- return instance.videoElement;
- }
- }, {
- key: "_getVideoPath",
- value: function _getVideoPath(sid) {//在子类中扩展
- }
- }, {
- key: "_createVideo",
- value: function _createVideo(url) {
- var _this2 = this;
- var video = document.createElement('video');
- video.setAttribute('crossOrigin', 'anonymous');
- video.setAttribute('playsinline', 'true');
- video.setAttribute('webkit-playsinline', 'true');
- video.setAttribute('controls', 'true');
- video.setAttribute('unfullscreen', 'true');
- video.autoplay = false;
- video.muted = true;
- video.loop = true;
- video.style.position = 'fixed';
- video.style.left = '0';
- video.style.top = '0';
- video.style.zIndex = '0';
- video.style.width = '1px'; // video.style.display = 'none'
- //video.isFirstPlay = true;
- video.style.opacity = '0';
- document.body.appendChild(video);
- video.player = this;
- var player = flvjs.createPlayer({
- type: 'flv',
- url: url
- });
- player.videoElement = video;
- player.attachMediaElement(video);
- player.on(flvjs.Events.ERROR, function () {
- _this2._onPlayerError();
- console.log('尝试使用mp4链接进行播放');
- video.src = url.replace('.flv', '.mp4');
- });
- player.load();
- return player;
- }
- }, {
- key: "_onPlayerError",
- value: function _onPlayerError() {
- console.warn('视频加载失败');
- }
- }]);
- return FlvVideoPlayerBase;
- }(EventEmitter);
- 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); }; }
- 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; } }
- var FlvVideoPlayer$2 = /*#__PURE__*/function (_FlvVideoPlayerBase) {
- _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
- var _super = _createSuper$1s(FlvVideoPlayer);
- function FlvVideoPlayer(player) {
- _classCallCheck(this, FlvVideoPlayer);
- return _super.call(this, player);
- }
- _createClass(FlvVideoPlayer, [{
- key: "_createVideo",
- value: function _createVideo(url) {
- var video = document.createElement('video');
- video.setAttribute('crossOrigin', 'anonymous');
- video.setAttribute('playsinline', 'true');
- video.setAttribute('webkit-playsinline', 'true');
- video.setAttribute('controls', 'true');
- video.setAttribute('box', 'true');
- video.setAttribute('unfullscreen', 'true');
- video.autoplay = false;
- video.muted = true;
- video.loop = true;
- video.style.position = 'fixed';
- video.style.left = '0';
- video.style.top = '0';
- video.style.zIndex = '0';
- video.style.width = '1px'; // video.style.display = 'none'
- //video.isFirstPlay = true;
- video.style.opacity = '0';
- document.body.appendChild(video);
- video.player = this;
- var player = flvjs.createPlayer({
- type: 'flv',
- url: url
- });
- player.videoElement = video;
- player.attachMediaElement(video);
- player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
- player.load();
- return player;
- }
- }, {
- key: "_getVideoPath",
- value: function _getVideoPath(sid) {
- // return config.getResourceImageURL(`overlay` + sid + '.flv?m=' + config.version)
- return this.player.$app.resource.getUserResourceURL(sid + '.flv');
- }
- }]);
- return FlvVideoPlayer;
- }(FlvVideoPlayerBase);
- 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); }; }
- 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; } }
- var H5VideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
- _inherits(H5VideoPlayerBase, _EventEmitter);
- var _super = _createSuper$1r(H5VideoPlayerBase);
- function H5VideoPlayerBase(player) {
- var _this;
- _classCallCheck(this, H5VideoPlayerBase);
- _this = _super.call(this);
- _this.player = player;
- _this.video = null;
- _this.videos = new Map();
- return _this;
- } //overlay info -- [metadata.overlay]
- _createClass(H5VideoPlayerBase, [{
- key: "addVideo",
- value: function addVideo(sid) {
- var video = this._createVideoElement(this._getVideoPath(sid));
- this.videos.set(sid, video);
- video.masters = [];
- return video;
- }
- }, {
- key: "getVideo",
- value: function getVideo(sid, master, url) {
- url && (sid = url); //add
- var video = this.videos.get(sid);
- if (!video) {
- video = this.addVideo(sid);
- }
- master && video.masters.push(master);
- return video;
- }
- }, {
- key: "_getVideoPath",
- value: function _getVideoPath(sid) {
- // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
- return this.player.$app.resource.getUserResourceURL(sid + '.mp4');
- }
- }, {
- key: "_createVideoElement",
- value: function _createVideoElement(src) {
- var video = document.createElement('video');
- video.setAttribute('crossOrigin', 'anonymous');
- video.setAttribute('playsinline', 'true');
- video.setAttribute('x5-playsinline', 'true');
- video.setAttribute('webkit-playsinline', 'true');
- video.setAttribute('x5-video-player-type', 'h5');
- video.setAttribute('controls', 'true');
- video.setAttribute('x-webkit-airplay', 'allow');
- video.autoplay = true;
- video.muted = true;
- video.loop = true;
- video.src = src;
- video.style.position = 'fixed';
- video.style.left = '0';
- video.style.top = '0';
- video.style.zIndex = '1000';
- video.style.width = '300px';
- video.style.height = '300px'; //video.style.display = browser.urlHasValue('debug') ? 'block' : 'none'
- //document.body.appendChild(video)
- return video;
- }
- }]);
- return H5VideoPlayerBase;
- }(EventEmitter);
- 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); }; }
- 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; } }
- var H5VideoPlayer$2 = /*#__PURE__*/function (_H5VideoPlayerBase) {
- _inherits(H5VideoPlayer, _H5VideoPlayerBase);
- var _super = _createSuper$1q(H5VideoPlayer);
- function H5VideoPlayer(player) {
- _classCallCheck(this, H5VideoPlayer);
- return _super.call(this, player);
- }
- /* _getVideoPath(sid) {
- // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
- return this.player.$app.resource.getUserResourceURL(sid + '.mp4')
- } */
- _createClass(H5VideoPlayer, [{
- key: "_getVideoPath",
- value: function _getVideoPath(url) {
- //支持webm
- return this.player.$app.resource.getUserResourceURL(url);
- }
- }]);
- return H5VideoPlayer;
- }(H5VideoPlayerBase);
- var app$1;
- var store;
- function intStore() {
- store = {
- version: 1,
- upPath: '',
- // videoPath: 'https://4dkk.4dage.com/video/videot-FSVqkqQ0Bi/', //config.getPublicResource("video/video#m#/"), ${this.$app.config.num}
- // videoPath: config.getResourceURL('video/video' + window.kankan.config.num + '/'),
- videoPath: app$1.resource.getViewResourceURL('video/'),
- // scene_view_data/t-RGjyzx4/videos/ config.getResourceURL('video/video/'),
- videoInfos: new Map(),
- parameters: {
- inputWidth: 0,
- inputHeight: 0,
- outputWidth: 0,
- outputHeight: 0,
- focal: 0,
- pixel: 0,
- centerX: 0,
- centerY: 0,
- translateX: 0,
- translateY: 0,
- translateZ: 0,
- lenOffsetX: 0,
- lenOffsetY: 0,
- videoWidth: 0,
- videoHeight: 0,
- mapping: 0,
- //0-只对x轴做了clip 1-对中央固定区域做clip 2-动态clip
- cameraType: 0,
- blend_fov: 5
- }
- };
- }
- function handle(sceneMeta, sdk) {
- app$1 = sdk;
- if (!store) intStore();
- var imagesVersion = '';
- if (typeof sceneMeta.version != 'undefined') {
- imagesVersion = '?imagesVersion=' + sceneMeta.version;
- }
- if (!sceneMeta.videos) {
- sceneMeta.videos = {
- version: store.version,
- videos: store.videoInfos,
- parameters: store.parameters
- };
- mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
- return;
- } else {
- try {
- var checkvideos = sceneMeta.videos;
- if (!checkvideos.data || !checkvideos.data.length) {
- sceneMeta.videos = {
- version: store.version,
- videos: store.videoInfos,
- parameters: store.parameters
- };
- mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
- return;
- }
- } catch (err) {
- console.error(err);
- }
- }
- var sceneFrom = sceneMeta.sceneFrom || 'pro';
- if (sceneFrom == 'pro') {
- //8目
- var videosInfo = sceneMeta.videos;
- var version = videosInfo.version || 0;
- store.version = version;
- store.parameters.cameraType = 8;
- if (version == 1) {
- videosInfo.data.forEach(function (item) {
- store.videoInfos.set(item.id, {
- mp4: {
- url: store.videoPath + item.id + '.mp4' + imagesVersion
- },
- mpeg: {
- url: store.videoPath + item.id + '.ts',
- size: item.tsSize + imagesVersion
- },
- flv: {
- url: store.videoPath + item.id + '.flv' + imagesVersion
- },
- //Test,
- exposure: Number(item.value) || 1,
- mapping: 0,
- cameraType: 8,
- blend_fov: item.blend_fov || 5
- });
- });
- } else if (version > 1) {
- videosInfo.data.forEach(function (item) {
- store.videoInfos.set(item.id, {
- mp4: {
- url: store.videoPath + item.id + '.mp4' + imagesVersion
- },
- mpeg: {
- url: store.videoPath + item.id + '.ts' + imagesVersion,
- size: item.tsSize
- },
- flv: {
- url: store.videoPath + item.id + '.flv' + imagesVersion
- },
- exposure: Number(item.value) || 1,
- mapping: 1,
- cameraType: 8,
- blend_fov: item.blend_fov || 5
- });
- });
- }
- return loadParameterFor8Cameras(videosInfo.upPath).then(function (store) {
- if (version <= 2) {
- store.parameters.inputWidth = 2304;
- store.parameters.inputHeight = 1728;
- store.parameters.outputWidth = 2048;
- store.parameters.outputHeight = 1024;
- } else if (version > 2) {
- store.parameters.inputWidth = 4608;
- store.parameters.inputHeight = 3456;
- store.parameters.outputWidth = 8192;
- store.parameters.outputHeight = 4096;
- store.parameters.lenOffsetX = 1235;
- store.parameters.lenOffsetY = 954;
- store.parameters.videoWidth = 2112;
- store.parameters.videoHeight = 1584;
- store.parameters.mapping = 1;
- }
- sceneMeta.videos = {
- version: store.version,
- videos: store.videoInfos,
- parameters: store.parameters
- }; // 将新的方案数据融合进来
- mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
- return store;
- }).catch(function (error) {
- throw error;
- });
- } else if (sceneFrom == 'lite') {
- //2目
- var _videosInfo = sceneMeta.videos;
- var _version = _videosInfo.version || 0;
- store.version = _version;
- store.parameters.cameraType = 2;
- var _imagesVersion = '';
- if (typeof sceneMeta.version != 'undefined') {
- _imagesVersion = '?imagesVersion=' + sceneMeta.version;
- }
- if (_version == 1) {
- _videosInfo.data.forEach(function (item) {
- store.videoInfos.set(item.id, {
- mp4: {
- url: store.videoPath + item.id + '.mp4' + _imagesVersion
- },
- mpeg: {
- url: store.videoPath + item.id + '.ts',
- size: item.tsSize + _imagesVersion
- },
- flv: {
- url: store.videoPath + item.id + '.flv' + _imagesVersion
- },
- //Test,
- exposure: Number(item.value) || 1,
- mapping: 1,
- cameraType: 2,
- blend_fov: item.blend_fov || 5
- });
- });
- }
- return loadParameterFor2Cameras(_videosInfo.upPath).then(function (store) {
- if (_version == 1) {
- store.parameters.inputWidth = 3000;
- store.parameters.inputHeight = 3000;
- store.parameters.outputWidth = 4096;
- store.parameters.outputHeight = 2048;
- store.parameters.pixel = 1.12;
- }
- sceneMeta.videos = {
- version: store.version,
- videos: store.videoInfos,
- parameters: store.parameters
- };
- return store;
- }).catch(function (error) {
- throw error;
- });
- } else if (sceneFrom == 'minion' || sceneFrom == 'laser') {
- //转台双目
- var _videosInfo2 = sceneMeta.videos;
- var _version2 = _videosInfo2.version || 0;
- store.version = _version2;
- store.parameters.cameraType = 3;
- var _imagesVersion2 = '';
- if (typeof sceneMeta.version != 'undefined') {
- _imagesVersion2 = '?imagesVersion=' + sceneMeta.version;
- }
- _videosInfo2.data.forEach(function (item) {
- store.videoInfos.set(item.id, {
- mp4: {
- url: store.videoPath + item.id + '.mp4' + _imagesVersion2
- },
- mpeg: {
- url: store.videoPath + item.id + '.ts',
- size: item.tsSize + _imagesVersion2
- },
- flv: {
- url: store.videoPath + item.id + '.flv' + _imagesVersion2
- },
- //Test,
- exposure: Number(item.value) || 1,
- mapping: 1,
- cameraType: 3,
- blend_fov: item.blend_fov || 5
- });
- });
- return loadParameterForRotStereoCameras(_videosInfo2.upPath).then(function (store) {
- store.parameters.inputWidth = 5472;
- store.parameters.inputHeight = 3648;
- store.parameters.outputWidth = 4096;
- store.parameters.outputHeight = 2048;
- store.parameters.lenOffsetX = 920;
- store.parameters.lenOffsetY = 500;
- store.parameters.videoWidth = 3630;
- store.parameters.videoHeight = 2670;
- store.parameters.pixel = 1.12;
- sceneMeta.videos = {
- version: store.version,
- videos: store.videoInfos,
- parameters: store.parameters
- };
- mergeNewPanoVideo(store, sceneMeta['videosUser'], _imagesVersion2); //add
- return store;
- }).catch(function (error) {
- throw error;
- });
- } else {
- console.warn('有尚不支持的相机来源:', sceneFrom);
- }
- }
- /**
- * @type Promise
- */
- var loadParameterPromise = null;
- function loadParameterFor8Cameras(url) {
- if (loadParameterPromise) return loadParameterPromise;
- loadParameterPromise = new Promise(function (resolve, reject) {
- if (!url) reject('找不到参数请求地址');
- if (!/^http(s?)/.test(url)) {
- url = app$1.resource.getResourceURL(url);
- }
- http.getText(url).then(function (text) {
- return resolve(text);
- }).catch(function (reson) {
- return reject(reson);
- });
- }).then(function (text) {
- var formatted = text.split(/\n/).filter(function (item) {
- return item.trim() != '';
- }) //空行分割取第一个
- .map(function (item) {
- return item.split(':');
- });
- var focal = Number(formatted[0][1]);
- var pixel = Number(formatted[1][1]);
- var center = formatted[2][1].trim().split(/\s+/).map(function (item) {
- return Number(item);
- });
- var translateX = formatted[7][0].trim().split(/\s+/).map(function (item) {
- return Number(item);
- })[3],
- translateY = formatted[8][0].trim().split(/\s+/).map(function (item) {
- return Number(item);
- })[3],
- translateZ = formatted[9][0].trim().split(/\s+/).map(function (item) {
- return Number(item);
- })[3];
- store.parameters.focal = focal;
- store.parameters.pixel = pixel;
- store.parameters.centerX = center[0];
- store.parameters.centerY = center[1];
- store.parameters.translateX = translateX;
- store.parameters.translateY = translateY;
- store.parameters.translateZ = translateZ;
- return store;
- }).catch(function (error) {
- console.warn('球幕视频【八目】:参数文件加载失败', error);
- return store;
- }).finally(function () {
- return store;
- });
- return loadParameterPromise;
- }
- function loadParameterFor2Cameras(url) {
- if (loadParameterPromise) return loadParameterPromise;
- loadParameterPromise = new Promise(function (resolve, reject) {
- if (!url) reject('找不到参数请求地址');
- if (!/^http(s?)/.test(url)) {
- url = app$1.resource.getResourceURL(url);
- }
- http.getText(url, null, function (text) {
- resolve(text);
- }, function (reson) {
- reject(reson);
- });
- }).then(function (text) {
- var properties = {};
- text.split('\n').map(function (line) {
- if (line.length > 0) {
- var keyValueParse = line.split(':');
- var key = keyValueParse[0];
- var values = keyValueParse[1].trim().split(' ');
- properties[key] = Number(values[0]);
- }
- });
- store.parameters.focal = properties['focal'];
- store.parameters.centerX = properties['cx'];
- store.parameters.centerY = properties['cy'];
- store.parameters.translateX = properties['tx'];
- store.parameters.translateY = properties['ty'];
- store.parameters.translateZ = properties['tz'];
- return store;
- }).catch(function (error) {
- console.warn('球幕视频【双目】:参数文件加载失败');
- return store;
- }).finally(function () {
- return store;
- });
- return loadParameterPromise;
- }
- function loadParameterForRotStereoCameras(url) {
- // url = url.replace('Uptxt', 'Up.txt')
- if (loadParameterPromise) return loadParameterPromise;
- loadParameterPromise = new Promise(function (resolve, reject) {
- if (!url) reject('找不到参数请求地址');
- if (!/^http(s?)/.test(url)) {
- url = app$1.resource.getResourceURL(url);
- }
- resolve(http.getText(url));
- }).then(function (text) {
- var properties = {};
- text.split('\n').map(function (line) {
- if (line.length > 0) {
- var keyValueParse = line.split(':');
- var key = keyValueParse[0];
- var values = keyValueParse[1].trim().split(' ');
- properties[key] = Number(values[0]);
- }
- });
- store.parameters.focal = properties['focal'];
- store.parameters.centerX = properties['cx'];
- store.parameters.centerY = properties['cy'];
- store.parameters.translateX = properties['rx'];
- store.parameters.translateY = properties['ry'];
- store.parameters.translateZ = properties['rz'];
- return store;
- }).catch(function (error) {
- console.warn('球幕视频【转台】:参数文件加载失败', error);
- return store;
- }).finally(function () {
- return store;
- });
- return loadParameterPromise;
- }
- function mergeNewPanoVideo(store, newScheme, imagesVersion) {
- // if(config.isEdit){
- // return
- // }
- if (!newScheme) return;
- var data = JSON.parse(newScheme);
- data.forEach(function (item) {
- store.videoInfos.set(item.panoId, {
- dir: new THREE.Vector3().copy(item.dir),
- hfov: parseFloat(item.hfov),
- vfov: parseFloat(item.vfov),
- mp4: {
- url: store.videoPath + item.panoId + '-user.mp4' + imagesVersion
- },
- mpeg: {
- url: store.videoPath + item.panoId + '-user.ts',
- size: item.tsSize + imagesVersion
- },
- flv: {
- url: store.videoPath + item.panoId + '-user.flv' + imagesVersion
- },
- //Test,
- exposure: 1,
- clipRect: item.rect,
- mapping: 2
- });
- });
- store.parameters.mapping = 2; //动态clip
- store.parameters.cameraType = 8;
- }
- function getEnvironment() {
- if (!store) intStore();
- /**
- * @type 'PC'|'Android'|'Ios'
- */
- var os = 'PC';
- /**
- * @type 'H5'|'WeChat'|'WeChatMiniprogram'
- */
- var environment = 'H5';
- if (browser$1.detectAndroidMobile()) {
- os = 'Android';
- } else if (browser$1.detectIOS()) {
- os = 'Ios';
- }
- if (browser$1.detectWeixin()) {
- environment = 'WeChat';
- if (navigator.userAgent.match('miniProgram')) {
- environment = 'WeChatMiniprogram';
- }
- }
- return {
- os,
- environment
- };
- }
- var VersionControl = {
- handle: handle,
- getEnvironment: getEnvironment
- };
- 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); }; }
- 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; } }
- var OverlayManager = /*#__PURE__*/function (_EventEmitter) {
- _inherits(OverlayManager, _EventEmitter);
- var _super = _createSuper$1p(OverlayManager);
- function OverlayManager(player) {
- var _this;
- _classCallCheck(this, OverlayManager);
- _this = _super.call(this);
- _this.list = [];
- _this.player = player;
- _this.model = _this.player.model;
- _this.groupRoot = new THREE.Object3D();
- _this.groupRoot.name = 'groupRoot';
- _this.decorateGroup = new THREE.Object3D();
- _this.decorateGroup.name = 'decorateGroup';
- _this.frameGroup = new THREE.Object3D();
- _this.frameGroup.name = 'frameGroup';
- _this.decoratePlaneGroup = new THREE.Object3D();
- _this.decoratePlaneGroup.name = 'decoratePlaneGroup';
- _this.billGroup = new THREE.Object3D();
- _this.billGroup.name = 'billGroup';
- _this.decorateGroup.add(_this.decoratePlaneGroup);
- _this.decorateGroup.add(_this.frameGroup);
- _this.groupRoot.add(_this.billGroup);
- _this.groupRoot.add(_this.decorateGroup);
- _this.model.add(_this.groupRoot); //为了好安排不同类型的可视,只好分层加多个group
- player.OverlayManager = _assertThisInitialized(_this);
- _this.withBox = true;
- _this.lineMat = LineDraw.createFatLineMat({
- depthTest: false,
- lineWidth: 2,
- color: Colors.mainColor,
- opacity: 0.3
- });
- _this.player.$app.core.get('SceneRenderer').addComponent(_assertThisInitialized(_this));
- _this.VideoManager = _this.player.$app.VideoManager;
- var metadata = _this.player.$app.store.getValue('metadata');
- if (metadata.boxVideos && metadata.boxVideos.length) {
- var info = metadata.boxVideos[0]; // let nonsupportH5Video = browser.detectAndroidMobile() //|| browser.detectWeixin() && !browser.detectWeixinMiniProgram() //iphoneX微信不能用flv, vivo
- var _VersionControl$getEn = VersionControl.getEnvironment(),
- os = _VersionControl$getEn.os,
- environment = _VersionControl$getEn.environment;
- if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
- // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
- _this.overlayVideoPlayer = new FlvVideoPlayer$2(_this.player); // console.log('use FlvVideoPlayer')
- } else {
- // console.log('use H5VideoPlayer')
- _this.overlayVideoPlayer = new H5VideoPlayer$2(_this.player);
- } //if (nonsupportH5Video) console.error('nonsupportH5Video')
- // this.overlayVideoPlayer = nonsupportH5Video ? new FlvVideoPlayer(this.player) : new H5VideoPlayer(this.player)
- new Overlay(_this.player, info, _this.overlayVideoPlayer);
- }
- if (metadata.boxPhotos && metadata.boxPhotos.length) {
- metadata.boxPhotos.forEach(function (info) {
- new Overlay(_this.player, info);
- });
- } // let videoEdit = this.VideoManager.BoxVideo.edit
- // this.player.model.on('floor.changed', (toFloor, mode) => {
- // this.group.children.forEach(overlay => {
- // overlay.floor == toFloor ? videoEdit.setVisible(overlay.sid, true) : videoEdit.setVisible(overlay.sid, false)
- // })
- // })
- player.on('collectIntersectMesh', function (meshes) {
- //推送要intersect的mesh
- meshes.push.apply(meshes, _toConsumableArray(_this.list.filter(function (e) {
- return e.realVisible();
- }).map(function (overlay) {
- return overlay.plane;
- })));
- });
- player.on('judgeIntersect', function (intersect, e) {
- //判断是否intersect了overlay
- if (
- /* e.getConsumed() || */
- intersect && (intersect.object.overlayType || intersect.object.parent.overlayType)) {
- _this.hoverOverlay(intersect.object);
- e.consume();
- } else {
- _this.hoverOverlay(null);
- }
- });
- player.on('pointerStart', function () {
- /* this.intersect = player.getMouseIntersect(null, this.group.children.concat(player.model.colliders))
- if (this.intersect && (this.intersect.object.overlayType || this.intersect.object.parent.overlayType)) {
- this.OverlayManager.hoverOverlay(this.intersect.object)
- } else this.OverlayManager.hoverOverlay(null) */
- //for自动播放
- _this.autoPlay();
- });
- player.on(PlayerEvents.FlyingStarted, function (_ref) {
- var panoId = _ref.panoId;
- //if (!this.player.EditOverlay.editPlane) {
- // 当overlay仅限某一点位显示时,其它点位或飞出则需要隐藏.
- _this.list.forEach(function (e) {
- if (e.limitToOnlyPano) {
- if (e.limitToOnlyPano.id != panoId) {
- e.hide('limitToOnlyPano');
- _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', false);
- } else {
- e.show('limitToOnlyPano');
- _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', true);
- }
- }
- }); //}
- });
- if (player.$app.config.view) {
- //展示页面。 不要遮住漫游点视频
- player.on(PlayerEvents.FlyingEnded, function (_ref2) {
- var currentPano = _ref2.currentPano;
- var panoVideoFilter;
- if (player.mode == 'panorama') {
- panoVideoFilter = currentPano.getVideoFilter();
- }
- _this.list.forEach(function (e) {
- if (panoVideoFilter && panoVideoFilter(e.position)) {
- e.hide('coveredPanoVideo');
- } else {
- e.show('coveredPanoVideo');
- }
- });
- }); //展示页面延迟加载,且监控,可见才播放
- _this.list.filter(function (e) {
- return e.info.type == 'video';
- }); //如果多个视频就这么写:
- /* common.batchHandling.addSliceListen({
- getList: () => {
- return videos
- },
- minCount: 0,
- maxCount: 1,
- durBound1: 3,
- durBound2: 13,
- maxHistory: 3,
- player: this.player,
- callback: overlay => {
- if (overlay.visible && overlay.inSight()) {
- overlay.videoControl(true)
- } else {
- overlay.videoControl(false)
- }
- },
- }) */
- }
- return _this;
- }
- _createClass(OverlayManager, [{
- key: "add",
- value: function add(overlay) {
- if (overlay.info.isBillboard) {
- this.billGroup.add(overlay);
- } else {
- this.decoratePlaneGroup.add(overlay);
- }
- this.list.push(overlay);
- }
- }, {
- key: "remove",
- value: function remove(overlay) {
- var index = this.list.indexOf(overlay);
- if (index > -1) {
- if (overlay == this.hoveringPlane) {
- this.hoverOverlay(null, 'soon');
- }
- overlay.dispose();
- overlay.modified = 'delete';
- overlay.frame && overlay.frame.dispose();
- this.list.splice(index, 1);
- }
- }
- }, {
- key: "show",
- value: function show(floorIndex, keepHidden) {
- // this.group.visible = true
- this.list.forEach(function (overlay) {
- if (keepHidden && overlay.info.hide) return;
- if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.show('visiOnFloor');
- });
- }
- }, {
- key: "hide",
- value: function hide(floorIndex) {
- // this.group.visible = false
- this.list.forEach(function (overlay) {
- if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.hide('visiOnFloor');
- });
- }
- }, {
- key: "setGroupVisible",
- value: function setGroupVisible(visi) {
- /* this.group.visible = !!visi
- this.frameGroup.visible = !!visi */
- common$1.updateVisible(this.groupRoot, 'setGroupVisible', visi);
- }
- }, {
- key: "setSize",
- value: function setSize(x, y) {
- // this.lineMat.resolution.set( x,y );
- if (this.openOverlay) {
- this.resizeOverlay();
- }
- }
- /*
- hover到overlay时 创建四条fatLine 并渐变opacity由0至1;反之由1至0,最后删除
- */
- }, {
- key: "hoverOverlay",
- value: function hoverOverlay(plane, type) {
- //这个plane可能是box
- var overlay;
- if (this.withBox && plane) {
- overlay = plane.parent;
- plane = overlay.plane;
- } else {
- overlay = plane;
- }
- if (overlay && overlay.info.isBillboard && overlay.targetPano == void 0 && config$6.view) {
- //无跳转点不响应
- return;
- }
- if (!this.model.player.billboardManager.editPlane) {
- //需要一直高亮所编辑的billboard
- this.highlight(overlay, type);
- }
- if (!plane) {
- if (this.hoveringPlane) {
- if (this.hoveringPlane.info.isBillboard) {
- this.model.player.billboardManager.emit('hoverBillboard', {
- sid: this.hoveringPlane.info.sid,
- state: false
- });
- }
- this.hoveringPlane = null;
- }
- CursorDeal.remove('hoverOverlay');
- CursorDeal.remove('dragOverlay');
- return;
- }
- if (overlay.isEditing && overlay.info.isBillboard) {
- CursorDeal.add('dragOverlay');
- } else {
- CursorDeal.add('hoverOverlay');
- }
- this.hoveringPlane = overlay;
- if (overlay.info.isBillboard) {
- this.model.player.billboardManager.emit('hoverBillboard', {
- sid: overlay.info.sid,
- state: true
- });
- }
- }
- }, {
- key: "highlight",
- value: function highlight(overlay, type) {
- var _this2 = this;
- if (this.player.$app.config.view) return; //4.12.0 新增 查看页不显示高亮边框
- //同时只能有一个高亮
- var changeTime = 200;
- if (!overlay) {
- if (this.highlightPlane) {
- //console.log('cancel highlight')
- var cancelFuc = function cancelFuc() {
- fadePlane.border.children.forEach(function (line) {
- line.geometry.dispose();
- });
- fadePlane.remove(fadePlane.border);
- };
- var fadePlane = this.withBox ? this.highlightPlane.plane : this.highlightPlane;
- transitions$1.cancelById(settings$3.freeze.wallLineShine);
- if (type == 'soon') {
- this.lineMat.opacity = 0;
- cancelFuc();
- } else {
- transitions$1.start(function (progress) {
- this.lineMat.opacity = 1 - progress;
- }.bind(this), changeTime, cancelFuc, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine, cancelFuc);
- }
- }
- this.highlightPlane = null;
- return;
- }
- if (!overlay.visible) return;
- if (overlay == this.highlightPlane) return; // 非编辑状态并且指示牌没有跳转点位,设置不高亮
- //if (overlay.info.isBillboard && !overlay.isEditing && !overlay.info.targetPano) return
- if (this.highlightPlane) {
- this.highlight(null);
- } //console.log('highlight')
- this.highlightPlane = overlay;
- var points = overlay.plane.geometry.getAttribute('position').array;
- var borders = new THREE.Object3D();
- var indeces = [0, 1, 3, 2];
- for (var j = 0; j < 4; j++) {
- var p = [{
- x: points[indeces[j] * 3],
- y: points[indeces[j] * 3 + 1],
- z: points[indeces[j] * 3 + 2]
- }, {
- x: points[indeces[(j + 1) % 4] * 3],
- y: points[indeces[(j + 1) % 4] * 3 + 1],
- z: points[indeces[(j + 1) % 4] * 3 + 2]
- }];
- borders.add(LineDraw.createFatLine(p, {
- material: this.lineMat
- }));
- } // 显示边框前再清除一次所有边框,确保始终只有一个线框显示
- this.list.forEach(function (overlay) {
- var fadePlane = _this2.withBox ? overlay.plane : overlay;
- if (fadePlane.border) {
- fadePlane.border.children.forEach(function (line) {
- return line.geometry.dispose();
- });
- fadePlane.remove(fadePlane.border);
- }
- });
- this.lineMat.opacity = 0;
- transitions$1.cancelById(settings$3.freeze.wallLineShine, true); //加true是执行消失时的cancelFun,删除border
- transitions$1.start(function (opa) {
- this.lineMat.opacity = opa;
- }.bind(this), changeTime, null, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine);
- overlay.plane.border = borders;
- overlay.plane.add(borders);
- }
- }, {
- key: "getMatFromCss",
- value: function getMatFromCss(tran) {
- if (tran.includes('matrix3d')) {
- var arr = tran.slice(9, -1).split(',');
- } else {
- var arr = tran.slice(7, -1).split(',');
- }
- arr.forEach(function (v, i) {
- arr[i] = parseFloat(v);
- });
- 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]);
- return matrix;
- }
- }, {
- key: "getCssFromMatrix",
- value: function getCssFromMatrix(matrix) {
- return 'matrix3d(' + matrix.elements + ')';
- }
- }, {
- key: "getOverlayOpenPos",
- value: function getOverlayOpenPos(overlay) {
- //除了初次获取,在player resize后也要重新获取 ,如果相机还旋转了,也要重新获取
- var paddingRatio = 0.9;
- var ratioW = overlay.width / ($('#player').width() * paddingRatio);
- var ratioH = overlay.height / ($('#player').height() * paddingRatio);
- var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
- var x = -overlay.width * ratio / $('#player').width();
- var camera = player.cameraControls.activeControl ? player.cameraControls.activeControl.camera : player.camera;
- var pos3dLeft = new THREE.Vector3(x, 0, -1).unproject(camera); // player.camera的projectMatrix延迟了
- var camToLeft = pos3dLeft.clone().sub(player.camera.position);
- var cameraDir = player.getDirection(); //same as control.lookVector
- var angle = cameraDir.angleTo(camToLeft);
- var camDisToPlane = overlay.width / 2 / Math.tan(angle); //plane应该离相机的距离
- if (this.withBox) {
- var boxDepth = overlay.plane.position.length();
- camDisToPlane += boxDepth;
- }
- var planePos = player.camera.position.clone().add(cameraDir.clone().multiplyScalar(camDisToPlane));
- if (!this.useCssRender) this.updatePlaneElemStyle(ratio);
- return planePos;
- }
- }, {
- key: "updatePlaneElemStyle",
- value: function updatePlaneElemStyle(ratio) {
- this.openOverlay.elem.css({
- width: this.openOverlay.width * ratio + 'px',
- height: this.openOverlay.height * ratio + 'px'
- });
- }
- }, {
- key: "getPlanePos",
- value: function getPlanePos(overlay) {
- if (this.withBox) {
- return new THREE.Vector3().setFromMatrixPosition(overlay.plane.matrixWorld);
- } else return overlay.position.clone();
- }
- /*
- 点击overlay时 box视频只需要飞到最佳观影点即可,根据屏幕宽度和fov,算出刚好屏幕宽度容纳下视频宽度的距离goodDistance
- */
- }, {
- key: "clickOverlay",
- value: function clickOverlay(overlay) {
- var _this3 = this;
- var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- dontEmit = _ref3.dontEmit,
- forceFlyToPlane = _ref3.forceFlyToPlane,
- afterFly = _ref3.afterFly;
- //如果在outside点击了,要禁止飞入,否则涉及旋转
- if (overlay.info.isBillboard) {
- dontEmit || this.model.player.billboardManager.emit('clickBillboard', {
- //通知编辑,更新面板
- sid: overlay.info.sid //modified: overlay.info.modified,
- });
- var firstViewPano = this.model.player.$app.core.get('Scene').firstView.pano;
- if (!forceFlyToPlane) {
- var pano = this.model.player.model.panos.index[overlay.targetPano];
- if (pano != void 0 && (pano == firstViewPano || pano.hasNeighbor())) {
- this.model.player.flyToPano({
- pano
- /* lookAtPoint: overlay.position, //看向的方向最好有个指定
- checkAlone: true, */
- });
- }
- return; //没有跳转点就不响应
- }
- if (overlay.homePanoId != void 0) {
- var _pano = this.model.player.model.panos.index[overlay.homePanoId];
- if (_pano != void 0 && (_pano == firstViewPano || _pano.hasNeighbor())) {
- this.model.player.flyToPano({
- pano: _pano,
- lookAtPoint: overlay.position,
- checkAlone: true
- });
- return; //如果能回到绑定点的话
- }
- }
- }
- if (this.openOverlay && !overlay || this.model.player.GLTFEditor.selecting) return;
- CursorDeal.remove('hoverOverlay');
- var plane = this.withBox && overlay ? overlay.plane : overlay;
- if (overlay.overlayType == 'video') {
- plane.material.map.image.play();
- } //适应屏幕的最佳距离
- var tanW = this.player.cameraControls.cameras.panorama.aspect * Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
- var tanH = Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
- var goodDistanceW = overlay.width / 2 / tanW;
- var goodDistanceH = overlay.height / 2 / tanH;
- var goodDistance = Math.max(goodDistanceW, goodDistanceH);
- goodDistance *= goodDistance;
- console.log('goodDistance ' + goodDistance);
- if (overlay.limitToOnlyPano) {
- this.player.flyToPano({
- pano: overlay.limitToOnlyPano,
- lookAtPoint: overlay.position
- });
- } else {
- // 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});
- var visiblePanos = overlay.visiblePanos; //convertTool.getVisiblePano(overlay.plane.getWorldPosition(new THREE.Vector3()), this.model)
- if (visiblePanos.length == 0) console.warn('clickOverlay 找不到visiblePanos');
- var coss = {};
- this.player.$app.Camera.flyToPoint(overlay.position.clone(), {
- rank: [function (pano) {
- //寻找正对着overlay的pano
- var overlayDir = new THREE.Vector3(0, 0, 1).applyQuaternion(overlay.quaternion);
- var v1 = overlayDir; //.setY(0); 朝上的话set0会得到0,0,0 无法求angle
- var v2 = pano.position.clone().sub(overlay.position); //.setY(0)
- //var angle = v1.angleTo(v2)
- var cos = v1.dot(v2.normalize());
- coss[pano.id] = cos;
- return cos * 200;
- }, function (pano) {
- var dis = pano.position.clone().distanceToSquared(overlay.position);
- var goodDistance2 = goodDistance * Math.abs(coss[pano.id]); //考虑了倾斜角度后的最佳距离
- var result = -1 * Math.abs(dis - goodDistance2) / goodDistance2; //dis和goodDistance2差距越大分数越低
- //console.log(pano.id, dis, goodDistance2)
- return result;
- }, function (i) {
- var n = i.position.clone().sub(overlay.position).normalize();
- return n.dot(_this3.player.getDirection()) * -500;
- }],
- require: [function (pano) {
- //不要被模型遮挡
- return visiblePanos.includes(pano); //return pano.floorIndex == overlay.floor.floorIndex && pano.neighbourUUIDs.length > 0
- }],
- dealDistance: 5,
- //超过这个距离才换pano
- done: afterFly
- });
- }
- var isEditing = !dontEmit && this.player.EditOverlay && this.player.EditOverlay.editing;
- if (!isEditing) return; // 如果已有media在编辑,禁止选中其他media
- if (this.player.EditOverlay.editPlane && this.player.EditOverlay.editPlane.uuid != overlay.uuid) return; // 当正在添加media plane, 但鼠标并没有停在可用位置时,禁止添加plane
- 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
- if (isEditing && this.player.EditOverlay.editPlane != overlay) {
- //console.log('videos/panel/display面板出现')
- setTimeout(function () {
- var infoCopy = JSON.parse(JSON.stringify(overlay.info));
- infoCopy.sid = overlay.sid;
- infoCopy.type = overlay.overlayType;
- _this3.VideoManager.emit('videos/panel/display', infoCopy);
- _this3.player.EditOverlay.updateOverlayPanel(overlay);
- overlay.updateVisibleOnFloor(); //overlay.isHidden ? overlay.hide('forceHide') : overlay.show('forceHide')
- }, 10); //延迟是为了等待添加overlay的这个页面 created 完,监听才加好
- return;
- }
- }
- }, {
- key: "autoPlay",
- value: function autoPlay(player) {
- //有的设备需要和设备交互才能自动播放,如移动端。不这么写video不会播放 . (2022.11.29: 可为何加了Hot.updateHots之后又会自动播了?https有关?
- this.list.forEach(function (overlay) {
- /* if(overlay.overlayType == 'video' && overlay.shouldPlay){
- console.log(1)
- } */
- if (!overlay.clickToPlayInited && overlay.info.media instanceof HTMLVideoElement && !common$1.isVideoPlayed(overlay.info.media) && overlay.shouldPlay) {
- console.log('try mobileAutoPlay ');
- overlay.videoControl(true);
- if (common$1.isVideoPlayed(overlay.info.media)) {
- console.log('clickToPlayInited ');
- overlay.clickToPlayInited = true;
- }
- }
- });
- }
- }]);
- return OverlayManager;
- }(EventEmitter);
- 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); }; }
- 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; } }
- /**
- * 用于3d video的编辑
- */
- var EditOverlay = /*#__PURE__*/function (_EventEmitter) {
- _inherits(EditOverlay, _EventEmitter);
- var _super = _createSuper$1o(EditOverlay);
- function EditOverlay(player) {
- var _this;
- _classCallCheck(this, EditOverlay);
- _this = _super.call(this);
- _this.editing = false;
- _this.overlayMaxCount = 1;
- _this.meshGroup = new THREE.Object3D();
- _this.player = player; // this.init()
- return _this;
- }
- _createClass(EditOverlay, [{
- key: "checkIfCanInit",
- value: function checkIfCanInit() {
- return this.player.model && this.player.model.chunks.length && this.player.currentPano && this.player.model.transformControls;
- }
- }, {
- key: "waitToInit",
- value: function waitToInit() {
- var _this2 = this;
- console.log('waitToInit');
- var timer = setInterval(function () {
- if (_this2.checkIfCanInit()) {
- _this2.init();
- clearInterval(timer);
- }
- }, 50);
- }
- }, {
- key: "init",
- value: function init() {
- var _this3 = this;
- if (!this.checkIfCanInit()) {
- this.waitToInit();
- return;
- }
- this.VideoManager = this.player.$app.VideoManager;
- this.transformControls = this.player.model.transformControls;
- this.transformControls.addEventListener('mousing', function (data) {
- if (data.state == 'overlay') {
- var _this3$editPlane;
- _this3.VideoManager.emit('VideoManager.BoxVideo.transform', data.mode);
- (_this3$editPlane = _this3.editPlane) === null || _this3$editPlane === void 0 ? void 0 : _this3$editPlane.frame.update(data); // 拖拽轴向时实时更新overlayFrame
- }
- });
- this.meshGroup.name = 'overlay-group';
- this.player.model.add(this.meshGroup);
- this.meshGroup.visible = false;
- this.player.OverlayManager.list.forEach(function (overlay) {
- //获取信息
- _this3.updateOverlayInfo(overlay);
- });
- window.addEventListener('keydown', function (e) {
- //用键盘来切换变换
- var mode;
- if (_this3.editing) return;
- switch (e.which) {
- case 87:
- //w or W
- mode = 'translate';
- break;
- /* case 69://e or E
- mode = "rotate"; break; */
- case 82:
- //r or R
- mode = 'scale';
- break;
- }
- mode && _this3.VideoManager.emit('videos/panel/switchTclMode', mode);
- e.stopPropagation();
- }); // this.VideoManager.on('videos/panel/useImgRatio', this.useImgRatio.bind(this))
- this.enter();
- }
- }, {
- key: "enter",
- value: function enter() {
- if (this.editing) return;
- this.editing = true;
- this.meshGroup.visible = true; //this.transformControls.switchEditState('overlay')
- this.player.cameraControls.controls.dollhouse.resetRanges(3);
- this.player.cameraControls.controls.panorama.insideLookLimitDown = config$6.isMobile ? -55 : -50; // player.model.wallManager.updateRulersVisi(false);
- // player.model.cadFloorPlane.changeCadVisible(false)
- // player.model.cadFloorPlane.updateEntryVisi({visi:false})
- // if (this.player.OverlayManager.group.children.length >= this.overlayMaxCount) {
- // //当前只能加一个视频,所以进入即自动开始添加或编辑
- // var overlay = this.player.OverlayManager.group.children[0]
- // this.player.OverlayManager.clickOverlay(overlay)
- // }
- // else {
- // this.beginToAddPlane()
- // }
- }
- }, {
- key: "leave",
- value: function leave() {
- if (!this.editing) return;
- this.editing = false;
- this.endAddPlane();
- this.meshGroup.visible = false;
- this.transformControls.switchEditState(null);
- this.player.cameraControls.controls.dollhouse.resetRanges();
- this.player.cameraControls.controls.panorama.insideLookLimitDown = null; // this.player.model.wallManager.updateRulersVisi()
- // this.player.model.cadFloorPlane.changeCadVisible(null, { autoJudge: true })
- // this.player.model.cadFloorPlane.updateEntryVisi({ autoJudge: true })
- // bus.emit("videos/panel/exit")
- }
- }, {
- key: "beginToAddPlane",
- value: function beginToAddPlane() {
- //开始添加
- this.player.viewLinkManager.exitView();
- this.player.reticule.visible = false; // setTimeout(() => {
- //因为莫名会被其他页面的设置覆盖,所以延迟
- //this.player.domElement.style.cursor = `url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto`
- // playerDiv.style.cursor = `url(${config.getResourceImageURL('img')}/box_video.png),auto`
- // }, 10)
- this.isAdding = true;
- CursorDeal.add('addOverlay');
- }
- }, {
- key: "endAddPlane",
- value: function endAddPlane() {
- //结束添加状态
- this.isAdding = false; //this.player.domElement.style.cursor = ''
- CursorDeal.remove('addOverlay');
- this.player.reticule.visible = true;
- }
- }, {
- key: "addOverlay",
- value: function addOverlay(o) {
- //调整旋转值,使贴合墙壁,且不重叠。
- var normal = o.intersect.face.normal.clone();
- var intersectType = Vectors$1.UP.angleTo(normal) > Math.PI / 4 ? 'wall' : 'ground';
- if (this.player.getMouseDirection().angleTo(o.intersect.face.normal) < Math.PI / 2) {
- normal.negate();
- }
- {
- // v4.6.0 + 使和地面垂直
- //console.log('normal', normal)
- if (normal.y > 0.85) {
- //如果原本平行于地面的话,就使之面对相机的方向
- normal = this.player.getMouseDirection().negate(); //this.player.getDirection().negate()
- } // if(intersectType == "wall") {
- normal.y = 0; // } else {
- // normal.x = 0
- // normal.z = 0
- // }
- normal.normalize();
- }
- var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
- var position = o.intersect.point.add(normal.multiplyScalar(0.01)); //添加
- var overlay = new Overlay(this.player, {
- sid: common$1.getRandomSid(),
- floorIndex: this.player.model.currentFloor.floorIndex,
- pos: position,
- qua: quaternion,
- modified: 'new',
- frameType: intersectType + '_1'
- });
- overlay.updateMatrixWorld();
- this.player.OverlayManager.clickOverlay(overlay); //自动点击
- this.VideoManager.emit('videos/panel/switchTclMode', 'translate');
- this.endAddPlane(); //自动结束添加
- }
- }, {
- key: "updateOverlayInfo",
- value: function updateOverlayInfo(overlay) {
- var _overlay$info;
- if (overlay.info.isBillboard) return; //获取当前overlay的信息, 用于取消时恢复
- overlay.info = {
- width: overlay.width,
- height: overlay.height,
- depth: overlay.depth,
- pos: overlay.position.clone(),
- qua: overlay.quaternion.clone(),
- reverse: overlay.scale.x < 0,
- media: overlay.info.media,
- //overlay.plane.material.map.image,
- file: overlay.file,
- type: overlay.overlayType,
- hide: overlay.isHidden,
- frameType: overlay.frame && overlay.frame.type,
- limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id,
- fileSize: (_overlay$info = overlay.info) === null || _overlay$info === void 0 ? void 0 : _overlay$info.fileSize
- };
- }
- }, {
- key: "undoEdit",
- value: function undoEdit() {
- // 恢复
- if (!this.editPlane) return;
- var overlay = this.editPlane;
- if (overlay.modified == 'new') {
- // 未保存过的video直接删除
- this.player.OverlayManager.remove(overlay);
- } else {
- overlay.setFromInfo(overlay.info); // 如果是已删除的,则恢复
- if (overlay.modified == 'delete') this.player.OverlayManager.add(overlay);
- }
- }
- }, {
- key: "updateOverlayScaleDisplay",
- value: function updateOverlayScaleDisplay() {
- //更新视频尺寸的数字
- var overlay = this.editPlane;
- var maxWidth = 190,
- maxHeight = maxWidth; //maxWidth/2;
- var ratioW = Math.abs(overlay.width) / maxWidth;
- var ratioH = Math.abs(overlay.height) / maxHeight;
- var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
- var w = Math.round(Math.abs(overlay.width) * ratio);
- var h = Math.round(Math.abs(overlay.height) * ratio); //console.log(overlay.width, overlay.height, overlay.depth)
- this.VideoManager.emit('videos/panel/changeSize', {
- wText: overlay.width.toFixed(2),
- hText: overlay.height.toFixed(2),
- width: w,
- height: h,
- depth: isNaN(overlay.depth) ? settings$3.overlay.depth : overlay.depth
- });
- }
- }, {
- key: "updateOverlayPanel",
- value: function updateOverlayPanel(overlay) {
- this.editPlane = overlay;
- var plane = overlay.plane;
- var video = plane.material.map && plane.material.map.image;
- this.VideoManager.emit('videos/panel/updatePoster', video);
- this.updateOverlayScaleDisplay();
- this.transformControls.switchEditState('overlay');
- if (overlay.frame) {
- this.VideoManager.emit('videos/panel/changeDepth', overlay.depth * 100);
- } else {
- this.VideoManager.emit('videos/panel/changeDepth', 0);
- }
- this.player.emit('beginEditOverlay');
- }
- }, {
- key: "controlSelectOverlay",
- value: function controlSelectOverlay(overlay) {
- //控制器的选择
- if (overlay && overlay.visible) {
- //this.transformControls.switchEditState('overlay')
- overlay.frame ? overlay.frame.switchTranformControls(this.transformControls) : this.transformControls.attach(overlay);
- } else {
- this.transformControls.detach();
- }
- }
- }, {
- key: "useImgRatio",
- value: function useImgRatio(o) {
- //使用素材自身尺寸比例
- var plane = this.editPlane.plane;
- if (!plane.material.map) return;
- var img = plane.material.map.image;
- var mintranRatio = 200; //default is 200 , 防止图片太小时在墙上依旧很大
- var width = this.editPlane.overlayType == 'video' ? img.videoWidth : img.width;
- var height = this.editPlane.overlayType == 'video' ? img.videoHeight : img.height;
- if (o == 'suitSize') {
- var boundWidth = Math.min(Math.max(width, height) / mintranRatio, 1);
- if (width > height) {
- var w = boundWidth;
- var h = boundWidth * height / width;
- } else {
- var h = boundWidth;
- var w = boundWidth * width / height;
- }
- } else {
- //假设不变总面积
- var k = Math.sqrt(Math.abs(this.editPlane.width * this.editPlane.height) / (width * height));
- var w = k * width * (this.editPlane.width < 0 ? -1 : 1);
- var h = k * height * (this.editPlane.height < 0 ? -1 : 1);
- }
- this.editPlane.scale.setX(w / settings$3.overlay.width);
- this.editPlane.scale.setY(h / settings$3.overlay.height);
- this.editPlane.width = w;
- this.editPlane.height = h;
- this.updateOverlayScaleDisplay();
- }
- }, {
- key: "overlayUploaded",
- value: function overlayUploaded(file, media) {
- //video上传成功后,调整overlay
- var plane = this.editPlane.plane;
- media.style.width = '100%';
- media.style.height = '100%';
- if (media instanceof HTMLVideoElement) {
- plane.material.map = new THREE.VideoTexture(media);
- plane.material.map.image.play();
- this.editPlane.overlayType = 'video';
- media.autoplay = true;
- media.loop = true;
- media.volume = 0;
- media.muted = true;
- } else {
- plane.material.map = new THREE.Texture(media);
- plane.material.map.needsUpdate = true;
- this.editPlane.overlayType = 'photo';
- }
- plane.material.map.minFilter = THREE.LinearFilter;
- this.useImgRatio(); //自适应比例
- this.editPlane.file = file;
- plane.material.opacity = 1;
- plane.material.color = new THREE.Color(1, 1, 1);
- plane.material.needsUpdate = true; // this.updateOverlayInfo(this.editPlane)
- this.VideoManager.emit('videos/panel/updatePoster', media);
- this.editPlane.frame && this.editPlane.frame.update({
- mode: 'scale'
- });
- }
- }, {
- key: "getOverlaySavingInfo",
- value: function getOverlaySavingInfo() {
- //获取overlay保存信息
- var overlay = this.editPlane;
- if (!overlay.file && (!overlay.plane.material.map || !overlay.plane.material.map.image)) return; // 当设置limitToOnlyPano时,仅保存时的点位可视
- //if (overlay.limitToOnlyPano == true) overlay.limitToOnlyPano = this.player.currentPano
- var info = {
- width: math$2.toPrecision(overlay.width, 4),
- height: math$2.toPrecision(overlay.height, 4),
- depth: math$2.toPrecision(overlay.depth, 4),
- pos: math$2.toPrecision(overlay.position.toArray(), 4),
- qua: math$2.toPrecision(overlay.quaternion.toArray(), 4),
- reverse: overlay.scale.x < 0,
- sid: overlay.sid,
- media: [overlay.overlayType],
- hide: overlay.isHidden,
- floorIndex: overlay.floor.floorIndex,
- frameType: overlay.frame && overlay.frame.type,
- limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id,
- fileSize: overlay.info.fileSize
- };
- var _self = this;
- return {
- data: info,
- type: overlay.modified == 'new' ? 1 : 0,
- needSaveMedia: !overlay.info || overlay.file != overlay.info.file,
- done: function done(newData) {
- try {
- // if (overlay.modified == "delete") this.editPlane = null
- overlay.modified = false;
- overlay.visiblePanos = convertTool.getVisiblePano(overlay.position, _self.player.model);
- overlay.info.fileSize = newData.fileSize; //xzw add
- _self.updateOverlayInfo(overlay);
- } catch (e) {
- console.error(e);
- }
- }
- };
- }
- /* disposeOverlay(overlay) {
- //应用删除
- if (overlay == this.player.OverlayManager.hoveringPlane) {
- this.player.OverlayManager.hoverOverlay(null, 'soon')
- }
- if (overlay.plane.material.map) {
- //清空video
- let video = overlay.plane.material.map.image
- if (video && video.load) {
- video.src = ''
- video.load()
- }
- }
- overlay.dispose()
- overlay.modified = 'delete'
- overlay.frame && overlay.frame.dispose()
- } */
- }, {
- key: "DeleteOverlay",
- value: function DeleteOverlay(overlay, delFun) {
- var _this4 = this;
- //删除
- delFun(overlay.sid, function () {
- //删除成功后:
- _this4.player.OverlayManager.remove(overlay); //this.disposeOverlay(overlay)
- _this4.controlSelectOverlay(null);
- });
- }
- }]);
- return EditOverlay;
- }(EventEmitter);
- 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); }; }
- 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; } }
- /**
- * 数据存储对象
- */
- defineComponent('store', function () {
- return /*#__PURE__*/function (_Emiter) {
- _inherits(Store, _Emiter);
- var _super = _createSuper$1n(Store);
- function Store() {
- var _this;
- _classCallCheck(this, Store);
- _this = _super.call(this);
- _this.__store = {};
- return _this;
- }
- /**
- * 获取指定key的数据
- * @param {String} key 名称
- * @param {Boolean} reload 是否强制重新加载
- */
- _createClass(Store, [{
- key: "get",
- value: function () {
- var _get = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(key, reload) {
- var data;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- if (reload) {
- this.$app.resource.reload = true;
- }
- if (!(this.__store[key] && !reload)) {
- _context.next = 3;
- break;
- }
- return _context.abrupt("return", this.__store[key]);
- case 3:
- data = null;
- if (!(typeof this.$app.resource[key] === 'function')) {
- _context.next = 8;
- break;
- }
- _context.next = 7;
- return this.$app.resource[key]();
- case 7:
- data = _context.sent;
- case 8:
- this.$app.resource.reload = false;
- return _context.abrupt("return", data || this.__store[key]);
- case 10:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function get(_x, _x2) {
- return _get.apply(this, arguments);
- }
- return get;
- }()
- }, {
- key: "getAppImage",
- value: function () {
- var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(path) {
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- if (!this.__store[path]) {
- _context2.next = 2;
- break;
- }
- return _context2.abrupt("return", this.__store[path]);
- case 2:
- _context2.next = 4;
- return this.$app.resource.getAppImage(path);
- case 4:
- return _context2.abrupt("return", this.__store[path]);
- case 5:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this);
- }));
- function getAppImage(_x3) {
- return _getAppImage.apply(this, arguments);
- }
- return getAppImage;
- }()
- }, {
- key: "getUserImage",
- value: function () {
- var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(path, reload) {
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- if (!(this.__store[path] && !reload)) {
- _context3.next = 2;
- break;
- }
- return _context3.abrupt("return", this.__store[path]);
- case 2:
- _context3.next = 4;
- return this.$app.resource.getUserImage(path);
- case 4:
- return _context3.abrupt("return", this.__store[path]);
- case 5:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- function getUserImage(_x4, _x5) {
- return _getUserImage.apply(this, arguments);
- }
- return getUserImage;
- }()
- /**
- * 获取指定key的值
- * @param {String} key
- * @returns any
- */
- }, {
- key: "getValue",
- value: function getValue(key) {
- return this.__store[key];
- }
- /**
- * 设置指定key的值并触发事件
- * @param {String} key
- * @returns any
- */
- }, {
- key: "setValue",
- value: function setValue(key, prop, value) {
- if (typeof key === 'undefined' || typeof prop === 'undefined') {
- return this;
- }
- var target = this.__store[key];
- if (target) {
- target[prop] = value;
- this.emit(key, target, prop);
- }
- return this;
- }
- /**
- * 设置指定key的数据
- * @param {String} key 名称
- * @param {Object} value 新数据
- * @param {Boolean} isCache 是否缓存
- */
- }, {
- key: "set",
- value: function set(key, value) {
- var isCache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
- if (typeof key === 'undefined') {
- return this;
- }
- if (isCache) {
- this.__store[key] = value;
- }
- this.emit(key, value);
- }
- }]);
- return Store;
- }(tinyEmitter);
- });
- var DialogList3D = {
- WalkManger: {
- 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"),
- firstPointLimit: '初始点位无法隐藏。',
- link: '漫游到选中点位时,操作点位可以行走。',
- unLink: '漫游到选中点位时,操作点位不可行走。',
- show: '该点位已显示',
- hide: '已隐藏该点位,漫游时将不再显示',
- deactive: "\u5355\u51FB<img src=\"".concat(texture.getImageURL('images/roam/roam_visible.png'), "\" crossorigin=\"anonymous\">\u8BBE\u7F6E\u70B9\u4F4D\u6F2B\u6E38\u53EF\u884C\u3002"),
- 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")
- },
- TagManger: {
- unLink: '在该点位漫游时不再显示选中热点。'
- }
- };
- 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); }; }
- 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; } }
- /*
- 漫游可行 和 热点可视 都是利用连线来表示连接性。 借助线的name来判断是否是新增线或者删除的线。每次更换中心点或热点时保存临时信息,然后重新创建线(刷新状态)。
- 复杂的点是要经常更新连接的footIcon的材质。不可见的pano就是没有neibourPanos的pano,所以漫游可行需要判断修改连接的两个pano的可见性的修改。
-
- */
- var panos, panoIndexes;
- var Link = /*#__PURE__*/function () {
- function Link(player) {
- _classCallCheck(this, Link);
- this.player = player;
- this.setPanoVisible = false;
- this.setMultiFloorPanoVisible = false;
- this.setTagVisible = false;
- this.footIcons;
- this.actionIcons; //漫游可见性
- this.activePano; //正在设置的漫游中心点
- this.panoVLines = {}; //线条
- this.panoVTemp; //修改后还没保存的临时数据
- //热点可见性
- this.tagVsetting; //正在设置的热点中心点
- this.tagsVLines = {}; //线条
- this.tagVTemp; //修改后还没保存的临时数据
- this.linkToFloorPano; //设置楼层连接点时选择的另一层的连接点
- panos = player.model.panos.list.filter(function (e) {
- return e.isAligned();
- });
- panoIndexes = player.model.panos.index;
- }
- _createClass(Link, [{
- key: "init",
- value: function init() {
- var _this = this;
- if (this.inited) return;
- this.footTex1 = texture.load(texture.getImageURL('images/End_256.png'));
- this.footTex2 = texture.load(texture.getImageURL('images/End_unable_256.png'));
- this.footTex1_v = texture.load(this.player.$app.resource.getAppURL('images/video_256.png'));
- /* texture.getImageURL('images/video_256.png') */
- 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')),
- // this.footTex4 = texture.load(texture.getImageURL('images/mutil_connect_unable256.png')),
- this.footTex5 = texture.load(texture.getImageURL('images/mutil_connect_upper.png'));
- this.footTex6 = texture.load(texture.getImageURL('images/mutil_connect_lower.png'));
- this.actionVisiTex0 = texture.load(texture.getImageURL('images/roam/roam_invisible.png'));
- this.actionVisiTex1 = texture.load(texture.getImageURL('images/roam/roam_visible.png'));
- this.actionLinkTex0 = texture.load(texture.getImageURL('images/roam/roam_uncheck.png'));
- this.actionLinkTex1 = texture.load(texture.getImageURL('images/roam/roam_checked.png'));
- this.ifAllPanoNoNeighbor();
- this.meshGroup = new THREE.Object3D();
- this.meshGroup.name = 'setVisible-group';
- this.player.model.add(this.meshGroup);
- this.player.model.on('floor.changed', function (toFloor, mode) {
- if (_this.setTagVisible || _this.setPanoVisible) {
- //正在设置可视
- _this.gotoFloor(toFloor.floorIndex);
- }
- });
- this.player.on('collectIntersectMesh', function (meshes) {
- //推送要intersect的mesh
- if (_this.footIcons && (_this.setPanoVisible || _this.setTagVisible)) {
- meshes.push.apply(meshes, _toConsumableArray(_this.footIcons));
- }
- });
- this.player.on('judgeIntersect', function (intersect, e) {
- //判断是否intersect了 footIcon
- if (e.getConsumed() || _this.setPanoVisible || _this.setTagVisible) {
- if (intersect && intersect.object.type == 'FootIcon'
- /* && this.intersect.object.visible */
- ) {
- CursorDeal.add('hoverFootMarker');
- } else {
- CursorDeal.remove('hoverFootMarker');
- }
- e.consume();
- }
- });
- this.inited = true;
- }
- }, {
- key: "enterSet",
- value: function enterSet(type) {
- var _this2 = this;
- this.init(); // toast: `单击设置选中点位漫游可行。`
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.enter',
- content: DialogList3D.WalkManger.enter,
- showClose: true
- });
- if (type == 'panoVisible') {
- if (!this.player.modeTran) {
- //一开始就在这个页面
- this.player.afterCModeFuc = function () {
- _this2.enterSet(type);
- };
- return;
- }
- this.setPanoVisible = true;
- this.player.flyoutType = 'beginSetPanoVisible'; // if (this.player.modeTran.split('-')[1] != 'floorplan') {
- // setTimeout(this.beginSetPanoVisible.bind(this), 300)
- // } else {
- this.beginSetPanoVisible(); // }
- setTimeout(function () {
- //刚开始的页面就是设置漫游可行时飞出来角度很奇怪,但是延迟一下就不会,原因未知
- _this2.player.flyToMode('floorplan', function () {
- _this2.updateFootIconSize();
- _this2.focusFloor();
- });
- }, 10);
- } else {
- this.beginSetTagVisible();
- this.player.flyToMode('floorplan', function () {
- _this2.focusFloor();
- });
- }
- }
- /**
- * 用于选中和取消“全部漫游可行”
- * @param {undefined | "all"} show
- * @returns
- */
- }, {
- key: "toggle",
- value: function toggle(show) {
- var _this3 = this;
- //console.log('walk/Set ' + show)
- var activePano = this.activePano;
- if (!show) {
- // 当前点位是初始点位时,禁止隐藏
- var firstView = this.player.$app.core.get('Scene').firstView;
- /* let p = this.getCurNeighbors(firstView.pano)-----被驳回,所以先注释
- let firstViewWillHide = p.length == 1 && p.includes(activePano.id) */
- if (firstView.pano == this.activePano
- /* && this.checkHasNeighbor(firstView.pano, 'beforeCreateLine') */
- ) {
- // toast: `初始点位无法隐藏。`
- this.player.$app.WalkManager.emit(this.checkLinkStatus());
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.firstPointLimit',
- content: DialogList3D.WalkManger.firstPointLimit,
- showClose: true
- });
- return false;
- } // 全部取消连接
- for (var _i in this.panoVLines) {
- //隐藏相当于点击所有连线的footIcon
- /* if (firstViewWillHide && i == firstView.pano.id) { -----被驳回,所以先注释
- this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit, showClose: true })
- continue
- } */
- this.panoVLines[_i].visible && this.dealPanoVisible(_i);
- }
- } else {
- var list = common$1.sortByScore(panos, [function (e) {
- return e.isAligned();
- }], [function (pano) {
- return -pano.position.distanceTo(activePano.position);
- }]);
- if (list.length == 1) {
- console.log('仅有一个漫游点');
- return;
- }
- var okList = [];
- var s = Math.max(-list[1].score * 2, 4); //i==1的一定显示
- if (show == 'all') {
- // 全部连接
- okList = list.filter(function (data) {
- return data.score != 0 && data.item.footIcon.visible;
- }
- /* || this.panoVLines[data.item.id] */
- );
- /* //包括原先连接的另一个楼 */
- okList.forEach(function (e) {
- return _this3.panoVLines[e.item.id] && _this3.panoVLines[e.item.id].visible || _this3.dealPanoVisible(e.item.id);
- });
- } else {
- //连接周围一定距离内、到该点没有遮挡的pano
- var ifBlock = function ifBlock(panoA, panoB) {
- var A = panoA.position.clone();
- var B = panoB.position.clone();
- return convertTool.ifIntersectChunks(A, B, {});
- };
- for (var i = 1; i < list.length; i++) {
- if (-list[i].score < s) {
- if (ifBlock(activePano, list[i].item)) {
- list[i].block = true; //有阻挡
- }
- list[i].good = true;
- } else {
- okList || (okList = list.filter(function (e) {
- return e.good && !e.block;
- })); //绝对可以使用的
- if (okList.length < 2) {
- if (!ifBlock(activePano, list[i].item)) {
- if (okList.length == 0) {
- okList.push(list[i]);
- } else {
- //1
- var lastPos = okList[0].item.position.clone().sub(activePano.position).setY(0);
- var thisPos = list[i].item.position.clone().sub(activePano.position).setY(0);
- if (lastPos.angleTo(thisPos) > Math.PI / 2) {
- console.log('再加一个 角度' + THREE.MathUtils.radToDeg(lastPos.angleTo(thisPos)));
- break;
- }
- }
- }
- } else {
- break;
- }
- }
- }
- if (okList.length == 0) {
- //如果length为0,至少加一个pano, 虽然是遮挡的
- okList.push(list[0]);
- }
- okList.forEach(function (e) {
- return _this3.dealPanoVisible(e.pano.id);
- });
- } //console.log(okList)
- }
- this.checkFloorLinkStatus();
- return true;
- } //共同的
- }, {
- key: "setDisplay",
- value: function setDisplay(state) {
- //在设置时一直显示视频漫游点,即使它被隐藏了
- //panos.forEach(pano => pano.updateMarkerVisible(true, this.player))
- this.player.path.currentPanoMarker.mesh.visible = !state;
- this.player.OverlayManager && this.player.OverlayManager.setGroupVisible(!state);
- this.player.reticule.visible = !state;
- this.player.emit('linkEditorSetVisible', state);
- this.player.$app.TagManager.switchLabels({
- type: 'traces',
- visible: !state
- }, null, 'editRoamVisi');
- if (!state && this.footIcons) {
- for (var i = 0; i < this.footIcons.length; i++) {
- var s = this.footIcons[i].pano.label._oriScale;
- if (s == void 0) break;
- this.footIcons[i].pano.marker.add(this.footIcons[i].pano.label); //放回
- this.footIcons[i].pano.label.scale.set(s, s, s);
- delete this.footIcons[i].pano.label._oriScale;
- this.footIcons[i].pano.label.sprite.material.color.set('#fff');
- this.footIcons[i].pano.label.sprite.material.opacity = 1;
- }
- } //if (!state && this.player.mode == 'floorplan' && !this.player.model.showOnFloorplan) {
- // this.player.model.setModelDisplay(false, 'hideOnfloorplan') //恢复
- //}
- this.player.model.setModelDisplay(state, 'editLink', 2, state ? 'add' : 'cancel');
- } //----------------漫游可见性---------------------------------
- }, {
- key: "beginSetPanoVisible",
- value: function beginSetPanoVisible() {
- this.panoVTemp = {};
- if (this.player.currentPano.floor != this.player.model.currentFloor) {
- //总是切到当前漫游点的楼层
- this.player.gotoFloor(this.player.currentPano.floor.floorIndex);
- }
- this.SetOnePanoVisible(this.player.currentPano);
- this.setDisplay(true); // UI根据是否emit过LinkStatus来判断是否编辑过,初次进入默认activePano时需要标明还未编辑
- this.player.$app.WalkManager.emit(this.checkLinkStatus(), 'enter');
- }
- }, {
- key: "SetOnePanoVisible",
- value: function SetOnePanoVisible(pano) {
- //点击某个pano后就对该pano点进行设置
- if (this.activePano == pano) return;
- this.activePano = pano; //记录正在修改的
- this.delVisibleLines(); //删除线
- this.showFootIcons(pano, true);
- this.createPanoVisiLines(pano); //创线
- }
- }, {
- key: "checkPanoVisiChange",
- value: function checkPanoVisiChange() {
- if (Object.keys(this.panoVTemp).length) return true;
- for (var r in this.panoVLines) {
- var line = this.panoVLines[r];
- if (line.name.indexOf('new') > -1 && line.visible) {
- //新设置为visible且没有取消
- return true;
- } else if (line.name.indexOf('new') == -1 && !line.visible) {
- //旧的且已经取消
- return true;
- }
- }
- return false;
- }
- }, {
- key: "saveLastPanoVi",
- value: function saveLastPanoVi(pano) {
- pano = pano || this.activePano; //xzw add on 2023.6.1
- if (!pano) return; //保存刚设置过的pano
- var change = [];
- for (var r in this.panoVLines) {
- //所有修改信息都藏在线里~
- var line = this.panoVLines[r];
- if (line.name.indexOf('new') > -1 && line.visible) {
- //新设置为visible且没有取消
- change.push({
- type: 'add',
- id: r
- });
- } else if (line.name.indexOf('new') == -1 && !line.visible) {
- //旧的且已经取消
- change.push({
- type: 'sub',
- id: r
- });
- }
- }
- if (change.length) {
- var panoId = pano.id; //(pano && pano.id) || this.activePano.id
- this.savePanoVisiChange(panoId, change);
- }
- }
- }, {
- key: "savePanoVisiChange",
- value: function savePanoVisiChange(panoId, change) {
- //添加双向的neighbour: 将修改写入panoVTemp数据
- var self = this.searchNeib(panoId);
- var seeMarkers_self = self.seeMarkers;
- var neighbourUUIDs_self = self.neighbourUUIDs;
- var neighbourPanos_self = self.neighbourPanos;
- for (var i = 0; i < change.length; i++) {
- var other = this.searchNeib(change[i].id);
- var seeMarkers = other.seeMarkers;
- var neighbourUUIDs = other.neighbourUUIDs;
- var neighbourPanos = other.neighbourPanos;
- if (change[i].type == 'add') {
- seeMarkers.push(panoId);
- neighbourUUIDs.push(panoId);
- neighbourPanos[panoId] = true;
- seeMarkers_self.push(change[i].id);
- neighbourUUIDs_self.push(change[i].id);
- neighbourPanos_self[change[i].id] = true;
- } else {
- var index = seeMarkers.indexOf(panoId);
- index > -1 && seeMarkers.splice(index, 1);
- var index = neighbourUUIDs.indexOf(panoId);
- index > -1 && neighbourUUIDs.splice(index, 1);
- neighbourPanos[panoId] = false;
- var index = seeMarkers_self.indexOf(change[i].id);
- index > -1 && seeMarkers_self.splice(index, 1);
- var index = neighbourUUIDs_self.indexOf(change[i].id);
- index > -1 && neighbourUUIDs_self.splice(index, 1);
- neighbourPanos_self[change[i].id] = false;
- }
- this.panoVTemp[change[i].id] = {
- //后面两个是作为保存到后台的数据存储,临时需要用到的是第一个
- neighbourPanos: neighbourPanos,
- seeMarkers: seeMarkers,
- neighbourUUIDs: neighbourUUIDs
- };
- }
- this.panoVTemp[panoId] = {
- //加上自己
- neighbourPanos: neighbourPanos_self,
- seeMarkers: seeMarkers_self,
- neighbourUUIDs: neighbourUUIDs_self
- };
- }
- }, {
- key: "pauseSetPanoVisible",
- value: function pauseSetPanoVisible(type, currentFloor) {
- var _this4 = this;
- //暂停 因为点击了保存设置 但没有退出设置
- if (!this.setPanoVisible) return;
- if (type == 'unsaved') {
- //中途点击pano从而停止一个热点的设置
- this.saveLastPanoVi();
- } else {
- this.panoVTemp = {}; //清空数据
- this.startEditPano = null;
- }
- this.delVisibleLines();
- this.activePano = null;
- this.showFootIcons(null, true, currentFloor); //清空选择
- //这句要放在this.activePano = null后。 根据可见性更改透明度
- panos.forEach(function (pano) {
- return _this4.changeIconVisiState(pano.footIcon, _this4.checkHasNeighbor(pano));
- });
- } //按理说改变了neighbourPano,tag的初始visible也要改。但是这样还要考虑已经改过的tag。。很麻烦
- }, {
- key: "finishSetPanoVisible",
- value: function finishSetPanoVisible() {
- //结束 退出这个设置
- if (!this.setPanoVisible) return; //否则会加多个侦听
- this.setPanoVisible = false;
- this.hideFootIcons();
- this.delVisibleLines();
- this.recoverAllState2();
- this.activePano = null;
- this.startEditPano = null;
- this.panoVTemp = {};
- this.player.flyoutType = null;
- this.setDisplay(false);
- CursorDeal.remove('hoverFootMarker');
- } //最佳推荐操作顺序: 先设置pano可见性 再创建热点 这样热点的visible正确些,否则之后再设置热点可见性会改更多
- }, {
- key: "savePanoVisibles",
- value: function savePanoVisibles(fuc) {
- //保存
- if (this.activePano) this.saveLastPanoVi(this.activePano); //获取最后设置的那个热点的改动
- var PanoData = [];
- for (var i in this.panoVTemp) {
- PanoData.push({
- //希望算法部不会更改index排序,或者更改后能将visible信息一并更改
- panoID: i,
- visibles: this.turnToPanoIndex(this.panoVTemp[i].seeMarkers),
- visibles3: this.turnToPanoIndex(this.panoVTemp[i].neighbourUUIDs)
- });
- }
- if (PanoData.length == 0) {
- //没改变
- console.warn('PanoLink没有改变');
- return;
- }
- return PanoData;
- }
- }, {
- key: "afterSavePanoVisibles",
- value: function afterSavePanoVisibles() {
- var _this5 = this;
- //实施:
- for (var i in this.panoVTemp) {
- var pano = panoIndexes[i];
- pano.seeMarkers = this.panoVTemp[i].seeMarkers;
- pano.neighbourUUIDs = this.panoVTemp[i].neighbourUUIDs;
- pano.neighbourPanos = this.panoVTemp[i].neighbourPanos;
- }
- var self = this;
- if (!this.checkHasNeighbor(this.player.currentPano)) {
- //currentPano变为孤立点 就要换一个防止飞入
- var list = common$1.sortByScore(panos, [function (pano) {
- return _this5.checkHasNeighbor(pano);
- }], [function (pano) {
- return -pano.position.distanceTo(self.player.currentPano.position);
- }]);
- if (list && list.length) {
- this.player.currentPano = list[0].item; //找最近的一非孤立点
- this.noPanoHasNeighbor = false; //更新状态
- } else {
- this.noPanoHasNeighbor = true; //更新状态
- }
- } else {
- this.noPanoHasNeighbor = false; //更新状态
- }
- this.pauseSetPanoVisible();
- this.player.$app.WalkManager.emit('walkManager.deactive');
- this.updateFootIconSize(); //更新一下center大小 写在最后
- }
- }, {
- key: "searchNeib",
- value: function searchNeib(panoId) {
- //寻找某pano的相关neighbour 可能是修改过的
- var o = {};
- if (this.panoVTemp[panoId]) {
- o.seeMarkers = this.panoVTemp[panoId].seeMarkers;
- o.neighbourUUIDs = this.panoVTemp[panoId].neighbourUUIDs;
- o.neighbourPanos = this.panoVTemp[panoId].neighbourPanos;
- } else {
- o.seeMarkers = panoIndexes[panoId].seeMarkers.slice(0);
- o.neighbourUUIDs = panoIndexes[panoId].neighbourUUIDs.slice(0);
- o.neighbourPanos = common$1.CloneObject(panoIndexes[panoId].neighbourPanos);
- }
- return o;
- }
- }, {
- key: "turnToPanoIndex",
- value: function turnToPanoIndex(panoArr) {
- var array = [];
- for (var i = 0; i < panoArr.length; i++) {
- var pano = panoIndexes[panoArr[i]];
- var index = panos.indexOf(pano);
- array.push(index);
- }
- return array;
- } //========热点可见性==============
- }, {
- key: "beginSetTagVisible",
- value: function beginSetTagVisible() {
- if (this.setTagVisible) return;
- this.setTagVisible = true;
- this.tagVTemp = {}; //临时存储改动的tag的visible
- this.setDisplay(true);
- }
- }, {
- key: "SetOneTagVisible",
- value: function SetOneTagVisible(tag) {
- //点击某个热点后就对该热点进行设置,或者在热点修改时对其进行设置
- if (this.tagVsetting == tag) return;
- if (this.tagVsetting) {
- this.saveLastTagVi(this.tagVsetting);
- }
- this.tagVsetting = tag; //记录正在修改的
- this.delVisibleLines(); //删除线
- this.showFootIcons();
- this.createTagVisiLines(tag); //创线
- this.updateFootIconSize(); //更新一下大小,尤其是上次换了中心点然后退出又进入但是镜头没有变化的话
- this.player.$app.TagManager.emit(this.checkTagLinkStatus());
- }
- }, {
- key: "checkTagVisiChange",
- value: function checkTagVisiChange() {
- if (Object.keys(this.tagVTemp).length) return true;
- for (var r in this.tagsVLines) {
- var line = this.tagsVLines[r];
- if (line.name.indexOf('new') > -1 && line.visible) {
- //新设置为visible且没有取消
- return true;
- } else if (line.name.indexOf('new') == -1 && !line.visible) {
- //旧的且已经取消
- return true;
- }
- }
- return false;
- }
- }, {
- key: "checkTagLinkStatus",
- value: function checkTagLinkStatus() {
- var visibleLines = Object.values(this.tagsVLines).filter(function (line) {
- return line.visible;
- });
- var visibleIcon = this.footIcons.filter(function (icon) {
- return icon.visible;
- }); //是连接还是不连接
- if (visibleIcon.length == visibleLines.length) {
- // 全部连接
- return 'tagManager.linkAll';
- } else if (visibleLines.length == 0) {
- // 没有连接
- return 'tagManager.linkNone';
- } else {
- // 部分连接
- return 'tagManager.linkSome';
- }
- }
- }, {
- key: "saveLastTagVi",
- value: function saveLastTagVi() {
- //保存刚设置过的tag
- var change = false;
- var newVPs = this.tagVTemp[this.tagVsetting.sid] || this.tagVsetting.visiblePanos.slice(0);
- for (var r in this.tagsVLines) {
- var line = this.tagsVLines[r];
- if (line.name.indexOf('new') > -1 && line.visible) {
- //新设置为visible且没有取消
- newVPs.push(panoIndexes[r]);
- change = true; //console.log("add: "+r)
- } else if (line.name.indexOf('new') == -1 && !line.visible) {
- //旧的且已经取消
- var i = newVPs.map(function (pano) {
- return pano.id;
- }).indexOf(r);
- if (i == -1) {
- console.log('visiblePanos删除error');
- continue;
- }
- newVPs.splice(i, 1);
- change = true; //console.log("sub: "+r)
- }
- }
- if (change) {
- this.tagVTemp[this.tagVsetting.sid] = newVPs;
- }
- }
- }, {
- key: "pauseSetTagVisible",
- value: function pauseSetTagVisible(type) {
- //pc保存后删除连线 但还在继续设置 点选热点即开始
- if (!this.setTagVisible || !this.tagVsetting) return;
- if (type == 'unsaved') {
- //中途点击pano从而停止一个热点的设置
- this.saveLastTagVi(this.tagVsetting);
- } else {
- this.tagVTemp = {}; //清空数据
- }
- this.delVisibleLines();
- this.hideFootIcons();
- this.tagVsetting = null;
- }
- }, {
- key: "finishSetTagVisible",
- value: function finishSetTagVisible() {
- if (!this.setTagVisible) return;
- this.pauseSetTagVisible();
- this.setTagVisible = false;
- this.setDisplay(false);
- }
- }, {
- key: "saveTagVisibles",
- value: function saveTagVisibles() {
- //保存到服务器
- if (this.tagVsetting) this.saveLastTagVi(this.tagVsetting); //获取最后设置的那个热点的改动
- //可能出现数据没变但保存的情况。比如先改变了然后切换别的热点但切换回来时又改回来。
- var tags = [];
- for (var i in this.tagVTemp) {
- tags.push({
- sid: i,
- value: this.tagVTemp[i].filter(function (pano) {
- return !!pano;
- }).map(function (pano) {
- return pano.id;
- }) //turnToPanoIndex(this.tagVTemp[i])
- });
- }
- return tags;
- }
- }, {
- key: "afterSaveTagVisibles",
- value: function afterSaveTagVisibles() {
- this.finishSetTagVisible(); //还是保存完直接结束吧,因为现在热点可视不放在单独的设置页面了
- } //------------visibles--------tag--------------------------------
- }, {
- key: "createTagVisiLines",
- value: function createTagVisiLines(tag) {
- var _this6 = this;
- // 热点可见性线条
- var visibleList = this.tagVTemp[tag.sid] || tag.visiblePanos;
- visibleList.forEach(function (pano) {
- /* if (pano && pano.floor.floorIndex == this.player.model.currentFloor.floorIndex) */
- _this6.createTagSingleLine(pano, 'old', tag);
- });
- }
- }, {
- key: "createTagSingleLine",
- value: function createTagSingleLine(pano, type, tag) {
- var line = LineDraw.createLine([pano.floorPosition.clone(), tag.position.clone()], {
- color: Colors.newBlue,
- depthTest: false,
- transparent: true
- });
- this.meshGroup.add(line);
- line.name = 'tagVL-' + type + '-' + pano.id;
- this.tagsVLines[pano.id] = line;
- line.material.opacity = pano.floor.floorIndex == this.player.model.currentFloor.floorIndex ? 1 : 0.4;
- this.changeIconLinkState(panoIndexes[pano.id].footIcon, 'linked');
- }
- }, {
- key: "dealTagVisible",
- value: function dealTagVisible(tag, panoName) {
- //外部调用
- if (this.tagsVLines[panoName]) {
- this.tagsVLines[panoName].visible = !this.tagsVLines[panoName].visible;
- this.changeIconLinkState(panoIndexes[panoName].footIcon, this.tagsVLines[panoName].visible ? 'linked' : false);
- if (!this.tagsVLines[panoName].visible) this.player.$app.gui.toast({
- event: 'DialogList3D.TagManger.unLink',
- content: DialogList3D.TagManger.unLink,
- showClose: true
- });
- } else {
- this.createTagSingleLine(panoIndexes[panoName], 'new', tag);
- }
- this.player.$app.TagManager.emit(this.checkTagLinkStatus());
- }
- }, {
- key: "setTagHideAll",
- value: function setTagHideAll(tag) {
- var _this7 = this;
- //外部调用
- Object.keys(this.tagsVLines).forEach(function (panoName) {
- _this7.tagsVLines[panoName].visible = false;
- _this7.changeIconLinkState(panoIndexes[panoName].footIcon, false);
- });
- }
- }, {
- key: "setTagShowAll",
- value: function setTagShowAll(tag) {
- var _this8 = this;
- //外部调用
- this.footIcons.filter(function (icon) {
- return icon.visible;
- }).forEach(function (icon) {
- var panoName = icon.pano.id;
- if (_this8.tagsVLines[panoName]) {
- _this8.tagsVLines[panoName].visible = true;
- _this8.changeIconLinkState(panoIndexes[panoName].footIcon, 'linked');
- } else {
- _this8.createTagSingleLine(panoIndexes[panoName], 'new', tag);
- }
- });
- }
- }, {
- key: "delVisibleLines",
- value: function delVisibleLines() {
- //xzw add 所有线都删除
- for (var i in this.tagsVLines) {
- this.tagsVLines[i].geometry.dispose();
- this.tagsVLines[i].material.dispose();
- this.meshGroup.remove(this.tagsVLines[i]);
- delete this.tagsVLines[i];
- }
- for (var i in this.panoVLines) {
- this.panoVLines[i].geometry.dispose();
- this.panoVLines[i].material.dispose();
- this.meshGroup.remove(this.panoVLines[i]);
- delete this.panoVLines[i];
- }
- } //--------panoVisible
- }, {
- key: "createPanoVisiLines",
- value: function createPanoVisiLines(pano, isAllFloor) {
- // pano可见性线条
- var neighbours = this.panoVTemp[pano.id] && this.panoVTemp[pano.id].neighbourPanos || pano.neighbourPanos;
- for (var r in neighbours) {
- if (neighbours[r] && r != pano.id && !r.includes('view360_')) {
- // if (panoIndexes[r].floorIndex != pano.floorIndex && !isAllFloor) continue // 多楼层连接点不显示虚线
- this.createPanoSingleLine(pano, 'old', r);
- }
- }
- }
- }, {
- key: "createPanoSingleLine",
- value: function createPanoSingleLine(pano, type, id) {
- //pano是中心
- var pano2 = panoIndexes[id];
- if (pano2.panoType) return; // 过滤掉场景关联pano
- var p2 = pano2.floorPosition.clone();
- var line = LineDraw.createLine([pano.floorPosition.clone(), p2], {
- color: Colors.newBlue,
- deshed: pano2.floorIndex != pano.floorIndex,
- depthTest: false,
- transparent: true
- });
- this.meshGroup.add(line);
- line.name = 'PanoVL-' + type + '-' + id;
- pano2.floorIndex != pano.floorIndex && (line.material.opacity = 0.5); //连接到另一楼层的pano
- this.panoVLines[id] = line;
- if (this.activePano) {
- if (pano2.floorIndex != pano.floorIndex) this.changeIconLinkState(panoIndexes[id].footIcon, 'otherFloorLink');else this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
- }
- }
- }, {
- key: "dealPanoVisible",
- value: function dealPanoVisible(panoId, icon) {
- var _this9 = this;
- //外部调用
- if (this.setMultiFloorPanoVisible) {
- // 设置多楼层连接点时(点击的icon都是要添加的,无法取消)
- if (this.linkToFloorPano) {
- //取消旧的
- var lastIcon = this.linkToFloorPano.footIcon;
- this.changeIconLinkState(lastIcon, false);
- var isLinkingFloor = this.changeFloorIconState(lastIcon);
- if (!isLinkingFloor) {
- lastIcon.status = 'visible';
- lastIcon.material.uniforms.map.value = this.linkToFloorPano.hasVideo ? this.footTex1_v : this.footTex1;
- }
- } else {
- this.player.$app.WalkManager.emit('walkManager.multiFloorLinking', true); //解锁确定按钮
- }
- this.linkToFloorPano = icon.pano;
- this.changeIconLinkState(icon, 'center');
- if (this.setMultiFloorPanoVisible == 'upper') {
- // 下楼点
- icon.status = 'floor';
- icon.material.uniforms.map.value = this.footTex6;
- } else {
- icon.status = 'floor';
- icon.material.uniforms.map.value = this.footTex5;
- }
- } else if (icon && icon.type == 'FootIcon') {
- //切换activePano
- if (this.activePano) {
- if (panoId == this.activePano.id) {
- if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
- // 关闭当前pano设置
- this.player.$app.WalkManager.emit('walkManager.deactive');
- this.pauseSetPanoVisible('unsaved'); // 将actionIcon切换到是否可视(眼睛模式)
- this.actionIcons.forEach(function (i) {
- return i.material.map = i.footIcon.status == 'invisible' ? _this9.actionVisiTex0 : _this9.actionVisiTex1;
- }); // toast: `单击设置点位漫游可行。`
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.deactive',
- content: DialogList3D.WalkManger.deactive
- });
- } else {
- this.lastFloorActivePano = null;
- this.pauseSetPanoVisible('unsaved');
- this.SetOnePanoVisible(panoIndexes[panoId]);
- this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
- }
- } else {
- // 激活当前pano设置
- this.lastFloorActivePano = null;
- this.SetOnePanoVisible(panoIndexes[panoId]);
- this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
- }
- } else if (!icon || icon.type == 'ActionIcon') {
- if (this.activePano) {
- // 连接 或 取消连接
- var link;
- if (this.panoVLines[panoId]) {
- this.panoVLines[panoId].visible = !this.panoVLines[panoId].visible;
- link = this.panoVLines[panoId].visible;
- this.changeIconLinkState(panoIndexes[panoId].footIcon, panoIndexes[panoId].footIcon.visible ? this.panoVLines[panoId].visible ? 'linked' : false : 'otherFloorLink');
- } else {
- this.createPanoSingleLine(this.activePano, 'new', panoId);
- link = true;
- }
- if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
- if (link) {
- // 如果进行连接,直接判断该点是可见的(有附近点),(不能通过checkHasNeighbor来判断,因为新增的线条可能不在它的neighbour中
- this.changeIconVisiState(panoIndexes[panoId].footIcon, true);
- this.changeIconVisiState(this.activePano.footIcon, true); // 只当点击ActionIcon时才toast
- if (icon && icon.type == 'ActionIcon') {
- this.player.$app.WalkManager.emit(this.checkLinkStatus());
- }
- } else {
- // 如果取消连接,则需要checkHasNeighbor
- var firstViewPano = this.player.$app.core.get('Scene').firstView.pano;
- if (panoIndexes[panoId].floorIndex != this.activePano.floorIndex) {
- //取消楼层连接点 xzw
- panoIndexes[panoId].footIcon.visible = false;
- } else {
- var pickPanoCheck = this.checkHasNeighbor(panoIndexes[panoId]);
- this.changeIconVisiState(panoIndexes[panoId].footIcon, pickPanoCheck);
- }
- var activePanoCheck = this.checkHasNeighbor(this.activePano); //let activePanoCheck2 = this.checkHasNeighbor(panoIndexes[panoId]) -----被驳回,所以先注释
- this.changeIconVisiState(this.activePano.footIcon, activePanoCheck);
- if (icon && icon.type == 'ActionIcon') {
- this.player.$app.WalkManager.emit(this.checkLinkStatus());
- if (!activePanoCheck && this.activePano == firstViewPano
- /* || (!activePanoCheck2 && panoIndexes[panoId] == firstViewPano)-----被驳回,所以先注释 */
- ) {
- // toast: `初始点位无法隐藏。`
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.firstPointLimit',
- content: DialogList3D.WalkManger.firstPointLimit
- });
- this.dealPanoVisible(panoId, icon); //还原
- return;
- }
- if (!activePanoCheck) {
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.hide',
- content: DialogList3D.WalkManger.hide
- });
- }
- }
- }
- } else {
- // 显示 或 隐藏
- // // var neighbours = (this.panoVTemp[panoIndexes[panoId].id] && this.panoVTemp[panoIndexes[panoId].id].neighbourPanos) || panoIndexes[panoId].neighbourPanos
- // // let neigbIds = Object.keys(neighbours)
- if (icon.footIcon.status == 'invisible') {
- //变为可见点
- if (this.panoVTemp[panoId]) {
- // 未保存 还原保存前的neighbourPanos
- var neighbourIds = Object.keys(this.panoVTemp[panoId].neighbourPanos).filter(function (id) {
- return !id.includes('view360_') && id != panoId;
- });
- var a = neighbourIds.filter(function (id) {
- return _this9.checkHasNeighbor(panoIndexes[id]);
- }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
- if (a.length) neighbourIds = a;else neighbourIds = neighbourIds.slice(0, 1);
- var change = [];
- neighbourIds.forEach(function (nId) {
- change.push({
- type: 'add',
- id: nId
- });
- });
- this.savePanoVisiChange(panoId, change);
- } else {
- // 已保存,自动计算neighbourPanos(有可能变为楼层连接点)
- var _neighbourIds = convertTool.getVisiblePano(panoIndexes[panoId].position, this.player.model).map(function (pano) {
- return pano.id;
- }).filter(function (id) {
- return id != panoId;
- });
- if (_neighbourIds.length == 0) {
- //随便选一个近的点吧(没有验证过)
- var list = common$1.sortByScore(panos, [function (e) {
- return e.isAligned();
- }], [function (pano) {
- return -pano.position.distanceTo(panoIndexes[panoId].position);
- }]);
- var pano0 = list.map(function (e) {
- return e.item;
- }).find(function (pano) {
- return _this9.checkHasNeighbor(pano);
- }); //尽量不选择已经隐藏了的
- if (pano0) _neighbourIds = [pano0.id];else _neighbourIds = [list[0].item.id];
- } else {
- var _a = _neighbourIds.filter(function (id) {
- return _this9.checkHasNeighbor(panoIndexes[id]);
- }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
- if (_a.length) _neighbourIds = _a;else _neighbourIds = _neighbourIds.slice(0, 1);
- }
- var _change = [];
- _neighbourIds.forEach(function (nId) {
- return _change.push({
- type: 'add',
- id: nId
- });
- });
- this.savePanoVisiChange(panoId, _change);
- } // toast: '该点位已显示'
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.show',
- content: DialogList3D.WalkManger.show
- });
- } else {
- //变为不可见点
- var firstView = this.player.$app.core.get('Scene').firstView;
- var isHideFirstView = firstView.pano.footIcon == icon.footIcon;
- if (isHideFirstView) {
- // toast: `初始点位无法隐藏。`
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.firstPointLimit',
- content: DialogList3D.WalkManger.firstPointLimit
- });
- return false;
- }
- /* let p = this.getCurNeighbors(firstView.pano) -----被驳回,所以先注释
- let firstViewWillHide = p.length == 1 && p.includes(panoId) */
- this.createPanoVisiLines(panoIndexes[panoId], true);
- Object.values(this.panoVLines).forEach(function (line) {
- /* if (firstViewWillHide && line.name.split('-')[2] == firstView.pano.id) {-----被驳回,所以先注释
- this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit })
- return
- } */
- line.visible = false;
- }); // toast: '已隐藏该点位,漫游时将不再显示'
- /* firstViewWillHide || */
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.hide',
- content: DialogList3D.WalkManger.hide
- });
- this.saveLastPanoVi(panoIndexes[panoId]); // this.pauseSetPanoVisible('unsaved')
- this.delVisibleLines();
- }
- panos.forEach(function (pano) {
- return _this9.changeIconVisiState(pano.footIcon, _this9.checkHasNeighbor(pano));
- });
- }
- }
- this.updateFootIconSize();
- }
- }, {
- key: "showFootIcons",
- value: function showFootIcons(centerPano, isPanovisible, currentFloor) {
- var _this10 = this;
- if (!this.footIcons) {
- this.footIcons = [];
- this.actionIcons = [];
- var scale = 0.4;
- scale *= 40 / Math.sqrt(Math.min(this.player.domElement.clientWidth, this.player.domElement.clientHeight)); //屏幕越小,放得越大
- scale = THREE.MathUtils.clamp(scale, 0.3, 0.7); // console.error("scale"+scale)
- var geo = new THREE.PlaneGeometry(scale, scale, 1, 1);
- var actionGeo = geo.clone();
- actionGeo.scale(0.5, 0.5, 0.5);
- panos.forEach(function (pano) {
- var foot = new FootIcon(geo, pano);
- foot.material.uniforms.map.value = pano.hasVideo ? _this10.footTex1_v : _this10.footTex1;
- foot.visible = false;
- pano.footIcon = foot;
- var actionIcon = new ActionIcon(foot, actionGeo, pano);
- actionIcon.material.map = _this10.actionLinkTex0;
- foot.actionIcon = actionIcon;
- _this10.meshGroup.add(foot);
- foot.add(actionIcon);
- _this10.footIcons.push(foot);
- _this10.actionIcons.push(actionIcon);
- });
- }
- currentFloor = currentFloor || this.player.model.currentFloor;
- panos.forEach(function (pano) {
- if (pano.label.parent != pano.footIcon) {
- pano.label._oriScale = pano.label.scale.x;
- var numS = 1.65 * pano.label.scale.x;
- pano.label.scale.set(numS, numS, numS);
- pano.footIcon.add(pano.label);
- pano.footIcon.label = pano.label;
- }
- if (pano.floor == currentFloor) {
- pano.footIcon.visible = true;
- _this10.changeIconLinkState(pano.footIcon, false);
- if (isPanovisible) {
- _this10.changeIconVisiState(pano.footIcon, _this10.checkHasNeighbor(panoIndexes[pano.id], 'beforeCreateLine'));
- }
- if (centerPano && pano == centerPano) {
- //pano为中心 或者 currentPano 所以放大一点
- pano.footIcon.oriScale = new THREE.Vector3(1.5, 1.5, 1.5);
- if (isPanovisible) {
- //currentPano特殊些:
- _this10.changeIconLinkState(pano.footIcon, 'center');
- }
- } else {
- pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
- pano.footIcon.actionIcon.visible = true;
- }
- } else {
- var neighbourUUIDs = _this10.panoVTemp && _this10.panoVTemp[pano.id] ? _this10.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
- var linkToActivePano = neighbourUUIDs.filter(function (id) {
- return centerPano && id == centerPano.id;
- });
- pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
- if (linkToActivePano.length > 0) {
- if (isPanovisible) {
- _this10.changeFloorIconState(pano.footIcon);
- }
- _this10.changeIconLinkState(pano.footIcon, 'otherFloorLink');
- } else {
- pano.footIcon.visible = false;
- }
- }
- });
- }
- }, {
- key: "checkHasNeighbor",
- value: function checkHasNeighbor(pano, state) {
- //检查当前状态pano点是否有可通行点
- var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
- if (state != 'beforeCreateLine' && pano == this.activePano) {
- //是中心点的话。state == "beforeCreateLine"代表是showFootIcon时, 这时候线还没创建,无法用线判断中心点有几个相邻点,直接用neighbourPanos
- for (var i in this.panoVLines) {
- if (this.panoVLines[i].visible) {
- return true; //有一条线即可
- }
- }
- return;
- }
- for (var i in neighbours) {
- if (i == pano.id || isNaN(parseInt(i))) continue;
- if (neighbours[i]) {
- 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;
- return true;
- }
- }
- return false;
- }
- }, {
- key: "getCurNeighbors",
- value: function getCurNeighbors(pano) {
- //检查当前状态pano点是否有可通行点
- var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
- var neighbourIds = [];
- for (var i in neighbours) {
- if (i == pano.id || isNaN(parseInt(i))) continue;
- if (neighbours[i]) {
- 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);
- }
- }
- return neighbourIds;
- }
- }, {
- key: "ifAllPanoNoNeighbor",
- value: function ifAllPanoNoNeighbor() {
- //检查是否全是孤立点
- for (var i in panoIndexes) {
- if (!panoIndexes[i].isAligned()) continue;
- if (this.checkHasNeighbor(panoIndexes[i])) {
- return false;
- }
- }
- this.noPanoHasNeighbor = true;
- return true; //是全部没有neighbour
- }
- }, {
- key: "changeIconLinkState",
- value: function changeIconLinkState(footIcon, state) {
- if (!footIcon) return;
- var color;
- footIcon.otherFloorLink = false;
- if (state == 'linked') {
- color = Colors.newBlue;
- footIcon.actionIcon.material.map = this.actionLinkTex1;
- }
- if (state == 'otherFloorLink') {
- color = Colors.yellow;
- footIcon.actionIcon.visible = false;
- footIcon.material.uniforms.opacity.value = 0.5;
- footIcon.label.sprite.material.opacity = 0.5;
- footIcon.visible = true; //xzw add
- footIcon.otherFloorLink = true;
- }
- if (state == 'center') {
- color = Colors.yellow;
- footIcon.actionIcon.visible = false;
- }
- if (state == false) {
- color = '#fff';
- footIcon.actionIcon.material.map = this.actionLinkTex0;
- } // footIcon.status = state
- try {
- footIcon.material.uniforms.color.value.set(color);
- footIcon.label.sprite.material.color.set(color);
- } catch (e) {
- console.log(e);
- }
- }
- }, {
- key: "checkLinkStatus",
- value: function checkLinkStatus() {
- this.checkFloorLinkStatus();
- var visibleLines = Object.values(this.panoVLines).filter(function (line) {
- return line.visible;
- });
- var visibleIcon = this.footIcons.filter(function (icon) {
- return icon.visible;
- }); //是连接还是不连接
- if (visibleIcon.length == visibleLines.length + 1) {
- // 全部连接
- return 'walkManager.linkAll';
- } else if (visibleLines.length == 0) {
- // 没有连接
- return 'walkManager.linkNone';
- } else {
- // 部分连接
- return 'walkManager.linkSome';
- }
- }
- }, {
- key: "changeIconVisiState",
- value: function changeIconVisiState(footIcon, state) {
- if (!footIcon) return; // 初始点位永远可见
- if (footIcon.pano == this.player.$app.core.get('Scene').firstView.pano) state = true; //是可见点还是不可见点
- if (state) {
- footIcon.status = 'visible';
- footIcon.material.uniforms.map.value = footIcon.pano.hasVideo ? this.footTex1_v : this.footTex1; // 眼睛变亮
- if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex1;
- footIcon.otherFloorLink || (footIcon.material.uniforms.opacity.value = 1, footIcon.label.sprite.material.opacity = 1);
- this.changeFloorIconState(footIcon);
- } else {
- //不可见
- footIcon.status = 'invisible';
- var footIconMap = footIcon.material.uniforms.map;
- footIconMap.value = footIcon.pano.hasVideo ? this.footTex2_v : this.footTex2; // 眼睛变暗
- if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex0;
- if (!this.activePano || this.activePano.id != footIcon.name) {
- //非中心点时
- footIcon.material.uniforms.opacity.value = 0.5;
- footIcon.label.sprite.material.opacity = 0.5;
- } else {
- //变为中心点时
- footIcon.material.uniforms.opacity.value = 1;
- footIcon.label.sprite.material.opacity = 1; // toast: `该点位已隐藏,点击可显示。`
- this.player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.activeHidePoint',
- content: DialogList3D.WalkManger.activeHidePoint
- });
- }
- }
- }
- }, {
- key: "changeFloorIconState",
- value: function changeFloorIconState(footIcon) {
- var _this11 = this;
- if (!footIcon) return; //是否为楼层连接点
- var pano = panoIndexes[footIcon.name];
- var neighbourUUIDs = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
- var linkToOtherFloor = neighbourUUIDs.filter(function (id) {
- return panoIndexes[id].floorIndex != pano.floorIndex && (!_this11.activePano || !_this11.panoVLines[id] || _this11.panoVLines[id].visible);
- }).map(function (id) {
- return panoIndexes[id].floor;
- });
- if (linkToOtherFloor.length) {
- // 因为负楼层的问题,不能使用floorIndex
- if (this.getFloorOrder(linkToOtherFloor[0]) > this.getFloorOrder(pano.floor)) {
- //(linkToOtherFloor[0].center.y > pano.floor.center.y) {
- // 上楼点
- footIcon.status = 'floor';
- footIcon.material.uniforms.map.value = this.footTex5;
- } else if (this.getFloorOrder(linkToOtherFloor[0]) < this.getFloorOrder(pano.floor)) {
- // 下楼点
- footIcon.status = 'floor';
- footIcon.material.uniforms.map.value = this.footTex6;
- }
- return true;
- } else {
- // 不是楼层连接点
- return false;
- }
- } // 获取离指定pano最近的上一层或下一层的pano(dir: "up"|"down")
- }, {
- key: "getClosestOtherFloorPano",
- value: function getClosestOtherFloorPano(pano, dir) {
- return this.player.model.panos.closestPanoTowardPoint({
- point: pano.position,
- getAll: true
- }).map(function (p) {
- return p.pano;
- }).filter(function (p) {
- return dir == 'up' ? p.floorIndex > pano.floorIndex : p.floorIndex < pano.floorIndex;
- })[0];
- } //xzw改 2023.6.7和ui一致,根据floorplan.json 中的id来定楼顺序-------
- }, {
- key: "checkFloorLinkStatus",
- value: function checkFloorLinkStatus() {
- var _this12 = this;
- var linkFloorStatus = 'walkManager.unlinkFloor';
- var neighbours = this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs || panoIndexes[this.activePano.id].neighbourUUIDs;
- var otherFloorPano = neighbours.map(function (pId) {
- return panoIndexes[pId];
- }).filter(function (pano) {
- return pano.floorIndex != _this12.activePano.floorIndex && (!_this12.activePano || !_this12.panoVLines[pano.id] || _this12.panoVLines[pano.id].visible);
- })[0]; // 目前只检测单对单连接
- if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) > this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkUpperFloor';
- if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) < this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkLowerFloor'; //暂时不考虑两种都存在的情况
- this.player.$app.WalkManager.emit(linkFloorStatus);
- }
- }, {
- key: "getFloorOrder",
- value: function getFloorOrder(floor) {
- var floorsData = this.player.$app.store.getValue('flooruser').floors;
- var curInfo = floorsData.find(function (e) {
- return e.subgroup == floor.floorIndex;
- });
- return curInfo.id;
- }
- }, {
- key: "getFloor",
- value: function getFloor(floorIndex, type) {
- //获取上一层或下一层
- var floors = this.player.model.floors;
- floors.index[floorIndex];
- var floorsData = this.player.$app.store.getValue('flooruser').floors;
- var curInfo = floorsData.find(function (e) {
- return e.subgroup == floorIndex;
- });
- var id = type == 'upper' ? curInfo.id + 1 : curInfo.id - 1;
- var upperInfo = floorsData.find(function (e) {
- return e.id == id;
- }); //id代表楼层
- console.log('getFloor', type, floorIndex, upperInfo.subgroup);
- return upperInfo.subgroup; //subgroup就是floorIndex
- } //--------------------------------------------
- /* getUpperFloor(floorIndex) {
- let floors = this.player.model.floors
- let currentFloor = floors.index[floorIndex]
- let upperFloor = {
- index: floorIndex,
- height: 9999,
- }
- floors.list.forEach(floor => {
- if (
- floor.center.y > currentFloor.center.y && // 上面的楼层
- Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
- ) {
- upperFloor.index = floor.floorIndex
- upperFloor.height = floor.center.y
- }
- })
- return upperFloor.index
- }
- getLowerFloor(floorIndex) {
- let floors = this.player.model.floors
- let currentFloor = floors.index[floorIndex]
- let upperFloor = {
- index: floorIndex,
- height: 9999,
- }
- floors.list.forEach(floor => {
- if (
- floor.center.y < currentFloor.center.y && // 下面的楼层
- Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
- ) {
- upperFloor.index = floor.floorIndex
- upperFloor.height = floor.center.y
- }
- })
- return upperFloor.index
- }
-
- checkFloorLinkStatus() {
- let linkFloorStatus = 'walkManager.unlinkFloor'
- let neighbours = (this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs) || panoIndexes[this.activePano.id].neighbourUUIDs
- let othe rFloorPano = neighbours
- .map(pId => panoIndexes[pId])
- .filter(pano => pano.floorIndex != this.activePano.floorIndex && (!this.activePano || !this.panoVLines[pano.id] || this.panoVLines[pano.id].visible))[0] // 目前只检测单对单连接
- if (otherFloorPano && otherFloorPano.floor.center.y > this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkUpperFloor'
- if (otherFloorPano && otherFloorPano.floor.center.y < this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkLowerFloor'
- this.player.$app.WalkManager.emit(linkFloorStatus)
- }
-
-
-
-
- */
- }, {
- key: "recoverAllState2",
- value: function recoverAllState2() {
- //为了热点可视恢复成pano全部可见
- for (var i = 0; i < this.footIcons.length; i++) {
- this.footIcons[i].material.uniforms.opacity.value = 1;
- this.footIcons[i].label.sprite.material.opacity = 1;
- this.footIcons[i].material.uniforms.map.value = this.footIcons[i].pano.hasVideo ? this.footTex1_v : this.footTex1;
- }
- }
- }, {
- key: "hideFootIcons",
- value: function hideFootIcons() {
- if (!this.footIcons) return;
- for (var i = 0; i < this.footIcons.length; i++) {
- this.footIcons[i].visible = false;
- this.footIcons[i].actionIcon.visible = true;
- }
- }
- }, {
- key: "updateFootIconSize",
- value: function updateFootIconSize() {
- if (!this.footIcons) return;
- var player = this.player;
- var s = math$2.getScaleForConstantSize({
- width2d: 240,
- position: new THREE.Vector3(),
- player
- }); //无论任何设备大小,呈现的icon大小一致
- s = THREE.MathUtils.clamp(s, 0.6, 2.5); // 最大值不可太大,否则场景缩小后容易重叠
- this.footIcons.forEach(function (f) {
- f.visible && f.scale.copy(f.oriScale).multiplyScalar(s); // 使footIcons随相机逆旋转,保证其角度不变
- f.quaternion.copy(player.quaternion);
- });
- }
- }, {
- key: "resetTagVisiByModel",
- value: function resetTagVisiByModel() {
- //自动计算所有热点的可视 当模型修改后所有的热点可视都会重新自动计算(用户的设置将被覆盖)
- var visiTags = [];
- for (var i in objects.tagManager.tags) {
- var tag = objects.tagManager.tags[i];
- if (tag.state == 'videoPanoFlag') continue;
- var visiblePanos = tag.getVisiblePanos();
- visiTags.push({
- sid: tag.sid,
- value: visiblePanos
- });
- }
- return visiTags;
- }
- }, {
- key: "afterResetTagVisibles",
- value: function afterResetTagVisibles(visiTags) {
- visiTags.forEach(function (info) {
- objects.tagManager.tags[info.sid].setVisiblePanos(info.value);
- });
- if (objects.player.mode == 'panorama') objects.tagManager.updateVisible('panorama');
- }
- }, {
- key: "resetVisiblesByModel",
- value: function resetVisiblesByModel() {
- //自动计算所有热点和漫游点的可视
- this.resetTagVisiByModel();
- }
- }, {
- key: "gotoFloor",
- value: function gotoFloor(index) {
- var _this13 = this;
- if (this.player.model.currentFloor.floorIndex != index) return;
- var floor = this.player.model.floors.index[index]; // 记录跳转楼层前的activePano,用于跳回时再激活
- // 跳转其他floor后没有新activepano,则在跳转回该floor时激活lastFloorActivePano
- // 跳转其他floor后有新activepano,则lastFloorActivePano赋值为null
- if (this.activePano) this.lastFloorActivePano = this.activePano;
- if (this.setTagVisible) {
- //this.pauseSetTagVisible('unsaved', floor)
- if (this.tagVsetting) {
- this.hideFootIcons();
- this.showFootIcons();
- for (var id in this.tagsVLines) {
- if (panoIndexes[id].floor.floorIndex == this.player.model.currentFloor.floorIndex && this.tagsVLines[id].visible) {
- this.tagsVLines[id].material.opacity = 1;
- this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
- } else {
- this.tagsVLines[id].material.opacity = 0.4;
- }
- }
- }
- } else if (this.setPanoVisible) {
- this.pauseSetPanoVisible('unsaved', floor);
- setTimeout(function () {
- if (_this13.lastFloorActivePano && _this13.lastFloorActivePano.floorIndex == index) {
- _this13.SetOnePanoVisible(_this13.lastFloorActivePano);
- _this13.player.$app.WalkManager.emit('walkManager.active', _this13.checkLinkStatus());
- } else {
- _this13.player.$app.WalkManager.emit('walkManager.deactive');
- }
- }, 1);
- } //var size = this.getFitBoundSize(floor)
- this.focusFloor(floor);
- }
- }, {
- key: "focusFloor",
- value: function focusFloor(floor) {
- floor = floor || this.player.model.currentFloor;
- var bound = floor.boundingBox.clone();
- if (this.setTagVisible) {
- this.player.$app.TagManager.tags.forEach(function (tag) {
- if (tag.floorIndex == floor.floorIndex) {
- bound.expandByPoint(tag.position);
- }
- });
- }
- var center = bound.getCenter(new THREE.Vector3());
- var size = bound.getSize(new THREE.Vector3());
- this.player.focusPoint({
- modelSize: size,
- aim: center
- });
- }
- /* getFitBoundSize(floor, size_) {
- if (!size_) {
- size_ = floor.size
- }
- var MinWidth = (this.player.domElement.clientWidth + this.player.domElement.clientHeight) / 160 //size的x和z不小于MinWidth是为了防止当bound很小时放太大 根据屏幕大小,如果屏幕小会被缩小所以放大些
- var w = size_.x
- var h = size_.y
- var size = new THREE.Vector3(
- w < MinWidth ? (MinWidth + floor.size.x) / 2 : Math.min(w + floor.size.x * 0.3, floor.size.x),
- 1,
- h < MinWidth ? (MinWidth + floor.size.z) / 2 : Math.min(h + floor.size.z * 0.3, floor.size.z)
- )
- return size
- } */
- }]);
- return Link;
- }();
- var FootIcon = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(FootIcon, _THREE$Mesh);
- var _super = _createSuper$1m(FootIcon);
- function FootIcon(geo, pano) {
- var _this14;
- _classCallCheck(this, FootIcon);
- _this14 = _super.call(this);
- _this14.geometry = geo;
- _this14.material = new THREE.RawShaderMaterial({
- vertexShader: shaders.waypoint.vertexShader,
- fragmentShader: shaders.waypoint.fragmentShader,
- uniforms: THREE.UniformsUtils.clone(shaders.waypoint.uniforms),
- // side: THREE.DoubleSide,
- transparent: !0,
- depthWrite: !1,
- depthTest: false,
- name: 'footIcon'
- });
- _this14.material.uniforms.color.value.set('#ffffff');
- _this14.renderOrder = RenderOrder.footIcon;
- _this14.type = 'FootIcon';
- _this14.name = pano.id;
- _this14.pano = pano;
- _this14.status = '';
- _this14.position.copy(pano.floorPosition.clone());
- _this14.position.y /= 100; //使之集体小于action的高度
- _this14.lookAt(_this14.position.clone().add(new THREE.Vector3(0, 1, 0)));
- return _this14;
- }
- return FootIcon;
- }(THREE.Mesh);
- /**
- * 勾图标
- */
- var ActionIcon = /*#__PURE__*/function (_THREE$Mesh2) {
- _inherits(ActionIcon, _THREE$Mesh2);
- var _super2 = _createSuper$1m(ActionIcon);
- function ActionIcon(footIcon, geo, pano) {
- var _this15;
- _classCallCheck(this, ActionIcon);
- _this15 = _super2.call(this);
- _this15.geometry = geo;
- _this15.material = new THREE.MeshBasicMaterial({
- //MeshPhongMaterial
- // side: THREE.DoubleSide,
- transparent: !0,
- depthTest: false,
- name: 'footIcon'
- });
- _this15.footIcon = footIcon;
- _this15.renderOrder = RenderOrder.footIcon + 1;
- _this15.type = 'ActionIcon';
- _this15.name = pano.id;
- _this15.pano = pano;
- _this15.position.set(0.2, 0.2, 1); //z是高度,抬高是为了点击时优先于footIcon被选中. 为了遮住所有高低不等的footicon,z需要设置高一些
- return _this15;
- }
- return ActionIcon;
- }(THREE.Mesh);
- 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); }; }
- 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; } }
- var DollLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(DollLabel, _THREE$EventDispatche);
- var _super = _createSuper$1l(DollLabel);
- function DollLabel(player, o) {
- var _this;
- _classCallCheck(this, DollLabel);
- _this = _super.call(this);
- _this.player = player;
- _this.position = o.pos;
- _this.sid = o.sid;
- _this.text = o.text || '';
- _this.toPano = o.toPano;
- _this.clickFun = o.clickFun;
- _this.noLine = o.noLine;
- _this.driftDir = o.driftDir;
- _this.floorIndex = o.floorIndex;
- _this.elem = document.createElement('div');
- _this.elem.className = 'room-label';
- _this.elem.style.display = 'none';
- _this.elem.innerHTML = "<a><p><span>".concat(_this.text, "</span></p></a>");
- o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-doll-labels').append(_this.elem);
- _this.player.dollLabels.push(_assertThisInitialized(_this));
- _this.elem.addEventListener('click', _this.clickFuc.bind(_assertThisInitialized(_this)));
- _this.enable = true;
- _this.type = 'doll';
- _this.pos2d = new THREE.Vector3();
- if (_this.noLine) _this.elem.className += ' noLine'; //去掉线的话
- _this.visible = true; //2023.6新增 用于控制多原因隐藏
- player.on('beginShowMonitor', function () {
- common$1.updateVisible(_assertThisInitialized(_this), 'showMonitor', false);
- });
- player.on('leavedShowMonitor', function () {
- common$1.updateVisible(_assertThisInitialized(_this), 'showMonitor', true);
- });
- return _this;
- }
- _createClass(DollLabel, [{
- key: "changeText",
- value: function changeText(t) {
- this.elem.querySelector('span').innerHTML = this.text = t;
- }
- }, {
- key: "update",
- value: function update() {
- //enable只和是否有cad图相关
- 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) // ))
- ) {
- this.elem.style.display = 'none';
- return;
- }
- var p = convertTool.getPos2d(this.position, this.player);
- if (!p.trueSide) {
- this.elem.style.display = 'none';
- return;
- } //判断label是否被模型遮挡,遮挡则消失
- if (convertTool.ifShelter(this.position, this.player, {
- x: p.vector.x,
- y: p.vector.y
- }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
- this.elem.style.display = 'none';
- return;
- }
- this.elem.style.display = ''; //先显示,driftDir才能计算位置
- if (this.driftDir) {
- //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
- var driftPoint = convertTool.getPos2d(this.position.clone().add(this.driftDir), this.player); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
- var rect = this.elem.children[0].getBoundingClientRect();
- 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);
- var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
- var dis = this.position.distanceTo(this.player.camera.position);
- var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
- //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
- var result = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
- this.elem.style.left = result.x + 'px';
- this.elem.style.top = result.y + 'px';
- } else {
- this.elem.style.left = p.pos.x + 'px';
- this.elem.style.top = p.pos.y + 'px';
- }
- this.pos2d = p.vector;
- }
- }, {
- key: "clickFuc",
- value: function clickFuc() {
- if (this.toPano) this.player.flyToPano({
- pano: this.toPano
- });else if (this.clickFun) this.clickFun();
- }
- }, {
- key: "remove",
- value: function remove() {
- var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
- parentElem && parentElem.removeChild(this.elem);
- var a = this.player.dollLabels.indexOf(this);
- if (a > -1) this.player.dollLabels.splice(a, 1);
- }
- }]);
- return DollLabel;
- }(THREE.EventDispatcher);
- 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); }; }
- 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; } }
- var arrowHeight = 0.4;
- var arrowLength = 1.6;
- var arrowSpace = 1.8;
- var _scale$1 = 0.2;
- var oriVec = new THREE.Vector3(0, 0, -1); //箭头初始朝向
- var matDefault = new THREE.MeshStandardMaterial({
- //默认材质
- transparent: true,
- color: new THREE.Color(1, 1, 1),
- opacity: 0.45,
- metalness: 1,
- //太低没有光照效果, 需要比emissive高一丢丢
- emissive: new THREE.Color(0.85, 0.85, 0.85)
- });
- var matHighLight = matDefault.clone(); //高亮材质
- matHighLight.opacity = 0.9;
- var arrowGeo; //入户门的箭头动画
- var EntryArrow = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(EntryArrow, _THREE$Object3D);
- var _super = _createSuper$1k(EntryArrow);
- function EntryArrow(player, entryInfo) {
- var _this;
- _classCallCheck(this, EntryArrow);
- _this = _super.call(this);
- _this.player = player;
- var count = 4;
- var arrow = _this.createArrow();
- _this.add(arrow);
- arrow.oriPosition = arrow.position.clone();
- for (var i = 1; i < count; i++) {
- var arrow_ = arrow.clone();
- arrow_.position.setZ(i * arrowSpace);
- arrow_.oriPosition = arrow_.position.clone();
- _this.add(arrow_);
- }
- _this.name = 'entryArrow';
- player.model.add(_assertThisInitialized(_this));
- _this.scale.set(_scale$1, _scale$1, _scale$1); //this.scale.set(0.25,0.25,0.18)
- _this.setPosition(entryInfo);
- _this.currentHighLight = 0; //当前高亮的index
- _this.traverse(function (e) {
- e.renderOrder = RenderOrder.entryArrow;
- });
- console.log('create entryArrow');
- return _this;
- }
- _createClass(EntryArrow, [{
- key: "createArrow",
- value: function createArrow() {
- if (!arrowGeo) {
- var points = [{
- x: 0,
- y: 0
- }, {
- x: 1,
- y: arrowLength / 2
- }, {
- x: 1,
- y: arrowLength
- }, {
- x: 0,
- y: arrowLength / 2
- }, {
- x: -1,
- y: arrowLength
- }, {
- x: -1,
- y: arrowLength / 2
- }];
- var arrowShape = new THREE.Shape(); //先画一个二维的箭头顶视图
- arrowShape.moveTo(points[0].x, points[0].y);
- for (var i = 1, len = points.length; i < len; i++) {
- arrowShape.lineTo(points[i].x, points[i].y);
- }
- arrowShape.lineTo(points[0].x, points[0].y);
- arrowGeo = new THREE.ExtrudeBufferGeometry(arrowShape, {
- depth: arrowHeight,
- bevelEnabled: false
- }); //挤出成模型
- }
- var arrow = new THREE.Mesh(arrowGeo, matDefault);
- arrow.rotation.x = Math.PI / 2; //水平放置
- return arrow;
- }
- }, {
- key: "setPosition",
- value: function setPosition(entryInfo) {
- //设置入户门方位
- //if(!metadata.cadInfo || (typeof metadata.cadInfo == "string" ? metadata.cadInfo.includes('"bound"') : metadata.cadInfo.bound))return;//代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
- var left = new THREE.Vector3(entryInfo.points2d[0].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[0].y);
- var right = new THREE.Vector3(entryInfo.points2d[1].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[1].y);
- var entryPos = left.clone().add(right).multiplyScalar(0.5); //箭头就设定在门底部中央
- var doorTangent = left.clone().sub(right).normalize();
- var leftMat4 = new THREE.Matrix4();
- leftMat4.set(0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1);
- doorTangent.applyMatrix4(leftMat4);
- var dir = entryInfo.openSide == 'LEFT' ? doorTangent.multiplyScalar(-1) : doorTangent;
- if (entryInfo.enter == 'reverse') {
- //翻转
- entryPos.add(dir.clone().multiplyScalar(left.distanceTo(right)));
- dir.multiplyScalar(-1);
- }
- this.enterDir = dir;
- this.position.copy(entryPos);
- var qua = math$2.getQuaBetween2Vector(oriVec, dir, new THREE.Vector3(0, 1, 0));
- this.quaternion.copy(qua);
- this.addLabel(entryPos, dir, entryInfo.floorIndex);
- this.entryPos = entryPos;
- }
- }, {
- key: "addLabel",
- value: function addLabel(entryPos, dir, floorIndex) {
- //创建入户门标识
- var closetPano = this.player.model.panos.closestPanoTowardPoint({
- point: entryPos
- });
- if (!closetPano) {
- console.error('what!!! no closetPano');
- } //pos为箭头末端位置, driftDir偏移反方向
- var arrowWholeLen = (arrowSpace * 3 + arrowLength) * _scale$1; //总长度
- this.dollLabelOriPos = entryPos.clone().sub(dir.clone().multiplyScalar(arrowWholeLen)); // TODO text 多语言
- var dollLabel = new DollLabel(this.player, {
- sid: 'entry',
- pos: this.dollLabelOriPos,
- driftDir: dir,
- noLine: true,
- text: config$6.i18n('model.enter'),
- toPano: closetPano,
- floorIndex
- });
- this.player.defaultRoomLabels.push(dollLabel);
- this.dollLabel = dollLabel;
- }
- }, {
- key: "moveCloseToWall",
- value: function moveCloseToWall(shift) {
- //移动到户型图墙壁边缘 和cadFloorPlane有关
- this.children.forEach(function (mesh) {
- mesh.position.z = mesh.oriPosition.z + shift;
- });
- this.dollLabel.position = this.dollLabelOriPos.clone().sub(this.enterDir.clone().multiplyScalar(shift * _scale$1));
- }
- }, {
- key: "reSetHeight",
- value: function reSetHeight(y) {
- this.position.setY(y);
- this.dollLabel.position.y = y;
- this.dollLabelOriPos.y = y;
- } //----暂时是private------
- }, {
- key: "animate",
- value: function animate() {
- var _this2 = this;
- this.children.forEach(function (mesh, index) {
- if (index == _this2.currentHighLight) {
- mesh.material = matHighLight;
- } else {
- mesh.material = matDefault;
- }
- });
- this.currentHighLight = (this.currentHighLight - 1 + this.children.length) % this.children.length;
- this.stopAnimation(); //防止重复启动animate
- this.animation = setTimeout(this.animate.bind(this), 200);
- }
- }, {
- key: "stopAnimation",
- value: function stopAnimation() {
- clearTimeout(this.animation);
- this.animation = null;
- } //-----------------------
- }, {
- key: "dispose",
- value: function dispose() {
- this.parent.remove(this);
- this.stopAnimation();
- }
- }, {
- key: "show",
- value: function show() {
- this.visible = true;
- this.animate();
- }
- }, {
- key: "hide",
- value: function hide() {
- this.visible = false;
- this.stopAnimation();
- }
- }], [{
- key: "switchDepthTest",
- value: function switchDepthTest(state) {
- matDefault.depthTest = state;
- matHighLight.depthTest = state;
- }
- }]);
- return EntryArrow;
- }(THREE.Object3D);
- var axis = {
- forward: new THREE.Vector3(0, 0, -1),
- back: new THREE.Vector3(0, 0, 1),
- left: new THREE.Vector3(-1, 0, 0),
- right: new THREE.Vector3(1, 0, 0)
- };
- var DoorLabel = /*#__PURE__*/function () {
- function DoorLabel(player, o) {
- _classCallCheck(this, DoorLabel);
- this.player = player;
- this.position = o.pos; //大约在门的位置
- this.text = o.text || '';
- this.aim = o.aim; //tagging的位置
- this.toPano = o.toPano;
- this.door = o.door;
- this.visiblePanos = o.visiblePanos;
- this.sameRoomPanos = o.sameRoomPanos;
- this.doorDir = o.doorDir;
- this.floorIndex = o.floorIndex;
- this.enable = o.enable == void 0 ? true : o.enable;
- this.elem = document.createElement('div');
- this.elem.className = 'door show-arrow';
- this.elem.style.display = 'none';
- this.elem.innerHTML = "<a>".concat(this.text, "</a>");
- o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doors').append(this.elem);
- this.player.doorLabels.push(this);
- this.elem.addEventListener('pointerup', this.clickFuc.bind(this));
- this.type = 'door';
- this.pos2d = new THREE.Vector3();
- this.getDirection(); //初始化朝向
- this.updateVisible();
- }
- _createClass(DoorLabel, [{
- key: "updateVisible",
- value: function updateVisible(toPano) {
- if (toPano) {
- //飞之前,判断目的地是否是该房间内的,若不是,就直接隐藏;否则等到飞到之后再判断
- if (this.sameRoomPanos.includes(toPano)) ; else {
- this.enable = false;
- }
- } else {
- if (this.visiblePanos.includes(this.player.currentPano)) {
- this.enable = true;
- } else {
- this.enable = false;
- }
- }
- }
- }, {
- key: "update",
- value: function update() {
- 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) // ||
- // store.getters.page == 'cad' ||
- // store.getters.page == 'data'
- // ))
- ) {
- this.elem.style.display = 'none';
- return;
- }
- var p = convertTool.getPos2d(this.position, this.player);
- if (!p.trueSide) {
- this.elem.style.display = 'none';
- return;
- }
- /* if(convertTool.ifShelter(this.position, {x:p.vector.x, y: p.vector.y} )){
- this.elem.css('display','none'); return;
- } */
- this.elem.style.left = p.pos.x + 'px';
- this.elem.style.top = p.pos.y + 'px';
- if (settings$3.vrEnabled) {
- this.elem.style.transform = 'rotate(' + window.screenFaceOrient + 'deg)';
- } else {
- this.elem.style.transform = '';
- }
- this.elem.style.display = '';
- this.pos2d = p.vector;
- }
- }, {
- key: "getDirection",
- value: function getDirection() {
- //初始化doorLabel箭头朝向。决定了每个label的className (箭头朝向门内,不朝向tagging,因为tagging的位置会在房间任意地方,导致可能箭头指向门外)
- var toward = DoorLabel.getToward(this.doorDir);
- this.elem.className += ' ' + toward;
- }
- }, {
- key: "clickFuc",
- value: function clickFuc(e) {
- if (this.toPano) {
- //看向tagging
- e.stopPropagation();
- this.player.flyToPano({
- pano: this.toPano,
- lookAtPoint: this.aim.clone().setY(this.toPano.position.y),
- duration: 1800
- });
- } else {
- console.error('doorlabel没有toPano');
- }
- }
- }, {
- key: "remove",
- value: function remove() {
- var parentElem = this.elem.parentElement;
- parentElem.removeChild(this.elem);
- var a = this.player.doorLabels.indexOf(this);
- if (a > -1) this.player.doorLabels.splice(a, 1);
- }
- }], [{
- key: "getToward",
- value: function getToward(dir) {
- //传入方向后,归类四种朝向
- for (var u in axis) {
- var a = axis[u].clone().dot(dir.setY(0).normalize());
- var angle = Math.acos(a);
- if (angle < Math.PI / 4) {
- return u;
- }
- }
- console.warn('没有找到朝向..');
- }
- }, {
- key: "updateCameraDir",
- value: function updateCameraDir(player) {
- if (player.mode != 'panorama' || player.doorLabels.length == 0) return;
- var dir = player.getDirection();
- var toward = DoorLabel.getToward(dir);
- document.querySelector('.widgets-doors').setAttribute('data-camera-toward', toward);
- }
- }]);
- return DoorLabel;
- }();
- 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}";
- n$4(css$2,{});
- 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); }; }
- 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; } }
- /*#__PURE__*/(function (_THREE$EventDispatche) {
- _inherits(PlanLabel, _THREE$EventDispatche);
- var _super = _createSuper$1j(PlanLabel);
- function PlanLabel(player, o) {
- var _this;
- _classCallCheck(this, PlanLabel);
- _this = _super.call(this);
- console.log(PlanLabel);
- _this.player = player;
- _this.position = o.pos;
- _this.sid = o.sid;
- _this.text = o.text || '';
- _this.toPano = o.toPano;
- _this.enable = o.enable == void 0 ? true : o.enable;
- _this.elem = document.createElement('div');
- _this.elem.className = 'room-label';
- _this.elem.style.display = 'none';
- _this.elem.innerHTML = "<a>".concat(_this.text, "</a>");
- o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-plan-labels').append(_this.elem);
- player.planLabels.push(_assertThisInitialized(_this));
- _this.type = 'plan';
- _this.floorIndex = o.floorIndex;
- return _this;
- }
- _createClass(PlanLabel, [{
- key: "changeText",
- value: function changeText(t) {
- this.elem.querySelector('a').innerHTML = this.text = t;
- }
- }, {
- key: "update",
- value: function update() {
- //enable只和是否有cad图相关
- 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) // ||
- // store.getters.page == 'cad' ||
- // store.getters.page == 'data'
- // ))
- ) {
- this.elem.style.display = 'none';
- return;
- }
- var p = convertTool.getPos2d(this.position, this.player);
- if (!p.trueSide) {
- this.elem.style.display = 'none';
- return;
- } //使之随着模型缩放,就像贴图一样。缺陷1:当不显示户型图时,ImgRatio为null;缺陷2:当模型很大时,每个房间看起来很小,可能字会超出边缘。
- // var s = ( document.getElementsByClassName('player')[0].clientWidth * (this.player.model.cadFloorPlane.ImgRatio || 1 / 50) )
- var s = this.player.domElement.clientWidth * (1 / 50) / Math.abs(this.player.cameraControls.activeControl.camera.left); //乘上app.model.floorplanCadImg.ImgRatio是为了让字相对于图片的像素不变。(否则就是根据模型尺寸) 防止图片覆盖的模型范围大的字也跟着被缩小。
- s = THREE.MathUtils.clamp(s, 0.4, 3); //限定范围,主要是防止字太大,也可去除
- this.elem.style.left = p.pos.x + 'px';
- this.elem.style.top = p.pos.y + 'px';
- this.elem.style.transform = 'scale(' + s + ')';
- this.elem.style.display = '';
- }
- }, {
- key: "remove",
- value: function remove() {
- var parentElem = this.elem.parentElement;
- parentElem.removeChild(this.elem);
- var a = this.player.planLabels.indexOf(this);
- if (a > -1) this.player.planLabels.splice(a, 1);
- }
- }]);
- return PlanLabel;
- })(THREE.EventDispatcher);
- /*
- 判断遮挡方式:当户型和模型相差较大时的问题(尽力使户型贴准模型)
- 1 用模型: 会有被遮挡然后看不见的情况,尤其是从斜侧面看,门容易被其他墙挡住。因为此外还有门没打洞的情况,加上该功能基于户型,所以不使用此方案。
- 2 用数据: 会有看上去被墙遮挡但却还看得见的情况。
- */
- var LabelManager = /*#__PURE__*/function () {
- function LabelManager(player) {
- _classCallCheck(this, LabelManager);
- this.player = player;
- var dollElem = document.createElement('div');
- dollElem.className = 'widgets-doll-labels';
- player.domElement.append(dollElem);
- var planElem = document.createElement('div');
- planElem.className = 'widgets-plan-labels';
- player.domElement.append(planElem);
- var doorElem = document.createElement('div');
- doorElem.className = 'widgets-doors';
- player.domElement.append(doorElem); // let isAllFloor = false // 因为单楼层和全部楼层都会触发floor.changed, 以此来做区分
- // this.player.model.on('floor.changed', (toFloor, mode) => {
- // if (!isAllFloor) {
- // this.gotoFloor(toFloor.floorIndex)
- // } else {
- // isAllFloor = false
- // }
- // })
- // this.player.model.on('allfloors.toggled', (floors, currentFloor) => {
- // if (floors) {
- // this.gotoFloor()
- // isAllFloor = true
- // }
- // })
- if (this.player.$app.store.getValue('flooruser')) {
- this.init();
- }
- this.player.$app.store.on('flooruser', this.init.bind(this));
- }
- _createClass(LabelManager, [{
- key: "init",
- value: function init() {
- var _this = this;
- //开户门箭头
- // if (this.initedLabel) return
- var floorJson = this.player.$app.store.getValue('flooruser'); // floorJson = common.compatiblev2(floorJson)
- // 导入平面图后传入的就是空数据,且需要清空原先数据,所以不能这样判断
- // var voidValue = true //可能还没得到数据,都是空的
- // for (let i = 0; i < floorJson.floors.length; i++) {
- // for (let j in floorJson.floors[i]) {
- // if (floorJson.floors[i][j] instanceof Array && floorJson.floors[i][j].length > 0) {
- // voidValue = false
- // break
- // }
- // }
- // }
- // if (voidValue) return //空的
- // // console.error(floorJson)
- common$1.timeMeasuring.addTimeMark('initLabels', 'start');
- this.player.defaultRoomLabels.forEach(function (label) {
- return label.remove();
- });
- this.player.defaultRoomLabels = [];
- floorJson.floors.forEach(function (floorData0, index) {
- // 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的
- index = _this.player.model.floors.list.length > 1 ? floorData0.subgroup != void 0 ? floorData0.subgroup : floorData0.id : index; //旧版单层model的id和json不对应,使用model的
- var floor = _this.player.model.floors.index[index];
- if (!floor) {
- logger$1.warn("floor[".concat(index, "] is empty"));
- return;
- }
- floor.entryArrow = [];
- var bottom = floor.boundingBox.min.y; // 变换floorJson里的所有坐标
- var floorData = JSON.parse(JSON.stringify(floorData0));
- var modelCenter = JSON.parse(JSON.stringify(_this.player.model.center));
- 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)
- floorData.symbols && Object.keys(floorData.symbols).forEach(function (key) {
- var symbol = floorData.symbols[key];
- symbol.endPoint = getPointForRevRotate(symbol.endPoint, floorJson.angle, modelCenter);
- symbol.startPoint = getPointForRevRotate(symbol.startPoint, floorJson.angle, modelCenter);
- symbol.points2d = (symbol.points2d || []).map(function (point) {
- return getPointForRevRotate(point, floorJson.angle, modelCenter);
- });
- });
- floorData.tags && Object.keys(floorData.tags).forEach(function (key) {
- var tag = floorData.tags[key];
- tag.center = getPointForRevRotate(tag.center, floorJson.angle, modelCenter);
- tag.points2d = tag.points2d.map(function (point) {
- return getPointForRevRotate(point, floorJson.angle, modelCenter);
- });
- });
- floorData.rooms && Object.keys(floorData.rooms).forEach(function (key) {
- var room = floorData.rooms[key];
- room.center = getPointForRevRotate(room.center, floorJson.angle, modelCenter);
- });
- floorData.points && Object.keys(floorData.points).forEach(function (key) {
- var point = floorData.points[key];
- var pointpos = getPointForRevRotate({
- x: point.x,
- y: point.y
- }, floorJson.angle, modelCenter);
- point.x = pointpos.x;
- point.y = pointpos.y;
- });
- if (floorData.symbols) {
- var entry;
- var symbolKeys = Object.keys(floorData.symbols);
- for (var i = 0; i < symbolKeys.length; i++) {
- if (floorData.symbols[symbolKeys[i]].enter) {
- entry = JSON.parse(JSON.stringify(floorData.symbols[symbolKeys[i]]));
- entry.bottom = bottom + 0.1; //根据模型
- entry.floorIndex = index; // entry.endPoint = getPointForRevRotate(entry.endPoint, floorJson.angle, this.player.model.center)
- // entry.startPoint = getPointForRevRotate(entry.startPoint, floorJson.angle, this.player.model.center)
- // entry.points2d = entry.points2d.map(point => getPointForRevRotate(point, floorJson.angle, this.player.model.center))
- floor.entryArrow.push(new EntryArrow(_this.player, entry));
- if (_this.player.model.currentFloor.floorIndex == index) _this.updateEntryVisi(true, index);else _this.updateEntryVisi(false, index);
- }
- }
- _this.moveEntryArrow(index);
- } //添加label 房间名
- floorData.tags = floorData.tags || {};
- _this.hasPlaneLabels = floorData.tags.length > 0;
- var labelHeight = floor.center.y; //.panoHeightAve
- Object.keys(floorData.tags).forEach(function (index_) {
- var info = floorData.tags[index_];
- var des = info.des && parseFloat(String(info.des).replace(',', '')).toFixed(2);
- var title = info.title;
- var area = des + info.unit + '<sup>2</sup>';
- var content = info.des ? '约' + area : '';
- if (!title && !content) return;
- var text = title && content ? title + '<br>' + area // 如果name是空或只有空格,视若showArea == false; trim:去除字符串的头尾空格
- : title ? title : content; // y方向有差异
- 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)
- var center = info.center;
- var pos = new THREE.Vector3(center.x, -999 * rayDir.y, -center.y); // 检测当前pos在模型底部的映射坐标,确认标签高度
- var ray = new THREE.Raycaster(pos, rayDir, 0.001, 9999);
- var rayInfo = ray.intersectObject(floor.children[0]);
- if (rayInfo[0]) {
- pos = rayInfo[0].point;
- pos.y += 0.5;
- } else {
- pos.y = labelHeight;
- }
- var closetPano = _this.player.model.panos.closestPanoTowardPoint({
- point: pos,
- floor
- });
- if (!closetPano) {
- console.error('what!!! no closetPano');
- }
- var dollLabel = new DollLabel(_this.player, {
- sid: index_,
- pos: pos.clone(),
- text: text,
- toPano: closetPano,
- floorIndex: index
- });
- _this.player.defaultRoomLabels.push(dollLabel); // var planLabel = new PlanLabel(this.player, { sid: 'pl_' + index_, pos: pos.clone(), text: text, floorIndex: index })
- // this.player.defaultRoomLabels.push(planLabel)
- _this.player.defaultRoomLabels.forEach(function (label) {
- label.update();
- });
- });
- _this.initDoorLabels(index, JSON.parse(JSON.stringify(floorData)));
- });
- this.initedLabel = true; //-------initedLabel之后------
- this.setPlanLabelVisi();
- common$1.timeMeasuring.addTimeMark('initLabels', 'end', true);
- }
- }, {
- key: "initDoorLabels",
- value: function initDoorLabels(floorIndex, floorJson) {
- var _this2 = this;
- var doors = [];
- if (!floorJson.rooms || !floorJson.rooms[0] || !floorJson.rooms[0].wallPointIDs) {
- console.log('没有room or 数据不标准 得不到doorlabels');
- return;
- }
- var floor = this.player.model.floors.index[floorIndex];
- var bottom = floor.boundingBox.min.y;
- Object.keys(floorJson.tags).forEach(function (tagKey) {
- var tag = floorJson.tags[tagKey];
- tag.__panos = []; //for taggingTables
- if (!tag.title) delete floorJson.tags[tagKey];
- });
- var doorJson = {};
- Object.keys(floorJson.symbols).forEach(function (symKey) {
- var symbol = floorJson.symbols[symKey];
- if (symbol.geoType == 'SingleDoor' || symbol.geoType == 'SlideDoor' || symbol.geoType == 'DoubleDoor') doorJson[symKey] = symbol;
- });
- floorJson.rooms.forEach(function (room, index) {
- room.name = '';
- room.doors = Object.values(doorJson).filter(function (door) {
- return room.wallIds.indexOf(door.parent) > -1;
- }) || [];
- room.taggings = [];
- room.panos = [];
- });
- Object.keys(doorJson).forEach(function (doorKey) {
- var door = doorJson[doorKey];
- door.doorLabels = [];
- doors.push(door);
- door.center = {
- x: (door.points2d[0].x + door.points2d[1].x) / 2,
- y: (door.points2d[0].y + door.points2d[1].y) / 2
- }; //中心位置
- //正常一个门对应两个atRooms,但数据却可能多个,冗余的都是没有tagging的room,但没有tagging不代表是冗余的房间
- door.atRooms = [];
- floorJson.rooms.forEach(function (room) {
- var door_ = room.doors.find(function (door_) {
- return door_.vectorId == door.vectorId;
- });
- if (door_) {
- //room.doors.push(door)
- door.atRooms.push(room);
- }
- });
- }); //保险起见,统一删除rooms里没对应上的门
- floorJson.rooms.forEach(function (room) {
- room.doors = room.doors.filter(function (door) {
- return door.atRooms;
- });
- }); //找完了所有门和房间的对应关系
- floor.panos.forEach(function (pano) {
- pano._atRoom = null;
- }); //查找房间中的tagging和pano
- floorJson.rooms.forEach(function (room) {
- room.points = room.wallPointIDs.map(function (pointId) {
- return floorJson.points[pointId];
- });
- if (room.closetParent == void 0) {
- //只从非内环找起,内环在searchTagRoom找
- floor.panos.forEach(function (pano) {
- if (pano._atRoom || !pano.isAligned()) return;
- _this2.searchAtRoom(floorJson, room, pano, {
- x: pano.position.x,
- y: -pano.position.z
- }, function (atRoom) {
- pano._atRoom = atRoom;
- atRoom.panos.push(pano);
- });
- });
- Object.keys(floorJson.tags).forEach(function (tagKey) {
- var tagging = floorJson.tags[tagKey];
- if (tagging._atRoom) return;
- _this2.searchAtRoom(floorJson, room, tagging, {
- x: tagging.center.x,
- y: tagging.center.y
- }, function (atRoom) {
- tagging._atRoom = atRoom;
- atRoom.taggings.push(tagging);
- atRoom.name += tagging.title + ' '; //将tagging收集到name中
- });
- });
- }
- room.taggings.length && room.panos.forEach(function (pano) {
- //可能有pano不属于任何一个房间或tagging、也可能有tagging没有一个pano
- var score = common$1.sortByScore(room.taggings, [], [function (tagging) {
- //取距离最近的tagging作为pano的tagging
- var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
- var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
- return -panoPos.distanceTo(labelPos);
- }]);
- if (score && score.length) {
- var noShelter = score.slice(0, 3).find(function (e) {
- //当前点位看向tagging的视线不能被墙挡住
- var tagging = e.item;
- var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
- var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
- return !_this2.isShelter(floorJson, labelPos, panoPos);
- });
- var tagging = (noShelter || score[0]).item;
- tagging.__panos.push(pano);
- }
- });
- });
- Object.keys(floorJson.tags).forEach(function (tagKey) {
- var tagging = floorJson.tags[tagKey];
- var panos = tagging.__panos.filter(function (pano) {
- return pano.neighbourUUIDs.length > 0;
- }); //排除孤立的pano (是否要排除在当前楼层无其他连接的pano,这样的话最好漫游可行中也更改相关设置,及checkHasNeighbor
- if (!panos.length) return;
- tagging.clickToPano = common$1.sortByScore(panos, [], [function (pano) {
- var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
- var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
- return -panoPos.distanceTo(labelPos);
- }])[0].item;
- });
- floor.taggingTables = Object.values(floorJson.tags).filter(function (tagging) {
- return tagging.clickToPano;
- }); //去掉没有pano的
- //---------------end---------------------------------
- var log = "floor".concat(floorIndex, "(").concat(floorJson.name || 'no name', ") \u5171\u6709").concat(floorJson.rooms.length, "\u4E2A\u623F\u95F4\uFF0C\u5206\u522B\u662F ");
- floorJson.rooms.forEach(function (room) {
- log += "\n\u623F\u95F4".concat(room.roomId, " : ").concat(room.name, " ");
- }); //如果从0开始 说明没有外墙
- //建立doorLabel
- floorJson.rooms.forEach(function (room) {
- if (room.taggings.length == 0) return;
- var isClockWise = math$2.getArea(room.points) > 0; //是否顺时针
- room.doors.forEach(function (door) {
- //if (door.atRooms.length < 2) return //忽略atRooms只有一个的门,因为它在墙边上,不通两个房间,比如入户门//2023.7.20发现有时候外围区域没闭合就算不了房间,这样客厅就看不到其他房间了,所以单向门还是要加上
- //获取门朝向(朝房间内的那个法线)
- var points = [];
- if (room.closetChilds) {
- //可能在子环
- var atRoom = door.atRooms.find(function (e) {
- return door.startPoint && door.endPoint;
- });
- isClockWise = math$2.getArea(atRoom.points) > 0; //是否顺时针
- atRoom != room && (isClockWise = !isClockWise); //如果在子环上,判断方向相反
- points = atRoom.points;
- } else {
- points = room.points;
- } //var normal = math.getNormal({ points: [door.startPoint, door.endPoint] })
- var atWall = floorJson.walls[door.parent];
- var point1 = floorJson.points[atWall.start]; //this.searchItemById(atWall.start, Object.values(floorJson.points))
- var point2 = floorJson.points[atWall.end]; //this.searchItemById(atWall.end, Object.values(floorJson.points))
- var pointOrder = _this2.order(point1, point2, points); //p1是否在p2前
- var normal = math$2.getNormal({
- points: [point1, point2]
- });
- var doorDir = new THREE.Vector3(normal.x, 0, -normal.y); //门朝向为:垂直于线条、朝房间内
- if (pointOrder == isClockWise) doorDir.negate();
- var roomOutside = false;
- var panos = room.panos.filter(function (pano) {
- return pano.neighbourUUIDs.length > 0;
- }); //排除孤立的pano
- if (panos.length == 0) {
- //如果该房间没有,选择门外侧一点,范围不可过大
- roomOutside = true;
- panos = floor.panos.filter(function (pano) {
- if (pano.neighbourUUIDs.length == 0) return;
- var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
- var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
- if (pos1.distanceTo(pos2) > 5) return;
- var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
- if (doorDir.angleTo(panoDir) < Math.PI / 2) return true; //在门外这一侧,否则可能到隔壁房间
- });
- }
- var toPano = common$1.sortByScore(panos, [], [function (pano) {
- var score0 = 0;
- if (roomOutside) {
- //在房间外
- var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
- score0 = -doorDir.angleTo(panoDir) * 2; //尽量垂直于门
- }
- var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
- var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
- return -pos1.distanceTo(pos2) + score0;
- }]); //寻找离该门最近的pano
- toPano = toPano.length ? toPano[0].item : null;
- var forTag = common$1.sortByScore(room.taggings, [], [function (tagging) {
- var pos1 = toPano ? new THREE.Vector2(toPano.position.x, toPano.position.z) : new THREE.Vector2(door.center.x, door.center.y);
- var pos2 = new THREE.Vector2(tagging.center.x, -tagging.center.y);
- return -pos1.distanceTo(pos2);
- }])[0].item; //如果当前房间有多个tagging,寻找离toPano最近的tagging, 或离该门最近的tagging,作为该门的标签
- var labelPos = new THREE.Vector3(door.center.x, bottom + 0.3, -door.center.y);
- var anotherRoom = door.atRooms.find(function (r) {
- return r != room && r.name;
- }); //先排除没有tagging的,因为可能是冗余room
- if (!anotherRoom) anotherRoom = door.atRooms.find(function (r) {
- return r != room;
- }); //如果没找到,说明对面的房间就是没有tagging
- var minDis1 = 1.5,
- minDis2 = 4,
- maxDis = 15,
- minAngle = Math.PI / 6; //"前方"的判定角度
- var visiPanos1 = anotherRoom ? anotherRoom.panos : _this2.player.model.panos.list.filter(function (e) {
- return !e._atRoom;
- });
- var visiPanos = visiPanos1.filter(function (pano) {
- var distance = pano.position.clone().setY(0).distanceTo(labelPos.clone().setY(0));
- if (distance < minDis1 || distance > maxDis) return; //必要条件
- if (distance > minDis2) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //充分条件
- //门没有打洞的话就会被挡住 没有pano了
- //如果在此pano前方有别的pano,也可见
- var frontPano = visiPanos1.find(function (anotherPano) {
- return Panorama.filters.isInFanAngle(labelPos, pano.position.clone().sub(labelPos).setY(0), minAngle)(anotherPano.position);
- });
- if (frontPano) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //convertTool.ifIntersectChunks(labelPos, pano.position);
- });
- if (visiPanos.length) {
- var doorLabel = new DoorLabel(_this2.player, {
- doorDir,
- text: forTag.title,
- pos: labelPos,
- visiblePanos: visiPanos,
- sameRoomPanos: visiPanos1,
- toPano,
- aim: new THREE.Vector3(forTag.center.x, 0, -forTag.center.y),
- floorIndex
- });
- doorLabel.door = door;
- doorLabel.forRoom = room;
- doorLabel.forTag = forTag;
- door.doorLabels.push(doorLabel);
- _this2.player.defaultRoomLabels.push(doorLabel);
- } else {
- console.log("\u56E0\u65E0visiblePanos\u53D6\u6D88\u521B\u5EFAdoorlabel\u7684\u95E8\uFF1A ".concat(anotherRoom ? anotherRoom.name : '(未闭合区域) ', "\u901A\u5F80 ").concat(forTag.title, " "));
- }
- });
- }); //doors = doors.filter(door => door.atRooms.length > 1)
- log += "\n\u95E8\u5171\u6709".concat(doors.length, "\u6247\uFF1A \n"); //其中仍包括一些无效门,连通的是冗余房间
- doors.forEach(function (door, index) {
- log += "\u95E8".concat(door.vectorId, "\u5728 ");
- door.atRooms.forEach(function (room) {
- log += "\u623F\u95F4".concat(room.roomId, "(").concat(room.name, ")\u3001 ");
- });
- log += "\u7684\u8FB9\u4E0A \n";
- }); //门一定要真的放在当前线上(因为门可以游走,所以很难判断是否真的是当前的线)
- console.log("%c".concat(log), 'color:#13f');
- this.player.doorLabels.forEach(function (label) {
- label.update();
- });
- this.player.updateLabelZIndex(['doorLabels']);
- DoorLabel.updateCameraDir(this.player);
- }
- }, {
- key: "setPlanLabelVisi",
- value: function setPlanLabelVisi(show, floorIndex) {
- var metadata = this.player.$app.store.getValue('metadata') || {};
- if (metadata.floorPlanAngle != void 0) return; //代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
- if (!this.initedLabel) return;
- if (show == void 0) {
- show = this.player.model.floorplanCadImg.getVisible();
- }
- var planLabels = this.player.planLabels;
- if (floorIndex != void 0) {
- planLabels = planLabels.filter(function (label) {
- return label.floorIndex == floorIndex;
- });
- }
- planLabels.forEach(function (label) {
- label.enable = show;
- label.update();
- }); //dontShow完全和cad是否该显示有关 而labelEnable则还要额外考虑其他
- }
- }, {
- key: "setDoorLabelVisi",
- value: function setDoorLabelVisi(show, floorIndex) {
- var metadata = this.player.$app.store.getValue('metadata') || {};
- if (metadata.floorPlanAngle != void 0) return;
- if (!this.initedLabel) return;
- var doorLabels = this.player.doorLabels;
- if (floorIndex != void 0) {
- doorLabels = doorLabels.filter(function (label) {
- return label.floorIndex == floorIndex;
- });
- }
- doorLabels.forEach(function (label) {
- label.enable = show;
- label.update();
- });
- }
- }, {
- key: "setDollLabelVisi",
- value: function setDollLabelVisi(show, floorIndex) {
- var metadata = this.player.$app.store.getValue('metadata') || {};
- if (metadata.floorPlanAngle != void 0) return;
- if (!this.initedLabel) return;
- var dollLabels = this.player.dollLabels;
- if (floorIndex != void 0) {
- dollLabels = dollLabels.filter(function (label) {
- return label.floorIndex == floorIndex;
- });
- }
- dollLabels.forEach(function (label) {
- label.enable = show;
- label.update();
- });
- }
- }, {
- key: "updateEntryVisi",
- value: function updateEntryVisi(show, floorIndex) {
- var _this3 = this;
- // 更改楼层的entryArrow显示
- // “平面图”和“漫游可行”不显示entryArrow
- var visi = !(this.player.model.floorplanCadImg && this.player.model.floorplanCadImg.isEdit) && !(this.player.linkEditor && this.player.linkEditor.setPanoVisible); // console.log('updateEntryVisi', show)
- var floors = this.player.model.floors;
- if (floorIndex != void 0) {
- floors = floors.filter(function (floor) {
- return floor.floorIndex == floorIndex;
- });
- }
- floors.forEach(function (floor) {
- if (!floor.entryArrow.length) return;
- if (visi) {
- if (show == false) visi = false;
- /*if (show == true)*/
- else {
- //需要额外判断一下
- var mode = _this3.player.modeTran.split('-')[1];
- if (mode == 'floorplan') visi = true; //visi = floor.plane && floor.plane.visible
- 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
- }
- }
- floor.entryArrow.forEach(function (arrow) {
- return visi ? arrow.show() : arrow.hide();
- });
- });
- }
- }, {
- key: "moveEntryArrow",
- value: function moveEntryArrow(index) {
- var floor = this.player.model.floors.index[index];
- if (floor.entryArrow.length && floor.cadImgRatio) {
- var wallDepth = 24; // 墙壁厚度恒定24px (2880*1620图时测得)
- var shiftY = wallDepth * this.player.model.floors.index[index].cadImgRatio; //得到墙壁真实厚度 按理说应该除以2的,但是不除以2却刚好
- floor.entryArrow.forEach(function (arrow) {
- return arrow.moveCloseToWall(shiftY);
- });
- }
- } //广度搜索
- }, {
- key: "searchAtRoom",
- value: function searchAtRoom(floorJson, room, object, pos, callback) {
- var _this4 = this;
- var inside = math$2.isPointInArea(room.points, pos);
- if (inside) {
- if (room.closetChilds) {
- var finded = room.closetChilds.find(function (roomId) {
- return _this4.searchAtRoom(floorJson, floorJson.rooms.find(function (e) {
- return e.roomId == roomId;
- }), object, pos, callback);
- });
- if (!finded) {
- callback(room);
- }
- } else {
- callback(room);
- }
- return true;
- }
- }
- }, {
- key: "order",
- value: function order(p1, p2, points) {
- //wall的p1 p2在ground中是否p1在前一个
- /* var p1 = points.find(point => point.vectorId == p1ID)
- var p2 = points.find(point => point.vectorId == p2ID) */
- var index1 = points.indexOf(p1);
- var index2 = points.indexOf(p2);
- return (index2 - index1 + points.length) % points.length === 1;
- }
- }, {
- key: "isShelter",
- value: function isShelter(floorJson, labelPos, panoPos, atWall, analyseDoor) {
- //performance.mark('isShelter-start')
- if (!floorJson.walls) return;
- var line1 = [new THREE.Vector2(labelPos.x, -labelPos.z), new THREE.Vector2(panoPos.x, -panoPos.z)];
- var isIntersect = Object.values(floorJson.walls).find(function (wall) {
- if (atWall != void 0 && wall.vectorId != void 0 && wall.vectorId === atWall) return;
- var point1 = floorJson.points[wall.start]; //this.searchItemById(wall.start, Object.values(floorJson.points))
- var point2 = floorJson.points[wall.end]; //this.searchItemById(wall.end, Object.values(floorJson.points))
- var line2 = [point1, point2];
- var intersect = math$2.isLineIntersect(line1, line2);
- if (intersect && analyseDoor && floorJson.symbols) {
- //是否穿过门
- var atDoor = Object.values(floorJson.symbols).find(function (object) {
- if (object.geoType.includes('Door') && object.parent == wall.vectorId) {
- //门在这墙上
- var line2 = [object.startPoint, object.endPoint];
- return math$2.isLineIntersect(line1, line2);
- }
- });
- atDoor && (intersect = false);
- }
- return intersect;
- });
- /* performance.mark('isShelter-end')
- let measure = performance.measure('isShelter', "isShelter-start", "isShelter-end");
- console.log('isShelter', measure.duration.toFixed(3))
- */
- return isIntersect;
- }
- /* searchItemById(id, arr) {
- for (let i = 0, len = arr.length; i < len; i++) {
- if (arr[i].vectorId == id) {
- return arr[i]
- }
- }
- } */
- /* sortByScore = function(list, request, rank) {
- var i = common.filterAll(list, request)
- return 0 === i.length
- ? null
- : (i = i
- .map(function(e) {
- return {
- item: e,
- score: rank.reduce(function(t, i) {
- return t + i(e)
- }, 0)
- }
- })
- .sort(function(e, t) {
- return t.score - e.score
- }))
- } */
- }, {
- key: "show",
- value: function show(floorIndex) {
- this.updateEntryVisi(true, floorIndex);
- this.setPlanLabelVisi(true, floorIndex);
- this.setDoorLabelVisi(true, floorIndex);
- this.setDollLabelVisi(true, floorIndex);
- }
- }, {
- key: "hide",
- value: function hide(floorIndex) {
- this.updateEntryVisi(false, floorIndex);
- this.setPlanLabelVisi(false, floorIndex);
- this.setDoorLabelVisi(false, floorIndex);
- this.setDollLabelVisi(false, floorIndex);
- }
- }, {
- key: "reset",
- value: function reset() {
- this.player.defaultRoomLabels.forEach(function (label) {
- return label.remove();
- });
- this.player.model.floors.forEach(function (floor) {
- floor.entryArrow.forEach(function (arrow) {
- return arrow.dispose();
- });
- });
- }
- }, {
- key: "gotoFloor",
- value: function gotoFloor(index) {
- this.hide();
- this.show(index);
- }
- }]);
- return LabelManager;
- }();
- function getPointForRevRotate(vec2, angle, modelCenter) {
- // let modelCenter = new THREE.Vector3(0, 0, 0)
- var point = new THREE.Vector2(vec2.x, vec2.y);
- if (Math.abs(angle) < 0.01 || Math.abs(angle - 2 * Math.PI) < 0.01) {
- return point;
- } else {
- var x = (point.x - modelCenter.x) * Math.cos(angle) - (point.y - modelCenter.z) * Math.sin(angle) + modelCenter.x;
- var y = (point.y - modelCenter.z) * Math.cos(angle) + (point.x - modelCenter.x) * Math.sin(angle) + modelCenter.z;
- point.x = x;
- point.y = y;
- return point;
- }
- }
- var ModelSide = {
- side: null //空为自动,有值锁定side
- };
- ModelSide.setSide = function (side) {
- if (side === THREE.FrontSide || side === THREE.BackSide || side === THREE.DoubleSide) {
- this.side = side;
- } else {
- this.side = null;
- }
- };
- var ModelSideManager = function ModelSideManager(player) {
- var _this = this;
- _classCallCheck(this, ModelSideManager);
- this.tempAuto = function () {
- _this.recoverSide = ModelSide.side;
- ModelSide.setSide(null);
- _this.updateSide();
- };
- this.recover = function () {
- ModelSide.setSide(_this.recoverSide);
- _this.recoverSide = null;
- _this.updateSide();
- };
- this.updateSide = function () {
- if (_this.player.mode === Viewmode$1.FLOORPLAN) {
- _this.player.model.setMode('floorplan');
- } else if (_this.player.mode === Viewmode$1.DOLLHOUSE) {
- _this.player.model.setMode('dollhouse');
- }
- };
- this.player = player;
- this.recoveSide = null;
- };
- var initDir = new THREE.Vector3(0, 0, -1); //指南针模型的北方向
- /**
- * 指南针
- * 相关css在 ./label/static/label.css
- */
- var Compass = /*#__PURE__*/function () {
- function Compass(player) {
- _classCallCheck(this, Compass);
- this.angle = 0;
- this.quar = new THREE.Quaternion();
- this.player = player;
- this.config = player.$app.config;
- this.init();
- this.show = false;
- this.force = false;
- this.switch('direction');
- }
- _createClass(Compass, [{
- key: "switch",
- value: function _switch(type) {
- this.type = type;
- if (type == 'direction') {
- this.dirTextNDiv.style.display = 'block';
- this.dirTextXDiv.style.display = 'none';
- this.dirTextYDiv.style.display = 'none';
- this.dirTextZDiv.style.display = 'none';
- this.lines.visible = false;
- this.cones.visible = true;
- }
- if (type == 'axis') {
- this.dirTextNDiv.style.display = 'none';
- this.dirTextXDiv.style.display = 'block';
- this.dirTextYDiv.style.display = 'block';
- this.dirTextZDiv.style.display = 'block';
- this.lines.visible = true;
- this.cones.visible = false;
- }
- this.autoJudgeDisplay();
- }
- }, {
- key: "init",
- value: function init() {
- var _this = this;
- var width = 50,
- height = 50;
- this.dom = document.createElement('div');
- this.dom.id = 'compass';
- 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 ";
- this.player.domElement.append(this.dom);
- this.dirTextNDiv = this.dom.querySelector('.north');
- this.dirTextXDiv = this.dom.querySelector('#dirTextX');
- this.dirTextYDiv = this.dom.querySelector('#dirTextY');
- this.dirTextZDiv = this.dom.querySelector('#dirTextZ');
- this.centerDiv = this.dom.querySelector('.center');
- if (this.config.view) {
- this.dom.style.right = this.config.mobile ? '1%' : '28px';
- this.dom.style.top = this.config.mobile ? '10%' : '100px';
- } else {
- this.dom.style.right = this.config.mobile ? '1%' : '277px';
- this.dom.style.top = this.config.mobile ? '10%' : '60px';
- }
- this.centerDiv.style.width = width + 'px';
- this.centerDiv.style.height = height + 'px';
- if (this.config.mobile) {
- var _this$player$getSize = this.player.getSize(),
- clientWidth = _this$player$getSize.clientWidth,
- clientHeight = _this$player$getSize.clientHeight;
- var minWidth = Math.min(clientWidth, clientHeight);
- if (minWidth < 450) {
- var initScale = Math.round(minWidth / 450 * 1000) / 1000;
- this.dom.transform = " scale(".concat(initScale, ")");
- }
- }
- try {
- ;
- this.renderer = new THREE.WebGLRenderer({
- antialias: this.config.antialias,
- alpha: true
- }), this.renderer.autoClear = !0, this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1), this.renderer.domElement.setAttribute('name', 'compass');
- this.renderer.setClearAlpha(0.0);
- this.renderer.setSize(width, height, false, window.devicePixelRatio ? window.devicePixelRatio : 1);
- } catch (e) {
- throw new RendererCreationException('Unable to create a WebGL rendering context');
- }
- this.centerDiv.appendChild(this.renderer.domElement);
- this.camera = new THREE.PerspectiveCamera();
- this.camera.fov = 70;
- this.scene = new THREE.Scene(), this.scene.add(this.camera);
- this.createCompass();
- /* this.player.on('scene/LoadHouseFloor', () => {
- this.setNorth()
- })
- this.player.on('changeDir', () => {
- this.setNorth()
- }) //点击旋转户型图按钮 */
- this.player.$app.store.on('flooruser', function (data) {
- //在cad页面 点击保存后,更新cad和指南针的旋转
- //this.angle = (data.compass - THREE.MathUtils.radToDeg(data.angle) + 360) % 360 || 0
- set();
- }); //用户设置的权重高于地理注册
- var set = function set() {
- var floorUserData = _this.player.$app.store.getValue('flooruser');
- if (floorUserData.compass != void 0) {
- // 但从界面上看不出是用户设置为0还是没设置过,除非没设置过时降重置按钮去除
- _this.angle = (floorUserData.compass - THREE.MathUtils.radToDeg(floorUserData.angle) + 360) % 360 || 0;
- } else {
- var metadata = _this.player.$app.store.getValue('metadata'); //await this.$app.resource.metadata()
- if (metadata.orientation != void 0) {
- _this.angle = THREE.MathUtils.radToDeg(metadata.orientation); //地理注册的
- } else {
- _this.angle = 0;
- }
- }
- };
- set();
- /*
- 如果点击了恢复默认按钮, 即恢复成未设置,则floorUserData.compass=null,代表直接读取默认值(metadata.orientation || 0)
- 注:当编辑页旋转cad后,指南针ui不会跟着旋转,所以就不是默认值了。需要再点击恢复默认。
- 相关文件:floorplanService.js initCompass
- xui.js setProps showProps
- Toolbox.Content.vue 搜索 compassRate.value 每次回到cad界面后指南针朝向
-
- */
- }
- /* setNorth() {
- //设置北方向,这决定了自身的朝向。
- const floors = this.player.$app.store.getValue('flooruser').floors
- if (!floors || !floors.length) {
- return
- }
- const floor = floors[0]
- const metadata = this.player.$app.store.getValue('metadata') || {}
- this.angle = ((floor && floor.dire) || 0) + THREE.MathUtils.radToDeg(parseFloat(metadata.floorPlanAngle || 0)) //基础朝向
- this.cones.rotation.y = Math.PI / 2 - THREE.MathUtils.degToRad(this.angle)
- console.log('dir:' + floor.dire + ', floorPlanAngle:' + metadata.floorPlanAngle)
- this.update()
- this.player.model.floorLogos.setDir(this.angle)
- } */
- }, {
- key: "createCompass",
- value: function createCompass() {
- //ConeBufferGeometry(radius : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)
- var height = 2;
- var geometry1 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
- var geometry2 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
- var material = new THREE.MeshBasicMaterial({
- vertexColors: true
- }); //指南针由两个四棱锥拼成,为了渐变颜色,采用指定vertexColor的方式。
- var setColor = function setColor(geometry, color1, color2) {
- var colors = [];
- for (var i = 0, n = geometry.attributes.position.count; i < n; ++i) {
- colors.push(1, 1, 1);
- }
- var set = function set(index, color) {
- //设置第index个点的颜色
- colors[index * 3 + 0] = color[0];
- colors[index * 3 + 1] = color[1];
- colors[index * 3 + 2] = color[2];
- };
- var mid = [(color1[0] + color2[0]) / 2, (color1[1] + color2[1]) / 2, (color1[2] + color2[2]) / 2];
- set(1, color1);
- set(5, color1);
- set(6, color1);
- set(2, mid);
- set(3, mid);
- set(7, mid);
- set(4, color2);
- set(8, color2);
- set(9, color2);
- geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(colors), 3));
- };
- var blue1 = [1 / 255, 238 / 255, 245 / 255]; //逐渐变深
- var blue2 = [20 / 255, 146 / 255, 170 / 255];
- var blue3 = [40 / 255, 60 / 255, 103 / 255];
- setColor(geometry1, blue1, blue2);
- setColor(geometry2, blue2, blue3);
- /* 朝箭头方向看点构成如下 虽然geometry.attributes.position.count = 19 只有1-9设置的颜色是有效的 另外为什么7决定了上下两边的颜色呢…… 5、9可将其分成上下两个颜色
- 6
- /|\
- / | \
- 7 /_2|1_\ 5
- \ 3|4 / 9
- \ | /
- \|/
- 8
- */
- var cone = new THREE.Mesh(geometry1, material);
- cone.position.setY(height / 2);
- geometry1.computeVertexNormals(); //computeFaceNormals
- geometry2.computeVertexNormals();
- var cones = new THREE.Object3D();
- cones.add(cone);
- var cone2 = new THREE.Mesh(geometry2, material);
- cone2.rotation.x = Math.PI;
- cone2.position.setY(-height / 2);
- cones.add(cone2);
- cones.rotation.z = Math.PI / 2;
- cones.rotation.y = Math.PI / 2; //转向initDir的方向
- cones.scale.set(0.7, 0.7, 0.7);
- this.scene.add(cones);
- this.cones = cones;
- var lines = new THREE.Object3D();
- var lineX = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 10)]), new THREE.LineBasicMaterial({
- color: 0x0000ff
- }));
- lines.add(lineX);
- var lineY = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 10, 0)]), new THREE.LineBasicMaterial({
- color: 0x00ff00
- }));
- lines.add(lineY);
- var lineZ = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(10, 0, 0)]), new THREE.LineBasicMaterial({
- color: 0xff0000
- }));
- lines.add(lineZ);
- this.lines = lines;
- this.scene.add(lines);
- }
- }, {
- key: "update",
- value: function update(quaternion) {
- if (!this.show) return;
- if (!quaternion) quaternion = this.player.camera.quaternion.clone();
- this.cones.rotation.y = Math.PI / 2 - this.angle / 180 * Math.PI; // 指南针基础方向
- this.updateCamera(quaternion);
- this.updateLabel(quaternion);
- this.render();
- }
- }, {
- key: "updateLabel",
- value: function updateLabel(quaternion) {
- //更新北标签
- var dir = this.player.getDirection();
- var oriDir = initDir.clone(); //指南针最初始时的北方向
- var extraQua;
- if (this.player.mode == 'transitioning') {
- //当transitioning时,相机的quaternion不是用control的lookAt算出来,而是直接由一个quaternion过渡到另一个,这样相机将会是歪的,投影面也就不会是原先的水平面。
- var tempCamera = new THREE.Camera(); //借用camera的lookAt算出如果正视同样的target, quaternion会是什么值。 将它乘以当前相机quaternion,得到的就是相机歪的旋转值。
- tempCamera.position.copy(this.camera.position);
- tempCamera.lookAt(tempCamera.position.clone().add(dir));
- var q = tempCamera.quaternion.invert();
- extraQua = q.premultiply(quaternion); //歪掉的额外旋转值
- } //北标签的方向为指南针轮盘方向,也就是要将camera的方向投影到水平面上。 但是如果相机歪了,看到的世界都会歪一定角度,投影面也要歪一定角度。
- var up = new THREE.Vector3(0, 1, 0); //投影水平面的法线,也是相机的摆正的up方向
- extraQua && up.applyQuaternion(extraQua);
- dir.projectOnPlane(up); //将方向投影到水平面上; 如果相机不是正视(extraQua不为0001),就要将水平面也转动
- oriDir.projectOnPlane(up); //为什么initDir投影了和没有投影angle结果一样
- var angle = dir.angleTo(oriDir);
- if (dir.cross(oriDir).y > 0) angle = -angle;
- var deg = this.angle - 90 + THREE.MathUtils.radToDeg(angle); //因为css写的样式初始是指向右方,和initDir差了90°,所以减去。
- if (this.type == 'axis') {
- this.dirTextXDiv.style.transform = 'rotate(' + (deg + 90 - this.angle) + 'deg)';
- this.dirTextXDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 - this.angle) + 'deg)';
- this.dirTextYDiv.style.transform = 'rotate(' + -90 + 'deg)';
- this.dirTextYDiv.querySelector('span').style.transform = 'rotate(' + 90 + 'deg)';
- this.dirTextZDiv.style.transform = 'rotate(' + (deg + 90 + 90 - this.angle) + 'deg)';
- this.dirTextZDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 + 90 - this.angle) + 'deg)';
- } else {
- this.dirTextNDiv.style.transform = 'rotate(' + deg + 'deg)';
- this.dirTextNDiv.querySelector('span').style.transform = 'rotate(' + -deg + 'deg)';
- }
- }
- }, {
- key: "updateCamera",
- value: function updateCamera(quaternion) {
- //更新canvas中的指南针表现,也就是更新相机,和场景中的相机朝向一致。
- var radius = 5; //相机距离
- this.camera.quaternion.copy(quaternion);
- var dir = this.player.getDirection(); //相机朝向
- this.camera.position.copy(dir.multiplyScalar(radius).negate()); //相机绕着指南针中心(000)转动
- }
- }, {
- key: "render",
- value: function render() {
- this.renderer.render(this.scene, this.camera);
- }
- }, {
- key: "setDisplay",
- value: function setDisplay(state, force) {
- if (this.force && force == void 0) {
- return;
- }
- if (force != void 0) {
- this.force = force;
- }
- this.show = !!state;
- if (this.show) {
- this.update(); // this.dom.fadeIn(100)
- this.dom.style.display = 'block';
- } else {
- // this.dom.fadeOut(100)
- this.dom.style.display = 'none';
- }
- }
- }, {
- key: "autoJudgeDisplay",
- value: function autoJudgeDisplay() {
- // if(this.player.modeTran.split("-")[1] != "panorama" && store.getters.page != 'cad' && store.getters.page != 'data') {
- if (this.player.modeTran.split('-')[1] != 'panorama' || this.type == 'axis') {
- this.setDisplay(true);
- } else {
- this.setDisplay(false);
- }
- }
- }, {
- key: "setDomLeft",
- value: function setDomLeft() {
- this.dom.css({
- right: 'none',
- left: this.config.mobile ? '1%' : '2%'
- });
- }
- }]);
- return Compass;
- }();
- 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); }; }
- 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; } }
- var player$l, sceneRenderer$4, app;
- var planeGeo1, planeGeo2, balloonMap, balloonMap2, defaultCircleMap, defaultExitMap, camera, scene, mesh, isEdit;
- var viewLinkEdit = {};
- var fishEyeRadius = 10; //使用鱼眼尽量提高清晰度。即渲染出相机在接近球边缘的地方看向球心的画面,球上是全景图。
- /*
- 将全景图渲染成某个漫游视角的贴图 renderTarget的作用是直接将渲染结果作为贴图
- */
- var render = function render(renderTarget, unDealTex, enterQuaternion) {
- mesh.material.uniforms.tDiffuse.value = unDealTex;
- var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2);
- camera.quaternion.copy(new THREE.Quaternion().multiplyQuaternions(rot90, enterQuaternion)); //改 为球目全景照片而改
- var target = new THREE.Vector3(0, 0, -fishEyeRadius * 0.8).applyQuaternion(camera.quaternion);
- camera.position.copy(target.clone().negate());
- var V = sceneRenderer$4.renderer.autoClear;
- sceneRenderer$4.renderer.autoClear = !1; // sceneRenderer.renderer.render(scene, camera, renderTarget, !1)
- sceneRenderer$4.renderer.setRenderTarget(renderTarget); // sceneRenderer.renderer.clear()
- sceneRenderer$4.renderer.render(scene, camera);
- sceneRenderer$4.renderer.setRenderTarget(null);
- sceneRenderer$4.renderer.autoClear = V;
- };
- var dealURL = function dealURL(url) {
- console.log(url);
- if (url &&
- /* url.slice(0, 5) != 'blob:' && url.slice(0, 4) != 'http') || */
- !url.includes('/')) {
- var src = app.resource.getUserResourceURL(url);
- return src;
- } else return url;
- };
- var ViewLinkManager = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(ViewLinkManager, _THREE$EventDispatche);
- var _super = _createSuper$1i(ViewLinkManager);
- function ViewLinkManager(app_, player_) {
- var _this;
- _classCallCheck(this, ViewLinkManager);
- _this = _super.call(this);
- app = app_;
- isEdit = !app.config.view;
- player$l = player_;
- sceneRenderer$4 = app.core.get('SceneRenderer');
- _this.loaded = false;
- _this.enabled = true;
- _this.views = {};
- _this.ViewLinkCircles = new THREE.Object3D();
- _this.ViewLinkCircles.name = 'ViewLinkCircles';
- _this.ViewLinkBalloons = new THREE.Object3D();
- _this.ViewLinkBalloons.name = 'ViewLinkBalloons';
- _this.ViewLinkExits = new THREE.Object3D();
- _this.ViewLinkExits.name = 'ViewLinkExits';
- _this.ViewTitles = new THREE.Object3D();
- _this.ViewTitles.name = 'ViewTitles';
- var group = new THREE.Object3D();
- group.name = 'linkViewRoot';
- group.add(_this.ViewLinkCircles);
- group.add(_this.ViewLinkBalloons);
- group.add(_this.ViewLinkExits);
- group.add(_this.ViewTitles);
- _this.group = group;
- _this.addEventListener('getViewLinkEdit', function (e) {
- viewLinkEdit = e.v;
- });
- app.Scene.on('loadeddata', function () {
- //if(app.config.isRouteSnap)return
- var data = app.store.getValue('links');
- if (!data) {
- _this.init();
- return;
- }
- if (!player$l.model.builded) {
- //floor需要
- return player$l.model.addEventListener('builded', _this.init.bind(_assertThisInitialized(_this), data));
- }
- _this.init(data);
- });
- return _this;
- }
- _createClass(ViewLinkManager, [{
- key: "init",
- value: function init(data) {
- var _this2 = this;
- ViewLink.init();
- this.createViews(data);
- player$l.model.add(this.group);
- this.inited = true; //if(isEdit)viewLinkEdit.init();
- if (player$l.currentPano && player$l.currentPano.hasVideo) {
- //初始画面是有视频点的地方,延迟出现。因为circle容易闪烁,可能是被视频遮盖。
- /* this.ViewLinkCircles.visible = false
- this.ViewLinkBalloons.visible = false
- this.ViewLinkExits.visible = false
- setTimeout(() => {
- if (this.enabled) {
- this.ViewLinkCircles.visible = true
- this.ViewLinkBalloons.visible = true
- this.ViewLinkExits.visible = true
- }
- }, 1000) */
- common$1.updateVisible(this.group, 'delay', false);
- setTimeout(function () {
- common$1.updateVisible(_this2.group, 'delay', true);
- });
- }
- var intersectMesh,
- viewMeshes = [];
- player$l.on('collectIntersectMesh', function (meshes, e) {
- //推送要intersect的mesh
- if (!_this2.inited || !_this2.group.visible
- /* || (isEdit && store.getters.page == 'videos') */
- ) return;
- var detectChunk = true;
- if (player$l.isOutsideMode()) {
- if (viewLinkEdit.markView) {
- viewMeshes = [viewLinkEdit.markView.balloon.mesh];
- } else {
- viewMeshes = _this2.ViewLinkBalloons.children;
- }
- } else if (player$l.is360View(player$l.mode, player$l.currentPano)) {
- if (viewLinkEdit.settingEntry) viewMeshes = []; //设置进入画面
- else if (viewLinkEdit.settingVisibles) {
- viewMeshes = _this2.ViewLinkCircles.children;
- } else {
- viewMeshes = _this2.ViewLinkExits.children.concat(_this2.ViewLinkCircles.children);
- }
- detectChunk = false;
- } else {
- if (viewLinkEdit.markView) {
- //可以拖拽
- viewMeshes = [viewLinkEdit.markView.circle.mesh];
- detectChunk = false;
- } else {
- viewMeshes = _this2.ViewLinkCircles.children;
- }
- }
- if (detectChunk) {
- meshes.push.apply(meshes, _toConsumableArray(viewMeshes));
- } else {
- //非detectChunk状态下intersect到的话,直接dealwithIntersect, 将不会执行下面judgeIntersect的
- var intersect = convertTool.getMouseIntersect(player$l.camera, viewMeshes, player$l.mouse);
- if (intersect && viewMeshes.includes(intersect.object)) {
- intersectMesh = intersect;
- _this2.dealwithIntersect(intersect);
- e.consume();
- }
- }
- });
- player$l.on('judgeIntersect', function (intersect, e) {
- //判断是否intersect了overlay
- if (e.getConsumed()) return;
- if (intersect && viewMeshes.includes(intersect.object)) {
- intersectMesh = intersect;
- e.consume();
- } else {
- intersectMesh = null;
- }
- _this2.dealwithIntersect(intersectMesh);
- });
- player$l.on('click', function (e) {
- //判断是否intersect了overlay
- if (e.getConsumed()) return;
- if (_this2.dealWithClick()) {
- e.consume();
- }
- });
- player$l.on('update', function (e) {
- if (e.hasChanged.cameraChanged) {
- _this2.update();
- }
- });
- player$l.on('mode.changing', function (fromMode, toMode, pano, dur) {
- //转换前
- if (fromMode == 'panorama') {
- setTimeout(function () {
- for (var i in _this2.views) {
- _this2.views[i].balloon.showOrHide(true, dur / 2, 'auto');
- _this2.views[i].circle.setVisible(false);
- }
- viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
- }, dur || 500);
- } else if (fromMode == 'floorplan') {
- for (var i in _this2.views) {
- _this2.views[i].balloon.mesh.material.depthTest = true; //防止其他楼层遮挡
- }
- }
- if (toMode == 'floorplan') {
- setTimeout(function () {
- for (var _i in _this2.views) {
- _this2.views[_i].balloon.mesh.material.depthTest = false; //防止其他楼层遮挡
- }
- }, dur);
- }
- if (toMode == 'panorama') {
- for (var _i2 in _this2.views) {
- _this2.views[_i2].balloon.showOrHide(false);
- _this2.views[_i2].circle.setVisible(true);
- }
- viewLinkEdit.cancelPos && viewLinkEdit.cancelPos();
- }
- }); //let floorsVisi = {}
- player$l.model.on('floor.changed', function (currentFloor, toMode, oldFloor) {
- if (player$l.mode == 'panorama' && toMode != 'panorama') return; //使用mode.changing
- var isAll = player$l.model.allFloorsVisible;
- player$l.model.floors.forEach(function (floor) {
- if (floor == currentFloor || isAll) {
- //floorsVisi[floor.floorIndex] = true
- if (toMode == 'floorplan' || toMode == 'dollhouse') {
- floor.views.forEach(function (view) {
- view.balloon.showOrHide(true, 500);
- });
- }
- } else {
- floor.views.forEach(function (view) {
- viewLinkEdit.markView != view && view.balloon.showOrHide(false, 500);
- });
- }
- });
- });
- if (player$l.$app.config.view) {
- //展示页面。 不要遮住漫游点视频
- player$l.on(PlayerEvents.FlyingEnded, function (_ref) {
- var currentPano = _ref.currentPano;
- var panoVideoFilter;
- if (player$l.mode == 'panorama') {
- panoVideoFilter = currentPano.getVideoFilter();
- }
- _this2.ViewLinkCircles.children.forEach(function (e) {
- if (currentPano == _this2.views[e.name.split('circle_')[1]].nearestPano) {
- return common$1.updateVisible(e, 'coveredPanoVideo', true); //如果是其最近点就不隐藏。否则点击列表跳转过来后又找不到图标
- }
- if (panoVideoFilter && panoVideoFilter(e.position)) {
- common$1.updateVisible(e, 'coveredPanoVideo', false);
- } else {
- common$1.updateVisible(e, 'coveredPanoVideo', true);
- }
- });
- });
- }
- if (!app.store.getValue('metadata').controls.showLinkTitle) {
- this.changeTitlesShow(false);
- }
- }
- }, {
- key: "createViews",
- value: function createViews(data) {
- if (!data) return; // 无
- var views = common$1.CloneJson(data.tags || data);
- views.forEach(function (item) {
- if (this.views[item.sid]) {
- console.log('有重复的view sid' + item.sid);
- return;
- }
- if (item.panoId !== undefined) {
- var linkPano = player$l.model.panos.index[item.panoId];
- if (!linkPano) return;
- var balloonPos = linkPano.marker.position.clone();
- balloonPos.y += 1;
- var circlePos = linkPano.position.clone();
- var circleQua = linkPano.quaternion.clone();
- !item.balloon && (item.balloon = {
- pos: balloonPos.toArray()
- });
- !item.circle && (item.circle = {
- pos: circlePos.toArray(),
- qua: circleQua.toArray(),
- scale: 100
- });
- !item.enterQuaternion && (item.enterQuaternion = [0, 0, 0, 1]);
- !item.exitDirection && (item.exitDirection = [0, 0, 2.4]);
- if (item.nearestPano === undefined) {
- if (linkPano.neighbourUUIDs && linkPano.neighbourUUIDs.length >= 1) {
- item.nearestPano = linkPano.neighbourUUIDs[0];
- } else {
- item.nearestPano = '0';
- }
- }
- }
- var view = new ViewLink(item);
- if (item.panoId !== undefined) view.bindPanoId = item.panoId + '';
- this.addView(view);
- }.bind(this));
- if (player$l.getToMode() != 'panorama') {
- for (var i in this.views) {
- this.views[i].balloon.showOrHide(true, 0);
- }
- }
- this.dispatchEvent({
- type: 'loaded'
- });
- this.loaded = true;
- }
- /*
- 判断鼠标移动到哪个view mesh上
- */
- /* getIntersectView() {
- var viewMeshes
- if (!this.inited || !this.enabled || (isEdit && store.getters.page == 'videos')) return
- var detectChunk = true,
- meshes
- if (player.isOutsideMode()) {
- viewMeshes = this.ViewLinkBalloons.children
- } else if (player.is360View(player.mode, player.currentPano)) {
- if (viewLinkEdit.settingEntry) viewMeshes = []
- else if (viewLinkEdit.settingVisibles) {
- viewMeshes = this.ViewLinkCircles.children
- } else {
- viewMeshes = this.ViewLinkExits.children.concat(this.ViewLinkCircles.children)
- }
- detectChunk = false
- } else {
- if (viewLinkEdit.markView) {
- //可以拖拽
- viewMeshes = [viewLinkEdit.markView.circle.mesh]
- detectChunk = false
- } else {
- viewMeshes = this.ViewLinkCircles.children
- }
- }
- if (detectChunk) {
- meshes = this.model.floors.reduce(function (e, t) {
- return t.hidden ? e : e.concat(t.collider.children)
- }, viewMeshes)
- } else meshes = viewMeshes
- var origin = new THREE.Vector3(player.mouse.x, player.mouse.y, -1).unproject(player.camera)
- player.raycaster.set(origin, player.getMouseDirection(player.mouse))
- var results = player.raycaster.intersectObjects(meshes)
- if (results && results.length && viewMeshes.includes(results[0].object)) {
- return results[0]
- }
- } */
- /*
- 根据上面那个函数得到的mesh来判断是哪个view被pick到了,并且记下来,且触发setSelect、 更改鼠标cursor
- */
- }, {
- key: "dealwithIntersect",
- value: function dealwithIntersect(intersect) {
- if (!this.group.visible) return;
- var mesh = intersect && intersect.object;
- if (this.hoverCircle && this.hoverCircle.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.circle != this.hoverCircle)) {
- this.dispatchEvent({
- type: 'changeIntersect',
- hovered: null
- });
- this.hoverCircle.setSelect(false);
- }
- if (this.hoverBalloon && this.hoverBalloon.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.balloon != this.hoverBalloon)) {
- this.dispatchEvent({
- type: 'changeIntersect',
- hovered: null
- });
- this.hoverBalloon.setSelect(false);
- }
- if (this.hoverExit && this.hoverExit.mesh != mesh
- /* && (!viewLinkEdit.markView || viewLinkEdit.markView.exitDoor != this.hoverExit) */
- ) {
- //bus.emit('link/tag/active', null)
- this.hoverExit.setSelect(false);
- }
- this.clickEnable = false;
- this.hoverBalloon = null;
- this.hoverCircle = null;
- this.hoverExit = null;
- if (!intersect) {
- //$('#player').css('cursor', '')
- CursorDeal.remove('hoverView');
- CursorDeal.remove('dragView');
- return true;
- }
- var view;
- if (mesh.name.includes('balloon')) {
- view = this.views[mesh.name.split('balloon_')[1]];
- view.balloon.setSelect(true);
- this.hoverBalloon = view.balloon;
- this.dispatchEvent({
- type: 'changeIntersect',
- hovered: view.sid
- });
- } else if (mesh.name.includes('exit')) {
- view = this.views[mesh.name.split('circle_exitDoor')[1]];
- view.exitDoor.setSelect(true);
- this.hoverExit = view.exitDoor;
- } else {
- view = this.views[mesh.name.split('circle_')[1]];
- if (!view) {
- return console.error('找不到view?', mesh.name);
- }
- this.hoverCircle = view.circle;
- view.circle.setSelect(true);
- this.dispatchEvent({
- type: 'changeIntersect',
- hovered: view.sid
- });
- }
- if (viewLinkEdit.markView == view && (player$l.currentPano != view.pano || viewLinkEdit.settingExit || viewLinkEdit.settingVisibles)) {
- CursorDeal.add('dragView');
- } else {
- CursorDeal.add('hoverView');
- this.clickEnable = true;
- }
- /* if (viewLinkEdit.markView) {
- if (viewLinkEdit.markView == view || viewLinkEdit.settingVisibles) {
- CursorDeal.add('dragView')
- }
- } else {
- CursorDeal.add('hoverView')
- } */
- }
- /*
- and如果点击了鼠标,就触发相应的点击的事件
- */
- }, {
- key: "dealWithClick",
- value: function dealWithClick() {
- if (this.clickEnable) {
- var hovered = this.hoverCircle || this.hoverBalloon || this.hoverExit;
- var view = this.views[hovered.sid];
- if (hovered == this.hoverExit) {
- /* if(viewLinkEdit.settingExit){
-
- }else */
- view.backToPanorama();
- return true;
- } else {
- if (view.linkType == 'url') {
- /* if (browser.urlHasValue('scene-link')) { //??
- bus.emit('link/tag/click', view.url)
- } else { */
- var url = view.url;
- if (app.config.link && typeof app.config.link === 'object') {
- if (typeof app.config.link.onAction === 'function') {
- url = app.config.link.onAction(url);
- }
- if (url) {
- if (browser$1.urlHasValue('sign')) {
- if (url.indexOf('#') != -1) {
- url = url.split('#')[0];
- }
- url += "&sign=".concat(browser$1.valueFromUrl('sign'));
- }
- if (app.config.link.target == 'blank') {
- window.open(url);
- } else {
- window.location.href = url;
- }
- }
- } else if (url) {
- if (browser$1.urlHasValue('sign')) {
- if (url.indexOf('#') != -1) {
- url = url.split('#')[0];
- }
- url += "&sign=".concat(browser$1.valueFromUrl('sign'));
- }
- window.location.href = url;
- } //}
- } else if (view.linkType == 'pano' && view.pano) {
- view.enter360Pano();
- }
- return true;
- }
- }
- }
- }, {
- key: "addView",
- value: function addView(view) {
- this.views[view.sid] = view;
- this.ViewLinkCircles.add(view.circle.mesh);
- this.ViewLinkBalloons.add(view.balloon.mesh);
- view.exitDoor && this.ViewLinkExits.add(view.exitDoor.mesh);
- this.ViewTitles.add(view.titleLabel);
- }
- }, {
- key: "removeView",
- value: function removeView(view) {
- this.ViewLinkCircles.remove(view.circle.mesh);
- this.ViewLinkBalloons.remove(view.balloon.mesh);
- this.ViewLinkExits.remove(view.exitDoor.mesh);
- delete this.views[view.sid];
- }
- }, {
- key: "update",
- value: function update(camera) {
- for (var r in this.views) {
- this.views[r].update();
- }
- }
- }, {
- key: "showAllViews",
- value: function showAllViews() {
- var cause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hideAll';
- //if (this.enabled) return
- //直接更改parent的visible
- /* this.ViewLinkCircles.visible = true
- this.ViewLinkBalloons.visible = true
- this.ViewLinkExits.visible = true
- this.changeTitlesShow(true, 'showAll') */
- common$1.updateVisible(this.group, cause, true); //this.enabled = true
- }
- }, {
- key: "hideAllViews",
- value: function hideAllViews() {
- var cause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hideAll';
- var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- //if (!this.enabled) return
- if (player$l.is360View(player$l.mode, player$l.currentPano)) ; else if (player$l.enteringView) {
- /* player.waitFlytoItemFuc = ()=>{
- player.currentPano.view.backToPanorama()
- } */
- player$l.once(PlayerEvents.FlyingEnded, function () {
- player$l.currentPano.view.backToPanorama();
- });
- } //直接更改parent的visible
- /* this.ViewLinkCircles.visible = false
- this.ViewLinkBalloons.visible = false
- this.ViewLinkExits.visible = false
- this.changeTitlesShow(false, 'showAll') */
- common$1.updateVisible(this.group, cause, false, level);
- this.dealwithIntersect(null); //清除所有hover
- //this.enabled = false
- }
- }, {
- key: "changeTitlesShow",
- value: function changeTitlesShow(state) {
- var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
- common$1.updateVisible(this.ViewTitles, cause, !!state);
- if (state) {
- this.ViewTitles.children.forEach(function (e) {
- return e.updatePos();
- });
- }
- }
- }, {
- key: "setViewsVisible",
- value: function setViewsVisible(type, visi) {
- //根据类型显示隐藏
- //if (!this.enabled) return
- for (var i in this.views) {
- if (this.views[i].linkType == type) {
- this.views[i].setVisible(visi);
- }
- }
- }
- /*
- 主要是在编辑状态下,focus on某个view,让用户知道自己正在编辑的view在画布中是哪个mesh。
- 如果是漫游模式就飞向其入口、 如果是ouside模式,就让相机移近气球,以气球为target。
- */
- }, {
- key: "focusOn",
- value: function focusOn(view) {
- var _this3 = this;
- if (player$l.flying) {
- return player$l.once(PlayerEvents.FlyingEnded, function () {
- _this3.focusOn(view);
- });
- }
- if (player$l.mode == 'panorama') {
- player$l.flyToPano({
- pano: view.nearestPano,
- lookAtPoint: view.circle.mesh.position,
- checkAlone: true
- });
- } else player$l.focusPoint({
- aim: view.balloon.mesh.position
- });
- }
- }, {
- key: "updateCirclesWhenFade",
- value: function updateCirclesWhenFade(state, o) {
- if (state == 'enter') {
- for (var i in this.views) {
- //更新此view中的其他view的circle的表现
- if (i in o.pano.view.visibleViews) {
- var info = {};
- info.viewDir = new THREE.Vector3().fromArray(o.pano.view.visibleViews[i]);
- this.views[i].circle.updatePos('at360View', info);
- this.views[i].circle.setVisible(true);
- } else {
- this.views[i].circle.setVisible(false);
- }
- }
- } else {
- for (var _i3 in this.views) {
- if (this.views[_i3].circle.at360View) {
- this.views[_i3].circle.updatePos('normal');
- }
- o.flyOut || this.views[_i3].circle.setVisible(true);
- }
- o.flyOut && viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
- }
- }
- }, {
- key: "exitView",
- value: function exitView() {
- var deferred = new Deferred$1();
- if (player$l.is360View(player$l.mode, player$l.currentPano)) {
- player$l.currentPano.view.backToPanorama();
- player$l.once(PlayerEvents.FlyingEnded, function () {
- deferred.resolve();
- });
- } else {
- deferred.resolve();
- }
- return deferred.promise();
- }
- }]);
- return ViewLinkManager;
- }(THREE.EventDispatcher); //-----------------------------------------------------------------
- //全景 or 超链接
- var ViewLink = /*#__PURE__*/function (_THREE$EventDispatche2) {
- _inherits(ViewLink, _THREE$EventDispatche2);
- var _super2 = _createSuper$1i(ViewLink);
- function ViewLink(data) {
- var _this4;
- _classCallCheck(this, ViewLink);
- _this4 = _super2.call(this); //console.log(data)
- _this4.sid = data.sid;
- _this4.pano = null; //对应的pano
- _this4.balloon = new ViewLinkBalloon(data, _assertThisInitialized(_this4));
- _this4.circle = new ViewLinkCircle(data, _assertThisInitialized(_this4)); //this.quaternion = data.quaternion ? new THREE.Quaternion().fromArray(data.quaternion) : new THREE.Quaternion; //全景图的旋转
- _this4.linkType = data.type; //'url' or 'pano'
- _this4.enterQuaternion = data.enterQuaternion ? new THREE.Quaternion().fromArray(data.enterQuaternion) : new THREE.Quaternion(); //进入时的朝向
- _this4.exitDirection = data.exitDirection ? new THREE.Vector3().fromArray(data.exitDirection) : new THREE.Vector3(0, 0, settings$3.view360.circleDisToCenter); //出口的位置
- _this4.url = data.url;
- if (isEdit || _this4.linkType == 'pano') _this4.exitDoor = new ViewLinkCircle(Object.assign({}, data, {
- circleType: 'exitDoor',
- exitDirection: _this4.exitDirection
- }), _assertThisInitialized(_this4));
- {
- _this4.titleLabel = new viewTitle(data.title, _assertThisInitialized(_this4));
- _this4.addEventListener('updatePose', function (e) {
- if (e.target.circleType == 'exitDoor') return;
- _this4.titleLabel.updatePos();
- });
- _this4.circle.addEventListener('move', function () {
- _this4.titleLabel.bindTo == 'circle' && _this4.titleLabel.updatePos();
- });
- } //处理图片缓存 version有bug,所以用scene.json里的 且scene.json和getinfo里的version还不太同步,getinfo要发布后才改变
- //data.version = app.store.get('metadata').version
- if (data.thumb) {
- _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}`
- data.thumb = app.resource.getUserImagesURL("panorama/".concat(_this4.imgSid, "/low/").concat(data.thumb));
- _this4.resolution = data.resolution; // '2k' or '4k'
- }
- _this4.nearestPano = data.nearestPano !== undefined && player$l.model.panos.index[data.nearestPano];
- if (_this4.nearestPano) {
- _this4.floor = _this4.nearestPano.floor;
- _this4.floor.addView(_assertThisInitialized(_this4));
- }
- _this4.setPano(data);
- _this4.visibleViews = data.visibleViews || {};
- _this4._data = data;
- return _this4;
- }
- _createClass(ViewLink, [{
- key: "update",
- value: function update(force) {
- //this.mesh.quaternion.copy(camera.quaternion);
- this.balloon.update(force);
- this.circle.update(force);
- this.exitDoor && this.exitDoor.update(force);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var _this5 = this;
- this.balloon.dispose();
- this.circle.dispose();
- this.exitDoor.dispose();
- this.deleteOldPano();
- this.titleLabel.dispose();
- if (player$l.currentPano == this.pano) this.backToPanorama();else if (this.entering) {
- player$l.once(PlayerEvents.FlyingEnded, function () {
- _this5.backToPanorama();
- }); //player.waitFlytoItemFuc = ()=>{this.backToPanorama()}
- }
- this.floor && this.floor.removeView(this);
- }
- /*
- 删除旧的pano在tile贴图上留下的残留
- (可能还有bug)
- */
- }, {
- key: "deleteOldPano",
- value: function deleteOldPano() {
- var _this6 = this;
- if (!this.pano) return;
- this.pano.floor.removePano(this.pano);
- this.pano.exit();
- delete this.pano.panoRenderer.activeRenderTargetDescriptors[this.sid];
- delete this.pano.panoRenderer.panoDescriptors[this.sid];
- if (this.pano.tiled) {
- delete this.pano.panoRenderer.tileTrees[this.sid];
- delete this.pano.panoRenderer.tileDirectory[this.sid];
- delete this.pano.tileDownloader.downloadDescriptors[this.sid];
- this.pano.tileDownloader.priorityQueue = this.pano.tileDownloader.priorityQueue.filter(function (item) {
- return item.pano != _this6.pano;
- });
- this.pano.tileDownloader.activeDownloads = this.pano.tileDownloader.activeDownloads.filter(function (item) {
- return item.pano != _this6.pano;
- });
- } //cleanupActiveDownloads
- var M = this.pano.panoRenderer.M;
- for (var i = 0; i < M.length; i++) {
- if (M[i].pano == this.pano) {
- M.splice(i, 1);
- break;
- }
- }
- var u = player$l.model.panos.list.indexOf(this.pano);
- player$l.model.panos.list.splice(u, 1);
- }
- /*
- 绑定对应pano, 以及全景图
- */
- }, {
- key: "setPano",
- value: function setPano() {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (this.linkType == 'pano') {
- if (o.thumb || o.thumbPanoTex) {
- //o.thumb是上传贴图后的src, o.thumbPanoTex是点击取消时恢复的;相同点是都换图了,要重新创建pano
- var rebuild = !!this.pano;
- if (this.pano) {
- this.deleteOldPano();
- }
- var pano = new Panorama(player$l.$app, this.sid, {
- panoType: '360view',
- position: new THREE.Vector3(),
- quaternion: new THREE.Quaternion(),
- //this.enterQuaternion,
- //quaternion: new THREE.Quaternion().setFromEuler(new THREE.Euler(0.04,0.04,0.04)),
- puck: new THREE.Vector3(0, -1.6, 0),
- seeMarkers: [],
- subgroup: this.nearestPano.floor.floorIndex,
- tiled: !o.mapSrc
- });
- pano.mapSrc = o.mapSrc; //编辑时临时的整张贴图src
- pano.attachToPanoRenderer(player$l.$app.core.get('PanoRenderer'));
- pano.qualityManager = player$l.$app.core.get('QualityManager');
- if (pano.tiled) {
- pano.tileDownloader = player$l.$app.core.get('TileDownloader');
- }
- pano.build1();
- pano.view = this;
- player$l.model.panos.add(pano); //加载tiles需要
- this.panoImgVersion = o.version; //防止缓存的后缀
- /* if(rebuild){
- if(player.model.projectedPano0 == this.pano)player.model.projectedPano0 = pano;
- if(player.model.projectedPano1 == this.pano)player.model.projectedPano1 = pano;
- } */
- if (rebuild && player$l.currentPano == this.pano) {
- //重新加载贴图
- var retryCallback = function retryCallback() {
- if (!player$l.checkAndWaitForPanoLoad(pano, 'high', 'low', player$l.basePanoSize, retryCallback)) {
- player$l.model.setProjectedPanos(pano, pano);
- pano.enter();
- }
- };
- player$l.currentPano = pano;
- retryCallback();
- }
- this.pano = pano;
- if (o.thumbPanoTex) {
- this.thumbPanoTex = o.thumbPanoTex;
- } else {
- this.thumbPanoTex = this.renderToGetMap(o.thumb);
- }
- this.circle.setMapIn(this.thumbPanoTex);
- this.balloon.setMapIn(this.thumbPanoTex);
- }
- if (this.thumbPanoTex) {
- //没传图时changeMap仍为0
- this.circle.mesh.material.uniforms.changeMap.value = 1;
- this.balloon.mesh.material.uniforms.changeMap.value = 1;
- }
- } else {
- this.circle.mesh.material.uniforms.changeMap.value = 0;
- this.balloon.mesh.material.uniforms.changeMap.value = 0;
- }
- } //将全景图渲染成某个漫游视角的贴图
- }, {
- key: "renderToGetMap",
- value: function renderToGetMap(src) {
- var _this7 = this;
- var renderTarget = new THREE.WebGLRenderTarget(256, 256, {
- stencilBuffer: !1
- });
- /* if(!isEdit){ //咋写
- src = config.getPublicResource(src)
- src = src.replace("results","pan")
- src = src.replace("scene/","")
- } */
- var maxWidth = browser$1.maybeQilin() ? 512 : 1024;
- var tex = texture.load(src, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _context.next = 2;
- return common$1.compressImg(tex.image, maxWidth);
- case 2:
- tex.image = _context.sent;
- isEdit && (_this7.unDealTex = tex);
- render(renderTarget, tex, _this7.enterQuaternion);
- case 5:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- })));
- tex.flipY = false;
- tex.minFilter = THREE.LinearFilter;
- this.renderTarget = renderTarget;
- return renderTarget.texture;
- }
- }, {
- key: "mapChangeRot",
- value: function mapChangeRot() {
- //修改初始视角后重新渲染贴图
- render(this.renderTarget, this.unDealTex, this.enterQuaternion);
- }
- /* updateMap(fov){
- camera.fov = fov;
- camera.updateProjectionMatrix()
- var V = sceneRenderer.renderer.autoClear;
- sceneRenderer.renderer.autoClear = !1
- sceneRenderer.renderer.render(scene, camera, this.renderTarget, !1)
- sceneRenderer.renderer.autoClear = V
- //renderTarget.texture.needsUpdate = true;
- } */
- }, {
- key: "enter360Pano",
- value: function enter360Pano(fun) {
- //进入全景
- /* if (player.isOutsideMode()) {
- player.flyToNewMode({ mode: 'panorama', pano: this.pano, callback: fun })
- } else {
- if (player.cameraControls.activeControl) {
- player.cameraControls.activeControl.insideLookLimitUp = 89.9
- player.cameraControls.activeControl.insideLookLimitDown = -89.9
- player.cameraControls.activeControl.limitAngleIsBound = false
- }
- player.flyToPano({ pano: this.pano }, () => {
- if (typeof fun === 'function') {
- fun()
- }
- player.model.floorLogos.changefloorLogoOpa({//隐藏
- dur: 0,
- index: 0,
- opa: 0,
- })
- })
- } */
- player$l.flyToPano({
- pano: this.pano
- }, function () {
- if (typeof fun === 'function') {
- fun();
- }
- });
- }
- }, {
- key: "backToPanorama",
- value: function backToPanorama() {
- /* if (player.cameraControls.activeControl) {
- player.cameraControls.activeControl.insideLookLimitUp = null
- player.cameraControls.activeControl.insideLookLimitDown = null
- player.cameraControls.activeControl.limitAngleIsBound = true
- } */
- //出来到漫游点
- if (this.bindPanoId !== undefined && (player$l.lastPano && this.bindPanoId === player$l.lastPano.id || this.bindPanoId === this.nearestPano.id)) {
- player$l.flyToPano({
- pano: player$l.lastPano || this.nearestPano
- });
- } else {
- player$l.flyToPano({
- pano: player$l.lastPano || this.nearestPano,
- lookAtPoint: this.circle.mesh.position
- });
- }
- }
- }, {
- key: "setVisible",
- value: function setVisible(v) {
- if (!v == this.disabled) return;
- if (v) {
- this.balloon.disabled = false;
- this.balloon.showOrHide(true, 0, 'auto');
- } else {
- this.balloon.showOrHide(false, 0);
- this.balloon.disabled = true;
- if (player$l.currentPano == this.pano || player$l.enteringView == this) {
- //注:enteringView时其实不会退出,所以这句其实需要改为callback后,以后再改
- this.backToPanorama();
- }
- }
- this.disabled = !v;
- this.circle.disabled = !v;
- this.circle.setVisible();
- }
- }, {
- key: "setSelect",
- value: function setSelect(state) {
- if (this.selected == state) return;
- this.selected = !!state;
- this.circle.setSelect(state);
- this.balloon.setSelect(state);
- }
- }]);
- return ViewLink;
- }(THREE.EventDispatcher);
- ViewLink.init = function () {
- if (ViewLink.inited) return;
- planeGeo1 = new THREE.PlaneBufferGeometry(0.4, 0.4);
- planeGeo2 = new THREE.PlaneBufferGeometry(1.5, 1.5);
- balloonMap = texture.load(texture.getImageURL('images/img_pamove.png')
- /* ,null,null,{antialias:true} */
- );
- balloonMap2 = texture.load(texture.getImageURL('images/img_pamove_normal.png')); //分区
- defaultCircleMap = texture.load(texture.getImageURL('images/img_panorama_dot.png'));
- defaultExitMap = texture.load(texture.getImageURL('images/img_exit_dot.png'));
- balloonMap2.minFilter = THREE.LinearMipmapNearestFilter; //1007 //可能缩小锯齿更弱一些
- balloonMap2.needsUpdate = true;
- /* defaultCircleMap.anisotropy = 4
- defaultCircleMap.needsUpdate = true */
- //用于渲染出贴图的一些工具:
- camera = new THREE.PerspectiveCamera();
- camera.fov = 80;
- camera.aspect = 1;
- camera.updateProjectionMatrix();
- scene = new THREE.Scene();
- scene.add(camera);
- mesh = new THREE.Mesh(new THREE.SphereBufferGeometry(fishEyeRadius, 25, 25), new THREE.RawShaderMaterial({
- //new THREE.BoxBufferGeometry(1,1)
- uniforms: THREE.UniformsUtils.clone(sphereRenderToCube.uniforms),
- vertexShader: sphereRenderToCube.vertexShader,
- fragmentShader: sphereRenderToCube.fragmentShader,
- depthWrite: !1,
- depthTest: !1,
- side: THREE.DoubleSide
- }));
- scene.add(mesh);
- ViewLink.inited = true;
- };
- /*
- 整体 360view 本质是全景pano 和 入口出口等mesh集合
- 默认对应的pano的位置都是Vector3(0,0,0)
- exitDoor: 全景图内exit图标
- enterQuaternion: 进入全景图时的初始角度
- exitDirection: 全景图内exit图标的方向。
- linkType: 全景或者超链接
- nearestPano: 最近的pano, 退出全景后到达的pano。 (因为是在编辑时确定的,所以干脆保存下来。)
- visibleViews:在该全景图中可以看到的 别的全景的circle集合, 每个全景包含了它在该全景内的位置信息
-
- */
- //----------------------------------------
- var ViewLinkBase = /*#__PURE__*/function (_THREE$EventDispatche3) {
- _inherits(ViewLinkBase, _THREE$EventDispatche3);
- var _super3 = _createSuper$1i(ViewLinkBase);
- function ViewLinkBase(data, view) {
- var _this8;
- _classCallCheck(this, ViewLinkBase);
- _this8 = _super3.call(this);
- _this8.view = view;
- _this8.sid = data.sid; //this.state = 'sprite'
- return _this8;
- }
- _createClass(ViewLinkBase, [{
- key: "update",
- value: function update(force) {
- var changed = false;
- if (this.state == 'sprite' && this.mesh.visible && (force || (this.mesh.material.uniforms.opacity ? this.mesh.material.uniforms.opacity.value > 0 : true))) {
- this.mesh.quaternion.copy(player$l.camera.quaternion);
- changed = true;
- }
- if (this.strictScale) {
- //通过限定二维大小,防止看起来过小。
- var s = math$2.getScaleForConstantSize({
- player: player$l,
- maxSize: 100,
- minSize: 40,
- nearBound: 2,
- farBound: 80,
- position: this.mesh.position
- });
- this.mesh.scale.set(s, s, s);
- changed = true;
- }
- changed && this.view.dispatchEvent({
- type: 'updatePose'
- });
- }
- }, {
- key: "setStrictScale",
- value: function setStrictScale(state) {
- //设定是否限定二维大小
- this.strictScale = state;
- if (state) this.update();else this.mesh.scale.set(1, 1, 1);
- this.view.dispatchEvent({
- type: 'updatePose'
- });
- }
- }, {
- key: "setMapIn",
- value: function setMapIn(map) {
- this.mesh.material.uniforms.mapIn.value = map;
- }
- }, {
- key: "dispose",
- value: function dispose() {}
- }]);
- return ViewLinkBase;
- }(THREE.EventDispatcher);
- /*
- 在漫游模式下看到的圆圈部分: 分为入口和出口
- 入口分为两种状态:1 普通状态 2 在别的全景内时
- 出口和在别的全景内的入口都是billboardSprite状态 即其quaternion同相机quaternion,在画面上看就是标准的圆。只是大小会在屏幕边缘更大些。
-
- */
- var ViewLinkCircle = /*#__PURE__*/function (_ViewLinkBase) {
- _inherits(ViewLinkCircle, _ViewLinkBase);
- var _super4 = _createSuper$1i(ViewLinkCircle);
- //飞入后
- function ViewLinkCircle(data, view) {
- var _this9;
- _classCallCheck(this, ViewLinkCircle);
- _this9 = _super4.call(this, data, view);
- _this9.circleType = data.circleType;
- _this9.position = new THREE.Vector3(); //记录在普通状态下的位置
- _this9.quaternion = new THREE.Quaternion(); //记录在普通状态下的旋转
- _this9.build(data);
- return _this9;
- }
- _createClass(ViewLinkCircle, [{
- key: "build",
- value: function build(data) {
- var uniforms = THREE.UniformsUtils.clone(linkSpotInside.uniforms);
- var mesh = new THREE.Mesh(planeGeo1, new THREE.RawShaderMaterial({
- uniforms: uniforms,
- vertexShader: linkSpotInside.vertexShader,
- fragmentShader: linkSpotInside.fragmentShader,
- transparent: true,
- side: THREE.DoubleSide
- }));
- mesh.renderOrder = RenderOrder.view;
- mesh.name = 'circle_' + (this.circleType ? this.circleType : '') + this.sid;
- this.mesh = mesh;
- this.setMapOut(data);
- if (this.circleType == 'exitDoor') {
- this.mesh.visible = false;
- this.mesh.material.depthTest = false;
- data.exitDirection && this.mesh.position.copy(data.exitDirection);
- this.state = 'sprite';
- } else {
- if (data.circle) {
- data.circle.pos && this.position.fromArray(data.circle.pos);
- data.circle.qua && this.quaternion.fromArray(data.circle.qua);
- var s = data.circle.scale / 100;
- data.circle.scale && this.mesh.scale.set(s, s, s);
- this.state = '3D';
- this.updatePos();
- }
- if (player$l.isOutsideMode()) this.setVisible(false);
- }
- }
- /*
- circle在全景之内需要转换位置
- */
- }, {
- key: "updatePos",
- value: function updatePos(type, o) {
- if (type == 'at360View') {
- //在别的view内显示时
- //var dir = this.position.clone().sub(o.viewPos).normalize()
- new THREE.Vector3();
- var dir = o.viewDir.clone().normalize();
- this.mesh.position.copy(dir.multiplyScalar(settings$3.view360.circleDisToCenter)); //this.mesh.lookAt(center)
- this.at360View = true;
- this.state = 'sprite'; //console.log("changeTosprite :"+this.sid)
- } else {
- if (o) {
- o.position && this.position.copy(o.position);
- o.quaternion && this.quaternion.copy(o.quaternion);
- }
- this.mesh.position.copy(this.position);
- this.mesh.quaternion.copy(this.quaternion);
- this.at360View = false;
- this.state = '3D'; //console.log("changeTo3D :"+this.sid)
- this.judgeDepthTest();
- this.dispatchEvent({
- type: 'move'
- });
- }
- }
- }, {
- key: "state",
- get: function get() {
- return this._state;
- },
- set: function set(v) {
- this._state = v; //console.log('state', v, this.name)
- this.mesh && this.update();
- }
- }, {
- key: "judgeDepthTest",
- value: function judgeDepthTest() {
- this.mesh.material.depthTest = !(this.state == 'sprite' || this.selected);
- }
- }, {
- key: "update",
- value: function update() {
- _get(_getPrototypeOf(ViewLinkCircle.prototype), "update", this).call(this);
- this.judgeDepthTest();
- }
- /*
- 选中后材质渐变
- */
- }, {
- key: "setSelect",
- value: function setSelect(state) {
- if (state == this.selected) return;
- this.selected = state;
- var fadeTime = 500;
- this.judgeDepthTest();
- transitions$1.cancelById('circlePro');
- transitions$1.start(lerp.uniform(this.mesh, 'progress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'circlePro'
- /* , settings.freeze.FlyToPano */
- );
- }
- /*
- 使用用户设置的贴图或者默认
- */
- }, {
- key: "setMapOut",
- value: function setMapOut(data) {
- var map;
- if (this.circleType == 'exitDoor') {
- if (!data) map = defaultExitMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
- map = texture.load(data);
- } else {
- /* if (data.style && data.style.exit.url) map = texture.load(dealURL(data.style.exit.url))
- else map = defaultExitMap //name:out, exit-style-${name}.jpg */
- if (data.style) {
- var url;
- if (data.style.exit.name && data.style.exit.name != 'custom') {
- url = app.resource.getAppURL("images/link/exit-style-".concat(data.style.exit.name, ".png")); //console.log('circle 使用默认图片', data.style.exit.name, url)
- } else {
- if (data.style.exit.url) url = dealURL(data.style.exit.url);
- }
- map = texture.load(url);
- } else map = defaultExitMap;
- }
- } else {
- if (!data) map = defaultCircleMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
- map = texture.load(dealURL(data));
- } else {
- if (data.style) {
- var _url;
- if (data.style.enter.name && data.style.enter.name != 'custom') {
- _url = app.resource.getAppURL("images/link/enter-style-".concat(data.style.enter.name, ".png")); //console.log('circle 使用默认图片', data.style.enter.name, url)
- } else {
- if (data.style.enter.url) _url = dealURL(data.style.enter.url);
- }
- map = texture.load(_url);
- } else map = defaultCircleMap;
- }
- }
- this.mesh.material.uniforms.mapOut.value = map;
- }
- }, {
- key: "setVisible",
- value: function setVisible(v) {
- if (v == void 0) {
- //使用历史值
- v = this._visible;
- }
- common$1.updateVisible(this.mesh, 'setVisible', !this.disabled && v); //this.mesh.visible = !this.disabled && v
- this._visible = v;
- }
- }]);
- return ViewLinkCircle;
- }(ViewLinkBase);
- /*
- 在空中的气球部分
- */
- var ViewLinkBalloon = /*#__PURE__*/function (_ViewLinkBase2) {
- _inherits(ViewLinkBalloon, _ViewLinkBase2);
- var _super5 = _createSuper$1i(ViewLinkBalloon);
- //飞出后
- function ViewLinkBalloon(data, view) {
- var _this10;
- _classCallCheck(this, ViewLinkBalloon);
- _this10 = _super5.call(this, data, view);
- _this10.state = 'sprite';
- _this10.build(data);
- return _this10;
- }
- _createClass(ViewLinkBalloon, [{
- key: "build",
- value: function build(data) {
- var uniforms = THREE.UniformsUtils.clone(linkSpot.uniforms);
- uniforms.mapOut.value = balloonMap;
- uniforms.mapOut2.value = balloonMap2;
- uniforms.opacity.value = 0;
- var mesh = new THREE.Mesh(planeGeo2, new THREE.RawShaderMaterial({
- uniforms: uniforms,
- vertexShader: linkSpot.vertexShader,
- fragmentShader: linkSpot.fragmentShader,
- transparent: true,
- side: THREE.DoubleSide,
- depthTest: false //飞出后再变为true
- }));
- mesh.renderOrder = RenderOrder.view;
- mesh.name = 'balloon_' + this.sid;
- this.mesh = mesh;
- if (data.balloon) {
- data.balloon.pos && this.mesh.position.fromArray(data.balloon.pos);
- }
- this.mesh.visible = false; //因为一开始在panorama模式
- }
- /*
- 从外飞到漫游模式时气球会渐渐消失,反之渐渐出现
- */
- }, {
- key: "showOrHide",
- value: function showOrHide(state, fadeTime, type) {
- var _this11 = this;
- //console.log('showOrHide ', state , this.sid, type)
- if (this.disabled) return;
- if (type == 'auto') {
- //自动判断是否可见 飞出后,在别的楼层不可见
- state = player$l.getToMode() != 'panorama' && (player$l.model.allFloorsVisible || !this.view.floor || this.view.floor == player$l.model.currentFloor);
- }
- var fadeTime = fadeTime != void 0 ? fadeTime : 500;
- var opa = state ? 1 : 0;
- transitions$1.cancelById('balloonOpa_' + this.sid);
- if (this.mesh.material.uniforms.opacity.value == opa) return;
- state && (this.mesh.visible = true);
- this.update(true);
- transitions$1.start(lerp.uniform(this.mesh, 'opacity', opa), fadeTime, function (e) {
- _this11.mesh.material.depthTest = player$l.modeTran.split('-')[1] != 'floorplan';
- _this11.mesh.visible = !!state; //消失时防止遮住其他mesh 如circle
- _this11.view.titleLabel.switchBind(state ? 'balloon' : 'circle');
- }, 0, easing[settings$3.transition.blendEasing], null, 'balloonOpa_' + this.sid);
- }
- /*
- hover and click
- */
- }, {
- key: "setSelect",
- value: function setSelect(state) {
- //this.mesh.material.uniforms.isActive.value = state ? 1 : 0
- if (state == this.selected) return;
- this.selected = state;
- var fadeTime = 300;
- transitions$1.cancelById('balloonPro');
- transitions$1.start(lerp.uniform(this.mesh, 'activeProgress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'balloonPro'
- /* , settings.freeze.FlyToPano */
- );
- }
- }]);
- return ViewLinkBalloon;
- }(ViewLinkBase);
- var viewTitle = /*#__PURE__*/function (_TextSprite) {
- _inherits(viewTitle, _TextSprite);
- var _super6 = _createSuper$1i(viewTitle);
- function viewTitle(text, view) {
- var _this12;
- _classCallCheck(this, viewTitle);
- _this12 = _super6.call(this, {
- text,
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- textshadowColor: '#888',
- borderRadius: 2,
- fontsize: 34,
- renderOrder: 5,
- margin: {
- x: 12,
- y: 10
- },
- player: player$l,
- fixOrient: true,
- sizeInfo: {
- scale: 0.4,
- nearBound: 3
- }
- });
- _this12.sprite.material.depthTest = _this12.sprite.material.depthWrite = true;
- _this12.sprite.material.side = THREE.DoubleSide;
- _this12.view = view;
- _this12.visible = false;
- setTimeout(function () {
- _this12.visible = true;
- _this12.switchBind(view.balloon.mesh.visible ? 'balloon' : 'circle');
- }, 1);
- /* const s = 0.3
- this.scale.set(s, s, s) */
- return _this12;
- }
- _createClass(viewTitle, [{
- key: "switchBind",
- value: function switchBind(bindTo) {
- //console.error('bindTo', bindTo)
- this.bindTo = bindTo;
- if (bindTo == 'circle') {
- this.fixOrient = true;
- this.quaternion.copy(this.view.circle.mesh.quaternion);
- } else {
- this.fixOrient = false;
- this.view.balloon;
- }
- this.updatePos();
- }
- }, {
- key: "updatePos",
- value: function updatePos() {
- if (!this.realVisible()) return;
- var mesh,
- margin,
- localPos = new THREE.Vector3(0, -1, 0);
- if (this.bindTo == 'circle') {
- mesh = this.view.circle.mesh;
- margin = 0.08;
- this.quaternion.copy(this.view.circle.mesh.quaternion);
- } else {
- mesh = this.view.balloon.mesh;
- mesh.scale.x * 0.8, margin = 0.2;
- }
- mesh.updateMatrix();
- localPos.multiplyScalar(margin + Math.abs(mesh.geometry.attributes.position.array[0]));
- localPos.applyMatrix4(mesh.matrix); //this.scale.set(s, s, s)
- this.position.copy(localPos);
- this.updatePose(); //scale
- //console.log('updatepos')
- }
- }]);
- return viewTitle;
- }(TextSprite);
- 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); }; }
- 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; } }
- /**
- * 马赛克效果
- * 注:原本的马赛克效果产品经理不太满意,因此现在的马赛克其实是高斯模糊
- */
- var filterName = browser$1.maybeQilin() && browser$1.detectFirefox() ? 'NearestFilter' : 'LinearFilter'; //麒麟firefox用LinearFilter报错黑屏。 但用NearestFilter会不够平滑。xzw2024.12.12
- //警告信息: Minification or magnification filtering is not NEAREST or NEAREST_MIPMAP_NEAREST, and the texture's format is not "texture-filterable"
- var Paint$1 = /*#__PURE__*/function (_Emiter) {
- _inherits(Paint, _Emiter);
- var _super = _createSuper$1h(Paint);
- function Paint(app, player) {
- var _this;
- _classCallCheck(this, Paint);
- _this = _super.call(this);
- _this.app = app;
- _this.player = player; // app.core.get('Player')
- _this.sceneRenderer = app.core.get('SceneRenderer');
- _this.sceneNum = app.config.num;
- _this.painting = false; // 进入/结束涂抹
- _this.pause = false; // 是否暂停涂抹
- _this.mousePosition = new THREE.Vector4();
- _this.currentPaintUrl = null; // 当前马赛克图片路径
- var metadata = app.store.getValue('metadata');
- if (!metadata) {
- app.store.on('metadata', function (data) {
- _this.paintData = data.mosaicList; // 涂抹贴图的大小
- _this.width = 1024 * (data.sceneFrom == 'pro' ? 2 : 4); // window.innerWidth;
- _this.height = 1024 * (data.sceneFrom == 'pro' ? 1 : 2); // window.innerHeight
- });
- } else {
- _this.paintData = metadata.mosaicList;
- _this.width = 1024 * (metadata.sceneFrom == 'pro' ? 2 : 4);
- _this.height = 1024 * (metadata.sceneFrom == 'pro' ? 1 : 2);
- }
- return _this;
- }
- _createClass(Paint, [{
- key: "init",
- value: function init() {
- var _this2 = this;
- // 准备离屏渲染的render和shader
- var resolution = new THREE.Vector3(this.width, this.height, window.devicePixelRatio);
- this.bufferRenderer = new BufferRenderer(this.sceneRenderer.renderer, {
- width: this.width,
- height: this.height
- });
- this.bufferShader = new BufferShader({
- iResolution: {
- value: resolution
- },
- iMouse: {
- value: this.mousePosition
- },
- iChannel0: {
- value: null
- },
- // 马赛克
- iChannel1: {
- value: null
- },
- // 全景图
- iBrushType: {
- value: 1
- },
- iBrushSize: {
- value: 5
- },
- iAngle: {
- value: 0
- },
- iPitch: {
- value: 0
- },
- iIsBrush: {
- value: 0
- }
- }); // 同时更新skybox和chunk的相关uniforms,因为还要在model.js里渲染笔刷
- Object.assign(this.player.model.skybox.material.uniforms, this.bufferShader.uniforms);
- this.player.model.chunks.forEach(function (chunk) {
- return Object.assign(chunk.materialInside.uniforms, _this2.bufferShader.uniforms);
- });
- } // 开始涂抹
- }, {
- key: "start",
- value: function start(isPause) {
- var _this3 = this;
- this.player.reticule.visible = false;
- this.player.cameraControls.activeControl.enabled = false;
- this.mousePosition.setZ(0); // z用于标识是否mousedown
- // 计算相机角度--------------------------------
- var lookAt = this.player.camera.getWorldDirection(new THREE.Vector3()); // 上下转角
- var projectVec = lookAt.clone().projectOnPlane(new THREE.Vector3(0, 1, 0));
- var pitch = lookAt.angleTo(projectVec) * Math.sign(-lookAt.y); // 左右转角
- var lookAtXZ = lookAt.clone().setY(0);
- var skyRota = new THREE.Euler().setFromQuaternion(this.player.currentPano.quaternion); //this.player.currentPano.skyboxMesh.rotation
- var skyDir = new THREE.Vector3(1, 0, 0).applyEuler(skyRota).setY(0);
- var skyDirCross = new THREE.Vector3(0, 0, 1).applyEuler(skyRota).setY(0);
- var angle = lookAtXZ.angleTo(skyDir) * Math.sign(lookAtXZ.dot(skyDirCross));
- this.bufferShader.uniforms['iAngle'].value = angle;
- this.bufferShader.uniforms['iPitch'].value = pitch; // -------------------------------------------
- if (isPause) {
- // 恢复暂停
- this.showBrush(true);
- this.pause = false;
- } else {
- // 将已有马赛克数据放入到离屏渲染
- var startPaint = function startPaint(texture) {
- // 不重置readBuffer的话,保存一次后将不再能涂抹
- _this3.bufferRenderer.readBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions);
- texture && (_this3.bufferRenderer.readBuffer.texture = texture);
- _this3.bufferRenderer.writeBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions); // 将全景图马赛克设置为离屏渲染texture,使涂抹实时更新
- _this3.setPaintTexture('paint0Map', _this3.bufferRenderer.readBuffer.texture);
- _this3.setPaintTexture('paint1Map', _this3.bufferRenderer.readBuffer.texture);
- _this3.painting = true;
- if (_this3.pause) _this3.cancel(true);
- };
- if (this.currentPaintUrl) {
- // 这里必须load一个新texture,否则会形成readbuffer和texture的反馈环
- new THREE.TextureLoader().load(this.currentPaintUrl, function (texture) {
- texture.minFilter = THREE[filterName];
- texture.magFilter = THREE[filterName];
- texture.type = THREE.FloatType; // 和readbuffer一致
- texture.needsUpdate = true;
- startPaint(texture);
- });
- } else {
- startPaint();
- }
- this.player.locked = true;
- this.hasEdit = false; // 标明start后有没有涂抹过
- this.defineHasPaint(true); // 设置hasPaint为true,否则涂抹相关shader将被ifelse判断跳过
- // 加载一张全景图作为涂抹的底图(高斯模糊必须用pan/high/,马赛克用pan/low/就可以)
- texture.load(this.app.resource.getViewImagesURL("pan/high/".concat(this.player.currentPano.id, ".jpg")), function (panoTexture) {
- _this3.bufferShader.uniforms['iChannel1'].value = panoTexture; // 给离屏shader设置底图
- _this3.showBrush(true); // 显示笔刷
- _this3.emit('start');
- });
- }
- } // 停止涂抹
- }, {
- key: "cancel",
- value: function cancel(isPause) {
- this.player.reticule.visible = true;
- this.player.cameraControls.activeControl.enabled = true;
- this.showBrush(false); // 隐藏笔刷
- if (isPause) {
- // 暂停,只停下来转视角
- this.pause = true;
- } else {
- this.painting = false;
- this.hasEdit = false;
- this.player.locked = false;
- this.setPaintImage(this.currentPaintUrl, this.currentPaintUrl); // 更新马赛克图片到全景图,替换离屏渲染texture
- this.bufferRenderer.readBuffer.dispose();
- this.bufferRenderer.writeBuffer.dispose();
- }
- } // 保存涂抹数据
- }, {
- key: "save",
- value: function save() {
- var self = this;
- var panoId = this.player.currentPano.id;
- return {
- panoId: panoId,
- data: this.bufferRenderer.save(),
- // base64
- func: function func() {
- // 把base64当做链接存起来,就不用等后端返回png路径了
- self.currentPaintUrl = self.bufferRenderer.base64; // 更新panoPaint
- if (!self.paintData) self.paintData = [];
- var panoPaint = self.paintData.find(function (data) {
- return data.panoId == panoId;
- });
- if (panoPaint) {
- panoPaint.data = self.bufferRenderer.base64;
- } else {
- self.paintData.push({
- panoId: panoId,
- data: self.bufferRenderer.base64
- });
- }
- }
- };
- }
- }, {
- key: "update",
- value: function update() {
- // 涂抹实时更新
- if (this.painting && !this.pause) {
- this.bufferShader.uniforms['iChannel0'].value = this.bufferRenderer.readBuffer.texture; // 每次渲染出马赛克都更新到bufferShader保存下来
- this.bufferRenderer.render(this.bufferShader.scene, this.bufferShader.camera); // 渲染bufferShader场景,得到新马赛克
- }
- }
- /**
- * 笔刷
- */
- // 笔刷显隐
- }, {
- key: "showBrush",
- value: function showBrush(show) {
- this.sceneRenderer.renderer.domElement.style.cursor = show ? 'none' : 'default'; // 如果显示笔刷的话,就要隐藏鼠标
- this.player.model.skybox && (this.player.model.skybox.material.uniforms['iShowBrush'].value = show ? 1 : 0);
- this.player.model.chunks.forEach(function (chunk) {
- return chunk.materialInside.uniforms['iShowBrush'].value = show ? 1 : 0;
- });
- } // 笔刷切换
- }, {
- key: "changeBrush",
- value: function changeBrush(type) {
- if (parseInt(type) == -1) {
- this.cancel(true); // 暂停涂抹
- } else {
- this.pause && this.start(true); // 从暂停恢复
- this.bufferShader.uniforms['iBrushType'].value = parseInt(type);
- }
- } // 调整笔刷大小
- }, {
- key: "setBrushSize",
- value: function setBrushSize(size) {
- this.bufferShader.uniforms['iBrushSize'].value = parseFloat(size);
- }
- /**
- * 涂抹贴图更新
- */
- // 外部调用,用于pano跳转
- }, {
- key: "updatePanoPaint",
- value: function updatePanoPaint(pano0Id, pano1Id) {
- if (!this.paintData) return;
- var pano0Paint = this.paintData.find(function (data) {
- return data.panoId == pano0Id;
- });
- var path0 = pano0Paint && (pano0Paint.data || this.app.resource.getUserResourceURL(pano0Paint.fileName));
- var pano1Paint = this.paintData.find(function (data) {
- return data.panoId == pano1Id;
- });
- var path1 = pano1Paint && (pano1Paint.data || this.app.resource.getUserResourceURL(pano1Paint.fileName));
- this.currentPaintUrl = pano1Id != null ? path1 : path0;
- this.setPaintImage(path0, path1);
- } // 用于非涂抹时更新贴图
- }, {
- key: "setPaintImage",
- value: function setPaintImage(path0, path1) {
- var _this4 = this;
- this.defineHasPaint(!!path1 || !!path0); // 考虑到过渡效果,pano1和pano0都要判断
- path0 ? texture.loadWithoutUpdate(path0, function (t) {
- return _this4.setPaintTexture('paint0Map', t);
- }, function () {} // 给个空函数catch error
- ) : this.setPaintTexture('paint0Map', null);
- path1 ? texture.loadWithoutUpdate(path1, function (t) {
- return _this4.setPaintTexture('paint1Map', t);
- }, function () {}) : this.setPaintTexture('paint1Map', null);
- } // 设置涂抹贴图 mapName: 'paint0Map' | 'paint1Map'
- }, {
- key: "setPaintTexture",
- value: function setPaintTexture(mapName, texture) {
- if (texture) {
- texture.minFilter = THREE[filterName];
- texture.magFilter = THREE[filterName];
- }
- this.app.core.get('QuickstartManager').skybox.material.uniforms[mapName].value = texture;
- this.player.model.skybox && (this.player.model.skybox.material.uniforms[mapName].value = texture);
- this.player.model.chunks.forEach(function (chunk) {
- return chunk.materialInside.uniforms[mapName].value = texture;
- });
- this.player.model.highMapCube && this.player.model.highMapCube.tiles.forEach(function (tile) {
- tile.material.uniforms[mapName].value = texture;
- });
- } // 设置HasPaint,为true时才运行马赛克相关shader,减少显存占用
- }, {
- key: "defineHasPaint",
- value: function defineHasPaint(isDefine) {
- var materials = [];
- materials.push(this.app.core.get('QuickstartManager').skybox.material);
- this.player.model.skybox && materials.push(this.player.model.skybox.material);
- this.player.model.chunks.forEach(function (chunk) {
- return materials.push(chunk.materialInside);
- });
- this.player.model.highMapCube && materials.push.apply(materials, _toConsumableArray(this.player.model.highMapCube.tiles.map(function (e) {
- return e.material;
- })));
- if (isDefine) {
- materials.forEach(function (mat) {
- return mat.defines['HasPaint'] = true, mat.needsUpdate = true;
- });
- } else {
- materials.forEach(function (mat) {
- return delete mat.defines['HasPaint'], mat.needsUpdate = true;
- });
- }
- }
- /**
- * 涂抹鼠标事件处理
- */
- }, {
- key: "dealPointerDown",
- value: function dealPointerDown() {
- if (this.player.locked) {
- this.hasEdit = true;
- this.mousePosition.setZ(1);
- } else {
- // 保证start完再mousedown,防止底图还未加载好
- this.once('start', this.dealPointerDown.bind(this));
- }
- }
- }, {
- key: "dealPointerMove",
- value: function dealPointerMove(mouse) {
- // 适应zoom和校准
- var width = this.sceneRenderer.renderer.domElement.clientWidth,
- height = this.sceneRenderer.renderer.domElement.clientHeight;
- mouse.x = (mouse.x - width / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + width / 2;
- mouse.y = (mouse.y - height / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + height / 2;
- this.mousePosition.setX(mouse.x / width * this.width);
- this.mousePosition.setY((1 - mouse.y / height) * this.height);
- }
- }, {
- key: "dealPointerUp",
- value: function dealPointerUp() {
- this.mousePosition.setZ(0);
- }
- }]);
- return Paint;
- }(tinyEmitter); // 离屏渲染场景
- var BufferShader = function BufferShader() {
- var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- _classCallCheck(this, BufferShader);
- this.uniforms = uniforms; // 涂抹材质
- this.material = new THREE.RawShaderMaterial({
- fragmentShader: shaders['model'].fragmentBufferShader,
- vertexShader: shaders['model'].vertexShader,
- uniforms: uniforms,
- side: THREE.DoubleSide
- });
- this.scene = new THREE.Scene();
- this.scene.add(new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), this.material)); // 涂抹Plane
- this.camera = new THREE.PerspectiveCamera(90, 1, 0.01, 1000); // Camera
- this.camera.position.set(0, 0, 1);
- }; // 离屏渲染renderer
- var BufferRenderer = /*#__PURE__*/function () {
- function BufferRenderer(renderer, size) {
- _classCallCheck(this, BufferRenderer);
- this.renderer = renderer;
- this.width = size.width;
- this.height = size.height;
- this.bufferOptions = {
- minFilter: THREE[filterName],
- magFilter: THREE[filterName],
- format: THREE.RGBAFormat,
- type: THREE.FloatType,
- stencilBuffer: false
- }; // 在start()的时候初始化
- this.readBuffer = null; // 一般用于从该buffer读取先前的渲染结果:this.readBuffer.texture
- this.writeBuffer = null; // 一般用于将渲染结果写入该buffer:render()
- }
- _createClass(BufferRenderer, [{
- key: "render",
- value: function render(scene, camera) {
- var toScreen = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- if (toScreen) {
- this.renderer.render(scene, camera);
- } else {
- // 离屏渲染
- var V = this.renderer.autoClear;
- this.renderer.autoClear = !1; // 暂时关闭autoClear
- this.renderer.setRenderTarget(this.writeBuffer);
- this.renderer.render(scene, camera); // 将BufferShader场景的渲染结果存储到writeBuffer里
- this.renderer.setRenderTarget(null);
- this.renderer.autoClear = V;
- } // 每次render都要交换readBuffer/writeBuffer的值
- var _ref = [this.writeBuffer, this.readBuffer];
- this.readBuffer = _ref[0];
- this.writeBuffer = _ref[1];
- } // 将涂抹数据保存为base64,之后发给后端转成png格式并存入数据库
- }, {
- key: "save",
- value: function save() {
- var bufferArray = new Float32Array(this.width * this.height * 4); // 宽像素 * 高像素 * rgba四个值
- // 把readBuffer里的涂抹贴图按像素存入bufferArray
- this.renderer.readRenderTargetPixels(this.readBuffer, 0, 0, this.width, this.height, bufferArray);
- this.outputCanvas = document.createElement('canvas');
- this.outputCanvas.width = this.width;
- this.outputCanvas.height = this.height;
- var ctx = this.outputCanvas.getContext('2d');
- var rowBytes = this.width * 4;
- for (var row = 0; row < this.height; row++) {
- var srow = this.height - 1 - row;
- var imageData = ctx.createImageData(this.width, 1);
- var start = srow * this.width * 4;
- for (var i = 0; i < rowBytes; i++) {
- imageData.data[i] = bufferArray[start + i] * 255;
- } // 把bufferArray画到outputCanvas上
- ctx.putImageData(imageData, 0, row);
- } // outputCanvas转存为base64
- this.base64 = this.outputCanvas.toDataURL('image/png'); // let img = document.createElement("img")
- // img.src = this.base64
- // document.querySelector("body").appendChild(img)
- // console.error(this.base64)
- return this.base64;
- }
- }]);
- return BufferRenderer;
- }();
- 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); }; }
- 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; } }
- /**
- * 空间模型
- */
- var GLTFDecoration = /*#__PURE__*/function (_THREE$Group) {
- _inherits(GLTFDecoration, _THREE$Group);
- var _super = _createSuper$1g(GLTFDecoration);
- function GLTFDecoration(manager, info) {
- var _this;
- _classCallCheck(this, GLTFDecoration);
- _this = _super.call(this);
- _this.manager = manager;
- _this.version = 0;
- _this.axisAngle = {
- x: 0,
- y: 0,
- z: 0
- };
- if (!info) {
- // 新增
- _this.sid = common$1.getRandomSid();
- _this.panoId = _this.manager.player.currentPano.id;
- _this.isNew = true;
- _this.position.setY(1000);
- var BoxMaterial = new THREE.MeshBasicMaterial({
- color: Colors.mainColor,
- opacity: 0.4,
- transparent: !0,
- polygonOffset: true,
- //是否开启多边形偏移
- polygonOffsetFactor: -0.9,
- //多边形偏移因子
- polygonOffsetUnits: -4.0 //多边形偏移单位
- });
- var BoxGeometry = new THREE.BoxGeometry(0.5, 0.5, 0.5);
- BoxGeometry.translate(0, 0.25, 0);
- var box = new THREE.Mesh(BoxGeometry, BoxMaterial);
- _this.add(box);
- } else {
- // 数据库数据
- _this.setFromInfo(info);
- _this.updateInfo(true);
- }
- return _this;
- }
- /**
- * 加载模型
- * @param {*} url 模型名称
- */
- _createClass(GLTFDecoration, [{
- key: "load",
- value: function load(url) {
- this.children.forEach(function (mesh) {
- mesh.geometry.dispose();
- mesh.material.dispose();
- });
- this.children = [];
- if (url) {
- this.url = url;
- 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}`,
- function (gltf) {
- var _this2 = this;
- var meshes = [];
- gltf.scene.traverse(function (obj) {
- return obj.type == 'Mesh' && meshes.push(obj);
- });
- meshes.forEach(function (mesh) {
- // mesh.material.color.setRGB(3, 3, 3)
- _this2.add(mesh);
- mesh.renderOrder = RenderOrder.overlay; //xzw add
- mesh.material.transparent = true; //xzw add 否则会被marker遮住
- });
- this.version++;
- this.dispatchEvent({
- type: 'loaded'
- });
- }.bind(this));
- }
- } // 删除模型
- }, {
- key: "remove",
- value: function remove() {
- this.removeFromParent();
- this.children.forEach(function (mesh) {
- mesh.geometry.dispose();
- mesh.material.dispose();
- });
- } // 通过info初始化或回退
- }, {
- key: "setFromInfo",
- value: function setFromInfo(info) {
- this.sid = info.sid;
- this.panoId = info.panoId;
- this.url != info.url && this.load(info.url);
- this.zipName = info.zipName;
- this.visible = info.visible;
- this.setTransformFromInfo(info);
- }
- }, {
- key: "setTransformFromInfo",
- value: function setTransformFromInfo(info) {
- var position = info.position,
- rotation = info.rotation,
- scale = info.scale,
- quaternion = info.quaternion;
- this.position.set(parseFloat(position.x), parseFloat(position.y), parseFloat(position.z));
- if (quaternion) {
- this.setRotationFromQuaternion(new THREE.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));
- } else {
- // this.rotation.set(THREE.MathUtils.degToRad(rotation.x), THREE.MathUtils.degToRad(rotation.y), THREE.MathUtils.degToRad(rotation.z))
- this.setAxisAngle('x', THREE.MathUtils.degToRad(rotation.x));
- this.setAxisAngle('y', THREE.MathUtils.degToRad(rotation.y));
- this.setAxisAngle('z', THREE.MathUtils.degToRad(rotation.z));
- }
- this.scale.set(parseFloat(scale.x), parseFloat(scale.y), parseFloat(scale.z));
- }
- /**
- * 旋转
- * @param {'x' | 'y' | 'z'} axisName 旋转轴
- * @param {*} angle 旋转角
- */
- }, {
- key: "setAxisAngle",
- value: function setAxisAngle(axisName, angle) {
- var axis = axisName == 'x' ? Vectors$1.RIGHT : axisName == 'y' ? axis = Vectors$1.UP : Vectors$1.BACK;
- this.rotateOnAxis(axis, angle - this.axisAngle[axisName]);
- this.axisAngle[axisName] = angle;
- }
- /**
- * 返回空间模型数据
- * @param {*} isSave 是否保存当前数据
- * @returns
- */
- }, {
- key: "updateInfo",
- value: function updateInfo(isSave) {
- var info = {
- sid: this.sid,
- panoId: this.panoId,
- url: this.url,
- zipName: this.zipName,
- position: {
- x: parseFloat(this.position.x.toFixed(2)),
- y: parseFloat(this.position.y.toFixed(2)),
- z: parseFloat(this.position.z.toFixed(2))
- },
- rotation: {
- x: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.x)),
- y: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.y)),
- z: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.z))
- },
- scale: {
- x: parseFloat(this.scale.x.toFixed(1)),
- y: parseFloat(this.scale.y.toFixed(1)),
- z: parseFloat(this.scale.z.toFixed(1))
- },
- visible: this.visible
- };
- if (isSave) this.info = info;
- return info;
- }
- }]);
- return GLTFDecoration;
- }(THREE.Group);
- var GLTFAddManager = /*#__PURE__*/function () {
- function GLTFAddManager(player) {
- _classCallCheck(this, GLTFAddManager);
- this.player = player;
- this.editing = false;
- this.adding = null; // 添加后确认位置前的状态
- this.selecting = null; // 选中出现轴向时的状态
- this.group = new THREE.Group();
- this.group.name = 'GLTFDecorations';
- player.model.add(this.group);
- this.bindEvents();
- }
- _createClass(GLTFAddManager, [{
- key: "show",
- value: function show(floorIndex, keepHidden) {
- var _this = this;
- this.group.children.forEach(function (gltf) {
- if (gltf === _this.adding || gltf === _this.selecting) return; // 忽略编辑中模型的显隐计算
- if (keepHidden && !gltf.info.visible) return;
- if (floorIndex == 'all' || _this.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = true;
- });
- }
- }, {
- key: "hide",
- value: function hide(floorIndex) {
- var _this2 = this;
- this.group.children.forEach(function (gltf) {
- if (gltf === _this2.adding || gltf === _this2.selecting) return;
- if (floorIndex == 'all' || _this2.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = false;
- });
- }
- /**
- * 事件
- */
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- var _this3 = this;
- this.player.on('pointerUp', this.onMouseUp.bind(this));
- this.player.on('pointerMove', this.onMouseMove.bind(this));
- var axisAngleTemp;
- this.player.model.transformControls.addEventListener('mouseDown', function () {
- if (_this3.selecting) {
- axisAngleTemp = JSON.parse(JSON.stringify(_this3.selecting.axisAngle));
- }
- });
- this.player.model.transformControls.addEventListener('mousing', function (e) {
- if (_this3.selecting) {
- // 移动模型轴向
- if (e.mode == 'rotate') {
- var axis = e.axis.toLowerCase();
- var angle = axisAngleTemp[axis] + e.angle;
- _this3.selecting.axisAngle[axis] = ((angle + Math.PI) % (Math.PI * 2) - Math.PI * 2) % (Math.PI * 2) + Math.PI; // 限制在-179到180
- }
- _this3.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', _this3.selecting.updateInfo());
- }
- });
- this.player.model.transformControls.addEventListener('mouseUp', function () {
- if (_this3.selecting) ;
- });
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(e) {
- if (this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane) return;
- if (this.selecting || !this.editing) return;
- if (this.adding) {
- e.consume(); // 确认位置
- this.adding.updateInfo(true);
- this.select(this.adding);
- this.adding = null;
- } else if (this.player.mouseCouldBeClickToMove) {
- var intersect = this.player.getMouseIntersect(null, this.group.children.filter(function (d) {
- return d.visible;
- }));
- if (intersect) {
- // 点击选中
- e.consume();
- var decoration = intersect.object.parent;
- this.select(decoration);
- this.player.flyToPano({
- pano: this.player.model.panos.get(decoration.panoId),
- lookAtPoint: decoration.position,
- checkAlone: true
- });
- }
- }
- }
- }, {
- key: "onMouseMove",
- value: function onMouseMove() {
- if (this.adding) {
- var intersect = this.player.getMouseIntersect(null, this.player.model.colliders);
- if (intersect) {
- this.adding.position.copy(intersect.point);
- }
- }
- }
- /**
- * 选中
- */
- }, {
- key: "select",
- value: function select(decoration) {
- this.selecting = decoration;
- this.player.model.transformControls.switchEditState('decoration');
- this.player.model.transformControls.attach(decoration);
- this.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', decoration.updateInfo());
- this.player.compass.switch('axis');
- }
- }, {
- key: "unselect",
- value: function unselect() {
- this.selecting = null;
- this.player.model.transformControls.detach();
- this.player.compass.switch('direction');
- }
- /**
- * 增删
- */
- }, {
- key: "add",
- value: function add(info) {
- var decoration = new GLTFDecoration(this, info);
- this.group.add(decoration);
- if (!info) this.adding = decoration;
- return decoration;
- }
- }, {
- key: "delete",
- value: function _delete(decoration) {
- if (decoration == this.selecting) this.unselect();
- decoration.remove();
- }
- /**
- * 保存
- */
- }, {
- key: "save",
- value: function save(func) {
- // let data = this.group.children.map(decoration => decoration.updateInfo())
- var data = this.selecting.updateInfo(); // let data = {}
- // this.group.children.forEach((decoration, index) => {
- // data[index] = decoration.updateInfo()
- // })
- return {
- // data: JSON.stringify(data),
- data,
- successCallBack: function () {
- try {
- this.selecting.isNew = false;
- this.selecting.updateInfo(true);
- this.unselect(); // this.group.children.forEach(decoration => {
- // decoration.isNew = false
- // decoration.updateInfo(true)
- // })
- func && func();
- } catch (e) {
- console.error(e);
- }
- }.bind(this)
- };
- }
- }]);
- return GLTFAddManager;
- }();
- 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); }; }
- 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; } }
- var ViewerBase = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(ViewerBase, _THREE$EventDispatche);
- var _super = _createSuper$1f(ViewerBase);
- function ViewerBase(domElement) {
- var _this;
- var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- _classCallCheck(this, ViewerBase);
- _this = _super.call(this);
- _this.name = args.name;
- _this.domElement = domElement;
- _this.oldResolution = new THREE.Vector2();
- _this.oldResolution2 = new THREE.Vector2();
- _this.screenSizeInfo = {
- W: 0,
- H: 0,
- pixelRatio: 1,
- windowWidth: 0,
- windowHeight: 0
- };
- _this.initContext(args);
- _this.addEventListener('content_changed', function () {
- //画面改变,需要渲染
- _this.needRender = true; //console.log('needRender')
- });
- return _this;
- }
- _createClass(ViewerBase, [{
- key: "initContext",
- value: function initContext(args) {
- var _this2 = this;
- //console.log(`initializing three.js ${THREE.REVISION}`);
- this.domElement.clientWidth;
- this.domElement.clientHeight;
- ({
- alpha: true,
- //支持透明
- depth: true,
- stencil: false,
- antialias: !!args.antialias,
- preserveDrawingBuffer: args.preserveDrawingBuffer || false,
- powerPreference: 'high-performance'
- });
- var canvas = document.createElement('canvas'); //Potree.settings.renderAllViewports = browser.maybeQilin() && this.renderer.capabilities.maxCubemapSize <= 2048 && //麒麟chromium若获取过webgl2只渲染一个viewport的话其他的会变黑
- /*
- let webglVer = (args.webgl1 || Potree.browser.urlHasValue('webgl1') || !Potree.Features.webgl2RealSupport() ) ? 'webgl' : 'webgl2'
- let context = canvas.getContext(webglVer, contextAttributes );
- */
- this.renderer = new THREE.WebGLRenderer({
- premultipliedAlpha: false,
- canvas: canvas //context: context,
- });
- this.renderer.sortObjects = true; //原先false 打开了renderOrder才奏效
- //this.renderer.setSize(width, height);
- this.renderer.autoClear = args.autoClear || false; //args.clearColor = args.clearColor || '#aa0033'
- args.clearColor && this.renderer.setClearColor(args.clearColor);
- this.domElement.appendChild(this.renderer.domElement);
- this.renderer.domElement.style.position = 'absolute';
- this.renderer.domElement.addEventListener('mousedown', function () {
- _this2.renderer.domElement.focus();
- });
- /* {
- let oldRender = this.renderer.render
- this.renderer.render = function(scene, camera){
- Potree.currentRender = {renderer: this, scene, camera }
- oldRender.apply(this, arguments)
- }
- } */
- //this.renderer.domElement.focus();
- // NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling
- // enable frag_depth extension for the interpolation shader, if available
- var gl = this.renderer.getContext();
- gl.getExtension('EXT_frag_depth');
- gl.getExtension('WEBGL_depth_texture');
- gl.getExtension('WEBGL_color_buffer_float'); // Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2
- if (gl.createVertexArray == null) {
- var extVAO = gl.getExtension('OES_vertex_array_object');
- if (!extVAO) {
- throw new Error('OES_vertex_array_object extension not supported');
- }
- gl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);
- gl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);
- }
- }
- }, {
- key: "updateScreenSize",
- value: function updateScreenSize() {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //有可能需要让viewport来判断,当窗口大小不变但viewport大小变时
- if (this.screenshoting && !o.forceUpdateSize) return; //截图时不允许因窗口改变大小而updateScreenSize
- var render = false,
- ratio,
- w,
- h; //记录应当render的大小
- if (o.width != void 0 && o.height != void 0) {
- w = o.width;
- h = o.height;
- render = true;
- ratio = 1;
- } else {
- w = this.domElement.clientWidth;
- h = this.domElement.clientHeight;
- if (w !== this.screenSizeInfo.W || h !== this.screenSizeInfo.H || o.forceUpdateSize || this.screenSizeInfo.pixelRatio != window.devicePixelRatio) {
- this.screenSizeInfo.W = w;
- this.screenSizeInfo.H = h;
- render = true;
- this.screenSizeInfo.pixelRatio = window.devicePixelRatio; //如果player放在小窗口了,也要监测devicePixelRatio,因为缩放时client宽高不会改变
- //config.isMobile ? (ratio = Math.min(window.devicePixelRatio, 2)) : (ratio = window.devicePixelRatio)
- ratio = window.devicePixelRatio;
- }
- }
- if (render) {
- this.setSize_(w, h, ratio, o.forTarget);
- }
- }
- }, {
- key: "setSize_",
- value: function setSize_(width, height, devicePixelRatio, onlyForTarget) {
- var _this3 = this;
- //console.log('setSize', width)
- if (!onlyForTarget) {
- //onlyForTarget表示不更改当前renderer,只是为了rendertarget才要改变viewport
- this.renderer.setPixelRatio(devicePixelRatio);
- this.renderer.setSize(width, height); // resize之后会自动clear(似乎因为setScissor ),所以一定要立刻绘制,所以setSize要在cameraChanged、update之前
- } //this.composer && this.composer.setSize(width, height);
- if (this.viewports) {
- this.viewports.forEach(function (view, i) {
- //if(!view.active)return
- var width_ = width * view.width;
- var height_ = height * view.height;
- view.setResolution(Math.ceil(width_), Math.ceil(height_), width, height);
- if (height_ == 0) return; //avoid NAN
- var aspect = width_ / height_; //camera的参数精确些,不用视口的归整的resolution像素值,否则hasChange无法为true, 导致canvasResize了但map没update从而闪烁
- view.camera.aspect = aspect;
- if (view.camera.type == 'OrthographicCamera') ;
- view.camera.updateProjectionMatrix();
- });
- }
- if (!onlyForTarget) {
- //因为onlyForTarget不传递devicePixelRatio所以不发送了
- this.dispatchEvent('viewerResize');
- this.viewports.forEach(function (e) {
- _this3.ifEmitResize({
- viewport: e,
- deviceRatio: devicePixelRatio
- });
- });
- }
- }
- }, {
- key: "ifEmitResize",
- value: function ifEmitResize(e) {
- //切换viewport渲染时, 若这些viewport大小不同就发送一次, 通知一些材质更新resolution。
- //console.log('ifEmitResize',e.viewport.name,e.viewport.resolution2 )
- if (!e.viewport.resolution.equals(this.oldResolution) || !e.viewport.resolution2.equals(this.oldResolution2)) {
- this.dispatchEvent(Object.assign(e, {
- type: 'resize'
- }));
- this.oldResolution.copy(e.viewport.resolution);
- this.oldResolution2.copy(e.viewport.resolution2);
- }
- }
- }, {
- key: "cameraChanged",
- value: function cameraChanged() {
- //判断相机是否改变
- var changed = false;
- /* if(this.needRender){
- this.needRender = false
- return true
- } */
- for (var i = 0, j = this.viewports.length; i < j; i++) {
- var viewport = this.viewports[i];
- var changeInfo = viewport.cameraChanged();
- if (changeInfo.changed) {
- changed = true; //if(!this.changeTime ||this.changeTime<100){
- this.dispatchEvent({
- type: 'camera_changed',
- camera: viewport.camera,
- viewport,
- changeInfo
- }); //this.changeTime = (this.changeTime || 0) +1
- //}
- viewport.needRender = true; //直接写这咯
- if (changeInfo.resolutionChanged) {
- this.ifEmitResize({
- viewport
- }); //for map
- }
- }
- }
- return changed;
- }
- }, {
- key: "makeScreenshot",
- value: function makeScreenshot(size, viewports, compressRatio) {
- //暂时不要指定viewports渲染,但也可以
- var width = size.width,
- height = size.height;
- /* let oldBudget = Potree.pointBudget;
- Potree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget);
- let result = Potree.updatePointClouds(this.scene.pointclouds, camera, size );
- Potree.pointBudget = oldBudget;
-
-
- this.dispatchEvent({ //resize everything such as lines targets
- type: 'resize',
- resolution: new THREE.Vector2(width,height),
- });*/
- var target = new THREE.WebGLRenderTarget(width, height, {
- format: THREE.RGBAFormat
- });
- this.setSize_(width, height, 1, true);
- this.render({
- target,
- //camera ,
- viewports: viewports || this.viewports,
- screenshot: true,
- width,
- height,
- resize: true //需要resize
- });
- var dataUrl = Potree.Utils.renderTargetToDataUrl(target, width, height, this.renderer, compressRatio);
- /* let pixelCount = width * height;
- let buffer = new Uint8Array(4 * pixelCount);
- this.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer);
- let dataUrl = Potree.Utils.pixelsArrayToDataUrl(buffer, width, height, compressRatio) */
- target.dispose(); //resize back
- //this.updateScreenSize({forceUpdateSize:true})
- return {
- width,
- height,
- dataUrl
- };
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var scene = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.scene;
- scene.clear();
- this.renderer.dispose();
- this.renderer.forceContextLoss();
- var gl = this.renderer.getContext();
- gl.getExtension('WEBGL_lose_context') && gl.getExtension('WEBGL_lose_context').loseContext();
- this.domElement.removeChild(this.renderer.domElement);
- this.dispatchEvent('dispose');
- }
- }, {
- key: "emit",
- value: function emit() {}
- }]);
- return ViewerBase;
- }(THREE.EventDispatcher);
- 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); }; }
- 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; } }
- var texLoader$1 = new THREE.TextureLoader();
- texLoader$1.crossOrigin = 'anonymous';
- var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(-90));
- var createErrorMaterial = function createErrorMaterial() {
- var t = new THREE.MeshBasicMaterial({
- transparent: !0,
- depthWrite: !1,
- depthTest: !0,
- opacity: 1,
- side: THREE.DoubleSide
- });
- return t.color = new THREE.Color(3355443), t;
- };
- var tempVector = new THREE.Vector3(),
- //sharedata
- errorMaterial = createErrorMaterial(),
- uv00 = new THREE.Vector2(0, 0),
- uv01 = new THREE.Vector2(0, 1),
- uv10 = new THREE.Vector2(1, 0),
- uv11 = new THREE.Vector2(1, 1),
- face1UV = [uv00, uv10, uv11],
- face2UV = [uv11, uv01, uv00],
- face1,
- face2;
- function initGlobal() {
- face1 = new THREE.Shim.Face3(0, 1, 2), face2 = new THREE.Shim.Face3(2, 3, 0);
- }
- var HALF_WORLD_SIZE = 21e6; //略大于半个周长(mapSizeM/2)
- var getSid = function () {
- var sid = 0;
- return function () {
- return sid++;
- };
- }(); //高德坐标拾取工具 : https://lbs.amap.com/tools/picker
- var MapLayer = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(MapLayer, _THREE$EventDispatche);
- var _super = _createSuper$1e(MapLayer);
- // 包括了 MapLayerBase SceneLayer
- function MapLayer(viewer_, viewport) {
- var _this;
- _classCallCheck(this, MapLayer);
- _this = _super.call(this);
- initGlobal();
- _this.sceneGroup = new THREE.Object3D();
- _this.sceneGroup.name = 'MapLayer';
- _this.waitQueue = []; //等待加载的
- _this.loadingInProgress = 0;
- _this.maps = [];
- _this.frustum = new THREE.Frustum();
- _this.frustumMatrix = new THREE.Matrix4();
- _this.tileColor = new THREE.Color(16777215);
- _this.viewport = viewport;
- _this.changeViewer(viewer_);
- _this.sceneGroup.addEventListener('isVisible', function () {
- _this.viewer.mapChanged = true;
- });
- return _this;
- }
- _createClass(MapLayer, [{
- key: "addStreetMap",
- value: function addStreetMap() {
- //添加地图
- var map = new TiledMapOpenStreetMap(this, this.tileColor);
- this.addMap(map);
- }
- }, {
- key: "addMapEntity",
- value: function addMapEntity(data, orientationUser) {
- if (!data) {
- return;
- }
- var floorplan = new TiledMapFromEntity(this, this.tileColor, data);
- orientationUser && (floorplan.orientationUser = orientationUser);
- if (floorplan) {
- this.addMap(floorplan);
- floorplan.updateProjection();
- floorplan.updateObjectGroup();
- var visible = true;
- if (visible) {
- this.needUpdate = true;
- } else {
- floorplan.setEnable(false);
- }
- this.dispatchEvent({
- type: 'floorplanLoaded',
- floorplan
- });
- }
- return floorplan;
- }
- }, {
- key: "getFloorplan",
- value: function getFloorplan(datasetId) {
- return this.maps.find(function (e) {
- return e.name == 'floorplan' + '_' + datasetId;
- });
- }
- }, {
- key: "addMap",
- value: function addMap(t) {
- this.maps.push(t); //this.view.invalidateScene()
- this.needUpdate = true;
- this.viewer.mapChanged = true;
- }
- }, {
- key: "removeMap",
- value: function removeMap(t) {
- var e = this.maps.indexOf(t);
- if (e >= 0) {
- t.removeFromSceneGroup(this.sceneGroup);
- this.maps.splice(e, 1);
- }
- /* this.view.invalidateScene() */
- this.needUpdate = true;
- this.viewer.mapChanged = true;
- }
- }, {
- key: "changeViewer",
- value: function changeViewer(viewer_) {
- //add
- this.viewer = viewer_;
- }
- }, {
- key: "initProjection",
- value: function initProjection() {
- this.maps.forEach(function (map) {
- map.updateProjection();
- map.updateObjectGroup();
- });
- }
- }, {
- key: "visibilityChanged",
- value: function visibilityChanged() {
- if (!this.visible) for (var t = 0, e = this.maps; t < e.length; t++) {
- e[t].removeFromSceneGroup(this.sceneGroup);
- }
- }
- }, {
- key: "update",
- value: function update() {
- this.needUpdate = false;
- if (this.disabled || !this.maps.find(function (e) {
- return !e.disabled;
- }) || !this.maps.find(function (e) {
- return e.objectGroup.visible;
- })) return; //add
- this.viewer.mapChanged = true;
- var e, n, i, r;
- this.updateTimer = void 0, e = this.viewport.camera;
- n = e.projectionMatrix.clone();
- var expandRatio = 1.3;
- n.elements[0] /= expandRatio;
- n.elements[5] /= expandRatio; // 为了缓存吗,使边界处也提前加载,扩大显示区域
- 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-----------')
- for (r = 0; r < this.maps.length; r++) {
- var map = this.maps[r];
- i = map.update(this.frustum, this.sceneGroup) && i;
- }
- return [2, i];
- }
- }, {
- key: "updateProjection",
- value: function updateProjection() {
- for (var t = 0, e = this.maps; t < e.length; t++) {
- var n = e[t];
- n.clearProjection(), n.updateObjectGroup();
- }
- }
- }]);
- return MapLayer;
- }(THREE.EventDispatcher);
- var TiledMapBase = /*#__PURE__*/function (_THREE$EventDispatche2) {
- _inherits(TiledMapBase, _THREE$EventDispatche2);
- var _super2 = _createSuper$1e(TiledMapBase);
- function TiledMapBase(name, mapLayer, tileColor, projection) {
- var _this2;
- _classCallCheck(this, TiledMapBase);
- _this2 = _super2.call(this);
- _this2.name = name;
- _this2.mapLayer = mapLayer, _this2.tileColor = tileColor, _this2.bias = 0;
- _this2.zIndex = -1;
- _this2.objectGroup = new THREE.Object3D();
- _this2.objectGroup.name = name;
- _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();
- _this2.projection = projection;
- _this2._zoomLevel = 0; //1-20
- _this2.objectGroup.addEventListener('isVisible', function () {
- _this2.mapLayer.viewer.mapChanged = true;
- });
- _this2.computeCount = 0;
- _this2.maxLoading = 3;
- _this2.loadFailCount = 0;
- _this2.loadingInProgress = 0;
- return _this2;
- }
- _createClass(TiledMapBase, [{
- key: "zoomLevel",
- get: function get() {
- return this._zoomLevel;
- },
- set: function set(zoomLevel) {
- if (this._zoomLevel != zoomLevel) {
- this._zoomLevel = zoomLevel;
- this.dispatchEvent({
- type: 'zoomLevelChange',
- zoomLevel
- }); //if(this.name == 'map')console.log(zoomLevel,viewer.mapViewer.camera.zoom)
- }
- }
- }, {
- key: "updateObjectGroup",
- value: function updateObjectGroup() {
- this.position && this.objectGroup.position.copy(this.position).setZ(0), this.quaternion && this.objectGroup.quaternion.copy(this.quaternion), this.objectGroup.updateMatrixWorld(!0);
- }
- }, {
- key: "updateProjection",
- value: function updateProjection() {
- if (!this.transformMapToLocal) {
- this.transformMapToLocal = proj4(this.projection, 'LOCAL_MAP');
- }
- }
- }, {
- key: "clearProjection",
- value: function clearProjection() {
- this.transformMapToLocal = void 0;
- this.projection !== 'LOCAL_MAP' && this.baseTile.remove();
- }
- }, {
- key: "setEnable",
- value: function setEnable(enable) {
- //add
- if (!this.disabled == enable) return;
- this.disabled = !enable;
- common$1.updateVisible(this.objectGroup, 'setEnable', enable);
- if (!enable) {
- this.baseTile.remove();
- } else {
- this.mapLayer.needUpdate = true;
- }
- }
- }, {
- key: "update",
- value: function update(frustum, sceneGroup) {
- this.computeCount = 0;
- var unavailable = this.disabled || !this.objectGroup.visible; //地图即使不显示也要获得zoomlevel
- if (this.name != 'map' && unavailable) return;
- this.updateProjection();
- if (!this.transformMapToLocal) return;
- if (!this.isTileVisible(new THREE.Vector3(0, 0, 0), this.mapSizeM, frustum)) return this.removeFromSceneGroup(sceneGroup), !0;
- var viewport = this.mapLayer.viewport;
- var i = new THREE.Vector3(-0.5 * this.mapSizeM, 0, 0);
- i.applyMatrix4(this.objectGroup.matrixWorld), i.project(viewport.camera);
- var o = new THREE.Vector3(0.5 * this.mapSizeM, 0, 0);
- o.applyMatrix4(this.objectGroup.matrixWorld), o.project(viewport.camera);
- var rx = viewport.resolution.x,
- ry = viewport.resolution.y;
- if (rx <= 0 || ry <= 0 || isNaN(i.x) || isNaN(i.y) || isNaN(o.z)) return !1;
- i.sub(o), i.x *= rx / 2, i.y *= ry / 2;
- var scale = 1;
- /* if(this.name == 'map'){
- //add 高纬度的因倾斜而造成tile较小,所以放大些,否则会造成显示的tile过多而卡
- let lonlat = viewer.transform.lonlatToLocal.inverse(viewport.camera.position.clone())
- let cos = Math.cos(THREE.Math.degToRad(lonlat.y)); //越小就在纬度上越高,tile表现越小
- //为什么lonlat.y会超出90?
-
-
- cos = THREE.Math.clamp(cos, 0,1)
- let lonShift = Math.abs(viewer.mapViewer.camera.position.x / this.mapSizeM * 16 ) //越大就在经度离中心越远,tile表现越大 。
- lonShift = THREE.Math.clamp(lonShift, 0, Math.PI)
- lonShift = (1 - Math.sin( 1/2 * lonShift + Math.PI/2 )) * Math.PI // 0-Math.PI sin增速向上
-
- scale = 0.5 * cos * (1+lonShift) + 0.5 * Math.pow(cos, lonShift)
- }else{
- scale = 1
- } */
- var c = this.tileSizePx / i.length() / scale,
- //多除以一个scale缩放因子,scale越大level越小
- level = Math.ceil(-math$2.getBaseLog(2, c) - this.bias);
- if (this.style == 'dark-standard') {
- //该模式贴图比较小放大点
- level -= 1;
- }
- level = Math.max(level, 0);
- level = Math.min(level, void 0 === this.maxDepth ? 1 / 0 : this.maxDepth);
- this.zoomLevel = level; //add
- /* if(isNaN(this.zoomLevel )){
- console.log(level, cos , scale , lonlat )
- } */
- if (!unavailable) {
- this.addToSceneGroup(sceneGroup);
- return this.baseTile.update(this, frustum, level, this.mapSizeM, 0, 0, '');
- }
- }
- }, {
- key: "isTileVisible",
- value: function isTileVisible(tileCenter, tileSize, frustum, viewport, name) {
- if (tileSize > HALF_WORLD_SIZE) return !0; //root must visible
- var halfSize = 0.5 * tileSize; //在地图上的size和local的差不多是吗
- var vertices = []; //简单版:
- this.transformMapToLocal.forward(tileCenter); //e转化为local
- this.isTileVisibleBox.makeEmpty();
- this.isTileVisibleVec.set(tileCenter.x - halfSize, tileCenter.y - halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
- vertices.push(this.isTileVisibleVec.clone());
- this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
- this.isTileVisibleVec.set(tileCenter.x - halfSize, tileCenter.y + halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
- vertices.push(this.isTileVisibleVec.clone());
- this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
- this.isTileVisibleVec.set(tileCenter.x + halfSize, tileCenter.y - halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
- vertices.push(this.isTileVisibleVec.clone());
- this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
- this.isTileVisibleVec.set(tileCenter.x + halfSize, tileCenter.y + halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
- vertices.push(this.isTileVisibleVec.clone());
- this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
- /* this.isTileVisibleBox.min = math.convertVisionVector(this.isTileVisibleBox.min)
- this.isTileVisibleBox.max = math.convertVisionVector(this.isTileVisibleBox.max) */
- var visi = frustum.intersectsBox(this.isTileVisibleBox); //console.log(this.isTileVisibleBox.min.toArray(), this.isTileVisibleBox.max.toArray(),this.objectGroup.matrixWorld.elements, visi )
- return visi;
- }
- }, {
- key: "addToSceneGroup",
- value: function addToSceneGroup(t) {
- this.objectGroupAdded || (t.add(this.objectGroup), this.objectGroupAdded = !0, this.objectGroup.updateMatrixWorld(!0)); //add
- }
- }, {
- key: "removeFromSceneGroup",
- value: function removeFromSceneGroup(t) {
- this.baseTile.remove(), this.objectGroupAdded && (t.remove(this.objectGroup), this.objectGroupAdded = !1);
- }
- }]);
- return TiledMapBase;
- }(THREE.EventDispatcher);
- var loadDone = function loadDone(tile, success) {
- tile.map.mapLayer.loadingInProgress--;
- tile.map.loadingInProgress--; //console.log('loaddone', tile.name, 'loadingInProgress',tile.map.mapLayer.loadingInProgress, Date.now())
- tile.loading = false;
- var next = tile.map.mapLayer.waitQueue[0];
- if (next) {
- addLoadTile(next);
- } else {
- if (tile.map.mapLayer.loadingInProgress == 0) {
- //注意这时候不一定就加载完了,300ms后可能还会有新的tile加载
- //console.log('loadDone All ?', Date.now())
- tile.map.mapLayer.dispatchEvent('loadDone');
- }
- }
- tile.mesh && (tile.mesh.material.needsUpdate = true);
- };
- function addLoadTile(tile) {
- /* if(tile.texURL && tile.texURL.includes('testdata') ){
- console.error('addLoadTile', tile.texURL.split('map_tiles/')[1] )
- } */
- if (tile.map.loadingInProgress < tile.map.maxLoading) {
- if (!tile.mesh) return; //有时候会遇到这种情况, 为什么没有被cancelLoad呢?
- tile.map.mapLayer.loadingInProgress++;
- tile.map.loadingInProgress++;
- tile.map.mapLayer.dispatchEvent('startLoad'); //console.log('addLoad', 'loadingInProgress',tile.map.mapLayer.loadingInProgress, Date.now())
- //tile.texURL && tile.texURL.includes('testdata') && console.log('startloadTile ', tile.texURL.split('map_tiles/')[1] )
- tile.loading = true;
- var index = tile.map.mapLayer.waitQueue.indexOf(tile);
- index > -1 && tile.map.mapLayer.waitQueue.splice(index, 1);
- var tex = tile.mesh.material.map = texLoader$1.load(tile.texURL, function (tex) {
- //如果一直加载不了会影响其他的加载,如google地图没有vpn会使全景图一直加载不了
- if (tile.mesh) {
- //如果还要显示的话
- tile.textureLoaded = true;
- tile.mesh.material.opacity = 1;
- tile.map.mapLayer.viewer.mapChanged = true;
- tile.map.mapLayer.needUpdate = true; //表示还要继续update(以removeChildren)
- if (tile.map instanceof TiledMapOpenStreetMap) {
- tile.map.maxLoading = browser$1.isMobile() ? 5 : 10;
- }
- } else {
- //tile.texURL && tile.texURL.includes('testdata') && console.log('loadDone and dispose', tile.texURL.split('map_tiles/')[1] )
- tex.dispose();
- }
- loadDone(tile);
- }, void 0, function () {
- //error
- tile.textureLoaded = !0;
- if (tile.mesh) {
- tile.mesh.material.dispose();
- tile.mesh.material = errorMaterial;
- tile.map.mapLayer.viewer.mapChanged = true;
- }
- loadDone(tile);
- tile.map.loadFailCount++;
- if (tile.map instanceof TiledMapOpenStreetMap && config$6.mapCompany == 'google' && tile.map.loadFailCount > 3) {
- //极有可能没有vpn为了防止影响到其他资源加载,减少加载的个数
- tile.map.maxLoading = 2;
- }
- });
- tex.anisotropy = 0;
- tex.generateMipmaps = !1;
- tex.minFilter = THREE.LinearFilter;
- tex.magFilter = THREE.LinearFilter;
- } else {
- tile.map.mapLayer.waitQueue.includes(tile) || tile.map.mapLayer.waitQueue.push(tile);
- }
- }
- function cancelLoad(tile, log) {
- //如果等待加载,但还没开始加载,取消加载
- if (!tile.loading) {
- var index = tile.map.mapLayer.waitQueue.indexOf(tile);
- 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 */ )
- }
- }
- var MapTile = /*#__PURE__*/function () {
- function MapTile(map, e, n, parent, name) {
- _classCallCheck(this, MapTile);
- this.map = map;
- this.name = name;
- this.parent = parent;
- this.objectGroup = e, this.tileColor = n, this.meshAdded = !1, this.textureLoaded = !1, this.children = [];
- this.id = getSid();
- }
- _createClass(MapTile, [{
- key: "update",
- value: function update(entity, frustum, level, tileSize, centerX, centerY, treeStr, viewport) {
- var canTraverse = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
- if (!this.doesNotContainTilesToBeDisplayed(entity)) {
- var canTraverse_ = this.map.mapLayer.is3d ? canTraverse : level > 0;
- return canTraverse_ ? this.updateSubTiles(entity, frustum, level, tileSize, centerX, centerY, treeStr, viewport) : this.updateTileLeaf(entity, tileSize, centerX, centerY);
- }
- }
- }, {
- key: "doesNotContainTilesToBeDisplayed",
- value: function doesNotContainTilesToBeDisplayed(entity) {
- return entity.tilePresenceMap && entity.tilePresenceMap.empty;
- }
- }, {
- key: "updateTileLeaf",
- value: function updateTileLeaf(entity, tileSize, centerX, centerY) {
- //真正显示mesh的是这一层,最高level
- //if(this.map.name.includes('floorplan'))console.log('updateTileLeaf',this.name)
- if (!this.mesh) {
- this.createTileObject(entity, tileSize, centerX, centerY);
- }
- if (!this.meshAdded) {
- this.objectGroup.add(this.mesh);
- this.meshAdded = !0;
- }
- if (this.textureLoaded) {
- //贴图加载完就不需要子集了
- this.removeChildren();
- } else {
- this.cancelChildren(); //add 停止加载子集
- }
- return this.textureLoaded;
- }
- }, {
- key: "updateSubTiles",
- value: function updateSubTiles(entity, frustum, level, tileSize, centerX, centerY, treeStr) {
- //console.log('updateSubTiles',this.name) //名字越长代表level越高
- var shiftX = [-0.25 * tileSize, 0.25 * tileSize, -0.25 * tileSize, 0.25 * tileSize],
- shiftY = [0.25 * tileSize, 0.25 * tileSize, -0.25 * tileSize, -0.25 * tileSize];
- for (var childrenLoaded = !0, p = 0; p < 4; ++p) {
- var childTreeStr = treeStr + p.toString(10); //一级(512):0 1 2 3分别为左上、右上、左下、右下。二级(1024)就是把一级的每一块分裂,如00 01 02 03分别是0的左上、右上、左下、右下……
- if (!entity.tilePresenceMap || entity.tilePresenceMap[childTreeStr]) {
- //去掉判断,直接显示
- var childCenterX = centerX + shiftX[p],
- childCenterY = centerY + shiftY[p];
- tempVector.set(childCenterX, childCenterY, 0);
- this.map.computeCount++; //console.log(this.map.computeCount, this.name, 'level:',level)
- if (entity.isTileVisible(tempVector, 0.5 * tileSize, frustum)) {
- 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
- var childLoaded = this.children[p].update(entity, frustum, level - 1, 0.5 * tileSize, childCenterX, childCenterY, childTreeStr);
- childrenLoaded = childrenLoaded && childLoaded;
- } else {
- if (this.children[p]) {
- this.children[p].remove();
- delete this.children[p];
- }
- }
- }
- }
- return childrenLoaded && this.removeObject3D(), childrenLoaded; //子项加载完,母项mesh可以去除。(最后母项的母项以及前面的都会被删除,只留最后的叶子结点)
- }
- /*
-
- 一层层往后加载。加入第一次加载到第4层(因为level精细度是第4层),给第4层可见tile加上mesh。
- 然后下一次加载到第5层,那么第4层的mesh就要被清空(当它所属的第5层子集都加载完后)
-
-
-
- */
- }, {
- key: "createTileObject",
- value: function createTileObject(entity, tileSize, centerXatMap, centerYatMap) {
- this.mesh = this.createMesh(entity.transformMapToLocal, tileSize, centerXatMap, centerYatMap);
- this.mesh.name = this.name; //add
- this.textureLoaded = !1;
- var c = entity.mapSizeM / tileSize,
- z = math$2.getBaseLog(2, c),
- //以2为底c的对数
- x = centerXatMap / tileSize + 0.5 * (c - 1),
- y = -centerYatMap / tileSize + 0.5 * (c - 1),
- p = entity.getTileUrl(Math.round(x), Math.round(y), Math.round(z)); //common.setObjectLayers(this.mesh, 'map' )
- this.mesh.renderOrder = -(1e6 - z - 100 * (entity.zIndex || 0));
- this.texURL = p;
- /* let area = math.getArea(this.mesh.geometry.vertices.slice(0,3));
- if(area >0){
- this.mesh.visible = false
- console.log('area>0',this.mesh.name)
- } */
- addLoadTile(this);
- }
- }, {
- key: "createMesh",
- value: function createMesh(transform, tileSize, centerXatMap, centerYatMap) {
- var a = new THREE.Shim.Geometry();
- 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]];
- vertices.forEach(function (vertice) {
- a.vertices.push(new THREE.Vector3().fromArray([].concat(_toConsumableArray(transform.forward(vertice)), [0])));
- });
- a.faces.push(face1), a.faces.push(face2), a.faceVertexUvs[0].push(face1UV), a.faceVertexUvs[0].push(face2UV);
- var b = new THREE.BufferGeometry().fromGeometry(a);
- return new THREE.Mesh(b, this.createMaterial());
- }
- }, {
- key: "createMaterial",
- value: function createMaterial() {
- var t = new THREE.MeshBasicMaterial({
- transparent: !0,
- depthWrite: !1,
- depthTest: !0,
- opacity: 0,
- side: THREE.DoubleSide
- });
- if (window.ifTest) {
- var colorHue = Math.random();
- t.color = new THREE.Color().setHSL(colorHue, 0.6, 0.92);
- } else {
- t.color = this.tileColor ? this.tileColor : new THREE.Color(16777215);
- }
- return t;
- }
- }, {
- key: "traverse",
- value: function traverse(f) {
- //add
- return THREE.Mesh.prototype.traverse.call(this, f);
- }
- }, {
- key: "remove",
- value: function remove() {
- this.removeObject3D(), this.removeChildren();
- }
- }, {
- key: "removeObject3D",
- value: function removeObject3D() {
- !!this.mesh;
- if (this.mesh) {
- this.objectGroup.remove(this.mesh);
- if (this.textureLoaded) {
- var t = this.mesh.material.map;
- t && t.dispose();
- } else {
- cancelLoad(this);
- }
- this.mesh.material.dispose(); //o.disposeMeshMaterial(this.mesh),
- this.mesh.geometry.dispose();
- this.mesh = void 0;
- }
- 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] )
- }
- }, {
- key: "removeChildren",
- value: function removeChildren() {
- for (var t = 0, e = this.children; t < e.length; t++) {
- var n = e[t];
- n && (n.removeObject3D(), n.removeChildren());
- }
- this.children.length = 0;
- }
- }, {
- key: "cancelChildren",
- value: function cancelChildren() {
- //子集全部停止加载
- for (var t = 0, e = this.children; t < e.length; t++) {
- var n = e[t];
- n && (cancelLoad(n), n.cancelChildren());
- }
- }
- }]);
- return MapTile;
- }();
- var TiledMapOpenStreetMap = /*#__PURE__*/function (_TiledMapBase) {
- _inherits(TiledMapOpenStreetMap, _TiledMapBase);
- var _super3 = _createSuper$1e(TiledMapOpenStreetMap);
- function TiledMapOpenStreetMap(mapLayer, tileColor) {
- var _this3;
- _classCallCheck(this, TiledMapOpenStreetMap);
- //Potree.settings.mapCompany = 'google'
- _this3 = _super3.call(this, 'map', mapLayer, tileColor
- /* , projection */
- ); //EPSG projection
- //this.baseUrl = "https://wprd03.is.autonavi.com/appmaptile?style=7&x=${x}&y=${y}&z=${z}",
- //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
- _this3.switchStyle();
- _this3.tileSizePx = 256;
- _this3.mapSizeM = 40075017; //总占据多少米(地球赤道周长) 和三维空间的不一样 - -, 空间上的是直径,地图上的是半个圆周
- _this3.bias = 0.5;
- if (config$6.mapCompany == 'google') {
- _this3.attribution = '© PopSmart, © 谷歌地图';
- _this3.projection = 'EPSG:900913'; //"EPSG:4326"//4550
- } else {
- _this3.attribution = '© PopSmart, © 高德地图';
- _this3.projection = 'EPSG:3857';
- }
- return _this3;
- }
- _createClass(TiledMapOpenStreetMap, [{
- key: "getTileUrl",
- value: function getTileUrl(x, y, z) {
- return this.baseUrl.replace(/\${x}/, x.toString(10)).replace(/\${y}/, y.toString(10)).replace(/\${z}/, z.toString(10));
- }
- }, {
- key: "switchStyle",
- value: function switchStyle() {
- var style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'standard';
- //if(Potree.settings.mapCompany == 'google')return
- if (style == this.style) return;
- if (config$6.mapCompany == 'google') {
- var _ref = {
- zh: ['zh-CN', 'cn'],
- en: ['en-US'],
- //范围大所以不指定地理位置 。
- ja: ['ja-JP', 'JP'],
- kr: ['ko-KR', 'KR']
- }[Potree.settings.language] || [],
- _ref2 = _slicedToArray(_ref, 2),
- lang = _ref2[0],
- glPos = _ref2[1];
- 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';
- this.maxDepth = 22;
- /* 1)lyrs= 表示的是图层类型,即瓦片类型,具体含义如下:
- m:路线图
- t:地形图
- p:带标签的地形图
- s:卫星图
- y:带标签的卫星图
- h:标签层(路名、地名等)
- 2)& gl=CN 指定地理区域
- 谷歌地图针对中国有两套坐标,一套做了偏移,一套没有。经测试在url加入gl=cn地图会有偏移。
- Tips:如果谷歌地图和RTK测量的WGS84坐标有偏差,可以尝试在url里去掉& gl=cn。(摘自网上)
-
- 通义千问:如果不指定gl参数,Google将使用默认值或基于其他因素(如IP地址)来推断用户的地理区域。这通常不会导致地图数据的不准确性,但可能会影响本地化信息的显示。地图上的标签(如街道名称、城市名称等)可能不会以最合适的语言显示。地址格式和拼写可能不符合当地标准
-
- 5)&hl=
- 设置地图注记文字语言类型,缺省默认为中文。
- hl=nl 中英双语
- hl=zh-CN 中文
- */
- } else {
- //baseUrl = "https://webst01.is.autonavi.com/appmaptile?lang=zh_cn&style=6&yrs=m&x=${x}&y=${y}&z=${z}" //卫星 maxDepth = 18
- //搜索高德地图瓦片url
- if (config$6.isJiangMen) {
- if (style == 'satellite') {
- //卫星
- this.maxDepth = 18;
- this.baseUrl = 'http://a.map.jms.gd/tile/weixing/${z}/${x}/${y}.png';
- } else {
- this.maxDepth = 18;
- this.baseUrl = 'http://a.map.jms.gd/tile/gd_xiangtu/${z}/${x}/${y}.png';
- }
- } else {
- if (style == 'satellite') {
- //卫星
- this.maxDepth = 18;
- this.baseUrl = 'https://webst01.is.autonavi.com/appmaptile?lang=zh_cn&style=6&yrs=m&x=${x}&y=${y}&z=${z}';
- } else if (style == 'dark-standard') {
- this.maxDepth = 18;
- this.baseUrl = 'https://wprd01.is.autonavi.com/appmaptile?lang=zh_cn&style=8&yrs=m&x=${x}&y=${y}&z=${z}'; //路网 加上scl=2后去掉名字
- } else {
- this.maxDepth = 19;
- this.baseUrl = 'https://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&style=7&yrs=m&x=${x}&y=${y}&z=${z}'; //
- }
- } //详解 https://www.cnblogs.com/lucio110/p/17310054.html
- }
- this.style = style;
- this.setEnable(false);
- this.setEnable(true);
- this.mapLayer.viewer.dispatchEvent('content_changed');
- }
- }]);
- return TiledMapOpenStreetMap;
- }(TiledMapBase);
- var TiledMapFromEntity = /*#__PURE__*/function (_TiledMapBase2) {
- _inherits(TiledMapFromEntity, _TiledMapBase2);
- var _super4 = _createSuper$1e(TiledMapFromEntity);
- function TiledMapFromEntity(mapLayer, tileColor, data) {
- var _this4;
- _classCallCheck(this, TiledMapFromEntity);
- _this4 = _super4.call(this, 'floorplan', mapLayer, tileColor, 'LOCAL'
- /* "EPSG:3857" */
- /* "WGS84" */
- ); //直接就是本地坐标,没有projec
- var entity = _this4.tiledMapEntity = _this4.fillFromData(data);
- var time = entity.updateTime || entity.createTime;
- _this4.tileSizePx = entity.tileSizePx, _this4.mapSizeM = entity.mapSizeM, _this4.maxDepth = entity.maxDepth;
- _this4.postStamp = time ? time.replace(/[^0-9]/gi, '') : new Date().getTime() //this.projection = n.crsLocal,
- ;
- _this4.zIndex = 0, _this4.tilePresenceMap = _this4.decodeBitStream(_this4.tiledMapEntity.quadtree); //包含tile分裂信息,如果写错了会造成tile显示不全
- _this4.maxLoading = 5;
- _this4.bias = 0.5; //越大加载层级越低,越模糊
- if (window.devicePixelRatio >= 2 && window.innerHeight * window.innerWidth < 768 * 1024) {
- //手机还是加载高清点(反正也不需要截图等待),但平板太大了,要铺满屏幕可能慢,所以稍微模糊点?(反正可以继续放大去看)
- _this4.bias = 0; //level更高些
- }
- return _this4;
- }
- _createClass(TiledMapFromEntity, [{
- key: "fillFromData",
- value: function fillFromData(e) {
- var data = {};
- data.id = e.id;
- data.globalLocation = new THREE.Vector3().fromArray(e.location); //测试场景 SG-hx-HBfpp585IXE通过,无rtk orient 0.02
- var ori = e.orientation;
- data.orientation = new THREE.Quaternion().fromArray([ori[1], ori[2], ori[3], ori[0]]).multiply(rot90); //数据集校准后这个好像不会变的
- //指南针也有个旋转orientation,那个万一在数据集校准那改了就是四元数,还得改下?
- data.filePath = config$6.resourceLaser + e.file_path; //`https://laser-oss.4dkankan.com${e.file_path}`
- data.fileName = '$DEPTH/$X/$Y.png';
- 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()
- return data;
- }
- }, {
- key: "computeLocalCoordinates",
- value: function computeLocalCoordinates() {
- if (proj4.defs('LOCAL_MAP')) {
- var lonlat = this.tiledMapEntity.globalLocation;
- lonlat = this.mapLayer.transform.lonlatToLocal.forward(lonlat);
- this.tiledMapEntity.location = new THREE.Vector3().copy(lonlat);
- }
- }
- }, {
- key: "updateProjection",
- value: function updateProjection() {
- _get(_getPrototypeOf(TiledMapFromEntity.prototype), "updateProjection", this).call(this);
- if (!this.position) {
- this.computeLocalCoordinates();
- }
- }
- }, {
- key: "position",
- get: function get() {
- return this.tiledMapEntity.location;
- }
- }, {
- key: "quaternion",
- get: function get() {
- if (!this.orientationUser || typeof this.orientationUser == 'number') return this.tiledMapEntity.orientation;else return this.orientationUser.clone();
- }
- }, {
- key: "getTileUrl",
- value: function getTileUrl(x, y, z) {
- 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));
- return i += '?t=' + this.postStamp;
- }
- }, {
- key: "decodeBitStream",
- value: function decodeBitStream(t) {
- if (!t) return {
- empty: !0
- };
- for (var e = {}, n = [e], i = 0; i < t.length; i++) {
- var r = n.shift(),
- o = parseInt(t.substr(i, 1), 16);
- if (1 & o) {
- var a = {};
- r[0] = a, n.push(a);
- }
- 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));
- }
- var s = {
- empty: !0
- };
- return this.computeHashes(s, e, ''), s;
- }
- }, {
- key: "computeHashes",
- value: function computeHashes(t, e, n) {
- for (var i = 0; i < 4; i++) {
- e[i] && (t[n + i.toString(10)] = !0, t.empty = !1, this.computeHashes(t, e[i], n + i.toString(10)));
- }
- }
- }]);
- return TiledMapFromEntity;
- }(TiledMapBase);
- /*
- note:
-
-
-
- 目前缩小了能看出形态是一个地球。相机在高空朝下观测,地球平放着。
- 所以越靠近赤道和地球朝上的那面所在的中央经度(也就是local 0,0,0所对应的初始经度),tile越接近正方形。
-
- 所以在两极地区要怎么显示?
- 注册地理坐标时需要滚动地球吗?(修改初始经度、重定义NAVVIS:TMERC, 就需要更新所有三维世界中的物体位置)
-
-
- 切换中心点:
- var locationLonLat = viewer.transform.lonlatToLocal.inverse(viewer.mapViewer.camera.position.clone())
- proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat.x.toPrecision(15) + " +lat_0=" + locationLonLat.y.toPrecision(15));
- viewer.mapViewer.mapLayer.maps[0].transformMapToLocal = null
-
-
- 地理注册部分地图上的1和2标记有两层意思。当地图全屏展示时,标记的是当前右侧经纬度的位置;当地图为小窗时,标记的是对应场景里三维位置。(所以感觉最好换一个ui?)且在2023.2.1之前才改好,之前都是后者。
-
-
-
- 为什么边缘总是有奇怪的mesh,是因为有顶点到背面了吗
-
-
-
- https://lbs.amap.com/tools/picker 高德坐标拾取器(手机登录),但和这里展示的不一样, 要用AMapWith84.aMapToWgs84({x: ,y: })转成84。 (qq or 手机登录) 所以potree本地和有AMapWith84函数的laser地图展现不一样
- https://www.google.com/maps/@77.7730021,-34.4952712,4z google取点
-
-
-
-
- 打印所有mapTile的名字,字符串最长的代表有显示的mesh。
- viewer.mapViewer.mapLayer.maps[0].baseTile.traverse(function(e){console.log(e.name)})
-
-
- 能查看有几个显示的mesh
- viewer.mapViewer.mapLayer.maps[0].objectGroup.children
-
-
- 图片地址中 tiles/4/3/9.png 第一个数字越高代表level越高,放得越大 . (tile.name.length也能反映出
- viewer.mapViewer.mapLayer.maps[1].objectGroup.children.map(e=>e.name.length-1)
-
-
- 目前看的几个场景floorplan原图是1米=33.03个像素 图宽度= 512*2^(max_depth-1) , map_size_m 代表整个地图是多少米
- 由于floorplan宽度有限制,最大32768所以不一定是33.03px, scale = resolution.width/(bound.x_max-bound.x_min), 参数见算法那边的json
- 经纬度精度小数点后5位为米级别,6位为分米,7位是厘米
- */
- 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); }; }
- 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; } }
- var FloorplanCamera = /*#__PURE__*/function (_THREE$OrthographicCa) {
- _inherits(FloorplanCamera, _THREE$OrthographicCa);
- var _super = _createSuper$1d(FloorplanCamera);
- function FloorplanCamera(dom) {
- var _this;
- _classCallCheck(this, FloorplanCamera);
- _this = _super.call(this);
- var aspect = window.innerWidth / window.innerHeight;
- _this = _super.call(this, -constants$4.orthoBase, constants$4.orthoBase, constants$4.orthoBase / aspect, -constants$4.orthoBase / aspect, constants$4.orthoNear, constants$4.orthoFar);
- _this.controls = null;
- _this.updateAspect(aspect);
- return _this;
- } //xzw 修改
- _createClass(FloorplanCamera, [{
- key: "updateAspect",
- value: function updateAspect(aspect) {
- if (isNaN(aspect)) aspect = 1;
- this.aspect = aspect; // this.top = constants.orthoBase / aspect
- // this.bottom = -constants.orthoBase / aspect
- // this.updateProjectionMatrix()
- }
- }]);
- return FloorplanCamera;
- }(THREE.OrthographicCamera);
- var ControlActions = {
- NONE: -1,
- ROTATE: 0,
- DOLLY: 1,
- PAN: 2,
- ROTATE_DOLLY: 3,
- PAN_DOLLY: 4
- };
- 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); }; }
- 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; } }
- /** 注:
- * 1.球坐标:更方便计算球面位置 https://en.wikipedia.org/wiki/Spherical_coordinate_system
- * 2.轨道视角OrbitView: 常见的相机视图,相机绕一点(通常为3D模型中心)做球面运动,视点锁定球心 。参见THREE.OrbitControls https://threejs.org/examples/?q=controls#misc_controls_orbit
- * 3.刚体对象:刚体是图形应用物理引擎中重要的物理模型对象,只考虑平移,旋转的物理量。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
- */
- /**
- * 功能:漫游场景之外视角控制,主要是实现了常见的轨道视角(OrbitView),即拖拽旋转(Rotate),平移(Pan),放大缩小(Zoom),PanoramaControls和FloorplanControls的父类,两个子类的视角是基于轨道视角进行不同的限制实现的
- * 原理:实现轨道视角(通过球坐标计算相机位置,使相机绕一点做球面运动,相机视角保持锁定球心)
- * 注: Rotate 行为是改变相机位于球坐标的位置,引发的旋转,因为视角是锁定球心的
- * Zoom 行为是改变球半径,使相机距不同位置得到不同视图大小,达到缩放
- * Pan 行为是改变球心位置,使轨道偏移达到视图平移效果
- */
- var OutsideControls = /*#__PURE__*/function (_EventEmitter) {
- _inherits(OutsideControls, _EventEmitter);
- var _super = _createSuper$1c(OutsideControls);
- function OutsideControls(camera, dom, player) {
- var _this;
- _classCallCheck(this, OutsideControls);
- _this = _super.call(this);
- _this.setAutoPanPosition = function (e, t) {
- var i = new THREE.Vector3(),
- n = new THREE.Vector3();
- return function (e, t) {
- i.copy(this.camera.position), void 0 === e && null === e || i.setX(e), void 0 === t && null === t || i.setZ(t);
- var r = this.camera.position.distanceTo(this.target),
- settings = Vector3.FORWARD.clone().applyQuaternion(this.camera.quaternion);
- 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();
- };
- }();
- _this.camera = camera;
- _this.camera.controls = _assertThisInitialized(_this);
- _this.player = player;
- _this.enabled = !1;
- _this.target = new THREE.Vector3(); //相机视点,轨道视角下也始终是相机轨道所处球坐标的球心
- //Zoom
- _this.targetBounds = new THREE.Box3(); //包围盒,通过碰撞检测用于限定相机的远近范围
- _this.zoomSpeed =
- /* config.isEdit ? 2.3 : */
- 1; //视角缩放的速率
- _this.minDistance = 0; //最小距离,相机离球心的最小距离
- _this.maxDistance = 1 / 0; //最大距离,相机离球心的最大距离
- _this.scale = 1; //缩放比率,zoom操作下的相机轨道半径与正常轨道半径的比率
- _this.dollyStart = new THREE.Vector2(); //推拉镜头操作下记录前一帧的交互点
- _this.dollyEnd = new THREE.Vector2(); //推拉镜头操作下记录当前帧的交互点
- _this.dollyDelta = new THREE.Vector2(); //推拉镜头操作下相机当前帧的瞬时位移
- //Rotate
- _this.noRotateUpDown = !1; //禁用竖直方向的旋转,此处即为禁止相机纬度上的移动,用于俯视视角FloorplanControls
- _this.rotateSpeed = 1; //相机绕球心旋转速率
- _this.keyboardZoomSpeed = 0; //键盘控制下的视角缩放速率
- _this.keyPanSpeed = 7; //键盘控制下的平移速率
- _this.autoRotate = !1; //自动旋转
- _this.autoRotateSpeed = 2; //自动旋转速率
- _this.minPolarAngle = THREE.MathUtils.degToRad(25); //最小纬度,用于限时相机的视角
- _this.maxPolarAngle = THREE.MathUtils.degToRad(65); //最大纬度,用于限时相机的视角
- _this.rotationAcceleration = new THREE.Vector2(); //旋转角加速度
- _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
- _this.rotateStart = new THREE.Vector2(); //旋转操作下记录上次交互事件产生的交互点坐标
- _this.rotateEnd = new THREE.Vector2(); //旋转操作下记录本次交互事件产生的交互点坐标
- _this.rotateDelta = new THREE.Vector2(); //旋转操作下最近两次交互事件之间的瞬时角位移
- _this.phiDelta = 0; //每帧瞬时水平角位移,由rotateDelta.x累加得到
- _this.thetaDelta = 0; //每帧瞬时竖直角位移,由rotateDelta.y累加得到
- _this.rotateCenter = new THREE.Vector2();
- _this.rotateStartVec = new THREE.Vector2();
- _this.rotateEndVec = new THREE.Vector2(); //Pan
- _this.autoPan = !1; //自动平移
- _this.autoPanPosition = new THREE.Vector3(); //自动平移的球心位置
- _this.panAcceleration = new THREE.Vector2(); //平移加速度
- _this.panSpeed = new THREE.Vector2(); //平移速度
- _this.panStart = new THREE.Vector2(); //平移操作下上次交互事件产生的交互点坐标
- _this.panEnd = new THREE.Vector2(); //平移操作下本次交互事件产生的交互点坐标
- _this.panDelta = new THREE.Vector2(); //平移操作下最近两次交互事件之间的瞬时位移
- _this.panOffset = new THREE.Vector3(); //panLeft(), panUp() 用到的瞬时位移
- _this.panVector = new THREE.Vector3(); //每帧平移的总偏移量(交互产生的偏移量),由panDelta累加得到
- _this.offset = new THREE.Vector3(); //每帧最终的有效偏移量(panVector 经过 clamp 操作限制范围后的偏移)
- //注:交互事件瞬时位移(delta)与 帧瞬时位移(offset),产生的原因是事件交互的频率与帧更新的频率不同,eg:mousemove 约8ms < deltaTime 16.6ms
- _this.lastPosition = new THREE.Vector3(); //记录当前帧相机位置
- _this.state = ControlActions.NONE; //当前控制器的模式,决定了mouseAction
- //鼠标行为 在子类中定义
- _this.mouseActions = {};
- _this.touchActions = {};
- _this.lastMoveTime = 0;
- _this.pointersLimit = 2;
- _this.pointers = [];
- _this.angle = 1e-6;
- return _this;
- }
- /**
- * 设定tagetBound
- * @param {THREE.Box3} bound
- */
- _createClass(OutsideControls, [{
- key: "setBounds",
- value: function setBounds(bound) {
- this.targetBounds = bound;
- }
- /**
- * 判断控制器空闲状态
- */
- }, {
- key: "isEngaged",
- value: function isEngaged() {
- return this.state !== ControlActions.NONE;
- }
- /**
- * 水平旋转,通过改变相机球坐标的经度
- * @param {number} angle 旋转的角度(degree)
- */
- }, {
- key: "rotateLeft",
- value: function rotateLeft(angle) {
- void 0 === angle && (angle = this.getAutoRotationAngle());
- this.thetaDelta -= angle; //计算每帧瞬时角位移,与鼠标移动方向相反
- }
- /**
- * 竖直旋转,通过改变相机球坐标的纬度
- * @param {number} angle 旋转的角度(degree)
- */
- }, {
- key: "rotateUp",
- value: function rotateUp(angle) {
- if (!this.noRotateUpDown) {
- void 0 === angle && (angle = this.getAutoRotationAngle());
- this.phiDelta -= angle;
- }
- }
- /**
- * 水平平移,通过改变相机轨道的球心使轨道平移
- */
- }, {
- key: "panLeft",
- value: function panLeft(e) {
- if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
- var t = this.camera.matrix.elements; //从相机矩阵提取计算相机方向向量于XZ平面的投影
- this.panOffset.set(t[0], 0, t[2]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
- }
- }, {
- key: "panUp",
- value: function panUp(e) {
- if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
- var t = this.camera.matrix.elements;
- this.panOffset.set(t[4], 0, t[6]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
- }
- }, {
- key: "stopAutoPanning",
- value: function stopAutoPanning() {
- var e = this.autoPan;
- this.autoPan = !1, this.emit(this.targetClamped ? ControlEvents.AutoPanClamped : e ? ControlEvents.AutoPanInterrupt : ControlEvents.AutoPanComplete);
- }
- /**
- * 俯视视角下的缩小
- */
- }, {
- key: "dollyIn",
- value: function dollyIn(e) {
- void 0 === e && (e = this.getZoomScale()), this.scale /= e;
- }
- /**
- * 俯视视角下的放大
- */
- }, {
- key: "dollyOut",
- value: function dollyOut(e) {
- void 0 === e && (e = this.getZoomScale()); //e<1时是放大 反之缩小
- this.scale *= e;
- }
- /**
- * 更新Pan操作,主要是用刚体运动规则计算每一帧的瞬时球心坐标
- */
- }, {
- key: "updatePan",
- value: function updatePan(e) {
- this.panSpeed.multiplyScalar(1 - settings$3.panFriction).addScaledVector(this.panAcceleration, settings$3.panAccelerationOutside * e); //计算球心移动的瞬时速度
- this.pan(-this.panSpeed.x, this.panSpeed.y); //球心移动的瞬时坐标
- //自动Pan到一个设定的位置
- if (this.autoPan) {
- var offset = new THREE.Vector3().copy(this.autoPanPosition).sub(this.camera.position); //根据当前位置算出偏移矢量
- offset.setY(0).clampLength(0, 50 * e); //位移忽略Y轴
- this.target.add(offset); //得到新的球心target
- this.camera.position.add(offset); //相应地相机的平移量与球心一致,于是相机移到新的球面轨道
- if (this.autoPanPosition.x === this.camera.position.x && this.autoPanPosition.z === this.camera.position.z) {
- //如果相机位置与要Pan的位置一致,没必要进行自动Pan
- this.autoPan = !1;
- this.stopAutoPanning();
- }
- }
- }
- /**
- * 主循环更新,更新轨道视角OrbitView 的 Roatate, Pan, Zoom 行为参数,根本上是计算球坐标下相机的球面轨道坐标,球心位置,运动规律符合刚体运动的物理法则
- * 注:刚体是图形应用物理引擎中重要的物理模型对象,借助牛顿第二定律进行计算。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
- */
- }, {
- key: "update",
- value: function update(e, type) {
- if (this.updateForCad && !this.screenshot) {
- return;
- }
- e || (e = 1 / 60); // e 即是 帧间隔时间deltaTime 用于稳定物理运动而不受帧率影响,更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420 或 搜索Unity Time类
- var friction = Math.min(1, settings$3.rotationFriction * e * 60); //add 如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
- this.rotationSpeed.multiplyScalar(1 - friction).addScaledVector(this.rotationAcceleration, settings$3.rotationAccelerationOutside * e); //计算瞬时角速度
- this.rotateLeft(-this.rotationSpeed.x); //根据角速度进行角位移
- this.noRotateUpDown || this.rotateUp(this.rotationSpeed.y);
- this.updatePan(e); //计算 球心坐标(target)到 相机坐标(cameraPosition)的向量(offset),包含方向和距离信息
- var cameraPosition = this.camera.position;
- this.offset.copy(cameraPosition).sub(this.target); //Rotate
- var lon = Math.atan2(this.offset.x, this.offset.z),
- //根据offset与z轴夹角算出经度lon,
- lat = Math.atan2(Math.sqrt(this.offset.x * this.offset.x + this.offset.z * this.offset.z), this.offset.y); //与y轴夹角算出纬度lat
- this.autoRotate && this.rotateLeft(this.getAutoRotationAngle()); //计算自动旋转的每帧角位移thetaDelta
- lon += this.thetaDelta; //原本角位移与每帧角位移累加
- lat += this.phiDelta; //原本角位移与每帧角位移累加
- lat = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, lat)); //纬度限制在预定义的范围内,进而限制轨道相机的俯仰角
- lat = Math.max(this.angle, Math.min(Math.PI - this.angle, lat));
- this.lon = lon, this.lat = lat; //xzw add for cad compass
- //Zoom
- var radius = this.updateZoom(); //获取Zoom操作后的球半径
- radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius)); //半径限制在自定义范围内
- //Pan 更新球轨道球心位置
- this.target.add(this.panVector); //球心位置加上Pan操作后球心的偏移向量panVector
- this.targetBounds.clampPoint(this.target, this.target); //最终球心坐标限制在自定义BoudingBox的立方体范围内。
- //新的半径求新的offset(球心->相机),用于得到新轨道下相机的位置。
- //注:相机位置为什么不直接加上panVector? 因为此情况下相机偏移不等于panVector
- //1.Zoom改变球半径
- //2.Pan操作被限制在自定义范围,球心偏移可能小于panVector
- this.offset.x = radius * Math.sin(lat) * Math.sin(lon);
- this.offset.y = radius * Math.cos(lat);
- this.offset.z = radius * Math.sin(lat) * Math.cos(lon); //根据新的offset与球心得到相机新的轨道坐标 //Position
- cameraPosition.copy(this.target).add(this.offset); //轨道视角下相机视点锁定球心 //Rotation
- this.camera.lookAt(this.target); //重置 防止干扰其他地方的引用
- this.thetaDelta = 0;
- this.phiDelta = 0;
- this.scale = 1;
- this.panVector.set(0, 0, 0); //记录当前帧相机的位置
- if (this.lastPosition.distanceTo(this.camera.position) > 0) {
- this.lastPosition.copy(this.camera.position);
- }
- }
- /**
- * 角速度 角度转弧度
- */
- }, {
- key: "getAutoRotationAngle",
- value: function getAutoRotationAngle() {
- return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;
- }
- }, {
- key: "getZoomScale",
- value: function getZoomScale() {
- return Math.pow(0.95, this.zoomSpeed);
- }
- /**
- * 鼠标点击行为
- */
- }, {
- key: "onMouseDown",
- value: function onMouseDown(mouseEvent) {
- if (this.enabled) {
- mouseEvent.preventDefault(); // this.player.model._3dTilesRuntime.pauseTilesetUpdate(true)
- // this.player.model._3dTilesRuntime.clearLoadingTiles()
- this.stopAutoPanning();
- this.mouseDown = !0;
- this.state = this.mouseActions[mouseEvent.button];
- switch (this.state) {
- case ControlActions.ROTATE:
- this.rotateStart.set(mouseEvent.clientX, mouseEvent.clientY); //this.rotateStart.set(mouseEvent.clientX, this.noRotateUpDown ? 0 : mouseEvent.clientY);
- this.rotationSpeed.set(0, 0);
- if (this.noRotateUpDown) {
- //floorplan
- this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos;
- this.rotateStartVec.subVectors(this.rotateStart, this.rotateCenter);
- }
- break;
- case ControlActions.DOLLY:
- this.dollyStart.set(mouseEvent.clientX, mouseEvent.clientY);
- break;
- case ControlActions.PAN:
- this.panStart.set(mouseEvent.clientX, mouseEvent.clientY);
- }
- this.emit(ControlEvents.InputStart, 'mouse');
- }
- } //控制模型
- }, {
- key: "onMouseMove",
- value: function onMouseMove(mouseEvent) {
- if (this.enabled && this.mouseDown && 0 !== mouseEvent.buttons) {
- mouseEvent.preventDefault();
- switch (this.state) {
- case ControlActions.ROTATE:
- this.rotateEnd.set(mouseEvent.clientX, mouseEvent.clientY);
- if (this.noRotateUpDown) {
- //floorplan
- this.rotateEndVec.subVectors(this.rotateEnd, this.rotateCenter);
- var angle = math$2.getVec2Angle(this.rotateStartVec, this.rotateEndVec);
- var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
- var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
- if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
- angle *= -1;
- }
- this.rotateLeft(angle);
- this.rotateStartVec.copy(this.rotateEndVec);
- } else {
- //dollhouse
- this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
- this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
- this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
- this.rotateStart.copy(this.rotateEnd);
- }
- break;
- case ControlActions.DOLLY:
- this.dollyEnd.set(mouseEvent.clientX, mouseEvent.clientY), this.dollyDelta.subVectors(this.dollyEnd, this.dollyStart);
- var t = this.dollyDelta.y > 0 ? this.dollyIn : this.dollyOut;
- t.call(this), this.dollyStart.copy(this.dollyEnd);
- break;
- case ControlActions.PAN:
- this.panEnd.set(mouseEvent.clientX, mouseEvent.clientY);
- this.panDelta.subVectors(this.panEnd, this.panStart);
- this.pan(this.panDelta.x, this.panDelta.y);
- this.panStart.copy(this.panEnd);
- }
- this.emit(ControlEvents.Move, 'mouse');
- this.lastMoveTime = mouseEvent.timeStamp;
- this.update(); //同步
- var info = {};
- info.quaternion = {
- _w: this.camera.quaternion._w,
- _x: this.camera.quaternion._x,
- _y: this.camera.quaternion._y,
- _z: this.camera.quaternion._z
- };
- info.position = {
- x: this.camera.position.x,
- y: this.camera.position.y,
- z: this.camera.position.z
- };
- info.target = {
- x: this.target.x,
- y: this.target.y,
- z: this.target.z
- };
- this.player.emit(PlayerEvents.MoveModel, {
- info: info,
- mode: this.player.mode,
- type: 'moveModel'
- });
- }
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(mouseEvent) {
- if (this.enabled) {
- this.mouseDown = !1;
- this.state = ControlActions.NONE;
- if ('mouseover' !== mouseEvent.type) {
- if (mouseEvent.timeStamp > this.lastMoveTime + 100) {
- this.rotationSpeed.set(0, 0);
- this.rotationAcceleration.set(0, 0);
- } else {
- this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
- }
- this.update();
- this.rotationAcceleration.set(0, 0);
- this.rotateDelta.set(0, 0);
- }
- }
- }
- }, {
- key: "onMouseOver",
- value: function onMouseOver(mouseEvent) {
- 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
- }
- }, {
- key: "onMouseWheel",
- value: function onMouseWheel(wheelEvent) {
- if (this.enabled && settings$3.useWheel) {
- this.emit(ControlEvents.Move, 'wheel');
- var t = wheelEvent.wheelDelta || -wheelEvent.detail;
- var func = this.dollyIn;
- if (t > 0) {
- func = this.dollyOut;
- }
- func.call(this);
- this.update(); //同步
- var info = {}; //俯视图情况
- if (this.player.mode === Viewmode$1.FLOORPLAN) {
- info.scale = this.absoluteScale;
- this.player.emit(PlayerEvents.MoveModel, {
- info: info,
- mode: Viewmode$1.FLOORPLAN,
- type: 'moveModel'
- });
- } //dollhouse情况
- else if (this.player.mode === Viewmode$1.DOLLHOUSE) {
- info.quaternion = this.camera.quaternion;
- info.position = this.camera.position;
- info.target = this.target;
- this.player.emit(PlayerEvents.MoveModel, {
- info: info,
- mode: Viewmode$1.DOLLHOUSE,
- type: 'moveModel'
- });
- }
- }
- }
- }, {
- key: "onKeyDown",
- value: function onKeyDown(keyboardEvent) {
- if (this.enabled) {
- if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
- keyboardEvent.preventDefault();
- this.handleKeyDown(keyboardEvent.which);
- }
- }
- }
- }, {
- key: "navRotationAcc",
- value: function navRotationAcc(e, t) {
- 'y' === e ? this.noRotateUpDown ? this.keyboardZoomSpeed = t : this.rotationAcceleration.y = t : this.rotationAcceleration.x = t;
- }
- }, {
- key: "navPanAcc",
- value: function navPanAcc(e, t) {
- this.stopAutoPanning(), this.panAcceleration[e] = t;
- }
- }, {
- key: "handleKeyDown",
- value: function handleKeyDown(keyValue) {
- var t = !0;
- switch (keyValue) {
- case Keys.UPARROW:
- case Keys.I:
- this.navRotationAcc('y', 1);
- break;
- case Keys.DOWNARROW:
- case Keys.K:
- this.navRotationAcc('y', -1);
- break;
- case Keys.LEFTARROW:
- case Keys.J:
- this.navRotationAcc('x', -1);
- break;
- case Keys.RIGHTARROW:
- case Keys.L:
- this.navRotationAcc('x', 1);
- break;
- case Keys.W:
- this.navPanAcc('y', 1);
- break;
- case Keys.S:
- this.navPanAcc('y', -1);
- break;
- case Keys.A:
- this.navPanAcc('x', -1);
- break;
- case Keys.D:
- this.navPanAcc('x', 1);
- break;
- default:
- t = !1;
- }
- t && this.emit(ControlEvents.Move, 'key');
- }
- }, {
- key: "onKeyUp",
- value: function onKeyUp(keyboardEvent) {
- if (this.enabled) {
- keyboardEvent.preventDefault();
- keyboardEvent.stopPropagation();
- this.handleKeyUp(keyboardEvent.which);
- }
- }
- }, {
- key: "handleKeyUp",
- value: function handleKeyUp(keyValue) {
- switch (keyValue) {
- case Keys.I:
- case Keys.K:
- case Keys.UPARROW:
- case Keys.DOWNARROW:
- this.keyboardZoomSpeed = 0, this.rotationAcceleration.y = 0;
- break;
- case Keys.J:
- case Keys.L:
- case Keys.LEFTARROW:
- case Keys.RIGHTARROW:
- this.rotationAcceleration.x = 0;
- break;
- case Keys.S:
- case Keys.W:
- this.panAcceleration.y = 0;
- break;
- case Keys.A:
- case Keys.D:
- this.panAcceleration.x = 0;
- }
- }
- }, {
- key: "onTouchStart",
- value: function onTouchStart(pointerEvent) {
- console.log(this.enabled, this.state === ControlActions.NONE);
- if (this.enabled || this.state === ControlActions.NONE) {
- //pointerEvent.preventDefault()//xzw注释for mapViewer 按钮点不了
- pointerEvent.stopPropagation();
- this.stopAutoPanning();
- var dolly = function () {
- if (2 === pointerEvent.touches.length) {
- var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
- i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
- this.dollyStart.set(t, i);
- }
- }.bind(this),
- pan = function () {
- this.panStart.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
- }.bind(this),
- rotate = function () {
- if (this.noRotateUpDown) {
- //floorplan
- if (!pointerEvent.touches[1]) {
- console.error('!pointerEvent.touches[0]11');
- }
- var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
- var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
- this.rotateStartVec.subVectors(touch0, touch1);
- this.rotateStart = touch0; //上次的touch0
- this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos; //target在二维上的位置, 是旋转和缩放的中心
- } else {
- //dollhouse
- this.rotateStart.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
- }
- }.bind(this);
- this.state = this.touchActions[pointerEvent.touches.length];
- switch (this.state) {
- case ControlActions.PAN_DOLLY:
- //switch语句原理是跳转到caseX位置执行剩下的语句,直到最后或者遇见break为止
- dolly();
- case ControlActions.PAN:
- pan();
- break;
- case ControlActions.ROTATE_DOLLY:
- dolly();
- case ControlActions.ROTATE:
- rotate();
- //floorplan 单指会执行 2 双指34
- //dollhouse 单指会执行 4 双指1
- }
- this.rotationSpeed.set(0, 0);
- this.emit(ControlEvents.InputStart, 'touch');
- }
- }
- }, {
- key: "onTouchMove",
- value: function onTouchMove(pointerEvent) {
- if (!pointerEvent.changedTouches) return; //#43188 测试发现有时候pointEvent会卡住,暂时只处理touchEvent对象
- if (this.enabled && this.state !== ControlActions.NONE) {
- var stateNow = this.touchActions[pointerEvent.touches.length];
- if (stateNow != this.state) {
- //iphoneX 在touchmove到别的ui时的时touches个数会与touchstart时不一样
- return; //console.error('state更改')
- }
- pointerEvent.preventDefault();
- pointerEvent.stopPropagation(); //console.log('onTouchMove',pointerEvent.touches)
- //缩放直接修改相机projectionMatrix (currentScale), 平移和旋转则修改相机modelMatrix
- var scale = function () {
- //根据双指距离直接缩放(假定手指所在的三维位置在缩放后应该不变,所以缩放比率为手指在屏幕上的距离变化)
- var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
- i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
- this.dollyEnd.set(t, i);
- var scale = this.dollyEnd.length() / this.dollyStart.length();
- if (scale > 1) {
- //放大
- //this.dollyOut(1/scale);
- this.dollyIn(scale); //console.log("放大"+scale)
- } else {
- //this.dollyIn(scale);
- this.dollyOut(1 / scale); //console.log("缩小"+scale)
- } //dollyLen > 0 ? this.dollyOut(1 + dollyLen / 500) : this.dollyIn(1 - dollyLen / 500),
- this.dollyStart.copy(this.dollyEnd);
- return scale;
- }.bind(this),
- pan = function () {
- // 平移
- if (pointerEvent.touches.length == 0) return; //手机从按钮处滑动到canvas时会有这种情况
- this.panEnd.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
- this.panDelta.subVectors(this.panEnd, this.panStart);
- window.logEnable && console.log('delta', Array.from(pointerEvent.touches).map(function (e) {
- return [e.pageX.toFixed(1), e.pageY.toFixed(1)];
- }), pointerEvent.touches instanceof Array, pointerEvent.currentTarget.className + pointerEvent.currentTarget.nodeName);
- this.pan(this.panDelta.x, this.panDelta.y);
- this.panStart.copy(this.panEnd);
- this.rotateDelta.set(0, 0);
- }.bind(this),
- panTwoPointers = function (scale, angle) {
- // 双指平移。 平移向量为 上次的touch0到旋转中心的向量 加上 旋转中心到绕中心旋转后的新的touch0的向量的scale分之一。 (先把相机平移到上次的touch0然后旋转后退到合适的位置,将位移量的逆和上述几个向量作比较得出)
- //获取touch0在按照scale, angle的方式改变后的位置到实际手指移动到的新的位置的位移量
- var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
- var rotResult = touch0.clone().rotateAround(this.rotateCenter, angle);
- var Op0 = rotResult.clone().sub(this.rotateCenter).multiplyScalar(1 / scale);
- var Op1 = this.rotateCenter.clone().sub(this.rotateStart);
- this.panDelta.addVectors(Op0, Op1);
- this.pan(this.panDelta.x, this.panDelta.y);
- this.rotateStart = touch0;
- }.bind(this),
- rot = function () {
- if (this.noRotateUpDown) {
- //floorplan
- var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
- var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
- this.rotateEndVec.subVectors(touch0, touch1); //当前双指角度
- var angle = math$2.getVec2Angle(this.rotateStartVec, this.rotateEndVec); //和上次的双指角度求夹角,即为旋转角度
- var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
- var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
- if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
- angle *= -1;
- }
- this.rotateLeft(angle);
- this.rotateStartVec.copy(this.rotateEndVec);
- return angle;
- } else {
- //dollhouse还是之前的方式:单指旋转,根据滑动距离来旋转
- this.rotateEnd.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
- this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
- this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
- this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
- this.rotateStart.copy(this.rotateEnd);
- }
- }.bind(this);
- /* rotOrScale = function() {
- console.log('rotOrScale')
- if (2 === pointerEvent.touches.length) {
- var i = window.devicePixelRatio || 1
- , r = pointerEvent.touches[1].pageX - pointerEvent.touches[0].pageX
- , s = pointerEvent.touches[1].pageY - pointerEvent.touches[0].pageY
- , l = Math.sqrt(r * r + s * s)
- , h = Math.abs(this.dollyStart.length() - l);
-
- //修改为可以同时缩放平移旋转
- if (h > settings.input.touchMoveThreshold * i)
- this.state = ControlActions.DOLLY,
- scale();
- else {
- var u = common.average(pointerEvent.touches, "pageX")
- , d = common.average(pointerEvent.touches, "pageY")
- , p = this.rotateDelta.set(u, d).sub(this.rotateStart).length();
- if(p > settings.input.touchMoveThreshold)
- {
- this.state = ControlActions.ROTATE;
- this.rotateStart.set(u, d);
- rot();
- }
- }
- }
- }.bind(this); */
- switch (this.state //floorplan会执行23,dollhouse会执行125
- ) {
- case ControlActions.PAN_DOLLY:
- scale();
- case ControlActions.PAN:
- pan();
- break;
- case ControlActions.ROTATE_DOLLY:
- //floorplan双指改为可以缩放、旋转、 平移
- //rotOrScale();
- var s = scale();
- var angle = rot();
- panTwoPointers(s, angle);
- break;
- case ControlActions.DOLLY:
- scale();
- break;
- case ControlActions.ROTATE:
- rot();
- break;
- default:
- this.state = ControlActions.NONE;
- } //floorplan 单指会执行 2 双指3
- //dollhouse 单指会执行 5 双指12
- this.lastMoveTime = pointerEvent.timeStamp;
- this.emit(ControlEvents.Move, 'touch'); //同步
- var info = {
- scale: this.absoluteScale
- };
- info.quaternion = {
- _w: this.camera.quaternion._w,
- _x: this.camera.quaternion._x,
- _y: this.camera.quaternion._y,
- _z: this.camera.quaternion._z
- };
- info.position = {
- x: this.camera.position.x,
- y: this.camera.position.y,
- z: this.camera.position.z
- };
- info.target = {
- x: this.target.x,
- y: this.target.y,
- z: this.target.z
- };
- this.player.emit(PlayerEvents.MoveModel, {
- info: info,
- mode: this.player.mode,
- type: 'moveModel'
- });
- }
- }
- }, {
- key: "onTouchEnd",
- value: function onTouchEnd(pointerEvent) {
- if (this.enabled) {
- if (this.state === ControlActions.ROTATE) {
- if (pointerEvent.timeStamp > this.lastMoveTime + 100) {
- this.rotationSpeed.set(0, 0);
- this.rotationAcceleration.set(0, 0);
- } else {
- this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
- }
- }
- this.state = ControlActions.NONE;
- this.update();
- this.rotationAcceleration.set(0, 0);
- this.rotateDelta.set(0, 0);
- }
- }
- }, {
- key: "onPointerDown",
- value: function onPointerDown(pointerEvent) {
- if (this.enabled) {
- if ('touch' === pointerEvent.pointerType) {
- if (this.pointers.length < this.pointersLimit && !this.pointers.find(function (pointer) {
- return pointer.id == pointerEvent.pointerId;
- })) {
- this.pointers.push({
- id: pointerEvent.pointerId,
- pageX: pointerEvent.pageX,
- pageY: pointerEvent.pageY
- });
- }
- pointerEvent.touches = this.pointers;
- this.onTouchStart(pointerEvent);
- }
- this.emit(ControlEvents.InputStart, 'pointer');
- }
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove(pointerEvent) {
- if (this.enabled && 'touch' === pointerEvent.pointerType) {
- this.pointers.forEach(function (t) {
- if (pointerEvent.pointerId === t.id) {
- t.pageX = pointerEvent.pageX;
- t.pageY = pointerEvent.pageY;
- t.pressed = pointerEvent.pressed;
- }
- });
- pointerEvent.touches = this.pointers; //转化为onTouchMove的touches
- //console.log('onPointerMove',pointerEvent.touches)
- this.onTouchMove(pointerEvent);
- }
- }
- }, {
- key: "onPointerUp",
- value: function onPointerUp(pointerEvent) {
- if (this.enabled && 'touch' === pointerEvent.pointerType) {
- /* this.pointers.forEach(function(t, i) {
- pointerEvent.pointerId === t.id && this.pointers.splice(i, 1)//这样肯定bug
- }
- .bind(this)); */
- this.pointers = this.pointers.filter(function (pointer) {
- return pointer.id != pointerEvent.pointerId;
- });
- pointerEvent.touches = this.pointers;
- this.onTouchEnd(pointerEvent);
- }
- }
- }, {
- key: "reset",
- value: function reset() {
- 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);
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- var cameraSpatialInfo = {
- camera_position: {
- x: math$2.toPrecision(this.camera.position.x, 4),
- y: math$2.toPrecision(this.camera.position.y, 4),
- z: math$2.toPrecision(this.camera.position.z, 4)
- },
- camera_quaternion: {
- x: math$2.toPrecision(this.camera.quaternion.x, 4),
- y: math$2.toPrecision(this.camera.quaternion.y, 4),
- z: math$2.toPrecision(this.camera.quaternion.z, 4),
- w: math$2.toPrecision(this.camera.quaternion.w, 4)
- }
- };
- return cameraSpatialInfo;
- }
- }]);
- return OutsideControls;
- }(EventEmitter);
- var MouseButton = {
- LEFT: 0,
- MIDDLE: 1,
- RIGHT: 2
- };
- 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); }; }
- 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; } }
- var FloorplanControls = /*#__PURE__*/function (_OutsideControls) {
- _inherits(FloorplanControls, _OutsideControls);
- var _super = _createSuper$1b(FloorplanControls);
- function FloorplanControls(camera, dom, player) {
- var _this;
- _classCallCheck(this, FloorplanControls);
- _this = _super.call(this, camera, dom, player);
- _this.minDistance = 5; //最小球半径
- _this.maxDistance = 100; //最大球半径
- _this.noRotateUpDown = !0; //是否禁止竖直方向的旋转,即禁用纬度上的角位移
- _this.minPolarAngle = 0; //最小纬度 (0度在北极往下看,180度在南极往上看) 对应lat
- _this.maxPolarAngle = 0; //最大纬度
- _this.zoomNearLimit = 0.01;
- _this.zoomFarLimit = 10;
- _this.absoluteScale = 1; //当前控制器下的默认缩放
- _this.currentScale = 1; //鼠标所交互的界面元素
- _this.dom = dom;
- _this.$app = player.$app;
- _this.player = player;
- _this.plane = null;
- _this.cadSize = null;
- _this.floorTexture = null; //鼠标、触点行为
- _this.mouseActions[MouseButton.LEFT] = ControlActions.PAN;
- _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
- _this.mouseActions[MouseButton.RIGHT] = ControlActions.ROTATE;
- _this.touchActions[1] = ControlActions.PAN;
- _this.touchActions[2] = ControlActions.ROTATE_DOLLY;
- return _this;
- }
- /**
- * 屏幕大小变化后,相应的也要调整
- */
- /* updateFloorCad() {
- if (this.plane != null && this.plane != 'nofile')
- {
- var planeWidth = this.plane.geometry.parameters.width;
- var planeHeight = this.plane.geometry.parameters.height;
- var modelWidth = this.player.model.boundingBox.max.x - this.player.model.boundingBox.min.x;
- var modelHeight = this.player.model.boundingBox.max.z - this.player.model.boundingBox.min.z;
- var width = this.camera.right - this.camera.left;
- var height = this.camera.top - this.camera.bottom;
- let scale = app.player.domElement.clientWidth / (this.camera.right - this.camera.left);
- this.plane.scale.x = (modelWidth + (this.cadSize.left + this.cadSize.right) / scale) / planeWidth;
- this.plane.scale.z = (modelHeight + (this.cadSize.left + this.cadSize.right) / scale) / planeHeight;
- }
- } */
- /**
- * 相机通过缩放Zoom,使模型适当充满视口。
- * 1.得到模型平面(XZ)尺寸
- * 2.分别计算视口宽高比 大于1,小于1 两种情况下模型所占最大的视口尺寸
- * 3.以模型所占最大视口尺寸为基准,调整绝对缩放比
- * @param {Vector3} modelSize
- */
- _createClass(FloorplanControls, [{
- key: "zoomToContain",
- value: function zoomToContain(modelSize, ratio, padding) {
- var absoluteScale = this.getDefaultAbsoluteScale(modelSize, ratio, padding); //改
- this.absoluteScale = absoluteScale;
- this.currentScale = this.absoluteScale;
- }
- /**
- *
- * @param {Vector3} modelSize
- */
- }, {
- key: "getDefaultAbsoluteScale",
- value: function getDefaultAbsoluteScale(modelSize, ratio, angle) {
- var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
- x: 400,
- y: 200
- };
- //const metadata = app.store.getters['scene/metadata'] || {}
- var absoluteScale;
- /* if(metadata.floorPlanAngle || config.floorPlanNoRotate ){//指定了角度的话,就和browser.aspectRatio()无关,总使用纵向
- var angle = 0;
-
- if(metadata.floorPlanAngle ){//规定了cadImage旋转值的话
- angle = parseFloat(metadata.floorPlanAngle)
- }
- else if ( config.floorPlanNoRotate )//为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
- {
- angle = 0;
- }
- modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0))
-
- var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect) //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
-
- var screenSize = Math.min($("#player").width(), $("#player").height())
- var maxSize = 800;//模型最大占据像素
- ratio = ratio != void 0 ? ratio : Math.max(screenSize * 1.2 / maxSize, 1.2) ;
-
- absoluteScale = n / 2 / settings.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
- }else{ */
- /* xst
- var maxModelSize = Math.max(modelSize.x, modelSize.z),
- minModelSize = Math.min(modelSize.x, modelSize.z),
- n = Math.max(maxModelSize, minModelSize * this.camera.aspect), //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
- r = Math.max(minModelSize, maxModelSize * this.camera.aspect) //视口宽高比 < 1 情况下,模型所占最大视口尺寸
- absoluteScale = ((browser.aspectRatio() < 1 ? r : n) / 2 / settings.orthoBase) * (ratio != void 0 ? ratio : 1.2) //根据模型所占最大视口尺寸调整缩放
- */
- //}
- //xst
- if (angle == null || typeof angle == 'undefined') {
- angle = this.$app.store.getValue('metadata').floorPlanAngle;
- if (typeof angle == 'undefined') {
- angle = 0;
- }
- angle = parseFloat(angle);
- }
- modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0));
- var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect); //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
- var _this$player$domEleme = this.player.domElement,
- clientWidth = _this$player$domEleme.clientWidth,
- clientHeight = _this$player$domEleme.clientHeight;
- var screenSize = Math.min(clientWidth - padding.x, clientHeight - padding.y);
- var maxSize = 800; //模型最大占据像素
- var maxRatio = this.player.linkEditor && (this.player.linkEditor.setTagVisible || this.player.linkEditor.setPanoVisible) ? 1.2 : 2;
- ratio = ratio != void 0 ? ratio : Math.max(screenSize * maxRatio / maxSize, maxRatio);
- absoluteScale = n / 2 / settings$3.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
- return absoluteScale;
- }
- /**
- * 相机通过旋转Rotate,使模型尺寸长宽比匹配相机视野宽高比
- * @param {Vector3} modelSize
- * @param {Vector3} direction
- */
- }, {
- key: "rotateToView",
- value: function rotateToView(modelSize, direction) {
- var i = 0,
- n = browser$1.aspectRatio() < 1,
- //是否模型尺寸显“细长”
- r = modelSize.x < modelSize.z; //是否视口为“窄屏”
- var metadata = this.$app.store.getValue('metadata');
- if (metadata.floorPlanAngle !== void 0) {
- //规定了cadImage旋转值的话
- i = 2 * Math.PI - 1 * parseFloat(metadata.floorPlanAngle); //i = parseFloat(metadata.floorPlanAngle)
- } else if (n === r
- /* || config.floorPlanNoRotate */
- ) {
- //为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
- i = 0;
- } else {
- i = Math.PI / 2;
- } //i = Math.PI / 2
- this.rotateLeft(i);
- this.update(0);
- }
- /**
- * 平移操作,相对相机的本地坐标
- * @param {Number} panSpeedX
- * @param {Number} panSpeedY
- */
- }, {
- key: "pan",
- value: function pan(panSpeedX, panSpeedY) {
- this.camera.updateMatrix();
- this.panLeft(panSpeedX * (this.camera.right - this.camera.left) / this.player.domElement.clientWidth); //括号内是移动模型的距离,单位米
- this.panUp(-panSpeedY * (this.camera.top - this.camera.bottom) / this.player.domElement.clientHeight);
- }
- /**
- * 缩放操作,与透视相机不同,此模式下采用正交相机,通过改变相机轨道半径从而改变相机距离无意义,缩放是通过调整相机投影视口大小的方式
- */
- }, {
- key: "updateZoom",
- value: function updateZoom() {
- //计算缩放比
- this.absoluteScale *= this.scale - 0.03 * this.keyboardZoomSpeed; //滚轮缩放
- 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
- this.currentScale = 0.8 * this.currentScale + 0.2 * this.absoluteScale; //----许钟文------------------------------------
- //默认根据屏幕宽度变化大小。当截取俯视图时,保留截取时绝对大小,无论截取什么比例,房子都不会被缩放。
- //而后导览时,无论什么比例下飞到这个导览点,房子都是这个大小。
- //本意是如果想设置在某窗口比例下的房子大小时,比如手机大小,当截取成功后缩略图和满屏时房子都不会变化大小。
- //在满屏时截取,缩小宽度后点击房子也不会变小。缺点:当窗口很窄时,房子会略大。
- var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
- this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
- this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
- this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
- this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
- this.camera.updateProjectionMatrix();
- return this.offset.length();
- } //===========================================
- /*
- * 通过传参直接控制camera,不通过update里那些参数。 用于cad控制模型
- */
- }, {
- key: "updateDirect",
- value: function updateDirect(info) {
- //相机视口大小,如left为最左侧看到的三维边界坐标到视口中心的距离
- // var height = info.width / this.camera.aspect
- // this.camera.left = -info.width / 2
- // this.camera.right = info.width / 2
- // this.camera.top = height / 2
- // this.camera.bottom = -height / 2
- // this.camera.updateProjectionMatrix()
- if (!info.floorPlanAngle) {
- info.floorPlanAngle = 0;
- } //console.log('updateDirect' + JSON.stringify(info))
- this.camera.left = -info.width / 2;
- this.camera.right = info.width / 2;
- this.camera.top = info.height / 2;
- this.camera.bottom = -info.height / 2;
- this.camera.updateProjectionMatrix(); //相机中心,若相机有旋转,需要把相机位置也旋转下:
- this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
- var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
- var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
- this.camera.position.setX(pos.x);
- this.camera.position.setZ(pos.y); //let model = this.$app.core.get('Player').model
- //if(info.floorPlanAngle!=0){
- // this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null,info.floorPlanAngle) //改
- // this.currentScale = this.absoluteScale
- // var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1
- // //通过相机视口参数来调整相机投影视口大小
- // this.camera.left = -settings.orthoBase * this.currentScale * s //* this.camera.aspect;
- // this.camera.right = settings.orthoBase * this.currentScale * s //* this.camera.aspect;
- // this.camera.top = (settings.orthoBase * this.currentScale * s) / this.camera.aspect
- // this.camera.bottom = (-settings.orthoBase * this.currentScale * s) / this.camera.aspect
- //}
- this.updateForCad = true;
- }
- }, {
- key: "updateForRotateCad",
- value: function updateForRotateCad(info) {
- if (!info.floorPlanAngle) {
- info.floorPlanAngle = 0;
- } //console.log('updateForRotateCad' + JSON.stringify(info))
- //相机中心,若相机有旋转,需要把相机位置也旋转下:
- this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
- var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
- //var pos = new THREE.Vector2().copy(center).rotateAround(center, -info.floorPlanAngle)
- var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
- this.camera.position.setX(pos.x);
- this.camera.position.setZ(pos.y);
- var model = this.$app.core.get('Player').model;
- this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null, info.floorPlanAngle); //改
- this.currentScale = this.absoluteScale;
- var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
- this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
- this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
- this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
- this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
- this.camera.updateProjectionMatrix();
- this.updateForCad = true;
- }
- /*
- * 恢复使用update, 并使俯视图看起来和cad时一样。
- */
- }, {
- key: "recoverToUpdate",
- value: function recoverToUpdate() {
- this.updateForCad = false; //旋转(target、thetaDelta)
- //通过计算target恢复到旋转角度为0的状态(得到的dir都是一样的)
- /* var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(this.camera.quaternion)
- this.target = this.camera.position.clone().add(dir) */
- this.target.copy(this.camera.position); //通过rotateLeft来旋转,保持刚才的角度:
- var metadata = this.$app.store.getValue('metadata');
- var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0);
- this.thetaDelta = floorPlanAngle; //console.log("recoverToUpdate "+floorPlanAngle)
- //缩放
- this.absoluteScale = this.currentScale = this.camera.right / settings$3.orthoBase;
- this.update(1); //立即应用thetaDelta
- } //===========================================
- }, {
- key: "toJSON",
- value: function toJSON() {
- var e = new THREE.Quaternion(),
- t = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)),
- i = new THREE.Quaternion();
- var func = function func() {
- var n = OutsideControls.prototype.toJSON.call(this);
- e.copy(n.camera_quaternion);
- i.copy(t);
- i.multiply(e);
- n.camera_quaternion.x = math.toPrecision(i.x, 4);
- n.camera_quaternion.y = math.toPrecision(i.y, 4);
- n.camera_quaternion.z = math.toPrecision(i.z, 4);
- n.camera_quaternion.w = math.toPrecision(i.w, 4);
- n.ortho_zoom = math.toPrecision(this.currentScale * this.camera.aspect, 4);
- return n;
- };
- return func;
- }
- }, {
- key: "setZoomBounds",
- value: function setZoomBounds(bound) {
- //根据模型大小修改zoom的边界. 和模型大小成正比
- //settings.zoomNearLimit, Math.min(this.absoluteScale, settings.zoomFarLimit)
- var size = bound.getSize(new THREE.Vector3());
- var max = Math.max(size.x, size.z) / 2 / settings$3.orthoBase; //top最大值可能是
- max = Math.max(0.1, max); //avoid 0
- this.zoomFarLimit = parseInt(max * 10);
- this.zoomNearLimit = this.zoomFarLimit / 100;
- settings$3.floorplan.cameraHeight = THREE.MathUtils.clamp(Math.ceil(2.4 * size.length()), 5, 5000); //小模型如果高度太高,dollhouse和floorplan互转时动态过大
- this.maxDistance = Math.max(settings$3.floorplan.cameraHeight + 1, this.maxDistance);
- }
- }]);
- return FloorplanControls;
- }(OutsideControls);
- 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); }; }
- 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; } }
- //import Common from '../utils/Common.js'
- var Viewport = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(Viewport, _THREE$EventDispatche);
- var _super = _createSuper$1a(Viewport);
- function Viewport(
- /* view, */
- camera) {
- var _this;
- var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- _classCallCheck(this, Viewport);
- //目前不支持换camera
- _this = _super.call(this);
- _this.left = prop.left;
- _this.bottom = prop.bottom;
- _this.width = prop.width;
- _this.height = prop.height;
- _this.name = prop.name;
- _this.camera = camera;
- _this.active = true;
- _this.resolution = new THREE.Vector2();
- _this.resolution2 = new THREE.Vector2();
- _this.offset = new THREE.Vector2(); //viewportOffset 范围从0-整个画布的像素
- _this.extraEnableLayers = prop.extraEnableLayers || []; //额外可展示的层
- _this.cameraLayers = prop.cameraLayers;
- _this.pixelRatio = prop.pixelRatio; //如果规定pixelRatio的话要传,这样就覆盖devicePicelRatio, 如magnifier
- return _this;
- }
- /* clone(){
- return Common.CloneClassObject(this)
-
- }
- */
- _createClass(Viewport, [{
- key: "cameraChanged",
- value: function cameraChanged() {
- var _this2 = this;
- var copy = function copy() {
- _this2.previousState = {
- projectionMatrix: _this2.camera.projectionMatrix.clone(),
- //worldMatrix在this.control时归零了所以不用了吧,用position和qua也一样
- position: _this2.camera.position.clone(),
- quaternion: _this2.camera.quaternion.clone(),
- active: _this2.active,
- resolution: _this2.resolution.clone(),
- resolution2: _this2.resolution2.clone() //有时clientWidth没变但是ratio缩放了
- };
- };
- var projectionChanged = true,
- positionChanged = true,
- quaternionChanged = true,
- activeChanged = true,
- resolutionChanged = true;
- var getChanged = function getChanged() {
- return {
- projectionChanged,
- positionChanged,
- quaternionChanged,
- activeChanged,
- resolutionChanged,
- changed: projectionChanged || positionChanged || quaternionChanged || activeChanged || resolutionChanged
- };
- };
- if (this.previousState) {
- projectionChanged = !this.camera.projectionMatrix.equals(this.previousState.projectionMatrix);
- positionChanged = !this.camera.position.equals(this.previousState.position);
- quaternionChanged = !this.camera.quaternion.equals(this.previousState.quaternion);
- activeChanged = this.active != this.previousState.active;
- resolutionChanged = !this.resolution.equals(this.previousState.resolution) || !this.resolution2.equals(this.previousState.resolution2);
- }
- copy();
- return getChanged();
- }
- }, {
- key: "setResolution",
- value: function setResolution(w, h) {
- this.resolution.set(w, h); //是client的width height
- 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)
- this.dispatchEvent({
- type: 'resize'
- });
- }
- }]);
- return Viewport;
- }(THREE.EventDispatcher);
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var clickMaxDragDis = 3,
- clickMaxPressTime = 200,
- doubleClickTime = 300; //双击间隔时间
- var Buttons = {
- NONE: 0,
- LEFT: 1,
- RIGHT: 2,
- MIDDLE: 4
- };
- var mouseToRay = function mouseToRay(pointer, camera) {
- var vector = new THREE.Vector3(pointer.x, pointer.y, 1);
- var origin = new THREE.Vector3(pointer.x, pointer.y, -1); //不能用camera.position,在orbitCamera时不准
- vector.unproject(camera);
- origin.unproject(camera);
- var direction = new THREE.Vector3().subVectors(vector, origin).normalize();
- var ray = new THREE.Ray(origin, direction);
- return ray;
- };
- function ascSort(a, b) {
- return a.distance - b.distance;
- }
- function _intersectObject(object, raycaster, intersects, recursive, ignoreUnvisible) {
- if (ignoreUnvisible && !object.visible) return; //add
- if (object.layers.test(raycaster.layers)) {
- object.raycast(raycaster, intersects);
- }
- if (recursive === true) {
- var children = object.children;
- for (var i = 0, l = children.length; i < l; i++) {
- _intersectObject(children[i], raycaster, intersects, true, ignoreUnvisible);
- }
- }
- }
- var Raycaster = /*#__PURE__*/function (_THREE$Raycaster) {
- _inherits(Raycaster, _THREE$Raycaster);
- var _super = _createSuper$19(Raycaster);
- function Raycaster() {
- _classCallCheck(this, Raycaster);
- return _super.call(this);
- }
- _createClass(Raycaster, [{
- key: "intersectObject",
- value: function intersectObject(object, recursive, optionalTarget, ignoreUnvisible) {
- //add ignoreUnvisible
- var intersects = optionalTarget || [];
- _intersectObject(object, this, intersects, recursive, ignoreUnvisible);
- intersects.sort(ascSort);
- return intersects;
- }
- }, {
- key: "intersectObjects",
- value: function intersectObjects(objects, recursive, optionalTarget, ignoreUnvisible) {
- //add ignoreUnvisible 跳过不可见
- var intersects = optionalTarget || [];
- if (Array.isArray(objects) === false) {
- console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');
- return intersects;
- }
- for (var i = 0, l = objects.length; i < l; i++) {
- _intersectObject(objects[i], this, intersects, recursive, ignoreUnvisible);
- }
- intersects.sort(ascSort);
- return intersects;
- }
- }]);
- return Raycaster;
- }(THREE.Raycaster);
- var player$k;
- var InputHandler = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(InputHandler, _THREE$EventDispatche);
- var _super2 = _createSuper$19(InputHandler);
- function InputHandler(viewer, scene, player_) {
- var _this;
- _classCallCheck(this, InputHandler);
- _this = _super2.call(this);
- _this.viewer = viewer;
- _this.renderer = viewer.renderer;
- _this.domElement = _this.renderer.domElement;
- _this.enabled = true;
- player$k = player_;
- _this.scene = scene;
- _this.interactiveScenes = [];
- _this.interactiveObjects = new Set();
- _this.inputListeners = [];
- _this.blacklist = new Set();
- _this.drag = null;
- _this.mouse = new THREE.Vector2(0, 0); //add:
- _this.pointer = new THREE.Vector2(0, 0); //交互点的屏幕坐标,有别于DOM坐标,在此存放NDC坐标。(NDC,三维常用坐标系,二维坐标,整个屏幕映射范围(-1,1),屏幕中心为原点,+Y朝上,+X朝右)
- _this.mouseDownMouse = new THREE.Vector2(0, 0);
- _this.selection = [];
- _this.hoveredElements = [];
- _this.pressedKeys = {};
- _this.wheelDelta = 0;
- _this.speed = 1;
- _this.logMessages = false;
- if (_this.domElement.tabIndex === -1) {
- _this.domElement.tabIndex = 2222;
- }
- _this.lastPointerUpTime = 0;
- _this.touches = [];
- _this.interactHistory = {
- move: 0
- }; //add
- _this.hoverViewport = viewer.viewports[0];
- document.addEventListener('mouseup', function (event) {
- event.preventDefault();
- }, {
- passive: false
- });
- _this.domElement.addEventListener('contextmenu', function (event) {
- event.preventDefault();
- }, false);
- _this.domElement.addEventListener('click', _this.onMouseClick.bind(_assertThisInitialized(_this)), false);
- _this.domElement.addEventListener('mousedown', _this.onMouseDown.bind(_assertThisInitialized(_this)), {
- passive: false,
- useCapture: false
- });
- window.addEventListener('mouseup', _this.onMouseUp.bind(_assertThisInitialized(_this)), {
- passive: false,
- useCapture: false
- });
- /* if(Potree.isIframeChild){//子页面的话在父页面也要加侦听(应该不会有多层吧?否则要一直加到最外层)
- //window.parent.addEventListener('mouseup', this.onMouseUp.bind(this), false); //可能跨域
- //window.parent.postMessage('listenMouseup', '*');
- window.addEventListener('mouseout', this.onMouseUp.bind(this), false); //cancel drag
- } */
- _this.domElement.addEventListener('mouseout', function () {
- _this.containsMouse = false;
- }, false);
- _this.domElement.addEventListener('mousemove', _this.onMouseMove.bind(_assertThisInitialized(_this)), {
- passive: false,
- useCapture: false
- });
- _this.domElement.addEventListener('mousewheel', _this.onMouseWheel.bind(_assertThisInitialized(_this)), false);
- _this.domElement.addEventListener('DOMMouseScroll', _this.onMouseWheel.bind(_assertThisInitialized(_this)), false); // Firefox
- window.addEventListener('keydown', _this.onKeyDown.bind(_assertThisInitialized(_this))); //原先是this.domElement,这样的话一开始要点击屏幕后才能监听到
- window.addEventListener('keyup', _this.onKeyUp.bind(_assertThisInitialized(_this)));
- window.addEventListener('blur', _this.onKeyUp.bind(_assertThisInitialized(_this))); //add
- _this.domElement.addEventListener('touchstart', _this.onTouchStart.bind(_assertThisInitialized(_this)));
- _this.domElement.addEventListener('touchend', _this.onTouchEnd.bind(_assertThisInitialized(_this)));
- _this.domElement.addEventListener('touchmove', _this.onTouchMove.bind(_assertThisInitialized(_this)));
- player$k.on('update', function () {
- _this.interactHistory = {}; //清空
- });
- return _this;
- } //统一跟第一个触碰的viewport相同
- _createClass(InputHandler, [{
- key: "updateTouchesInfo",
- value: function updateTouchesInfo(e) {
- var _this2 = this;
- var viewport, camera;
- var oldTouches = this.touches;
- var changedTouches = Array.from(e.changedTouches);
- var touches = Array.from(e.touches);
- this.touches = touches.map(function (touch) {
- var touch_ = oldTouches.find(function (a) {
- return a.touch.identifier == touch.identifier;
- });
- var pointer = touch_ && touch_.pointer; //复制原先的值
- return {
- touch,
- pointer
- };
- });
- if (e.touches.length > 0) {
- var newTouches = touches.filter(function (e) {
- return !oldTouches.some(function (a) {
- return a.touch.identifier == e.identifier;
- }) && !changedTouches.some(function (a) {
- return a.identifier == e.identifier;
- });
- }); //从按钮处划过时e.touches中会出现this.touches和changedTouches中都没有的identifier
- if (newTouches.length > 0) {
- console.warn('has new', newTouches.map(function (e) {
- return e.identifier;
- }));
- }
- newTouches.concat(changedTouches).forEach(function (touch) {
- //修改changedTouches的
- var touch_ = _this2.touches.find(function (a) {
- return a.touch.identifier == touch.identifier;
- });
- if (touch_) {
- var a = _this2.getPointerInViewport(touch.pageX, touch.pageY, _this2.dragViewport || viewport, new THREE.Vector2());
- touch_.pointer = a.pointer.clone();
- viewport = a.viewport;
- camera = a.camera;
- }
- }); //使用当前touches的平均
- if (e.touches.length > 1) {
- var pageX = Common.average(e.touches, 'pageX');
- var pageY = Common.average(e.touches, 'pageY');
- var a = this.getPointerInViewport(pageX, pageY, viewport, new THREE.Vector2());
- this.pointer.copy(a.pointer); //console.log('updateTouchesInfo', this.pointer.clone())
- } else {
- this.pointer = this.touches[0].pointer.clone(); //更新,使用当前touches中的第一个
- }
- return {
- viewport,
- camera
- };
- }
- }
- }, {
- key: "onTouchStart",
- value: function onTouchStart(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onTouchStart');
- e.preventDefault();
- this.dealPointerDown(e, true);
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
- type: 'global_' + e.type,
- changedTouches: e.changedTouches
- }));
- }
- }, {
- key: "onTouchMove",
- value: function onTouchMove(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onTouchMove');
- e.preventDefault();
- this.dealPointerMove(e, true);
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
- type: 'global_' + e.type,
- changedTouches: e.changedTouches
- }));
- }
- }, {
- key: "onTouchEnd",
- value: function onTouchEnd(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onTouchEnd');
- e.preventDefault(); //console.log('onTouchEnd')
- this.updateTouchesInfo(e);
- this.dealPointerUp(e, true);
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
- type: 'global_' + e.type
- })); //console.log('touchend length '+e.touches.length, this.touches.length)
- }
- }, {
- key: "onKeyDown",
- value: function onKeyDown(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onKeyDown');
- if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') return; //正在输入文字 或e.srcElement
- if (!this.containsMouse) return; //在别的ui上无效
- this.dispatchEvent({
- type: 'keydown',
- keyCode: e.keyCode,
- event: e
- });
- this.pressedKeys[e.keyCode] = true; // e.preventDefault();
- }
- }, {
- key: "onKeyUp",
- value: function onKeyUp(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onKeyUp');
- if (e.keyCode != void 0) {
- delete this.pressedKeys[e.keyCode];
- } else {
- this.pressedKeys = {};
- }
- e.preventDefault();
- }
- }, {
- key: "onDoubleClick",
- value: function onDoubleClick(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onDoubleClick');
- var consumed = false;
- var _iterator = _createForOfIteratorHelper$a(this.hoveredElements),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var hovered = _step.value;
- if (hovered._listeners && hovered._listeners['dblclick']) {
- hovered.object.dispatchEvent({
- type: 'dblclick',
- mouse: this.mouse,
- object: hovered.object
- });
- consumed = true;
- break;
- }
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- if (!consumed) {
- /* for (let inputListener of this.getSortedListeners()) {
- inputListener. */
- this.viewer.dispatchEvent({
- type: 'global_dblclick',
- mouse: this.mouse,
- object: null
- }); //}
- }
- this.needSingleClick = false; //add
- e.preventDefault();
- }
- }, {
- key: "onMouseClick",
- value: function onMouseClick(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onMouseClick');
- e.preventDefault();
- }
- }, {
- key: "dealPointerDown",
- value: function dealPointerDown(e, isTouch) {
- e.preventDefault(); //重新获取一下pointer, 因点击了浏览器的按钮展开列表时 move回来不会触发onmousemove,所以pointer是旧的
- if (isTouch) {
- var _this$updateTouchesIn = this.updateTouchesInfo(e);
- _this$updateTouchesIn.camera;
- var viewport = _this$updateTouchesIn.viewport;
- if (this.drag) {
- //因为触屏在按下前缺少pointermove所以要更新下
- this.drag.end = this.pointer.clone();
- }
- } else {
- var _this$getPointerInVie = this.getPointerInViewport(e.clientX, e.clientY);
- _this$getPointerInVie.camera;
- var viewport = _this$getPointerInVie.viewport;
- }
- this.dragViewport = this.hoverViewport = viewport;
- /* if(isTouch || !this.dragViewport.view.isFlying() && Potree.settings.intersectWhenHover && Potree.settings.editType != 'pano' ){//漫游点编辑如果拖拽前getIntersect旋转会延迟
- //isTouch必须更新 否则是旧的
- this.hoveredElements = this.getHoveredElements();
- let dontIntersect = false
- this.intersect = this.getIntersect({viewport, dontIntersect, clientX:e.clientX, clientY:e.clientY}) //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
- //this.intersect = this.getWholeIntersect()
- } */
- if (!viewport) return; //why add this?
- if (!this.drag) {
- var target = (isTouch || e.button == THREE.MOUSE.LEFT) && this.hoveredElements.find(function (el //只有左键能拖拽
- ) {
- return el.object._listeners && el.object._listeners['drag'] && el.object._listeners['drag'].length > 0;
- });
- if (target) {
- this.startDragging(target.object, {
- location: target.point
- });
- } else {
- this.startDragging(null);
- }
- }
- this.drag.intersectStart = this.intersect;
- if (!isTouch || e.touches.length == 1) {
- var consumed = false;
- var consume = function consume() {
- return consumed = true;
- }; //if (this.hoveredElements.length === 0) {
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'global_mousedown'
- }));
- var _iterator2 = _createForOfIteratorHelper$a(this.hoveredElements),
- _step2;
- try {
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
- var hovered = _step2.value;
- var object = hovered.object;
- object.dispatchEvent({
- type: 'mousedown',
- viewer: this.viewer,
- consume: consume
- });
- if (consumed) {
- break;
- }
- }
- } catch (err) {
- _iterator2.e(err);
- } finally {
- _iterator2.f();
- }
- }
- this.mouseDownMouse = this.mouse.clone();
- this.pointerDownTime = Date.now();
- }
- }, {
- key: "onMouseDown",
- value: function onMouseDown(e) {
- if (this.logMessages) console.log(this.constructor.name + ': onMouseDown');
- this.dealPointerDown(e);
- }
- }, {
- key: "getEventDesc",
- value: function getEventDesc(e, isTouch) {
- //搜集dispatchEvent要给的一般数据
- var o = {
- viewer: this.viewer,
- mouse: this.mouse,
- pointer: this.pointer,
- drag: this.drag,
- isTouch,
- dragViewport: this.dragViewport,
- hoverViewport: this.hoverViewport,
- // button: isTouch ? 0 : e.button,
- //intersectPoint:this.intersectPoint,
- hoveredElement: this.hoveredElements[0],
- intersect: this.intersect //this.getWholeIntersect() , //可能包含mesh上的,针对融合页面
- };
- if (e) {
- o.isAtDomElement = e.target == this.domElement;
- }
- if (isTouch) {
- o.touches = this.touches;
- } else if (e) {
- o.button = e.button;
- o.buttons = e.buttons;
- }
- return o;
- }
- }, {
- key: "dealPointerUp",
- value: function dealPointerUp(e, isTouch) {
- var _this3 = this;
- if (!this.drag) {
- // 在canvas外mousedown
- return;
- }
- this.drag.end.copy(this.pointer);
- if (isTouch && e.touches.length >= 1) {
- return;
- }
- var now = Date.now();
- if (this.logMessages) console.log(this.constructor.name + ': onMouseUp');
- e.preventDefault();
- var pressDistance = this.mouseDownMouse.distanceTo(this.mouse);
- var pressTime = now - this.pointerDownTime;
- this.drag.pointerDelta.length() == 0; //this.getNormalizedDrag().length() === 0;
- var consumed = false;
- var consume = function consume() {
- return consumed = true;
- };
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'global_mouseup',
- pressDistance,
- consume
- }));
- if (this.hoveredElements.length > 0) {
- var hovered = this.hoveredElements.map(function (e) {
- return e.object;
- }).find(function (e) {
- return e._listeners && e._listeners['mouseup'];
- });
- if (hovered) {
- hovered.dispatchEvent({
- type: 'mouseup',
- viewer: this.viewer,
- consume: consume
- });
- }
- }
- if (this.drag) {
- //拖拽结束
- if (this.drag.object
- /* && e.button == THREE.MOUSE.LEFT */
- ) {
- //add LEFT
- if (this.logMessages) console.log("".concat(this.constructor.name, ": drop ").concat(this.drag.object.name));
- this.drag.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'drop',
- pressDistance
- }));
- } else {
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'global_drop',
- pressDistance
- }));
- } // check for a click
- if (pressDistance < clickMaxDragDis && pressTime < clickMaxPressTime && !e.unableClick) {
- var clickElement;
- if (this.hoveredElements) {
- clickElement = this.hoveredElements.find(function (e) {
- return e.object._listeners['click'];
- });
- if (clickElement) {
- var canceled;
- var cancel = function cancel() {
- return canceled = true;
- }; //console.log('clickElement',clickElement)
- if (this.logMessages) console.log("".concat(this.constructor.name, ": click ").concat(clickElement.name));
- clickElement.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'click',
- pressDistance,
- cancel,
- consume
- }));
- if (canceled) {
- //比如只需要右键的话,可以忽视左键的点击
- clickElement = null;
- }
- }
- }
- var selectable;
- if (
- /* !consumed && */
- !this.fixSelection) {
- if (e.button === THREE.MOUSE.LEFT) {
- //if (noMovement) {
- selectable = this.hoveredElements.find(function (el) {
- return el.object._listeners && el.object._listeners['select'];
- });
- if (selectable) {
- selectable = selectable.object;
- if (this.isSelected(selectable)) {
- this.deselectAll();
- } else {
- this.deselectAll();
- this.toggleSelection(selectable);
- }
- consumed = true; //add
- } else {
- if (this.selection.length > 0) consumed = true; //add 取消选择后,阻断后续
- this.deselectAll();
- } //}
- } else if (e.button === THREE.MOUSE.RIGHT
- /* && noMovement */
- ) {
- this.deselectAll();
- }
- }
- var desc = this.getEventDesc(e, isTouch);
- if (!consumed) {
- this.viewer.dispatchEvent(Object.assign(desc, {
- type: 'global_click',
- pressDistance,
- clickElement: clickElement
- /* || selectable */
- ,
- consume
- }));
- } //增加 单击:
- this.needSingleClick = true;
- consumed || setTimeout(function () {
- if (_this3.needSingleClick) {
- _this3.viewer.dispatchEvent(Object.assign(desc, {
- type: 'global_single_click',
- pressDistance,
- clickElement
- }));
- }
- }, doubleClickTime + 1); //自行执行双击:
- if (!consumed && now - this.lastClickTime < doubleClickTime) {
- this.onDoubleClick(e);
- }
- consumed || (this.lastClickTime = now);
- }
- this.drag = null;
- }
- this.dragViewport = null;
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(e) {
- this.dealPointerUp(e);
- }
- }, {
- key: "deselectAll",
- value: function deselectAll() {}
- }, {
- key: "isSelected",
- value: function isSelected() {}
- }, {
- key: "getPointerInViewport",
- value: function getPointerInViewport(clientX, clientY, viewForceAt, pointer) {
- var _this4 = this;
- var rect = this.domElement.getBoundingClientRect();
- var x = clientX - rect.left;
- var y = clientY - rect.top;
- var camera;
- var viewport;
- pointer = pointer || this.pointer; //if(this.viewer.viewports || viewForceAt){
- var getDimension = function getDimension(view) {
- var left = Math.ceil(_this4.domElement.clientWidth * view.left),
- bottom = Math.ceil(_this4.domElement.clientHeight * view.bottom),
- width = Math.ceil(_this4.domElement.clientWidth * view.width),
- height = Math.ceil(_this4.domElement.clientHeight * view.height),
- top = _this4.domElement.clientHeight - bottom - height;
- return {
- left,
- bottom,
- width,
- height,
- top
- };
- };
- var getView = function getView(view, left, bottom, width, height, top) {
- _this4.mouse.set(x - left, y - top);
- math$2.convertScreenPositionToNDC(_this4.mouse.x, _this4.mouse.y, pointer, _this4.viewer.domElement); //console.log('更新pointer2',this.pointer.toArray())
- camera = view.camera;
- viewport = view;
- };
- if (viewForceAt) {
- var _getDimension = getDimension(viewForceAt),
- _left = _getDimension.left,
- _bottom = _getDimension.bottom,
- _width = _getDimension.width,
- _height = _getDimension.height,
- _top = _getDimension.top;
- getView(viewForceAt, _left, _bottom, _width, _height, _top);
- } else {
- var length = this.viewer.viewports.length; //var getif = false
- for (var i = 0; i < length; i++) {
- var view = this.viewer.viewports[i];
- if (!view.active) continue;
- var _getDimension2 = getDimension(view),
- left = _getDimension2.left,
- bottom = _getDimension2.bottom,
- width = _getDimension2.width,
- height = _getDimension2.height,
- top = _getDimension2.top;
- if (x >= left && x <= left + width && y >= top && y <= top + height) {
- getView(view, left, bottom, width, height, top); //getif = true
- break;
- }
- }
- }
- return {
- camera,
- viewport,
- pointer
- };
- }
- }, {
- key: "ifBlockedByIntersect",
- value: function ifBlockedByIntersect() {
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- point = _ref.point,
- _ref$margin = _ref.margin,
- margin = _ref$margin === void 0 ? 0 : _ref$margin,
- cameraPos = _ref.cameraPos,
- pickWindowSize = _ref.pickWindowSize,
- pano = _ref.pano,
- useDepthTex = _ref.useDepthTex,
- viewport = _ref.viewport;
- //某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
- viewport = viewport || this.hoverViewport || viewer.mainViewport;
- var intersect = this.getIntersect({
- viewport,
- onlyGetIntersect: true,
- pickWindowSize,
- useDepthTex,
- point,
- cameraPos,
- pano
- });
- var cameraPos_ = !cameraPos && pano ? pano.position : cameraPos || viewport.view.position;
- if (intersect && intersect.distance + margin <= point.distanceTo(cameraPos_)) {
- return intersect; //被遮挡
- } //点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
- }
- }, {
- key: "onMouseMove",
- value: function onMouseMove(e) {
- return this.dealPointerMove(e);
- }
- }, {
- key: "dealPointerMove",
- value: function dealPointerMove(e, isTouch) {
- if (this.interactHistory.move) return; //一帧只触发一次
- this.interactHistory.move = 1;
- if (isTouch) {
- var _this$updateTouchesIn2 = this.updateTouchesInfo(e);
- _this$updateTouchesIn2.camera;
- var viewport = _this$updateTouchesIn2.viewport;
- } else {
- var _this$getPointerInVie2 = this.getPointerInViewport(e.clientX, e.clientY, this.dragViewport);
- _this$getPointerInVie2.camera;
- var viewport = _this$getPointerInVie2.viewport;
- }
- this.hoverViewport = viewport;
- if (!viewport) return; //刚变化viewport时会找不到
- var isFlying = player$k.flying; //this.viewer.viewports.some(e=>e.view.isFlying()) || viewer.scene.cameraAnimations.some(c=>c.onUpdate)
- var intersect;
- if (e.onlyGetIntersect) {
- return intersect;
- }
- e.preventDefault();
- if (this.drag) {
- //有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)
- this.drag.mouse = isTouch ? 1 : e.buttons; //add:
- this.drag.pointerDelta.subVectors(this.pointer, this.drag.end);
- this.drag.end.copy(this.pointer);
- var dragConsumed = false;
- if (this.drag.object && (e.buttons == Buttons.NONE || !this.drag.notPressMouse)) {
- //如果是本不需要按鼠标的拖拽,但按下了鼠标,就不执行这段(改为拖拽场景,如添加测量时突然拖拽画面)
- if (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name);
- var refused;
- this.drag.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'drag',
- //拖拽物体
- refuse: function refuse() {
- refused = true;
- }
- }));
- if (!refused) dragConsumed = true; //viewer.dispatchEvent('content_changed')
- }
- if (!dragConsumed) {
- if (this.logMessages) console.log(this.constructor.name + ': drag: ');
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'global_drag' //拖拽画面
- //consume: () => {dragConsumed = true;}
- }));
- }
- }
- if (!isTouch || e.touches.length == 1) {
- if ((!this.drag || this.drag.notPressMouse) && !isFlying) {
- var _curr$_listeners;
- /* let blacklist = this.drag && this.drag */
- var hoveredElements = this.getHoveredElements();
- if (hoveredElements.length > 0) {
- var names = hoveredElements.map(function (h) {
- return h.object.name;
- }).join(', ');
- if (this.logMessages) console.log("".concat(this.constructor.name, ": onMouseMove; hovered: '").concat(names, "'"));
- }
- var cur = hoveredElements.find(function (a) {
- return a.object;
- });
- var curr = cur && cur.object; //hoveredElements.map(a => a.object).find(a => true);//只取第一个
- var prev = this.lastMouseoverElement; //this.hoveredElements.map(a => a.object).find(a => true);
- if (curr !== prev) {
- if (curr) {
- if (this.logMessages) console.log("".concat(this.constructor.name, ": mouseover: ").concat(curr.name));
- curr.dispatchEvent({
- type: 'mouseover',
- object: curr,
- hoveredElement: cur
- });
- }
- if (prev) {
- if (this.logMessages) console.log("".concat(this.constructor.name, ": mouseleave: ").concat(prev.name));
- prev.dispatchEvent({
- type: 'mouseleave',
- object: prev
- });
- }
- this.lastMouseoverElement = curr; //viewer.dispatchEvent('content_changed')
- }
- if (curr !== null && curr !== void 0 && (_curr$_listeners = curr._listeners) !== null && _curr$_listeners !== void 0 && _curr$_listeners.mousemove) {
- if (curr) {
- //xzw改为只取第一个
- curr.dispatchEvent(Object.assign(this.getEventDesc(e), {
- type: 'mousemove',
- hoveredElement: cur
- }));
- }
- }
- this.hoveredElements = hoveredElements;
- } //this.intersect = this.getWholeIntersect()
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'global_mousemove'
- }));
- this.containsMouse = true;
- }
- }
- }, {
- key: "onMouseWheel",
- value: function onMouseWheel(e) {
- var _this5 = this;
- if (!this.enabled) return;
- if (this.logMessages) console.log(this.constructor.name + ': onMouseWheel');
- e.preventDefault();
- var delta = 0;
- if (e.wheelDelta !== undefined) {
- // WebKit / Opera / Explorer 9
- delta = e.wheelDelta;
- } else if (e.detail !== undefined) {
- // Firefox
- delta = -e.detail;
- }
- var ndelta = Math.sign(delta); // this.wheelDelta += Math.sign(delta);
- if (!this.hoverViewport) {
- //调试手机版时会无
- var _this$getPointerInVie3 = this.getPointerInViewport(e.clientX, e.clientY),
- viewport = _this$getPointerInVie3.viewport;
- this.hoverViewport = viewport;
- }
- if (this.hoveredElement) {
- this.hoveredElement.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
- type: 'mousewheel',
- delta: ndelta,
- object: this.hoveredElement.object
- }));
- } else {
- this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e), {
- type: 'global_mousewheel',
- delta: ndelta
- }));
- }
- setTimeout(function () {
- _this5.dealPointerMove(e); //add 在更新完view后重新获取intersect 和 drag
- }, 1); //只延迟1会崩溃吗
- }
- }, {
- key: "startDragging",
- value: function startDragging(object) {
- var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
- var name = object ? object.name : 'no name';
- if (this.logMessages) console.log("".concat(this.constructor.name, ": startDragging: '").concat(name, "'"));
- this.drag = {
- start: this.pointer.clone(),
- end: this.pointer.clone(),
- pointerDelta: new THREE.Vector2(0, 0),
- object: object,
- hoverViewport: this.hoverViewport,
- //会变化
- dragViewport: this.hoverViewport //不变
- };
- if (args) {
- for (var _i = 0, _Object$keys = Object.keys(args); _i < _Object$keys.length; _i++) {
- var key = _Object$keys[_i];
- this.drag[key] = args[key];
- }
- }
- if (object) {
- object.dispatchEvent(Object.assign(this.getEventDesc(), {
- type: 'startDragging'
- }));
- }
- }
- }, {
- key: "registerInteractiveObject",
- value: function registerInteractiveObject(object) {
- this.interactiveObjects.add(object);
- }
- }, {
- key: "removeInteractiveObject",
- value: function removeInteractiveObject(object) {
- this.interactiveObjects.delete(object);
- }
- }, {
- key: "registerInteractiveScene",
- value: function registerInteractiveScene(scene) {
- var index = this.interactiveScenes.indexOf(scene);
- if (index === -1) {
- this.interactiveScenes.push(scene);
- }
- }
- }, {
- key: "unregisterInteractiveScene",
- value: function unregisterInteractiveScene(scene) {
- var index = this.interactiveScenes.indexOf(scene);
- if (index > -1) {
- this.interactiveScenes.splice(index, 1);
- }
- }
- }, {
- key: "getHoveredElement",
- value: function getHoveredElement() {
- var hoveredElements = this.getHoveredElements();
- if (hoveredElements.length > 0) {
- return hoveredElements[0];
- } else {
- return null;
- }
- }
- }, {
- key: "getHoveredElements",
- value: function getHoveredElements(interactables, dontCheckDis, raycaster) {
- var _this6 = this;
- if (!interactables) {
- (function () {
- var scenes = _this6.hoverViewport.interactiveScenes || _this6.interactiveScenes.concat(_this6.scene);
- var interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
- interactables = [];
- var _iterator3 = _createForOfIteratorHelper$a(scenes),
- _step3;
- try {
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
- var scene = _step3.value;
- scene.traverseVisible(function (node) {
- //检测加了侦听的object
- if (node._listeners && node.visible && !_this6.blacklist.has(node)) {
- var hasInteractableListener = interactableListeners.filter(function (e) {
- return node._listeners[e] !== undefined;
- }).length > 0;
- if (hasInteractableListener) {
- interactables.push(node);
- }
- }
- });
- }
- } catch (err) {
- _iterator3.e(err);
- } finally {
- _iterator3.f();
- }
- })();
- } else interactables = interactables.filter(function (e) {
- return e.visible;
- });
- var camera = this.hoverViewport.camera;
- if (!raycaster) {
- var ray = mouseToRay(this.pointer, camera);
- raycaster = new Raycaster();
- raycaster.ray.set(ray.origin, ray.direction);
- raycaster.camera = camera; //add
- }
- if (camera.type == 'OrthographicCamera') {
- //使无论多远,threshold区域都是一样宽的
- raycaster.params.Line.threshold = 20 / camera.zoom;
- } else {
- raycaster.params.Line.threshold = 0.04; //相对长度
- }
- raycaster.params.Line2 = {
- threshold: browser$1.isMobile() ? 100 : 20
- }; //拓宽的lineWidth
- //raycaster.layers.enableAll()//add
- var layers = ['DEFAULT']; //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
- //if(Potree.settings.mergeType2 && Potree.settings.modelSkybox && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.hasDepthTex) layers.push('skybox')//model变成skybox了
- common$1.setCameraLayers(raycaster, layers, this.hoverViewport && this.hoverViewport.extraEnableLayers); //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
- //viewer.dispatchEvent( {type:'raycaster', viewport: this.hoverViewport, raycaster, viewer:this.viewer, interactables })//add
- var intersections = raycaster.intersectObjects(interactables, true, null, true); //原本是false 检测不到children
- intersections.slice();
- if (this.intersect && this.intersect.distance != void 0 && !dontCheckDis) {
- //add
- intersections = intersections.filter(function (e) {
- var _material$defines;
- if (_this6.intersect.hoveredElement && _this6.intersect.hoveredElement.oriObject == e.object) return true;
- var material = e.object.material;
- 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是否需要考虑?
- });
- }
- intersections = intersections.map(function (e) {
- //add 转化为interactables
- var object = e.object;
- do {
- if (interactables.includes(object)) {
- e.oriObject = e.object;
- e.object = object;
- break;
- }
- object = object.parent;
- } while (object);
- return e;
- }); //add for测量线,在检测到sphere时优先选中sphere而非线
- //intersections = intersections.sort(function(a,b){return b.object.renderOrder-a.object.renderOrder}) // 降序
- intersections = intersections.sort(function (a, b) {
- var order2 = b.object.pickOrder || 0;
- var order1 = a.object.pickOrder || 0;
- return order2 - order1;
- }); // 降序
- //console.log('getHoveredElement ', intersections)
- return intersections;
- }
- }, {
- key: "update",
- value: function update(delta) {}
- }, {
- key: "getMouseDirection",
- value: function getMouseDirection(pointer) {
- //add
- pointer = pointer || this.pointer;
- var camera = this.hoverViewport.camera;
- var t = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
- i = new THREE.Vector3(pointer.x, pointer.y, 1).unproject(camera);
- return {
- origin: t,
- direction: i.clone().sub(t).normalize()
- };
- }
- }]);
- return InputHandler;
- }(THREE.EventDispatcher);
- /**
- * @author alteredq / http://alteredqualia.com/
- */
- var Pass = function Pass() {
- // if set to true, the pass is processed by the composer
- this.enabled = true; // if set to true, the pass indicates to swap read and write buffer after rendering
- this.needsSwap = true; // if set to true, the pass clears its buffer before rendering
- this.clear = false; // if set to true, the result of the pass is rendered to screen
- this.renderToScreen = false;
- };
- Object.assign(Pass.prototype, {
- setSize: function setSize(width, height) {},
- render: function render(renderer, writeBuffer, readBuffer, delta, maskActive) {
- console.error('THREE.Pass: .render() must be implemented in derived pass.');
- }
- });
- var ShaderPass = function ShaderPass(shader, textureID) {
- Pass.call(this);
- this.textureID = textureID !== undefined ? textureID : 'tDiffuse';
- if (shader instanceof THREE.ShaderMaterial) {
- this.uniforms = shader.uniforms;
- this.material = shader;
- } else if (shader) {
- this.uniforms = THREE.UniformsUtils.clone(shader.uniforms);
- this.material = new THREE.ShaderMaterial({
- defines: Object.assign({}, shader.defines),
- uniforms: this.uniforms,
- vertexShader: shader.vertexShader,
- fragmentShader: shader.fragmentShader,
- transparent: true //add
- });
- }
- this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
- this.scene = new THREE.Scene();
- this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null);
- this.quad.frustumCulled = false; // Avoid getting clipped
- this.scene.add(this.quad);
- };
- ShaderPass.prototype = Object.assign(Object.create(Pass.prototype), {
- constructor: ShaderPass,
- render: function render(scene, camera, viewports, renderer, writeBuffer, readBuffer, delta, maskActive) {
- var oldTarget = renderer.getRenderTarget();
- /* if(this.readTarget){ //add
- readBuffer = oldTarget
- } */
- if (this.uniforms[this.textureID]) {
- this.uniforms[this.textureID].value = readBuffer.texture;
- }
- this.quad.material = this.material;
- if (this.renderToScreen) {
- renderer.render(this.scene, this.camera);
- } else {
- renderer.setRenderTarget(writeBuffer);
- if (this.clear) renderer.clear();
- renderer.render(this.scene, this.camera);
- renderer.setRenderTarget(oldTarget);
- }
- }
- });
- /**
- * Created by Wandergis on 2015/7/8.
- * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
- */
- var coordtransform = createCommonjsModule(function (module) {
- //UMD魔法代码
- // if the module has no dependencies, the above pattern can be simplified to
- (function (root, factory) {
- if (module.exports) {
- // Node. Does not work with strict CommonJS, but
- // only CommonJS-like environments that support module.exports,
- // like Node.
- module.exports = factory();
- } else {
- // Browser globals (root is window)
- root.coordtransform = factory();
- }
- })(commonjsGlobal, function () {
- //定义一些常量
- var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
- var PI = 3.1415926535897932384626;
- var a = 6378245.0;
- var ee = 0.00669342162296594323;
- /**
- * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
- * 即 百度 转 谷歌、高德
- * @param bd_lon
- * @param bd_lat
- * @returns {*[]}
- */
- var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) {
- var bd_lon = +bd_lon;
- var bd_lat = +bd_lat;
- var x = bd_lon - 0.0065;
- var y = bd_lat - 0.006;
- var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
- var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
- var gg_lng = z * Math.cos(theta);
- var gg_lat = z * Math.sin(theta);
- return [gg_lng, gg_lat];
- };
- /**
- * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
- * 即谷歌、高德 转 百度
- * @param lng
- * @param lat
- * @returns {*[]}
- */
- var gcj02tobd09 = function gcj02tobd09(lng, lat) {
- var lat = +lat;
- var lng = +lng;
- var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
- var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
- var bd_lng = z * Math.cos(theta) + 0.0065;
- var bd_lat = z * Math.sin(theta) + 0.006;
- return [bd_lng, bd_lat];
- };
- /**
- * WGS84转GCj02
- * @param lng
- * @param lat
- * @returns {*[]}
- */
- var wgs84togcj02 = function wgs84togcj02(lng, lat) {
- var lat = +lat;
- var lng = +lng;
- if (out_of_china(lng, lat)) {
- return [lng, lat];
- } else {
- var dlat = transformlat(lng - 105.0, lat - 35.0);
- var dlng = transformlng(lng - 105.0, lat - 35.0);
- var radlat = lat / 180.0 * PI;
- var magic = Math.sin(radlat);
- magic = 1 - ee * magic * magic;
- var sqrtmagic = Math.sqrt(magic);
- dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI);
- dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI);
- var mglat = lat + dlat;
- var mglng = lng + dlng;
- return [mglng, mglat];
- }
- };
- /**
- * GCJ02 转换为 WGS84
- * @param lng
- * @param lat
- * @returns {*[]}
- */
- var gcj02towgs84 = function gcj02towgs84(lng, lat) {
- var lat = +lat;
- var lng = +lng;
- if (out_of_china(lng, lat)) {
- return [lng, lat];
- } else {
- var dlat = transformlat(lng - 105.0, lat - 35.0);
- var dlng = transformlng(lng - 105.0, lat - 35.0);
- var radlat = lat / 180.0 * PI;
- var magic = Math.sin(radlat);
- magic = 1 - ee * magic * magic;
- var sqrtmagic = Math.sqrt(magic);
- dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI);
- dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI);
- var mglat = lat + dlat;
- var mglng = lng + dlng;
- return [lng * 2 - mglng, lat * 2 - mglat];
- }
- };
- var transformlat = function transformlat(lng, lat) {
- var lat = +lat;
- var lng = +lng;
- 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));
- ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
- ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
- return ret;
- };
- var transformlng = function transformlng(lng, lat) {
- var lat = +lat;
- var lng = +lng;
- var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
- ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
- ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
- return ret;
- };
- /**
- * 判断是否在国内,不在国内则不做偏移
- * @param lng
- * @param lat
- * @returns {boolean}
- */
- var out_of_china = function out_of_china(lng, lat) {
- var lat = +lat;
- var lng = +lng; // 纬度3.86~53.55,经度73.66~135.05
- return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
- };
- return {
- bd09togcj02: bd09togcj02,
- gcj02tobd09: gcj02tobd09,
- wgs84togcj02: wgs84togcj02,
- gcj02towgs84: gcj02towgs84
- };
- });
- });
- 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); }; }
- 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; } }
- var mapHeight = 10;
- var panosHeight = 11;
- var cursorHeight = 20; //比地图高就行
- var cameraHeight = 100;
- new THREE.TextureLoader();
- var planeGeo$3 = new THREE.PlaneBufferGeometry(1, 1);
- var markerSize = 1;
- var mapBG = '#F5F5F5';
- var initCameraFeildWidth = 50;
- var panoMarkerMats;
- var player$j, transform; // 84坐标转高德 (国外地区用84,所以地理注册时填的是84,我这需要转成高德)
- var wgs84ToAMap = function wgs84ToAMap(pos) {
- var latlng = coordtransform.wgs84togcj02(pos.x, pos.y);
- return {
- x: latlng[0],
- y: latlng[1]
- };
- }; // 高德坐标转84
- var aMapToWgs84 = function aMapToWgs84(pos) {
- var latlng = coordtransform.gcj02towgs84(pos.x, pos.y);
- return {
- x: latlng[0],
- y: latlng[1]
- };
- };
- var AMapWith84 = {
- aMapToWgs84,
- wgs84ToAMap
- }; //地图的camera依然是y朝上,scene旋转90度。地图要做到laser中y朝上,x朝右的效果,就要z朝下(地图平面的),x朝右,相机方向固定。
- var tranSceneToMap,
- orientation = 0;
- var MapViewer = /*#__PURE__*/function (_ViewerBase) {
- _inherits(MapViewer, _ViewerBase);
- var _super = _createSuper$18(MapViewer);
- function MapViewer(dom, _player) {
- var _this;
- _classCallCheck(this, MapViewer);
- if (!dom) {
- dom = document.createElement('div');
- document.getElementsByTagName('body')[0].appendChild(dom);
- dom.style.width = '300px';
- dom.style.height = '200px';
- dom.style.position = 'fixed';
- dom.style.right = 0, dom.style.top = 0;
- dom.style['z-index'] = 10000;
- dom.style.background = '#fff';
- }
- _this = _super.call(this, dom, {
- clearColor: '#F5F5F5',
- name: 'mapViewer',
- antialias: true
- });
- player$j = _player;
- _this.$app = player$j.$app; //因context的preserveDrawingBuffer为false之后,canvas渲染多个viewport时会自动clear,所以若不渲染就会是空的。所以没有变化时就直接拷贝buffer好了。
- /* this.copyPass = new ShaderPass(THREE.CopyShader)
- this.copyBuffer = new THREE.WebGLRenderTarget(100, 100, {
- minFilter: THREE.LinearFilter,
- magFilter: THREE.LinearFilter,
- format: THREE.RGBAFormat,
- stencilBuffer: false,
- }) */
- var metadata = player$j.$app.store.getValue('metadata');
- var entityData = metadata.tiledMap && metadata.tiledMap[0];
- if (entityData) {
- _this.visible = true;
- player$j.$app.core.get('SceneRenderer').addComponent(_assertThisInitialized(_this));
- _this.initScene();
- _this.needRender_ = false;
- _this.mapLayer = new MapLayer(_assertThisInitialized(_this), _this.viewports[0]);
- _this.scene.rotation.x = -Math.PI / 2; //场景里的内容改为z朝上
- _this.scene.add(_this.mapLayer.sceneGroup);
- _this.mapLayer.sceneGroup.position.setZ(mapHeight);
- _this.scene.updateMatrixWorld();
- _this.mapRatio = 0.5;
- _this.splitDir = 'leftRight';
- _this.renderMeasure = false;
- _this.initProjection(entityData); //viewer.scene.addEventListener("360_images_added", this.addPanos.bind(this))
- _this.addPanos();
- _this.addEventListener('global_click', function (e) {
- if (!e.isTouch && e.button != THREE.MOUSE.LEFT) return;
- _this.updateClosestPano(e.pointer);
- });
- _this.addEventListener('add', function (e) {
- //添加其他mesh
- _this.scene.add(e.object);
- common$1.setObjectLayers(e.object, 'DEFAULT');
- });
- /* viewer.addEventListener('allLoaded',()=>{
- this.setViewLimit('standard')
- }) */
- player$j.on('update', function (e) {
- e.lastFrameChanged && _this.updateCursor();
- });
- player$j.on('startTransition', function (e) {
- //console.log(e)
- _this.moveTo(e.pano.position, e.duration, e.easeFun, e.progress);
- });
- setTimeout(function () {
- _this.mapLayer.needUpdate = true;
- }, 1); //this.loadEntity()
- } else {
- //产品说没数据时可能没准备好,给个提示
- var src = texture.getImageURL('images/map_no_location.png');
- _this.renderer.domElement.style['background-image'] = "url(".concat(src, ")");
- _this.renderer.domElement.style['background-position'] = "center";
- if (config$6.view) {
- _this.renderer.domElement.style['background-size'] = "72%";
- }
- setTimeout(function () {
- var btn = _this.domElement.querySelector('.minimap-scale-btn');
- btn && (btn.style.display = 'none');
- btn = _this.domElement.querySelector('.tile-btn');
- btn && (btn.style.display = 'none');
- }, 1);
- console.log('产品说没数据时可能没准备好,给个提示, no tiledMap');
- }
- return _this;
- } // lerp.vector(this.controls.target, endPos)
- _createClass(MapViewer, [{
- key: "moveTo",
- value: function moveTo(endPos, duration, easeFun) {
- var _this2 = this;
- transitions$1.cancelById('mapCamMove');
- var startPos = this.camera.position.clone(); //player.currentPano.position
- transitions$1.start(function (progress, delta) {
- //progress = startProgress + progress * (1 - startProgress)//如果用类似player里的progress,startPos必须是上个点位,开始移动会先瞬移到该点位。目前不用这个progress好像也没问题
- _this2.controls.target.copy(startPos);
- lerp.vector(_this2.controls.target, endPos)(progress);
- _this2.camera.position.addVectors(_this2.controls.target, _this2.controls.offset);
- }, duration, null, 0, easeFun, 'mapCamMove', 'mapCamMove');
- }
- }, {
- key: "needRender",
- get: function get() {
- return this.needRender_;
- },
- set: function set(n) {
- this.needRender_ = n; //n && (this.viewports[0].needRender = true) //使attachedToViewer时在renderDefault中可渲染
- }
- }, {
- key: "mapChanged",
- get: function get() {
- return this.mapChanged_;
- },
- set: function set(c) {
- //镜头移动、地图内容改变都会为true
- this.mapChanged_ = c;
- c && (this.needRender = true);
- }
- }, {
- key: "waitLoadDone",
- value: function waitLoadDone(callback) {
- var _this3 = this;
- //确保加载完后执行
- var timer; //等待一段时间看有没有新加载的tile,如果超过这个时间没有就不等了,算加载结束
- var pauseCountDown = function pauseCountDown() {
- //重新等待加载结束,中断倒计时
- clearTimeout(timer); //console.log('pauseCountDown')
- };
- var freshCountDown = function freshCountDown() {
- //刷新倒计时
- //console.log('freshCountDown')
- clearTimeout(timer);
- timer = setTimeout(function () {
- _this3.mapLayer.removeEventListener('loadDone', freshCountDown);
- _this3.mapLayer.removeEventListener('startLoad', pauseCountDown);
- callback();
- }, document.hidden ? 5000 : 500);
- };
- this.mapLayer.addEventListener('loadDone', freshCountDown);
- this.mapLayer.addEventListener('startLoad', pauseCountDown);
- if (this.mapLayer.loadingInProgress == 0) {
- freshCountDown();
- }
- }
- }, {
- key: "initScene",
- value: function initScene() {
- this.domElement.clientWidth;
- this.domElement.clientHeight; //let aspect = width / height
- 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);
- //this.camera.zoom = width / w //zoom越大视野越小
- this.camera.position.set(0, cameraHeight, 0);
- this.camera.up.set(0, 1, 0);
- this.camera.updateProjectionMatrix();
- this.camera.updateMatrixWorld();
- var viewport = new Viewport(this.camera, {
- left: 0,
- bottom: 0,
- width: 1,
- height: 1,
- name: 'mapViewport'
- });
- /* viewport.addEventListener('resize', () => {
- this.copyBuffer.setSize(viewport.resolution2.x, viewport.resolution2.y)
- }) */
- this.viewports = [viewport];
- var far = 1000;
- var moveBound = new THREE.Box3(new THREE.Vector3(-far, -far, -far), new THREE.Vector3(far, far, far));
- this.controls = new FloorplanControls(this.camera, this.domElement, this);
- this.controls.mouseActions[2] = ControlActions.PAN;
- this.controls.touchActions[2] = ControlActions.PAN_DOLLY; //原ROTATE_DOLLY ,试试改了可以不,不能就DOLLY
- this.controls.setBounds(moveBound); //setZoomBounds要写吗
- this.controls.zoomToContain(new THREE.Vector3(40, 40, 40), 1);
- this.controls.update(0);
- this.controls.enabled = true;
- this.controls.zoomSpeed = 5;
- this.ctlBindEvents(); //和激光有点不同,这改变平面图canvas大小时,地图也跟着缩放,因为 camera 机制不同,不会根据canvas宽高改变left等边界,也就保持内容大小和canvas大小相对一致。
- this.scene = new THREE.Scene();
- var cursor = new THREE.Mesh(planeGeo$3, new THREE.MeshBasicMaterial({
- transparent: true,
- opacity: 0.9,
- depthTest: false,
- //防止透明冲突
- map: common$1.loadTextureFromCache(texture.getImageURL('images/pic_location128.png'))
- }));
- cursor.position.set(0, 0, cursorHeight);
- cursor.name = 'cursor';
- this.cursor = cursor;
- this.scene.add(cursor); //common.setObjectLayers(this.cursor, 'DEFAULT' )
- this.inputHandler = new InputHandler(this, this.scene, player$j);
- this.inputHandler.name = 'mapInputHandler'; //this.inputHandler.addInputListener(this.controls);
- this.inputHandler.registerInteractiveScene(this.scene); //interactiveScenes
- this.viewports[0].interactiveScenes = this.inputHandler.interactiveScenes; //供viewer的inputHandler使用
- }
- }, {
- key: "ctlBindEvents",
- value: function ctlBindEvents() {
- var dom = this.domElement;
- dom.addEventListener('mousemove', this.controls.onMouseMove.bind(this.controls));
- dom.addEventListener('mousedown', this.controls.onMouseDown.bind(this.controls));
- dom.addEventListener('mouseup', this.controls.onMouseUp.bind(this.controls));
- dom.addEventListener('mousewheel', this.controls.onMouseWheel.bind(this.controls), {
- passive: false
- });
- dom.addEventListener('DOMMouseScroll', this.controls.onMouseWheel.bind(this.controls), {
- passive: false
- });
- dom.addEventListener('touchstart', this.controls.onTouchStart.bind(this.controls), {
- passive: false
- });
- dom.addEventListener('touchmove', this.controls.onTouchMove.bind(this.controls), {
- passive: false
- });
- dom.addEventListener('touchend', this.controls.onTouchEnd.bind(this.controls));
- dom.addEventListener('contextmenu', function (e) {
- e.preventDefault();
- });
- dom.addEventListener('pointerdown', this.controls.onPointerDown.bind(this.controls));
- dom.addEventListener('pointermove', this.controls.onPointerMove.bind(this.controls));
- dom.addEventListener('pointerup', this.controls.onPointerUp.bind(this.controls));
- /*dom.addEventListener('mouseover', this.controls.onMouseOver.bind(this.controls))
-
-
-
-
- dom.addEventListener('pointerout', this.controls.onPointerCancel.bind(this.controls))
- dom.addEventListener('pointercancel', this.controls.onPointerCancel.bind(this.controls))
- document.addEventListener('keydown', this.controls.onKeyDown.bind(this.controls))
- document.addEventListener('keyup', this.controls.onKeyUp.bind(this.controls)) */
- }
- }, {
- key: "updateCursor",
- value: function updateCursor() {
- if (!player$j.camera) return;
- var scale = math$2.getScaleForConstantSize({
- //规定下最小最大像素
- minSize: 80,
- maxSize: 200,
- nearBound: initCameraFeildWidth * 0.01,
- farBound: initCameraFeildWidth * 0.3,
- position: this.cursor.getWorldPosition(new THREE.Vector3()),
- resolution: this.viewports[0].resolution,
- //2
- dom: this.domElement,
- camera: this.camera
- });
- this.cursor.scale.set(scale, scale, scale); //当地图缩放时
- this.cursor.position.copy(tranSceneToMap.vec(player$j.camera.position)).setZ(cursorHeight); //当场景镜头旋转移动时
- //let yaw = math.getYawByDir(player.getDirection())
- this.cursor.rotation.z = player$j.yaw - Math.PI / 2 + orientation; //万一在数据集校准里倾斜模型怎么办?
- this.needRender = true;
- }
- }, {
- key: "addPanos",
- value: function addPanos(e) {
- var _this4 = this;
- var panosGroup = new THREE.Object3D();
- panosGroup.name = 'markers';
- panoMarkerMats = {
- default: new THREE.MeshBasicMaterial({
- transparent: true,
- opacity: 0.5,
- map: common$1.loadTextureFromCache(texture.getImageURL('images/map_marker.png')) //texLoader.load(Potree.resourcePath+'/textures/map_marker.png' ),
- }),
- selected: new THREE.MeshBasicMaterial({
- transparent: true,
- opacity: 1,
- map: common$1.loadTextureFromCache(texture.getImageURL('images/map_marker.png'))
- })
- };
- player$j.model.panos.list.forEach(function (pano) {
- if (!pano.isAligned()) return;
- pano.mapMarker = new THREE.Mesh(planeGeo$3, panoMarkerMats.default);
- pano.posOnMap = tranSceneToMap.vec(pano.position).setZ(0);
- pano.mapMarker.position.copy(pano.posOnMap);
- pano.mapMarker.scale.set(markerSize, markerSize, markerSize);
- pano.mapMarker.name = 'mapMarker';
- panosGroup.add(pano.mapMarker);
- var mouseover = function mouseover(e) {
- if (!e.byMap) {
- pano.mapMarker.material = panoMarkerMats.selected; //if(!e.byMainView) pano.dispatchEvent({type: "hoverOn", byMap:true})
- _this4.needRender = true;
- }
- };
- var mouseleave = function mouseleave(e) {
- if (!e.byMap) {
- pano.mapMarker.material = panoMarkerMats.default; //if(!e.byMainView) pano.dispatchEvent({type: "hoverOff", byMap:true})
- _this4.needRender = true;
- }
- };
- pano.mapMarker.addEventListener('mouseover', mouseover);
- pano.mapMarker.addEventListener('mouseleave', mouseleave);
- /* let onclick = (e)=>{
- player.flyToPano(pano)
- }
- pano.mapMarker.addEventListener('click', onclick); */
- });
- this.scene.add(panosGroup);
- panosGroup.position.z = panosHeight;
- this.panosGroup = panosGroup; // common.setObjectLayers(panosGroup, 'PANOMARKERS' )
- /* e.images.on('markersDisplayChange', (show)=>{
- panosGroup.visible = show
- this.needRender = true
- }) */
- //可视和marker一致,尤其针对多楼层
- player$j.on('flying.ended', function () {
- if (player$j.mode != 'panorama') return; //多层楼也只有一张平面图,飞出后怎么展示marker? 不好判断我先不处理
- setTimeout(function (e) {
- player$j.model.panos.list.forEach(function (pano) {
- if (pano.isAligned()) pano.mapMarker.visible = pano.marker.visible;
- });
- _this4.needRender = true;
- }, 100); //等marker透明度渐变到>0才可见
- }); //-------
- //this.fitPanosToViewport()
- //this.initFitView()
- }
- }, {
- key: "updateClosestPano",
- value: function updateClosestPano(pointer) {
- if (player$j.flying) return;
- var intersect = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera).setY(0);
- intersect = math$2.invertVisionVector(intersect); //z up
- var minDis = 400; //距离鼠标不能太远
- var disMap = new Map();
- var filterFuncs = [Panorama.filters.isPanoAligned(), //只走显示的点,否则会走到别的层
- function (pano) {
- var d =
- /* pano.position.clone().setY(0) */
- pano.posOnMap.distanceToSquared(intersect);
- if (d < minDis) {
- disMap.set(pano, d);
- return true;
- }
- }];
- var pano = player$j.model.panos.find(filterFuncs, [function (pano1, pano2) {
- return disMap.get(pano1) - disMap.get(pano2);
- }]);
- if (pano && pano != player$j.currentPano) {
- player$j.flyToPano(pano);
- }
- }
- }, {
- key: "update",
- value: function update(delta, force) {
- if (!this.visible || !tranSceneToMap) return;
- this.updateScreenSize();
- this.controls.update(delta);
- var changed = this.cameraChanged();
- if (this.started && (force || changed || this.mapLayer.needUpdate)) this.mapLayer.update();
- if (changed || force) {
- this.mapChanged = true;
- this.needRender = true;
- this.updateCursor(); //更改大小
- }
- this.render();
- }
- }, {
- key: "clear",
- value: function clear(params) {
- if (this.transparentBG) {
- this.renderer.setClearColor(0x000000, 0);
- } else {
- this.renderer.setClearColor(mapBG, 1);
- }
- (params.renderer || this.renderer).clear();
- }
- }, {
- key: "render",
- value: function render() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (!this.visible && !this.attachedToViewer || !this.needRender && !params.force) {
- //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
- return;
- }
- var renderer = params.renderer || this.renderer;
- this.clear(params);
- renderer.render(this.scene, this.camera);
- this.needRender = false;
- return true;
- } //拆成两次渲染,一个地图一个其他物体,且地图渲染后保存在buffer中,只有当地图变化后才重渲染。
- }, {
- key: "render1",
- value: function render1() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (!this.visible && !this.attachedToViewer || !this.needRender && !params.force) {
- //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
- return;
- } //viewer.addTimeMark('mapRender','start')
- var renderer = params.renderer || this.renderer;
- if (this.mapChanged) {
- //渲染地图背景
- renderer.setRenderTarget(this.copyBuffer);
- params.clear ? params.clear(params) : this.clear(params);
- common$1.setCameraLayers(this.camera, ['DEFAULT']);
- renderer.render(this.scene, this.camera);
- params.renderBG && params.renderBG(this.viewports[0]);
- this.mapChanged = false;
- renderer.setRenderTarget(params.target || null);
- }
- params.clear ? params.clear(params) : this.clear(params);
- this.copyPass.render(null, null, null, renderer, params.target || null, this.copyBuffer); //拷贝地图背景
- renderer.clearDepth(); //防止地图遮挡其他物体
- /*
- //绘制其他物体
- let layers = ['mapObjects' , 'bothMapAndScene', 'light' ]
- Potree.settings.showObjectsOnMap && layers.push('model')
- common.setCameraLayers(this.camera, layers) */
- //viewer.dispatchEvent({type: "render.begin", viewer: this, viewport:this.viewports[0], params });
- renderer.render(this.scene, this.camera);
- /* if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
- viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, viewport:this.viewports[0], renderer});
- } */
- renderer.setRenderTarget(null);
- this.needRender = false; //viewer.addTimeMark('mapRender','end')
- return true;
- }
- }, {
- key: "initProjection",
- value: function initProjection(entityData) {
- var _entity;
- var metadata = player$j.$app.store.getValue('metadata'); //if (metadata.orientation != void 0) {
- var entity;
- if (entityData) {
- this.setLonlat(entityData.location[0], entityData.location[1]
- /* 113.595007951539, 22.367294366944193 */
- );
- entity = this.mapLayer.addMapEntity(entityData
- /* , orientationUser */
- ); //没经纬度还显示地图吗?
- if (metadata.orientation != void 0) {
- //有控制点 rtk的话经纬度才准确,才显示地图,同laser
- this.mapLayer.addStreetMap();
- }
- this.started = true;
- this.mapLayer.initProjection(); //万一在数据集校准里倾斜模型怎么办?
- var dir = new THREE.Vector3(0, 1, 0).applyQuaternion(entity.quaternion.normalize()); //z up
- orientation = math$2.getYawByDir(math$2.convertVisionVector(dir)) - Math.PI / 2; //to y up
- } //SG-t-Jt3tIWYQNdp 113.59570167962725, 22.36665852470534
- /* let orientation = 0.02//-0.38548921292333205 //SG-t-1HLWAvLm651#/
- let rotMatrix = new THREE.Matrix4().makeRotationZ(orientation) */
- var rotQua = (_entity = entity) === null || _entity === void 0 ? void 0 : _entity.quaternion;
- if (!rotQua) {
- orientation = player$j.compass.angle; //???可??
- rotQua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), orientation);
- }
- tranSceneToMap = {
- //和laser不同的是,laser的模型和平面图完全对应,都旋转了;在这我不敢旋转模型,只能修改物体投射在map上的位置和朝向,使对应。(检验是否无误:飞到2d模式对比场景和map,cursor向上时要一致(地图保持上北))
- vec(pos) {
- var p = math$2.invertVisionVector(pos);
- p.applyQuaternion(rotQua); //.applyMatrix4(rotMatrix)
- return p;
- }
- };
- return true;
- }
- }, {
- key: "loadEntity",
- value: function loadEntity() {
- //test
- /* let data = {
- "id": "1846806671879966720",
- "file_path": "/testdata/SG-t-Jt3tIWYQNdp/data/bundle_SG-t-Jt3tIWYQNdp/building/map_tiles",
- "floor_id": 11,
- "map_size_m": 62.0,
- "max_depth": 3,
- "quadtree": "fcd33ce8f5abf1",
- "location": [ 113.59570167962725, 22.36665852470534, 0.0 ],
- "orientation": [ 0.7061519987398275, 0.0, 0.0, 0.7080602761599796 ],
- "tile_size_px": 256,
- "sceneCode": "SG-t-Jt3tIWYQNdp",
- "display": 1,
- "status": 0,
- "createTime": "2024-10-17 14:53:17"
- }
- let orientationUser = new THREE.Quaternion().copy({
- "x": 0,
- "y": 0,
- "z": 0.001349355904174845,
- "w": 0.9999990896189075
- })//laser 的 */
- var data = {
- id: '1905220000788647936',
- file_path: '/testdata/SG-t-1HLWAvLm651/data/bundle_SG-t-1HLWAvLm651/building/map_tiles',
- floor_id: 11,
- map_size_m: 124.0,
- max_depth: 4,
- quadtree: 'f8435e56f5118fcfa1bf23f34',
- location: [113.595007951539, 22.367294366944193, 6.949324108125],
- orientation: [0.829461419705237, 0.0, 0.0, 0.5585640099581897],
- tile_size_px: 256,
- sceneCode: 'SG-t-1HLWAvLm651',
- display: 1,
- status: 0,
- createTime: '2025-03-27 19:27:00'
- };
- var orientationUser = new THREE.Quaternion().copy({
- x: 0,
- y: 0,
- z: -0.19155339543800784,
- w: 0.9814821937743803
- });
- this.mapLayer.addMapEntity(data, orientationUser);
- } //对应激光场景 http://192.168.0.125:1804/mega/index.html?m=SG-hx-HBfpp585IXE 测试场景
- }, {
- key: "setLonlat",
- value: function setLonlat(lon, lat) {
- var locationLonLat = [lon, lat];
- if (AMapWith84 && config$6.mapCompany != 'google') {
- //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差. navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
- locationLonLat = AMapWith84.wgs84ToAMap({
- x: lon,
- y: lat
- });
- locationLonLat = [locationLonLat.x, locationLonLat.y];
- } //Map.js用的:
- 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');
- proj4.defs('LOCAL', '+proj=tmerc +ellps=WGS84 +lon_0=' + locationLonLat[0].toPrecision(15) + ' +lat_0=' + locationLonLat[1].toPrecision(15)); //高德坐标系
- proj4.defs('LOCAL_MAP', '+proj=tmerc +ellps=WGS84 +lon_0=' + locationLonLat[0].toPrecision(15) + ' +lat_0=' + locationLonLat[1].toPrecision(15)); //地图和本地一样
- proj4.defs('WGS84', '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs');
- transform = {
- lonlatToLocal: proj4('WGS84', 'LOCAL')
- };
- this.mapLayer.transform = transform;
- console.log("setLonlat ".concat(lon, ", ").concat(lat)); //see https://uat-laser.4dkankan.com/uat/index.html?m=SS-t-uMizHDioNE#/
- if (AMapWith84 && config$6.mapCompany != 'google') {
- //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
- var change = function change(transform) {
- var forward = transform.forward;
- var inverse = transform.inverse;
- transform.forward = function (e, not84) {
- var needTran = e.x == void 0;
- if (needTran) var a1 = {
- x: e[0],
- y: e[1]
- };else var a1 = e;
- var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
- if (needTran) {
- a = [a.x, a.y];
- e[2] != void 0 && (a[2] = e[2]);
- } else {
- e.z != void 0 && (a.z = e.z);
- }
- return forward(a);
- };
- transform.inverse = function (e, not84) {
- var needTran = e.x == void 0;
- var a = inverse(e);
- needTran && (a = {
- x: a[0],
- y: a[1]
- });
- a = not84 ? a : AMapWith84.aMapToWgs84(a);
- if (needTran) {
- a = [a.x, a.y];
- e[2] != void 0 && (a[2] = e[2]);
- } else {
- e.z != void 0 && (a.z = e.z);
- }
- return a;
- };
- };
- for (var f in transform) {
- change(transform[f]);
- } //注意:把几万米转成经纬度再转回来差值会很大
- }
- }
- }, {
- key: "show",
- value: function show() {
- if (this.visible) return;
- this.renderer.domElement.style.display = '';
- this.domElement.style.display = '';
- this.visible = true;
- this.update(1, true);
- }
- }, {
- key: "hide",
- value: function hide() {
- this.renderer.domElement.style.display = 'none';
- this.visible = false;
- }
- }, {
- key: "switchStyle",
- value: function switchStyle(style) {
- console.log('style', style);
- this.mapLayer.maps.find(function (e) {
- return e.name == 'map';
- }).switchStyle(style);
- }
- }, {
- key: "moveTo1",
- value: function moveTo1(endPosition, boundSize) {
- var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- var margin = arguments.length > 3 ? arguments[3] : undefined;
- var easeName = arguments.length > 4 ? arguments[4] : undefined;
- var callback = arguments.length > 5 ? arguments[5] : undefined;
- //前两个参数有xy即可
- var z = Math.max(Potree.config.map.cameraHeight, (endPosition.z || 0) + ((boundSize === null || boundSize === void 0 ? void 0 : boundSize.z) || 0) / 2 + 1);
- endPosition = new THREE.Vector3(endPosition.x, endPosition.y, z);
- this.view.moveOrthoCamera(this.viewports[0], {
- endPosition,
- boundSize,
- margin,
- callback
- }, duration, easeName);
- /* let endZoom, startZoom = this.camera.zoom
-
- //修改相机为bound中心,这样能看到全部(宽度范围内)
-
- this.view.setView({ position:endPosition, duration,
- callback:()=>{//done
-
- },
- onUpdate:(progress)=>{
- if(boundSize){
- let aspect = boundSize.x / boundSize.y
- let w, h;
-
- if(this.camera.aspect > aspect){//视野更宽则用bound的纵向来决定
- h = boundSize.y
- //w = h * this.camera.aspect
- endZoom = this.viewports[0].resolution.y / h
- }else{
- w = boundSize.x;
- //h = w / this.camera.aspect
- endZoom = this.viewports[0].resolution.x / w
- }
- //onUpdate时更新endzoom是因为画布大小可能更改
-
-
- this.camera.zoom = endZoom * progress + startZoom * (1 - progress)
- this.camera.updateProjectionMatrix()
- }
- },
-
- Easing:easeName
-
- }) */
- /* fitPanosToViewport(){//使所有漫游点占满viewport
- //var w = viewer.bound.boundSize.x;
- var boundSize = viewer.images360.bound.size.clone().multiplyScalar(1.1);
- boundSize.max(new THREE.Vector3(4,4,4))
- let endPosition = viewer.images360.bound.center.clone()
- this.moveTo(endPosition, boundSize, 0)
- }
-
- initFitView(){
- let dis = 5 , px = 70 //地图上px像素长度代表的距离为dis //px是手动缩放到5m后发现是这个长度
- let zoom = px / dis;
- this.camera.zoom = zoom
- this.moveTo(viewer.images360.position )
- this.camera.updateProjectionMatrix()
- }
- fitToDatasets(datasets){
- let bound = new THREE.Box3;
- datasets.forEach(e=>bound.union(e.bound))
- let center = bound.getCenter(new THREE.Vector3)
- let size = bound.getSize(new THREE.Vector3)
-
- this.moveTo(center, size, 200 ) //给duration是为了顺应视口大小改变,缓冲
- }*/
- }
- }]);
- return MapViewer;
- }(ViewerBase);
- var FEET_TO_INCHES_FACTOR = 12;
- var EIGHTHS_SYMBOLS = ['', '⅛', '¼', '⅜', '½', '⅝', '¾', '⅞']; //eighths 八分之……
- var UnitOfMeasurement = /*#__PURE__*/function () {
- //转化单位工具
- function UnitOfMeasurement(t, e, n, i) {
- _classCallCheck(this, UnitOfMeasurement);
- this.name = t, this.symbol = e, this.base = n, this.factor = i;
- }
- _createClass(UnitOfMeasurement, [{
- key: "toBase",
- value: function toBase(t) {
- //换算到base
- return t * this.factor;
- }
- }, {
- key: "fromBase",
- value: function fromBase(t) {
- //换算到当前
- return t / this.factor;
- }
- }]);
- return UnitOfMeasurement;
- }();
- /* var o = function t(e) {
- this.gettext = e,
- t.METRIC = this.gettext("metric", void 0, "measurement system"),
- t.IMPERIAL = this.gettext("imperial", void 0, "measurement system")
-
-
- };
- e.UoMSystem = o;
- let UoMSystem = {
-
- } */
- /* var MeasurementDomain = {
- DISTANCE : "DISTANCE",
- t.AREA = "AREA",
- t.VOLUME = "VOLUME",
- t.DATA = "DATA",
- t
- }
-
- */
- var UnitsOfMeasurement = {
- MILLIMETER: ['Millimeter', 'mm'],
- CENTIMETER: ['Centimeter', 'cm'],
- METER: ['Meter', 'm'],
- KILOMETER: ['Kilometer', 'km'],
- INCH: ['Inch', 'in'],
- FOOT: ['Foot', 'ft'],
- MILE: ['Mile', 'mi'],
- SQUAREMETER: ['SquareMeter', 'm²'],
- SQUAREFOOT: ['SquareFoot', 'ft²'],
- CUBICMETER: ['CubicMeter', 'm³'],
- CUBICFOOT: ['CubicFoot', 'ft³'],
- BYTE: ['Byte', 'B'],
- KILOBYTE: ['Kilobyte', 'kB'],
- MEGABYTE: ['Megabyte', 'MB'],
- GIGABYTE: ['Gigabyte', 'GB'],
- TERABYTE: ['Terabyte', 'TB'],
- PETABYTE: ['Petabyte', 'PB'],
- init: function init() {
- var e,
- n,
- i,
- a,
- s,
- c,
- l,
- u,
- d,
- p,
- h,
- f = new UnitOfMeasurement(UnitsOfMeasurement.METER[0], UnitsOfMeasurement.METER[1], void 0, 1),
- g = new UnitOfMeasurement(UnitsOfMeasurement.SQUAREMETER[0], UnitsOfMeasurement.SQUAREMETER[1], void 0, 1),
- m = new UnitOfMeasurement(UnitsOfMeasurement.CUBICMETER[0], UnitsOfMeasurement.CUBICMETER[1], void 0, 1),
- v = new UnitOfMeasurement(UnitsOfMeasurement.BYTE[0], UnitsOfMeasurement.BYTE[1], void 0, 1);
- 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);
- 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);
- 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); //数据大小
- 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);
- UnitsOfMeasurement.DATA = ((h = {})['metric'] = y, h['imperial'] = y, h);
- },
- getUnitsOfMeasurementByDomain: function getUnitsOfMeasurementByDomain(e) {
- return this[e.toUpperCase()];
- /* switch (e.toUpperCase()) {
- case a.DISTANCE:
- return t.DISTANCE;
- case a.AREA:
- return t.AREA;
- case a.VOLUME:
- return t.VOLUME;
- case a.DATA:
- return t.DATA;
- default:
- console.error(e + " measurement domain is not supported.")
- } */
- },
- getUnitsOfMeasurementByDomainAndSystem: function getUnitsOfMeasurementByDomainAndSystem(domain, system) {
- var r = this.getUnitsOfMeasurementByDomain(domain);
- if (r.hasOwnProperty(system.toLowerCase())) return r[system.toLowerCase()];
- console.error(n + ' measurement system is not supported.');
- },
- getDefaultUnitByDomainAndSystem: function getDefaultUnitByDomainAndSystem(e, n) {
- switch (e.toUpperCase()) {
- case 'DISTANCE':
- switch (n.toLowerCase()) {
- case 'metric':
- return this.DISTANCE['metric'][this.METER[0]];
- case 'imperial':
- return this.DISTANCE['imperial'][this.FOOT[0]];
- default:
- console.error(n + ' measurement system is not supported.');
- }
- case 'AREA':
- switch (n.toLowerCase()) {
- case 'metric':
- return this.AREA['metric'][this.SQUAREMETER[0]];
- case 'imperial':
- return this.AREA['imperial'][this.SQUAREFOOT[0]];
- default:
- console.error(n + ' measurement system is not supported.');
- }
- case 'VOLUME':
- switch (n.toLowerCase()) {
- case 'metric':
- return this.VOLUME['metric'][this.CUBICMETER[0]];
- case 'imperial':
- return this.VOLUME['imperial'][this.CUBICFOOT[0]];
- default:
- console.error(n + ' measurement system is not supported.');
- }
- case 'DATA':
- switch (n.toLowerCase()) {
- case 'metric':
- return this.DATA['metric'][this.BYTE[0]];
- case 'imperial':
- return this.DATA['imperial'][this.BYTE[0]];
- default:
- console.error(n + ' measurement system is not supported.');
- }
- default:
- console.error(e + ' measurement domain is not supported.');
- }
- }
- };
- var UnitService = function UnitService() {
- _classCallCheck(this, UnitService);
- //this.LanguageService = e,
- //this.localStorageService = n,
- //this.gettext = i,
- //this.unitChanged = new r.Signal,
- this.LOCAL_STORAGE_KEY = 'iv_unit_key'; //?
- UnitsOfMeasurement.init();
- this.unitSystems = ['metric', 'imperial']; //[o.UoMSystem.METRIC, o.UoMSystem.IMPERIAL],
- this.defaultSystem = 'metric'; //'imperial'
- //var a = this.LanguageService.getBrowserLocaleString().toLowerCase();
- //this.defaultSystem = t.isLocaleImperial(a) ? o.UoMSystem.IMPERIAL : o.UoMSystem.METRIC,
- //this.initUnit()
- }
- /* initUnit() {
- var t = this.localStorageService.get(this.LOCAL_STORAGE_KEY);
- if (t)
- for (var e = 0, n = this.unitSystems; e < n.length; e++) {
- var i = n[e];
- if (i === t)
- return void this.setUnit(i, !0)
- }
- this.setUnit(this.defaultSystem, !1)
- }
- setUnit(t, e) {
- this.currentSystem !== t && (this.currentSystem = t,
- this.unitChanged.emit()),
- e && this.localStorageService.set(this.LOCAL_STORAGE_KEY, t)
- } */
- /*isLocaleImperial(e) {
- return t.IMPERIAL_LOCALES.indexOf(e.toLowerCase()) >= 0
- }
- ,
- t.IMPERIAL_LOCALES = ["en_us"],
- t.ɵfac(e) {
- return new (e || t)(c.ɵɵinject(l.LanguageService),
- c.ɵɵinject("localStorageService"),c.ɵɵinject("gettext"))
- }
- ,
- t.ɵprov = c.ɵɵdefineInjectable({
- token: t,
- factory: t.ɵfac,
- providedIn: "root"
- }), */
- ;
- var UoMService = /*#__PURE__*/function () {
- function UoMService() {
- _classCallCheck(this, UoMService);
- this.UnitService = new UnitService();
- /* UnitService */
- }
- _createClass(UoMService, [{
- key: "scopedConvert",
- value: function scopedConvert(t, n) {
- var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
- var r = arguments.length > 3 ? arguments[3] : undefined;
- var minFactor = arguments.length > 4 ? arguments[4] : undefined;
- return this.convert(t, n, precision, r, minFactor);
- }
- }, {
- key: "convert",
- value: function convert(number, domain) {
- var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
- var system = arguments.length > 3 ? arguments[3] : undefined;
- var ifEighths = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : !1;
- var o
- /* minFactor, ifRestrict */
- = arguments.length > 5 ? arguments[5] : undefined;
- var _o$system = o[system],
- minFactor = _o$system.minFactor,
- restrictUnit = _o$system.restrictUnit; //if (!number) return "";
- var s = this.getMostRelevantMeasurement(domain, system || this.UnitService.currentSystem, number, minFactor, restrictUnit);
- return this.getFormattedMeasurementString(s[0], s[1], precision, ifEighths);
- }
- }, {
- key: "convertBack",
- value: function convertBack(number, domain) {
- var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
- var fromSystem = arguments.length > 3 ? arguments[3] : undefined;
- var minFactor = arguments.length > 4 ? arguments[4] : undefined;
- //从英制转到'metric'
- if (!number) return '';
- var d = UnitsOfMeasurement.getDefaultUnitByDomainAndSystem(domain, 'metric');
- var s = this.getMostRelevantMeasurement2(domain, fromSystem, number, minFactor);
- return this.getFormattedMeasurementString(s[0], d, precision);
- /* 栗子:
- viewer.unitConvert.convertBack(1, 'area', 5, 'imperial')
- '0.09290 m²'
- viewer.unitConvert.convertBack(1, 'Distance', 2, 'imperial')
- '0.03 m'
- */
- }
- }, {
- key: "getFormattedMeasurementString",
- value: function getFormattedMeasurementString(number, unit, precision, ifEighths) {
- var result;
- if (ifEighths && unit.name === UnitsOfMeasurement.FOOT[0]) {
- result = this.formatImperialDistance(number * FEET_TO_INCHES_FACTOR);
- } else if (ifEighths && unit.name === UnitsOfMeasurement.INCH[0]) {
- result = this.formatImperialDistance(number);
- } else {
- result = number.toLocaleString(void 0, {
- minimumFractionDigits: precision,
- maximumFractionDigits: precision
- }) + ' ' + unit.symbol;
- }
- return result;
- }
- }, {
- key: "formatImperialDistance",
- value: function formatImperialDistance(e) {
- var n = Math.round(8 * e),
- i = Math.floor(n / 8),
- r = Math.floor(i / FEET_TO_INCHES_FACTOR),
- o = i - r * FEET_TO_INCHES_FACTOR,
- a = EIGHTHS_SYMBOLS[Math.abs(n % 8)],
- s = 0 === o && '' !== a ? '' : o;
- '' !== s && '' !== a && (a = ' ' + a);
- return 0 !== r ? r + "' " + s + a + '"' : '' + s + a + '"';
- }
- }, {
- key: "getMostRelevantMeasurement",
- value: function getMostRelevantMeasurement(domain, system, number) {
- var minFactor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
- var restrictUnit = arguments.length > 4 ? arguments[4] : undefined;
- /* var a = r.values(UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system))
- , s = r.filter(a, function(t) {
- return t.factor >= i
- })
- , c = r.reduce(s, function(t, e) {
- return e.fromBase(number) < t.fromBase(number) && e.fromBase(number) >= 1 ? e : t
- }); */
- var a = [];
- var u = UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system);
- for (var i in u) {
- a.push(u[i]);
- }
- var s = a;
- if (s.length > 1) {
- if (restrictUnit) {
- //是否只用这一单位,如只用mm。如果不是,就会寻找最大的接近的单位,如设置最小为mmminFactor=0.001),则1.2米时是'1.2m'、0.2米时是'20cm'、0.002米时是'2mm'
- s = a.filter(function (m) {
- return m.name == restrictUnit;
- });
- } else {
- s = a.filter(function (m) {
- return m.factor >= minFactor;
- });
- }
- }
- var c = s.reduce(function (prev, currentValue) {
- //reduce最终值是最后一次return的值 ( 没看懂这句话作用)
- return currentValue.fromBase(number) < prev.fromBase(number) && currentValue.fromBase(number) >= 1 ? currentValue : prev;
- });
- return c ? [c.fromBase(number), c] : void 0;
- }
- }, {
- key: "getMostRelevantMeasurement2",
- value: function getMostRelevantMeasurement2(domain, system, number) {
- var minFactor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
- //add
- var a = [];
- var u = UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system);
- for (var i in u) {
- a.push(u[i]);
- }
- var s = a.filter(function (m) {
- return m.factor >= minFactor;
- });
- var c = s.reduce(function (prev, currentValue) {
- //reduce最终值是最后一次return的值 ( 没看懂这句话作用)
- return currentValue.toBase(number) < prev.toBase(number) && currentValue.toBase(number) >= 1 ? currentValue : prev;
- });
- return c ? [c.toBase(number), c] : void 0;
- }
- /* ɵfac(e){
- return new (e || t)(c.ɵɵinject(l.UnitService))
- }
-
- ɵprov = c.ɵɵdefineInjectable({
- token: t,
- factory: t.ɵfac,
- providedIn: "root"
- }) */
- }]);
- return UoMService;
- }();
- 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); }; }
- 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; } }
- var log = function log() {
- };
- var lastPointerupTime = 0;
- /* const _camereChangeLazyTime = 80 */
- defineComponent('Player', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(Player, _EventEmitter);
- var _super = _createSuper$17(Player);
- function Player() {
- var _this;
- _classCallCheck(this, Player);
- _this = _super.call(this);
- _this.setupCustomProperties = function (e) {
- var t = e || Viewmode$1.PANORAMA;
- Object.defineProperty(this, 'mode', {
- get: function get() {
- return t;
- },
- set: function set(e) {
- var i = t;
- t = e, this.onModeUpdated(i, t);
- }
- });
- };
- _this.isOutsideMode = function (mode) {
- mode = mode || this.mode;
- return mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN;
- };
- _this.is360View = function (e, t) {
- return e === Viewmode$1.PANORAMA && t && t.panoType == '360view';
- };
- _this.setScene = function () {
- var scene = this.$app.core.get('SceneRenderer').scene;
- this.sceneIntersectionPlane = scene.plane;
- this.path.setScene(scene);
- this.moveReticuleToScene(scene);
- };
- _this.moveReticuleToScene = function (e) {
- this.reticule.parent && this.reticule.parent.remove(this.reticule), e.add(this.reticule);
- };
- _this.updateModel = function () {
- var _this2 = this;
- // function updateCamera(centerY) {
- // var camera = this.cameraControls.cameras[Viewmode.DOLLHOUSE]
- // , control = this.cameraControls.controls[Viewmode.DOLLHOUSE]
- // , positionY = camera.position.y + (centerY - control.target.y)
- // , duration = settings.showFloorDuration + settings.showFloorDelay;
- // transitions.start(lerp.property(control.target, "y", centerY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
- // transitions.start(lerp.property(camera.position, "y", positionY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
- // }
- this.model = this.modelManager.getActiveModel();
- this.model.player = this; // this.model.on("floor.changed", function(newFloor, t, oldFloor) {
- // this.mode === Viewmode.DOLLHOUSE && newFloor !== oldFloor && updateCamera.call(this, newFloor.center.y)
- // }
- // .bind(this));
- // this.model.on("allfloors.toggled", function(flag, floor) {
- // if (this.mode === Viewmode.DOLLHOUSE) {
- // var centerY = flag ? this.model.center.y : centerY = floor.center.y;
- // updateCamera.call(this, centerY)
- // }
- // }
- // .bind(this));
- this.paintEditor.init();
- this.on(PlayerEvents.PanoChosen, function (pano0, pano1, flag) {
- _this2.model.setProjectedPanos(pano0, pano1, flag);
- _this2.paintEditor && _this2.paintEditor.updatePanoPaint(pano0.id, pano1.id);
- _this2.$app.FilterManager && _this2.$app.FilterManager.updatePanoFilters(pano0, pano1);
- });
- this.on(PlayerEvents.FlyingStarted, this.model.resetHighMap.bind(this.model));
- };
- _this.updateModelDependentData = function () {
- this.cameraControls.setModelForControls(this.model);
- this.getPanoMarkersFromModel(this.model);
- };
- _this.getPanoMarkersFromModel = function (e) {
- this.panoMarkers = e.panos.list.reduce(function (e, t) {
- return t.marker ? e.concat(t.marker) : e;
- }, []);
- };
- _this.handleControlMove = function (e) {
- this.emit(PlayerEvents.Move, e);
- if (this.mode === Viewmode$1.PANORAMA) {
- this.emit(PlayerEvents.Rotate, {
- quaternion: this.cameraControls.activeControl.camera.quaternion,
- mode: Viewmode$1.PANORAMA,
- currentPanoId: this.nextPano ? this.nextPano.id : this.currentPano ? this.currentPano.id : null,
- type: 'rotate'
- });
- }
- };
- _this.handleControlInputStart = function (e) {
- this.emit(PlayerEvents.InputStart, e);
- };
- _this.onModeUpdated = function (fromMode, toMode) {
- this.cameraControls.activateControls(toMode);
- this.emit(PlayerEvents.ModeChanged, fromMode, toMode); //add:
- //beforechangeMode
- if (toMode == 'transitioning') {
- fromMode = this.modeTran.split('-')[0]; //按钮active改变
- //this.store.commit('SetPlayerOptions',{mode:toMode == "panorama" ? "pano" : toMode == "dollhouse" ? "3d" : "2d",modeCanSwitch:false})
- if (fromMode == Viewmode$1.PANORAMA) {
- this.flyingToTag = this.flyRotate = this.flyingWithRot = false; //有出现过如果还没校准好热点就飞出的话会是true
- /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw 改写
- common.updateVisible(chunk,'atPano',true) //恢复漫游点处隐藏的chunk
- }) */
- }
- } else {
- //afterChangeMode
- toMode = this.modeTran.split('-')[1];
- if (!(this.isOutsideMode(fromMode) && this.isOutsideMode(toMode))) this.model.fadePanoMarkers(null, 0);
- if (toMode == Viewmode$1.PANORAMA) ;
- }
- };
- _this.isWarping = function () {
- //return this.path.warping
- return false;
- };
- _this.isWaitingToWarp = function () {
- //return this.path.waitingToWarp
- return false;
- };
- _this.bindEvents = function (e) {
- var _this3 = this;
- 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)),
- e.addEventListener('touchstart', this.onTouchStart.bind(this), {
- passive: false
- }), e.addEventListener('touchmove', this.onTouchMove.bind(this), {
- passive: false
- }), 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));
- window.addEventListener('pointerup', function (e) {
- //edit 拖拽到别的面板松开 mouseup没用
- Date.now() - lastPointerupTime > 60 && _this3.onPointerUp(e);
- lastPointerupTime = Date.now();
- });
- };
- _this.onMouseDown = function (e) {
- e.currentTarget !== document && e.currentTarget.focus(), this.handleInputStart.call(this, e.clientX, e.clientY, !1, false, e), this.updateIntersect(); //this.distanceToCamera(2)
- };
- _this.onMouseMove = function (e) {
- (this.isTouchEvent = !1, this.containsMouse = !0), this.handleInputMove.call(this, e.clientX, e.clientY, !1, e);
- };
- _this.onMouseOver = function (e) {
- this.containsMouse = !0, !this.mouseDown || 0 !== e.which && 0 !== e.buttons || (this.mouseDown = !1);
- };
- _this.onMouseOut = function (e) {
- this.containsMouse = !1;
- };
- _this.onMouseUp = function (e) {
- this.handleInputEnd.call(this, e.clientX, e.clientY, !1, e);
- this.emit(PlayerEvents.EndRotation, {
- rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
- type: 'endRotation'
- });
- };
- _this.onTouchStart = function (e) {
- if (e.currentTarget !== document && e.currentTarget.focus(), !this.mouseDown) {
- this.couldBeLongTap = !0;
- var t = common$1.average(e.changedTouches, 'clientX'),
- i = common$1.average(e.changedTouches, 'clientY');
- this.handleInputStart.call(this, t, i, !0, false, e), this.mouseDownTimer = setTimeout(function () {
- this.updateIntersect(), this.handleInputEnd.call(this, t, i, !0, e);
- }.bind(this), settings$3.input.longTapThreshold);
- } //ios safari 球幕视频无法自动播放,必须静音才能播放,播放后关闭静音会导致视频暂停 #43676
- //需要用户交互才能播放带声音的视频 the request is not allowed by the user agent or the platform in thre current context, possibly because the user denied permission
- if (browser$1.detectIOS()) {
- var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
- panoVideoRenderer.setMuted(false);
- }
- };
- _this.onTouchMove = function (e) {
- var t = common$1.average(e.changedTouches, 'clientX'),
- i = common$1.average(e.changedTouches, 'clientY');
- this.handleInputMove.call(this, t, i, !0, e);
- };
- _this.onTouchEnd = function (e) {
- if (clearTimeout(this.mouseDownTimer), this.mouseDown) {
- this.couldBeLongTap = !1, this.updateIntersect();
- var t = common$1.average(e.changedTouches, 'clientX'),
- i = common$1.average(e.changedTouches, 'clientY');
- this.handleInputEnd.call(this, t, i, !0, e);
- this.emit(PlayerEvents.EndRotation, {
- rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
- type: 'endRotation'
- });
- }
- };
- _this.onPointerDown = function (e) {
- e.currentTarget !== document && e.currentTarget.focus();
- if (this.mouseDown || 'mouse' === e.pointerType) {
- return this.onMouseDown(e);
- } else {
- this.couldBeLongTap = !0;
- this.handleInputStart.call(this, e.clientX, e.clientY, !0, false, e);
- return void (this.mouseDownTimer = setTimeout(function () {
- this.updateIntersect(), this.handleInputEnd.call(this, e.clientX, e.clientY, !0, e);
- }.bind(this), settings$3.input.longTapThreshold));
- }
- };
- _this.onPointerMove = function (e) {
- 'mouse' !== e.pointerType ? this.handleInputMove.call(this, e.clientX, e.clientY, !0, e) : this.onMouseMove(e);
- };
- _this.onPointerUp = function (e) {
- if (this.mouseDown && 'mouse' !== e.pointerType) {
- if (this.mouseDownTimer) {
- clearTimeout(this.mouseDownTimer);
- }
- this.couldBeLongTap = !1;
- this.updateIntersect();
- void this.handleInputEnd.call(this, e.clientX, e.clientY, !0, e);
- this.emit(PlayerEvents.EndRotation, {
- rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
- type: 'endRotation'
- });
- } else {
- this.onMouseUp(e);
- }
- };
- _this.onPointerOut = function (e) {
- this.mouseDown = !1;
- };
- _this.onPointerCancel = function (e) {
- this.mouseDown = !1;
- };
- _this.onKeyDown = function (e) {
- if (!this.$app.config.useShortcutKeys) {
- return;
- }
- var t = function () {
- this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, 'key');
- }.bind(this),
- i = e.which;
- switch (i) {
- case Keys.F:
- t(), this.changeFloor(-1);
- break;
- case Keys.R:
- t(), this.changeFloor(1);
- }
- if (this.mode === Viewmode$1.PANORAMA) switch (i) {
- case Keys.UPARROW:
- case Keys.W:
- this.flyLocalDirection(Vectors$1.FORWARD.clone());
- break;
- case Keys.DOWNARROW:
- case Keys.S:
- this.flyLocalDirection(Vectors$1.BACK.clone());
- break;
- case Keys.A:
- this.flyLocalDirection(Vectors$1.LEFT.clone());
- break;
- case Keys.D:
- this.flyLocalDirection(Vectors$1.RIGHT.clone());
- }
- if (this.started
- /* && ( !viewEditLink.markView && !editSpot.setSpotPos && (!this.linkEditor || !this.linkEditor.setPanoVisible && !this.linkEditor.setTagVisible)) */
- ) {
- switch (i) {
- case Keys.ONE:
- //i.isInMode(_e.TRANSITIONING) || (t.changeMode(_e.PANORAMA));
- this.insideMode();
- break;
- case Keys.TWO:
- //this.model.outsideAllowed() && !this.isInMode(_e.FLOORPLAN, _e.TRANSITIONING) && (t.changeMode(_e.FLOORPLAN));
- this.flyToNewMode({
- mode: Viewmode$1.DOLLHOUSE
- });
- break;
- case Keys.THREE:
- //this.model.outsideAllowed() && !this.isInMode(_e.DOLLHOUSE, _e.TRANSITIONING) && (t.changeMode(_e.DOLLHOUSE));
- this.flyToNewMode({
- mode: Viewmode$1.FLOORPLAN
- });
- break;
- }
- }
- };
- _this.handleScrollPinchZoom = function () {
- return function (e) {
- var t = e,
- i = this.zoomLevel;
- this.zoomBy(t), this.currentPano && this.zoomStats.addZoomAction(i, this.zoomLevel, this.currentPano.id);
- };
- }();
- _this.handleControlPinch = function (e) {
- if (settings$3.zoom.enabled) {
- this.handleScrollPinchZoom(1 - e);
- } else if (this.$app.config.useShortcutKeys) {
- this.flyLocalDirection(new THREE.Vector3(0, 0, e).normalize());
- }
- };
- _this.emitZoom = function (e) {
- //xzw add
- //zoomLevel2是界面显示的放大倍数,按要求4k以下的最大都要是4,以上的是几k就是几
- var tileClass = this.$app.core.get('QualityManager').tileClass;
- var threshold = tileClass <= 2048 ? 2 : 3;
- var zoomLevel2 = math$2.linearClamp(this.zoomLevel, [1, threshold, 4.5], [1, 4, 9
- /* 6 */
- ]); //console.log('zoom', this.zoomLevel, zoomLevel2 )
- this.emit(PlayerEvents.Zoom, {
- zoom: e,
- type: 'zoom',
- zoomLevel: this.zoomLevel,
- zoomLevel2
- }); //console.log('emitZoom', this.zoomLevel)
- };
- _this.handleControlScroll = function (e) {
- if (settings$3.zoom.enabled) {
- if (e > 0) {
- e = 1 + this.scrollZoomSpeed;
- } else {
- e < 0 && (e = 1 - this.scrollZoomSpeed);
- }
- 0 !== e && this.handleScrollPinchZoom(e);
- this.emitZoom(e);
- } else if (this.$app.config.useShortcutKeys) {
- this.flyLocalDirection(new THREE.Vector3(0, 0, -e).normalize());
- }
- };
- _this.getEventDesc = function () {
- var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return {
- button: event.button,
- buttons: event.buttons,
- touches: event.touches,
- intersect: this.intersect,
- mouse: this.mouse,
- isAtDomElement: event.target == this.domElement || event.target == this.$app.core.get('SceneRenderer').renderer.domElement
- };
- };
- _this.handleInputStart = function (e, t, i, ignorePad, event) {
- var mouse = {
- x: e,
- y: t
- };
- if (
- /* !config.mobile && */
- !ignorePad) {
- mouse = math$2.handelPadding(e, t, this.domElement);
- }
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement);
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouseAtMouseDown, this.domElement);
- this.mouseCouldBeClickToMove = !0;
- this.mouseDown = !0;
- this.updateIntersect(); //为了触屏版,在点击时立刻checkIntersect
- //add---------------------------------
- var consumed;
- var consume = function consume() {
- consumed = true;
- };
- var getConsumed = function getConsumed() {
- return consumed;
- }; //被使用
- this.emit('pointerStart', Object.assign(this.getEventDesc(event), {
- consume,
- getConsumed
- }));
- if (consumed) {
- return;
- } // 有被事件作用到,且需要阻止后续进行
- //------------------------------------
- if ((event === null || event === void 0 ? void 0 : event.button) != THREE.MOUSE.LEFT) return;
- if (this.EditPanoVideo && this.EditPanoVideo.editing) {
- this.EditPanoVideo.dealPointerDown();
- } else if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
- this.EditPanoMosaic.dealPointerDown();
- } else {
- this.model.transformControls && this.model.transformControls.handleDragStart();
- this.model.transformTool && this.model.transformTool.handleDragStart();
- }
- if (this.paintEditor && this.paintEditor.painting) {
- this.paintEditor.dealPointerDown();
- } // this.setQuaternionTransition(null)
- this.aimQuaternion = null;
- };
- _this.handleInputMove = function (e, t, i, event) {
- this.isTouchEvent = i;
- var mouse = math$2.handelPadding(e, t, this.domElement);
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement); // 不能给0,三星手机在pointmove上非常敏感,需要一定容错才能触发click
- if (this.mouseAtMouseDown.distanceTo(this.mouse) > 0.01
- /*settings.input.moveToleranceNDC*/
- ) {
- this.mouseCouldBeClickToMove = !1;
- this.couldBeLongTap = !1;
- clearTimeout(this.mouseDownTimer);
- this.model.transformControls && this.model.transformControls.handleDragging();
- this.model.transformTool && this.model.transformTool.onPointerMove();
- }
- if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
- this.EditPanoMosaic.dealPointerMove();
- }
- if (this.paintEditor && this.paintEditor.painting) {
- this.paintEditor.dealPointerMove(mouse);
- } //add---------------------------------
- var consumed;
- var consume = function consume() {
- consumed = true;
- };
- var getConsumed = function getConsumed() {
- return consumed;
- }; //被使用
- this.emit('pointerMove', Object.assign(this.getEventDesc(event), {
- consume,
- getConsumed
- }));
- if (consumed) {
- return;
- } // pointerDown 有被事件作用到,且需要阻止后续进行
- //------------------------------------
- this.mouseLastMoveTime = Date.now();
- this.reticule.move(e, t, i);
- };
- _this.handleInputEnd = function (e, t, i, event) {
- var _this4 = this;
- if (this.isTouchEvent = i, this.mouseDown = !1, this.cameraControls.controls[Viewmode$1.PANORAMA].emit('interaction.direct'), !i && this.couldBeLongTap) return !0;
- this.model.transformControls && this.model.transformControls.handleDragEnd();
- this.model.transformTool && this.model.transformTool.handleDragEnd();
- this.EditPanoVideo && this.EditPanoVideo.dealPointerUp();
- this.EditPanoMosaic && this.EditPanoMosaic.dealPointerUp();
- if (this.paintEditor && this.paintEditor.painting) {
- this.paintEditor.dealPointerUp();
- }
- lastPointerupTime = Date.now(); //add---------------------------------
- var pointerupConsumed; //参考了potree,和click分开。只有都consumed了才不flytopano
- var consume = function consume() {
- pointerupConsumed = true;
- }; //被使用
- var getConsumed = function getConsumed() {
- return pointerupConsumed;
- };
- var eventObj = Object.assign(this.getEventDesc(event), {
- consume,
- getConsumed
- });
- this.emit('pointerUp', eventObj);
- /* if (consumed) {
- return
- } // 有被事件作用到,且需要阻止后续进行 */
- //------------------------------------
- if (this.handleLongTap()) return !0;
- if (this.mouseCouldBeClickToMove && eventObj.isAtDomElement) {
- if (this.flying) {
- //this.path.activeTransType === WarpStyle.WALK && this.emit(PlayerEvents.WarpInterruptedWithFlyTo, this.path.activeTransType);
- return this.flyToPanoClosestToMouse(); //!0; 改for panoTask
- } // if (this.checkMattertagClick())
- // return !0;
- if (this.chosenMeasureRuler) {
- //取消“删除”显示
- this.chosenMeasureRuler.showOptionLabel(false);
- }
- if (this.linkEditor && this.linkEditor.setPanoVisible) {
- //正在设置漫游可行
- var currentFloorIcons = [].concat(_toConsumableArray(this.linkEditor.actionIcons), _toConsumableArray(this.linkEditor.footIcons)).filter(function (icon) {
- return icon.pano.floorIndex == _this4.model.currentFloor.floorIndex;
- });
- this.intersect = this.getMouseIntersect(null, currentFloorIcons
- /* .concat(this.measureRulers.map(ruler => ruler.boldLine)) */
- );
- if (this.intersect && this.intersect.object.visible) {
- var icon = this.intersect.object;
- if (icon.type == 'ActionIcon' && !this.linkEditor.activePano && icon.footIcon.status == 'floor') {
- // 设置楼层连接点隐藏需要做二次确认提示
- var self = this;
- this.$app.WalkManager.emit('walkManager.floorPointHide', function () {
- self.linkEditor.dealPanoVisible(self.intersect.object.name, self.intersect.object);
- });
- } else {
- this.linkEditor.dealPanoVisible(this.intersect.object.name, this.intersect.object);
- }
- }
- return;
- }
- if (this.linkEditor && this.linkEditor.setTagVisible) {
- //正在设置热点可视
- this.linkEditor.tagVsetting && this.intersect && this.intersect.object.visible && this.linkEditor.dealTagVisible(this.linkEditor.tagVsetting, this.intersect.object.name);
- return;
- }
- var measureIntersect = this.getMouseIntersect(null, this.model.measureRulers.children.filter(function (e) {
- return e.realVisible();
- }).map(function (ruler) {
- return ruler.boldLine;
- }));
- if (measureIntersect && measureIntersect.object.parentRuler) {
- //点击测距标尺 以删除
- measureIntersect.object.parentRuler.showOptionLabel(true, measureIntersect.point);
- return;
- }
- if (this.EditOverlay && this.EditOverlay.isAdding) {
- this.intersect && this.EditOverlay.addOverlay({
- intersect: this.intersect
- });
- return;
- }
- if (this.OverlayManager.hoveringPlane) {
- this.OverlayManager.clickOverlay(this.OverlayManager.hoveringPlane);
- return;
- }
- if (this.intersect && this.billboardManager && this.billboardManager.isAdding) {
- return this.billboardManager.startInsertion({
- intersect: this.intersect
- });
- } //add---------------------------------
- var consumed;
- var _consume = function _consume() {
- consumed = true;
- }; //被使用
- var _getConsumed = function _getConsumed() {
- return consumed;
- };
- this.emit('click', Object.assign(this.getEventDesc(event), {
- consume: _consume,
- getConsumed: _getConsumed,
- raycaster: this.raycaster
- }));
- if (pointerupConsumed || consumed || event.button != THREE.MOUSE.LEFT) {
- return;
- } // 有被事件作用到,且需要阻止后续进行
- //------------------------------------
- if (this.currentPano && this.is360View(this.mode, this.currentPano)) return;
- this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, this.isTouchEvent ? 'touch' : 'mouse');
- this.history.invalidate();
- if (this.intersect) {
- return this.flyToPanoClosestToMouse();
- }
- if (this.mode === Viewmode$1.PANORAMA) {
- var pano = this.closestPanoInDirection(this.getMouseDirection());
- if (pano) {
- return this.flyToPano({
- pano: pano
- });
- } else {
- return this.bump(this.getMouseDirection());
- }
- }
- }
- this.intersect && this.closestPano && this.closestPano.hoverOff(this.mode);
- };
- _this.handleLongTap = function () {
- if (this.couldBeLongTap && (!this.isPanoHover || this.mode !== Viewmode$1.PANORAMA)) {
- this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.LongTap, 'touch');
- return !0;
- }
- };
- _this.start = function (initialPanoInfo) {
- var _this5 = this;
- var mode = initialPanoInfo.mode,
- pano = initialPanoInfo.pano,
- position = initialPanoInfo.position,
- quaternion = initialPanoInfo.quaternion,
- tag = initialPanoInfo.tag,
- quickstart = initialPanoInfo.quickstart,
- deferred = Deferred$1();
- this.updateModelDependentData();
- this.updateFromControls(); //this.findDefaultViews();
- var is360 = this.is360View(mode, pano);
- var done = function done(e) {
- _this5.emit(PlayerEvents.Ready, is360, e, tag);
- _this5.started = true;
- };
- if (!this.model.outsideAllowed() || is360 || quickstart) {
- this.startInside(pano, position, quaternion, tag, deferred);
- done();
- } else {
- this.startOutside(initialPanoInfo, deferred);
- this.once(PlayerEvents.FlyingEnded, done); //add
- }
- this.compass = new Compass(this);
- this.linkEditor = new Link(this);
- this.labelManager = new LabelManager(this);
- return deferred;
- };
- _this.startOutside = function (initialPanoInfo, deferred) {
- var mode = initialPanoInfo.mode,
- pano = initialPanoInfo.pano,
- position = initialPanoInfo.position,
- quaternion = initialPanoInfo.quaternion,
- zoom = initialPanoInfo.zoom,
- floorVisibility = initialPanoInfo.floorVisibility,
- tag = initialPanoInfo.tag;
- this.emit(PlayerEvents.StartOutside, settings$3[mode].transitionTime);
- if (this.isOutsideMode(mode)) {
- this.model.warpDestFloors(floorVisibility, !0);
- transitions$1.cancelById(settings$3.freeze.FlyToViewFloor);
- if (mode === Viewmode$1.FLOORPLAN) {
- this.floorplanMode(position, quaternion, zoom);
- } else {
- this.dollhouseMode(position, quaternion);
- }
- deferred.resolve(!1);
- } else {
- this.startInsideWithFlyin(pano, position, quaternion, tag, deferred);
- }
- this.beforeChangeMode(null, mode);
- };
- _this.startInside = function (pano, position, quaternion, tag, deferred) {
- var _quaternion;
- deferred = deferred || Deferred$1();
- this.currentPano = pano;
- var o = pano && !pano.isAligned();
- position = o ? pano.position : position || pano.position;
- quaternion = quaternion || pano.quaternion;
- this.initialQua = (_quaternion = quaternion) === null || _quaternion === void 0 ? void 0 : _quaternion.clone(); //minidoll需要
- if (pano) {
- //这里开始加载第一个点的全景图。如果未加载好,等加载好以后还会执行一遍此startInside函数。
- var a = this.startInside.bind(this, pano, position, quaternion, tag, deferred);
- if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, a)) return;
- } //add:--------
- this.modeTran = 'panorama-panorama'; //modeTran要比mode先设置,因mode修改会触发onModeUpdated,需要用到modeTran
- this.beforeChangeMode(null, Viewmode$1.PANORAMA, this.currentPano, 0); //xzw add
- this.afterChangeMode(null, Viewmode$1.PANORAMA);
- pano.enter(); //------------
- this.mode = Viewmode$1.PANORAMA;
- pano.floor.enter(this.mode);
- this.emit(PlayerEvents.PanoChosen, this.currentPano, this.currentPano);
- this.switchCameraMode(this.mode, quaternion);
- this.emit(PlayerEvents.StartInside, o); // 初始点位球幕视频静音播放
- var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
- panoVideoRenderer.setMuted(true);
- panoVideoRenderer.activatePanorama(this.currentPano);
- deferred.resolve(!0);
- return deferred;
- };
- _this.startInsideWithFlyin = function (initPano, initPosition, initQuaternion, tag, deferred) {
- deferred = deferred || Deferred$1();
- this.dollhouseMode();
- if (!initPano) {
- logger$1.warn('Player.startInsideWithFlyin() -> targetPano is invalid.');
- deferred.resolve(!1);
- return deferred;
- }
- initPosition = initPosition || initPano.position;
- var quaternion = initQuaternion || this.cameraControls.activeControl.camera.quaternion,
- position = initPano.position; //这个作用是加载完数据,模型第一次出现的位置
- this.fitDollhouse(position, initPosition, quaternion);
- setTimeout(function (t) {
- this.cameraControls.activeControl && (this.cameraControls.activeControl.maxDistance = t);
- var newMode = {
- mode: Viewmode$1.PANORAMA,
- pano: initPano,
- quaternion: initQuaternion,
- callback: function () {
- this.emit(PlayerEvents.FlyinFinished);
- deferred.resolve(!0);
- }.bind(this)
- };
- this.flyToNewMode(newMode);
- }.bind(this, this.cameraControls.activeControl.maxDistance), settings$3.startupFlyinDelay);
- return deferred;
- };
- _this.checkAndWaitForPanoLoad = function () {
- var loadingPanos = {},
- LoadedTimePanos = {},
- loadedCallback = {},
- //add
- maxTime = 5e3;
- /* var withinTime = function () {//5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
- for (var panoId in loadingPanos)
- if (loadingPanos.hasOwnProperty(panoId) && loadingPanos[panoId]) {//还在加载
- var differTime = performance.now() - LoadedTimePanos[panoId]
- if (differTime < maxTime) return !0
- }
- return !1
- } */
- //xzw withinTime 改为只判断当前请求的点。原始代码的callback是针对任意pano的,所以遍历所有漫游点,只要有在加载的就返回,但已不满足需求。
- var withinTime = function withinTime(pano) {
- //5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
- if (loadingPanos.hasOwnProperty(pano.id) && loadingPanos[pano.id]) {
- //还在加载
- var differTime = performance.now() - LoadedTimePanos[pano.id];
- if (differTime < maxTime) return !0;
- }
- };
- return function (pano, imgQuality1, imgQuality2, basePanoSize, successCallbackFunc1, successCallbackFunc2, progressCallback, iswait, isclear, p) {
- if (withinTime(pano)) {
- log('loadedCallback re add', pano.id);
- loadedCallback[pano.id] = successCallbackFunc1; //add 更新 因为有可能之前请求的没加successCallbackFunc1
- return !0; //距离上次请求时间很近
- }
- /*
- withinTime的原因: 多次重复飞向一个点,withinTime()为true 。如修改热点位置时
-
- */
- var callback1 = function (panoId, param1, param2) {
- common$1.delayOneFrame(function () {
- loadingPanos[panoId] = !1; //console.log('loadedCallback consume:', pano.id)
- loadedCallback[pano.id] && loadedCallback[pano.id](param1, param2);
- loadedCallback[pano.id] = null;
- }.bind(this));
- }.bind(this, pano.id);
- var callback2 = function (panoId, param) {
- common$1.delayOneFrame(function () {
- this.clearPanosTaskList(); // 加载tile失败后清掉task
- loadingPanos[panoId] = !1;
- successCallbackFunc2 && successCallbackFunc2(param);
- }.bind(this));
- }.bind(this, pano.id);
- try {
- ;
- null !== iswait && void 0 !== iswait || (iswait = !0);
- if (pano.tiled) {
- loadingPanos[pano.id] = this.checkAndWaitForTiledPanoLoad(pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, p);
- } else {
- loadingPanos[pano.id] = this.checkAndWaitForWholePanoLoad(pano, imgQuality1, imgQuality2, callback1, iswait);
- }
- if (loadingPanos[pano.id]) {
- LoadedTimePanos[pano.id] = performance.now(); //console.log('loadedCallback add', pano.id)
- loadedCallback[pano.id] = successCallbackFunc1; //add 如果加载好就执行最新的successCallbackFunc1
- }
- return loadingPanos[pano.id]; //false 代表加载好了
- } catch (msg) {
- loadingPanos[pano.id] = !1;
- LoadedTimePanos[pano.id] = performance.now() - maxTime;
- throw msg;
- }
- };
- }();
- _this.checkAndWaitForWholePanoLoad = function (pano, imgQuality1, imgQuality2, callbackFunc, iswait) {
- if (!pano) {
- throw new BasicException('Player.checkAndWaitForWholePanoLoad() -> Cannot load texture for null pano.');
- }
- if (iswait) {
- this.model.waitForLoad(pano, function () {
- return pano.isLoaded(imgQuality2);
- });
- }
- if (!pano.isLoaded(imgQuality1)) {
- pano.loadCube(imgQuality1).done(callbackFunc);
- return true;
- } else {
- return false;
- }
- };
- _this.checkAndWaitForTiledPanoLoad = function () {
- var vectorForward = new THREE.Vector3();
- return function (pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, l) {
- if (!pano) {
- throw new BasicException('Player.checkAndWaitForTiledPanoLoad() -> Cannot load texture for null pano.');
- }
- vectorForward.copy(Vectors$1.FORWARD);
- this.getDirection(vectorForward);
- if (!pano.isLoaded(basePanoSize)) {
- iswait && this.model.waitForLoad(pano, function () {
- return pano.isLoaded(basePanoSize);
- });
- pano.loadTiledPano(basePanoSize, vectorForward, null, isclear, l
- /* , undefined, quality */
- ).done(function (e, t) {
- callback1 && callback1(e, t);
- }.bind(this)).fail(function (msg) {
- callback2 && callback2(msg);
- }.bind(this)).progress(function (e, t, i) {
- progressCallback && progressCallback(e, t, i);
- }.bind(this));
- return !0;
- }
- };
- }();
- _this.switchCameraMode = function (mode, quaternion, target, position, currentScale) {
- var o = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
- var control = this.cameraControls.controls[mode],
- camera = control.camera;
- if (mode == Viewmode$1.PANORAMA) {
- camera.position.copy(this.currentPano.position);
- var direction;
- if (quaternion) {
- direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion);
- } else {
- direction = this.getDirection().setY(0).normalize();
- }
- control.lookAt(direction.add(camera.position));
- } else {
- if (target) {
- control.target.copy(target);
- }
- if (position) {
- camera.position.copy(position);
- }
- if (mode == Viewmode$1.DOLLHOUSE) {
- //////////////////
- if (!position && !target) {
- if (o.dontFitScreen && this.mode === Viewmode$1.PANORAMA) {
- //当前位置的抬升
- position = this.position.clone();
- if (this.mode === Viewmode$1.PANORAMA) {
- position.add(new THREE.Vector3(0, 6, 0)).add(this.getDirection().multiplyScalar(-10));
- } else {
- position.add(Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).multiplyScalar(6)).setY(6);
- }
- } else {
- //fitScreen 居中 . by xzw
- var vec;
- if (this.mode === Viewmode$1.PANORAMA) {
- control.target.copy(this.model.center).setY(this.model.boundingBox.min.y + 2);
- vec = (quaternion ? new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion) : this.getDirection()).negate().setY(o.heightRatio || 1).normalize(); //获得朝向
- } else {
- control.target.copy(this.target.clone().setY(this.model.boundingBox.min.y + 2));
- vec = Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).setY(1).normalize();
- }
- var distance = control.suitableDistance;
- vec.multiplyScalar(distance);
- position = control.target.clone().add(vec);
- }
- camera.position.copy(position);
- }
- } else if (mode == Viewmode$1.FLOORPLAN) {
- ////////////////////
- if (!target) {
- control.target.copy(this.model.center).setY(0);
- }
- if (!position) {
- 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的高度一致,渐变才不突兀
- y = Math.max(y, this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1);
- camera.position.copy(this.model.center).setY(y);
- control.rotateToView(this.model.size, this.getDirection());
- }
- if (currentScale) {
- control.currentScale = control.absoluteScale = currentScale;
- } else if (o.fitBoundSize) {
- control.zoomToContain(this.fitBoundSize);
- } else {
- control.zoomToContain(this.model.size);
- }
- }
- }
- control.update(0);
- };
- _this.update = function () {
- var e = {},
- maxDelayCount_ = 15,
- //最大延迟帧数
- waitUpdateCount = 2,
- //先延迟两帧
- needsDelayUpdate;
- return function (i) {
- this.updatePersistentZooming(i), this.updateFromControls(i); //this.getCurrentNodePanos(t);
- this.lastFrameChanged = false;
- if (this.hasChanged(e)) {
- //相机、鼠标等是否有变化
- this.lastFrameChanged = e.cameraChanged3 ? 'level3' : e.cameraChanged2 ? 'level2' : e.cameraChanged ? 'level1' : false;
- this.lastChangeTime = Date.now();
- (!this.mouseDown && this.containsMouse || e.vrHandlerMoved) && this.updateIntersect();
- this.emit(PlayerEvents.ViewChanged, e);
- if (e.cameraChanged) {
- if (this.compass) this.compass.update(this.quaternion);
- this.model.floorLogos.updateFloorlogo(this.camera && this.camera.quaternion, this);
- if (this.linkEditor && (this.linkEditor.setTagVisible || this.linkEditor.setPanoVisible)) this.linkEditor.updateFootIconSize();
- this.updateLabelZIndex(['dollLabels', 'doorLabels']); //更新"删除测量线"的标签所在位置
- if (this.chosenMeasureRuler) {
- this.chosenMeasureRuler.updateOptionPos();
- }
- this.yaw = math$2.getYawByDir(this.getDirection());
- needsDelayUpdate = true;
- } //----cameraChanged end
- if (e.cameraChanged || e.floorChanged || e.allFlVisiChanged) {
- this.dollLabels.concat(this.planLabels).concat(this.doorLabels).concat(this.model.measureRulers.children).concat(this.polygonmarkLabels).forEach(function (label) {
- label.update();
- });
- }
- } //----hasChanged end----------
- if (needsDelayUpdate) {
- //延时update,防止崩溃
- if (waitUpdateCount-- == 0) {
- //console.log('update1', waitUpdateCount)
- DoorLabel.updateCameraDir(this);
- this.setAnimateMakerPano();
- waitUpdateCount = maxDelayCount_;
- needsDelayUpdate = false;
- } else if (waitUpdateCount % Math.round(maxDelayCount_ / 3) == 0) {
- //更频繁点的更新(和上一个错开 )
- //console.log('update2', waitUpdateCount )
- if (this.model.supportsTiles) {
- var upcomingPanos = this.panosTaskList.length > 1 ? this.panosTaskList.map(function (e) {
- return e.pano;
- }) : []; //add
- this.updateTileDownloader(upcomingPanos); //提前加载好512图,否则持续漫游会延迟1ms而卡顿
- this.updatePanoRenderer();
- this.updateZoomPano();
- }
- }
- }
- if (this.paintEditor && this.paintEditor.painting) this.paintEditor.update();
- this.reticule.update(); //this.path.update();
- //this.spider.update();
- this.cachedPanoCandidates && settings$3.navigation.panoScores && this.model.panos.showPanoScores(this.cachedPanoCandidates);
- this.updateControlLocks();
- this.emit('update', {
- x: this.position.x,
- y: this.position.z,
- lon: this.cameraControls.controls.panorama.lon,
- hasChanged: e,
- mode: this.mode,
- lastFrameChanged: this.lastFrameChanged
- });
- };
- }();
- _this.updateLabelZIndex = function (types) {
- var _this6 = this;
- //更新labels的z-index
- types.forEach(function (type) {
- if (type == 'dollLabels' && _this6.mode != 'dollhouse' || type == 'doorLabels' && _this6.mode != 'panorama') return;
- var labels = _this6[type].sort(function (a, b) {
- return b.pos2d.z - a.pos2d.z;
- });
- labels.forEach(function (label, index) {
- label.elem.style.zIndex = index;
- });
- });
- };
- _this.updatePersistentZooming = function (e) {
- if (1 === this.zooming) {
- this.zoomBy(1 + this.zoomSpeed * e);
- } else if (this.zooming === -1) {
- this.zoomBy(1 - this.zoomSpeed * e);
- }
- };
- _this.updateControlLocks = function () {
- if (this.currentPano && this.model.supportsTiles) {
- var ctl = this.cameraControls.controls[Viewmode$1.PANORAMA];
- ctl.locked = ctl.lockedForce || settings$3.vrEnabled || !this.currentPano.highestFullTileRenderOpCompleted && this.currentPano.lockUntilRenderingComplete; //xzw add lockedForce
- }
- };
- _this.updatePanoRenderer = function () {
- var vectorForward = new THREE.Vector3();
- return function (t) {
- var i = this.nextPano || this.currentPano;
- vectorForward.copy(Vectors$1.FORWARD);
- this.getDirection(vectorForward);
- if (this.$app.core.get('PanoRenderer').hasQueuedTiles() && i) {
- this.$app.core.get('PanoRenderer').updateDirection(vectorForward);
- }
- };
- }();
- _this.updatePreRendering = function () {
- var e = {};
- return function (t) {
- if (1 === settings$3.tiling.preRenderTourPanos && this.preRenderingEnabled) {
- var i = this.nextPano || this.currentPano;
- if (i && t && t.length > 1) {
- var n = t.findIndex(function (e) {
- if (e.id === i.id) return !0;
- });
- if (n >= 0 && n + 1 < t.length) {
- var r = t[n + 1];
- r.isLoaded(this.basePanoSize) || e[r.id] || (window.setTimeout(function (t) {
- this.checkAndWaitForPanoLoad(t, 'high', 'low', this.basePanoSize, null, null, null, !1, !1, !1), window.setTimeout(function (t) {
- e[t.id] = !1;
- }.bind(this, t), settings$3.tiling.panoPreRenderRepeatDelay);
- }.bind(this, r), settings$3.tiling.panoPreRenderDelay), e[r.id] = !0);
- }
- }
- }
- };
- }();
- _this.enablePreRendering = function () {
- this.preRenderingEnabled = !0;
- };
- _this.updateTileDownloader = function () {
- var e = new THREE.Vector3();
- return function (upcomingPanos) {
- var i = this.nextPano || this.currentPano;
- if (i) {
- var loopTime = common$1.timeMeasuring.collection['loop'].median;
- this.lowTile = this.$app.config.mobile && 'level1';
- if (this.lowTile) {
- if (loopTime > 10 || this.model.texSizeBlock * loopTime > 500) {
- //尽量不要使用,非常模糊
- this.lowTile = 'level2'; //this.flying && console.log('lowTile level2')
- }
- }
- e.copy(Vectors$1.FORWARD);
- this.getDirection(e);
- this.$app.core.get('TileDownloader').tilePrioritizer.updateCriteria(i, this.position, e, upcomingPanos.length > 0 ? upcomingPanos : null), this.$app.core.get('TileDownloader').processPriorityQueue = !0;
- }
- };
- }();
- _this.updateFromControls = function (e) {
- null !== e && void 0 !== e || (e = 0);
- var activeControl = this.cameraControls.activeControl;
- if (activeControl) {
- activeControl.update(e);
- if (this.VR && this.VR.webxr.entered) ; else {
- this.quaternion.copy(activeControl.camera.quaternion);
- }
- this.position.copy(activeControl.camera.position);
- this.target.copy(activeControl.target);
- activeControl.camera.updateProjectionMatrix();
- this.camera.projectionMatrix.copy(activeControl.camera.projectionMatrix);
- this.camera.projectionMatrixInverse.copy(activeControl.camera.projectionMatrixInverse);
- this.emit('updateFromControls', this, e); //add
- } //activeControl.camera是不更新matrixWorld的
- this.camera.position.copy(this.position);
- this.camera.quaternion.copy(this.quaternion);
- this.camera.updateMatrix();
- this.camera.updateMatrixWorld();
- };
- _this.updateIntersect = function () {
- var _this7 = this;
- //console.log('updateIntersect')
- var e = this.flying,
- t = this.isOutsideMode() && this.cameraControls.controls[this.mode].isEngaged(),
- i = transitions$1.getById(settings$3.freeze.LookTransition);
- !(e || t || this.isTouchEvent || i.length && i[0].running);
- if (this.linkEditor && this.linkEditor.footIcons && (this.linkEditor.setPanoVisible || this.linkEditor.setTagVisible)) {
- this.intersect = this.getMouseIntersect(null, this.linkEditor.footIcons.filter(function (e) {
- return e.visible && !e.otherFloorLink;
- }));
- if (this.intersect) {
- CursorDeal.add('hoverFootMarker');
- } else {
- CursorDeal.remove('hoverFootMarker');
- }
- return;
- }
- if (this.$app.Camera.monitor.control.cameras.find(function (e) {
- return e.isWatching;
- })) {
- return; //观看监控中不能点击场景物体
- }
- {
- //xzw
- var consumed;
- var consume = function consume() {
- consumed = true;
- }; //被使用
- var getConsumed = function getConsumed() {
- return consumed;
- };
- var meshes = [];
- this.emit('collectIntersectMesh', meshes, {
- consume,
- getConsumed
- }); //搜集要intersect的mesh
- if (consumed) {
- return; //有不加collider情况下获得了intersect且需要阻断的情况
- }
- var markers = this.panoMarkers.filter(function (e) {
- return e.visible && Panorama.filters.isNeighbourPanoTo(_this7.currentPano)(e.pano);
- });
- var videoTags = this.model.panos.list.filter(function (pano) {
- return pano.flagSpot && !pano.flagSpot.hidden;
- }).map(function (pano) {
- return pano.flagSpot.disc;
- });
- this.intersect = this.getMouseIntersect(null, markers.concat(videoTags));
- if (!this.intersect) {
- meshes.push.apply(meshes, _toConsumableArray(this.getColliders({
- checkChunk: this.$app.TagManager.measuringTool.isAdding
- })));
- common$1.timeMeasuring.addTimeMark('getMouseIntersect', 'start');
- this.allIntersects.length = 0;
- this.intersect = this.getMouseIntersect(null, meshes, {
- recursive: true,
- allIntersects: this.allIntersects
- }); //recursive为true写起来方便,否则textSprite检测不到sprite
- common$1.timeMeasuring.addTimeMark('getMouseIntersect', 'end', true);
- this.emit('judgeIntersect', this.intersect, {
- consume,
- getConsumed
- });
- if (consumed) return;
- }
- /* if (!this.is360View(this.mode, this.currentPano)) {
- meshes = this.model.floors.reduce(function (e, t) {
- return t.hidden ? e : e.concat(t.collider.children)
- }, meshes)
- if (this.mode == 'panorama') meshes.push(this.model.skybox)
- } */
- //this.intersect = this.getMouseIntersect(null, null)
- }
- this.intersect && this.updateClosestPano(this.intersect);
- if (this.intersectLabel && this.intersect) {
- 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)];
- this.intersectLabel.setText(text);
- this.intersectLabel.setPos(this.intersect.point);
- }
- if (this.closestPano || this.closestPanoInDirection(this.getMouseDirection()) || this.reticule.alwaysShow) {
- this.reticule.updatePosition(this.position, this.intersect);
- if (settings$3.navigation.panoScores && !settings$3.navigation.mouseDirection) {
- this.closestPanoInDirection(this.getDirection());
- }
- } else {
- this.reticule.hide();
- }
- };
- _this.getMouseDirection = function (e) {
- var inXR = this.VR && this.VR.webxr.entered;
- if (inXR) {
- return this.VR.webxr.getHandlerDir();
- }
- e = e || this.mouse;
- var t = new THREE.Vector3(e.x, e.y, -1).unproject(this.camera),
- i = new THREE.Vector3(e.x, e.y, 1).unproject(this.camera);
- return i.sub(t).normalize();
- };
- _this.getColliders = function () {
- var msg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var colliders = [];
- if (!this.is360View(this.mode, this.currentPano)) {
- if (!this.$app.config.mobile || msg.checkChunk || this.mode != Viewmode$1.PANORAMA) {
- //xzw:手机漫游时不intersect模型,因为有的模型很大,八千个mesh用时3ms。但可能导致问题:方向不准
- colliders = this.model.floors.reduce(function (e, t) {
- return t.hidden ? e : e.concat(t.collider.children);
- }, [] //this.mode === Viewmode.PANORAMA ? this.panoMarkers : []
- );
- }
- if (!msg.noSkybox && this.mode === Viewmode$1.PANORAMA) colliders.push(this.model.skybox);
- }
- return colliders;
- };
- _this.getMouseIntersect = function (mouse, colliders) {
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- _ref$recursive = _ref.recursive,
- recursive = _ref$recursive === void 0 ? false : _ref$recursive,
- type = _ref.type,
- allIntersects = _ref.allIntersects;
- mouse = mouse || this.mouse.clone();
- if (!colliders) {
- colliders = this.getColliders();
- } //performance.mark('intersect-start')
- if (this.VR && this.VR.webxr.entered) {
- this.VR.webxr.setRayCaster(this.raycaster);
- } else {
- var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(this.camera);
- this.raycaster.set(origin, this.getMouseDirection(mouse));
- }
- this.raycaster.camera = this.camera;
- var objects3d = this.raycaster.intersectObjects(colliders, recursive); //加了个true遍历子集
- /* performance.mark('intersect-end')
- let measure = performance.measure('intersect','intersect-start','intersect-end');
- colliders.length> 0 && console.log('getMouseIntersect',measure.duration.toFixed(4))
- */
- objects3d = objects3d.sort(function (a, b) {
- var _b$object$pickOrder, _a$object$pickOrder;
- 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);
- }); // 降序
- if (0 === objects3d.length) {
- return null;
- }
- if (type == 'getAll') return objects3d; //console.log('object3d', objects3d.map(e=>e.object.name))
- allIntersects === null || allIntersects === void 0 ? void 0 : allIntersects.push.apply(allIntersects, _toConsumableArray(objects3d));
- var object3d = objects3d[0];
- this.intersectAddNormal(object3d);
- return object3d;
- };
- _this.updateClosestPano = function (intersect) {
- var _this8 = this;
- // 如果在fly过程中hover到marker时会使本该隐藏的marker显示出来
- if (this.mode === Viewmode$1.TRANSITIONING) return;
- var filterFuncs = [Panorama.filters.isPanoAligned()];
- var pano;
- if (!this.flying) {
- //为了避免飞的过程中还能hover到原先currentPano的邻居点,飞的时候禁止onHover
- if (intersect && (this.panoMarkers.includes(intersect.object) || //是marker . xzw add
- this.model.panos.list.find(function (pano) {
- return pano.flagSpot && pano.flagSpot.disc == intersect.object;
- })) // 是videoTag
- ) {
- pano = intersect.object.pano; //console.log('pano = intersect.object.pano', pano.id)
- }
- if (!pano) {
- if (this.mode === Viewmode$1.PANORAMA) {
- if (!this.currentPano) {
- return;
- }
- filterFuncs.push(Panorama.filters.not(this.currentPano));
- filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano));
- filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.floorPosition, this.getDirection(), 0.25));
- filterFuncs.push(Panorama.filters.isCloseEnoughTo(intersect.point, settings$3.panoFloorClickRadius)); //如果在地面下很远,由于先识别到地面,intersect就离floorPosition很远,识别不到。所以改为先单独识别marker。
- intersect.normal && filterFuncs.push(Panorama.filters.isNotBehindNormal(intersect.point, intersect.normal));
- } else {
- // 避开孤立点,但初始点一定可进入
- filterFuncs.push(function (pano) {
- return _this8.linkEditor.checkHasNeighbor(pano) || pano == _this8.$app.core.get('Scene').firstView.pano;
- });
- filterFuncs.push(Panorama.filters.isOnVisibleFloor());
- this.mode !== Viewmode$1.FLOORPLAN && filterFuncs.push(Panorama.filters.inDirection(this.position, this.getDirection(), 0.25));
- }
- pano = this.model.panos.find(filterFuncs, [Panorama.sortFunctions.floorDistanceToPoint(intersect.point)]);
- }
- }
- if (pano !== this.closestPano) {
- pano && (this.isPanoHover = !0); //触发事件,导致地面的marker变清晰
- this.emit(PlayerEvents.ClosestPanoChanging, this.closestPano, pano, this.mode);
- this.closestPano = pano;
- } else {
- this.isPanoHover = !1;
- }
- };
- _this.dollhouseMode = function (position, quaternion) {
- this.modeTran = 'dollhouse-panorama';
- this.emit(PlayerEvents.ModeChanging, this.mode, Viewmode$1.DOLLHOUSE);
- this.mode = Viewmode$1.DOLLHOUSE;
- this.cameraControls.controls[Viewmode$1.DOLLHOUSE].reset();
- var center = new THREE.Vector3(this.model.center.x, 0, this.model.center.z),
- cameraPosition = new THREE.Vector3(15, 10, 15);
- if (position && quaternion) {
- var direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion),
- position = this.model.center.clone().sub(position),
- s = position.dot(direction);
- if (s > 0) {
- center = direction.clone().multiplyScalar(s).add(position); //cameraPosition.copy(position)
- } else {
- logger$1.warn("Tried to initiate dollhouse mode that wasn'quaternion looking at the model", position, quaternion);
- }
- }
- this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges(0, !0);
- this.cameraControls.controls[Viewmode$1.DOLLHOUSE].target.copy(center);
- this.cameraControls.cameras[Viewmode$1.DOLLHOUSE].position.copy(cameraPosition);
- this.updateFromControls();
- this.model.alpha = 1;
- this.model.skybox.material.uniforms.opacity.value = 0;
- };
- _this.insideMode = function (pano, callback) {
- var deferred = Deferred$1(),
- callbackFunc = callback || null;
- if (this.mode !== Viewmode$1.PANORAMA && this.mode !== Viewmode$1.TRANSITIONING) {
- if (!pano) {
- if (!this.currentPano || this.model.currentFloor && this.currentPano.floor != this.model.currentFloor) {
- pano = this.getFloorPanoByScore(null, this.model.currentFloor); //到当前所在楼层
- }
- if (!pano) {
- pano = this.currentPano;
- }
- }
- this.flyToNewMode({
- mode: Viewmode$1.PANORAMA,
- pano: pano,
- callback: callbackFunc
- }).done(deferred.resolve.bind(deferred)).fail(deferred.reject.bind(deferred));
- } else {
- var msg = 'Cannot change mode during mode transition';
- if (this.mode === Viewmode$1.PANORAMA) {
- msg = 'Already in panorama mode';
- }
- deferred.reject(msg);
- }
- return deferred.promise();
- };
- _this.fitDollhouse = function (initPosition1, initPosition2, initQuaternion) {
- var maxY = this.model.boundingBox.max.y;
- var n = Vectors$1.FORWARD.clone().applyQuaternion(initQuaternion);
- initQuaternion = n.clone().add(initPosition1);
- this.cameraControls.activeControl.target.copy(initQuaternion);
- this.cameraControls.activeControl.camera.position.set(0, maxY * 2.4, 0).add(initPosition1).add(n.multiplyScalar(-10));
- /*
- var n = Vectors.FORWARD.clone().applyQuaternion(initQuaternion)
- this.cameraControls.activeControl.target.copy(n).add(initPosition1)
- var o = Vectors.RIGHT.clone().applyQuaternion(initQuaternion),
- a = Vectors.UP.clone(),
- s = o.clone().applyAxisAngle(a, Math.PI / 2),
- boundingBoxMax = this.model.boundingBox.max.clone(),
- boundingBoxMin = this.model.boundingBox.min.clone(),
- h = [
- new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMax.z).sub(initPosition1),
- new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMin.z).sub(initPosition1),
- new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMax.z).sub(initPosition1),
- new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMin.z).sub(initPosition1)
- ],
- u = 0,
- p = 0,
- g = 0
- h.forEach(function(e, t, i) {
- var n = Math.abs(e.dot(o)),
- r = e.dot(s)
- n > u && ((u = n), (p = r)), r > g && (g = r)
- })
- 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))),
- v = s
- .clone()
- .multiplyScalar(p)
- .add(initPosition2),
- A = s
- .clone()
- .multiplyScalar(g)
- .add(initPosition2)
- ;(p = u / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * this.cameraControls.activeControl.camera.aspect * (Math.PI / 180))),
- (g = m / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * (Math.PI / 180))),
- (p = Math.max(p, 10)),
- (g = Math.max(g, 10))
- var y = n
- .clone()
- .multiplyScalar(-p)
- .add(v)
- .sub(initPosition2)
- .length(),
- C = n
- .clone()
- .multiplyScalar(-g)
- .add(v)
- .sub(initPosition2)
- .length()
- this.cameraControls.activeControl.maxDistance = settings.skyboxRadius - 1
- if (y >= C) {
- this.cameraControls.activeControl.camera.position
- .set(0, 6, 0)
- .add(v)
- .add(n.multiplyScalar(1.1 * -p))
- } else {
- this.cameraControls.activeControl.camera.position
- .set(0, 6, 0)
- .add(A)
- .add(n.multiplyScalar(1.1 * -g))
- }
- */
- };
- _this.floorplanMode = function (position, quaternion, zoom, ratio) {
- this.mode = Viewmode$1.FLOORPLAN;
- var control = this.cameraControls.controls[Viewmode$1.FLOORPLAN];
- control.reset();
- var cameraPosition = position ? position : this.model.center;
- control.target.copy(cameraPosition).setY(0);
- control.camera.position.copy(cameraPosition).setY(settings$3.floorplan.cameraHeight);
- if (zoom) {
- control.currentScale = zoom / (this.domElement.clientWidth / this.domElement.clientHeight);
- control.absoluteScale = control.currentScale;
- } else {
- control.zoomToContain(this.model.size, ratio);
- }
- if (quaternion) {
- var direction = Vectors$1.LEFT.clone().applyQuaternion(quaternion);
- control.rotateLeft(-Math.atan2(direction.x, direction.z));
- } else {
- control.rotateToView(this.model.size, this.getDirection());
- }
- control.update(0);
- };
- _this.getAimToNextPano = function (pano, aim, aimQua) {
- //flyToPano 获取quaternion
- var hasVideo;
- if (!aim && !aimQua) {
- var askAim = {
- importance: 0,
- aim: null
- }; //发送请求看看是否需要强制focus的点(比如热点添加时)
- this.emit('ifFocusPoint', askAim);
- if (askAim.aim) {
- if (askAim.importance >= 3) {
- //importance判断权重
- aim = askAim.aim;
- }
- }
- }
- if (!aim) {
- if (pano.panoVideo) {
- hasVideo = true;
- aim = pano.position.clone().add(pano.panoVideo.dir);
- } else {
- hasVideo = !aim && pano.hasVideo && this.$app.core.get('PanoVideoRenderer') && this.$app.core.get('PanoVideoRenderer').ifEnable();
- if (hasVideo) {
- // if(!objects.mainDesign || !objects.mainDesign.editing){
- if (pano.videoInfo.dir) {
- //同panoVideo 展示页
- aim = pano.position.clone().add(pano.videoInfo.dir);
- } else {
- var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
- aim = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion)).add(pano.position);
- } // }
- }
- }
- }
- if (aim) aimQua = convertTool.getQuaByAim(aim, pano.position);else aimQua = aimQua;
- return {
- aimQua,
- hasVideo
- };
- };
- _this.flyToPano = function (toPano, callbackFunc) {
- var _this9 = this;
- /* toPano.callback = callbackFunc
- return this.fastToPano(toPano ) */
- //-----测试瞬间过渡
- if (this.locked) {
- return;
- }
- if (typeof toPano == 'number' || typeof toPano == 'string') toPano = {
- pano: this.model.panos.index[toPano]
- };else if (toPano instanceof Panorama) toPano = {
- pano: toPano
- };
- var pano = toPano.pano,
- aim = toPano.lookAtPoint,
- //优先级比quaternion 高
- aimQua = toPano.quaternion,
- duration = toPano.duration,
- aimDuration = toPano.aimDuration,
- rotSpeed = toPano.rotSpeed;
- //xzw
- toPano.maxDistanceOverride;
- toPano.skipWarpingCheck;
- //constantMoveSpeed = toPano.constantMoveSpeed,
- toPano.easeType;
- var //如果为'constant'代表一直保持某个速度,一般是导览,直到最后一个点减速
- newPano = null,
- retryCallback = null,
- zoomLevel = toPano.zoomLevel || (settings$3.zoom.zoomToDefaultWhenToPano ? 1 : this.zoomLevel),
- //add
- cancelLookFun = toPano.cancelLookFun,
- checkAlone = toPano.checkAlone;
- callbackFunc = callbackFunc || toPano.callback;
- toPano.quaOri = this.quaternion.clone(); //记录一下
- if (typeof pano == 'number') pano = toPano.pano = this.model.panos.index[pano];
- if (this.EditPanoMosaic && this.EditPanoMosaic.editVideo && this.EditPanoMosaic.editVideo.pano != pano) {
- return;
- } // checkAlone 如果pano是孤立点,则根据aim跳转到最近的非孤立点
- if (checkAlone && aim && pano.neighbourUUIDs.filter(function (id) {
- return id != pano.id;
- }).length == 0) {
- var notAlonePano = this.model.panos.closestPanoTowardPoint({
- point: aim,
- require: [function (pano) {
- return pano.neighbourUUIDs.filter(function (id) {
- return id != pano.id;
- }).length > 0;
- }]
- });
- if (notAlonePano) {
- pano = notAlonePano;
- toPano.pano = pano;
- }
- }
- if (!toPano.gotQua) {
- var _this$getAimToNextPan = this.getAimToNextPano(pano, aim, aimQua),
- aimQua = _this$getAimToNextPan.aimQua;
- _this$getAimToNextPan.hasVideo;
- toPano.quaternion = aimQua;
- toPano.gotQua = true;
- } //this.updateLastView();
- //飞入
- if (this.mode !== Viewmode$1.PANORAMA) {
- return void this.flyToNewMode({
- mode: Viewmode$1.PANORAMA,
- pano: pano,
- duration: duration,
- quaternion: aimQua,
- callback: callbackFunc
- });
- }
- /*
- toPano.callback = callbackFunc
- return this.fastToPano(toPano ) //-----测试瞬间过渡
- */
- //console.log('this.flying',this.flying, this.panosTaskList.length)
- var isFade360 = this.is360View(this.mode, pano) || this.is360View(this.mode, this.currentPano);
- if (!this.judgePanoTask(toPano, isFade360)) {
- //console.log('judgePanoTask return',this.panosTaskList )
- callbackFunc && callbackFunc(false);
- return;
- } //处理panosTaskList
- //this.$app.core.get('PanoVideoRenderer').activatePanorama(pano)
- if (pano) {
- newPano = common$1.deepExtend(toPano);
- retryCallback = function () {
- common$1.delayOneFrame(function () {
- if (this.panosTaskList[0] != newPano) {
- //非最新任务
- //checkAndWaitForPanoLoad可能有点问题,isLoaded和callback不同步?导致add了没及时 consume
- return log();
- }
- newPano.retry = true; //add
- this.flyToPano(newPano, callbackFunc);
- }.bind(this));
- }.bind(this);
- }
- if (config$6.mobile) {
- //手机端的终点出发时使用1024,直到到达终点(也就是高了要降, 低了不升)
- this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
- size: 1024
- });
- if (this.lowTile == 'level2') {
- if (!pano.tiledPanoRenderTarget) {
- //非快速漫游时降当前的漫游点
- this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
- size: 1024
- });
- }
- }
- } else {
- if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
- size: 2048
- }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
- }
- if (!pano || !this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retryCallback)) {
- // logger.time(`[fly to pano] ${pano && pano.id}`)
- console.log("[flytopano]", pano && pano.id);
- var callback = toPano.finalCallback = function (flyDone) {
- //console.log('飞callback', this.currentPano.id )
- this.nextPanoTask(toPano, flyDone); //继续执行panosTaskList的下一个pano
- callbackFunc && callbackFunc(flyDone); //xzw 2022.7.8移动到最后。 万一callbackFunc中包含要飞向下一个,就需要先执行 nextPanoTask。但是万一又需要这个先怎么办
- }.bind(this);
- if (!this.currentPano) {
- this.currentPano = pano;
- } //this.adjustFlySpeed(this.currentPano, pano)
- var _duration = duration;
- if (typeof duration != 'number') {
- _duration = this.computeDuration(toPano);
- } // 加载3dtiles会拖长跳转时间,减去150ms比较合适 //无缝过渡不允许修改
- //if (this.model._3dTilesRuntime) _duration = Math.max(_duration - 150, 1)
- toPano.duration = _duration;
- log('flytopano', toPano.pano.id, toPano, this.panosTaskList.map(function (e) {
- return e.pano.id;
- }));
- /* if( this.panosTaskList[0] != toPano ){
- console.error('?')
- } */
- if (this.zoomLevel !== zoomLevel) {
- switch (settings$3.zoom.transitionStyle) {
- case 1:
- this.smoothZoomLevelTo(zoomLevel, _duration / 2);
- break;
- case 2:
- newPano = common$1.deepExtend(toPano);
- retryCallback = this.flyToPano.bind(this, newPano, callbackFunc);
- return void this.smoothZoomLevelTo(zoomLevel, settings$3.zoom.restoreTime * (this.zoomLevel - zoomLevel), retryCallback);
- }
- }
- if (aimQua
- /* && !isFade360 */
- ) {
- var quaNow = toPano.quaOri.clone();
- var M = new THREE.Vector3();
- transitions$1.cancelById(settings$3.freeze.LookTransition); //_duration *= settings.transition.aimSlowFactor
- if (pano === this.currentPano) {
- var R = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaOri),
- P = Vectors$1.FORWARD.clone().applyQuaternion(aimQua),
- O = R.angleTo(P);
- var callback2 = function callback2() {
- callback(true);
- _this9.emit('flytopano.rotateEnd', {});
- };
- this.flyRotate = true; //许钟文 add 在原地旋转,看向某一点
- return void 0 != aimDuration || (aimDuration = 1 * Math.sqrt(O) / (rotSpeed ? rotSpeed : settings$3.tags.navigate.rotateSpeedFactor) * 1e3), void transitions$1.start(function (ee) {
- if (this.mode != Viewmode$1.PANORAMA) {
- //xzw
- transitions$1.cancelById(settings$3.freeze.LookTransition);
- callback2();
- return;
- }
- quaNow.copy(toPano.quaOri);
- lerp.quaternion(quaNow, aimQua)(ee);
- M.copy(convertTool.getAimByQua(quaNow, this.cameraControls.activeControl.camera.position));
- this.cameraControls.activeControl.lookAt(M);
- }.bind(this), aimDuration, callback2, 0, easing[settings$3.transition.movementEasing], null, settings$3.freeze.LookTransition, cancelLookFun);
- }
- }
- if (pano === this.currentPano || this.flying) {
- log('flytopano return ', pano === this.currentPano, this.flying);
- return void callback();
- }
- this.flying = !0;
- this.position.clone();
- var currentPano = this.currentPano;
- this.nextPano = pano; // logger.debug('Flying to pano ', pano.position)
- this.emit(PlayerEvents.PanoChosen, this.currentPano, pano); // this.emit(PlayerEvents.FlyingStarted, {
- // targetPosition: pano.position,
- // currentPosition: position,
- // targetPano: pano,
- // currentPano: currentPano,
- // type: 'flyToPano',
- // })
- // currentPano必须加上,否则球幕视频挂起失效
- this.emit(PlayerEvents.FlyingStarted, {
- panoId: pano.id,
- quaternion: aimQua,
- lastPanoId: currentPano.id,
- type: 'flyToPano',
- duration: toPano.duration,
- isTagFlying: toPano.isTagFlying // 飞向热点
- });
- this.model.currentFloor = pano.floor;
- this.doorLabels.forEach(function (label) {
- return label.updateVisible(pano);
- });
- this.model.fadePanoMarkers(0, 0, {
- hideVideoFlag: true
- }); //过渡时先隐藏, 因marker可能飘
- if (isFade360) {
- this.fade360View(this.cameraControls.activeControl.camera, {
- pano: pano,
- aim: aim,
- aimQua: aimQua
- }, function () {
- _this9.afterFlyToPano(toPano);
- });
- return;
- } //地标变化
- this.model.floorLogos.changefloorLogoOpa({
- index: 0,
- opa: 0,
- dur: _duration,
- delay: 0.7
- }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
- this.model.floorLogos.secondLogo.position.copy(pano.floorPosition.clone().sub(this.model.position)); //this.model.floorLogos.adjustfloorLogoHeight();
- common$1.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', true); //第二个地标只在过渡时显示
- this.model.floorLogos.changefloorLogoOpa({
- index: 1,
- opa: 1,
- dur: 250
- }); //this.model.floorLogoShow(1,250);
- //flyingWithRot边飞边旋转 (许钟文)
- if (aimQua && !isFade360) {
- this.flyingWithRot = true;
- toPano.aimQua = aimQua;
- }
- toPano.chunkProgress = this.judgeHideWall(pano); //穿墙判断
- //console.log('执行过渡:' + _duration)
- this.startTransition(toPano); // // 虚拟人物导览对象
- // const roleAnimation = this.$app.TourManager.roleAnimation
- // //离toPano 3米距离
- // if (roleAnimation && roleAnimation.model && this.$app.TourManager.playing && aimQua) {
- // let newRolePosition = roleAnimation.getTarget2(toPano.pano.position.clone(), aimQua.clone(), 0, 3)
- // const roleStartPosition = roleAnimation.model.position.clone()
- // //人物到目的地的方向
- // const direction = new THREE.Vector3().subVectors(newRolePosition, roleStartPosition)
- // if (toPano.duration != 0) {
- // //let speed = this.currentPano.position.distanceTo(toPano.pano.position) / toPano.duration
- // let speed = roleStartPosition.distanceTo(newRolePosition) / toPano.duration
- // roleAnimation.setModifyTimeScale(speed * 500)
- // //console.log('speed:' + speed)
- // }
- // transitions.start(
- // progress => {
- // if (progress != 0 && progress != 1 && roleAnimation.getVisible()) {
- // //累加并更新人物坐标
- // let _newRolePosition = new THREE.Vector3().addVectors(roleStartPosition, new THREE.Vector3(direction.x * progress, 0, direction.z * progress))
- // roleAnimation.setWalkingToTarget(_newRolePosition)
- // roleAnimation.model.position.set(_newRolePosition.x, this.model.currentFloor.boundingBox.min.y, _newRolePosition.z)
- // //console.log('RoleAnimation-setWalkingToTarget1:' + roleAnimation.model.rotation.y + '&&' + progress)
- // }
- // },
- // toPano.duration,
- // null,
- // 0,
- // null,
- // null,
- // 'roleWalk'
- // )
- // }
- }
- };
- _this.startTransition = function (toPano) {
- var _this10 = this;
- //this.model.chunks.forEach(e => common.updateVisible(e, 'force', false))
- if (!toPano.easeFun) toPano.easeFun = easing.linearTween;
- var startProgress = toPano.progress || 0; // 同屏时过渡transitionsId必须做区分
- var transitionsId = this.$app.resource.num + settings$3.freeze.FlyToPano;
- transitions$1.cancelById(transitionsId);
- var dis = this.currentPano.position.distanceTo(toPano.pano.position);
- var loadNextProgress = THREE.MathUtils.clamp(1 - 2 / dis, 0, 0.9);
- var quaNow = toPano.quaOri.clone();
- var M = new THREE.Vector3();
- this.emit('startTransition', toPano);
- /* console.log(
- 'startTransition ',
- toPano.pano.id,
- toPano.easeFun == easing.easeOutSine ? '减速' : '匀速',
- (toPano.easeFun == easing.linearTween && toPano.flySpeed) ? '目标速度' + toPano.flySpeed.toFixed(5) : '',
- 'dur', toPano.duration.toFixed(2),
- 'pgs',toPano.progress.toFixed(3),
- toPano.easeFun == easing.linearTween ? 'loadNextP '+ loadNextProgress.toFixed(2):''
- ) */
- transitions$1.start(function (progress_, delta) {
- var item = transitions$1.getById(transitionsId)[0];
- var progress = startProgress + progress_ * (1 - startProgress);
- var currentSpeed;
- if (progress_ != 1 && progress_ != 0) {
- // 1的时候不准,往往偏小, 0的时候速度为0,也不记录
- currentSpeed = toPano.currentSpeed = (progress - toPano.progress) * dis / delta; //记录下当前速度,当变为匀速时可以过渡到flySpeed
- //console.log('currentSpeed',currentSpeed, progress_, progress)
- } else {
- currentSpeed = toPano.currentSpeed || 0;
- } //console.log('progress',progress, delta)
- toPano.progress = progress;
- if (progress_ > 0 && progress_ < 1 && delta) {
- var adjustSpeed = function adjustSpeed(ratio, cause) {
- var maxChange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.08;
- //调速
- var change = Math.abs(ratio - 1);
- if (change > maxChange) {
- if (ratio > 1) ratio = 1 + maxChange;else ratio = 1 - maxChange;
- }
- transitions$1.adjustSpeed(transitionsId, ratio); //改速
- transitions$1.adjustSpeed(settings$3.freeze.LookTransition, ratio); //把旋转的也改速下
- //console.log(cause, 'ratio', ratio.toFixed(4), 'speed', currentSpeed.toFixed(5), 'progress', progress.toFixed(4), 'dur',item.duration.toFixed(3))
- };
- if (toPano.easeFun == easing.linearTween && toPano.flySpeed) {
- //调整速度向期望速度靠近(匀速时的flySpeed是期望速度)
- if (currentSpeed > 0 && !math$2.closeTo(currentSpeed, toPano.flySpeed) && toPano.flySpeed) {
- var ratio = toPano.flySpeed / currentSpeed;
- var maxChange = toPano.easeType == 'constant' ? ratio - 1 : 0.01; //改变幅度小的话,有惰性,可以保持接近匀速但整体又能保持平均标准速度。 导览不限制最大变速
- adjustSpeed(ratio, '渐变匀速', maxChange);
- }
- }
- if (progress > loadNextProgress && toPano.flyCount == 1 && toPano.easeFun == easing.linearTween
- /* && toPano.easeType != 'constant' */
- && _this10.panosTaskList.length == 1) {
- //匀速行走超过一半时,若还是最后一个,就减速(之后若又按下,还会变为匀速)
- toPano.easeFun = easing.easeOutSine;
- var restDis = (1 - progress) * dis;
- toPano.duration = Math.PI / 2 * restDis / currentSpeed;
- /* settings.transition.flySpeed */
- // 这样能保证初始速度为flySpeed
- toPano.duration = Math.max(toPano.duration, settings$3.transition.flyTime - item.duration * progress); //避免停止过于迅速
- toPano.ignoreFirstFrame = false;
- _this10.startTransition(toPano);
- }
- if (progress > 0.2 && _this10.panosTaskList.length > 1 && !_this10.panosTaskList[1].pano.tiledPanoRenderTarget) {
- //无缝过渡中途 提前加载下一个, 防止停顿
- _this10.$app.core.get('PanoRenderer').switchPanoQuality(_this10.panosTaskList[1].pano, {
- useIdel: true,
- size: _this10.lowTile == 'level2' ? 512 : 1024
- }); //该质量将会一直持续到到达它
- _this10.checkAndWaitForPanoLoad(_this10.panosTaskList[1].pano, 'low', 'low', _this10.basePanoSize, function () {}); //'low', 'low'
- }
- /* if(toPano.easeFun != easing.linearTween && progress > 0.1 && progress < 0.9 && currentSpeed > 0.001 && item.duration < settings.transition.flyTime){
- let r = THREE.MathUtils.clamp(item.duration * 2.3 / settings.transition.flyTime, 0.9, 0.95)
- adjustSpeed(r, '降速') //防止停止的最后一段因太短而迅速停止
- } */
- }
- _this10.model.skybox.material.uniforms.progress.value = progress;
- _this10.emit('updataProgress', progress); //别的模块借用一下透明度
- if (toPano.chunkProgress) {
- _this10.model.chunks.forEach(function (e) {
- return e.materialInside.uniforms.progress.value = progress;
- });
- }
- if (isNaN(progress)) {
- console.error('progress isNaN', progress, progress_, startProgress, delta, toPano.duration, toPano);
- transitions$1.cancelById(transitionsId);
- }
- var position = _this10.currentPano.position.clone();
- var endPos = toPano.pano.position.clone();
- lerp.vector(position, endPos)(progress);
- _this10.cameraControls.cameras[Viewmode$1.PANORAMA].position.copy(position); //过渡的同时旋转镜头
- if (toPano.aimQua) {
- quaNow.copy(toPano.quaOri);
- lerp.quaternion(quaNow, toPano.aimQua)(progress);
- M.copy(convertTool.getAimByQua(quaNow, _this10.cameraControls.activeControl.camera.position));
- _this10.cameraControls.activeControl.lookAt(M);
- }
- }, toPano.duration, this.afterFlyToPano.bind(this, toPano), 0, toPano.easeFun, 'chunkFly', transitionsId, function () {
- //cancelById
- _this10.afterFlyToPano(toPano, true);
- }, toPano.ignoreFirstFrame);
- toPano.flyCount++;
- };
- _this.nextPanoTask = function (lastToPano, dealTask) {
- if (lastToPano == this.panosTaskList[0]) this.panosTaskList.splice(0, 1); //this.off('makeConstantSpeed', startTransition)
- if (dealTask && this.panosTaskList.length) {
- //继续处理下一个任务
- var next = this.panosTaskList[0];
- next.dealingTask = true; //log('准备执行下一个任务', this.panosTaskList[0].pano.id)
- var dis = next.pano.position.distanceTo(lastToPano.pano.position);
- var currentSpeed = lastToPano.currentSpeed;
- var hopeDur = this.computeDuration(next);
- currentSpeed = Math.max(0.002, currentSpeed);
- next.duration = dis / currentSpeed; //初始速度,为了衔接。即将被使用
- if (next.quaternion) {
- next.duration = hopeDur; //next.duration = Math.max(hopeDur/3, next.duration) //防止过小,导致后期追不上标准速度,尤其是有转向时
- }
- next.flySpeed = dis / hopeDur; //期待速度, 是标准速度
- //console.log('上一个的速度', currentSpeed, '期待速度', next.flySpeed)
- this.flyToPano(next);
- }
- };
- _this.judgePanoTask = function (toPano, isFade360) {
- //处理panosTaskList
- toPano.progress = toPano.progress || 0;
- toPano.flyCount = 0;
- var length = this.panosTaskList.length;
- var last = this.panosTaskList[length - 1];
- if (this.dontInterruptPanoTask) {
- return !!toPano.dealingTask;
- }
- if (!toPano.retry && !toPano.dealingTask) {
- var currentTask = this.panosTaskList[0];
- /* if (currentTask && !currentTask.canConstantlyWalk) {
- return console.log('当前执行的是非canConstantlyWalk,不允许加入')
- } */
- if (toPano.quaternion || isFade360) {
- //遇到特殊的toPano,在这之后不能继续添加
- toPano.canConstantlyWalk = false; //是否可以一直点击一直走。(是否允许添加下一个)
- } // 如果上个点位tile加载有问题卡住,就直接清空panosTaskList
- if (last && last.pano.tileError) {
- this.clearPanosTaskList();
- length = 0;
- last = undefined;
- }
- if (length == 0 || last.canConstantlyWalk || toPano.pano == this.currentPano) {
- if (length > 0) {
- if (this.panosTaskList.some(function (e) {
- var _e$lookAtPoint;
- 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)));
- })) {
- //去除重复的
- return;
- }
- /* let wholeDur = this.panosTaskList.reduce((w, c) => {
- return w + c.duration
- }, 0)
- if (length > 4 || (wholeDur > 2500 && length > 1)) {
- //console.log('过多',length, wholeDur)
- return
- } */
- if (length > 1) return;
- if (currentTask.flyCount == 0
- /* && currentTask.easeType != 'constant' */
- ) {
- return;
- }
- }
- this.panosTaskList.push(toPano); //只要通过都加入列表,包括 == currentPano的
- length++;
- log('panosTaskList加入', toPano.pano.id);
- } else {
- return log();
- }
- if (length > 1) {
- //等待上一个任务完成
- //log('增加任务', toPano.pano.id)
- /* let {k, easeFun } = easing.getEaseOut( 2 / dis + 1)
- toPano.easeFun = easeFun
- toPano.duration = k * dis / settings.transition.flySpeed */
- //当前任务如果不是匀速,要变成匀速, 且重新执行:
- if (currentTask.easeFun != easing.linearTween) {
- var dis = this.currentPano.position.distanceTo(currentTask.pano.position);
- var restDis = (1 - currentTask.progress) * dis; //console.log('currentSpeed', currentTask.currentSpeed)
- var currentSpeed = Math.max(currentTask.currentSpeed, 0.002); //避免起步过慢
- var newDur = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
- if (isNaN(newDur)) {
- console.error('newDur isNaN', currentSpeed, currentTask.progress, currentTask);
- }
- currentTask.easeFun = easing.linearTween;
- currentTask.flySpeed = dis / this.computeDuration(currentTask); //渐变加速到标准速度
- currentTask.duration = newDur;
- this.startTransition(currentTask);
- }
- return;
- }
- }
- return true;
- };
- _this.judgeHideWall = function (pano) {
- var chunkProgress = true;
- /* if(objects.mainDesign && objects.mainDesign.editing){
- chunkProgress = false; editModel = true;
- } */
- //var metadata = this.store.getters['scene/metadata'];
- //if(metadata.sceneSource != 12){//123永远要显示模型
- this.model.chunks.forEach(function (e) {
- return common$1.updateVisible(e, 'isBlock', true);
- }); //先显示
- if (this.currentPano.noBlockPanos.includes(pano.id)) ; else {
- //4.6.0 xzw
- //console.log('judgeHideWall', pano.id)
- //在算法部将有门的地方更改为不隐藏模型之前,先这么写: 判断走过的路中是否真的穿墙。
- if (this.currentPano.blocks[pano.id]) {
- this.hideWalls = this.currentPano.blocks[pano.id];
- this.hideWalls.forEach(function (hideWall) {
- common$1.updateVisible(hideWall, 'isBlock', false);
- });
- } else {
- var safeDepth = 0.1; //向前后延伸一些,为了防止刚好墙壁在眼前
- var A = this.currentPano.origin.clone();
- var B = pano.origin.clone();
- var AB_ = B.clone().sub(A).normalize().multiplyScalar(safeDepth);
- var A_ = A.clone().sub(AB_); //延长A到A_ 延长长度为safeDepth
- var B_ = B.clone().add(AB_); //延长B到B_ 延长长度为safeDepth
- var intersects = convertTool.ifIntersectChunks(A_, B_, this.model, {
- throughWidth: 0.08,
- meshes: this.model.chunks
- });
- if (intersects) {
- //throughWidth是为了防止刚好从缝隙中穿过,感觉和穿墙近似
- this.hideWalls = intersects.map(function (intersect) {
- intersect.object.visible = false;
- return intersect.object;
- });
- {
- //非编辑页面要记录下,下次不用判断
- this.currentPano.blocks[pano.id] = this.hideWalls.slice(0);
- }
- } else {
- {
- //非编辑页面要记录下,下次不用判断
- this.currentPano.noBlockPanos.push(pano.id);
- }
- }
- }
- }
- return chunkProgress;
- };
- _this.afterFlyToPano = function (toPano, cancel) {
- this.currentPano.isAligned() && (this.lastPano = this.currentPano); //add
- if (this.currentPano !== toPano.pano) {
- this.currentPano.exit();
- toPano.pano.enter();
- this.currentPano = toPano.pano;
- this.nextPano = null;
- this.path.placeCpm();
- if (this.mode == Viewmode$1.PANORAMA) {
- this.path.fadeOutCpm(settings$3.path.fadeOutTime);
- this.paintEditor && this.paintEditor.updatePanoPaint(this.currentPano.id, this.currentPano.id);
- }
- }
- if (!cancel) {
- if (this.mode == Viewmode$1.PANORAMA) {
- this.flying = !1;
- this.emit(PlayerEvents.FlyingEnded, {
- targetPosition: toPano.pano.position,
- currentPosition: toPano.pano.position,
- targetPano: toPano.pano,
- currentPano: this.currentPano
- });
- this.model.floorLogos.firstLogo.position.copy(this.model.floorLogos.secondLogo.position); //this.model.floorLogos.adjustfloorLogoHeight()
- this.model.floorLogos.changefloorLogoOpa({
- index: 0,
- opa: 1,
- dur: 0
- }); //this.model.floorLogos[0].material.uniforms.opacity.value = 1;
- common$1.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', false);
- this.model.chunks.forEach(function (chunk) {
- chunk.materialInside.uniforms.progress.value = 1; //chunk.visible = true // 需要显示因穿墙而隐藏的模型
- common$1.updateVisible(chunk, 'isBlock', true); //vr模式下似乎不能隐藏?settings.vrEnabled 因为改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关?????
- });
- this.panosTaskList.length == 1 && this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
- size: 2048
- }); //非无缝过渡时 升quality
- }
- this.model.fadePanoMarkers();
- this.doorLabels.forEach(function (label) {
- return label.updateVisible();
- });
- this.lastFlyPanoDoneTime = Date.now(); //logger.timeEnd(`[fly to pano] ${this.currentPano.id}`)
- toPano.finalCallback && toPano.finalCallback(true);
- }
- };
- _this.fastToPano = function () {
- var _this11 = this;
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //瞬间过渡(支持同点过渡,支持角度)
- if (this.flying || this.isWarping()) return;
- var pano = o.pano || this.model.panos.index[o.panoId];
- if (!pano) return console.error('fastToPano pano 无');
- this.position.clone();
- var oldPano = this.currentPano;
- var duration = o.duration || 1500;
- this.path.warpDestPano = pano;
- var retry = function retry() {
- _this11.waitingToWarp = !1, _this11.fastToPano(o);
- };
- if (config$6.mobile) {
- //手机端的终点出发时使用1024,直到到达终点
- this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
- size: 1024
- });
- } else {
- if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
- size: 2048
- }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
- }
- if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retry)) return void (this.waitingToWarp = !0);
- this.emit('pano.chosen', oldPano, pano); // 用于暂停oldPano的球幕视频播放
- this.emit(PlayerEvents.FlyingStarted, {
- panoId: pano.id,
- lastPanoId: oldPano.id,
- type: 'flyToPano'
- });
- this.flying = true;
- this.nextPano = pano; //提前加载高清图片
- this.path.warpDestHeroLoc = {
- panoId: o.panoId,
- position: pano.position,
- quaternion: o.quaternion || this.quaternion.clone()
- }; //console.log('fastToPano', pano && pano.id )
- logger$1.time("[fly to pano] ".concat(pano && pano.id));
- this.path.warpTravel_BLACK(null, duration, 1, function () {
- /* pano != this.currentPano && this.currentPano.exit()
- pano.enter()
- this.currentPano = pano
- this.flying = false */
- //this.emit("flying.ended", pano.position, oldPos, pano, oldPano)
- o.finalCallback = o.callback;
- _this11.afterFlyToPano(o);
- });
- };
- _this.fade360View = function (currentCamera, o, fuc) {
- var _this12 = this;
- //这个其实可以用fastToPano
- var transitionTime = o.transitionTime || 400;
- if (o.pano && o.pano.view) {
- if (!this.viewLinkManager.views[o.pano.view.sid]) {
- fuc && fuc();
- return;
- } //已经删除
- if (this.enteringView) {
- console.log('重复进入360');
- fuc && fuc();
- return;
- }
- if (o.pano == this.currentPano && !o.flyIn) {
- console.log('已经在此360漫游点');
- fuc && fuc();
- return;
- }
- o.pano.view.entering = true;
- this.enteringView = o.pano.view; //从开始直到doAfterFlying这段时间标记player的状态是正在fade360View
- } //热点直接利用updateVisible
- //this.model.wallManager.updateRulersVisi(false);
- this.domElement.style.opacity = 1; //init value
- transitions$1.start(lerp.property(this.domElement.style, 'opacity', 0), transitionTime, function () {
- !o.flyIn && config$6.mobile && _this12.$app.core.get('PanoRenderer').switchPanoQuality(_this12.currentPano, {
- size: 1024
- }); //降旧的。其实也可以直接exit,但shader里要确保用不到tex
- o.pano && _this12.$app.core.get('PanoRenderer').switchPanoQuality(o.pano, {
- size: 2048
- });
- _this12.model.skybox.material.uniforms.opacity.value = o.skyboxOpacity != void 0 ? o.skyboxOpacity : 1;
- _this12.model.alpha = o.modelAlpha != void 0 ? o.modelAlpha : 0;
- o.pano && (currentCamera.position.copy(o.pano.position), currentCamera.quaternion.copy(o.pano.quaternion));
- var enterView = !!(o.pano && o.pano.view),
- leaveView = !!(_this12.is360View(_this12.mode, _this12.currentPano) && !o.flyIn || o.flyOut); //console.log('fade360View : ', enterView, leaveView)
- if (enterView) {
- //进入360view
- o.pano.view.exitDoor.mesh.visible = true; //console.log("exitDoor.mesh.show "+o.pano.view.sid)
- //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.END, transitionTime)
- _this12.viewLinkManager.updateCirclesWhenFade('enter', o);
- o.pano.view.balloon.showOrHide(false);
- o.pano.view.entering = false;
- var lookAtPoint = o.aim || new THREE.Vector3(0, 0, -1).applyQuaternion(o.pano.view.enterQuaternion || o.pano.quaternion).add(currentCamera.position);
- _this12.cameraControls.controls.panorama.lookAt(lookAtPoint);
- _this12.cameraControls.controls.panorama.update(0); //this.OverlayManager.setGroupVisible(false)
- _this12.$app.TagManager.switchAllDisplay(false, 'enterView', {
- links: true
- });
- _this12.viewLinkManager.changeTitlesShow(false, 'enterView360');
- _this12.$app.Camera.monitor.changeTitlesShow(false, 'enterView360'); //去除角度限制
- _this12.cameraControls.controls.panorama.insideLookLimitUp = 89.9;
- _this12.cameraControls.controls.panorama.insideLookLimitDown = -89.9;
- _this12.cameraControls.controls.panorama.limitAngleIsBound = false;
- common$1.updateVisible(_this12.model.floorLogos.firstLogo, 'inView360', false); //隐藏
- common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'inView360', false); //隐藏
- }
- if (leaveView) {
- //从360view出来
- var view = _this12.currentPano.view;
- view.exitDoor.mesh.visible = false; //console.log("exitDoor.mesh.fade "+this.currentPano.view.sid)
- if (o.flyOut) {
- if (o.toMode == 'dollhouse') {
- //相机方向与着balloon到circle一致
- var dir = new THREE.Vector3().subVectors(view.circle.mesh.position, view.balloon.mesh.position).setY(0).normalize();
- _this12.cameraControls.controls.dollhouse.target.copy(view.circle.mesh.position);
- _this12.cameraControls.cameras.dollhouse.position.copy(view.balloon.mesh.position).add(new THREE.Vector3(0, 4, 0)).add(dir.multiplyScalar(-10));
- _this12.cameraControls.controls.dollhouse.update(0);
- }
- view.balloon.visible = false; //因为在beforeChangeMode里
- setTimeout(function () {
- view.balloon.visible = true;
- }, 500); //延迟出现
- }
- if (!enterView) {
- _this12.viewLinkManager.updateCirclesWhenFade('leave', o);
- _this12.viewLinkManager.changeTitlesShow(true, 'enterView360');
- _this12.$app.Camera.monitor.changeTitlesShow(true, 'enterView360'); //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.FADEIN, transitionTime) //热点出现
- _this12.$app.TagManager.switchAllDisplay(true, 'enterView', {
- links: true
- });
- }
- if (o.aim && !o.flyIn && !o.flyOut) {
- //出来是漫游模式
- _this12.cameraControls.controls.panorama.lookAt(o.aim);
- _this12.cameraControls.controls.panorama.update(0);
- } //this.OverlayManager.setGroupVisible(true)
- _this12.cameraControls.controls.panorama.insideLookLimitUp = null;
- _this12.cameraControls.controls.panorama.insideLookLimitDown = null;
- _this12.cameraControls.controls.panorama.limitAngleIsBound = true;
- common$1.updateVisible(_this12.model.floorLogos.firstLogo, 'inView360', true);
- common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'inView360', true);
- }
- if (o.pano) {
- _this12.emit(PlayerEvents.PanoChosen, _this12.currentPano, o.pano); //触发 setProjectedPanos
- _this12.model.chunks.concat([_this12.model.skybox]).forEach(function (mesh) {
- mesh.material.uniforms.progress.value = 1;
- }); //地标变化(在这里不需要显示)
- _this12.model.floorLogos.changefloorLogoOpa({
- index: 0,
- opa: 0,
- dur: 0,
- delay: 0
- }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
- _this12.model.floorLogos.secondLogo.position.copy(o.pano.floorPosition.clone().sub(_this12.model.position));
- enterView || common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'flyToPano', true);
- enterView || _this12.model.floorLogos.changefloorLogoOpa({
- index: 1,
- opa: 1,
- dur: 250
- });
- }
- transitions$1.start(lerp.property(_this12.domElement.style, 'opacity', 1), transitionTime, function () {
- _this12.enteringView = null;
- fuc && fuc(); //this.model.wallManager.updateRulersVisi();
- _this12.reticule.hide(); //隐藏. 如果是离开 会自动updatePosition()后显示
- if (enterView) {
- _this12.emit('enteredView');
- } else _this12.emit('leavedView');
- }, 0, null
- /* easing[settings.flydown.movementEasing] */
- , null, 'fade360');
- }, 0, null
- /* easing[settings.flydown.movementEasing] */
- , null, 'fade360');
- };
- _this.flyToPanoClosestToMouse = function () {
- if (Date.now() - this.mouseLastMoveTime > 50) {
- /* this.intersect = this.getMouseIntersect()
- this.intersect && this.updateClosestPano(this.intersect) */
- this.updateIntersect(); //这个才准确
- }
- if (this.closestPano) {
- return this.flyToPano({
- pano: this.closestPano,
- checkAlone: true
- });
- }
- var direction = this.getMouseDirection();
- if (!this.flyDirection(direction)) {
- this.flyToPano({
- pano: this.currentPano
- });
- }
- };
- _this.flyLocalDirection = function (playerDirection) {
- if (this.panosTaskList.length > 1 || this.panosTaskList.length == 1 && this.panosTaskList[0].progress < 0.3) {
- //比0.5少一点,因0.5时会判断个数
- //按键行走。在当前任务执行超过一定比率后才允许添加下一个任务
- return;
- }
- var direction = this.getDirection(playerDirection),
- playerDirectionZ = 1 === playerDirection.z ? 0.4 : 0.75,
- playerDirectionX = 1 === Math.abs(playerDirection.x);
- return this.flyDirection(direction, playerDirectionZ, playerDirectionX, true);
- };
- _this.flyDirection = function (direction, playerDirectionZ, playerDirectionX, byKey) {
- if (this.locked) return;
- var deferred = Deferred$1();
- this.history.invalidate();
- var panoSet = this.closestPanoInDirection(direction, playerDirectionZ, playerDirectionX);
- if (panoSet) {
- this.flyToPano({
- pano: panoSet,
- canConstantlyWalk: this.canConstantlyWalk,
- // add
- byKey
- }, deferred.resolve.bind(deferred, !0));
- } else if (this.panosTaskList.length == 0) {
- this.bump(direction);
- deferred.resolve(!1);
- }
- return deferred.promise();
- };
- _this.closestPanoInDirection = function (direction, playerDirectionZ, playerDirectionX) {
- return this.rankedPanoInDirection(0, direction, playerDirectionZ, playerDirectionX);
- };
- _this.rankedPanoInDirection = function () {
- var panoSet = {
- pano: null,
- candidates: []
- };
- return function (t, direction, PlayerDirectionZ, PlayerDirectionX) {
- t || (t = 0);
- PlayerDirectionZ = void 0 !== PlayerDirectionZ ? PlayerDirectionZ : 0.75;
- var o = PlayerDirectionX ? 'angle' : 'direction'; //add 相对于即将达到的目标点 或当前点
- var currentPano = this.panosTaskList.length ? this.panosTaskList[this.panosTaskList.length - 1].pano : this.currentPano;
- var request = [//必要条件
- Panorama.filters.not(currentPano), Panorama.filters.isPanoAligned(), Panorama.filters.isNeighbourPanoTo(currentPano), Panorama.filters.inPanoDirection(currentPano.position, direction, PlayerDirectionZ)];
- var list = [//决胜项目
- Panorama.scoreFunctions.distanceSquared(currentPano), Panorama.scoreFunctions[o](currentPano.position, direction)];
- /* if (editSpot.setSpotPos){
- if(editSpot.editType == "tag" || editSpot.editType == "measure"){
- request.push(function(pano){
- return pano.assistPano != editSpot.spotPosInfo.panoB && pano != editSpot.spotPosInfo.panoB;//不允许走回到和右侧相同的位置
- })
- }else if(editSpot.editType == "designWall"){
- request.push(function(pano){
- return pano != editSpot.spotPosInfo.panoB//不允许走回到和右侧相同的位置
- })
- }
- } */
- //performance.mark('rankedPano-start')
- this.model.panos.findRankedByScore(t, request, list, panoSet);
- /* performance.mark('rankedPano-end')
- let measure = performance.measure('rankedPano','rankedPano-start','rankedPano-end');
- console.log('rankedPano', measure.duration.toFixed(4)) */
- this.cachedPanoCandidates = panoSet.candidates;
- return panoSet.pano;
- };
- }();
- _this.bump = function (direction) {
- var _this13 = this;
- if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.isWarping()) {
- var t,
- i,
- n,
- r = settings$3.transition,
- o = (r.flytimeMaxDistanceThreshold * r.flytimeDistanceMultiplier + r.flyTime) / 10,
- a = this.camera.getWorldDirection(new THREE.Vector3()).dot(direction),
- s = Math.abs(a) > 0.5;
- if (s) t = function () {
- transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', a > 0 ? 1.04 : 0.96), o, i, 0, easing.easeInOutSine, 'bumpZStart');
- }.bind(this), i = function () {
- transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', 1), 3 * o, n, 0, easing.easeInOutSine, 'bumpZRelax');
- }.bind(this);else {
- var l = this.camera.position.clone(),
- c = direction.clone();
- this.raycaster.set(l, c);
- var h = this.model.floors.reduce(function (e, t) {
- return e.concat(t.collider.children);
- }, []),
- d = this.raycaster.intersectObjects(h),
- p = d.length > 0 ? d[0].distance / 25 : 0.04,
- g = l.clone().add(c.multiplyScalar(p));
- t = function () {
- transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, g), o, i, 0, easing.easeInOutSine, 'bumpTStart');
- }.bind(this), i = function () {
- transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, l), 5 * o, n, 0, easing.easeInOutSine, 'bumpTRelax');
- }.bind(this);
- }
- n = function n() {
- if (_this13.mode == 'panorama') {
- //add
- _this13.flying = !1;
- _this13.emit(PlayerEvents.FlyingEnded, {
- /* targetPosition: this.position, currentPosition: this.position, */
- targetPano: _this13.currentPano,
- currentPano: _this13.currentPano
- }); //add
- }
- /* if (this.waitFlytoItemFuc) {
- //手动加的函数
- var cf = this.waitFlytoItemFuc;
- this.waitFlytoItemFuc = null;//因为可能在执行afterCModeFuc时需要再添加afterCModeFuc所以要置空的话提前
- cf();
- }
-
- //直接使用
- player.once('flying.ended',()=>{ })
- */
- };
- this.flying = !0, t();
- }
- };
- _this.changeFloor = function (e) {
- if (!this.is360View(this.mode, this.currentPano)) {
- if (this.mode === Viewmode$1.PANORAMA) {
- var t = this.history.reversePano(e);
- if (t) {
- this.flyToPano({
- pano: t
- });
- } else {
- var pano = this.getFloorPanoByScore(e);
- if (pano) {
- this.cachedPanoCandidates = e.candidates;
- this.history.push(t, this.currentPano);
- this.flyToPano({
- pano
- });
- }
- } // t && t.isAligned() ? this.flyToPano({
- // pano: t
- // }) : this.changeFloorByScore(e)
- } else {
- this.model.setFloor(this.model.nextFloor(e) || this.model.currentFloor);
- }
- }
- };
- _this.getFloorPanoByScore = function () {
- var e = {
- pano: null,
- candidates: []
- };
- return function (t, floor) {
- var i = floor || this.model.nextFloor(t);
- return i ? (this.model.panos.lowestByScore([Panorama.filters.atFloor(i), Panorama.filters.isPanoAligned(), function (pano) {
- return pano.hasNeighbor();
- }], [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) :
- /* void (e.pano
- ? ((this.cachedPanoCandidates = e.candidates),
- this.history.push(t, this.currentPano),
- this.flyToPano({
- pano: e.pano
- }))
- : logger.warn('No pano found on selected floor, not moving there.')))*/
- void logger$1.debug('player.changeFloor(' + t + '): no such floor');
- };
- }();
- _this.gotoFloor = function (e) {
- var t = e - this.model.currentFloor.floorIndex;
- this.changeFloor(t);
- };
- _this.getDirection = function (e) {
- return e = e ? e : new THREE.Vector3().copy(Vectors$1.FORWARD), e.applyQuaternion(this.camera.quaternion);
- };
- _this.flyToNewMode = function (newModeInfo, deferred) {
- var _this14 = this;
- newModeInfo = newModeInfo || {};
- var mode = newModeInfo.mode,
- pano = newModeInfo.pano,
- duration = newModeInfo.duration;
- newModeInfo.warpDest;
- var callback = newModeInfo.callback;
- newModeInfo.force;
- var quaternion = newModeInfo.quaternion,
- target = newModeInfo.target,
- //add
- position = newModeInfo.position,
- //add
- currentScale = newModeInfo.currentScale,
- //add
- floor = newModeInfo.floor,
- //add
- fitBoundSize = newModeInfo.fitBoundSize;
- deferred = deferred || Deferred$1();
- if (this.isWarping()) {
- logger$1.warn('Player.flyToNewMode() -> Cannot fly when warping');
- callback && callback(!1);
- return deferred.reject('Cannot change mode during tour transition');
- }
- if (this.mode === Viewmode$1.TRANSITIONING) {
- callback && callback(!1);
- return deferred.reject('Cannot change mode during mode transition');
- }
- if (mode === this.mode) {
- //return callback && callback(!1), deferred.reject('Already in ' + mode + ' mode')
- callback && callback(!1);
- deferred.resolve();
- return deferred;
- } // 进入PANORAMA, 要在下载panotiles前先清掉正在加载的3dtiles
- if (mode == Viewmode$1.PANORAMA && this.model._3dTilesRuntime) {
- this.model._3dTilesRuntime.pauseTilesetUpdate(true);
- this.model._3dTilesRuntime.clearLoadingTiles();
- }
- logger$1.debug('Switching mode to ' + mode);
- var successCallbackFunc = function () {
- common$1.delayOneFrame(function () {
- this.flyToNewMode(newModeInfo, deferred);
- }.bind(this));
- }.bind(this);
- if (pano && this.checkAndWaitForPanoLoad(pano, 'low', 'low', this.basePanoSize, successCallbackFunc)) {
- //'low', 'low'
- return deferred.promise();
- }
- if (!this.model.mesh3dTilesLoaded && !this.model.meshTexturesLoaded && this.isOutsideMode(mode)) {
- logger$1.info('Waiting for model 3dTiles or damTextures to be loaded before going out to dollhouse');
- this.model.waitForLoad(this.model, function () {
- return false;
- }.bind(this));
- successCallbackFunc();
- return deferred.promise();
- }
- this.history.invalidate(); //this.updateLastView();
- var currentMode = this.mode;
- var currentCamera = this.cameraControls.cameras[mode];
- var switchingParams = common$1.deepExtend({}, settings$3[mode], settings$3[currentMode + '-' + mode]); //许钟文------------
- this.modeTran = this.mode + '-' + mode; //------------------
- var transitionTime = switchingParams.transitionTime;
- if (void 0 !== duration) {
- transitionTime = duration;
- }
- this.emit(PlayerEvents.ModeChanging, currentMode, mode, pano, transitionTime);
- pano && (this.currentPano = pano);
- transitions$1.cancelById(settings$3.freeze.LookTransition);
- transitions$1.cancelById(this.$app.resource.num + settings$3.freeze.FlyToPano);
- if (mode === Viewmode$1.PANORAMA) {
- this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
- size: 2048
- });
- this.emit(PlayerEvents.PanoChosen, pano, pano);
- setTimeout(function () {
- pano.floor.enter(mode);
- }.bind(this), transitionTime / 2);
- this.path.fadeOutCpm(settings$3.path.fadeOutTime); //当前站点logo消失
- } else {
- this.path.placeCpm(); //设置当前站点logo位置
- this.path.fadeInCpm(settings$3.path.fadeInTime); //当前站点logo出现
- //console.log('floor',floor)
- if (floor != void 0) {
- if (floor == 'all' && mode != Viewmode$1.FLOORPLAN) this.model.toggleAllFloors(!0); //默认floorplan没有all的可能
- else if (typeof floor == 'number') {
- floor = this.model.floors.list[floor];
- floor.enter(mode);
- }
- } else if (mode === Viewmode$1.FLOORPLAN) {
- this.model.currentFloor.enter(mode);
- } else if (mode == Viewmode$1.DOLLHOUSE) {
- this.model.toggleAllFloors(!0);
- }
- }
- this.switchCameraMode(mode, quaternion, target, position, currentScale, {
- fitBoundSize
- });
- var currentPosition = new THREE.Vector3().copy(this.position);
- var currentPano = this.currentPano,
- playerPosition = this.position.clone();
- this.emit(PlayerEvents.FlyingStarted, {
- mode: newModeInfo.mode,
- duration: newModeInfo.duration,
- target: newModeInfo.target,
- position: newModeInfo.position,
- quaternion: newModeInfo.quaternion ? new THREE.Quaternion().set(newModeInfo.quaternion._x, newModeInfo.quaternion._y, newModeInfo.quaternion._z, newModeInfo.quaternion._w) : null,
- zoom: newModeInfo.zoom,
- panoId: newModeInfo.pano ? newModeInfo.pano.id : null,
- lastPanoId: currentPano && currentPano.id,
- type: 'flyToNewMode'
- });
- this.flying = !0;
- var startChange = function startChange() {
- //360全景:
- if (_this14.isOutsideMode(mode) && _this14.is360View(currentMode, currentPano)) {
- //飞出
- switchingParams.blackoutStyle = BlackoutStyle$1.FADEIN;
- transitionTime = settings$3.show360Views.transitionTime;
- switchingParams.transitionTime = transitionTime;
- switchingParams.skyboxOpacity = 0;
- switchingParams.modelAlpha = 1;
- switchingParams.flyOut = true;
- switchingParams.toMode = mode;
- _this14.fade360View(currentCamera, switchingParams);
- } else if (_this14.isOutsideMode(currentMode) && _this14.is360View(mode, pano)) {
- //飞入
- _this14.mode = mode;
- switchingParams.pano = pano; //this.currentPano
- switchingParams.blackoutStyle = BlackoutStyle$1.END;
- transitionTime = settings$3.show360Views.transitionTime;
- switchingParams.transitionTime = transitionTime;
- switchingParams.flyIn = true;
- _this14.fade360View(currentCamera, switchingParams, _this14.afterchangeMode);
- } else {
- //普通情况:
- transitions$1.start(lerp.property(_this14.model, 'alpha', switchingParams.modelAlpha, null), transitionTime * switchingParams.modelAlphaLength, null, switchingParams.modelAlphaDelay, null, settings$3.freeze.FlyToNewMode);
- transitions$1.start(lerp.vector(_this14.position, currentCamera.position, function (v, n) {
- _this14.flyInOutProgress = n; //add
- }), transitionTime, null, settings$3.flydown.movementDelay, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.FlyToNewMode);
- 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);
- transitions$1.start(lerp.matrix4(_this14.camera.projectionMatrix, currentCamera.projectionMatrix), transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
- transitions$1.start(function (n) {
- _this14.camera.projectionMatrixInverse.copy(_this14.camera.projectionMatrix).invert();
- }, transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
- transitions$1.start(lerp.uniform(_this14.model.skybox, 'opacity', switchingParams.skyboxOpacity), transitionTime * switchingParams.skyboxOpacityLength, null, switchingParams.skyboxOpacityDelay, null, settings$3.freeze.FlyToNewMode);
- transitions$1.start(lerp.property(_this14.reticule.material.uniforms.opacity, 'value', 0), transitionTime, null, settings$3.freeze.FlyToNewMode);
- }
- transitions$1.setTimeout(function () {
- this.flying = !1;
- if (currentMode === Viewmode$1.PANORAMA && mode !== Viewmode$1.PANORAMA) {
- this.currentPano.exit();
- } else if (currentMode !== Viewmode$1.PANORAMA && mode === Viewmode$1.PANORAMA) {
- this.currentPano !== currentPano && currentPano.exit();
- this.currentPano.enter();
- }
- currentMode === Viewmode$1.DOLLHOUSE && this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges();
- this.mode = mode;
- this.afterChangeMode(currentMode, mode); //this.emit(PlayerEvents.FlyingEnded, currentPosition, playerPosition, this.currentPano, currentPano)
- this.emit(PlayerEvents.FlyingEnded, {
- targetPosition: currentPosition,
- currentPosition: playerPosition,
- targetPano: this.currentPano,
- currentPano: currentPano
- });
- callback && callback();
- deferred.resolve();
- }.bind(_this14), transitionTime, settings$3.freeze.FlyToNewMode);
- _this14.mode = Viewmode$1.TRANSITIONING;
- };
- if (this.mode == 'panorama' && !(this.isOutsideMode(mode) && this.is360View(currentMode, currentPano))) {
- this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
- //console.log('等待时间', Date.now() - startTime)
- startChange(); //300block 的需要近1秒才能飞出,最好加个提示 如KJ-t-ThxGwmC91Z0
- });
- } else {
- startChange();
- }
- /* ----若要显示loading条换这块代码 一点点变换modelAlpha
- let startIndex = 0, curCount, maxUpdateBlock = 100, len=this.model.chunks.length
- let startTime = Date.now()
- let update = {
- update:()=>{
- curCount = 0
- for(let i=startIndex; i<len;i++){
- let mat = this.model.chunks[i].materialInside
- let image = mat.uniforms.map.value.image
- let blockCount = image.width * image.height / (512*512);
-
- if(!('useModelMap' in mat.defines)){
- mat.defines.useModelMap = '';
- mat.needsUpdate = true
- }
- startIndex++;
- console.log(startIndex)
- curCount = curCount + blockCount
- if(curCount > maxUpdateBlock)return
- }
- console.log('cost', Date.now()-startTime)
- this.$app.core.get('SceneRenderer').removeComponent(update)
- startChange()
- }
- }
- this.$app.core.get('SceneRenderer').addComponent(update)
- */
- this.beforeChangeMode(currentMode, mode, pano, transitionTime);
- return deferred.promise();
- };
- _this.setSize = function (width, height) {
- var aspect = width / height;
- this.baseFov = cameraLight.clampVFOV(settings$3.insideFOV, settings$3.insideFOVMax, width, height);
- var fov = cameraLight.getHFOVFromVFOV(settings$3.insideFOV, width, height);
- if (fov > settings$3.insideFOVMax) {
- this.baseFov = cameraLight.getVFOVFromHFOV(settings$3.insideFOVMax, width, height);
- } else {
- this.baseFov = settings$3.insideFOV;
- }
- for (var cameraType in this.cameraControls.cameras) {
- var camera = this.cameraControls.cameras[cameraType];
- camera.fov = camera.staticFov ? camera.staticFov : this.baseFov * (1 / this.zoomLevel); //许钟文 加camera.staticFov
- camera.updateAspect(aspect);
- }
- this.emit('setSize', width, height);
- };
- _this.toJSON = function () {
- var e = {};
- if (this.cameraControls.activeControl) {
- e = this.cameraControls.activeControl.toJSON();
- e.camera_mode = Viewmode$1.toInt(this.mode);
- if (this.isOutsideMode()) {
- if (this.model.allFloorsVisible) {
- e.floor_visibility = [];
- } else {
- e.floor_visibility = this.model.floors.list.map(function (e) {
- return e.hidden ? 0 : 1;
- });
- }
- } else if (Viewmode$1.PANORAMA) {
- e.scan_id = this.currentPano.id;
- } // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
- // return e.hidden ? 0 : 1
- // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id);
- return e;
- } else {
- return e;
- } // return this.cameraControls.activeControl ? (e = this.cameraControls.activeControl.toJSON(),
- // e.camera_mode = Viewmode.toInt(this.mode),
- // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
- // return e.hidden ? 0 : 1
- // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id),
- // e) : e
- };
- _this.zoomBy = function (e) {
- this.zoomTo(this.zoomLevel * e);
- };
- _this.zoomIn = function () {
- this.zoomBy(1 + this.zoomSpeed);
- };
- _this.zoomOut = function () {
- this.zoomBy(1 - this.zoomSpeed);
- };
- _this.zoomTo = function (zoomLevel, flag) {
- if (flag || settings$3.zoom.enabled && this.mode === Viewmode$1.PANORAMA && this.zoomEnabled) {
- zoomLevel < settings$3.zoom.min && (zoomLevel = settings$3.zoom.min);
- zoomLevel > settings$3.zoom.max && (zoomLevel = settings$3.zoom.max);
- if (zoomLevel > this.zoomLevel) {
- this.emit(ZoomEvents.ZoomIn);
- zoomLevel === settings$3.zoom.max && this.emit(ZoomEvents.ZoomMax);
- } else if (zoomLevel < this.zoomLevel) {
- this.emit(ZoomEvents.ZoomOut);
- zoomLevel === settings$3.zoom.min && this.emit(ZoomEvents.ZoomMin);
- }
- if (this.cameraControls.activeControl) {
- var camera = this.cameraControls.activeControl.camera;
- this.zoomLevel = zoomLevel;
- camera.fov = this.baseFov * (1 / this.zoomLevel);
- camera.updateProjectionMatrix();
- this.zoomFov = camera.fov;
- this.emitZoom(); //this.emit('zoomTo', zoomLevel)
- }
- }
- };
- _this.zoomDefault = function () {
- this.zoomTo(1, !0);
- };
- _this.smoothZoomToDefault = function (e, t) {
- var i,
- n = this.zoomLevel,
- r = function (e) {
- e > 1 && (e = 1), i = n * (1 - e) + e, this.zoomTo(i, !0);
- }.bind(this),
- o = function () {
- this.zoomDefault(), t && window.setTimeout(t, 50);
- }.bind(this);
- transitions$1.start(r, e, o, null, 0, easing[settings$3.transition.blendEasing]);
- };
- _this.smoothZoomFovTo = function (fov, dur, callback) {
- //add
- var aimLevel = this.baseFov / fov;
- this.smoothZoomLevelTo(aimLevel, dur, callback);
- };
- _this.smoothZoomLevelTo = function (level, dur, callback) {
- //add
- if (this.zoomLevel == level) return;
- var oldLevel = this.zoomLevel;
- var currentLevel;
- var fun = function (e) {
- e > 1 && (e = 1), currentLevel = oldLevel * (1 - e) + e * level, this.zoomTo(currentLevel, !0);
- }.bind(this);
- transitions$1.start(fun, dur, callback, null, 0, easing[settings$3.transition.blendEasing]);
- };
- _this.updateZoomPano = function () {
- var _this15 = this;
- var qualityManager = this.$app.core.get('QualityManager');
- var panoRenderer = this.$app.core.get('PanoRenderer');
- var currentPano = this.currentPano;
- if (!panoRenderer.zoomPanoRenderingDisabled && this.mode === Viewmode$1.PANORAMA && currentPano.tiled) {
- //xzw add tiled
- if (currentPano) {
- var threshold4k = 1.8;
- var activationThreshold = qualityManager.navTileClass == '2k' && qualityManager.tileClass == '4k' ? threshold4k : settings$3.zoom.activationThreshold; //1.1
- var t = settings$3.highestQualityTile || this.zoomLevel > activationThreshold,
- i = this.flying && this.nextPano && this.nextPano !== this.currentPano,
- n = !i && !this.isWarping(),
- r = t && n;
- this.$app.core.get('TileDownloader').tilePrioritizer.setZoomingActive(r);
- panoRenderer.setZoomingActive(r, currentPano, !0);
- var o = function (pano, zoomedFlag) {
- panoRenderer.resetRenderStatus(pano.id, !1, !0, qualityManager.getMaxNavPanoSize());
- panoRenderer.clearAllQueuedUploadsForPano(pano.id);
- panoRenderer.renderPanoTiles(pano.id, null, !1, !1);
- pano.setZoomed(zoomedFlag);
- }.bind(this);
- if (r && (!currentPano.zoomed || qualityManager.zoomLevelResolution && qualityManager.zoomLevelResolution != '4k')) {
- currentPano.zoomed || o(currentPano, !0);
- if (qualityManager.navTileClass == '1k' && qualityManager.tileClass != '1k' && this.zoomLevel < 2) {
- panoRenderer.enableHighQuality(function () {
- //开启2k
- if (qualityManager.tileClass != '4k') o(currentPano, !0);
- }.bind(this));
- } else {
- panoRenderer.enableUltraHighQualityMode(function () {
- //开启4k getMaxZoomPanoSize
- qualityManager.useUltraHighResolutionPanos && !settings$3.zoom.overridemax && (settings$3.zoom.max = settings$3.ultraHighQualityMaxZoom);
- o(currentPano, !0);
- }.bind(this));
- }
- } else {
- !t && currentPano.zoomed && o(currentPano, !1);
- }
- if (r && qualityManager.navTileClass == '1k' && qualityManager.tileClass == '4k') {
- //目前只有手机端navTileClass == '1k'
- var change = function change(zoomedFlag) {
- qualityManager.updateMaximums(); //更新maxZoomPanoSize
- panoRenderer.setupZoomRenderTarget(); //更新renderTarget
- //currentPano.setZoomed(t);//更新uniforms贴图
- if (qualityManager.zoomLevelResolution == '4k') {
- _this15.model.showHighMap();
- } else {
- _this15.model.hideHighMap();
- }
- };
- qualityManager.zoomLevelResolution = this.zoomLevel >= threshold4k ? '4k' : this.zoomLevel > settings$3.zoom.activationThreshold ? '2k' : '1k';
- if (this.oldZoomLevel < threshold4k && this.zoomLevel >= threshold4k) {
- //1k/2k-4k
- change();
- o(currentPano, t);
- } else if (this.oldZoomLevel <= settings$3.zoom.activationThreshold && this.zoomLevel > settings$3.zoom.activationThreshold) {
- //1k-2k
- change();
- } else if (this.oldZoomLevel > threshold4k && this.zoomLevel <= threshold4k) {
- //4k-2k/1k
- change();
- o(currentPano, t);
- } else if (this.oldZoomLevel > settings$3.zoom.activationThreshold && this.zoomLevel <= settings$3.zoom.activationThreshold) {
- //2k-1k
- change();
- }
- this.oldZoomLevel = this.zoomLevel;
- }
- /* if (r && !currentPano.zoomed) {
- o(currentPano, !0);
- panoRenderer.enableUltraHighQualityMode(function() {//开启4k getMaxZoomPanoSize
- qualityManager.useUltraHighResolutionPanos && !settings.zoom.overridemax && (settings.zoom.max = settings.ultraHighQualityMaxZoom);
- o(currentPano, !0)
- }.bind(this));
-
- } else {
- !t && currentPano.zoomed && o(currentPano, !1);
- } */
- }
- }
- };
- _this.hasChanged = function (e) {
- if (!this.previousState) {
- this.previousState = {
- allFloorsVisible: this.model.allFloorsVisible,
- position: this.position.clone(),
- quaternion: this.quaternion.clone(),
- mouse: this.mouse.clone(),
- //labelScaleFactor: this.getLabelScaleFactor(),
- currentFloor: this.model.currentFloor,
- projectionMatrix: this.camera.projectionMatrix.clone(),
- worldMatrix: this.camera.matrixWorld.clone(),
- mode: this.mode,
- modelPosition: this.model.position.clone(),
- modelCenter: this.model.center.clone(),
- zoomLevel: this.zoomLevel
- };
- e.cameraChanged = true, (e.cameraChanged2 = true, e.cameraChanged3 = true);
- return !0;
- } //许钟文改 分成相机是否改变cameraChanged 和其他
- 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);
- e.vrHandlerMoved = this.VR && this.VR.webxr.entered && this.VR.webxr.handlerMoved(); //add
- var t = a && this.mouse.equals(this.previousState.mouse) && !e.vrHandlerMoved && this.model.allFloorsVisible === this.previousState.allFloorsVisible
- /* && this.getLabelScaleFactor() === this.previousState.labelScaleFactor */
- && this.model.currentFloor === this.previousState.currentFloor && null === this.nextPano;
- e.cameraChanged = !a || e.cameraProjectionChanged;
- 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;
- if (!t) {
- //主要判断相机是否旋转
- e.cameraChanged2 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 6) || !MathLight.closeTo(this.position, this.previousState.position, 5);
- e.cameraChanged3 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 3) || !MathLight.closeTo(this.position, this.previousState.position, 3);
- } else {
- e.cameraChanged2 = false;
- e.cameraChanged3 = false;
- }
- 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)
- return !t;
- };
- _this.getToMode = function () {
- return this.modeTran.split('-')[1];
- };
- _this.flyToMode = function (mode, f1, duration) {
- var _this16 = this;
- if (this.mode == mode) {
- f1 && f1();
- } else {
- if (this.mode == 'transitioning') {
- //先飞完然后再执行一遍
- this.once(PlayerEvents.FlyingEnded, function () {
- _this16.flyToMode(mode, f1, duration);
- });
- } else {
- f1 && this.once(PlayerEvents.FlyingEnded, function () {
- f1();
- });
- try {
- //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
- this.flyToNewMode({
- mode: mode,
- pano: mode == 'panorama' && this.currentPano,
- duration: duration
- });
- } catch (e) {
- console.log('flyToMode遇到问题?', e);
- }
- }
- }
- };
- _this.vrModeChange = function () {
- if (settings$3.vrEnabled) {
- //关闭
- settings$3.vrEnabled = false;
- /* if (!window.VRScreenNotFull) {
- browser.exitFullscreen()
- } */
- } else {
- //开启:
- settings$3.vrEnabled = true;
- /* if (!window.VRScreenNotFull) {
- browser.requestFullscreen(document.body)
- } */
- }
- };
- _this.focusPoint = function () {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- console.log('focusPoint');
- if (this.mode == 'floorplan') {
- var modelSize = o.modelSize || new THREE.Vector3(5, 5, 5); //可视范围
- var control = this.cameraControls.controls.floorplan;
- var absoluteScale = control.getDefaultAbsoluteScale(modelSize);
- var currentScale = control.absoluteScale;
- var currentTarget = control.target.clone();
- var lowest = this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1;
- var aim = o.aim.clone().setY(lowest);
- transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
- transitions$1.start(function (progress) {
- control.absoluteScale = absoluteScale * progress + currentScale * (1 - progress);
- control.target = aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
- control.camera.position.copy(control.target.clone().add(control.offset)); //维持角度
- }.bind(this), o.dur || 600, null
- /* cancelFuc */
- , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
- /* cancelFuc */
- );
- } else if (this.mode == 'dollhouse') {
- var control = this.cameraControls.controls.dollhouse;
- var radius = o.radius || 10;
- var currentTarget = control.target.clone();
- var dir = control.offset.clone().normalize();
- var currentRadius = control.offset.length();
- transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
- transitions$1.start(function (progress) {
- control.target = o.aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
- var radius_ = radius * progress + currentRadius * (1 - progress);
- control.camera.position.copy(control.target.clone().add(dir.clone().multiplyScalar(radius_)));
- }.bind(this), o.dur || 600, null
- /* cancelFuc */
- , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
- /* cancelFuc */
- );
- }
- };
- _this.getSnapAngleInfo = function () {
- //得到截图的位置和视角
- var info = {
- metadata: {}
- };
- var q = this.camera.quaternion.clone();
- switch (this.mode) {
- case 'panorama':
- info.metadata.scan_id = this.currentPano.id;
- break;
- case 'floorplan':
- var _this$getSize = this.getSize(),
- clientWidth = _this$getSize.clientWidth,
- clientHeight = _this$getSize.clientHeight;
- q = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90));
- q.multiply(this.camera.quaternion);
- info.metadata.camera_mode = 1;
- info.metadata.ortho_zoom = math$2.toPrecision(this.cameraControls.activeControl.currentScale / (clientWidth / clientHeight), 4);
- break;
- case 'dollhouse':
- info.metadata.camera_mode = 2;
- break;
- }
- info.metadata.camera_position = this.camera.position.clone();
- info.metadata.camera_quaternion = q;
- info.metadata.lon = this.cameraControls.activeControl.lon; //兼容旧版
- info.metadata.lat = this.cameraControls.activeControl.lat;
- info.sid = '4dkk' + new Date().getTime();
- info.name = '';
- info.mode = this.mode; //暂时需要用到
- return info;
- };
- _this.model = new Model(_this.$app);
- _this.currentPano = null;
- _this.nextPano = null;
- _this.camera = null;
- _this.paused = !1;
- _this.flying = !1;
- _this.sceneIntersectionPlane = null;
- _this.target = new THREE.Vector3();
- _this.mouse = new THREE.Vector3(1.1, 1.1, 0.5);
- _this.mouseAtMouseDown = new THREE.Vector2();
- _this.mouseCouldBeClickToMove = !1;
- _this.mouseLastMoveTime = Date.now();
- _this.mouseDown = !1;
- _this.mouseDownTimer = null;
- _this.couldBeLongTap = !1;
- _this.containsMouse = !1; //!0 //xzw改为false,否则触屏一直是true
- _this.isTouchEvent = !1;
- _this.isPanoHover = !1;
- _this.reticule = new Reticule(_assertThisInitialized(_this));
- _this.panoMarkers = []; //this.spider = new NSpider(this);
- _this.quaternion = new THREE.Quaternion();
- _this.position = new THREE.Vector3(15, 10, 15);
- _this.previousState = null;
- _this.lastInsideView = new View();
- _this.last360View = new View();
- _this.raycaster = new THREE.Raycaster();
- _this.raycaster.params.Line.threshold = 0.01;
- _this.raycaster.params.Line2 = {
- threshold: browser$1.isMobile() ? 100 : 20
- }; //拓宽的lineWidth
- _this.allIntersects = [];
- _this.intersect = null;
- common$1.setCameraLayers(_this.raycaster, ['DEFAULT', 'Tag3d', 'PANOMARKERS', 'SKYBOX', 'MODEL']); //暂时加上DEFAULT //this.raycaster.layers.enable(RenderLayers.PANOMARKERS)
- _this.lastChangeTime = Date.now();
- _this.history = new History$1();
- _this.cameraControls = null; //this.path = null,
- _this.domElement = null;
- _this.cachedPanoCandidates = null;
- _this.basePanoSize = 0;
- _this.standardPanoSize = 0;
- _this.highPanoSize = 0;
- _this.ultraHighPanoSize = 0;
- _this.yaw = 0;
- _this.zoomLevel = 1;
- _this.zooming = 0;
- _this.zoomSpeed = 0.5;
- _this.scrollZoomSpeed = 0.06;
- _this.zoomSpeedAdjust = 0.05;
- _this.defaultZoomIncrement = 0.2;
- _this.baseFov = settings$3.insideFOV;
- _this.zoomFov = _this.baseFov;
- _this.zoomEnabled = !0;
- _this.cornerRulers = []; //标尺
- _this.planLabels = []; //floorplan时的label
- _this.dollLabels = []; //dollhouse时的label
- _this.doorLabels = [];
- _this.defaultRoomLabels = []; //非编辑墙时的
- _this.polygonmarkLabels = []; //多边形标记模块label
- _this.modeTran = '';
- _this.preRenderingEnabled = !1;
- _this.setupCustomProperties(Viewmode$1.PANORAMA);
- _this.zoomStats = new ZoomStats();
- _this.lastFrameChanged = 'level3'; //越高变动越大
- _this.unitConvert = new UoMService();
- /* this.afterCModeFuc = {
- //Flytonewmode后需要执行的
- unique: null, //唯一的,新的会替代旧的,适用于只允许选择其中一项执行的函数
- multi: [], //可多个, 到时候都执行
- } */
- _this.cameraControls = _this.$app.core.get('CameraControls');
- _this.modelManager = _this.$app.core.get('ModelManager'); //this.imagePanos = this.listImagePanos()
- //是否开启(键盘上1,2,3分别对应飞入,飞出dollhouse,飞出floorplan)
- _this.started = false; //xst
- _this._locked = false;
- _this._flying = false;
- _this.clearPanosTaskList(); //持续行走的任务
- _this.setPanoTaskEnable(true);
- _this.viewLinkManager = new ViewLinkManager(_this.$app, _assertThisInitialized(_this));
- _this.paintEditor = new Paint$1(_this.$app, _assertThisInitialized(_this));
- _this.modelSideManager = new ModelSideManager(_assertThisInitialized(_this)); //this.createIntersectLabel()
- _this.miniViewVisible = {};
- /* this.$app.Scene.on('loaded', () => {
- setTimeout(this.setMiniViewType.bind(this)) //等待dom在minMap中建完
- }) */
- _this.$app.Scene.on('miniDomCreated', _this.setMiniViewType.bind(_assertThisInitialized(_this)));
- _this.on('mode.changed', function () {
- _this.setMiniViewVisi(_this.mode == 'panorama', 'flyOut');
- });
- _this.on('vrStateChanged', function () {
- var splitView = settings$3.vrEnabled && settings$3.vrSplitScreen;
- _this.setMiniViewVisi(!splitView, 'vrSplitScreen');
- });
- return _this;
- }
- _createClass(Player, [{
- key: "setMiniViewType",
- value: function setMiniViewType() {
- var _this17 = this;
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.$app.store.getValue('metadata').controls.showMap;
- var bySelect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- //xzw
- console.warn('setMiniViewType', type, ['无', '平面图', '三维模型', '地图'][type]); //0:无, 1平面图 2三维模型 3地图
- try {
- if (bySelect) {
- //是前端传过来的在编辑页面选择的类型,
- this.miniViewTypeShould = type;
- common$1.updateVisible(this.miniViewVisible, 'bySelect', type > 0);
- if (!this.miniViewVisible.visible) {
- type = 0;
- console.warn('setMiniViewType final', type, ['无', '平面图', '三维模型', '地图'][type]);
- }
- }
- this.miniViewType = type;
- var dom = document.querySelector('div[xui_min_map]');
- if (!dom) return;
- if (type == 0) {
- dom.style.display = 'none';
- setTimeout(function () {
- //fix: mode != 'panorama' 时 前端那边清屏恢复时会显示,这里延时隐藏下
- if (_this17.miniViewType == 0
- /* && player.mode != 'panorama' */
- ) {
- dom.style.display = 'none';
- }
- });
- } else {
- dom.style.display = ''; //先显示,用于初始化,不过之后可能又隐藏
- }
- this.emit('setMiniViewType', type);
- this.$app.core.get('SceneRenderer').setMiniDollDisplay(type == 2);
- if (type == 3) {
- this.mapViewer || (this.mapViewer = new MapViewer(dom, this));
- this.mapViewer.show();
- } else {
- var _this$mapViewer;
- (_this$mapViewer = this.mapViewer) === null || _this$mapViewer === void 0 ? void 0 : _this$mapViewer.hide();
- }
- } catch (e) {
- console.error(e);
- }
- }
- }, {
- key: "setMiniViewVisi",
- value: function setMiniViewVisi(visible, reason) {
- //设置迷你视角是否暂时隐藏
- common$1.updateVisible(this.miniViewVisible, reason, visible);
- this.setMiniViewType(this.miniViewVisible.visible ? this.miniViewTypeShould : 0, false); //这和原本选择的type只要有一个不显示就不显示
- }
- }, {
- key: "init",
- value: function init() {
- this.domElement = this.$app.dom.querySelector('.player');
- this.camera = this.$app.core.get('SceneRenderer').camera;
- this.path = new ShowPath(this.director, this, this.cameraControls);
- this.basePanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.BASE);
- this.standardPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.STANDARD);
- this.highPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.HIGH);
- this.ultraHighPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.ULTRAHIGH);
- this.$app.core.get('TileDownloader').processPriorityQueue = !1;
- this.$app.core.get('TileDownloader').tilePrioritizer = new TilePrioritizer(this.$app.core.get('QualityManager'), this.basePanoSize, this.standardPanoSize, this.highPanoSize, this.ultraHighPanoSize);
- this.bindEvents(this.domElement);
- this.updateModel();
- CursorDeal.init(this);
- LineMaterial.init(this.$app);
- this.model.createTranControl(this);
- if (browser$1.urlHasValue('map')) {
- this.mapViewer = new MapViewer(null, this);
- }
- }
- }, {
- key: "locked",
- get: function get() {
- return this._locked;
- },
- set: function set(value) {
- // customer时marker隐藏
- // let role = location.search
- // .replace('?', '')
- // .split('&')
- // .find(arg => arg.split('=')[0] == 'role')
- // role = role && role.split('=')[1]
- // this.model.panos.forEach(item => {
- // item.marker && (item.marker.visible = role == 'customer' ? false : !value)
- // })
- this._locked = value;
- if (this._locked) {
- this.model.fadePanoMarkers(0, 0, {
- vrCustomer: true,
- hideVideoFlag: true
- });
- } else if (!this.$app.VRScreenSYNC) {
- this.model.fadePanoMarkers(1, 0, {
- vrCustomer: true,
- hideVideoFlag: false
- });
- }
- if (value) {
- this.clearPanosTaskList(); //清空
- }
- }
- }, {
- key: "flying",
- get: function get() {
- return this._flying;
- },
- set: function set(v) {
- this._flying = v; //console.log('flying',v)
- }
- }, {
- key: "getIntersectAtChunk",
- value: function getIntersectAtChunk(intersect, when, needNormal) {
- //有时候看起来没mesh但有,只是被裁剪了
- if ((intersect === null || intersect === void 0 ? void 0 : intersect.object.name) == 'collider') return intersect; //add
- if (when == 'drag') {
- //拖拽时player没getIntersect这里获取下
- var _chunkPick = this.getMouseIntersect(null, this.getColliders({
- noSkybox: true,
- checkChunk: true
- }));
- return _chunkPick;
- }
- var chunkPick = this.allIntersects.find(function (e) {
- return e.object.name == 'collider';
- }); //在chunk上的intersect
- if (chunkPick && !chunkPick.normal) this.intersectAddNormal(chunkPick);
- return chunkPick;
- }
- }, {
- key: "intersectAddNormal",
- value: function intersectAddNormal(object3d) {
- if (object3d.face) {
- object3d.normal = object3d.face.normal.applyQuaternion(object3d.object.quaternion);
- var point = this.position.clone().sub(object3d.point);
- if (point.dot(object3d.normal) < 0) {
- //x,y,z全部反向
- object3d.normal.negate();
- }
- if (this.currentPano) {
- object3d.onFloor = object3d.point.y < this.position.y - 0.5 * this.currentPano.height;
- } else {
- object3d.onFloor = object3d.point.y < this.position.y - 0.5;
- }
- object3d.horizontal = object3d.normal.y > 0.8;
- }
- }
- }, {
- key: "setPanoTaskEnable",
- value: //canConstantlyWalk 当加入一个可以持续性行走的任务时,当前未走完的任务变为匀速,任务中最后一个还是easeOut。时间重新计算。
- //若当前任务是带转向的,不允许加入可以持续性行走的任务。否则转向要更改时间麻烦。
- function setPanoTaskEnable(state) {
- this.canConstantlyWalk = state;
- state || this.clearPanosTaskList();
- }
- /*
- let player = __sdk.core.get('Player')
- player.addTourPanoTask({
- panoList:[
- {pano:player.model.panos.index[168], }, //quaternion:new THREE.Quaternion(), lookAtPoint:new THREE.Vector3()
- ],
- flySpeed: 0.003,
- })
- */
- //导览连续匀速漫游
- }, {
- key: "setTourPanoTask",
- value: function setTourPanoTask(_ref2, fastFirstPano) {
- var _ref2$panoList = _ref2.panoList,
- panoList = _ref2$panoList === void 0 ? [] : _ref2$panoList,
- showPath = _ref2.showPath,
- flySpeed = _ref2.flySpeed,
- callback = _ref2.callback;
- if (panoList.length == 0) return;
- this.panosTaskList.length = 0;
- this.addTourPanoTask({
- panoList,
- showPath,
- flySpeed,
- callback
- }, fastFirstPano); //console.log('setTourPanoTask')
- } //导览连续匀速漫游
- }, {
- key: "addTourPanoTask",
- value: function addTourPanoTask(_ref3, fastFirstPano) {
- var _this18 = this;
- var _ref3$panoList = _ref3.panoList,
- panoList = _ref3$panoList === void 0 ? [] : _ref3$panoList;
- _ref3.showPath;
- var _ref3$flySpeed = _ref3.flySpeed,
- flySpeed = _ref3$flySpeed === void 0 ? settings$3.transition.flySpeed : _ref3$flySpeed,
- callback = _ref3.callback;
- //panoList存储的是下一个终点
- this.dontInterruptPanoTask = true; //期间不允许打扰(飞向其他点),如果要立即停止再说
- var panosTaskList = panoList.map(function (e, i) {
- var toPano = Object.assign({
- flySpeed,
- easeType: 'constant',
- gotQua: true
- }, e, {
- sid: Math.random(),
- dealingTask: true,
- callback: i == panoList.length - 1 ? function (flydone) {
- //到最后一个点时要执行:
- flydone = flydone || e.pano == _this18.currentPano;
- if (flydone) {
- _this18.dontInterruptPanoTask = false;
- e.callback && e.callback();
- callback && callback(); //console.log('playForFlyToPano最后的点:' + e.pano.id)
- } //this.panosTaskList.length == 0 && this.pathMesh.setPanos([])
- } : e.callback
- });
- var _this18$getAimToNextP = _this18.getAimToNextPano(e.pano, e.lookAtPoint, e.quaternion),
- aimQua = _this18$getAimToNextP.aimQua;
- _this18$getAimToNextP.hasVideo; //提前获取以计算时间
- toPano.quaternion = aimQua;
- return toPano;
- }); //const len = this.panosTaskList.length
- //还是需要执行回调的,所以得注释
- //len > 0 && delete this.panosTaskList[len - 1].callback
- console.log('addTourPanoTask', panosTaskList.map(function (e) {
- return [e.pano.id
- /* , e.flySpeed */
- ];
- }) + '');
- if (fastFirstPano) {
- //非匀速到第一个点
- panosTaskList[0].easeType = null;
- }
- this.panosTaskList = this.panosTaskList.concat(panosTaskList); //showPath && this.pathMesh.setPanos([this.currentPano].concat(this.panosTaskList.map(e => e.pano)))
- this.flying || this.flyToPano(this.panosTaskList[0]);
- }
- }, {
- key: "stopTourPanoTask",
- value: function stopTourPanoTask() {
- var stopTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 400;
- if (this.panosTaskList.length) {
- var currentTask = this.panosTaskList[0];
- if (currentTask.flyCount) {
- //正在执行
- //迅速停止:
- var restDis = this.position.distanceTo(currentTask.pano.position);
- if (restDis > 0) {
- currentTask.flySpeed = Math.max(restDis / stopTime, currentTask.flySpeed || 0);
- currentTask.aimQua = null; //停止旋转
- currentTask.forceStop = true;
- if (currentTask.easeFun != easing.linearTween) {
- currentTask.easeFun = easing.linearTween;
- var currentSpeed = Math.max(currentTask.currentSpeed || 0, 0.002); //避免起步过慢
- currentTask.duration = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
- this.startTransition(currentTask);
- }
- }
- }
- }
- this.clearPanosTaskList();
- this.dontInterruptPanoTask = false; //this.pathMesh.setPanos([])
- }
- }, {
- key: "clearPanosTaskList",
- value: function clearPanosTaskList() {
- this.panosTaskList = [];
- }
- }, {
- key: "computeDuration",
- value: function computeDuration(toPano) {
- var dis = this.currentPano.position.distanceTo(toPano.pano.position);
- var dur;
- if (toPano.flySpeed && toPano.easeType == 'constant') {
- //导览不根据距离来调速度,但需要防止转弯速度过快
- dur = dis / toPano.flySpeed;
- } else {
- var maxDistance = toPano.maxDistanceOverride || settings$3.transition.flytimeMaxDistanceThreshold;
- dis = Math.min(dis, maxDistance);
- dur = dis * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
- }
- if (toPano.quaternion) {
- var rotSpeed = toPano.maxRotSpeed || settings$3.transition.maxRotSpeed;
- if (toPano.flySpeed && toPano.easeType == 'constant') {
- rotSpeed *= toPano.flySpeed / 0.002; //根据导览速度调整
- }
- var quaOri = this.cameraControls.activeControl.camera.quaternion.clone();
- var vec1 = Vectors$1.FORWARD.clone().applyQuaternion(quaOri);
- var vec2 = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaternion);
- var angle = vec1.angleTo(vec2); //不能直接用quaterniion求angleTo,因为要排除绕着Vectors.FORWARD轴转的角度。
- var time = Math.pow(angle, 0.3) / rotSpeed * 1e3; // for videoPano、导览、热点等
- //console.log('最小旋转时间', time)
- dur = Math.max(time, dur);
- if (toPano.flySpeed && toPano.easeType == 'constant') {
- toPano.flySpeed = dis / dur; //修改速度,以免过后一直变速
- }
- }
- return dur;
- }
- /*
- 飞向下一个pano
- */
- }, {
- key: "getSize",
- value: function getSize() {
- var _this$$app$dom$queryS = this.$app.dom.querySelector('.player[name="main"]'),
- clientWidth = _this$$app$dom$queryS.clientWidth,
- clientHeight = _this$$app$dom$queryS.clientHeight;
- return {
- clientWidth,
- clientHeight
- };
- }
- }, {
- key: "beforeChangeMode",
- value: function beforeChangeMode(fromMode, toMode, toPano, dur) {
- var _this19 = this;
- if (fromMode == Viewmode$1.PANORAMA) {
- this.labelManager && this.labelManager.updateEntryVisi(true, this.model.currentFloor.floorIndex);
- this.chosenMeasureRuler && this.chosenMeasureRuler.showOptionLabel(false);
- common$1.updateVisible(this.model.floorLogos.firstLogo, 'outside', false);
- common$1.updateVisible(this.model.floorLogos.secondLogo, 'outside', false);
- this.model.skybox.material.depthTest = false; //防止飞出后遮住别的mesh xzw add
- this.model.skybox.material.transparent = true;
- this.$app.TagManager.switchLabels({
- type: 'aiList',
- visible: false
- }, null, 'onPanorama');
- this.$app.core.get('PanoRenderer').disposeIdelTargets(); //提前把不需要的dispose防止崩溃
- setTimeout(function () {
- if (_this19.panosTaskList.length) {
- //如果还在flyToPano
- //还没到终点就飞出时的toPano、以及无缝过渡途中加载的下一个点 都要dispose
- var transitionsId = _this19.$app.resource.num + settings$3.freeze.FlyToPano;
- transitions$1.cancelById(transitionsId, true);
- _this19.panosTaskList.forEach(function (e) {
- e.pano.exit();
- });
- }
- }, 1);
- } else if (fromMode == Viewmode$1.FLOORPLAN) {
- EntryArrow.switchDepthTest(true);
- this.model.setModelDisplay(true, 'hideOnfloorplan'); //恢复模型
- } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
- if (toMode == Viewmode$1.PANORAMA) {
- this.model.floorLogos.firstLogo.position.copy(toPano.floorPosition.clone().sub(this.model.position)); //改
- this.model.floorLogos.secondLogo.position.copy(this.model.floorLogos.firstLogo.position); //for floorIcon position
- //this.model.floorLogos.adjustfloorLogoHeight();
- this.compass && this.compass.autoJudgeDisplay();
- this.labelManager && this.labelManager.updateEntryVisi(false, this.model.currentFloor.floorIndex);
- } else if (toMode == Viewmode$1.FLOORPLAN) {
- setTimeout(EntryArrow.switchDepthTest.bind(this, false), dur * 0.5);
- this.labelManager && this.labelManager.setPlanLabelVisi(true, this.model.currentFloor.floorIndex);
- this.$app.TagManager.switchLabels({
- type: 'paths',
- visible: false
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'links',
- visible: false
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'traces-label',
- visible: false
- }, null, 'onFloorplan');
- if (this.$app.store.getValue('flooruser').type == 'image') {
- //从绘图导入的平面图不显示痕迹物证
- this.$app.TagManager.switchLabels({
- type: 'traces',
- visible: false
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'billboards',
- visible: false
- }, null, 'onFloorplan');
- }
- } else if (toMode == Viewmode$1.DOLLHOUSE) ;
- this.$app.Camera.emit('mode.beforeChange', {
- fromMode,
- toMode,
- floorIndex: this.model.currentFloor.floorIndex,
- allVisible: this.model.allFloorsVisible
- });
- }
- }, {
- key: "afterChangeMode",
- value: function afterChangeMode(fromMode, toMode, toPano, dur) {
- if (fromMode == Viewmode$1.PANORAMA) {
- this.compass && this.compass.autoJudgeDisplay();
- this.$app.core.get('PanoRenderer').disposeIdelTargets();
- } else if (fromMode == Viewmode$1.FLOORPLAN) {
- this.labelManager && this.labelManager.setPlanLabelVisi(false, this.model.currentFloor.floorIndex);
- this.$app.TagManager.switchLabels({
- type: 'paths',
- visible: true
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'links',
- visible: true
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'traces-label',
- visible: true
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'traces',
- visible: true
- }, null, 'onFloorplan');
- this.$app.TagManager.switchLabels({
- type: 'billboards',
- visible: true
- }, null, 'onFloorplan');
- } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
- if (toMode == Viewmode$1.PANORAMA) {
- common$1.updateVisible(this.model.floorLogos.firstLogo, 'outside', true);
- common$1.updateVisible(this.model.floorLogos.secondLogo, 'outside', true);
- this.model.floorLogos.changefloorLogoOpa({
- index: 0,
- from: 0,
- opa: 1,
- dur: 150
- }); //this.model.floorLogoShow(0,150);
- this.doorLabels.forEach(function (label) {
- return label.updateVisible();
- });
- this.model.skybox.material.depthTest = true; //防止飞出后遮住别的mesh的恢复 xzw add
- this.model.skybox.material.transparent = false; //透明时vr模式某些角度圆圈看不见;
- this.$app.TagManager.switchLabels({
- type: 'aiList',
- visible: true
- }, null, 'onPanorama');
- this.model.showLowestTile(true);
- /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw
- common.updateVisible(chunk,'atPano',false) //在漫游点处隐藏chunk///无法隐藏模型,因为需要遮挡其他物体。虽然考虑过使用copyCubeMap渲染深度图,但没准这样也耗gpu。15个chunk的损耗1-2毫秒,当降4倍性能之后。
- }) */
- } else if (toMode == Viewmode$1.FLOORPLAN) {
- var showModel = this.model.showOnFloorplan; //|| this.linkEditor?.setPanoVisible || this.linkEditor?.setTagVisible
- this.model.setModelDisplay(showModel, 'hideOnfloorplan'); //其实floorplanCadImg也写了,因需和plane同时提前。但cad模块飞出需要写
- this.model.chunkDisplay.visible && this.model.showLowestTile(false);
- } else if (toMode == Viewmode$1.DOLLHOUSE) {
- this.model.floors.forEach(function (floor) {
- floor.entryArrow.forEach(function (arrow) {
- return arrow.dollLabel.update();
- }); //提前更新下,elem.getBoundingClientRect才有效
- });
- this.model.showLowestTile(false);
- }
- this.$app.Camera.emit('mode.afterChange', {
- fromMode,
- toMode,
- floorIndex: this.model.currentFloor.floorIndex,
- allVisible: this.model.allFloorsVisible
- });
- this.clearPanosTaskList(); //清空
- }
- /**
- * 获取截图位置和视角
- * @returns
- */
- }, {
- key: "setAnimateMakerPano",
- value: //xst,获得需要带动画marker的pano
- function setAnimateMakerPano() {
- var _this20 = this;
- if (!this.currentPano) {
- return;
- }
- var pano;
- if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.enteringView && this.currentPano.isAligned()) {
- var filterFuncs = [Panorama.filters.isPanoAligned()];
- var direction = this.getDirection();
- filterFuncs.push(Panorama.filters.not(this.currentPano));
- filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano)); //filterFuncs.push(Panorama.filters.inFloorDirection_2d(this.currentPano.floorPosition, direction, 0.7))
- filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.position, direction, 0.707)); //45度范围内
- filterFuncs.push(Panorama.filters.isClampDisSquaredTo(this.currentPano.floorPosition, 0.5, 16));
- /* const pano = this.model.panos.find(filterFuncs, [
- Panorama.sortFunctions.floorDistanceToPoint(this.currentPano.floorPosition),
- ]) */
- var sorts = common$1.sortByScore(this.model.panos.list, filterFuncs, [Panorama.scoreFunctions.distanceSquared(this.currentPano, -0.6), Panorama.scoreFunctions.directionFloor(this.currentPano.position, direction)]);
- if (sorts.length > 1) {
- //最后计算下保证 尽量选择在屏幕范围内的
- var p = sorts.slice(0, 4).find(function (e) {
- //最多只计算头几个,多了会卡
- var r = convertTool.getPos2d(e.item.floorPosition, _this20);
- return r.inSight;
- });
- if (p) {
- pano = p.item;
- }
- }
- if (!pano) {
- pano = sorts[0] && sorts[0].item;
- }
- }
- if (pano && pano.id != this.model.panos.animatePanoId) {
- this.model.panos.animatePanoId != void 0 && this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
- pano.updateMakerStyle('animate');
- this.model.panos.animatePanoId = pano.id;
- } else if (!pano && this.model.panos.animatePanoId != void 0) {
- this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
- this.model.panos.animatePanoId = null;
- }
- }
- }, {
- key: "createIntersectLabel",
- value: function createIntersectLabel() {
- this.intersectLabel = new TextSprite({
- text: 'intersectLabel',
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0.1
- },
- borderColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- //textBorderColor: { r: bgcolor.r * 255, g: bgcolor.g * 255, b: bgcolor.b * 250, a: a || 0.9 },
- //textBorderThick: 2,
- margin: {
- x: 10,
- y: 10
- },
- borderRadius: 10,
- rectBorderThick: 2,
- player: this,
- sizeInfo: {
- width2d: 180
- },
- fontsize: 25
- });
- this.intersectLabel.sprite.position.set(0, 2, 0);
- this.model.add(this.intersectLabel);
- }
- }]);
- return Player;
- }(EventEmitter);
- });
- defineComponent('QualityManager', function () {
- return /*#__PURE__*/function () {
- function QualityManager(e, t, i) {
- _classCallCheck(this, QualityManager);
- this.maxNavPanoSize = -1;
- this.maxZoomPanoSize = -1;
- this.devicePixelDensity = e;
- this.deviceScreenSize = t;
- this.clientBandwidth = i;
- this.panoSizeClassMap = {};
- this.useHighResolutionPanos = !0;
- this.useUltraHighResolutionPanos = !1;
- this.modelHasUltraHighPanos = !1;
- this.maxRenderTargetSize = 2048;
- }
- _createClass(QualityManager, [{
- key: "init",
- value: function init() {
- var metadata = this.$app.store.getValue('metadata');
- var resolution = metadata.sceneResolution || '2k';
- if (resolution.indexOf('/') != -1) {
- this.tileClass = resolution.split('/')[1];
- } else {
- this.tileClass = resolution;
- }
- this.navTileClass = '2k';
- if (this.tileClass == '1k') {
- this.navTileClass = '1k';
- this.useHighResolutionPanos = false; // 只加载1k
- }
- if (browser$1.urlHasValue('1k')) {
- this.navTileClass = '1k';
- }
- this.maxRenderTargetSize = config$6.mobile ? 2048 : this.tileClass == '6k' ? 6144 : 4096; //add
- this.maxRenderTargetSize = Math.min(common$1.getMAXCUBETEXTURESIZE(), this.maxRenderTargetSize); //add 部分系统老浏览器只能2048
- this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth);
- this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH);
- this.highSize = this.getPanoSize(PanoSizeClass.HIGH);
- this.standardSize = this.getPanoSize(PanoSizeClass.STANDARD);
- this.baseSize = this.getPanoSize(PanoSizeClass.BASE);
- if (settings$3.tiling.maxZoomPanoQuality && this.ultraHighSize <= settings$3.tiling.maxZoomPanoQuality) {
- settings$3.tiling.allowUltraHighResolution = !0;
- }
- this.highQualityThreshold = browser$1.valueFromHash('threshold2k', constants$4.windowHeightHighQualityThreshold);
- this.updateMaximums();
- this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this));
- this.limitQuality = true; //this.navTileClass = '1k'
- }
- }, {
- key: "updateFromModel",
- value: function updateFromModel(e) {
- this.updateUltraHighResolutionSettings(e);
- }
- }, {
- key: "updateHighResolutionSettings",
- value: function updateHighResolutionSettings(e) {
- showcase.modelDataPromisesTiles(e.data) ? this.useHighResolutionPanos = !0 : this.useHighResolutionPanos = !1, this.updateMaximums();
- }
- }, {
- key: "updateUltraHighResolutionSettings",
- value: function updateUltraHighResolutionSettings(e) {
- if (settings$3.tiling.allowUltraHighResolution && this.modelHasUltraHighPanos) {
- this.useUltraHighResolutionPanos = !0;
- } else {
- this.useUltraHighResolutionPanos = !1;
- }
- this.updateMaximums();
- }
- }, {
- key: "enableUltraHighQualityMode",
- value: function enableUltraHighQualityMode() {
- this.modelHasUltraHighPanos = !0;
- this.updateUltraHighResolutionSettings(null);
- }
- }, {
- key: "ultraHighQualityModeEnabled",
- value: function ultraHighQualityModeEnabled() {
- return this.modelHasUltraHighPanos;
- }
- }, {
- key: "onModelChanged",
- value: function onModelChanged(e) {
- this.updateFromModel(e.model), this.updateMaximums();
- }
- }, {
- key: "updateMaximums",
- value: function updateMaximums() {
- this.maxNavPanoSize = settings$3.tiling.maxNavPanoQuality || this.detectMaxNavPanoSize();
- this.maxZoomPanoSize = settings$3.tiling.maxZoomPanoQuality || this.detectMaxZoomPanoSize();
- this.maxZoomPanoSize < this.maxNavPanoSize && (this.maxNavPanoSize = this.maxZoomPanoSize);
- }
- }, {
- key: "buildPanoSizeClassMap",
- value: function buildPanoSizeClassMap() {
- this.panoSizeClassMap[PanoSizeClass.BASE] = 512;
- this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024;
- this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048;
- this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = this.tileClass == '6k' ? 6144 : 4096;
- }
- }, {
- key: "getPanoSize",
- value: function getPanoSize(e) {
- return this.panoSizeClassMap[e];
- }
- }, {
- key: "getMaxPossiblePanoSize",
- value: function getMaxPossiblePanoSize() {
- return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
- }
- }, {
- key: "getMaxPanoSize",
- value: function getMaxPanoSize() {
- return this.maxZoomPanoSize;
- }
- }, {
- key: "getMaxNavPanoSize",
- value: function getMaxNavPanoSize() {
- return this.maxNavPanoSize;
- }
- }, {
- key: "getMaxZoomPanoSize",
- value: function getMaxZoomPanoSize() {
- return this.maxZoomPanoSize;
- }
- }, {
- key: "detectMaxNavPanoSizeClass",
- value: function detectMaxNavPanoSizeClass() {
- /* return this.useHighResolutionPanos
- ? browser.isMobile()
- ? PanoSizeClass.STANDARD
- : window.innerHeight < this.highQualityThreshold
- ? PanoSizeClass.STANDARD
- : PanoSizeClass.HIGH
- : PanoSizeClass.STANDARD */
- switch (this.navTileClass) {
- case '1k':
- return PanoSizeClass.STANDARD;
- case '512':
- return PanoSizeClass.BASE;
- case '2k':
- default:
- return PanoSizeClass.HIGH;
- }
- }
- }, {
- key: "detectMaxNavPanoSize",
- value: function detectMaxNavPanoSize() {
- var e = this.detectMaxNavPanoSizeClass();
- return this.getPanoSize(e);
- }
- }, {
- key: "detectMaxZoomPanoSize",
- value: function detectMaxZoomPanoSize() {
- if (this.zoomLevelResolution) {
- if (this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos) {
- return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
- } else if (this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos) {
- return this.getPanoSize(PanoSizeClass.STANDARD);
- } else {
- return this.getPanoSize(PanoSizeClass.HIGH);
- }
- } else {
- if (this.useHighResolutionPanos) {
- /* if (browser.isMobile()) {//手机版如果要2k的将这里去掉
- if (settings.tiling.mobileHighQualityOverride) {
- return this.getPanoSize(PanoSizeClass.HIGH);
- } else {
- return this.getPanoSize(PanoSizeClass.STANDARD);
- }
- } else */
- if (this.useUltraHighResolutionPanos) {
- return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
- } else {
- return this.getPanoSize(PanoSizeClass.HIGH);
- }
- } else {
- return this.getPanoSize(PanoSizeClass.STANDARD);
- }
- }
- }
- }]);
- return QualityManager;
- }();
- });
- var panorama = {};
- panorama.getCubemapUrls = function (e, t, i) {
- var a = [0, 1, 2, 3, 4, 5];
- return a.map(function (n, o) {
- return e.get('pan/' + i + '/' + t + '_skybox' + r(n) + '.jpg');
- }.bind(this));
- };
- panorama.mapFaceToCubemapFace = function (e) {
- var s = {
- 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
- 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
- 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
- 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
- 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
- 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
- };
- return s[e];
- };
- var TileDownloaderEvents = {
- TileDownloadSuccess: 'tiledownloader.download.success',
- TileDownloadFailure: 'tiledownloader.download.failure',
- PanoDownloadComplete: 'tiledownloader.pano.download.complete'
- };
- 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); }; }
- 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; } }
- defineComponent('TileDownloader', function () {
- var _class, _temp;
- return _temp = _class = /*#__PURE__*/function (_EventEmitter) {
- _inherits(TileDownloader, _EventEmitter);
- var _super = _createSuper$16(TileDownloader);
- function TileDownloader(_e) {
- var _this;
- _classCallCheck(this, TileDownloader);
- _this = _super.call(this);
- _this.forceQueueTilesForPano = function () {
- var e = [],
- t = [];
- return function (i, n, r, o, a, s) {
- e.length = 0;
- for (var u = this.getTileDownloadDescriptors(i, n), d = 0; d < u.length; d++) {
- var p = u[d];
- p.status !== DownloadStatus.None && p.status !== DownloadStatus.Queued || e.push(p);
- }
- if (r && e.length > 0) {
- TilePrioritizer.sortPanoTiles(e, i, r), t.length = 0, TileUtils.matchingTilesInDirection(i, n, r, o, a, t);
- for (var f = 0, g = function g(e) {
- return e.face === m.face && e.faceTileIndex === m.faceTileIndex;
- }; f < e.length;) {
- var m = e[f],
- v = t.findIndex(g);
- v < 0 ? e.splice(f, 1) : f++;
- }
- }
- for (var A = 0; A < e.length; A++) {
- this.forceQueue.push(e[A]);
- }
- this.setStatusForAllDescriptors(this.forceQueue, DownloadStatus.ForceQueued), this.clearFromQueue(this.priorityQueue, DownloadStatus.ForceQueued, !1), s && this.processQueueForDownloading(this.forceQueue, !0);
- };
- }();
- _this.cleanupActiveDownloads = function () {
- var e = [];
- return function () {
- e.length = 0;
- for (var t = 0; t < this.activeDownloads.length; t++) {
- var i = this.activeDownloads[t];
- i.status !== DownloadStatus.Downloaded && i.status !== DownloadStatus.Failed && e.push(i);
- }
- this.activeDownloads.length = 0, this.activeDownloads.push.apply(this.activeDownloads, e);
- };
- }();
- _this.getTileUrl = function () {
- var e = {
- 256: '256',
- 512: '512',
- 1024: '1k',
- 2048: '2k',
- 4096: '4k',
- 6144: '6k'
- },
- t = {
- face: -1,
- faceTileIndex: -1,
- tileX: -1,
- tileY: -1
- };
- return function (pano, panoSize, tileSize, a, panoType) {
- TileUtils.getTileLocation(panoSize, a, t);
- var s = Math.floor(panoSize / tileSize),
- l = s * s,
- h = Math.floor(a / l),
- d = '';
- 1 === settings$3.tiling.customCompression && ('_' + settings$3.tiling['q' + e[panoSize]]); //8目
- //else if (metadata.sceneScheme == 11) {
- //阿里云oss的规则
- //let tileClass = settings.tileClass
- var metadata = this.$app.store.getValue('metadata');
- var tileClass = metadata.sceneKind || 'tiles';
- var resolution = metadata.sceneResolution || '2k';
- if (resolution.indexOf('/') != -1) {
- var temp = resolution.split('/');
- tileClass = temp[0];
- resolution = temp[1];
- } // let tileClass = metadata.sceneKind
- // let resolution = metadata.sceneResolution
- // let temp = resolution.split('/')
- // // 临时方案
- // if (temp.length == 1) {
- // tileClass = resolution
- // } else {
- // tileClass = temp[0]
- // resolution = temp[1]
- // }
- // if (pano.panoType == '360view') {
- // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
- // d = this.getTiles('tiles/' + i + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg')
- // g = '?'
- // } else {
- // d = `tiles/${pano.view.resolution}/${pano.view.imgSid}`
- // }
- // } else {
- // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
- // } else {
- // d = tileClass + '/' + resolution + '/' + pano.id
- // }
- // }
- if (this.$app.config.deploy === 'local' || tileClass === 'face') {
- if (pano.panoType == '360view') {
- d = 'tiles/' + pano.view.imgSid + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
- } else {
- d = 'tiles/' + pano.id + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
- }
- } else {
- if (pano.panoType == '360view') {
- d = "tiles/".concat(pano.view.resolution, "/").concat(pano.view.imgSid);
- } else {
- d = tileClass + '/' + resolution + '/' + pano.id;
- }
- d += '_skybox' + h + '.jpg?x-oss-process=';
- if (e[panoSize] == '512') {
- d += 'image/resize,h_512';
- } else {
- //移动端是1k,pc端是2k
- if (e[panoSize] == '1k' || e[panoSize] == '2k') {
- d += "image/resize,m_lfit,w_".concat(panoSize, "/crop,w_").concat(tileSize, ",h_").concat(tileSize, ",");
- } else {
- d += "image/crop,w_".concat(tileSize, ",h_").concat(tileSize, ",");
- }
- if (t.tileX == 0) {
- d += 'x_0,';
- } else {
- d += 'x_' + tileSize * t.tileX
- /* - 1 */
- + ','; //2022.12.12去掉了 -1, 否则https://www.4dkankan.com/spg.html?m=KJ-2HnN97rU51&lang=zh点位18的 18_skybox0 和 18_skybox3对不上
- }
- if (t.tileY == 0) {
- d += 'y_0';
- } else {
- d += 'y_' + tileSize * t.tileY;
- /* - 1 */
- }
- }
- /* 腾讯云适配 */
- // d += '_skybox' + h + '.jpg?imageMogr2/'
- // if (e[panoSize] == '512') {
- // d += 'thumbnail/512x'
- // } else {
- // if (e[panoSize] == '1k' || e[panoSize] == '2k') {
- // d += `crop/${panoSize}x${panoSize}/cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
- // } else {
- // d += `cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
- // }
- // }
- }
- if (pano.panoType == '360view') {
- if (!this.$app.core.get('Player').viewLinkManager.views[pano.id]) return;
- d = this.$app.resource.getUserImagesURL("panorama/".concat(pano.view.imgSid, "/").concat(d));
- } else {
- d = this.getTiles(d);
- }
- return d;
- };
- }();
- _this.panos = null;
- _this.retryMinimumTime = 1e4;
- _this.urls = null;
- _this.panoLoadCallbacks = {};
- _this.downloadDescriptors = {};
- _this.priorityQueue = [];
- _this.forceQueue = [];
- _this.activeDownloads = [];
- _this.tilePrioritizer = null;
- _this.refreshInterval = null;
- _this.processPriorityQueue = !1;
- _this.concurrentDownloads = _e.concurrentDownloads || 1;
- _this.downloadTestResults = {};
- _this.freeze = Object.freeze({
- Testing: 1,
- Success: 2,
- Fail: 3
- });
- _this.$app = _e.$app;
- _this.index = 0;
- return _this;
- }
- _createClass(TileDownloader, [{
- key: "init",
- value: function init() {// Todo
- }
- }, {
- key: "setUrls",
- value: function setUrls(e) {
- this.urls = e;
- }
- }, {
- key: "setPanoData",
- value: function setPanoData(e, t, i) {
- //xzw 改。不直接使用model.panos,因为要去掉其中非tiled的pano
- this.panos = e.clone();
- this.panos.filter(function (e) {
- return e.tiled;
- });
- this.imagePanos = t; //没什么用?heroLocation的
- this.panoGroupId = i;
- }
- /*start() {
- this.refreshUpdateInterval(0)
- }
- stop() {
- window.cancel(this.refreshInterval)
- }
- */
- }, {
- key: "refreshUpdateInterval",
- value: function refreshUpdateInterval(e) {
- //还未加入sceneRenderer的component时使用
- e || (e = 0), this.refreshInterval = window.setTimeout(function () {
- var e = this.update();
- e ? this.refreshUpdateInterval(TileDownloader.ACTIVE_REFRESH_DELAY) : this.refreshUpdateInterval(TileDownloader.IDLE_REFRESH_DELAY);
- }.bind(this), e);
- } //xzw 改
- }, {
- key: "start",
- value: function start() {
- this.started = true;
- if (this.refreshEveryFrame) this.$app.core.get('SceneRenderer').addComponent(this, true);else this.refreshUpdateInterval(0);
- }
- }, {
- key: "useComponent",
- value: function useComponent() {
- this.refreshEveryFrame = true;
- window.clearTimeout(this.refreshInterval);
- this.start();
- }
- }, {
- key: "stop",
- value: function stop() {
- window.clearTimeout(this.refreshInterval);
- this.$app.core.get('SceneRenderer').removeComponent(this);
- }
- }, {
- key: "update",
- value: function update() {
- var _this2 = this;
- var e = this.forceQueue.length > 0;
- this.processQueueForDownloading(this.forceQueue);
- if (this.processPriorityQueue) {
- common$1.intervalTool.isWaiting('processPriorityQueue_' + this.$app.resource.num + this.index, function () {
- //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
- _this2.queuePrioritizedTilesForPanos(_this2.panos); //这句比较耗时 降四倍时大概1-2毫秒
- }, this.$app.config.mobile ? 120 : 66);
- this.priorityQueue.length > 0 && (e = !0);
- this.processQueueForDownloading(this.priorityQueue);
- }
- return e;
- }
- }, {
- key: "clearForceQueue",
- value: function clearForceQueue() {
- this.clearQueue(this.forceQueue);
- }
- }, {
- key: "queuePrioritizedTilesForPanos",
- value: function queuePrioritizedTilesForPanos(e) {
- if (this.tilePrioritizer) {
- var player = this.$app.core.get('Player');
- var maxLoadTileCount = player.lowTile == 'level2' ? 6 : player.lowTile == 'level1' ? 10 : 30;
- this.clearQueue(this.priorityQueue);
- this.tilePrioritizer.filterAndPrioritize(this.priorityQueue, e, this, maxLoadTileCount);
- this.clearFromQueue(this.priorityQueue, DownloadStatus.None, !0);
- this.setStatusOrRemoveForAllDescriptors(this.priorityQueue, DownloadStatus.Queued);
- }
- }
- }, {
- key: "clearQueue",
- value: function clearQueue(e) {
- this.setStatusForAllDescriptors(e, DownloadStatus.None), e.length = 0;
- }
- }, {
- key: "clearFromQueue",
- value: function clearFromQueue(e, t, i) {
- for (var n = 0; n < e.length; n++) {
- var r = e[n];
- r && (t === r.status && !i || t !== r.status && i) && (e[n] = null);
- }
- }
- }, {
- key: "setStatusForAllDescriptors",
- value: function setStatusForAllDescriptors(e, t) {
- for (var i = 0; i < e.length; i++) {
- var n = e[i];
- n && (n.status = t);
- }
- }
- }, {
- key: "setStatusOrRemoveForAllDescriptors",
- value: function setStatusOrRemoveForAllDescriptors(e, t) {
- for (var i = 0; i < e.length; i++) {
- var n = e[i];
- n && (n.status !== t ? n.status = t : e[i] = null);
- }
- }
- }, {
- key: "getTileDownloadDescriptors",
- value: function getTileDownloadDescriptors(e, t) {
- var i = this.getAllTileDownloadDescriptorsForPano(e),
- n = i[t];
- return n || (n = this.buildDownloadDescriptorArray(t), i[t] = n, this.initTileDownloadDescriptors(n, e, t)), n;
- }
- }, {
- key: "getAllTileDownloadDescriptorsForPano",
- value: function getAllTileDownloadDescriptorsForPano(e) {
- var t = this.downloadDescriptors[e.id];
- return t || (t = {}, this.downloadDescriptors[e.id] = t), t;
- }
- }, {
- key: "processQueueForDownloading",
- value: function processQueueForDownloading(e, t) {
- this.cleanupActiveDownloads();
- /* let flying = this.$app.core.get('Player').flying
- let isMobile = this.$app.config.mobile */
- // xzw 改 4.6.0
- if (e.length) {
- //let concurrentDownloads = common.getBestCount('concurrentDownloads', 1, 6) //flying ? (isMobile ? 2 : 3) : 6
- var concurrentDownloads = common$1.getBestCount({
- name: 'concurrentDownloads',
- minCount: 0,
- maxCount: 6,
- durBound1: 1,
- durBound2: 12,
- //8以下太小,模型大的场景加载慢
- ifLog: false,
- maxHistory: 4,
- isMobile: this.$app.config.mobile
- }); //最小值设置为0,否则4k放大快速过渡会崩溃,之前v3不会崩是因为用setTimeout加载慢
- if (this.activeDownloads.length < concurrentDownloads || t) {
- var i = t ? e.length : concurrentDownloads - this.activeDownloads.length;
- for (var n = 0, r = 0; n < i && e.length > 0; r++) {
- var o = e.shift();
- o && (this.startDownload(o), n++);
- }
- }
- }
- }
- }, {
- key: "testDownload",
- value: function testDownload(e, t, i) {
- var n = this.downloadTestResults[e];
- if (n) return void (n === this.freeze.Success ? i(!0) : n === this.freeze.Fail && i(!1));
- this.downloadTestResults[e] = this.freeze.Testing;
- var r = this.panos.list[0],
- o = this.getTileUrl(r, e, t, 0),
- a = function (t) {
- this.downloadTestResults[e] = this.freeze.Success, i(!0);
- }.bind(this),
- s = function () {
- this.downloadTestResults[e] = this.freeze.Fail, i(!1);
- }.bind(this);
- this.loadImage(o, 0, a, s);
- }
- }, {
- key: "startDownload",
- value: function startDownload(e) {
- //开始下载啦
- e.status = DownloadStatus.Downloading;
- var t = this.getTileUrl(e.pano, e.panoSize, e.tileSize, e.tileIndex);
- this.activeDownloads.push(e);
- 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)
- } // //xst,加载一个点的所有图片
- // loadAllImgsForOnePano(pano,size){
- // if(!size){
- // size = 2048
- // }
- // //是否存在
- // this.downloadDescriptor
- // let queue = this.getTileDownloadDescriptors(pano, size)
- // for(let i=0;i<queue.length;++i){
- // this.forceQueue.push(queue[i]);
- // }
- // this.processQueueForDownloading(this.forceQueue, !0)
- // //默认情况,显示2k图片
- // //是否下载了
- // const flag = isPanoDownloaded(pano,2048)
- // if(!flag){
- // //没有的话,开始下载
- // e.status = DownloadStatus.Downloading
- // var t = this.getTileUrl(e.pano.id, e.panoSize, e.tileSize, e.tileIndex, e.pano.alignmentType) //xzw add alignmentType
- // this.activeDownloads.push(e)
- // this.loadImage(t, TileDownloader.DOWNLOAD_RETRIES, this.downloadComplete.bind(this, e), this.downloadFailed.bind(this, e))
- // }
- // }
- }, {
- key: "downloadFailed",
- value: function downloadFailed(e, t) {
- e.pano.tileError = true;
- console.warn(t);
- this.emit(TileDownloaderEvents.TileDownloadFailure);
- }
- }, {
- key: "downloadComplete",
- value: function downloadComplete(e, t) {
- if (e.panoGroupId === this.panoGroupId) {
- var i = this.getPanoLoadCallbacks(e.pano, e.panoSize);
- e.status = DownloadStatus.Downloaded, i && i.onProgress && i.onProgress(e.pano, e.panoSize);
- var n = {
- panoId: e.pano.id,
- image: t,
- tileSize: e.tileSize,
- panoSize: e.panoSize,
- tileIndex: e.tileIndex,
- faceTileIndex: e.faceTileIndex,
- totalTiles: e.totalTiles,
- face: e.face,
- tileX: e.tileX,
- tileY: e.tileY,
- direction: e.direction
- };
- e.image = t, this.emit(TileDownloaderEvents.TileDownloadSuccess, n), this.isPanoDownloaded(e.pano, e.panoSize) && (n = {
- panoId: e.pano.id,
- tileSize: e.tileSize,
- panoSize: e.panoSize
- }, this.emit(TileDownloaderEvents.PanoDownloadComplete, n), i && i.onLoad && i.onLoad(e.pano, e.panoSize)); //console.log('下载成功')
- }
- }
- }, {
- key: "isPanoDownloaded",
- value: function isPanoDownloaded(e, t) {
- var i = this.getTileDownloadDescriptors(e, t);
- if (i.length <= 0) return !1;
- for (var n = 0; n < i.length; n++) {
- var r = i[n];
- if (r.status !== DownloadStatus.Downloaded) return !1;
- }
- return !0;
- }
- }, {
- key: "setPanoLoadCallbacks",
- value: function setPanoLoadCallbacks(e, t, i, n, r) {
- var o = e.id + ':' + this.$app.core.get('QualityManager').getPanoSize(t);
- this.panoLoadCallbacks[o] = {
- onLoad: i,
- onFail: n,
- onProgress: r
- };
- }
- }, {
- key: "getPanoLoadCallbacks",
- value: function getPanoLoadCallbacks(e, t) {
- var i = e.id + ':' + t;
- return this.panoLoadCallbacks[i];
- }
- }, {
- key: "buildDownloadDescriptorArray",
- value: function buildDownloadDescriptorArray(e) {
- for (var t = TileUtils.getTileCountForSize(e), i = [], n = 0; n < t; n++) {
- var r = this.buildDownloadDescriptor();
- i.push(r);
- }
- return i;
- }
- }, {
- key: "buildDownloadDescriptor",
- value: function buildDownloadDescriptor() {
- var e = {
- panoGroupId: null,
- pano: null,
- panoSize: -1,
- tileSize: -1,
- tileIndex: -1,
- totalTiles: -1,
- faceTileIndex: -1,
- status: DownloadStatus.None,
- url: null,
- image: null,
- direction: new THREE.Vector3(),
- face: -1,
- cubeFace: -1,
- tileX: -1,
- tileY: -1
- };
- return e;
- }
- }, {
- key: "initTileDownloadDescriptors",
- value: function initTileDownloadDescriptors(e, t, i) {
- for (var n = 0; n < e.length; n++) {
- var r = e[n];
- this.initTileDownloadDescriptor(r, t, i, n);
- }
- }
- }, {
- key: "initTileDownloadDescriptor1",
- value: function initTileDownloadDescriptor1(e, t, i, n) {
- var r = i >= TileUtils.TILE_SIZE ? TileUtils.TILE_SIZE : i;
- e.face = TileUtils.getFaceForTile(i, n);
- e.cubeFace = panorama.mapFaceToCubemapFace(e.face);
- e.panoGroupId = this.panoGroupId;
- e.pano = t;
- e.panoSize = i;
- e.tileSize = r;
- e.tileIndex = n;
- e.totalTiles = TileUtils.getTileCountForSize(i);
- e.status = DownloadStatus.None;
- e.image = null;
- TileUtils.getTileLocation(e.panoSize, e.tileIndex, e);
- TileUtils.getTileVector(e.panoSize, e.tileSize, e.cubeFace, e.tileX, e.tileY, TileUtils.LocationOnTile.Center, 0, e.direction);
- }
- }, {
- key: "initTileDownloadDescriptor",
- value: function initTileDownloadDescriptor(desc, pano, size, index) {
- var r = size >= TileUtils.TILE_SIZE ? TileUtils.TILE_SIZE : size;
- desc.face = TileUtils.getFaceForTile(size, index); //根据顺序得到的face的index
- desc.cubeFace = TileUtils.mapFaceToCubemapFace(desc.face); //为了贴图而转化的face index
- desc.panoGroupId = this.panoGroupId; //就是场景号
- desc.pano = pano;
- desc.panoSize = size;
- desc.tileSize = r; //瓦片图size 512
- desc.tileIndex = index;
- desc.status = DownloadStatus.None;
- desc.image = null; //xzw
- if (size == 6144) {
- //desc.panoSize = 6144 //4096 * 1.5
- desc.tileSize = 768; //512 * 1.5
- }
- desc.totalTiles = TileUtils.getTileCountForSize(size);
- TileUtils.getTileLocation(desc.panoSize, desc.tileIndex, desc); //得到该tile在这个face中的具体位置(tileX等)
- TileUtils.getTileVector(desc.panoSize, desc.tileSize, desc.cubeFace, desc.tileX, desc.tileY, TileUtils.LocationOnTile.Center, 0, desc.direction);
- }
- }, {
- key: "loadImage",
- value: function loadImage(e, t, i, n) {
- http.getImage(e, t).then(function (e) {
- i(e);
- }).fail(n);
- }
- }, {
- key: "getTiles",
- value: function getTiles(d) {
- return this.urls.get(d); //config.urls.tileImgPath+d;
- }
- }]);
- return TileDownloader;
- }(EventEmitter), _class.IDLE_REFRESH_DELAY = 500, _class.ACTIVE_REFRESH_DELAY = 16, _class.DOWNLOAD_RETRIES = 4, _temp;
- });
- function Node$1(e, t) {
- this.tree = e, this.parent = t, this.children = [], this.id = ++u;
- }
- function o$2(e, t, i, r, a, s, l, h) {
- if (e) {
- l = l || TileTree.TraversalType.PreOrder;
- var u = r * c$1 + i;
- if (l === TileTree.TraversalType.PreOrder && (a && a(e, t, u, i, r), s && s.push(e)), e.children && 0 !== e.children.length) {
- for (var d = r * c$1, p = i * c$1, f = 0; f < c$1; f++) {
- for (var g = 0; g < c$1; g++) {
- o$2(e.children[g * c$1 + f], t + 1, p + f, d + g, a, s, l);
- }
- }
- l === TileTree.TraversalType.PostOrder && (a && a(e, t, u, i, r), s && s.push(e));
- }
- }
- }
- function Plant(seed) {
- seed.root = Branch(seed, null, 0);
- }
- function Branch(seed, parent, level) {
- if (level > seed.levels) return null;
- var node = new Node$1(seed, parent);
- seed.allNodes.push(node);
- for (var o = 0; o < h; o++) {
- node.children[o] = Branch(seed, node, level + 1);
- }
- return node;
- }
- function l$2(parent, t, level, n, r) {
- if (!parent) return null;
- if (0 === level) return parent;
- if (!parent.children || 0 === parent.children.length) return null;
- var o = Math.pow(c$1, level),
- a = o / c$1,
- s = n % a,
- h = r % a,
- u = Math.floor(r / a),
- d = Math.floor(n / a),
- p = u * c$1 + d,
- f = parent.children[p];
- return l$2(f, t + 1, level - 1, s, h);
- }
- /* cube每个面都有一个分层树 用于代表瓦片图的细分?
- 树4096的分为三层,每层有4个子节点。(最后一层的四个子节点都是null)
- */
- var c$1 = 2,
- h = c$1 * c$1; //4个子节点
- var u = 0;
- var TileTree = /*#__PURE__*/function () {
- function TileTree(e, t) {
- _classCallCheck(this, TileTree);
- this.levels = t, this.tileSize = e, this.root = null, this.allNodes = [], Plant(this);
- }
- _createClass(TileTree, [{
- key: "getSubNode",
- value: function getSubNode(e, t, i) {
- (!t || e < this.tileSize) && (t = 0), (!i || e < this.tileSize) && (i = 0), e < this.tileSize && (e = this.tileSize);
- var level = TileTree.getLevelCountForSize(this.tileSize, e),
- o = l$2(this.root, 0, level, t, i);
- return o;
- }
- }, {
- key: "breadthFirst",
- value: function breadthFirst(e) {
- //广度优先搜索
- e = e || {};
- var t = !!e.nullLevelEnd,
- i = e.maxLevel,
- n = e.minLevel,
- r = e.callback,
- o = e.saveVisited,
- a = [],
- s = {},
- l = 0;
- for (a.push(this.root), a.push(s); a.length > 0 && !(i && l > i);) {
- var h = a.shift();
- if (h === s) (!n || l >= n) && (r && t && r(null), o && t && o.push(null)), a.length > 0 && a.push(s), l++;else {
- if (h.children) for (var u = 0; u < h.children.length; u++) {
- var d = h.children[u];
- d && a.push(h.children[u]);
- }
- var p = this.getFaceIndexFromNode(h);
- (!n || l >= n) && (r && r(h, l, p), o && o.push(h));
- }
- }
- }
- }, {
- key: "getFaceIndexFromNode",
- value: function getFaceIndexFromNode(e) {
- if (!e) return -1;
- for (var t = 1, i = e, n = 0, r = 0;;) {
- var o = i.parent;
- if (!o) break;
- for (var a = -1, s = 0; s < o.children.length; s++) {
- o.children[s] === i && (a = s);
- }
- var l = a % c$1,
- h = Math.floor(a / c$1);
- n = l * t + n, r = h * t + r, t *= c$1, i = o;
- }
- return r * t + n;
- }
- }, {
- key: "depthFirst",
- value: function depthFirst(e, t, i) {
- o$2(this.root, 0, 0, 0, e, t, i, this.tileSize);
- }
- }]);
- return TileTree;
- }();
- TileTree.TraversalType = Object.freeze({
- PreOrder: 0,
- PostOrder: 1
- });
- TileTree.getLevelCountForSize = function (tileSize, size) {
- //512->0 2024->1
- var i = 0;
- for (size < tileSize && (size = tileSize);;) {
- if (size /= c$1, size < tileSize) break;
- i++;
- }
- return i;
- };
- TileTree.getSizeForLevel = function (e, t) {
- return Math.pow(c$1, t) * e;
- };
- /*
- 旧:
- window.TileTree = function (e, t) {
- ;(this.levels = t), (this.tileSize = e), (this.root = null), (this.allNodes = []), a(this)
- }
- function r(e, t) {
- ;(this.tree = e), (this.parent = t), (this.children = []), (this.id = ++u)
- }
- function o(e, t, i, r, a, s, l, h) {
- if (e) {
- l = l || TileTree.TraversalType.PreOrder
- var u = r * c + i
- if ((l === TileTree.TraversalType.PreOrder && (a && a(e, t, u, i, r), s && s.push(e)), e.children && 0 !== e.children.length)) {
- 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)
- l === TileTree.TraversalType.PostOrder && (a && a(e, t, u, i, r), s && s.push(e))
- }
- }
- }
- function a(e) {
- e.root = s(e, null, 0)
- }
- function s(e, t, i) {
- if (i > e.levels) return null
- var n = new r(e, t)
- e.allNodes.push(n)
- for (var o = 0; o < h; o++) n.children[o] = s(e, n, i + 1)
- return n
- }
- function l(e, t, i, n, r) {
- if (!e) return null
- if (0 === i) return e
- if (!e.children || 0 === e.children.length) return null
- var o = Math.pow(c, i),
- a = o / c,
- s = n % a,
- h = r % a,
- u = Math.floor(r / a),
- d = Math.floor(n / a),
- p = u * c + d,
- f = e.children[p]
- return l(f, t + 1, i - 1, s, h)
- }
- var c = 2,
- h = c * c
- TileTree.TraversalType = Object.freeze({
- PreOrder: 0,
- PostOrder: 1,
- })
- var u = 0
- ;(TileTree.getLevelCountForSize = function (e, t) {
- var i = 0
- for (t < e && (t = e); ; ) {
- if (((t /= c), t < e)) break
- i++
- }
- return i
- }),
- (TileTree.getSizeForLevel = function (e, t) {
- return Math.pow(c, t) * e
- }),
- (TileTree.prototype.getSubNode = function (e, t, i) {
- ;(!t || e < this.tileSize) && (t = 0), (!i || e < this.tileSize) && (i = 0), e < this.tileSize && (e = this.tileSize)
- var r = TileTree.getLevelCountForSize(this.tileSize, e),
- o = l(this.root, 0, r, t, i)
- return o
- }),
- (TileTree.prototype.breadthFirst = function (e) {
- e = e || {}
- var t = !!e.nullLevelEnd,
- i = e.maxLevel,
- n = e.minLevel,
- r = e.callback,
- o = e.saveVisited,
- a = [],
- s = {},
- l = 0,
- c = 0
- for (a.push(this.root), a.push(s); a.length > 0 && !(i != void 0 && l > i); ) {
- var h = a.shift()
- if (h === s) (!n || l >= n) && (r && t && r(null), o && t && o.push(null)), a.length > 0 && a.push(s), l++, (c = 0)
- else {
- if (h.children)
- for (var u = 0; u < h.children.length; u++) {
- var d = h.children[u]
- d && a.push(h.children[u])
- }
- var p = this.getFaceIndexFromNode(h)
- ;(!n || l >= n) && (r && r(h, l, p), o && o.push(h)), c++
- }
- }
- }),
- (TileTree.prototype.getFaceIndexFromNode = function (e) {
- if (!e) return -1
- for (var t = 1, i = e, n = 0, r = 0; ; ) {
- var o = i.parent
- if (!o) break
- for (var a = -1, s = 0; s < o.children.length; s++) o.children[s] === i && (a = s)
- var l = a % c,
- h = Math.floor(a / c)
- ;(n = l * t + n), (r = h * t + r), (t *= c), (i = o)
- }
- return r * t + n
- }),
- (TileTree.prototype.depthFirst = function (e, t, i) {
- o(this.root, 0, 0, 0, e, t, i, this.tileSize)
- })
- export default TileTree
- */
- 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); }; }
- 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; } }
- function createDescriptor() {
- var e = {
- renderTarget: null,
- inUse: !1,
- size: -1,
- pano: null
- };
- return e;
- }
- /*
- 测试崩溃时,最好每次都清除缓存,因为清除后不容易崩溃了
- */
- function getMaxCount($app) {
- var isMobile = $app.config.mobile,
- maxCount;
- if (isMobile) {
- //手机的gpu相比cpu可能弱的多,个数要降低
- maxCount = common$1.getBestCount({
- name: 'maxTileRender',
- minCount: 0,
- maxCount: 4,
- durBound1: 1,
- durBound2: 4,
- ifLog: false,
- maxHistory: 3
- });
- } else {
- maxCount = common$1.getBestCount({
- name: 'maxTileRender',
- minCount: 0,
- maxCount: 6,
- durBound1: 1,
- durBound2: 6,
- ifLog: false,
- maxHistory: 2
- });
- }
- return maxCount;
- }
- function upload() {
- if (!this.uploadIntervalCancelled) {
- b$1 = !0;
- /* let flying = this.$app.core.get('Player').flying
- let isMobile = this.$app.config.mobile
- let maxNonBaseUploadsPerFrame = (flying || isMobile) ? 1 : 2 //this.maxNonBaseUploadsPerFrame //原先2。这是每帧uploadTile非512的瓦片tex的数量。之前的2太卡了,降为1。(检测卡顿方法:在一个pano点旋转至所有2048的tile都加载完,然后之后到这个点看看卡不卡。因为该点tiles都下载完了所以会在飞过来时陆续都加载,所以容易卡)
- let maxBaseUploadsPerFrame = flying ? (isMobile ? 1 : 3) : 6//this.maxBaseUploadsPerFrame //原先6. 但持续前进过程中会请求加载下一个漫游图,一次加6张会卡的。
-
- this.updateUploadQueue(maxNonBaseUploadsPerFrame, maxBaseUploadsPerFrame)
- let time = flying ? 20 : 15 //w // 飞行有时候会卡,增长间隔 */
- var maxCount = getMaxCount(this.$app);
- this.updateUploadQueue(2, 6, maxCount);
- var time = 16;
- this.peekNextFromUploadQueue() ? this.refreshUploadInterval(time) : this.uploadInterval = null; //定时下一次更新
- /* this.updateUploadQueue(this.maxNonBaseUploadsPerFrame, this.maxBaseUploadsPerFrame),
- this.peekNextFromUploadQueue() ? this.refreshUploadInterval(w) : (this.uploadInterval = null)
- */
- }
- }
- var b$1 = !1,
- w$1 = settings$3.tiling.uploadIntervalDelay,
- _ = settings$3.tiling.initialIntervalDelay,
- T$1 = settings$3.tiling.maxNonBaseUploadsPerFrame,
- x$2 = settings$3.tiling.maxBaseUploadsPerFrame,
- S = {
- Base: 0,
- Remaining: 1
- };
- /* ,
- M = []; */
- defineComponent('PanoRenderer', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(PanoRenderer, _EventEmitter);
- var _super = _createSuper$15(PanoRenderer);
- function PanoRenderer(index) {
- var _this;
- _classCallCheck(this, PanoRenderer);
- _this = _super.call(this);
- _this.updateActivePanos = function () {
- var e = [];
- return function (t, i) {
- e.length = 0;
- for (var n = 0; n < this.activePanos.length; n++) {
- t && e.length === i && e.push(t);
- var r = this.activePanos[n],
- o = this.getActiveRenderTargetDescriptor(r.id);
- t && r.id === t.id || !this.isRenderTargetDescriptorValid(o) || e.push(r);
- }
- t && i >= e.length && e.push(t), this.activePanos.length = 0, this.activePanos.push.apply(this.activePanos, e);
- };
- }();
- _this.renderPanoTiles = function () {
- var e = [];
- return function (panoId, i, n, r, quality) {
- this.zoomRenderTarget && this.zoomRenderTarget.width === this.$app.core.get('QualityManager').getMaxZoomPanoSize() || this.zoomPanoRenderingDisabled || this.setupZoomRenderTarget(), i = i || this.direction || Vectors.FORWARD;
- var o = this.getActiveRenderTargetDescriptor(panoId);
- if (!this.isRenderTargetDescriptorValid(o)) console.error('PanoRenderer.renderPanoTiles() -> Cannot render to a pano that is not activated.');
- for (var a = 0; a < TileUtils.FACES_PER_PANO; a++) {
- var s = this.getTileTree(panoId, a);
- e.length = 0;
- s.breadthFirst({
- //获取所有node, 从512到4096的共85个tiles
- saveVisited: e,
- maxLevel: quality ? quality == 512 ? 0 : quality == 1024 ? 1 : quality == 2048 ? 2 : 3 : 3
- });
- var dontDraw = this.$app.config.mobile && this.$app.core.get('Player').mode == 'panorama'; //从外面飞入时似乎不容易崩溃,直接加载吧否则等很久
- for (var l = 0; l < e.length; l++) {
- var c = e[l];
- this.queueTileUpload(c.tile, !1, !dontDraw && (r || 0 === l && n)); //isMobile手机端不直接uploadTile base的6张贴图, 容易卡甚至崩溃
- }
- }
- this.updateDirection(i);
- };
- }();
- _this.getNextFromUploadQueue = function () {
- //获取第一项并在列表中删除它
- var e = function e(_e) {
- var t = _e.shift();
- return t.uploadQueued = !1, t;
- };
- return function () {
- if (this.forceQueue.length > 0) return e(this.forceQueue);
- var t = this.getTopUploadQueue();
- return t && t.length > 0 ? e(t) : null;
- };
- }();
- _this.refreshUploadInterval = function () {
- var e = null;
- return function (t) {
- if (!this.uploadIntervalCancelled) {
- e || (e = upload.bind(this));
- null !== t && void 0 !== t || (t = w$1);
- b$1 || (t = _);
- this.uploadInterval = window.setTimeout(e, t);
- this.uploadIntervalDelay = t;
- }
- };
- }();
- _this.update = function () {
- this.uploadIntervalCancelled = true; //不使用setTimeout,而是在sceneRenderer每帧都update
- this.$app.core.get('Player').lastFrameChanged;
- var maxCount = getMaxCount(this.$app); //注:静止时看不出卡顿所以全速加载
- this.updateUploadQueue(2, 6, maxCount);
- };
- _this.uploadTile = function () {
- var collection = {},
- overlayStyle = settings$3.tiling.overlayStyle;
- var failHistory = {};
- return function (info, n) {
- var _this2 = this;
- var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
- var id = info.panoId,
- img = info.image,
- tileSize = info.tileSize,
- panoSize = info.panoSize,
- tileIndex = info.tileIndex,
- totalTiles = info.totalTiles,
- tileX = info.tileX,
- tileY = info.tileY,
- p = !0,
- g = !1,
- ignore = false,
- //add
- LodDescripor = (this.getPanoDescriptor(id), this.getPanoLODDescriptor(id, panoSize)),
- activeDescripor = this.getActiveRenderTargetDescriptor(id),
- renderTarget = activeDescripor.renderTarget,
- size = activeDescripor.size; //当前要渲染的面的分辨率,也就是MaxNavPanoSize
- if (this.isPanoZoomed(id) && this.zoomRenderTarget) {
- renderTarget = this.zoomRenderTarget;
- size = this.zoomRenderTarget.width; //this.qualityManager.getMaxZoomPanoSize(); //放大后可能2048或4096
- }
- var done = function done() {
- if (!LodDescripor.uploaded.includes(tileIndex)) {
- //已经upload过(本来这时候直接返回,但发现缩放后这不会归零,导致清晰度不更新,所以还是redraw且emit吧)
- //console.log('try to reupload and return',tileIndex)
- LodDescripor.uploaded.push(tileIndex);
- LodDescripor.uploadCount++;
- }
- _this2.emit(PanoRendererEvents.TileRenderSuccess, id, panoSize, tileIndex, totalTiles);
- LodDescripor.uploadCount === totalTiles && _this2.emit(PanoRendererEvents.PanoRenderComplete, id, panoSize, totalTiles);
- _this2.setUploaded(info, !0);
- _this2.addCoverageForNode(info.node);
- };
- {
- this.isRenderTargetDescriptorValid(activeDescripor) || (p = !1, g = !1);
- if (!n) {
- if (this.anyUploaded(info.node)) {
- p = !1, g = !0;
- ignore = true;
- }
- this.isTileUploaded(info) && (p = !1, g = !1, ignore = true);
- }
- }
- if (p) {
- /* if(failHistory[id+':'+ panoSize+ ':' +tileIndex]){
- console.log('uploadTile retry',id, panoSize, tileIndex)
- } */
- // console.log('uploadTile 成功', id, panoSize, tileIndex)
- var C = tileX * tileSize,
- I = tileY * tileSize,
- E = tileSize / panoSize * size,
- // tile在renderTarget上渲染出的宽度
- b = C / panoSize * size,
- // tile在renderTarget上渲染的startX
- w = I / panoSize * size; // tile在renderTarget上渲染的startY
- if (panoSize > this.$app.core.get('QualityManager').maxRenderTargetSize) {
- //4096 改
- //var tex = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping)
- //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(info.cubeFace, tileX, tileY)
- this.$app.core.get('Player').model.getHighImage(img, info.cubeFace, tileX, tileY);
- } else {
- collection[tileSize] || (collection[tileSize] = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping));
- var tex = collection[tileSize];
- sceneRenderer.uploadTexture2D(img, tex, 0, 0, tileSize, tileSize); //只替换tex对应的img,不新建
- if (1 === overlayStyle || 2 === overlayStyle) {
- var T = 1 === overlayStyle ? this.overlayTilesBasic : this.overlayTilesEnhanced;
- sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
- sceneRenderer.renderToCubeMap(T[panoSize], renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace, THREE.NormalBlending, !0, 0.5);
- } else {
- sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
- }
- }
- done();
- } else if (ignore) {
- //console.log('finish because anyUploaded',id,panoSize,tileIndex)
- done(); //改: 如果因为这部分更高清的贴图已加载所以才不绘制的话,直接完成
- } else {
- /* console.log('uploadTile 失败', id, panoSize, tileIndex)
- if(panoSize == 512){
- console.log("!!!!!!!!!!!!!")
- } */
- failHistory[id + ':' + panoSize + ':' + tileIndex] = true;
- this.setUploaded(info, !1);
- }
- info.uploadAttempted || (LodDescripor.uploadAttempts++, this.emit(PanoRendererEvents.TileUploadAttempted, id, panoSize, tileIndex, totalTiles)), info.uploadAttempted = !0;
- LodDescripor.uploadAttempts === totalTiles && this.emit(PanoRendererEvents.UploadAttemptedForAllTiles, id, panoSize, totalTiles);
- return g;
- };
- }();
- _this.tileDirectory = {};
- _this.activeRenderTargetDescriptors = {};
- _this.activePanos = [];
- _this.panoLODDescriptors = {};
- _this.panoDescriptors = {};
- _this.tileTrees = {};
- _this.forceQueue = [];
- _this.uploadQueues = {};
- _this.uploadInterval = null;
- _this.uploadIntervalCancelled = !1;
- _this.usingTileOverlay = !1;
- _this.overlayTilesLoaded = !1;
- _this.overlayTileBase = null;
- _this.overlayTilesBasic = {};
- _this.overlayTilesEnhanced = {};
- _this.zoomRenderTarget = null; //用于缩放的rendertarget
- _this.zoomPano = null;
- _this.zoomingActive = !1;
- _this.zoomPanoId = null;
- _this.zoomPanoRenderingDisabled = !1;
- _this.direction = new THREE.Vector3();
- _this.initTime = -1;
- _this.maxBaseUploadsPerFrame = x$2;
- _this.maxNonBaseUploadsPerFrame = T$1;
- _this.M = []; //move M to here 似乎列表里会有两个
- _this.index = index || 0; //改
- return _this;
- }
- _createClass(PanoRenderer, [{
- key: "init",
- value: function init(e, t, i) {
- if (this.index == 1) {
- this.sceneRenderer2 = e;
- this.tileDownloader2 = t;
- }
- this.initTime = performance.now();
- this.bindEvents();
- }
- }, {
- key: "getActivePanoTextures",
- value: function getActivePanoTextures(e) {
- e = e || [];
- for (var t = 0; t < M.length; t++) {
- var i = M[t];
- i.renderTarget && i.renderTarget.texture && e.push(i.renderTarget.texture);
- }
- }
- }, {
- key: "hasQueuedTiles",
- value: function hasQueuedTiles() {
- var e = this.peekNextFromUploadQueue();
- return null !== e && void 0 !== e;
- }
- }, {
- key: "getActiveRenderTargetDescriptor",
- value: function getActiveRenderTargetDescriptor(e) {
- return this.activeRenderTargetDescriptors[e];
- }
- }, {
- key: "setActiveRenderTargetDescriptor",
- value: function setActiveRenderTargetDescriptor(e, t) {
- this.activeRenderTargetDescriptors[e] = t;
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- this.index == 1 ? this.tileDownloader2.on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this)) : this.$app.core.get('TileDownloader').on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this));
- }
- }, {
- key: "setupZoomRenderTarget",
- value: function setupZoomRenderTarget() {
- var QualityManager = this.$app.core.get('QualityManager');
- if (QualityManager.maxRenderTargetSize == 2048 && QualityManager.getMaxNavPanoSize() == 2048) return; //不使用zoomTarget 直接用pano的tiledPanoRenderTarget,防崩溃
- //if (QualityManager.getMaxZoomPanoSize() >= QualityManager.getMaxNavPanoSize() && (QualityManager.tileClass != '2k' || QualityManager.tileClass != '1k')) {
- if (QualityManager.tileClass > QualityManager.navTileClass) {
- //如果tileClass=='4k'即使还没加载出4k也先创建2k的Target
- //部分手机2k时copyCubeMap会重载 , 所以如果没有超出当前分辨率,就不使用zoomRenderTarget。但在微信依旧会重载,只是优化了些,safari几乎不会。
- var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
- if (this.zoomRenderTarget && this.zoomRenderTarget.width === QualityManager.getMaxZoomPanoSize()) return;
- var e = this.zoomRenderTarget;
- var size = QualityManager.getMaxZoomPanoSize();
- if (size > QualityManager.maxRenderTargetSize) {
- return;
- }
- this.zoomRenderTarget = this.initTiledPano(QualityManager.getMaxZoomPanoSize(), !1);
- if (e) {
- //将旧的zoomRenderTarget渲染到新zoomRenderTarget上
- var t = e.width,
- i = this.zoomRenderTarget.width;
- sceneRenderer.copyCubeMap(e.texture, this.zoomRenderTarget, t, t, i, i);
- e.texture.dispose();
- e.texture.loaded = !1;
- e.texture.version = 0;
- sceneRenderer.deallocateCubeTexture(e.texture);
- e.texture = null;
- }
- this.zoomPanoRenderingDisabled = !1;
- } else this.zoomPanoRenderingDisabled = !0;
- }
- }, {
- key: "enableHighQuality",
- value: function enableHighQuality(e) {
- //xzw add 如果最多只要2k图的话enableUltraHighQualityMode替换成这个
- if (!this.$app.core.get('QualityManager').highQualityModeStarted) {
- this.setupZoomRenderTarget();
- e();
- this.$app.core.get('QualityManager').highQualityModeStarted = true;
- }
- }
- }, {
- key: "enableUltraHighQualityMode",
- value: function enableUltraHighQualityMode(e) {
- var QualityManager = this.$app.core.get('QualityManager');
- if (QualityManager.tileClass == '2k' || QualityManager.tileClass == '1k') return this.enableHighQuality(e); //xzw add
- if (!QualityManager.ultraHighQualityModeEnabled()) {
- var t = QualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
- this.$app.core.get('TileDownloader').testDownload(t, this.tileClass == '6k' ? TileUtils.TILE_SIZE * 1.5 : TileUtils.TILE_SIZE, //改
- function (t) {
- if (t) {
- this.$app.core.get('QualityManager').enableUltraHighQualityMode();
- this.setupZoomRenderTarget();
- e();
- }
- }.bind(this));
- }
- }
- }, {
- key: "activateTiledPano",
- value: function activateTiledPano(pano, size, i, dontReSetTree) {
- i && this.clearAllQueuedUploads();
- if (!dontReSetTree) {
- //重新initTileTree会重新uploadTile
- for (var n = 0; n < TileUtils.FACES_PER_PANO; n++) {
- this.initTileTree(pano.id, n, this.$app.core.get('QualityManager').getMaxPossiblePanoSize());
- } //得到this.tileTrees[pano.id],arr[6]
- this.linkAllTilesAndNodes(pano);
- }
- var r = this.getActiveRenderTargetDescriptor(pano.id),
- l = size;
- l > this.$app.core.get('QualityManager').getMaxNavPanoSize() && (l = this.$app.core.get('QualityManager').getMaxNavPanoSize());
- if (!r || l !== r.size) {
- r && this.deactiveDescripor(r.renderTarget);
- r = this.activeDescripor(l);
- if (!r) {
- //console.log('创建cubeRenderTarget', size)
- //var ren = this.initTiledPano(l, !this.$app.config.mobile /* !1 */) //xzw 但是有发现某个win7 ram4G的电脑会因抗锯齿在封面加载多3秒以上的时间。
- var ren = this.initTiledPano(l, false);
- r = this.initDescriptor(ren.width);
- r.renderTarget = ren;
- }
- r.pano = pano;
- this.resetPanoDescriptor(pano.id);
- if (!dontReSetTree) {
- this.resetPanoLODDescriptors(pano.id);
- this.resetRenderStatus(pano.id, !0, !0);
- }
- }
- this.setActiveRenderTargetDescriptor(pano.id, r);
- var h = i ? 0 : 1;
- this.updateActivePanos(pano, h); //console.log(`index:${this.viewer.index} ${r.renderTarget.texture.id} ${pano.id}`)
- return r.renderTarget;
- }
- }, {
- key: "deactivateTiledPano",
- value: function deactivateTiledPano(e) {
- var t = this.getActiveRenderTargetDescriptor(e.id);
- if (this.isRenderTargetDescriptorValid(t)) {
- this.deactiveDescripor(t.renderTarget);
- this.setActiveRenderTargetDescriptor(e.id, null);
- }
- var i = this.getUploadQueueForPano(e.id);
- this.clearUploadQueue(i);
- this.updateActivePanos();
- }
- }, {
- key: "getActivePanoCount",
- value: function getActivePanoCount() {
- return this.activePanos.length;
- }
- }, {
- key: "resetRenderStatus",
- value: function resetRenderStatus(e, t, i, n) {
- var r = null;
- n && (r = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, n) + 1);
- for (var o = function o(e, n, r, _o) {
- i && (n.tile.zoomUploaded = !1), t && (n.tile.uploaded = !1);
- }, a = 0; a < TileUtils.FACES_PER_PANO; a++) {
- var s = this.getTileTree(e, a);
- s.breadthFirst({
- callback: o.bind(this, a),
- minLevel: r
- });
- }
- }
- }, {
- key: "copyBaseRenderStatusToZoomed",
- value: function copyBaseRenderStatusToZoomed(e) {
- for (var t = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, this.$app.core.get('QualityManager').getMaxNavPanoSize()), i = function i(e, t, _i, n) {
- t.tile.zoomUploaded = t.tile.uploaded, t.zoomCovered = t.covered; //标记
- }, n = 0; n < TileUtils.FACES_PER_PANO; n++) {
- var r = this.getTileTree(e, n);
- r.breadthFirst({
- callback: i.bind(this, n),
- maxLevel: t
- });
- }
- }
- }, {
- key: "isRenderTargetDescriptorValid",
- value: function isRenderTargetDescriptorValid(e) {
- return e && e.renderTarget;
- }
- }, {
- key: "isPanoActive",
- value: function isPanoActive(e) {
- var t = this.getActiveRenderTargetDescriptor(e);
- return this.isRenderTargetDescriptorValid(t);
- }
- }, {
- key: "isPanoZoomed",
- value: function isPanoZoomed(e) {
- return this.zoomingActive && this.zoomPanoId === e;
- }
- }, {
- key: "initTileTree",
- value: function initTileTree(e, t, i) {
- var n = this.tileTrees[e];
- n || (n = [], this.tileTrees[e] = n);
- var r = n[t];
- if (!r) {
- var o = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, i);
- r = new TileTree(TileUtils.TILE_SIZE, o), n[t] = r;
- }
- }
- }, {
- key: "getTileTree",
- value: function getTileTree(e, t) {
- var i = this.tileTrees[e];
- if (!i) console.error('PanoRenderer.getTileTree() -> Tree array not yet initialized!');
- var n = i[t];
- if (!n) console.error('PanoRenderer.getTileTree() -> Tree not yet initialized!');
- return n;
- }
- /*
- * 创建tile的renderTarget, 包括pano.tiledPanoRenderTarget和zoomRenderTarget
- * @param {number} size 当前的panoSize,每个面的分辨率
- */
- }, {
- key: "initTiledPano",
- value: function initTiledPano(size, antialias) {
- //创建 RenderTargetCube
- var renderTarget = new THREE.WebGLCubeRenderTarget(size, {
- stencilBuffer: !1,
- //xzw add antialias , 手机可false
- generateMipmaps: antialias,
- minFilter: antialias ? THREE.LinearMipMapLinearFilter : THREE.LinearFilter
- }); //antialias: 如果抗锯齿的话,采用mipmap,会增加一倍的存储消耗。原版本都是不抗锯齿的。但是抗锯齿效果更柔和
- //console.log('initTiledPano', size, antialias)
- return renderTarget;
- }
- }, {
- key: "getUploadQueueForPano",
- value: function getUploadQueueForPano(e) {
- var t = this.uploadQueues[e];
- if (!t) t = [], this.uploadQueues[e] = t;
- return t; //return t || ((t = []), (this.uploadQueues[e] = t)), t
- }
- }, {
- key: "isTileUploaded",
- value: function isTileUploaded(e) {
- return this.isPanoZoomed(e.panoId) ? e.zoomUploaded : e.uploaded;
- }
- }, {
- key: "setUploaded",
- value: function setUploaded(e, t) {
- this.isPanoZoomed(e.panoId) ? e.zoomUploaded = t : e.uploaded = t; //console.log('setUploaded', e.panoId,e.tileIndex, e.uploaded, t )
- }
- }, {
- key: "queueTileUpload",
- value: function queueTileUpload(e, t, i) {
- var n = this.getActiveRenderTargetDescriptor(e.panoId);
- if (this.isRenderTargetDescriptorValid(n) && e.downloaded && !this.isTileUploaded(e) && (!e.uploadQueued || i) && (!(e.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive)) {
- var r = this.getUploadQueueForPano(e.panoId);
- 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));
- }
- }
- }, {
- key: "shoulPushToFrontOfQueue",
- value: function shoulPushToFrontOfQueue(e) {
- return 0 === TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize);
- }
- }, {
- key: "getTopUploadQueue",
- value: function getTopUploadQueue() {
- for (var e = null, t = null, i = S.Base; i <= S.Remaining; i++) {
- for (var n = 0; n < this.activePanos.length; n++) {
- e = this.activePanos[n];
- t = this.getUploadQueueForPano(e.id);
- if (t.length > 0) {
- switch (i) {
- case S.Base:
- if (0 === t[0].level) return t;
- break;
- case S.Remaining:
- return t;
- }
- }
- }
- }
- return null;
- }
- }, {
- key: "peekNextFromUploadQueue",
- value: function peekNextFromUploadQueue() {
- //获取第一项
- if (this.forceQueue.length > 0) return this.forceQueue[0];
- var e = this.getTopUploadQueue();
- return e && e.length > 0 ? e[0] : null;
- }
- }, {
- key: "clearAllQueuedUploads",
- value: function clearAllQueuedUploads() {
- this.clearAllUploadQueues(null, 0);
- }
- }, {
- key: "clearAllQueuedUploadsForPano",
- value: function clearAllQueuedUploadsForPano(e) {
- this.clearAllUploadQueues(e, 0);
- }
- }, {
- key: "clearAllUploadQueues",
- value: function clearAllUploadQueues(e, t) {
- if (e) this.clearUploadQueue(this.getUploadQueueForPano(e), t), this.clearUploadQueue(this.forceQueue, t, e);else {
- for (var i = 0; i < this.activePanos.length; i++) {
- var n = this.activePanos[i];
- this.clearUploadQueue(this.getUploadQueueForPano(n.id), t);
- }
- this.clearUploadQueue(this.forceQueue, t);
- }
- }
- /* clearUploadQueue(e, t, i) {
- ;(void 0 !== t && null !== t) || (t = 0)
- for (var n = 0; n < e.length; ) {
- var r = e[n]
- ;(!i || (i && i === r.tile.panoId)) && r.level >= t ? ((r.uploadQueued = !1), e.splice(n, 1)) : n++
- }
- } */
- }, {
- key: "clearUploadQueue",
- value: function clearUploadQueue(e, t, i) {
- void 0 !== t && null !== t || (t = 0);
- for (var n = 0; n < e.length;) {
- var r = e[n];
- (!i || i && i === r.panoId) && r.level >= t ? (r.uploadQueued = !1, //(!i || i && i === r.tile.panoId) && r.level >= t ? (r.uploadQueued = !1, //上传下载页面刚上传后刷新会报错。原因未知。
- e.splice(n, 1)) : n++;
- }
- }
- }, {
- key: "updateUploadQueue",
- value: function updateUploadQueue(e, t, maxCount) {
- for (var i = 0, n = 0, sum = 0;;) {
- /* var r = this.peekNextFromUploadQueue()
- if (!r) break
- if ((n >= t || i >= e || sum >= maxCount) && !(r.level == 0 && sum == 0) ) break
- */
- if (n >= t || i >= e || sum >= maxCount) break;
- var r = this.getNextFromUploadQueue(); //获取并从列表中删除, 和前面的r一样的
- if (!r) break;
- 0 !== r.level ? i++ : n++; //if(0 == r.level)console.log('0000000', sum, maxCount)
- sum++;
- if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
- var o = this.getActiveRenderTargetDescriptor(r.panoId);
- this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload);
- }
- }
- }
- /* updateUploadQueue(e, t) {
- //e || (e = 1) //啊啊啊啊啊
- for (var i = 0, n = 0; ; ) {
- if (n >= t || i >= e) break
- var r = this.getNextFromUploadQueue()
- if (!r) break
- 0 !== r.level ? i++ : n++
- if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
- var o = this.getActiveRenderTargetDescriptor(r.panoId)
- this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload)
- }
- }
- } */
- }, {
- key: "updateDirection",
- value: function updateDirection(e) {
- if (e = e || this.direction) {
- this.direction = e;
- for (var t = 0; t < this.activePanos.length; t++) {
- var i = this.activePanos[t],
- n = this.getUploadQueueForPano(i.id);
- TilePrioritizer.sortPanoTiles(n, i, this.direction);
- }
- }
- }
- }, {
- key: "linkTileAndNode",
- value: function linkTileAndNode(e, t) {
- t.tile = e, e.node = t;
- }
- }, {
- key: "linkAllTilesAndNodes",
- value: function linkAllTilesAndNodes(e) {
- var t = function t(_t, i, n, r, o) {
- var a = this.getTileDirectoryEntry(e.id, i, r, o);
- this.linkTileAndNode(a, n);
- };
- for (var i = 0; i < TileUtils.FACES_PER_PANO; i++) {
- var n = this.getTileTree(e.id, i);
- n.breadthFirst({
- callback: t.bind(this, n, i)
- });
- }
- }
- }, {
- key: "anyUploaded",
- value: function anyUploaded(e) {
- if (!e) return !1;
- if (e.tile && this.isTileUploaded(e.tile)) return !0;
- if (e.children) for (var t = 0; t < e.children.length; t++) {
- var i = e.children[t];
- if (this.anyUploaded(i)) return !0;
- }
- return !1;
- }
- }, {
- key: "setNodeCovered",
- value: function setNodeCovered(e, t) {
- this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered = t : e.covered = t;
- }
- }, {
- key: "isNodeCovered",
- value: function isNodeCovered(e) {
- return !!e && (this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered : e.covered);
- }
- }, {
- key: "addCoverageForNode",
- value: function addCoverageForNode(e) {
- if (this.setNodeCovered(e, !0), e.parent && e.covered) {
- var t = e.parent;
- this.nodeSubcovered(t) && this.addCoverageForNode(t, !0);
- }
- }
- }, {
- key: "calcFullCoverage",
- value: function calcFullCoverage(e) {
- var t = !1;
- if (e.children) for (var i = 0; i < e.children.length; i++) {
- var n = e.children[i];
- t = t || this.calcFullCoverage(n);
- }
- e.covered = e.tile.uploaded || t;
- }
- }, {
- key: "nodeSubcovered",
- value: function nodeSubcovered(e) {
- if (!e.children) return !1;
- for (var t = 0; t < e.children.length; t++) {
- if (!e.children[t] || !this.isNodeCovered(e.children[t])) return !1;
- }
- return !0;
- }
- }, {
- key: "resetPanoDescriptor",
- value: function resetPanoDescriptor(e) {
- this.getPanoDescriptor(e);
- }
- }, {
- key: "getPanoDescriptor",
- value: function getPanoDescriptor(e) {
- var t = this.panoDescriptors[e];
- return t || (t = {}, this.panoDescriptors[e] = t), t;
- }
- }, {
- key: "resetPanoLODDescriptors",
- value: function resetPanoLODDescriptors(e) {
- var t = this.getPanoLODDescriptors(e);
- for (var i in t) {
- if (t.hasOwnProperty(i)) {
- var n = t[i];
- n.uploadCount = 0, n.uploadAttempts = 0;
- n.uploaded = [];
- }
- }
- }
- }, {
- key: "getPanoLODDescriptor",
- value: function getPanoLODDescriptor(e, t) {
- var i = this.getPanoLODDescriptors(e),
- n = i[t];
- return n || (n = {
- uploadCount: 0,
- uploadAttempts: 0,
- uploaded: [] //add
- }, i[t] = n), n;
- }
- }, {
- key: "getPanoLODDescriptors",
- value: function getPanoLODDescriptors(e) {
- var t = this.panoLODDescriptors[e];
- return t || (t = {}, this.panoLODDescriptors[e] = t), t;
- }
- }, {
- key: "onTileDownloaded",
- value: function onTileDownloaded(e) {
- var t = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize),
- i = this.getTileDirectoryEntry(e.panoId, e.face, t, e.faceTileIndex);
- i.downloaded = !0;
- i.image = e.image;
- i.panoSize = e.panoSize;
- i.tileX = e.tileX;
- i.tileY = e.tileY;
- i.totalTiles = e.totalTiles;
- i.tileIndex = e.tileIndex;
- i.faceTileIndex = e.faceTileIndex;
- i.face = e.face;
- i.cubeFace = panorama.mapFaceToCubemapFace(e.face);
- i.panoId = e.panoId;
- i.tileSize = e.tileSize;
- i.direction = new THREE.Vector3().copy(e.direction);
- i.node = null;
- i.level = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, i.panoSize);
- if (this.isPanoActive(i.panoId)) {
- var n = this.getTileTree(i.panoId, i.face);
- var r = n.getSubNode(i.panoSize, i.tileX, i.tileY);
- this.linkTileAndNode(i, r);
- this.queueTileUpload(i, !0);
- }
- }
- }, {
- key: "getTileDirectoryEntry",
- value: function getTileDirectoryEntry(panoId, t, i, n) {
- var r = this.tileDirectory[panoId];
- r || (r = {}, this.tileDirectory[panoId] = r);
- var o = 16384 * t + 1024 * i + n,
- //t:4096级别
- a = r[o];
- return a || (a = {
- downloaded: !1,
- uploaded: !1,
- zoomUploaded: !1
- }, r[o] = a), a._key = panoId + ':' + t + ':' + i + ':' + n, a._tileKey = o, a;
- }
- }, {
- key: "setZoomingActive",
- value: function setZoomingActive(active, pano, i) {
- //设置当前正在zoom的pano
- 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));
- }
- }, {
- key: "updateZoomedPanoFromBase",
- value: function updateZoomedPanoFromBase(pano) {
- //因更换pano所以将pano的rendertarget渲染到panoRenderer的zoomRenderTarget上
- if (!this.zoomPanoRenderingDisabled) {
- var QualityManager = this.$app.core.get('QualityManager');
- var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
- var t = this.getActiveRenderTargetDescriptor(pano.id);
- if (t && t.renderTarget) {
- if (this.zoomRenderTarget) {
- var i = Math.min(QualityManager.maxRenderTargetSize, QualityManager.getMaxZoomPanoSize()),
- //change
- n = t.renderTarget,
- r = t.size;
- sceneRenderer.copyCubeMap(n.texture, this.zoomRenderTarget, r, r, i, i);
- }
- this.copyBaseRenderStatusToZoomed(pano.id);
- }
- }
- } //xzw add 转换pano加载的tile的质量。 为了降低总的renderTarget的size, 尤其手机的2048cube个数只能存在一个
- }, {
- key: "switchPanoQuality",
- value: function switchPanoQuality(pano, _ref) {
- var useIdel = _ref.useIdel,
- size = _ref.size;
- if (useIdel) {
- var rt;
- if (size) rt = this.activeDescripor(size, true); //使用空闲的,优先使用此size的
- if (!rt) rt = this.activeDescripor(null, true); //任何size都可以
- if (rt) {
- size = rt.size;
- }
- }
- pano.updateTileQuality(size);
- if (!pano.tiledPanoRenderTarget) return;
- var oldSize = pano.tiledPanoRenderTarget.width;
- if (size != oldSize) {
- //console.log('switchPanoQuality', pano.id, oldSize, size)
- this.deactiveDescripor(this.tiledPanoRenderTarget);
- var newTarget = this.activateTiledPano(pano, size, false, true); //第三个参数决定是否clearAllQueuedUploads, clear的话会造成tiles加载不全
- this.$app.core.get('SceneRenderer').copyCubeMap(pano.tiledPanoRenderTarget.texture, newTarget, oldSize, oldSize, size, size); //这一句后台耗时高
- pano.tiledPanoRenderTarget = newTarget;
- this.renderPanoTiles(pano.id, null, null, null, size
- /* , dir, a */
- );
- pano.updateSkyboxForZoomLevel(); //材质更新
- }
- }
- /* 注意 由于copyCubeMap耗时大,所以不能在无缝过渡中执行。 综合考虑下最佳组合:
- pc:2048两个, 1024一个
- mobile:2048一个, 1024两个 (lowTile为level2时多一个512)
- 其中无缝过渡时在中途加载的首选1024(除非1024用完了),直到无缝过渡结束后才会提升。
-
- */
- }, {
- key: "add",
- value: function add(e) {
- this.M.push(e);
- }
- }, {
- key: "initDescriptor",
- value: function initDescriptor(size) {
- var t = createDescriptor();
- t.inUse = !0;
- t.size = size;
- this.add(t);
- return t;
- }
- }, {
- key: "activeDescripor",
- value: function activeDescripor(e, onlyCheck) {
- for (var t = 0; t < this.M.length; t++) {
- var i = this.M[t];
- if (!i.inUse && (!e || i.size === e)) {
- //xzw改
- if (!onlyCheck) i.inUse = !0; //console.log('activeDescripor', onlyCheck, this.M.map(e=>e.inUse))
- return i;
- }
- }
- return null;
- }
- }, {
- key: "deactiveDescripor",
- value: function deactiveDescripor(e) {
- for (var t = 0; t < this.M.length; t++) {
- var i = this.M[t];
- if (i.renderTarget === e) {
- i.inUse = !1; //console.log('deactiveDescripor', this.M.map(e=>e.inUse))
- return !0;
- }
- }
- return !1;
- } //xzw add: 飞出后dispose所有cubeRenderTarget,避免因模型贴图较多而造成的崩溃
- }, {
- key: "disposeIdelTargets",
- value: function disposeIdelTargets() {
- for (var t = 0; t < this.M.length; t++) {
- var i = this.M[t];
- if (!i.inUse) {
- i.renderTarget.dispose();
- }
- } //console.log('disposeIdelTargets ', disposeCount, 'of', this.M.length)
- }
- }]);
- return PanoRenderer;
- }(EventEmitter);
- });
- var PanoVideoRendererEvents = {
- ParamsUpdated: 'panorama.videorenderer.paramsupdated',
- SuspendRender: 'panorama.videorenderer.suspendrender',
- ResumeRender: 'panorama.videorenderer.resumerender',
- TextureUpdate: 'panorama.videorenderer.textured',
- CanPlayVideo: 'panorama.videorenderer.canplayvideo',
- StartPlayVideo: 'panorama.videorenderer.startvideo'
- };
- 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); }; }
- 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; } }
- defineComponent('ModelManager', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(ModelManager, _EventEmitter);
- var _super = _createSuper$14(ModelManager);
- function ModelManager() {
- var _this;
- _classCallCheck(this, ModelManager);
- _this = _super.call(this);
- _this.modelMap = {};
- _this.activeModel = null;
- _this.modelCount = 0;
- return _this;
- }
- _createClass(ModelManager, [{
- key: "init",
- value: function init() {
- this.bindEvents();
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- this.$app.core.get('PanoRenderer').on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onSuspendVideoRender.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onResumeVideoRender.bind(this));
- }
- }, {
- key: "onTileRendered",
- value: function onTileRendered(e, t, i, n) {}
- }, {
- key: "onVideoTextureUpdate",
- value: function onVideoTextureUpdate(texture) {
- this.activeModel && this.activeModel.updateVideoTexture(texture);
- }
- }, {
- key: "onSuspendVideoRender",
- value: function onSuspendVideoRender() {
- this.activeModel && this.activeModel.suspendVideoRender();
- }
- }, {
- key: "onResumeVideoRender",
- value: function onResumeVideoRender() {
- this.activeModel && this.activeModel.resumeVideoRender();
- }
- }, {
- key: "addModel",
- value: function addModel(model) {
- this.modelMap[model.sid] = model;
- 0 === this.modelCount && this.activateModel(model.sid);
- this.modelCount++;
- this.emit(ModelManagerEvents.ModelAdded);
- }
- }, {
- key: "activateModel",
- value: function activateModel(projectNum) {
- var model = this.modelMap[projectNum];
- if (!model) {
- throw new BasicException('Tried to activate invalid model!');
- }
- var oldModel = this.activeModel;
- this.activeModel = model, this.$app.core.get('TileDownloader').setPanoData(model.panos, []
- /* model.listImagePanos() */
- , model.sid), this.$app.core.get('TileDownloader').setUrls(model.urls), model.panos.forEach(function (e) {
- 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');
- }.bind(this)), this.emit(ModelManagerEvents.ActiveModelChanged, {
- oldModel: oldModel,
- model: model
- });
- }
- }, {
- key: "getActiveModel",
- value: function getActiveModel() {
- return this.activeModel;
- }
- }]);
- return ModelManager;
- }(EventEmitter);
- });
- 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); }; }
- 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; } }
- var PanoramaCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
- _inherits(PanoramaCamera, _THREE$PerspectiveCam);
- var _super = _createSuper$13(PanoramaCamera);
- function PanoramaCamera(dom) {
- var _this;
- _classCallCheck(this, PanoramaCamera);
- _this = _super.call(this, cameraLight.clampVFOV(settings$3.insideFOV), window.innerWidth / window.innerHeight, settings$3.insideNear, settings$3.insideFar);
- _this.controls = null;
- return _this;
- }
- _createClass(PanoramaCamera, [{
- key: "updateAspect",
- value: function updateAspect(aspect) {
- this.aspect = aspect;
- this.updateProjectionMatrix();
- }
- }]);
- return PanoramaCamera;
- }(THREE.PerspectiveCamera);
- 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); }; }
- 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; } }
- var DollhouseCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
- _inherits(DollhouseCamera, _THREE$PerspectiveCam);
- var _super = _createSuper$12(DollhouseCamera);
- function DollhouseCamera(dom) {
- var _this;
- _classCallCheck(this, DollhouseCamera);
- _this = _super.call(this, cameraLight.clampVFOV(constants$4.dollhouseFOV), window.innerWidth / window.innerHeight, constants$4.dollhouseNear, constants$4.dollhouseFar);
- _this.controls = null;
- return _this;
- }
- _createClass(DollhouseCamera, [{
- key: "updateAspect",
- value: function updateAspect(aspect) {
- if (isNaN(aspect)) aspect = 1; //xzw add
- this.aspect = aspect;
- this.controls.updateDistance(aspect);
- this.updateProjectionMatrix();
- }
- /* updateFov() {
- //add
- if (this.aspect < this.suitModelAspect) {
- //屏宽缩小时,不变hFov, 改变vHov
- this.fov = cameraLight.getVFOVFromHFOV(this.suitModelAspectHFov, this.aspect, 1)
- } else this.fov = constants.dollhouseFOV
- } */
- }]);
- return DollhouseCamera;
- }(THREE.PerspectiveCamera);
- 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); }; }
- 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; } }
- var PanoramaControls = /*#__PURE__*/function (_EventEmitter) {
- _inherits(PanoramaControls, _EventEmitter);
- var _super = _createSuper$11(PanoramaControls);
- function PanoramaControls(camera, dom, player) {
- var _this;
- _classCallCheck(this, PanoramaControls);
- _this = _super.call(this);
- _this.camera = camera; //被控制的相机
- _this.camera.controls = _assertThisInitialized(_this);
- _this.player = player;
- _this.config = player.$app.config;
- _this.dom = dom;
- _this.target = new THREE.Vector3(0, 0, 0); //相机视点,鼠标交互主要影响的对象
- _this.lookVector = new THREE.Vector3(); //相机方向,以单位向量表示
- _this.lookSpeed = 0.05; //没发现下文用到???
- _this.rotationAcc = new THREE.Vector2(); //旋转角加速度
- _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
- _this.speed = 1; // 相机拖拽旋转速度
- /**
- * 球坐标系的相关参数lat,lon 与 phi,theta 两种表示形式
- * 注:少了半径参数,因为是用于约束相机的方向,半径长短在此没有意义,单位1即可,体现在方向向量lookVector上
- */
- _this.lat = 0; //纬度,角度表示,直观
- _this.lon = 0; //经度,角度表示,直观
- _this.phi = 0; //phi,标准球坐标系的参数,弧度表示,用于进行直接计算
- _this.theta = 0; //theta,标准球坐标系的参数,弧度表示,用于进行直接计算
- _this.enabled = !1; //是否启用
- _this.locked = !1; //是否锁定
- /**
- * 交互行为相关,有鼠标点击与触摸,点击或触摸的地方在此约定统称为交互点
- */
- _this.pointer = new THREE.Vector2(0, 0); //交互点的屏幕坐标,有别于DOM坐标,在此存放NDC坐标。(NDC,三维常用坐标系,二维坐标,整个屏幕映射范围(-1,1),屏幕中心为原点,+Y朝上,+X朝右)
- _this.pointersLimit = 2; //触摸事件的触摸点的限制个数
- _this.pointers = []; //存储交互点的坐标
- _this.rotationDifference = new THREE.Vector2(); //记录帧之间的要进行的旋转量
- _this.rotationHistory = []; //记录一次拖拽过程中每帧产生的rotationDifference,用于拖拽完成后计算平均值进而得到惯性角速度
- _this.pointerDragOn = !1; //拖拽的标记,用于处理各种交互行为下的冲突问题
- _this.pointerDragStart = new THREE.Vector2(0, 0); //拖拽开始位置,也作为两帧之间前一帧的坐标位置
- _this.pinchDistance = 0; //触控下,“捏合”交互下,两触摸点的距离
- _this.moveStart = new THREE.Vector2(); //交互点移动行为开始的最表
- _this.moveTolerance = 0.01; //产生拖拽行为的鼠标移动最小阈值,用于解决点击,和其他行为的误触操作
- _this.limitAngleIsBound = true; // 配置俯仰角
- if (_this.config.camera && _this.config.camera.lookLimitUp != null && _this.config.camera.lookLimitDown != null) {
- _this.limitAngleIsBound = false;
- _this.insideLookLimitUp = _this.config.camera.lookLimitUp;
- _this.insideLookLimitDown = _this.config.camera.lookLimitDown;
- }
- return _this;
- }
- /**
- * 启用状态
- */
- _createClass(PanoramaControls, [{
- key: "usable",
- value: function usable() {
- return this.enabled && !this.locked;
- }
- /**
- * 根据新的方向向量计算所指向的球面坐标(lat,lon),用到了笛卡尔坐标系转球面坐标系的数学方法
- * 注:THREE 的 Vector3 与 Spherical 两个数学类有互转的方法
- * @param {THREE.Vector3} aim 目标点
- */
- }, {
- key: "lookAt",
- value: function lookAt(aim, dir) {
- var t = dir || this.camera.position.clone().sub(aim); //aim所指相反点的笛卡尔坐标系
- /**
- * 以下全为笛卡尔坐标->球座标,不多赘述
- */
- var i = Math.atan(t.z / t.x);
- i += t.x < 0 ? Math.PI : 0;
- i += t.x > 0 && t.z < 0 ? 2 * Math.PI : 0;
- this.lon = THREE.MathUtils.radToDeg(i) + 180;
- var n = Math.sqrt(t.x * t.x + t.z * t.z),
- o = Math.atan(t.y / n);
- this.lat = -THREE.MathUtils.radToDeg(o);
- }
- /**
- * 记录一次拖拽旋转开始时的一些状态
- * @param {number} clientX 屏幕坐标
- * @param {number} clientY 屏幕坐标
- */
- }, {
- key: "startRotationFrom",
- value: function startRotationFrom(clientX, clientY) {
- //以屏幕中心为原点,得到pointer在屏幕的百分比
- var mouse = math$2.handelPadding(clientX, clientY, this.dom);
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
- this.pointerDragOn = !0;
- this.pointerDragStart.copy(this.pointer);
- this.moveStart.copy(this.pointer);
- this.rotationHistory = [];
- this.rotationSpeed.set(0, 0);
- }
- }, {
- key: "onMouseOver",
- value: function onMouseOver(mouseEvent) {
- !this.pointerDragOn || 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
- }
- }, {
- key: "onTouchStart",
- value: function onTouchStart(pointerEvent) {
- if (this.usable()) {
- pointerEvent.preventDefault();
- pointerEvent.stopPropagation();
- switch (pointerEvent.touches.length) {
- case 1:
- this.startRotationFrom(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY);
- break;
- case 2:
- var t = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
- i = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight;
- this.pinchDistance = Math.sqrt(t * t + i * i);
- }
- this.emit(ControlEvents.InputStart, 'touch');
- }
- }
- }, {
- key: "onPointerDown",
- value: function onPointerDown(pointerEvent) {
- if (this.usable() && 'touch' === pointerEvent.pointerType) {
- if (this.pointers.length < this.pointersLimit) {
- this.pointers.push({
- id: pointerEvent.pointerId,
- clientX: pointerEvent.clientX,
- clientY: pointerEvent.clientY
- });
- }
- pointerEvent.touches = this.pointers;
- this.onTouchStart(pointerEvent);
- this.emit(ControlEvents.InputStart, 'pointer');
- }
- }
- }, {
- key: "onMouseDown",
- value: function onMouseDown(mouseEvent) {
- if (this.usable()) {
- mouseEvent.preventDefault();
- mouseEvent.stopPropagation();
- switch (mouseEvent.button) {
- case MouseButton.LEFT:
- this.startRotationFrom(mouseEvent.clientX, mouseEvent.clientY);
- }
- this.emit(ControlEvents.InputStart, 'mouse');
- }
- }
- /**
- * 根据两帧交互点坐标之间的差值,计算两帧角度差值(rotationDifference)用于旋转
- * 1.将两次交互点坐标分别映射到3D空间
- * 2.通过两坐标在XY平面上投影,分别计算与X轴夹角,再求差值作为竖直方向角度差值(rotationDifference.y)
- * 3.通过两坐标在XZ平面上投影,分别计算与X轴夹角,再求差值作为水平方向角度差值(rotationDifference.x)
- */
- }, {
- key: "updateRotation",
- value: function updateRotation() {
- if (this.usable() && this.pointerDragOn) {
- this.camera.matrixWorld = new THREE.Matrix4(); //许钟文加 unproject前先把相机置于原点 (player的cameras里的panorama是不更新matrixworld的,只有player的camera才更新。 为了其他的camera加)
- //两交互点在3D空间的坐标
- var pointerDragStart3D = new THREE.Vector3(this.pointerDragStart.x, this.pointerDragStart.y, -1).unproject(this.camera),
- pointer3D = new THREE.Vector3(this.pointer.x, this.pointer.y, -1).unproject(this.camera),
- //两交互点分别到原点的长度
- pointerDragStart3DLength = Math.sqrt(pointerDragStart3D.x * pointerDragStart3D.x + pointerDragStart3D.z * pointerDragStart3D.z),
- pointer3DLength = Math.sqrt(pointer3D.x * pointer3D.x + pointer3D.z * pointer3D.z),
- //通过Math.atan2计算在XY面上与X轴的夹角弧度。
- //注:因为 z = -1,所以两者到原点的长度近似为x分量(数值的大小也不需要绝对对应)
- anglePointerDragStart3DToX = Math.atan2(pointerDragStart3D.y, pointerDragStart3DLength),
- //近似为 anglePointerDragStart3DToX = Math.atan2( pointerDragStart3D.y, pointerDragStart3D.x )
- anglePointer3DToX = Math.atan2(pointer3D.y, pointer3DLength); //近似为 anglePointer3DToX = Math.atan2( pointer3D.y, pointer3D.x )
- this.camera.updateMatrix();
- this.camera.updateMatrixWorld(); //算出两者角度差,作为竖直方向角度差值(rotationDifference.y)
- this.rotationDifference.y = THREE.MathUtils.radToDeg(anglePointerDragStart3DToX - anglePointer3DToX); //y分量清零,原向量等价于在XZ轴上的投影向量
- pointerDragStart3D.y = 0;
- pointer3D.y = 0; //归一化(/length),求两者夹角作为
- //判断方向,最后记为水平方向角度差值(rotationDifference.x)
- var anglePointerDragStart3DToPointer3D = Math.acos(pointerDragStart3D.dot(pointer3D) / pointerDragStart3D.length() / pointer3D.length()); // isNaN(s) || (this.rotationDifference.x = THREE.MathUtils.radToDeg(s),
- // this.pointerDragStart.x < this.pointer.x && (this.rotationDifference.x *= -1)),
- if (!isNaN(anglePointerDragStart3DToPointer3D)) {
- this.rotationDifference.x = THREE.MathUtils.radToDeg(anglePointerDragStart3DToPointer3D);
- if (this.pointerDragStart.x < this.pointer.x) {
- this.rotationDifference.x *= -1;
- }
- }
- this.rotationDifference.multiplyScalar(this.speed); //更新pointerDragStart记录当前帧坐标,用于下一帧求帧差值
- this.pointerDragStart.copy(this.pointer); //console.log(pointerDragStart3DLength,pointer3DLength)
- }
- }
- /**
- * 处理鼠标移动事件
- * 1.计算鼠标的NDC坐标
- * 2.判断是否是拖拽来决定拖拽行为的执行
- * 3.通过预定义的防误触偏差(moveTolerance),来防止一定的误触
- */
- }, {
- key: "onMouseMove",
- value: function onMouseMove(mouseEvent) {
- if (this.usable()) {
- var mouse = math$2.handelPadding(mouseEvent.clientX, mouseEvent.clientY, this.dom);
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
- if (this.pointerDragOn) {
- if (Math.abs(this.pointer.x - this.moveStart.x) > this.moveTolerance || Math.abs(this.pointer.y - this.moveStart.y) > this.moveTolerance) {
- this.emit(ControlEvents.Move, 'mouse');
- }
- }
- }
- }
- /**
- * 处理触摸移动事件
- * 1.单点触控记录NDC坐标
- * 2.双点触控记录两触摸点距离(映射到[0-1]范围)
- */
- }, {
- key: "onTouchMove",
- value: function onTouchMove(pointerEvent) {
- if (this.usable()) {
- this.emit(ControlEvents.Move, 'touch');
- switch (pointerEvent.touches.length) {
- case 1:
- var mouse = math$2.handelPadding(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY, this.dom);
- math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
- break;
- case 2:
- var offsetX = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
- offsetY = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight,
- n = this.pinchDistance - Math.sqrt(offsetX * offsetX + offsetY * offsetY);
- if (Math.abs(n) > 0.01) {
- this.emit(ControlEvents.InteractionDirect);
- this.emit(ControlEvents.Pinch, n);
- this.pinchDistance -= n;
- }
- }
- }
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove(pointerEvent) {
- if (this.usable() && 'touch' === pointerEvent.pointerType) {
- this.pointers.forEach(function (t) {
- if (pointerEvent.pointerId === t.id) {
- t.clientX = pointerEvent.clientX;
- t.clientY = pointerEvent.clientY;
- }
- });
- pointerEvent.touches = this.pointers;
- this.onTouchMove(pointerEvent);
- }
- }
- /**
- * 旋转终止后的行为
- * 1.通过已记录的一组帧旋转量(rotationDifference)求平均值作为停止后惯性速度参考值。
- * 2.通过设置的rotationAfterMoveMultiplier(惯性速度决定因子,用于手动指定影响惯性速度大小),来计算最后的的惯性速度
- */
- }, {
- key: "endRotation",
- value: function endRotation() {
- this.pointerDragOn = !1;
- var averageVector = common$1.averageVectors(this.rotationHistory);
- if (this.player.$app.VRScreenSYNC) {
- // 不使用惯性
- //this.rotationSpeed.set(0,0)
- this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX / 6, averageVector.y * settings$3.rotationAfterMoveMultiplierY / 6);
- } else {
- this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX, averageVector.y * settings$3.rotationAfterMoveMultiplierY);
- }
- }
- /**
- * 触摸结束触发endRotation行为
- */
- }, {
- key: "onTouchEnd",
- value: function onTouchEnd(pointerEvent) {
- if (this.usable()) {
- pointerEvent.preventDefault();
- pointerEvent.stopPropagation();
- this.endRotation();
- }
- }
- /**
- * 鼠标抬起触发endRotation行为
- */
- }, {
- key: "onMouseUp",
- value: function onMouseUp(mouseEvent) {
- if (this.usable()) {
- mouseEvent.preventDefault();
- mouseEvent.stopPropagation();
- this.endRotation();
- }
- }
- }, {
- key: "onPointerUp",
- value: function onPointerUp(pointerEvent) {
- if (this.usable() && 'touch' === pointerEvent.pointerType) {
- this.pointers.forEach(function (t, i) {
- pointerEvent.pointerId === t.id && this.pointers.splice(i, 1);
- }.bind(this));
- pointerEvent.touches = this.pointers;
- this.onTouchEnd(pointerEvent);
- }
- }
- /**
- * 主循环更新,主要通过物理上的刚体旋转行为(角位移,角速度,角加速度,摩擦等)计算得到新的相机视点target,主要是每帧瞬时的状态
- *
- * updateRotation()计算每帧对应的旋转量 rotationDifference
- *
- * 角位移:rotationDifference与原本lon,lat (等价于phi,theta)累加,得到新的角位移
- * 角速度:(rotationDifference数组的平均值 * 速度因子rotationAccelerationInside + 角加速度) - 摩擦rotationFriction。
- *
- * target坐标:新的角位移计算出新的球坐标,转换计算后的球坐标到笛卡尔坐标系
- *
- * @param { number } deltaTime 帧间隔时间。 注:关于帧间隔时间,是个有关物理计算的很重要的值,用于保持物理量与绝对时间的对应而不受帧率的的干扰,下文计算角速度用到。更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420
- */
- }, {
- key: "update",
- value: function update(deltaTime) {
- if (this.locked) return; //if(settings.vrEnabled) return;
- // 求出新的rotationDifference
- this.updateRotation(); //记录一组rotationDifference 用于求角速度 rotationSpeed。注:见 endRotation()
- for (this.rotationHistory.push(this.rotationDifference.clone()); this.rotationHistory.length > settings$3.rotationAfterMoveHistoryCount;) {
- this.rotationHistory.shift();
- } //计算角位移(交互影响下的)
- this.lon += this.rotationDifference.x;
- this.lat += this.rotationDifference.y;
- this.rotationDifference.set(0, 0); //计算角速度(实际上deltaTime增大时,角速度下降幅度也应增大)
- var friction = Math.min(1, settings$3.rotationFriction * deltaTime * 60); //如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
- this.rotationSpeed.x = this.rotationSpeed.x * (1 - friction) + this.rotationAcc.x * settings$3.rotationAccelerationInside;
- this.rotationSpeed.y = this.rotationSpeed.y * (1 - friction) + this.rotationAcc.y * settings$3.rotationAccelerationInside; //计算角位移(交互后,物理定律影响下的)
- this.lon += this.rotationSpeed.x * deltaTime;
- 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 );
- //许钟文
- if (this.limitDownAngel == null) {
- //许钟文 在手机编辑墙壁时俯视角度可以增大
- var insideLookLimitDown, insideLookLimitUp;
- insideLookLimitDown = this.insideLookLimitDown != void 0 ? this.insideLookLimitDown : settings$3.insideLookLimitDown;
- insideLookLimitUp = this.insideLookLimitUp != void 0 ? this.insideLookLimitUp : settings$3.insideLookLimitUp;
- if (this.limitAngleIsBound) {
- //根据fov调整insideLookLimitDown 以使得能看到的边界不变。此时insideLookLimitDown为边界而不是看的角度了
- insideLookLimitDown = insideLookLimitDown - settings$3.insideFOV / 2 + this.camera.fov / 2;
- insideLookLimitUp = insideLookLimitUp + settings$3.insideFOV / 2 - this.camera.fov / 2;
- }
- 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 );
- } else {
- this.lat = this.limitDownAngel; //固定垂直视角
- } //转换为标准球坐标参数形式,并最终转换为笛卡尔坐标系下
- this.phi = THREE.MathUtils.degToRad(90 - this.lat);
- this.theta = THREE.MathUtils.degToRad(this.lon);
- this.lookVector.x = Math.sin(this.phi) * Math.cos(this.theta);
- this.lookVector.y = Math.cos(this.phi);
- this.lookVector.z = Math.sin(this.phi) * Math.sin(this.theta); //求taget坐标: 当前相机位置 + 方向向量(对于此处旋转来说距离并无意义,方向向量的1即可)
- this.target.copy(this.lookVector).add(this.camera.position); //THREE的API来更新相机旋转。注:lookAt是四阶矩阵比较常见的API,因此此PanoramaControls计算流程,不算与THREE耦合
- this.camera.lookAt(this.target);
- }
- /**
- * 滚轮行为: 触发自定义事件
- */
- }, {
- key: "onMouseWheel",
- value: function onMouseWheel(wheelEvent) {
- if (this.usable()) {
- var t = wheelEvent.wheelDelta || -wheelEvent.detail;
- this.emit(ControlEvents.InteractionDirect);
- this.emit(ControlEvents.Scroll, t);
- }
- }
- /**
- * 键盘按下:触发自定义事件
- */
- }, {
- key: "onKeyDown",
- value: function onKeyDown(keyboardEvent) {
- if (!this.player.$app.config.useShortcutKeys) {
- return;
- }
- if (this.usable()) {
- if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
- keyboardEvent.preventDefault();
- this.handleKeyDown(keyboardEvent.which);
- }
- }
- }
- }, {
- key: "handleKeyDown",
- value: function handleKeyDown(keyValue) {
- var t = function (e, t) {
- this.rotationAcc[e] = t;
- }.bind(this);
- this.emit(ControlEvents.InteractionKey);
- var i = !0;
- switch (keyValue) {
- case Keys.LEFTARROW:
- case Keys.J:
- t('x', -1);
- break;
- case Keys.RIGHTARROW:
- case Keys.L:
- t('x', 1);
- break;
- case Keys.I:
- t('y', 1);
- break;
- case Keys.K:
- t('y', -1);
- break;
- default:
- i = !1;
- }
- i && this.emit(ControlEvents.Move, 'key');
- }
- }, {
- key: "onKeyUp",
- value: function onKeyUp(keyboardEvent) {
- if (this.usable()) {
- keyboardEvent.preventDefault();
- keyboardEvent.stopPropagation();
- this.handleKeyUp(keyboardEvent.which);
- }
- }
- }, {
- key: "handleKeyUp",
- value: function handleKeyUp(keyValue) {
- switch (keyValue) {
- case Keys.LEFTARROW:
- case Keys.J:
- case Keys.RIGHTARROW:
- case Keys.L:
- this.rotationAcc.x = 0;
- break;
- case Keys.I:
- case Keys.K:
- this.rotationAcc.y = 0;
- }
- }
- /**
- * 给定角加速度,使开始旋转。 注:类似给定力推
- */
- }, {
- key: "startRotating",
- value: function startRotating(e, t) {
- e && (this.rotationAcc.x = e);
- t && (this.rotationAcc.y = t);
- }
- /**
- * 通过物理定律来终止旋转
- */
- }, {
- key: "stopRotating",
- value: function stopRotating(e) {
- e && (this.rotationSpeed.x = this.rotationSpeed.y = 0);
- this.rotationAcc.set(0, 0);
- }
- }, {
- key: "reset",
- value: function reset() {
- this.pointerDragOn = !1;
- this.rotationAcc.set(0, 0);
- this.rotationSpeed.set(0, 0);
- this.pointers = [];
- }
- /**
- * 序列化,用于保存状态。
- */
- }, {
- key: "toJSON",
- value: function toJSON() {
- var cameraSpatialInfo = {
- camera_position: {
- x: math$2.toPrecision(this.camera.position.x, 4),
- y: math$2.toPrecision(this.camera.position.y, 4),
- z: math$2.toPrecision(this.camera.position.z, 4)
- },
- camera_quaternion: {
- x: math$2.toPrecision(this.camera.quaternion.x, 4),
- y: math$2.toPrecision(this.camera.quaternion.y, 4),
- z: math$2.toPrecision(this.camera.quaternion.z, 4),
- w: math$2.toPrecision(this.camera.quaternion.w, 4)
- }
- };
- return cameraSpatialInfo;
- }
- /**
- * 反序列化,用于读取状态
- */
- }, {
- key: "setStateFromJSON",
- value: function setStateFromJSON(cameraSpatialInfo) {
- this.camera.position.copy(cameraSpatialInfo.camera_position);
- this.camera.quaternion.copy(cameraSpatialInfo.camera_quaternion);
- }
- /**
- * 3D图形变换的坐标系 https://blog.csdn.net/CALL_LKC/article/details/81411034
- */
- /**
- * 许钟文 加 看向某个位置
- * 逐渐看向某个位置 通过改变lon和lat
- * @param {THREE.Vector3} aim
- * @param {THREE.Vector3} cameraPos
- * @param {JSON} option
- */
- }, {
- key: "startLookAt",
- value: function startLookAt(aim, cameraPos, option) {
- var useLonLat = option && (option.lon != void 0 || option.lat != void 0);
- if (!useLonLat) {
- var e = cameraPos ? cameraPos.clone().sub(aim) : this.camera.position.clone().sub(aim),
- o = Math.atan(e.z / e.x);
- o += e.x < 0 ? Math.PI : 0, o += e.x > 0 && e.z < 0 ? 2 * Math.PI : 0;
- var lon = THREE.MathUtils.radToDeg(o) + 180;
- var n = Math.sqrt(e.x * e.x + e.z * e.z),
- i = Math.atan(e.y / n);
- var lat = -THREE.MathUtils.radToDeg(i);
- var add = (lon - this.lon) % 360;
- Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
- lon = this.lon + add;
- var add = (lat - this.lat) % 360;
- Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
- lat = this.lat + add;
- }
- var time = 1200,
- speedFuc = easing['easeInOutQuad'];
- if (option != void 0) {
- if (option.soon) {
- this.lon = lon;
- this.lat = lat;
- return;
- }
- if (option.speed) {
- /* var a = Math.abs(lon - this.lon) * Math.PI /180;
- var b = Math.abs(lat - this.lat) * Math.PI /180;
- var c0 = Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.pow(Math.sin(b/2),2));
- var c = Math.asin(c0) * 2; //得到旋转角度 cos(c/2)的方 = cos(a/2)的方 + cos(b/2)的方
- time = c / option.speed; */
- if (useLonLat) {
- var c1 = option.lon ? Math.abs(option.lon - this.lon) : 0;
- var c2 = option.lat ? Math.abs(option.lat - this.lat) : 0;
- var c = c1 + c2;
- } else var c = Math.abs(lon - this.lon) + Math.abs(lat - this.lat);
- time = c / option.speed; //总角度除以速度
- if (option.time) time = Math.min(option.time, time);
- } else if (option.time) time = option.time;
- option.fuc && setTimeout(option.fuc, time); //匀速:
- option.constantSpeed && (speedFuc = null);
- }
- if (useLonLat) {
- if (option.lon) transitions$1.start(lerp.property(this, 'lon', option.lon), time, null, 0, speedFuc);
- if (option.lat) transitions$1.start(lerp.property(this, 'lat', option.lat), time, null, 0, speedFuc);
- } else {
- transitions$1.start(lerp.property(this, 'lon', lon), time, null, 0, speedFuc);
- transitions$1.start(lerp.property(this, 'lat', lat), time, null, 0, speedFuc);
- }
- }
- }]);
- return PanoramaControls;
- }(EventEmitter);
- 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); }; }
- 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; } }
- /**
- * 迷你模式相机控制器
- * 主要是在轨道视角的基础上限制Pan操作的范围
- */
- var DollhouseControls = /*#__PURE__*/function (_OutsideControls) {
- _inherits(DollhouseControls, _OutsideControls);
- var _super = _createSuper$10(DollhouseControls);
- function DollhouseControls(camera, dom, player) {
- var _this;
- _classCallCheck(this, DollhouseControls);
- //OutsideControls.call(this, camera);
- _this = _super.call(this, camera, dom, player);
- _this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle; //最小纬度
- _this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle; //最大纬度
- _this.minDistance = settings$3.dollhouseDefault.minDistance; //最小球半径
- _this.maxDistance = settings$3.dollhouseDefault.maxDistance; //最大球半径
- _this.adjustedMinDistance = _this.minDistance;
- _this.adjustedMaxDistance = _this.maxDistance; //鼠标所交互的界面元素
- _this.dom = dom;
- _this.mode = 'model'; // "security"
- //鼠标、触点行为
- _this.mouseActions[MouseButton.LEFT] = ControlActions.ROTATE;
- _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
- _this.mouseActions[MouseButton.RIGHT] = ControlActions.PAN;
- _this.touchActions[1] = ControlActions.ROTATE;
- _this.touchActions[2] = ControlActions.PAN_DOLLY;
- return _this;
- }
- /**
- * 平移操作
- */
- _createClass(DollhouseControls, [{
- key: "pan",
- value: function pan(panSpeedX, panSpeedY) {
- this.camera.updateMatrix();
- var len = Math.max(this.camera.position.clone().sub(this.target).length(), this.mode == 'security' ? 1 : 0);
- len *= Math.tan(this.camera.fov / 2 * Math.PI / 180);
- this.panLeft(2 * panSpeedX * len / this.player.domElement.clientWidth);
- this.panUp(-2 * panSpeedY * len / this.player.domElement.clientHeight);
- }
- /**
- * 缩放,更改轨道半径
- */
- }, {
- key: "updateZoom",
- value: function updateZoom() {
- var offsetLen = this.offset.length(); //当前轨道半径,见父类OutsideControls
- return offsetLen * this.scale;
- }
- /**
- * 设置Zoom的碰撞范围,使相机在合适的范围内缩放
- * 理论上的合理范围:[模型边界半径, 世界最大范围] 与 自定义范围:[settings.dollhouseDefault.minDistance, settings.dollhouseDefault.maxDistance] 的交集
- */
- }, {
- key: "setZoomBounds",
- value: function setZoomBounds(boundingBox) {
- boundingBox.min.distanceTo(boundingBox.max); //计算(模型)包围盒对角,得到模型的外边界范围
- //this.suitableDistance = distance/2 / Math.tan(THREE.Math.degToRad(70/2))
- var distanceHorizon = boundingBox.min.distanceTo(boundingBox.max.clone().setY(boundingBox.min.y)); //模型橫向最大距离
- //var distanceVerti = (boundingBox.max.y - boundingBox.min.y) *1.1 //模型纵向最大距离 *1.1 是假定, 因为飞出后有一定俯视角度
- var distanceVerti = (boundingBox.max.y - boundingBox.min.y) * 0.5 + distanceHorizon * 0.5; //模型纵向最大距离 + distanceHorizon: 飞出后有一定俯视角度
- this.camera.suitModelAspect = distanceHorizon / distanceVerti; //模型比例。 用于和界面比例作比较
- //this.camera.suitModelAspect = Math.min(this.camera.suitModelAspect, 1.7) //这个太大会导致fov太大,导致倾斜角度太大,然后距离很近,外侧被遮挡。 手动缩小后的损失是当屏幕宽度比大于该值时,横向不会占满,但是无大碍。
- //假定飞出后当camera.aspect == camera.suitModelAspect时,刚好camera.vHov(也就是camera.fov)为默认值settings.dollhouseFOV,存储这时候的hFov(suitModelAspectHFov), 当界面宽度缩小时,模型的hFov不变,按比例变化vHov;当界面宽度放大时,fov则不变。 目的是防止模型缩得太小,自适应屏幕
- this.distanceHorizon = distanceHorizon;
- this.distanceVerti = distanceVerti;
- this.updateDistance(this.camera.aspect);
- /* var distance = boundingBox.min.distanceTo(boundingBox.max)
- this.adjustedMinDistance = Math.max(Math.min(distance / 2, settings.dollhouseDefault.minDistance), 0)
- this.adjustedMaxDistance = Math.min(Math.max(distance, settings.dollhouseDefault.maxDistance), settings.skyboxRadius)
- this.minDistance = this.adjustedMinDistance
- this.maxDistance = this.adjustedMaxDistance */
- }
- }, {
- key: "updateDistance",
- value: function updateDistance(aspect) {
- var oldDistance = this.suitableDistance;
- if (!this.player.model || isNaN(this.camera.suitModelAspect) || this.forbitSetRanges) return;
- var boundingBox = this.player.model.boundingBox;
- if (aspect <= this.camera.suitModelAspect) {
- var HFov = cameraLight.getHFOVFromVFOV(this.camera.fov, aspect, 1);
- this.suitableDistance = this.distanceHorizon / 2 / Math.tan(THREE.MathUtils.degToRad(HFov / 2)); //飞出时模型宽度占满屏宽时的距离
- this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('w '+ this.suitableDistance)
- } else {
- this.suitableDistance = this.distanceVerti / 2 / Math.tan(THREE.MathUtils.degToRad(this.camera.fov / 2));
- this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('h '+ this.suitableDistance)
- }
- this.adjustedMaxDistance = this.suitableDistance * 10; //1.2 //主要为了防止缩得太小
- this.adjustedMinDistance = this.suitableDistance * 0.1; //设置为0会卡住
- this.resetRanges();
- if (this.enabled) {
- this.scale = this.suitableDistance / oldDistance; //this.updateZoom()
- }
- }
- /**
- * 重置轨道半径,纬度的取值范围。有参按参数取值否则为全局自定义值
- */
- }, {
- key: "resetRanges",
- value: function resetRanges(e, t) {
- if (this.forbitSetRanges) return;
- if (e) {
- this.minDistance = Math.min(e, this.minDistance);
- this.maxDistance = Math.max(e, this.maxDistance);
- } else {
- this.minDistance = this.adjustedMinDistance;
- this.maxDistance = this.adjustedMaxDistance;
- }
- if (t) {
- this.minPolarAngle = THREE.MathUtils.degToRad(-15);
- this.maxPolarAngle = THREE.MathUtils.degToRad(89.9);
- } else {
- this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle;
- this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle;
- }
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- return OutsideControls.prototype.toJSON.call(this);
- }
- }]);
- return DollhouseControls;
- }(OutsideControls);
- 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); }; }
- 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; } }
- defineComponent('CameraControls', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(CameraControls, _EventEmitter);
- var _super = _createSuper$$(CameraControls);
- function CameraControls() {
- var _this;
- _classCallCheck(this, CameraControls);
- _this = _super.call(this);
- _this.activeControl = null;
- _this.controls = {};
- _this.cameras = {};
- return _this;
- }
- _createClass(CameraControls, [{
- key: "init",
- value: function init(dom, modes) {
- this.setUpControls(dom, modes);
- this.bindEvents(dom);
- }
- }, {
- key: "activateControls",
- value: function activateControls(mode) {
- if (this.activeControl) {
- this.activeControl.reset();
- this.activeControl.enabled = !1;
- }
- this.controls[mode] && (this.controls[mode].enabled = !0);
- this.activeControl = this.controls[mode];
- }
- }, {
- key: "setUpControls",
- value: function setUpControls(dom, modes) {
- //许钟文改 支持control加在其他dom上
- var cameras = {},
- controls = {};
- var modes = modes || [Viewmode$1.PANORAMA, Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN],
- cameraClasses = [PanoramaCamera, DollhouseCamera, FloorplanCamera],
- controlClasses = [PanoramaControls, DollhouseControls, FloorplanControls];
- modes.forEach(function (mode, index) {
- cameras[mode] = new cameraClasses[index](dom);
- controls[mode] = new controlClasses[index](cameras[mode], dom, this.$app.core.get('Player'));
- controls[mode].on(ControlEvents.Move, this.emit.bind(this, ControlEvents.Move));
- controls[mode].on(ControlEvents.InputStart, this.emit.bind(this, ControlEvents.InputStart));
- controls[mode].on(ControlEvents.InteractionDirect, this.emit.bind(this, ControlEvents.InteractionDirect));
- controls[mode].on(ControlEvents.InteractionKey, this.emit.bind(this, ControlEvents.InteractionKey));
- controls[mode].on(ControlEvents.Pinch, this.emit.bind(this, ControlEvents.Pinch));
- controls[mode].on(ControlEvents.Scroll, this.emit.bind(this, ControlEvents.Scroll));
- }.bind(this));
- this.controls = controls;
- this.cameras = cameras;
- }
- }, {
- key: "bindEvents",
- value: function bindEvents(dom) {
- var _this2 = this;
- dom.addEventListener('mousemove', this.onMouseMove.bind(this));
- dom.addEventListener('mousedown', this.onMouseDown.bind(this));
- dom.addEventListener('mouseup', this.onMouseUp.bind(this));
- dom.addEventListener('mouseover', this.onMouseOver.bind(this));
- if (settings$3.useWheel) {
- dom.addEventListener('mousewheel', this.onMouseWheel.bind(this), {
- passive: false
- });
- dom.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), {
- passive: false
- });
- }
- dom.addEventListener('touchstart', this.onTouchStart.bind(this), {
- passive: false
- });
- dom.addEventListener('touchmove', this.onTouchMove.bind(this), {
- passive: false
- });
- dom.addEventListener('touchend', this.onTouchEnd.bind(this));
- dom.addEventListener('contextmenu', function (e) {
- e.preventDefault();
- });
- dom.addEventListener('pointerdown', this.onPointerDown.bind(this));
- dom.addEventListener('pointermove', this.onPointerMove.bind(this));
- dom.addEventListener('pointerup', this.onPointerUp.bind(this));
- dom.addEventListener('pointerout', this.onPointerCancel.bind(this));
- dom.addEventListener('pointercancel', this.onPointerCancel.bind(this));
- document.addEventListener('keydown', this.onKeyDown.bind(this));
- document.addEventListener('keyup', this.onKeyUp.bind(this));
- this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, function (e) {
- this.setModelForControls(e.model);
- }.bind(this));
- this.on('syncCadAnd3D', function (info) {
- _this2.controls[Viewmode$1.FLOORPLAN].updateDirect(info);
- }); // info = {width:..,height:...,center:...}
- this.on('syncCadAnd3DForRotate', function (info) {
- _this2.controls[Viewmode$1.FLOORPLAN].updateForRotateCad(info);
- });
- }
- }, {
- key: "setModelForControls",
- value: function setModelForControls(model) {
- //this.controls[Viewmode.DOLLHOUSE].setZoomBounds(model.boundingBox)
- var boundingBox = model.boundingBox.clone().expandByScalar(settings$3.modelBoundsPadding);
- [Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN].forEach(function (mode) {
- this.controls[mode].setZoomBounds(model.boundingBox);
- this.controls[mode].setBounds(boundingBox);
- }.bind(this));
- }
- }, {
- key: "onMouseDown",
- value: function onMouseDown(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onMouseDown(e);
- }
- }, {
- key: "onMouseMove",
- value: function onMouseMove(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onMouseMove(e);
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onMouseUp(e);
- }
- }, {
- key: "onMouseOver",
- value: function onMouseOver(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onMouseOver(e);
- }
- }, {
- key: "onMouseWheel",
- value: function onMouseWheel(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onMouseWheel(e);
- }
- }, {
- key: "onTouchStart",
- value: function onTouchStart(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onTouchStart(e);
- }
- }, {
- key: "onTouchMove",
- value: function onTouchMove(e) {
- var _this3 = this;
- var func = function func() {
- e.preventDefault();
- _this3.activeControl && _this3.activeControl.onTouchMove(e);
- };
- if (this.$app.VRScreenSYNC) {
- common$1.debounce(func, 1000 / 60, true)(); //会导致带看leader触屏缩放摇晃。
- } else {
- func();
- }
- }
- }, {
- key: "onTouchEnd",
- value: function onTouchEnd(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onTouchEnd(e);
- }
- }, {
- key: "onPointerDown",
- value: function onPointerDown(e) {
- e.preventDefault();
- if (this.activeControl) switch (e.pointerType) {
- case 'mouse':
- this.activeControl.onMouseDown(e);
- break;
- default:
- this.activeControl.onPointerDown(e);
- }
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove(e) {
- var _this4 = this;
- var func = function func() {
- e.preventDefault();
- if (_this4.activeControl) switch (e.pointerType) {
- case 'mouse':
- _this4.activeControl.onMouseMove(e);
- break;
- default:
- _this4.activeControl.onPointerMove(e);
- }
- };
- if (this.$app.VRScreenSYNC) {
- common$1.debounce(func, 1000 / 60, true)();
- } else {
- func();
- }
- }
- }, {
- key: "onPointerUp",
- value: function onPointerUp(e) {
- e.preventDefault();
- if (this.activeControl) {
- switch (e.pointerType) {
- case 'mouse':
- this.activeControl.onMouseUp(e);
- break;
- default:
- this.activeControl.onPointerUp(e);
- }
- this.emit('pointerUp');
- }
- }
- }, {
- key: "onPointerCancel",
- value: function onPointerCancel(e) {
- e.preventDefault();
- this.activeControl && 'mouse' !== e.pointerType && this.activeControl.onPointerUp(e);
- }
- }, {
- key: "onKeyDown",
- value: function onKeyDown(e) {
- if (!this.$app.config.useShortcutKeys) {
- return;
- }
- if (e.metaKey || e.ctrlKey) ; else {
- e.preventDefault();
- this.activeControl && this.activeControl.onKeyDown(e);
- }
- }
- }, {
- key: "onKeyUp",
- value: function onKeyUp(e) {
- e.preventDefault();
- this.activeControl && this.activeControl.onKeyUp(e);
- }
- }]);
- return CameraControls;
- }(EventEmitter);
- });
- var PanoVideoEvents = {
- CanPlay: 'panovideo.canplay',
- StartPlay: 'panovideo.start',
- Resume: 'panovideo.resume',
- Pause: 'panovideo.pause',
- Stop: 'panovideo.stop',
- Switch: 'panovideo.switch'
- };
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var H5VideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
- _inherits(H5VideoPlayer, _EventEmitter);
- var _super = _createSuper$_(H5VideoPlayer);
- function H5VideoPlayer(dom, videos) {
- var _this;
- _classCallCheck(this, H5VideoPlayer);
- _this = _super.call(this); // this.listeneNum = 0
- _this.domElement = dom;
- _this.os = ''; //Android | Ios | PC
- _this.environment = ''; //WeChat | WeChatMiniProgram | Other
- // this.videos = new Map();
- // this.textures = new Map();
- _this._resource = new Map();
- videos.forEach(function (value, key) {
- var video = _this._createVideoElement(value.mp4.url, // config.appenv == 'shipin' &&
- _this._resource.size == 0);
- _this._resource.set(key, {
- url: value.mp4.url,
- video: video,
- texture: _this._createTexture(video),
- loaded: true
- });
- /* if(key == 350){
-
-
- } */
- });
- _this.video = null; // this.texture = new THREE.VideoTexture(document.createElement('video'))
- // this.texture.minFilter = THREE.LinearFilter
- _this.isFirstPlay = true;
- _this.isMuted = true;
- _this.events = {
- onDomElementTouchStart: function onDomElementTouchStart() {
- //---ios
- //console.log('onDomElementTouchStart')
- if (_this.shouldPlay) {
- _this.video.muted = _this.isMuted;
- _this.video.play();
- console.log('onDomElementTouchStart muted', _this.video.muted, 'paused', _this.video.paused);
- _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
- }
- },
- onDomElementTouchEnd: function onDomElementTouchEnd() {
- if (_this.shouldPlay) {
- _this.video.muted = _this.isMuted;
- _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true);
- }
- },
- onDomElementMouseDown: function onDomElementMouseDown() {
- if (_this.shouldPlay) {
- _this.video.muted = _this.isMuted;
- _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true);
- }
- }
- };
- return _this;
- }
- _createClass(H5VideoPlayer, [{
- key: "_createTexture",
- value: function _createTexture(videoElement) {
- var texture = new THREE.VideoTexture(videoElement);
- texture.minFilter = THREE.LinearFilter;
- texture.uploaded = false;
- return texture;
- }
- }, {
- key: "_createVideoElement",
- value: function _createVideoElement(src) {
- var video; // if (config.appenv == 'shipin' && isInPage) {
- // video = parent.document.querySelector('#video-' + config.projectNum)
- // video._isPrepload = true
- // } else
- {
- video = document.createElement('video');
- video.setAttribute('crossOrigin', 'anonymous');
- video.setAttribute('playsinline', 'true');
- video.setAttribute('x5-playsinline', 'true');
- video.setAttribute('webkit-playsinline', 'true');
- video.setAttribute('x5-video-player-type', 'h5');
- video.setAttribute('controls', 'true'); // video.preload = true //"none";
- video.autoplay = false;
- video.muted = this.isMuted;
- video.loop = true;
- video.src = src;
- video.style.position = 'fixed';
- video.style.left = '0';
- video.style.top = '0';
- video.style.width = browser$1.urlHasValue('debug') ? '300px' : '1px';
- video.style.height = browser$1.urlHasValue('debug') ? '300px' : '1px';
- video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
- video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
- video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0'; //this.domElement.appendChild(video)
- }
- /* if (!H5VideoPlayer.videoReady) {
- H5VideoPlayer.videoReady = true
- function iosInitAutoPlay() {
- console.log('iosInitAutoPlay', video.src)
- video.play()
- setTimeout(()=>{
- console.log('iosInitAutoPlay result', video.paused, __sdk.core.get('Player').model.skybox.material.defines.HasVideo)
-
- video.pause()
- },100)
-
- window.listener.removeEventListener('touchstart', iosInitAutoPlay, true)
- }
- //避免重复监听
- window.listener = window //window.document.body
- window.listener.addEventListener('touchstart', iosInitAutoPlay, true)
- } */
- return video;
- }
- }, {
- key: "_onCanPlay",
- value: function _onCanPlay() {
- this.emit(PanoVideoEvents.CanPlay);
- }
- }, {
- key: "_onPlaying",
- value: function _onPlaying() {
- var _this2 = this;
- //console.log('_onPlaying muted', this.video.muted)
- this.emit(PanoVideoEvents.Switch, this.texture);
- this.video.ontimeupdate = function (event) {
- if (_this2.video.currentTime > 0.5) {
- _this2.emit(PanoVideoEvents.Resume);
- _this2.video.ontimeupdate = null;
- _this2.isFirstPlay = false; //console.log('播放成功')
- }
- };
- if (this.isFirstPlay) this.emit(PanoVideoEvents.StartPlay);
- }
- }, {
- key: "_onPause",
- value: function _onPause(event) {
- if (this.video) {
- this.video._isPaused = true;
- }
- this.emit(PanoVideoEvents.Pause);
- }
- }, {
- key: "preload",
- value: function preload(video) {
- var _this3 = this;
- if (video == this.video || video._isPrepload) return;
- video.muted = true;
- try {
- top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
- video.play();
- }, false);
- } catch (error) {
- video.play();
- }
- video.onplaying = function () {
- video.pause();
- video._isPrepload = true;
- if (_this3.video && !_this3.video._isPaused) {
- _this3.video.play();
- }
- };
- }
- }, {
- key: "preloadAll",
- value: function preloadAll() {
- if (this.video) {
- this.video._isPaused = this.video.paused;
- }
- var _iterator = _createForOfIteratorHelper$9(this._resource.values()),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var item = _step.value;
- this.preload(item.video);
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- }
- }, {
- key: "preloadPano",
- value: function preloadPano(pano) {
- var item = this._resource.get(pano.id);
- if (item) {
- this.preload(item.video);
- }
- }
- }, {
- key: "startVideo",
- value: function startVideo(panoId, tryIfFirstplay) {
- var item = this._resource.get(panoId);
- if (item) {
- item.video.autoplay = true;
- item.video.onplaying = this._onPlaying.bind(this);
- item.video.onpause = this._onPause.bind(this);
- item.video.oncanplay = this._onCanPlay.bind(this);
- this.video = item.video;
- this.texture = item.texture; // // debug
- // this.video.addEventListener("playing", () => console.error('mp4_debug_playing'))
- // this.video.addEventListener("pause", () => console.error('mp4_debug_pause'))
- // this.video.addEventListener("canplay", () => console.error('mp4_debug_canplay'))
- // this.video.onloadstart = () => console.error('mp4_debug_loadstart')
- // this.video.onloadedmetadata = () => console.error('mp4_debug_loadedmetadata', this.video.readyState)
- // this.video.onloadeddata = () => console.error('mp4_debug_loadeddata', this.video.readyState)
- // this.video.onprogress = () => {
- // console.error('mp4_debug_progress', this.video.readyState)
- // }
- // this.video.oncanplaythrough = () => console.error('mp4_debug_canplaythrough:视频源数据加载完成')
- // this.video.onwaiting = () => console.error('mp4_debug_waiting')
- // this.video.onerror = (e) => console.error('mp4_debug_error', e)
- // this.video.onabort = () => console.error('mp4_debug_abort: 客户端主动终止下载')
- // this.video.onemptied = () => console.error('mp4_debug_emptied: video元素变为未初始化状态')
- // this.video.onstalled = () => {
- // console.error('mp4_debug_stalled: 浏览器尝试获取媒体数据但数据不可用(网速异常)')
- // }
- // this.video.onseeking = () => console.error('mp4_debug_seeking: 浏览器正在请求数据(视频跳转中)')
- // this.video.onseeked = () => console.error('mp4_debug_seeked')
- // this.video.onsuspend = () => console.error('mp4_debug_suspend: 浏览器暂停获取媒体数据(延迟下载)')
- // this.video.style.display = ""
- /* if(tryIfFirstplay) {
- this.isFirstPlay && this.play(this.video ) */
- /* }else */
- if (this.video.paused) {
- this.play(this.video);
- } else {
- this._onPlaying();
- }
- }
- } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
- // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
- }, {
- key: "play",
- value: function play(videoElement) {
- var _this4 = this;
- this.shouldPlay = videoElement;
- if (this.isFirstPlay || !videoElement._isCanplay) {
- if (browser$1.detectWeixin()) {
- //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
- try {
- top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
- if (_this4.shouldPlay == videoElement) {
- console.log('play', videoElement.src.split('/').pop());
- videoElement.play();
- videoElement._isCanplay = true;
- }
- }, false);
- } catch (error) {
- videoElement.play();
- videoElement._isCanplay = true;
- }
- } //符合Autoplay Policy的自动播放,处理方式为:先静音播放,再由用户触发打开声音
- else {
- videoElement.play();
- videoElement._isCanplay = true; //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
- //测试样本 IOS: safari chrome | Android: chrome
- if (browser$1.detectAndroidMobile()) {
- this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
- } else if (browser$1.detectIOS()) {
- this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
- } else {
- this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
- }
- }
- } else {
- videoElement.play();
- } //console.log('try play', videoElement.paused, videoElement.src)
- }
- }, {
- key: "pauseVideo",
- value: function pauseVideo(panoId) {
- var item = this._resource.get(panoId);
- if (item) {
- //console.error('pauseVideo', panoId)
- item.video.pause();
- item.video.muted = true;
- item.video.onplaying = null;
- if (this.shouldPlay == item.video) this.shouldPlay = false;
- }
- }
- }, {
- key: "pause",
- value: function pause() {
- if (this.video) {
- //console.error('pause', this.video.src.split('/').pop())
- this.video._isPaused = true;
- this.video.pause();
- this.shouldPlay = false;
- }
- }
- }, {
- key: "resume",
- value: function resume() {
- if (this.video) {
- this.play(this.video);
- this.video.onplaying = this._onPlaying.bind(this);
- } else {
- console.warn('PanoVideoRenderer: 没有可播放的视频');
- }
- }
- }, {
- key: "setMuted",
- value: function setMuted(muted) {
- //console.log('setMuted', muted )
- var _iterator2 = _createForOfIteratorHelper$9(this._resource.values()),
- _step2;
- try {
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
- var item = _step2.value;
- item.video.muted = muted;
- } //this.video && (this.video.muted = muted)
- } catch (err) {
- _iterator2.e(err);
- } finally {
- _iterator2.f();
- }
- this.isMuted = muted;
- }
- }]);
- return H5VideoPlayer;
- }(EventEmitter);
- H5VideoPlayer$1.videoReady = false;
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var FlvVideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
- _inherits(FlvVideoPlayer, _EventEmitter);
- var _super = _createSuper$Z(FlvVideoPlayer);
- function FlvVideoPlayer(dom, videos) {
- var _this;
- _classCallCheck(this, FlvVideoPlayer);
- _this = _super.call(this);
- _this.domElement = dom;
- _this.instances = new Map();
- _this.instanceTextures = new Map();
- videos.forEach(function (value, key) {
- // if( config.appenv == "shipin" && this.instances.size>0){
- // return
- // }
- _this.instances.set(key, _this._createVideo(value.flv.url));
- var videoTexture = new THREE__namespace.VideoTexture(_this.instances.get(key).videoElement);
- videoTexture.minFilter = THREE__namespace.LinearFilter;
- _this.instanceTextures.set(key, videoTexture);
- });
- _this.video = null;
- _this.texture = null;
- _this.isFirstPlay = true;
- _this.isMuted = true;
- _this.events = {
- onDomElementTouchStart: function onDomElementTouchStart() {
- //---ios
- //console.log('onDomElementTouchStart')
- /* if (this.shouldPlay) {
- this.video.muted = this.isMuted
- this.video.play()
- console.log('onDomElementTouchStart muted', this.video.muted, 'paused', this.video.paused)
- this.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart, true)
- }*/
- _this.video.muted = _this.isMuted;
- _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
- },
- onDomElementTouchEnd: function onDomElementTouchEnd() {
- //if (this.shouldPlay) {
- _this.video.muted = _this.isMuted;
- _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true); //}
- },
- onDomElementMouseDown: function onDomElementMouseDown() {
- //if (this.shouldPlay) {
- _this.video.muted = _this.isMuted;
- _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true); //}
- }
- };
- return _this;
- }
- _createClass(FlvVideoPlayer, [{
- key: "_createVideo",
- value: function _createVideo(url) {
- var video = document.createElement('video');
- video.setAttribute('crossOrigin', 'anonymous');
- video.setAttribute('playsinline', 'true');
- video.setAttribute('webkit-playsinline', 'true');
- video.setAttribute('controls', 'true');
- video.setAttribute('unfullscreen', 'true');
- video.autoplay = false;
- video.muted = true;
- video.loop = true;
- video.style.position = 'fixed';
- video.style.left = '0';
- video.style.top = '0';
- video.style.width = browser$1.urlHasValue('debug') ? '200px' : '1px';
- video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
- video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
- video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0'; //this.domElement.appendChild(video) //bug:1 安卓似乎会在 browser.requestFullscreen(document.body) 后全屏(点击vr时)时播放显示视频
- //2 安卓微信在vr分屏走到球幕视频requestFullscreen会退出分屏,原因是视频+全屏 = 被微信强制竖屏
- var player = flvjs.createPlayer({
- type: 'flv',
- url: url
- }, {
- lazyLoad: true,
- lazyLoadMaxDuration: 5
- });
- player.videoElement = video;
- player.attachMediaElement(video);
- player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
- return player;
- }
- }, {
- key: "_onPlayerError",
- value: function _onPlayerError(error) {
- console.warn('球幕视频资源加载错误:', error);
- }
- }, {
- key: "_onPlaying",
- value: function _onPlaying() {
- var _this2 = this;
- this.emit(PanoVideoEvents.Switch, this.texture);
- this.video.ontimeupdate = function (event) {
- if (_this2.video.currentTime > 0.2) {
- _this2.emit(PanoVideoEvents.Resume);
- if (_this2.isFirstPlay) _this2.emit(PanoVideoEvents.StartPlay);
- _this2.isFirstPlay = false;
- _this2.video.ontimeupdate = null;
- }
- };
- }
- }, {
- key: "_onPause",
- value: function _onPause() {
- this.emit(PanoVideoEvents.Pause);
- this.state = 0;
- }
- }, {
- key: "preloadPano",
- value: function preloadPano(pano) {
- var instance = this.instances.get(pano.id);
- if (instance && instance.buffered.length == 0) {
- instance.load();
- }
- }
- }, {
- key: "startVideo",
- value: function startVideo(panoId) {
- var instance = this.instances.get(panoId);
- if (instance) {
- instance.buffered.length == 0 && instance.load();
- this.video = instance.videoElement;
- this.video.onplaying = this._onPlaying.bind(this);
- this.video.onpause = this._onPause.bind(this); // 直接取提前准备好的VideoTexture
- // 不能直接给this.texture.image赋值this.video,会在手机上无法播放;
- // 也不能在这里new THREE.VideoTexture,有时会有一小段黑屏
- this.texture = this.instanceTextures.get(panoId);
- if (this.video.paused) {
- this.play(this.video);
- } else {
- this._onPlaying();
- }
- }
- }
- }, {
- key: "pauseVideo",
- value: function pauseVideo(panoId) {
- var instance = this.instances.get(panoId);
- if (instance) {
- instance.videoElement.pause();
- instance.videoElement.onplaying = null;
- }
- } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
- // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
- }, {
- key: "play",
- value: function play(videoElement) {
- if (this.isFirstPlay) {
- videoElement.play(); //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
- //测试样本 IOS: safari chrome | Android: chrome
- if (browser$1.detectAndroidMobile()) {
- this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
- } else if (browser$1.detectIOS()) {
- this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
- } else {
- this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
- }
- } else {
- videoElement.play();
- }
- }
- }, {
- key: "pause",
- value: function pause() {
- this.video && this.video.pause();
- }
- }, {
- key: "resume",
- value: function resume() {
- if (this.video) {
- this.play(this.video);
- } else {
- console.warn('FlvVideoPlayer: 没有可播放的视频');
- }
- }
- }, {
- key: "setMuted",
- value: function setMuted(muted) {
- var _iterator = _createForOfIteratorHelper$8(this.instances.values()),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var instance = _step.value;
- instance.videoElement.muted = muted;
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- this.isMuted = muted;
- }
- /* onDomElementTouchStart() {
- this.setMuted(false)
- this.domElement.removeEventListener('touchstart', this.onDomElementTouchStart)
- }
- onDomElementTouchEnd() {
- this.setMuted(false)
- this.domElement.removeEventListener('touchstart', this.onDomElementTouchEnd)
- }
- onDomElementMouseDown() {
- this.setMuted(false)
- this.domElement.removeEventListener('mousedown', this.onDomElementMouseDown)
- } */
- }]);
- return FlvVideoPlayer;
- }(EventEmitter);
- var PanoVideoRendererState = {
- Pause: 0,
- Playing: 1
- };
- 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); }; }
- 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; } }
- defineComponent('PanoVideoRenderer', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(PanoVideoRenderer, _EventEmitter);
- var _super = _createSuper$Y(PanoVideoRenderer);
- function PanoVideoRenderer() {
- var _this;
- _classCallCheck(this, PanoVideoRenderer);
- _this = _super.call(this);
- window.panoVideoRenderer = _assertThisInitialized(_this);
- _this.version = 1;
- _this.videoPlayer = null;
- _this.activePanorama = null;
- _this.nearestPano = null;
- _this.ready = false;
- _this._state = PanoVideoRendererState.Pause;
- _this.texture = null;
- _this.isGuiding = false;
- _this.isRecording = false;
- _this.isSoundRecording = false;
- _this.loadingAnimEnable = true;
- _this.loadingTimeStamp = 0;
- _this.loadingUITimer = 0;
- _this.loadingUIAnimHandler = 0;
- var uniforms = THREE.UniformsUtils.clone(shaders.videoLoading.uniforms);
- uniforms['uColor'].value = new THREE.Vector4(0, 0.7843137254901961, 0.6862745098039216, 0.7);
- _this.loadingUI = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), new THREE.RawShaderMaterial({
- uniforms: uniforms,
- vertexShader: shaders.videoLoading.vertexShader,
- fragmentShader: shaders.videoLoading.fragmentShader,
- transparent: true
- }));
- _this.loadingUI.visible = false;
- return _this;
- }
- _createClass(PanoVideoRenderer, [{
- key: "init",
- value: function init(videosInfo) {
- var _this2 = this;
- var player = this.$app.core.get('Player');
- this.videosInfo = videosInfo;
- if (!videosInfo) {
- logger$1.warn('PanoVideoRenderer初始化失败,数据为空');
- return;
- }
- this.version = videosInfo.version; // this.initVideoPlayer(this.$app.dom, videosInfo.videos)
- player.on('guide/play/start', function (index) {
- _this2.isGuiding = true;
- _this2.setMuted(true);
- });
- player.on('guide/play/pause', function (index) {
- _this2.isGuiding = false;
- _this2.setMuted(false);
- });
- this.$app.core.get('Player').on('guide/play/stop', function (index) {
- _this2.isGuiding = false;
- _this2.setMuted(false);
- });
- this.ready = true;
- if (browser$1.detectIE() || navigator.userAgent.match('JSN-AL00')) {
- //之前的记录:JSN-AL00 荣耀8x Harmony OS2.0 微信8.0.28 无法显示球幕 2023.5.29又发现可以显示 场景:KK-t-Gw0q49v8k4W
- this.ready = false;
- console.warn('浏览器不支持球幕视频', navigator.userAgent);
- }
- this.$app.core.get('SceneRenderer').scene.add(this.loadingUI);
- /* let updateVideoMarkerDisplay = ()=>{ //---如果要在这些界面上隐藏video图标的话
- if(player.mode != 'floorplan') return //?
- let showVideo = this.canShowMarker('floorplan')
-
- console.log('updateVideoMarkerDisplay', showVideo)
- player.model.panos.forEach((pano)=>{
- let v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden)
- if(pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0
-
- })
- }
- player.on('beginTagVisiSetting', updateVideoMarkerDisplay)
- player.on('exitTagVisiSetting', updateVideoMarkerDisplay)
- player.on('editViewStateChange', updateVideoMarkerDisplay)
- player.on('beginEditOverlay', updateVideoMarkerDisplay)
- player.on('endEditOverlay', updateVideoMarkerDisplay) */
- var updateVideoMarkerDisplay = function updateVideoMarkerDisplay() {
- //---如果要在这些界面上隐藏video图标的话
- if (player.mode != 'floorplan') return; //?
- var showVideo = _this2.canShowMarker('floorplan');
- console.log('updateVideoMarkerDisplay', showVideo);
- player.model.panos.forEach(function (pano) {
- var v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden);
- if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
- });
- };
- player.on('linkEditorSetVisible', function (s) {
- updateVideoMarkerDisplay();
- });
- var recoverVideoMarkers = function recoverVideoMarkers() {
- //---恢复video的marker显示
- player.model.panos.forEach(function (pano) {
- var v = player.model.allFloorsVisible || !pano.floor.hidden;
- if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
- });
- };
- player.on('editViewStateChange', function (state) {
- //退出view的编辑
- if (state == false) recoverVideoMarkers();
- });
- }
- }, {
- key: "initVideoPlayer",
- value: function initVideoPlayer(dom, videos) {
- var _VersionControl$getEn = VersionControl.getEnvironment(),
- os = _VersionControl$getEn.os,
- environment = _VersionControl$getEn.environment;
- /* // if (window.navigator.userAgent.indexOf('WindowsWechat') === -1 && window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
- // // 小米自带浏览器只能用FlvVideoPlayer
- // this.videoPlayer = new FlvVideoPlayer(dom, videos)
- // } else {
- this.videoPlayer = new H5VideoPlayer(dom, videos)
- // } */
- //--------之前为什么注释呢?
- //oppo k5 自带的浏览器flv和h5均无法播放, google edge浏览器可以
- //来自v3:
- if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
- // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
- this.videoPlayer = new FlvVideoPlayer$1(dom, videos); //console.log('use FlvVideoPlayer')
- } else {
- //console.log('use H5VideoPlayer')
- this.videoPlayer = new H5VideoPlayer$1(dom, videos);
- }
- this.videoPlayer.on(PanoVideoEvents.CanPlay, this.onVideoCanPlay.bind(this));
- this.videoPlayer.on(PanoVideoEvents.StartPlay, this.onVideoStartPlay.bind(this));
- this.videoPlayer.on(PanoVideoEvents.Switch, this.onVideoSwitch.bind(this));
- this.videoPlayer.on(PanoVideoEvents.Resume, this.onVideoResume.bind(this));
- this.videoPlayer.on(PanoVideoEvents.Pause, this.onVideoPause.bind(this));
- this.videoPlayer.on(PanoVideoEvents.Stop, this.onVideoStop.bind(this));
- }
- }, {
- key: "activatePanorama",
- value: function activatePanorama(panorama, isFirstPlay) {
- var _this3 = this;
- //console.log('activatePanorama', panorama && panorama.id)
- if (!panorama.hasVideo || !this.ready) {
- //console.log("renderVideo skip", panorama)
- return;
- }
- this.activePanorama = panorama;
- this.started = true;
- this.videoPlayer.startVideo(panorama.id, isFirstPlay);
- this.loadingUITimer = setTimeout(function () {
- _this3.showLoading(panorama);
- window.clearTimeout(_this3.loadingUITimer);
- }, 500);
- }
- }, {
- key: "deactivePanorama",
- value: function deactivePanorama(panorama) {
- //console.log('deactivePanorama', panorama && panorama.id)
- if (panorama != null && panorama.id != null) {
- this.videoPlayer.pauseVideo(panorama.id);
- }
- this.activePanorama = null;
- }
- }, {
- key: "preActivatePanorama",
- value: function preActivatePanorama(panorama) {
- this.videoPlayer.startVideo(panorama.id, true);
- }
- }, {
- key: "getActivePanorama",
- value: function getActivePanorama() {
- return this.activePanorama;
- }
- }, {
- key: "showLoading",
- value: function showLoading(pano) {
- if (!this.loadingAnimEnable) return;
- var target = new THREE.Vector3().copy(pano.position);
- var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.$app.core.get('Player').model.supportsTiles ? 90 : 180));
- var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(qua.multiply(pano.quaternion));
- this.loadingUI.position.copy(target).add(direction);
- this.loadingUI.lookAt(target); // this.loadingUI.visible = true
- this.loadingTimeStamp = performance.now();
- this.loadingAnimte(0);
- }
- }, {
- key: "hideLoading",
- value: function hideLoading() {
- this.loadingUI.visible = false;
- window.cancelAnimationFrame(this.loadingUIAnimHandler);
- window.clearTimeout(this.loadingUITimer);
- }
- }, {
- key: "loadingAnimte",
- value: function loadingAnimte(elapsedTime) {
- this.loadingUI.material.uniforms['uTime'].value = performance.now() - this.loadingTimeStamp;
- this.loadingUIAnimHandler = window.requestAnimationFrame(this.loadingAnimte.bind(this));
- }
- }, {
- key: "suspend",
- value: function suspend() {
- if (!this.ready) return false;
- this.videoPlayer.pause();
- this.emit(PanoVideoRendererEvents.SuspendRender);
- }
- }, {
- key: "resume",
- value: function resume() {
- if (!this.ready) return false;
- this.videoPlayer.resume();
- }
- }, {
- key: "canPhonate",
- value: function canPhonate() {
- return this.isGuiding == false && this.isRecording == false && this.isSoundRecording == false;
- }
- }, {
- key: "setMuted",
- value: function setMuted(muted) {
- if (this.videoPlayer) {
- if (!this.canPhonate()) muted = true;
- this.videoPlayer.setMuted(muted);
- }
- }
- }, {
- key: "getState",
- value: function getState() {
- return this._state;
- }
- }, {
- key: "onVideoPanoramasEnter",
- value: function onVideoPanoramasEnter(oldPanorama, newPanorama) {//this.activatePanorama(newPanorama)
- //console.log('onPanoEnter')
- }
- }, {
- key: "onVideoPanoramasExit",
- value: function onVideoPanoramasExit(panorama) {//console.log('onPanoExit')
- //this.deactivePanorama(panorama)
- }
- }, {
- key: "onVideoCanPlay",
- value: function onVideoCanPlay() {
- //console.log('onVideoCanPlay')
- this.emit(PanoVideoRendererEvents.CanPlayVideo);
- }
- }, {
- key: "onVideoStartPlay",
- value: function onVideoStartPlay() {
- //console.log('onVideoStartPlay')
- this.emit(PanoVideoRendererEvents.StartPlayVideo);
- }
- }, {
- key: "onVideoSwitch",
- value: function onVideoSwitch(texture) {
- if (this.texture) this.texture.dispose(); //xzw add
- this.texture = texture;
- this.emit(PanoVideoRendererEvents.TextureUpdate, texture);
- }
- }, {
- key: "onVideoResume",
- value: function onVideoResume() {
- this._state = PanoVideoRendererState.Playing;
- this.emit(PanoVideoRendererEvents.ResumeRender);
- this.hideLoading();
- }
- }, {
- key: "onVideoPause",
- value: function onVideoPause() {
- this._state = PanoVideoRendererState.Pause;
- this.emit(PanoVideoRendererEvents.SuspendRender);
- }
- }, {
- key: "onVideoStop",
- value: function onVideoStop() {
- this._state = PanoVideoRendererState.Pause;
- this.emit(PanoVideoRendererEvents.SuspendRender);
- }
- }, {
- key: "ifEnable",
- value: function ifEnable() {
- //xzw add
- return (
- /* !objects.tagManager.editSpot.enterSplitView && */
- this.ready
- );
- /* && (//其他写了好像没作用 就都播放吧
- !config.isEdit || store.getters.page != 'screen' ) */
- }
- }, {
- key: "canShowMarker",
- value: function canShowMarker() {
- var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'floorplan';
- var player = this.$app.core.get('Player');
- if (mode == 'floorplan') {
- return !(this.$app.Plugins.EditCAD && this.$app.Plugins.EditCAD.display || player.linkEditor && (player.linkEditor.setPanoVisible || player.linkEditor.setTagVisible));
- }
- }
- }]);
- return PanoVideoRenderer;
- }(EventEmitter);
- }); // export default new PanoVideoRenderer()
- /*
- note:
- 初始点位球幕视频静音播放
- */
- 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); }; }
- 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; } }
- defineComponent('DisplayController', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(DisplayController, _EventEmitter);
- var _super = _createSuper$X(DisplayController);
- function DisplayController(fadeInSpeed) {
- var _this;
- _classCallCheck(this, DisplayController);
- _this = _super.call(this);
- _this.fadeInSpeed = fadeInSpeed;
- null !== _this.fadeInSpeed && void 0 !== _this.fadeInSpeed || (_this.fadeInSpeed = 0);
- _this.panoVideoRenderer = null;
- return _this;
- }
- _createClass(DisplayController, [{
- key: "init",
- value: function init() {
- this.container = this.$app.core.get('Player').domElement;
- this.panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
- this.updateModel();
- this.bindEvents();
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- this.$app.core.get('Player').on(PlayerEvents.FlyingStarted, this.handlePlayerFlyingStarted.bind(this));
- this.$app.core.get('Player').on(PlayerEvents.FlyingEnded, this.handlePlayerFlyingEnded.bind(this));
- this.$app.core.get('Player').on(PlayerEvents.ModeChanging, this.handlePlayerModeChanging.bind(this));
- this.$app.core.get('Player').on(PlayerEvents.ModeChanged, this.handlePlayerModeChanged.bind(this));
- this.$app.core.get('Player').on(PlayerEvents.ClosestPanoChanging, this.handleClosestPanoChanging.bind(this));
- this.$app.core.get('Player').on(PlayerEvents.StartInside, this.handleStartInside.bind(this)); //若初始画面在内
- this.$app.core.get('Player').on(PlayerEvents.StartOutside, this.handleStartOutside.bind(this));
- }
- }, {
- key: "updateModel",
- value: function updateModel() {
- this.model = this.$app.core.get('ModelManager').getActiveModel();
- }
- }, {
- key: "handlePlayerFlyingStarted",
- value: function handlePlayerFlyingStarted(panoInfo) {
- var lastPano = this.model.panos.index[panoInfo.lastPanoId];
- this.panoVideoRenderer.deactivePanorama(lastPano);
- this.panoVideoRenderer.setMuted(true);
- }
- }, {
- key: "handlePlayerFlyingEnded",
- value: function handlePlayerFlyingEnded(_ref) {
- var targetPano = _ref.targetPano;
- if (targetPano && this.model.mode == Viewmode$1.PANORAMA) {
- this.panoVideoRenderer.activatePanorama(targetPano);
- }
- this.panoVideoRenderer.setMuted(false);
- }
- }, {
- key: "handlePlayerModeChanging",
- value: function handlePlayerModeChanging(oldMode, newMode, pano) {
- var activeModel = this.$app.core.get('ModelManager').getActiveModel();
- var opacity; //if(this.$app.core.get('Player').is360View(newMode, pano) || this.$app.core.get('Director').tourIsPlaying)
- if (this.$app.core.get('Player').is360View(newMode, pano)) {
- opacity = 0;
- } else {
- opacity = settings$3[newMode].markerOpacity;
- } //显示地面的白色圈圈
- activeModel.fadePanoMarkers(opacity, 0, {
- mode: newMode
- }); //activeModel.setMode(newMode) //xzw改 没必要所以去掉,在handlePlayerModeChanged中写了。否则太乱了。
- }
- }, {
- key: "handlePlayerModeChanged",
- value: function handlePlayerModeChanged(e, mode) {
- var activeModel = this.$app.core.get('ModelManager').getActiveModel();
- var sid = mode === Viewmode$1.PANORAMA ? THREE.DoubleSide : THREE.FrontSide;
- activeModel.setSide(sid);
- activeModel.setMode(mode);
- } //地面的marker变清晰
- }, {
- key: "handleClosestPanoChanging",
- value: function handleClosestPanoChanging(closestPano, newClosestPano, mode) {
- if (mode !== Viewmode$1.TRANSITIONING) {
- closestPano && closestPano.hoverOff(mode);
- newClosestPano && newClosestPano.hoverOn(mode);
- }
- } //add
- }, {
- key: "handleStartInside",
- value: function handleStartInside(duration) {
- var t = settings$3[this.$app.core.get('Player').mode],
- i = duration ? 0 : t.transitionTime * t.skyboxOpacityLength;
- this.fadeIn(this.fadeInSpeed);
- this.model.alpha = 0;
- this.model.skybox.material.uniforms.opacity.value = 1; //(this.model.skybox.originMat || this.model.skybox.material).uniforms.opacity.value = 1
- this.model.fadePanoMarkers(null, null, {
- player: this.$app.core.get('Player')
- }); //(e ? 0 : t.markerOpacity);
- var reticule = this.$app.core.get('Player').reticule;
- transitions$1.start(lerp.property(reticule.material, 'opacity', 0), i, null, 0, null, 'retReOpac');
- }
- }, {
- key: "handleStartOutside",
- value: function handleStartOutside(duration) {
- this.fadeIn(duration);
- }
- }, {
- key: "fadeIn",
- value: function fadeIn(duration) {
- null !== duration && void 0 !== duration || (duration = 2000, logger.warn('DisplayController.fadeIn -> no transition time specified, defaulting to 2000 ms.'));
- if (this.model) {
- //this.model.chunks.forEach(item => (item.visible = true)) //xzw 4.6.0 隐藏chunk
- this.model.panos.forEach(function (item) {
- return item.updateMakerStyle();
- });
- }
- }
- }]);
- return DisplayController;
- }(EventEmitter);
- });
- defineComponent('QuickstartManager', function () {
- return /*#__PURE__*/function () {
- function QuickstartManager(qualityManager, scene, camera, controls, panoVideoRenderer) {
- _classCallCheck(this, QuickstartManager);
- this.locked = false;
- this.qualityManager = qualityManager;
- this.scene = scene;
- this.camera = camera;
- this.controls = controls;
- this.quickStartcamera = controls.camera;
- this.view = null;
- this.panoVideoRenderer = panoVideoRenderer;
- this.unlockDom = null;
- this.unlockHanlde = null;
- this.loadPromise = null;
- this.ready = false;
- this.touchStartPosition = new THREE.Vector2(0, 0);
- this.touchMoveDelta = new THREE.Vector2(0, 0);
- this.touchPrevPosition = new THREE.Vector2(0, 0);
- this.touchMoveOffset = new THREE.Vector2(0, 0);
- this.enter = false;
- this.canEnter = false;
- this.animFov = null;
- this.animRotation = null;
- this.initTarget = new THREE.Vector3(0, 0, 0);
- this.enterView = {
- pano: null,
- quaternion: new THREE.Quaternion(),
- position: new THREE.Vector3(),
- fov: settings$3.insideFOV
- };
- }
- _createClass(QuickstartManager, [{
- key: "init",
- value: function init(view, metadata) {
- this.dom = this.$app.core.get('Player').domElement;
- this.pano = view.pano;
- this.setSize(window.innerWidth, window.innerHeight);
- this.initView(view);
- this.skybox = new THREE.Mesh(new THREE.BoxBufferGeometry(1, 1, 1), new ModelTextureMaterial({
- side: THREE.DoubleSide
- }));
- this.skybox.material.uniforms.map.value = view.pano.getSkyboxTexture();
- this.skybox.quaternion.copy(view.quaternion);
- this.scene.add(this.skybox);
- this.skybox.material.depthTest = false;
- this.skybox.material.depthWrite = false;
- this.skybox.renderOrder = 1000;
- this.skybox.name = 'quickStartSkyBox';
- this.skybox.material.uniforms.modelAlpha.value = 0;
- this.skybox.position.copy(this.pano.position);
- this.skybox.visible = true;
- this.scene.add(this.skybox);
- this.pano.attachToPanoVideoRenderer(this.$app.core.get('PanoVideoRenderer'));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.StartPlayVideo, this.onVideoStartPlay.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onVideoRenderResume.bind(this));
- this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onVideoRenderSuspend.bind(this));
- if (this.$app.core.get('PanoVideoRenderer').videosInfo) {
- var parameters = this.$app.core.get('PanoVideoRenderer').videosInfo.parameters;
- 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);
- if (parameters.cameraType == 8) {
- this.skybox.material.defines.HasVideo = 8; //8目
- } else if (parameters.cameraType == 2) {
- this.skybox.material.defines.HasVideo = 2; //2目
- }
- this.skybox.material.defines['VideoMapping'] = parameters.mapping;
- this.skybox.material.uniforms.videoReady.value = 0;
- this.skybox.material.uniforms.progress.value = 1;
- }
- }
- }, {
- key: "initView",
- value: function initView(view) {
- this.view = view;
- var pano = view.pano;
- view.mode;
- view.zoom;
- view.position;
- view.quaternion;
- this.controls.locked = false;
- this.controls.camera.position.copy(pano.position); // zeg 这部分代码使球幕点位初始化的相机旋转变为0
- // if (pano.hasVideo && !view.setByUrl) {
- // if (pano.videoInfo.dir) {
- // this.initTarget.copy(pano.videoInfo.dir).add(pano.position)
- // } else {
- // var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(!this.$app.core.get('Player').model.supportsTiles ? 90 : 180))
- // this.initTarget.copy(Vectors.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion))).add(pano.position)
- // }
- // this.controls.lookAt(this.initTarget)
- // } else {
- this.initTarget.copy(new THREE.Vector3(0, 0, -1).applyQuaternion(view.quaternion)).add(view.position);
- this.controls.lookAt(this.initTarget); // }
- this.quickStartcamera.fov = this.view.fov;
- this.quickStartcamera.aspect = window.innerWidth / window.innerHeight;
- this.quickStartcamera.updateProjectionMatrix();
- this.camera.fov = this.view.fov;
- this.camera.aspect = window.innerWidth / window.innerHeight;
- this.camera.position.copy(this.quickStartcamera.position);
- this.camera.quaternion.copy(this.quickStartcamera.quaternion);
- this.enterView.pano = pano;
- this.enterView.position.copy(this.view.position);
- this.enterView.quaternion.copy(this.view.quaternion);
- this.enterView.fov = this.view.fov;
- this.controls.update(0.016); //xzw 2023.1.18注释
- /* this.controls.locked = true
- this.controls.limitDownAngel = this.controls.lat */
- this.view.position.copy(this.quickStartcamera.position);
- this.view.quaternion.copy(this.quickStartcamera.quaternion);
- }
- }, {
- key: "load",
- value: function load(view) {
- var _this = this;
- if (this.loadPromise) return this.loadPromise;
- var metadata = this.$app.store.__store.metadata;
- this.view = view;
- this.view.pano.shouldRedrawOnBaseLoaded = !0;
- if (this.view.pano.tiled) {
- this.init(view, metadata);
- var $player = document.querySelector('.player[name=main]');
- var lowSize = this.qualityManager.getPanoSize(PanoSizeClass.BASE),
- highSize = this.qualityManager.getPanoSize(PanoSizeClass.STANDARD),
- d = cameraLight.getHFOVForCamera(this.quickStartcamera, $player.clientWidth, $player.clientHeight),
- p = this.quickStartcamera.fov,
- r = Vectors$1.FORWARD.clone().applyQuaternion(this.view.quaternion);
- var promise1 = this.view.pano.loadTiledPano(highSize, r, {
- hFov: d,
- vFov: p
- }, !1, !1, !0);
- var promise2 = this.view.pano.loadTiledPano(lowSize, r.clone().negate(), null, !1, !1, !0);
- this.loadPromise = new Promise(function (resolve) {
- (_this.view.pano.hasVideo || _this.qualityManager.getMaxNavPanoSize() < 1024 ? promise2 : promise1).then(resolve);
- });
- } else {
- this.init(view, metadata);
- this.loadPromise = new Promise(function (resolve) {
- _this.view.pano.hasVideo ? _this.view.pano.loadCube('low').then(function () {
- return resolve();
- }) : _this.view.pano.loadCube('high').then(function () {
- return resolve();
- });
- });
- }
- this.loadPromise.then(function () {
- _this.ready = true;
- _this.skybox.material.setProjectedPanos(_this.view.pano, _this.view.pano); // 此时已经显示初始点位了,所以也需要设置马赛克和滤镜
- _this.$app.core.get('Player').paintEditor.updatePanoPaint(_this.view.pano.id, _this.view.pano.id);
- _this.$app.FilterManager.updatePanoFilters(_this.view.pano, _this.view.pano);
- });
- return this.loadPromise;
- }
- }, {
- key: "onVideoStartPlay",
- value: function onVideoStartPlay() {}
- }, {
- key: "onVideoTextureUpdate",
- value: function onVideoTextureUpdate(texture) {
- this.skybox.material.uniforms.videoTexture.value = texture;
- }
- }, {
- key: "onVideoRenderResume",
- value: function onVideoRenderResume() {
- this.skybox.material.uniforms.videoReady.value = 1; // 暂停背景音乐
- this.$app.Scene.emit('panorama.videorenderer.resumerender');
- }
- }, {
- key: "onVideoRenderSuspend",
- value: function onVideoRenderSuspend() {
- // this.skybox.material.uniforms.videoReady.value = 0 //修改 球幕视频暂停时不要隐藏
- // todo 播放导览时球目视频挂起不恢复背景音乐
- // 播放背景音乐
- this.$app.Scene.emit('panorama.videorenderer.suspendrender');
- }
- }, {
- key: "watingUnlock",
- value: function watingUnlock() {
- var _this2 = this;
- this.locked = true;
- this.controls.locked = true;
- return new Promise(function (resolve) {
- _this2.unlockHanlde = resolve;
- });
- }
- }, {
- key: "autoUnlock",
- value: function autoUnlock() {
- this.locked = false;
- this.app.active = true;
- this.controls.locked = false;
- this.controls.limitDownAngel = null;
- if (this.pano.hasVideo && browser$1.detectIOS()) {
- this.panoVideoRenderer.setMuted(false);
- } else {
- this.panoVideoRenderer.setMuted(true);
- }
- this.panoVideoRenderer.activatePanorama(this.pano);
- return Promise.resolve(true);
- }
- }, {
- key: "activate",
- value: function activate() {
- this.panoVideoRenderer.setMuted(browser$1.urlQueryValue('sound') == '0');
- this.panoVideoRenderer.activatePanorama(this.pano);
- }
- }, {
- key: "unlock",
- value: function unlock(speed) {
- var _this3 = this;
- if (this.enter) {
- this.controls.rotationAcc.set(0, 0);
- return;
- }
- this.enter = true;
- this.app.emit('unlock');
- this.controls.locked = false;
- this.controls.rotationAcc.set(speed.x > 0 ? 0.3 : -0.3, 0);
- this.controls.limitDownAngel = null;
- if (this.animFov) transitions$1.cancel(this.animFov);
- try {
- parent.postMessage({
- num: config.projectNum,
- cmd: 'unlocking',
- isParent: top == self
- }, '*');
- } catch (error) {
- console.error('跨域', error);
- }
- this.animFov = transitions$1.start(lerp.property(this.quickStartcamera, 'fov', 70), 3000, function () {
- _this3.unlockHanlde && _this3.unlockHanlde();
- _this3.locked = false;
- _this3.enter = true;
- _this3.controls.locked = false;
- _this3.controls.rotationAcc.set(0, 0);
- _this3.controls.limitDownAngel = null;
- try {
- parent.postMessage({
- num: config.projectNum,
- cmd: 'unlocked',
- isParent: top == self
- }, '*');
- } catch (error) {
- console.error('跨域', error);
- }
- }, 0.0, easing.easeOutCubic);
- }
- }, {
- key: "exit",
- value: function exit() {
- this.enter = false;
- var pano = this.pano;
- pano.enter();
- this.controls.rotationAcc.set(0, 0);
- this.controls.limitDownAngel = null;
- if (this.animFov) transitions$1.cancel(this.animFov);
- if (this.app.player.model) {
- this.app.player.flyToPano({
- pano: this.pano
- });
- } else {
- this.smoothLookAt(this.initTarget, 1000);
- }
- }
- }, {
- key: "smoothLookAt",
- value: function smoothLookAt(targetLookAt, duration) {
- var _this4 = this;
- duration = duration || 1000;
- var targetDir = targetLookAt.clone().sub(this.controls.camera.position).normalize();
- var currDir = this.controls.lookVector.clone();
- var dir = new THREE.Vector3();
- new THREE.Vector3();
- var lerp = function lerp(alpha) {
- dir.lerpVectors(currDir, targetDir, alpha);
- _this4.controls.lookAt(dir.add(_this4.controls.camera.position));
- };
- this.animFov = transitions$1.start(lerp, duration);
- }
- }, {
- key: "cancelRotate",
- value: function cancelRotate() {
- if (this.enter && this.app.startOption.needUnlock) this.controls.rotationAcc.set(0, 0);
- }
- }, {
- key: "update",
- value: function update(deltaTime) {
- if (this.locked) ;
- this.controls.update(deltaTime);
- this.camera.position.copy(this.quickStartcamera.position);
- this.camera.quaternion.copy(this.quickStartcamera.quaternion);
- this.camera.fov = this.quickStartcamera.fov;
- this.camera.updateProjectionMatrix();
- this.view.position.copy(this.quickStartcamera.position);
- this.view.quaternion.copy(this.quickStartcamera.quaternion);
- this.view.fov = this.quickStartcamera.fov;
- }
- }, {
- key: "setSize",
- value: function setSize(width, height) {
- this.camera.aspect = width / height;
- this.camera.updateProjectionMatrix();
- }
- }, {
- key: "destroy",
- value: function destroy() {
- this.scene.remove(this.skybox);
- this.controls.rotationAcc.set(0, 0); // this.dom.removeEventListener('touchstart', this.cancelRotate)
- // this.unlockDom.removeEventListener('touchstart', this.onTouchStart)
- // this.unlockDom.removeEventListener('touchmove', this.onTouchMove)
- // this.unlockDom.removeEventListener('touchend', this.onTouchEnd)
- } //swiper事件的原因,用于快速切换解锁需要给定dom
- }, {
- key: "attachDom",
- value: function attachDom(dom) {
- dom.addEventListener('touchstart', this.onTouchStart.bind(this));
- dom.addEventListener('touchmove', this.onTouchMove.bind(this));
- dom.addEventListener('touchend', this.onTouchEnd.bind(this));
- }
- }, {
- key: "onTouchEvent",
- value: function onTouchEvent(eventType, event) {
- if (event.type == 'touchstart') {
- this.onTouchStart(event);
- } else if (event.type == 'touchmove') {
- this.onTouchMove(event);
- } else if (event.type == 'touchend') {
- this.onTouchEnd(event);
- }
- }
- }, {
- key: "onTouchStart",
- value: function onTouchStart(event) {
- this.touchStartPosition.set(event.touches[0].clientX, event.touches[0].clientY);
- this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
- this.touchMoveDelta.set(0, 0);
- this.touchMoveOffset.set(0, 0);
- if (this.enter || this.app.needUnlock == false) {
- this.controls.rotationAcc.set(0, 0);
- this.controls.onTouchStart(event);
- } else {
- //this.controls.onTouchStart( event );
- this.canEnter = false;
- }
- this._start = {
- x: event.touches[0].clientX,
- y: event.touches[0].clientY
- };
- }
- }, {
- key: "onTouchMove",
- value: function onTouchMove(event) {
- this._move = {
- x: event.touches[0].clientX,
- y: event.touches[0].clientY
- };
- this.touchMoveDelta.set(event.touches[0].clientX - this.touchPrevPosition.x, event.touches[0].clientY - this.touchPrevPosition.y);
- this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
- this.touchMoveOffset.set(event.touches[0].clientX - this.touchStartPosition.x, event.touches[0].clientY - this.touchStartPosition.y);
- if (this.enter || this.app.needUnlock == false) {
- this.controls.onTouchMove(event);
- } else {
- var speedX = -this.touchMoveDelta.x;
- var slideHor = Math.abs(this.getAngle(this._start, this._move)) < 15; //(Math.abs(this.touchMoveOffset.y) / Math.abs(this.touchMoveOffset.x)) < 0.15
- var canEnter = slideHor && this.enter == false;
- canEnter && this.unlock(new THREE.Vector2(speedX, 0));
- }
- }
- }, {
- key: "onTouchEnd",
- value: function onTouchEnd(event) {
- if (this.enter || this.app.needUnlock == false) {
- this.controls.onTouchEnd(event);
- }
- }
- }, {
- key: "getAngle",
- value: function getAngle(start, end) {
- var diff_x = end.x - start.x,
- diff_y = end.y - start.y;
- return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
- }
- }]);
- return QuickstartManager;
- }();
- });
- var effects$1 = {
- currentBlur: 0,
- aspect: settings$3.aspect,
- blurStrength: 1,
- hblurPass: settings$3.HorizontalBlurShader,
- vblurPass: settings$3.VerticalBlurShader,
- bindEvents(e) {
- e.on(PlayerEvents.ModeChanged, function (mode, t) {
- if (mode === Viewmode$1.PANORAMA) {
- transitions$1.cancel(effects$1.blur);
- transitions$1.cancel(effects$1.addBlur);
- transitions$1.start(effects$1.removeBlur, 500, null, 0, null, 'deblur');
- }
- });
- },
- blur(blur) {
- effects$1.currentBlur = blur;
- var t = blur * effects$1.blurStrength;
- settings$3.VerticalBlurShader.uniforms.v.value = t / 512 * effects$1.aspect;
- settings$3.HorizontalBlurShader.uniforms.h.value = t / 512;
- },
- addBlur(blur) {
- blur = Math.max(blur, effects$1.currentBlur);
- effects$1.blur(blur);
- },
- removeBlur(blur) {
- blur = Math.min(1 - blur, effects$1.currentBlur);
- effects$1.blur(blur);
- }
- };
- effects$1.blur(0);
- var BasicException$1 = function BasicException(message) {
- _classCallCheck(this, BasicException);
- this.message = message;
- };
- 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); }; }
- 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; } }
- var RendererCreationException$1 = /*#__PURE__*/function (_BasicException) {
- _inherits(RendererCreationException, _BasicException);
- var _super = _createSuper$W(RendererCreationException);
- function RendererCreationException(e) {
- _classCallCheck(this, RendererCreationException);
- return _super.call(this, e);
- }
- return RendererCreationException;
- }(BasicException$1);
- 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); }; }
- 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; } }
- var sceneRenderer$3, player$i;
- var hasInit; // zeg加 否则分屏时会重复初始化
- //window.settings = settings
- //window.ifTest = true // 调试不会开启陀螺仪
- //window.VRScreenType="portrait" //: 不分屏,没有空中小球
- //const flickerThreshold = 0.001
- //////======================================================================================
- /*
- 必须 https!!!!!
- 必须 https!!!!!
-
- 必须 https!!!!!
- */
- //////======================================================================================
- var avoidFlicker;
- window.screenFaceOrient = 0;
- var vrPermission = {};
- var vrPermissionCallBack = function vrPermissionCallBack(info1, info2) {
- if (info1 == 'reset') {
- vrPermission = {};
- } else {
- vrPermission[info1] = info2;
- if (Object.keys(vrPermission).length == 2 && (vrPermission.deviceMotion != 'granted' || vrPermission.deviceOrientation != 'granted')) {
- //$alert({content:"运动和方向访问失败", "这会导致画面视角一直固定。您需要完全关闭" + (Config.app ?"App":"此浏览器") + ",然后再次打开,并允许访问运动与方向。"})
- // if (!window.VRScreenNotFull) {
- // $alert({ content: i18n.t('modules.base.vr_fail_reopen_tips') })
- // }
- console.error('运动和方向访问失败');
- }
- }
- };
- var vr = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(vr, _THREE$EventDispatche);
- var _super = _createSuper$V(vr);
- function vr() {
- _classCallCheck(this, vr);
- return _super.call(this);
- }
- _createClass(vr, [{
- key: "Init",
- value: function Init(_sceneRenderer, _player) {
- //初始化 外部使用
- sceneRenderer$3 = _sceneRenderer;
- player$i = _player;
- player$i.VR = this;
- if (!sceneRenderer$3.renderer || sceneRenderer$3.newRenderer || hasInit) return; //还未准备好renderer或已经Init过了
- var vrTexture = common$1.loadTextureFromCache(texture.getImageURL('images/whiteCircle.png'));
- player$i.model.panos.list.forEach(function (pano) {
- pano.createVrMarker(vrTexture, player$i);
- });
- sceneRenderer$3.newRenderer = new vrRenderer(sceneRenderer$3.renderer, sceneRenderer$3, sceneRenderer$3.camera);
- sceneRenderer$3.isHuawei5X = browser$1.detectHUAWEI5X();
- sceneRenderer$3.oldRenderer = sceneRenderer$3.renderer;
- webxr.init(sceneRenderer$3.renderer);
- /* setTimeout(()=>{
- console.log('userAgent', navigator.userAgent || c || window.opera)
- }, 4000) */
- initFlicker();
- if (player$i.$app.config.vr.markerHeight != null && !isNaN(player$i.$app.config.vr.markerHeight)) {
- var height = player$i.$app.config.vr.markerHeight;
- player$i.model.panos.forEach(function (pano) {
- if (!pano.vrMarker) return; //pano.vrMarker.position.y = pano.floorPosition.y + (v != void 0 ? v : pano.height - 0.2)
- pano.vrMarker.position.y = pano.floorPosition.y + height;
- });
- }
- var _vrEnabled = !1; //vr状态是否开启(开启陀螺仪)
- var _vrSplitScreen = false; //是否分屏
- var events = {
- // get aspect
- setSize: function setSize(b, c) {
- sceneRenderer$3.camera.aspect = b / c;
- }
- };
- createCursor(0.5, true, 1, 16777215, 0); //transparent改为true,旧版竟然可以是false
- //if (!settings.hasOwnProperty('vrEnabled')) {
- Object.defineProperty(settings$3, 'vrEnabled', {
- get: function get() {
- return _vrEnabled;
- },
- set: function set(b) {
- b = !!b;
- player$i.emit('vrStateChanged');
- player$i.cameraControls.controls.panorama.locked = b;
- player$i.model.chunks.forEach(function (c) {
- return c.visible = !(b && (webxr.xrType || settings$3.vrSplitScreen));
- }); //vr模式下 改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关。 而一直显示模型会有穿墙危险,所以改为一直不显示模型。// 为什么注释掉了?
- //注: 2022.10.19: 调试pico的webxr时,发现若显示模型,会看出模型轮廓,画面被割裂(原地非过渡)。原因可能是头盔是两个camera,且都与原位置有偏差,所以不在pano中心。(但是之前vr眼镜似乎没有此现象?) 故而关闭模型显示,代价就是过渡时无法贴合模型,多楼层看起来像悬空的。
- if (window.VRScreenType != 'portrait') {
- //普通模式( 不是这种不需要分屏和vrMarker的情况)
- common$1.updateVisible(VR.cursor, 'vr', b);
- sceneRenderer$3.updateScreenSize({
- forceUpdateSize: true
- });
- player$i.model.updateVrMarker(b, player$i); //因为手机chrome现在也能进入xr,但不一定有手柄所以还是先都显示marker
- }
- _vrEnabled = b;
- if (webxr.xrType) {
- return b ? webxr.enterVR() : webxr.leaveVR();
- } else {
- //交换renderer
- b && settings$3.vrSplitScreen ? (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);
- }
- if (!window.VRScreenNotFull) {
- b ? browser$1.requestFullscreen(
- /* player.domElement */
- document.body) : browser$1.exitFullscreen();
- } //是否全屏:!!document.fullscreenElement 注:pico3的xr全屏会黑屏; 部分设备(荣耀magic6)全屏后会自动横屏,orientation为90。 且全屏后调用screen.orientation.lock("portrait-primary") 报错说此设备不支持这个函数
- //2024.9 突然发现在这不update会黑屏
- sceneRenderer$3.updateScreenSize({
- forceUpdateSize: true
- });
- if (!b) {
- var pos = player$i.position;
- var qur = new THREE.Quaternion().copy(player$i.camera.quaternion);
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(qur).add(pos);
- if (lookAtPoint.x == pos.x && lookAtPoint.z == pos.z) {
- console.log('看向正地面时无法lookAt,无法更新camera转向,直接退出vr');
- } else player$i.cameraControls.activeControl.lookAt(lookAtPoint); //退出时更新一下camera的方向
- player$i.viewLinkManager.showAllViews();
- VR.shiftQuaternion = null;
- var index = sceneRenderer$3.resizeListeners.indexOf(events);
- sceneRenderer$3.resizeListeners.splice(index, 1);
- } else {
- player$i.viewLinkManager.hideAllViews();
- sceneRenderer$3.resizeListeners.push(events); //处理失败:
- setTimeout(function () {
- console.log('是否检测到陀螺仪 ' + window.orientEnable);
- if (settings$3.vrEnabled && !window.orientEnable) {
- //很可能没能触发陀螺仪事件
- if (browser$1.detectIOS()
- /* && browser.detectSafari() */
- ) {
- var b = browser$1.iosVersion(); //{major: 10, minor: 3, patch: 1}
- //console.log("开始获取权限 major"+b.major)
- if (b.major == 12 && b.minor >= 2) {
- if (!window.VRScreenNotFull) {
- if (browser$1.detectSafari()) $alert({
- content: i18n.t('modules.base.vr_fail_safari_tips')
- });else {
- //app??
- $alert({
- content: i18n.t('modules.base.vr_fail_app_tips')
- });
- }
- }
- } else if (b.major >= 13) {
- var hasFailed = window.vrPermission && (window.vrPermission.deviceMotion != 'granted' || window.vrPermission.deviceOrientation != 'granted'); //hasFailed || $tips({content: i18n.t('modules.base.please_click_tips')})
- setTimeout(function () {
- if (!settings$3.vrEnabled || window.orientEnable) return;
- vrPermissionCallBack('reset');
- if (window.DeviceMotionEvent && window.DeviceMotionEvent.requestPermission && typeof window.DeviceMotionEvent.requestPermission === 'function') {
- console.log('开始获取权限1'); ///注意:需要https 本地服务器permissionState会得到denied
- window.DeviceMotionEvent.requestPermission().then(function (permissionState) {
- console.log('permissionState1: ' + permissionState);
- vrPermissionCallBack('deviceMotion', permissionState);
- }).catch(function (e) {
- vrPermissionCallBack('deviceMotion', false);
- console.log(e);
- });
- } else {
- console.log('window.DeviceMotionEvent undefined');
- vrPermissionCallBack('deviceMotion', false);
- }
- if (window.DeviceOrientationEvent && window.DeviceOrientationEvent.requestPermission && typeof window.DeviceOrientationEvent.requestPermission === 'function') {
- console.log('开始获取权限2');
- window.DeviceOrientationEvent.requestPermission().then(function (permissionState) {
- console.log('permissionState2: ' + permissionState);
- vrPermissionCallBack('deviceOrientation', permissionState);
- }).catch(function (e) {
- vrPermissionCallBack('deviceOrientation', false);
- console.log(e);
- });
- } else {
- console.log('window.DeviceOrientationEvent undefined');
- vrPermissionCallBack('deviceOrientation', false);
- }
- }, hasFailed ? 0 : 150);
- /* /* setTimeout(function(){
- if(settings.vrEnabled && !window.orientEnable){
- $alert("若画面视角一直固定,您需要完全关闭Safari浏览器,然后再次打开以开启运动和方向访问。")
- }
- },4000) */
- } else console.log('陀螺仪似乎未能启用 ios ' + b.major + '.' + b.minor);
- }
- }
- }, 200);
- }
- }
- });
- Object.defineProperty(settings$3, 'vrSplitScreen', {
- //分屏 许钟文加
- get: function get() {
- return _vrSplitScreen;
- },
- set: function set(b) {
- b = !!b;
- if (_vrSplitScreen == b || webxr.xrType) return;
- _vrSplitScreen = b;
- if (!settings$3.vrEnabled || window.VRScreenType == 'portrait') return;
- player$i.emit('vrStateChanged');
- 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);
- player$i.model.chunks.forEach(function (c) {
- return c.visible = !b;
- });
- sceneRenderer$3.updateScreenSize({
- forceUpdateSize: true
- }); //sceneRenderer.setSize(window.innerWidth, window.innerHeight)//不这么写因刚旋转时 window.innerWidth, window.innerHeight 不准确
- //console.log('vrSplitScreen', b, window.innerWidth, window.innerHeight, player.domElement.clientWidth, player.domElement.clientHeight)
- }
- }); //}
- if (window.orientation == 90 || window.orientation == 270) {
- //横屏
- settings$3.vrSplitScreen = true;
- }
- window.addEventListener('orientationchange', function (e) {
- console.log("vr orientation ".concat(window.orientation));
- if (window.orientation == 0 || window.orientation == 180) {
- //竖屏
- settings$3.vrSplitScreen = false;
- } else {
- settings$3.vrSplitScreen = true;
- }
- });
- hasInit = true;
- }
- }, {
- key: "isSupportXR",
- value: function isSupportXR() {
- return !!webxr.xrType;
- }
- }]);
- return vr;
- }(THREE.EventDispatcher);
- var VR;
- window.VR = VR = new vr(); //vr对焦
- var createCursor = function createCursor(a, b, c, d, e) {
- var g,
- h = new THREE.SpriteMaterial({
- opacity: c,
- color: d,
- transparent: b,
- map: boluoloadTextureFromCache(texture.getImageURL('images/vrCursor.png')),
- side: THREE.DoubleSide
- });
- h.map.offset = new THREE.Vector2(1 / 17 * e, 0);
- h.map.repeat = new THREE.Vector2(1 / 17, 1);
- h.depthTest = !1, h.blending = THREE.AdditiveBlending;
- g = new THREE.Sprite(h);
- g.scale.set(a, a, a);
- g.position.z = -5, g.visible = !1, g.name = 'cursor', g.renderOrder = RenderOrder.panoMarker; //add
- sceneRenderer$3.camera.add(g);
- sceneRenderer$3.scene.add(sceneRenderer$3.camera);
- VR.cursor = g;
- var i = new VROrientation(sceneRenderer$3.scene, g, sceneRenderer$3.camera);
- VR.cursor.triggerTargetEvent = i.triggerTargetEvent.bind(i), sceneRenderer$3.updateListeners = [i].concat(sceneRenderer$3.updateListeners); //before player
- };
- window.orientEnable = 0; //是否能触发deviceorientation
- var VROrientation = function VROrientation(a, b, c) {
- var _this2 = this;
- function d() {
- g.orient = THREE.MathUtils.degToRad(window.orientation || 0);
- }
- var updateRot = function updateRot(a) {
- //deviceorientation 需要https
- if (!settings$3.vrEnabled && window.orientEnable) return;
- window.orientEnable || (window.orientEnable = 1); //if(this.alpha == a.alpha || this.beta == a.beta || this.gamma == a.gamma)return;
- var b = THREE.MathUtils.degToRad(a.alpha),
- c = THREE.MathUtils.degToRad(a.beta),
- d = THREE.MathUtils.degToRad(a.gamma); //console.log(a.alpha.toFixed(3), c.toFixed(3), a.gamma.toFixed(3))
- //console.log((b-this.alpha).toFixed(3), (c-this.beta).toFixed(3), (d-this.gamma).toFixed(3))
- if (_this2.isHuawei5X) {
- -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);
- } else {
- _this2.alpha = b, _this2.beta = c, _this2.gamma = d;
- }
- /* if ( SceneRenderer.vrDebug ) {
- $("#info-device-orientation").css("display", "block");
- var e = "";
- e += "alpha=(" + g.alpha + ")<BR/>",
- e += "beta=(" + g.beta + ")<BR/>",
- e += "gamma=" + g.gamma + "<BR/>",
- document.getElementById("info-device-orientation").innerHTML = e
- } */
- };
- this.cursor = b, this.raycaster = new THREE.Raycaster(), this.targetEventObj = {}, this.type = 1, this.canStartAnimation = !0;
- var g = this;
- 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) {
- if (alpha == -1000) return; // 利用player.updatefromControl来最终更新camera
- var aimQua = quaternion.clone();
- g.euler.set(beta, alpha, -gamma, 'YXZ');
- aimQua.setFromEuler(g.euler);
- aimQua.multiply(g.q1);
- aimQua.multiply(g.q0.setFromAxisAngle(g.zee, -f));
- var diffAngle = this.lastQua.angleTo(aimQua);
- if (diffAngle < 1e-7) return; //防抖:
- if (avoidFlicker && VR.shiftQuaternion) {
- quaternion.copy(this.lastQua);
- var useRatio = math$2.linearClamp(diffAngle, avoidFlicker.threshold.min, avoidFlicker.threshold.max, avoidFlicker.useRatio, 0.9); //越小越延迟
- //const useRatio = diffAngle > avoidFlicker.threshold ? 1 : avoidFlicker.useRatio //越小越延迟
- lerp.quaternion(quaternion, aimQua)(useRatio); //diffAngle > avoidFlicker.threshold.min && console.log(useRatio)
- } else {
- quaternion.copy(aimQua);
- }
- this.lastQua.copy(quaternion);
- if (VR.shiftQuaternion == void 0) {
- //标记初始水平朝向(进入vr时的)
- var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$i.camera.quaternion); //初始的相机对应的朝向
- dir.setY(0).normalize(); //水平
- var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
- var startQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat);
- var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //初始的陀螺仪对应的朝向
- dir2.setY(0).normalize(); //水平
- var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
- var invertQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat2).invert();
- VR.shiftQuaternion = startQuaternion.clone().premultiply(invertQuaternion); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
- }
- quaternion.premultiply(VR.shiftQuaternion);
- updateScreenFaceOrient(quaternion);
- };
- parent !== window && window.addEventListener('message', function (a) {
- //针对iframe的??
- if (!a.data || a.data && a.data.type && a.data.type.indexOf('webpack') > -1) {
- return;
- }
- var b = typeof a.data == 'string' ? JSON.parse(a.data) : a.data,
- c = -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
- b && b.alpha && b.beta && b.gamma && function (a) {
- var c = THREE.MathUtils.degToRad(b.alpha),
- d = THREE.MathUtils.degToRad(b.beta),
- e = THREE.MathUtils.degToRad(b.gamma);
- 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);
- }(c);
- }), this.update = function (a) {
- TWEEN.update();
- if (settings$3.vrEnabled) {
- if (window.ifTest) this.triggerTargetEvent(); //测试时不根据陀螺仪来转向
- else {
- webxr.xrType || this.setObjectQuaternion(player$i.cameraControls.activeControl.camera.quaternion
- /* this.target.quaternion */
- , this.alpha, this.beta, this.gamma, this.orient);
- this.triggerTargetEvent();
- }
- }
- }, this.triggerTargetEvent = function () {
- if (webxr.hasHandel) return; //判断vr cursor是否选中物体
- var a = this.choseObj(),
- b = a ? a.object : void 0;
- this.targetEventObj.currentObj = b;
- b !== this.targetEventObj.lastObj && (b && this.autoCursorPosition(a), 1 === this.type ? (this.cursorAnimate && this.cursorAnimate.stop(), b && b.enabled && this.startAnimate(function () {
- this.clickCallback(b);
- }.bind(this))) : this.type, this.targetEventObj.lastObj = b);
- }, this.choseObj = function () {
- this.raycaster.setFromCamera({
- x: 0,
- y: 0
- }, c);
- var b = this.raycaster.intersectObjects(player$i.model.vrMarkers.filter(function (e) {
- return e.visible;
- }));
- if (b.length > 0) return b[0];
- }, this.clickCallback = function (a) {
- //this.runTHREEAction(a, 'onclick')
- a.dispatchEvent('click');
- }, this.startAnimate = function (a) {
- //vr cursor's circle animation
- this.canStartAnimation && this.initAnimation(a);
- }, this.initAnimation = function (done) {
- var b = this,
- offset = this.cursor.material.map.offset,
- f = function f(a) {
- return Math.floor(17 * a) / 17; //对应17个精灵图片段
- };
- b.canStartAnimation = !1, this.cursorAnimate = new TWEEN.Tween(offset).to({
- x: 1 //100%
- }, 1e3).onStart(function () {
- b.canStartAnimation = !1;
- }).onStop(function () {
- b.canStartAnimation = !0, this.x = 0, offset.x = 0;
- }).onUpdate(function () {}).onComplete(function () {
- done(), offset.x = 0, setTimeout(function () {
- b.canStartAnimation = !0;
- }, 1500);
- }), this.cursorAnimate.easing(f), this.cursorAnimate.start();
- }, this.autoCursorPosition = function (a) {
- var b = Math.abs(a.distance - 10);
- this.cursor.position.z = -b, b /= 10, this.cursor.scale.set(b, b, b);
- };
- };
- /* 为分屏重新创建了个renderer,分别渲染左右两个矩形区域,对应左右相机。
- 替换sceneRenderer.renderer即可
- */
- var vrRenderer = function vrRenderer(renderer, sceneRenderer, camera) {
- // vrRenderer类
- var VRCamera = new vrCamera(camera); //d
- window.VRCamera = VRCamera;
- VRCamera.bananaAspect = 0.8, this.width, this.height;
- this.name = 'vrRenderer';
- var b = this;
- this.setSize = function (c, d) {
- renderer.setSize.call(this, c, d
- /* , false */
- ), b.width = c, b.height = d;
- };
- this.render = function (b, c, e, f) {
- var g, h;
- if (c.__RESS__SKIP__STEREO__) {
- var V = renderer.autoClear;
- renderer.autoClear = !1;
- renderer.setRenderTarget(e);
- if (f) renderer.clear();
- renderer.render(b, c);
- renderer.setRenderTarget(null);
- renderer.autoClear = V;
- return; // renderer.render(b, c, e, f)
- }
- if ('PerspectiveCamera' === c.type) g = VRCamera.cameraL, h = VRCamera.cameraR, b.updateMatrixWorld(), null === c.parent && c.updateMatrixWorld(), VRCamera.vrCameraUpdate(c);else {
- if ('OrthographicCamera' !== c.type) return DEBUG && console.error('Unsupported renderer: ', c.type);
- g = h = c;
- }
- 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);
- };
- this.__proto__ = {
- //? 这句会使sceneRenderer.renderer指向这个vrRenderer
- __proto__: renderer
- };
- };
- var vrCamera = function vrCamera(a) {
- 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', {
- //这个为什么不是随着画面的比例?
- get: function get() {
- return this._aspect;
- },
- set: function set(a) {
- this._aspect !== a && (this.vrCameraNeedsUpdate = !0), this._aspect = a;
- }
- }), Object.defineProperty(this, 'overlap', {
- //瞳距
- get: function get() {
- return this._overlap;
- },
- set: function set(a) {
- this._overlap !== a && (this.vrCameraNeedsUpdate = !0), this._overlap = a;
- }
- }), this.vrCameraUpdate = function (a) {
- 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) {
- this.vrCameraNeedsUpdate = !1, this.bananaFocus = a.focus, this.bananaFov = 50 //a.fov, 原本用的player.camera的fov应该是50,但这里player.camera设置了70,会让镜头变窄
- ;
- this.bananaReal_aspect = a.aspect * this.bananaAspect, this.bananaNear = a.near, this.bananaFar = a.far, this.bananaFocus = 10;
- var left,
- right,
- d = a.projectionMatrix.clone(),
- e = this.overlap / 2,
- shift = e * this.bananaNear / this.bananaFocus,
- //bananaFocus是焦距吗
- top = this.bananaNear * Math.tan(Math.PI / 180 * this.bananaFov * 0.5);
- this.eyeLeft.elements[12] = -e, this.eyeRight.elements[12] = e, left = -top * this.bananaReal_aspect + shift, right = top * this.bananaReal_aspect + shift;
- d.elements[0] = 2 * this.bananaNear / (right - left); //只改左右,不改上下,所以虽然bananaReal_aspect可能和原来一样,但调了vfov就会直接影响hfov
- d.elements[8] = (right + left) / (right - left);
- this.cameraL.projectionMatrix.copy(d);
- left = -top * this.bananaReal_aspect - shift, right = top * this.bananaReal_aspect - shift;
- d.elements[0] = 2 * this.bananaNear / (right - left);
- d.elements[8] = (right + left) / (right - left);
- this.cameraR.projectionMatrix.copy(d);
- }
- this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(this.eyeLeft), this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(this.eyeRight);
- };
- };
- var boluoloadTextureFromCache = function boluoloadTextureFromCache(a) {
- var b = new THREE.TextureLoader();
- return b.crossOrigin = 'anonymous', b.load(a);
- };
- /* bus.on("orientation", () => {
- console.log(`vr orientation ${window.orientation}`)
- if(window.orientation== 0||window.orientation==180) { //竖屏
- settings.vrSplitScreen = false
- }else{
- settings.vrSplitScreen = true
- }
- }) */
- var webxr = {
- init(renderer) {
- var _this3 = this;
- this.renderer = renderer;
- renderer.xr.enabled = true;
- var xr = this.renderer.xr;
- var cameraVR = xr.getCamera();
- var makeit = function makeit() {
- //xr存在
- VR.cursor.parent.remove(VR.cursor);
- cameraVR.add(VR.cursor);
- sceneRenderer$3.scene.add(cameraVR);
- /* cameraVR.layers.enable(RenderLayers.RETICULE)
- cameraVR.cameras.forEach(camera=>{//实际渲染的是这两个camera
- camera.layers.enable(RenderLayers.RETICULE)
- }) */
- _this3.initHandler();
- player$i.on('update', function (e) {
- if (_this3.entered && _this3.hasHandel && (e.hasChanged.cameraChanged2 || e.hasChanged.vrHandlerMoved)) {
- _this3.setHandlerLength(player$i.intersect);
- player$i.reticule.move(null, null, false); //console.log('reticule move')
- }
- });
- };
- if ('xr' in navigator && 'isSessionSupported' in navigator.xr) {
- //pico firefox 、 安卓手机chrome
- var mode = 'immersive-vr';
- navigator.xr.isSessionSupported(mode).then(function (supported) {
- //会触发chrome请求下载VR服务
- if (!supported) {
- _this3.xrNotFound('isSessionSupported not supported');
- } else {
- _this3.xrType = 'xr'; //showEnterXR();
- makeit();
- }
- }).catch(this.xrNotFound.bind(this, 'isSessionSupported error'));
- } else if ('getVRDisplays' in navigator) {
- //pico 的vr browser是这个 但该版本已被废弃,没有可供的浏览器可以调试
- console.log('\n getVRDisplays!!!!!!!!!\n \n \n ');
- var setDevice = function setDevice(device) {
- _this3.xrType = 'vr';
- _this3.device = device;
- _this3.renderer.xr.setDevice(device); //新版是renderer.vr
- makeit();
- };
- window.addEventListener('vrdisplayconnect', function (event) {
- setDevice(event.display);
- }, false);
- window.addEventListener('vrdisplaydisconnect', function () {
- console.log('vrdisplaydisconnect');
- }, false);
- window.addEventListener('vrdisplaypresentchange', function (event) {
- console.log('vrdisplaypresentchange', event.display.isPresenting ? 'EXIT VR' : 'ENTER VR');
- _this3.callback(!!event.display.isPresenting);
- }, false);
- window.addEventListener('vrdisplayactivate', function (event) {
- event.display.requestPresent([{
- source: this.renderer.domElement
- }]);
- }, false);
- navigator.getVRDisplays().then(function (displays) {
- if (displays.length > 0) {
- setDevice(displays[0]);
- } else {
- this.xrNotFound('no displays');
- }
- }).catch(this.xrNotFound.bind(this, 'getVRDisplays error'));
- } else {
- this.xrNotFound('xr not supported');
- }
- {
- //修改three源代码:
- var originUpdateCamera = xr.updateCamera;
- var _this = this;
- xr.updateCamera = function (camera) {
- //sceneRenderer.camera
- //if (!_this.tranCamMatrix) {
- //初始化,获取转换矩阵
- originUpdateCamera(camera); //第一次计算得到的CameraVR的pose是未转换过的device的pose (注意:万一按了reset pose需要重新初始化device的pose,有reset事件吗)
- _this.getShiftPosMat(cameraVR.position); //本来以为local模式下设备是不会位移的,结果居然会,所以需要一直更新devicePos,以及转换函数
- _this.getTranCamMatrix(cameraVR.position, cameraVR.quaternion); //new THREE.Matrix4().multiplyMatrices(originMatrix, cameraVR.matrixWorld.clone().invert()),
- //}
- cameraVR.cameras[0].matrix.premultiply(_this.tranCamMatrix);
- cameraVR.cameras[1].matrix.premultiply(_this.tranCamMatrix);
- cameraVR.cameras.concat([cameraVR]).forEach(function (camera) {
- //实际渲染的是两个cameras
- camera.layers.mask = player$i.camera.layers.mask;
- });
- originUpdateCamera(camera); //根据cameraL和cameraR重算cameraVR matrixWorld
- //还需要将cameraVR同步到camera的,因为originUpdateCamera写的不太好,在半中间同步
- //camera.position.copy(cameraVR.position);
- camera.quaternion.copy(cameraVR.quaternion); //camera.scale.copy(cameraVR.scale);
- //camera.matrix.copy(cameraVR.matrix);
- //camera.matrixWorld.copy(cameraVR.matrixWorld);
- player$i.quaternion.copy(cameraVR.quaternion); //这步不写的话方向有问题贴图模糊
- //player.position.copy(cameraVR.position);
- //另外fov放大了,需要一致吗。但用的不是camera.fov, 搜topFov
- camera.updateMatrixWorld(); //for choseObj
- //updateScreenFaceOrient(cameraVR.quaternion)
- };
- player$i.on('update', function (e) {
- //飞向下一个点时,因相机移动了而设备位置不能移动,相对位置改变,要重新绑定位置矩阵
- if (!_this3.entered) return;
- if (e.hasChanged.moved && _this3.devicePos) {
- _this3.getShiftPosMat(_this3.devicePos);
- _this3.getTranCamMatrix();
- }
- });
- }
- },
- enterVR() {
- var _this4 = this;
- if (!this.xrType) return; //不支持
- console.log('enterVR', this.xrType);
- browser$1.exitFullscreen();
- if (this.xrType == 'vr') {
- this.device.isPresenting ? this.device.exitPresent() : this.device.requestPresent([{
- source: renderer.domElement
- }]);
- } else if (this.xrType == 'xr') {
- if (this.currentSession == void 0) {
- //console.log('this.currentSession == void 0 ')
- var getXRSessionInit = function getXRSessionInit(mode, options) {
- var space = (options || {}).referenceSpaceType || 'local-floor';
- var sessionInit = options && options.sessionInit || {}; // Nothing to do for default features.
- if (space == 'viewer') return sessionInit;
- 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.
- if (sessionInit.optionalFeatures && sessionInit.optionalFeatures.includes(space)) return sessionInit;
- 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
- // of the user-supplied sessionInit requiredFeatures (if any) to ensure it's valid to
- // request it later.
- var newInit = Object.assign({}, sessionInit);
- newInit.requiredFeatures = [space];
- if (sessionInit.requiredFeatures) {
- newInit.requiredFeatures = newInit.requiredFeatures.concat(sessionInit.requiredFeatures);
- }
- return newInit;
- };
- var onSessionEnded = function onSessionEnded() {
- console.log('onSessionEnded');
- _this4.currentSession.removeEventListener('end', onSessionEnded);
- setTimeout(function () {
- _this4.renderer.xr.setSession(null);
- _this4.currentSession = null;
- _this4.callback(false);
- }, 1); //延迟原因:先使THREE里的onSessionEnded执行
- };
- var onReset = function onReset() {
- console.log('onReset');
- };
- var onSessionStarted = function onSessionStarted(session) {
- console.log('onSessionStarted');
- /* var attributes = this.renderer.getContextAttributes();
- console.log('xrCompatible', attributes.xrCompatible) */
- session.addEventListener('end', onSessionEnded);
- session.addEventListener('reset', onReset); //在空间被重置时触发,例如,用户校准 XR 设备或 XR 设备重连后自动切回原点。
- _this4.renderer.xr.setSession(session);
- _this4.currentSession = session;
- _this4.callback(true);
- };
- var mode = 'immersive-vr';
- var sessionInit = getXRSessionInit(mode);
- navigator.xr.requestSession(mode, sessionInit).then(onSessionStarted);
- } else {
- console.log('this.currentSession.end()', this.currentSession);
- this.currentSession.end();
- } //为何我看到模拟器可以移动?但是并没有设置为bound
- }
- },
- leaveVR() {
- if (this.xrType == 'xr') {
- this.currentSession && this.currentSession.end();
- } else if (this.xrType == 'vr') ;
- },
- switchRender(state) {
- //xr暂停原先sceneRenderer中的animate loop
- if (state) {
- console.log('switchRender', state);
- this.renderer.setAnimationLoop(function () {
- //必须使用setAnimationLoop来渲染才能有画面
- sceneRenderer$3.animate({
- byOther: true
- });
- });
- sceneRenderer$3.started = false;
- } else {
- this.renderer.setAnimationLoop(null);
- sceneRenderer$3.started = true;
- sceneRenderer$3.animate();
- }
- },
- callback(isEnter) {
- //开启或关闭之后
- isEnter = !!isEnter;
- if (isEnter) ; else {
- settings$3.vrEnabled = false; //由系统关闭的话,需要执行一下这句,确保一些东西关闭
- this.tranCamMatrix = this.shiftQuaMat = this.shiftPosMat = null;
- }
- this.switchRender(isEnter);
- common$1.updateVisible(this.handler, 'enterXR', isEnter);
- this.entered = isEnter;
- console.log('webxrEntered', isEnter);
- player$i.$app.Scene.emit('webxrEntered', isEnter);
- },
- xrNotFound(text1, text2) {
- console.error('xrNotFound:', text1, text2);
- },
- //求陀螺仪相机和player相机的转换矩阵
- getShiftQuaMat(deviceQua) {
- //根据初始的player的quaternion和设备陀螺仪的quaternion做一个绑定,得水平quaternion差
- var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$i.quaternion
- /* player.cameraControls.activeControl.camera.quaternion */
- ); //初始的相机对应的朝向
- dir.setY(0).normalize(); //水平
- var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
- var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(deviceQua); //初始的陀螺仪对应的朝向
- dir2.setY(0).normalize(); //水平
- var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
- this.shiftQuaMat = mat.clone().premultiply(mat2.clone().invert()); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
- },
- getShiftPosMat(devicePos) {
- this.shiftPosMat1 = new THREE.Matrix4().setPosition(devicePos.clone().negate());
- this.shiftPosMat2 = new THREE.Matrix4().setPosition(player$i.position.clone());
- this.devicePos = devicePos.clone(); //记录,下次可以直接使用
- },
- getTranCamMatrix(devicePos, deviceQua, reverse) {
- if (!this.shiftQuaMat && !deviceQua || !this.shiftPosMat1 && !devicePos) return;
- if (!this.shiftQuaMat) this.getShiftQuaMat(deviceQua);
- if (!this.shiftPosMat1) this.getShiftPosMat(devicePos); //先移到原点,再旋转,再移到终点
- this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftQuaMat, this.shiftPosMat1);
- this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftPosMat2, this.tranCamMatrix); //this.controller1.children[0].matrix.copy(this.tranCamMatrix)
- },
- initHandler() {
- var _this5 = this;
- console.log('initHandler');
- var isChrome = /Chrome/i.test(navigator.userAgent);
- var minAngleTorler = THREE.MathUtils.degToRad(5);
- var controller0 = this.renderer.xr.getController(0); //right //WebXRController._targetRay
- var controller1 = this.renderer.xr.getController(1); //left
- controller0.name = 'controller0-right';
- controller1.name = 'controller1-left';
- var material = new THREE.MeshBasicMaterial({
- color: '#ffffff',
- opacity: 0.5,
- transparent: true,
- depthTest: false,
- depthWrite: false
- });
- var stem = new THREE.Mesh(new THREE.BoxBufferGeometry(0.01, 0.01, 1), material);
- var translateMatrix = new THREE.Matrix4().makeTranslation(0, 0, -0.5); //使一端居于原点
- stem.geometry.applyMatrix4(translateMatrix);
- var sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.03, 6, 5), material);
- sphere.position.set(0, 0, -1);
- var handler = new THREE.Object3D();
- handler.add(stem);
- handler.add(sphere);
- handler.matrixAutoUpdate = false;
- handler.name = 'handler';
- common$1.updateVisible(handler, 'enterXR', false);
- isChrome && common$1.updateVisible(handler, 'supportHandler', false); //可能是手机安装了VR框架,但无头盔无手柄
- sceneRenderer$3.scene.add(handler);
- this.handler = handler;
- this.handler.lastMatrix = this.handler.matrix.clone();
- var currentControl = controller0;
- var handelConfirmed = function handelConfirmed() {
- if (_this5.hasHandel) return; //是否包含手柄 有的话就不需要vrmarker等
- common$1.updateVisible(handler, 'supportHandler', true);
- player$i.model.panos.forEach(function (e) {
- return e.vrMarker && common$1.updateVisible(e.vrMarker, 'supportHandler', false);
- });
- common$1.updateVisible(VR.cursor, 'supportHandler', false);
- _this5.hasHandel = true;
- };
- var init = function init(control) {
- var selectStartQua, selectStartTime;
- control.addEventListener('selectstart', function (e) {
- //相当于pointerdown 前面的按键
- if (currentControl != control) {
- currentControl = control;
- console.log('切换control', control.name);
- }
- handelConfirmed();
- selectStartQua = control.quaternion.clone();
- selectStartTime = Date.now();
- });
- control.addEventListener('selectend', function (e) {
- //相当于pointerup
- //console.log('selectend')
- var selectEndQua = control.quaternion.clone();
- var selectEndTime = Date.now();
- if (selectEndTime - selectStartTime < 1000 && selectEndQua.angleTo(selectStartQua) < minAngleTorler) {
- //if (player.intersect) {
- return player$i.flyToPanoClosestToMouse(); //} else console.log('no intersect')
- } //最好执行updateIntersect, 且延长handle到intersect
- });
- /* control.addEventListener("squeezestart",(e)=>{//旁边的按键
- console.log('squeezestart', control.name) //是否用这个来充当滚轮?但是vr真实视觉一般不适合放大
- }) */
- control.addEventListener('connected', function (e) {
- //进入xr会执行
- console.log('connected', control.name);
- });
- control.addEventListener('disconnected', function (e) {
- //退出xr时会执行
- console.log('disconnected', control.name);
- });
- var update = function update() {
- if (currentControl != control) return;
- _this5.handler.lastMatrix = _this5.handler.matrix.clone();
- _this5.tranCamMatrix || new THREE.Matrix4();
- _this5.tranCamMatrix && _this5.handler.matrix.copy(control.matrix).premultiply(_this5.tranCamMatrix);
- _this5.handler.matrix.decompose(_this5.handler.position, _this5.handler.quaternion, new THREE.Vector3()); //console.log('handle update', this.handler.position.toArray() )
- //material.opacity = player.reticule.material.uniforms.opacity.value
- }; //google vr服务即使没有手柄也会不停执行update,位置还会变
- //为何模拟器中手柄的旋转和渲染出的不同,模拟器中显示0,0,0, 实际是-0.49,0,0,模拟器的bug?
- control.addEventListener('move', update);
- update();
- };
- init(controller0);
- init(controller1);
- },
- handlerMoved() {
- return this.hasHandel && !this.handler.lastMatrix.equals(this.handler.matrix);
- },
- setRayCaster(raycaster) {
- //console.log('dir',dir)
- raycaster.set(this.handler.position, this.getHandlerDir());
- },
- getHandlerDir() {
- return new THREE.Vector3(0, 0, -1).applyQuaternion(this.handler.quaternion);
- },
- setHandlerLength(intersect) {
- if (!intersect) return;
- this.handler.children[0].scale.z = intersect.distance;
- this.handler.children[1].position.set(0, 0, -intersect.distance);
- }
- };
- VR.webxr = webxr;
- /*
- see:
- https://immersiveweb.dev/
- https://github.com/immersive-web/webxr/blob/master/explainer.md
- https://blog.csdn.net/zhaoxinyao9/article/details/126290815 (中文)
- domo:https://www.4dmodel.com/test/webxr/
- 目前 XRReferenceSpaceType 分为 5 种类型,分别如下。
- viewer 表示具有原生原点的跟踪空间,一般用于不进行任何跟踪场景,任何设备都应该支持该类型
- local 表示只跟踪用户旋转,不跟踪位置,可以理解为坐下,只用头部来观看场景
- local-floor 与 local 类型相似,但是它是站立着的
- bounded-floor 表示在安全区内跟踪旋转和位置,用户可以完全与场景进行交互
- unbounded 表示用户可以自由在场景中移动和旋转,没有安全区限制
-
-
-
- 还可以改进的地方:
- 摇杆控制方向,向左向右旋转、向前进或者fov放大。直接加载4k。 似乎加载图有点慢?loading的三个球画一下。squeeze可以加功能。
- disconnected的情况有哪些
-
-
-
-
-
- 参考的门户网站:
- 除了720外
- https://www.ivrpano.com/p/a4135859726628b7?_s=56eadc3a2da6c16b
-
-
- pico2 vr browser:
- webxr案例用的three版本是111dev,而目前v4用的是143?,不知为何新版本会报错:
- cannot create XRWebGLLayer before first calling makeXRCompatible
- https://github.com/MozillaReality/FirefoxReality/issues/3420该网页提示升级firefox到10.1即可,故等升级中
-
-
-
- 头盔需不需要换成4k?(很难知道是不是头盔) 但害怕会卡 ?屏幕像素支不支持这么高清。
- */
- function initFlicker() {
- //设置防抖
- var list = [// userAgent列表
- {
- name: 'nova 10z',
- //设备名称
- //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案例,不同浏览器不同
- //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
- //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
- words: ['CHA-AL80', '537.36'],
- threshold: {
- min: 0.005,
- max: 0.7
- },
- //变化大于这个角度不延迟, 为了防止移动过慢。只在相对静止要对准时防抖。
- useRatio: 0.2 //越低代表抖动越强 //该设备平放桌面都在抖动 alpha等幅度0.02, 还有陀螺仪不准,有时转到背面画面还在当前。贝壳更是转不动。测过三个浏览器均是。可能是设备陀螺仪损坏
- } //仍有的缺陷:因为移动延迟,对焦有点困难。
- ];
- var agent = window.navigator.userAgent;
- for (var i = 0, j = list.length; i < j; i++) {
- var item = list[i];
- if (!item.words.some(function (word) {
- return !agent.includes(word);
- })) {
- //每个word都在agent中存在
- avoidFlicker = item;
- break;
- }
- } //avoidFlicker = list[0]
- if (!avoidFlicker) {
- //给个默认 一点点的防抖 (对iphoneX表现有较明显的提升)
- avoidFlicker = {
- name: 'default',
- threshold: {
- min: 0.01,
- max: 0.3
- },
- useRatio: 0.5 //越低代表抖动越强
- };
- } //console.log('initFlicker', window.navigator.userAgent )
- }
- function updateScreenFaceOrient(quaternion) {
- if (!settings$3.vrSplitScreen) {
- var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //相机方向,也是屏幕旋转轴
- player$i.camera.lookAt(player$i.camera.position.clone().add(dir)); //window.screenFaceOrient = THREE.MathUtils.radToDeg(player.camera.quaternion.angleTo(quaternion))
- var dirCamera1 = new THREE.Vector3(1, 0, 0).applyQuaternion(quaternion); //相机横轴被旋转后的方向(如果得到的y还是0,说明没有歪)
- var dirCamera2 = new THREE.Vector3(1, 0, 0).applyQuaternion(player$i.camera.quaternion); //相机横轴被旋转后的方向(这里得到的y是0)
- window.screenFaceOrient = THREE.MathUtils.radToDeg(dirCamera1.angleTo(dirCamera2));
- var crossAxis = dirCamera1.clone().cross(dirCamera2); // 通过朝dir还是-dir来判断逆时针还是顺时针
- if (crossAxis.dot(dir) < 0) {
- window.screenFaceOrient *= -1;
- }
- }
- }
- var VR$1 = VR;
- 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); }; }
- 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; } }
- var player$h,
- sceneRenderer$2,
- miniDom;
- var size$3 = {
- w: 200,
- h: 200,
- right: 60,
- top: 103
- };
- new THREE.RawShaderMaterial({
- vertexShader: "\n attribute vec3 position;\n void main() { gl_Position = vec4( position, 1.0 );} \n ",
- fragmentShader: "\n void main() { gl_FragColor = vec4( 0., 0., 0., 0.1); }\n ",
- transparent: true,
- depthWrite: false
- });
- var planeGeo$2 = new THREE.PlaneBufferGeometry(1, 1); //dollhouse模式小窗
- var MiniDollhouse = /*#__PURE__*/function (_Viewport) {
- _inherits(MiniDollhouse, _Viewport);
- var _super = _createSuper$U(MiniDollhouse);
- function MiniDollhouse(player_, sceneRenderer_, miniDom_) {
- var _this;
- _classCallCheck(this, MiniDollhouse);
- player$h = player_;
- miniDom = miniDom_;
- sceneRenderer$2 = sceneRenderer_;
- var camera = new THREE.PerspectiveCamera(constants$4.dollhouseFOV);
- _this = _super.call(this, camera, {
- left: 0.4,
- bottom: 0.2,
- width: size$3.w + 'px',
- height: size$3.h + 'px',
- name: 'mini'
- });
- var controls = _this.controls = new DollhouseControls(camera, null
- /* dom */
- , player$h);
- common$1.setCameraLayers(camera, ['MODEL', 'cursor_mini']);
- _this.dontClear = true; //覆盖在之前画好的
- _this.initScene();
- var updateCursor = function updateCursor() {
- /* this.cursor.position.copy(player.position)
- //let yaw = math.getYawByDir(player.getDirection())
- this.cursor.rotation.z = -player.yaw - Math.PI / 2
- this.needupdate = false */
- //游标在当前点位上,飞出后不改旋转
- if (player$h.mode == 'panorama') {
- _this.cursor.position.copy(player$h.position);
- _this.cursor.rotation.z = -player$h.yaw - Math.PI / 2; //ui要求要看起来大小不变
- var s = _this.cursor.position.distanceTo(camera.position) * 0.3;
- _this.cursor.scale.set(s, s, s);
- }
- };
- updateCursor();
- var init = function init() {
- //player.once('pano.chosen', () => {
- //wait for model.center
- var boundingBox = player$h.model.boundingBox.clone().expandByScalar(5);
- controls.setZoomBounds(player$h.model.boundingBox);
- controls.setBounds(boundingBox);
- var rect = miniDom.getBoundingClientRect();
- size$3.w = Math.round(rect.width), size$3.h = Math.round(rect.height);
- _this.width = size$3.w + 'px', _this.height = size$3.h + 'px'; //暂定宽高固定不变
- var aspect = size$3.w / size$3.h;
- controls.updateDistance(aspect);
- _this.initCameraPose();
- miniDom.addEventListener('click', function () {
- if (!_this.disable && player$h.$app.store.getValue('metadata').controls.showDollhouse && !player$h.$app.Camera.locked) {
- player$h.flyToNewMode({
- mode: 'dollhouse'
- });
- }
- });
- /* let container = document.querySelector('#kankan-plugins__1')
- rectBorder = document.createElement('div')
- rectBorder.id = 'miniDollBorder'
-
- rectBorder.style.border = radius + 'px solid rgba(0,0,0,0.1)'
- rectBorder.style['border-radius'] = radius + 'px'
- rectBorder.style.position = 'absolute'
-
- rectBorder.style.width = size.w + 2 * radius + 'px' //size.x + 'px'
- rectBorder.style.height = size.h + 2 * radius + 'px'
- container.appendChild(rectBorder) */
- //this.setClipArea(sceneRenderer.renderWidth, sceneRenderer.renderHeight)
- };
- if (player_.$app.Scene.loaded) {
- init();
- } else {
- player_.$app.Scene.on('loaded', init);
- }
- player$h.on('update', function (e) {
- if (e.hasChanged.cameraWorldMatrixChanged && !_this.disable || _this.needupdate) updateCursor();
- });
- var map = new Map();
- var oldTra;
- _this.beforeRender = function () {
- if (player$h.mode == 'dollhouse') return;
- player$h.model.chunks.forEach(function (e) {
- map.set(e, {
- material: e.material,
- side: e.material.side
- });
- e.material = e.materialOutside;
- e.material.side = 0;
- });
- if (player$h.modeTran.split('-')[1] == 'panorama'
- /* player.mode == 'panorama' */
- && player$h.model.floors.length > 1) {
- oldTra = player$h.modeTran;
- player$h.modeTran = 'dollhouse-dollhouse'; //player.model.setMode('dollhouse')
- player$h.model.floors.forEach(function (floor) {
- var show = floor == player$h.model.currentFloor;
- show || floor.hide('bymi');
- });
- } //common.screenPass.render(sceneRenderer.renderer, bgColorMat) //蒙上一层背景
- };
- _this.afterRender = function () {
- if (player$h.mode == 'dollhouse') return;
- player$h.model.chunks.forEach(function (e) {
- var a = map.get(e);
- e.material = a.material;
- e.material.side = a.side;
- });
- if (player$h.modeTran.split('-')[1] == 'panorama' && player$h.model.floors.length > 1) {
- player$h.modeTran = oldTra; //player.model.setMode('panorama')
- player$h.model.floors.forEach(function (floor) {
- var show = floor == player$h.model.currentFloor;
- show || floor.show('bymi');
- });
- }
- };
- sceneRenderer$2.on('render', function () {
- _this.setClipArea();
- }); //因为dom可能有动效所以要实时监听
- /* player.on('mode.changed',()=>{//飞出后cursor变很大,隐藏吧 但这样dollhouse模式就不知道在哪,先不改算了
- this.cursor.visible = player.mode == 'panorama'
- }) */
- return _this;
- }
- _createClass(MiniDollhouse, [{
- key: "initScene",
- value: function initScene() {
- var cursor = new THREE.Mesh(planeGeo$2, new THREE.MeshBasicMaterial({
- transparent: true,
- //opacity: 0.8,
- depthTest: false,
- side: 2,
- map: common$1.loadTextureFromCache(texture.getImageURL('images/pic_location128.png'))
- }));
- /* let s = this.controls.offset.length() / 3.5
- var cursor = new Sprite({
- fixOrient:true,
- mat: new THREE.MeshBasicMaterial({
- transparent: true,
- opacity: 0.8,
- depthTest: false,
- side: 2,
- map: common.loadTextureFromCache(texture.getImageURL('images/pic_location128_blue.png')),
- }),
- sizeInfo: {
- camera: this.camera,
- nearBound: s * 10, farBound: s * 50, minSize: 10, maxSize
- }
- }) */
- cursor.name = 'miniDoll-cursor';
- cursor.rotation.x = Math.PI / 2;
- cursor.layers.set(RenderLayers.cursor_mini);
- cursor.renderOrder = 10;
- player$h.model.add(cursor);
- this.cursor = cursor;
- }
- }, {
- key: "initCameraPose",
- value: function initCameraPose() {
- /* this.controls.target.copy(player.model.center)
- this.camera.position.copy(player.model.center)
- this.camera.position.y += 30
- this.controls.update(0) */
- //this.controls.suitableDistance *= 0.9 //有的场景会超出范围,有的又太小
- var oldControls = player$h.cameraControls.controls['dollhouse'];
- player$h.cameraControls.controls['dollhouse'] = this.controls;
- player$h.switchCameraMode('dollhouse', player$h.initialQua, null, null, null, {
- heightRatio: 6
- }); //稍微垂直点往下看
- player$h.cameraControls.controls['dollhouse'] = oldControls;
- var s = this.controls.offset.length() / 3.5;
- this.cursor.scale.set(s, s, s);
- } //会被界面上其他元素遮住
- }, {
- key: "setClipArea",
- value: function setClipArea() {
- var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : sceneRenderer$2.renderWidth;
- var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : sceneRenderer$2.renderHeight;
- if (!player$h.domElement || this.disable) return; //console.log('setClipArea',width,height)
- var mapRect = miniDom.getBoundingClientRect();
- /*
- let leftPX = Math.floor(mapRect.left)
- this.left = leftPX / width
- this.bottom = Math.floor(height - mapRect.bottom) / height */
- /* this.left = (width - size.right - size.w) / width
- this.bottom = (height - size.top - size.h) / height */
- this.left = mapRect.left / width;
- this.bottom = (height - mapRect.bottom) / height;
- /* rectBorder.style.right = width - mapRect.right - radius + 'px'
- rectBorder.style.top = mapRect.top - radius + 'px' */
- return; //防止热点等元素覆盖这个区域:
- } //圆角实现:在 xui_min_map 内为这个加个圆角矩形,实心且被clip,或空心但有border
- }]);
- return MiniDollhouse;
- }(Viewport);
- 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); }; }
- 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; } }
- new THREE.RawShaderMaterial({
- fragmentShader: shaders.skysphere.fragmentShader,
- vertexShader: shaders.skysphere.vertexShader,
- uniforms: THREE.UniformsUtils.clone(shaders.skysphere.uniforms),
- side: THREE.BackSide,
- name: 'skysphereBG'
- });
- window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
- var index$1 = 0;
- defineComponent('SceneRenderer', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(SceneRenderer, _EventEmitter);
- var _super = _createSuper$T(SceneRenderer);
- function SceneRenderer() {
- var _this;
- _classCallCheck(this, SceneRenderer);
- _this = _super.call(this);
- _this.createScene = function (model) {
- this.camera = new THREE.PerspectiveCamera();
- /* this.camera.layers.enable(RenderLayers.PANOMARKERS)
- this.camera.layers.enable(RenderLayers.RETICULE) */
- common$1.setCameraLayers(this.camera, ['DEFAULT', 'Tag3d', 'PANOMARKERS', 'SKYBOX', 'MODEL', 'RETICULE']); // this.camera.position.set(0, 5, 20)
- // this.camera.lookAt(0, 0, 0)
- this.scene = new THREE.Scene();
- this.light = new THREE.AmbientLight(16777215);
- this.scene.add(this.light);
- this.viewports = [new Viewport(this.camera, {
- left: 0,
- bottom: 0,
- width: 1,
- height: 1,
- name: 'main'
- })];
- if (browser$1.urlHasValue('miniDoll')) {
- this.viewports.push(new MiniDollhouse(this.$app.core.get('Player'), this));
- } // 灯光非常耗性能
- // var directionalLight = new THREE.DirectionalLight(0xffffff, 0.3)
- // directionalLight.position.set(0, -1, 0).normalize()
- // this.scene.add(directionalLight)
- // var directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.7)
- // directionalLight1.position.set(-10, 3.5, 0).normalize()
- // this.scene.add(directionalLight1)
- // var directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.7)
- // directionalLight2.position.set(0, 3.5, 10).normalize()
- // this.scene.add(directionalLight2)
- // var directionalLight3 = new THREE.DirectionalLight(0xffffff, 0.7)
- // directionalLight3.position.set(0, 3.5, -10).normalize()
- // this.scene.add(directionalLight3)
- // var directionalLight4 = new THREE.DirectionalLight(0xffffff, 0.7)
- // directionalLight4.position.set(10, 3.5, 0).normalize()
- // this.scene.add(directionalLight4)
- // 照亮entryEntry
- var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
- directionalLight.position.set(1, 10, 1).normalize();
- this.scene.add(directionalLight); // this.scene.skyboxBG = new THREE.Mesh(new THREE.SphereBufferGeometry(2500, 20, 5), skyMat)
- // this.scene.add(this.scene.skyboxBG)
- };
- _this.addComponent = function (e, ifAfterRender) {
- this.components.push(e);
- if (e.update) {
- if (ifAfterRender) this.updateLisAfter.push(e); //add
- else this.updateListeners.push(e);
- }
- if (e.setSize) {
- this.resizeListeners.push(e);
- this.forceUpdateSize = !0;
- }
- };
- _this.removeComponent = function (e) {
- var t = function t(_t) {
- return _t !== e;
- };
- this.components = this.components.filter(t);
- this.updateListeners = this.updateListeners.filter(t);
- this.resizeListeners = this.resizeListeners.filter(t);
- };
- _this.start = function (dom) {
- if (this.started) {
- throw new BasicException$1("Can't start SceneRenderer, already started");
- }
- this.createContext(dom);
- this.initComposer();
- this.started = !0;
- if (this.$app.config.mobile) {
- try {
- VR$1.Init(this, this.$app.core.get('Player'));
- } catch (error) {
- console.error(error);
- }
- }
- (this.animate = this.animate.bind(this))();
- };
- _this.createContext = function (dom) {
- try {
- this.renderer = new THREE.WebGLRenderer({
- antialias: true,
- alpha: true
- }); //set alpha for renderTex
- this.renderer.autoClear = !0;
- this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1);
- this.renderer.setSize(window.innerWidth, window.innerHeight);
- this.renderer.setClearColor('#292929', 1.0);
- this.emit(SceneRendererEvents.ContextCreated);
- } catch (e) {
- throw new RendererCreationException$1('Unable to create a WebGL rendering context');
- } //貌似没用
- //settings.profiling.enabled && this.overrideTextures();
- dom.appendChild(this.renderer.domElement);
- };
- _this.initComposer = function () {
- this.composer = new THREE.EffectComposer(this.renderer);
- this.composer.addPass(new THREE.RenderPass(this.scene, this.camera));
- this.composer.addPass(this.effects.hblurPass);
- this.composer.addPass(this.effects.vblurPass);
- };
- _this.setSize = function (width, height, ratio) {
- this.renderWidth = width;
- this.renderHeight = height;
- this.effects.aspect = width / height;
- this.renderer.setSize(width, height);
- this.composer.setSize(width, height);
- this.renderer.setPixelRatio(ratio);
- this.css3dRenderer && this.css3dRenderer.setSize(width, height);
- for (var i = 0; i < this.resizeListeners.length; i++) {
- this.resizeListeners[i].setSize(width, height);
- }
- this.emit('resize', width, height);
- };
- _this.render = function () {
- var _this2 = this;
- var size = this.renderer.getSize(new THREE.Vector2());
- if (size.x == 0 || size.y == 0) return; //同屏时关闭一个屏
- this.emit('render', this.updateClock2.getDelta());
- var getPX = function getPX(num, whole) {
- num = typeof num == 'number' ? whole * num : parseFloat(num);
- return Math.round(num);
- };
- this.viewports.forEach(function (viewport) {
- _this2.update3dTiles({
- viewport,
- force: _this2.viewports.length > 1
- });
- var left = getPX(viewport.left, _this2.renderWidth);
- var bottom = getPX(viewport.bottom, _this2.renderHeight);
- var width = getPX(viewport.width, _this2.renderWidth);
- var height = getPX(viewport.height, _this2.renderHeight);
- _this2.renderer.setViewport(left, bottom, width, height); //规定视口,影响图形变换(画布的使用范围)
- /* let scissorTest = width < this.renderWidth || height < this.renderHeight
- this.renderer.setScissorTest(scissorTest)
- scissorTest && this.renderer.setScissor(left, bottom, width, height)
- */
- _this2.renderer.autoClear = !viewport.dontClear; // || this.renderer.clear(true, true, true) // 清除颜色、深度、模板缓冲区
- _this2.renderer.clearDepth();
- viewport.beforeRender && viewport.beforeRender();
- _this2.renderer.render(_this2.scene, viewport.camera);
- viewport.afterRender && viewport.afterRender();
- }); //this.effects.currentBlur > 0 ? this.composer.render() : this.renderer.render(this.scene, this.camera)
- if (this.css3dRenderer) {
- this.css3dRenderer.render(this.scene, this.camera);
- }
- };
- _this.updateScreenSize = function () {
- //许钟文改
- //xzw 改 为了截屏 要改canvas大小 以及缩放时不模糊
- var W, H, pixelRatio; //当截屏时有setTimeout 期间不能恢复大小,所以要用W,H记录正常大小
- return function () {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var render = false;
- var ratio;
- var w, h; //记录应当render的大小
- if (o.forceUpdateSize) this.forceUpdateSize = true;
- if (!o.resize && o.width != void 0 && o.height != void 0) {
- w = o.width, h = o.height, render = true, ratio = 1;
- } else {
- w = this.renderer.domElement.parentElement.clientWidth;
- h = this.renderer.domElement.parentElement.clientHeight;
- if (o.resize) {
- W = this.renderWidth;
- H = this.renderHeight; //console.log('updateScreenSize',w,h)
- }
- if (w !== W || h !== H || this.forceUpdateSize || pixelRatio != window.devicePixelRatio) {
- W = w, H = h, render = true;
- pixelRatio = window.devicePixelRatio; //如果player放在小窗口了,也要监测devicePixelRatio,因为缩放时client宽高不会改变
- ratio = window.devicePixelRatio;
- }
- }
- if (render) {
- //console.log('setSize',w,h, ratio)
- this.setSize(w, h, ratio);
- this.forceUpdateSize = !1;
- }
- };
- }();
- _this.updateComponents = function () {
- //注意:transitions一定要放在最开头,计时才会准确
- var delta = this.updateClock.getDelta();
- for (var e = Math.min(1, delta), t = 0; t < this.updateListeners.length; t++) {
- this.updateListeners[t].update(e);
- }
- };
- _this.updateAfterRender = function () {
- //add
- common$1.timeMeasuring.addTimeMark('afterRender', 'start');
- for (var t = 0; t < this.updateLisAfter.length; t++) {
- this.updateLisAfter[t].update();
- }
- common$1.timeMeasuring.addTimeMark('afterRender', 'end');
- };
- _this.suspend = function () {
- this.started = !1, this.suspendedObjects = this.scene.children.map(function (e) {
- return this.scene.remove(e), e;
- }.bind(this)), this.render();
- };
- _this.resume = function () {
- this.suspendedObjects.forEach(function (e) {
- this.scene.add(e);
- }.bind(this));
- this.suspendedObjects = [];
- this.started = !0;
- this.animate();
- };
- _this.animate = function () {
- if (this.started) {
- performance.mark('loop-start'); // 无论有没有reportTimings都要获取,因为getBestCound需要
- //--------------------
- window.requestAnimationFrame(this.animate);
- this.updateScreenSize();
- this.updateComponents(); //this.updateTextureMemory();
- this.render();
- this.updateAfterRender(); //注意:如果每一帧处理太多东西容易崩溃。
- this.emit(SceneRendererEvents.AfterRender); //--------------------
- common$1.timeMeasuring.addTimeMark('loop', 'end');
- common$1.timeMeasuring.report(performance.now());
- }
- };
- _this.getImageData = function () {
- var e = document.createElement('canvas'),
- t = e.getContext('2d');
- return function (i, SceneRenderer, r) {
- 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);
- };
- }();
- _this.initSizedTexture2D = function (size, wrap, i) {
- var renderer = this.renderer,
- ctx = renderer.getContext(),
- glState = renderer.state,
- texture = new THREE.Texture();
- texture.flipY = false;
- texture.wrapS = wrap;
- texture.wrapT = wrap;
- i !== true && (i = false);
- texture.generateMipmaps = i;
- var glFormat = renderer.paramThreeToGL(texture.format),
- glType = renderer.paramThreeToGL(texture.type),
- h = renderer.properties.get(texture),
- glTexture = ctx.createTexture();
- glState.bindTexture(ctx.TEXTURE_2D, glTexture);
- ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, texture.flipY);
- ctx.texImage2D(ctx.TEXTURE_2D, 0, glFormat, size, size, 0, glFormat, glType, null);
- var glWrap = renderer.paramThreeToGL(wrap);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, glWrap);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, glWrap);
- if (i) {
- texture.magFilter = THREE.LinearFilter;
- texture.minFilter = THREE.LinearMipMapLinearFilter;
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR_MIPMAP_NEAREST);
- ctx.generateMipmap(ctx.TEXTURE_2D);
- } else {
- texture.magFilter = THREE.LinearFilter;
- texture.minFilter = THREE.LinearFilter;
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR);
- }
- glState.bindTexture(ctx.TEXTURE_2D, null);
- h.__webglTexture = glTexture;
- return texture;
- };
- _this.deallocateCubeTexture = function (e) {
- var t = this.renderer;
- t.getContext();
- t.properties.get(e); //i.deleteTexture(renderer.__image__webglTextureCube) //新版three没有这个耶
- //改成自带的dispose , 虽然未被使用的zoomTarget没有dispose事件
- e.dispose();
- };
- _this.renderToCubeMap = function () {
- var inited = false,
- scene = null,
- material = null,
- geo = null,
- plane = null,
- l = 1,
- cubeCamera = null;
- return function (tex, renderTarget, tileWidth, tileHeight, startXinTile, startYinTile, widthinTile, heightinTile, startX, startY, width, height, cubeFace, E, b, w) {
- var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
- if (!inited) {
- scene = new THREE.Scene();
- cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
- scene.add(cubeCamera);
- material = new THREE.ShaderMaterial({
- uniforms: {
- map: {
- type: 'scene',
- value: null
- },
- opacity: {
- type: 'startYinTile',
- value: 1
- },
- baseColor: {
- type: 'v3',
- value: new THREE.Color('#fff')
- }
- },
- vertexShader: shaders.basicTextured.vertexShader,
- fragmentShader: shaders.basicTextured.fragmentShader,
- depthWrite: !1,
- depthTest: !1,
- side: THREE.DoubleSide
- });
- geo = new THREE.PlaneGeometry(l, l);
- plane = new THREE.Mesh(geo, material);
- scene.add(plane);
- inited = true;
- } // 必须更新cubeCamera的renderTarget
- cubeCamera.renderTarget = renderTarget;
- var uv = geo.getAttribute('uv');
- uv.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
- uv.needsUpdate = true;
- var uvArr = uv.array,
- S = startXinTile / tileWidth,
- //uv这几个值基本是固定的startXinTile:0,startYinTile:0,widthinTile:512,widthinTile:512,tileWidth:512,tileHeight:512 也就是说uv不会变、每张tile的有效范围是100%
- M = startYinTile / tileHeight,
- R = widthinTile / tileWidth,
- P = heightinTile / tileHeight;
- 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只占据需要绘制的部分。类似拼图。
- //startX startY width height 都是在画布上的大小,比如画布大小为2048*2048,此tile为16分之一,tileX是1,tileY是1,则startX=2048/4,startY=2048/4
- var pos = geo.getAttribute('position');
- pos.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
- pos.needsUpdate = true;
- var posArr = pos.array,
- D = startX / renderTarget.width - l / 2,
- // 起始x
- N = startY / renderTarget.height - l / 2,
- // 起始y
- B = width / renderTarget.width,
- // 宽
- F = height / renderTarget.height // 高
- ;
- 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;
- renderer.properties.get(scene); //this.renderer.properties.get(scene);
- material.uniforms.map.value = tex;
- material.blending = E || THREE.NoBlending, material.transparent = !!b;
- void 0 !== w && null !== w || (w = 1);
- material.uniforms.opacity.value = w;
- material.needUpdate = !0; // cubeFace 0-5 应该是指定渲染h中的面
- if (cubeFace == 0) {
- plane.scale.set(-1, -1, 1);
- plane.position.set(l / 2, 0, 0);
- }
- if (cubeFace == 1) {
- plane.scale.set(-1, -1, 1);
- plane.position.set(l / -2, 0, 0);
- }
- if (cubeFace == 2) {
- // 上
- plane.scale.set(1, 1, 1);
- plane.position.set(0, l / 2, 0);
- }
- if (cubeFace == 3) {
- // 下
- plane.scale.set(1, 1, 1);
- plane.position.set(0, l / -2, 0);
- }
- if (cubeFace == 4) {
- plane.scale.set(-1, -1, 1);
- plane.position.set(0, 0, l / 2);
- }
- if (cubeFace == 5) {
- plane.scale.set(-1, -1, 1);
- plane.position.set(0, 0, l / -2);
- }
- plane.lookAt(cubeCamera.position);
- /* renderer.setScissorTest(!0)
- //指定绘制区域,类似遮罩(相对于屏幕)
- renderer.setScissor(startX,startY,width,height) //加上这个会不会快一些,尤其是spherical
- //指定绘制视口位置和大小(相对于屏幕)
- */
- renderTarget.viewport.set(0, 0, renderTarget.width, renderTarget.height);
- var V = renderer.autoClear;
- renderer.autoClear = !1;
- cubeCamera.update(renderer, scene);
- renderer.autoClear = V; //renderer.setScissorTest(!1)
- /* this.renderer.render(scene, camera, this.planeTargets[cubeFace], !1),//针对有的场景app第一个点图加载不成功的问题
- console.log(`图index ${cubeFace} , ${startX}, ${startY}, ${width}, ${height}`)
- this.targetList[cubeFace] || (this.targetList[cubeFace] = [])
- this.targetList[cubeFace].push([startX,startY,width,height])*/
- };
- }();
- _this.copyCubeMap = function () {
- //将texture渲染到zoomRenderTarget上
- var inited = !1,
- scene = null,
- cubeCamera = null,
- material = null,
- geo = null,
- mesh = null,
- c = new THREE.Euler();
- return function (texture, renderTarget, tWidth, tHeight, rWidth, rHeight, m, v, A) {
- if (!inited) {
- var w = 2;
- scene = new THREE.Scene();
- cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
- scene.add(cubeCamera);
- material = new THREE.ShaderMaterial({
- uniforms: {
- tDiffuse: {
- type: 't',
- value: null
- },
- alpha: {
- type: 'f',
- value: 1
- }
- },
- vertexShader: shaders.copyCubeMap.vertexShader,
- fragmentShader: shaders.copyCubeMap.fragmentShader,
- depthWrite: !1,
- depthTest: !1,
- side: THREE.DoubleSide
- });
- geo = new THREE.BoxGeometry(w, w, w);
- mesh = new THREE.Mesh(geo, material);
- mesh.scale.set(-1, -1, 1);
- scene.add(mesh);
- inited = !0;
- }
- var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
- // 必须更新cubeCamera的renderTarget
- cubeCamera.renderTarget = renderTarget;
- for (var C = 0; C < 6; C++) {
- this.getCubeOrientationForCubeFace(C, c);
- mesh.rotation.copy(c);
- mesh.matrixWorldNeedsUpdate = !0;
- mesh.updateMatrixWorld();
- material.uniforms.tDiffuse.value = texture;
- material.blending = m || THREE.NoBlending;
- material.transparent = !!v;
- void 0 !== A && null !== A || (A = 1);
- material.uniforms.alpha.value = A;
- material.needUpdate = !0; // (renderTarget.activeCubeFace = C)
- renderTarget.viewport.set(0, 0, rWidth, rHeight); // this.renderer.render(scene, camera, renderTarget, !1)
- var V = renderer.autoClear;
- renderer.autoClear = !1;
- cubeCamera.update(renderer, scene);
- renderer.autoClear = V;
- }
- };
- }();
- _this.getCubeOrientationForCubeFace = function (e, t) {
- switch (e) {
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- t.set(0, -Math.PI / 2, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- t.set(0, Math.PI / 2, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- t.set(Math.PI / 2, Math.PI, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- t.set(-Math.PI / 2, Math.PI, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- t.set(0, -Math.PI, 0);
- break;
- case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- t.set(0, 0, 0);
- }
- };
- _this.index = index$1++;
- _this.scene = null;
- _this.camera = null;
- _this.light = null;
- _this.renderer = null;
- _this.effects = effects$1;
- _this.css3dRenderer = null;
- _this.animateCallback = null;
- _this.composer = null;
- _this.qualityManager = null;
- _this.updateClock = new THREE.Clock();
- _this.updateClock2 = new THREE.Clock();
- _this.components = [];
- _this.updateListeners = [];
- _this.resizeListeners = [];
- _this.updateLisAfter = []; //add
- _this.forceUpdateSize = !1;
- _this.started = !1;
- _this.textures = {};
- _this.suspendedObjects = [];
- _this.vrMode = false;
- _this.autoUpdate3dTiles = false;
- common$1.timeMeasuring.reportTimings = false;
- common$1.timeMeasuring.registerCollect('loop', {
- minCount: 120,
- median: 3,
- refreshTime: 5 * 1000
- }); // iphone13和电脑近似, iphonex很卡差别较大
- //common.timeMeasuring.registerCollect('getMouseIntersect', { minCount: 120, median: 1, refreshTime: 10 * 1000 }) // iphone13和电脑近似, iphonex很卡差别较大
- //写了一个针对多个iframe切换的事件,释放内存防止崩溃(因为iframe不像win页面那样会有unfocusPage的事件,即使隐藏了也会loop)
- window.addEventListener('unfocusPage', function (e) {
- console.log('unfocusPage', document.title);
- _this.suspend();
- _this.$app.core.get('PanoRenderer').disposeIdelTargets();
- });
- window.addEventListener('focusPage', function (e) {
- console.log('focusPage', document.title);
- _this.resume();
- });
- return _this;
- }
- _createClass(SceneRenderer, [{
- key: "setMiniDollDisplay",
- value: function setMiniDollDisplay(show) {
- if (this.viewports.length == 2 == show) return;
- var miniDom = document.querySelector('div[xui_min_map]');
- if (show) {
- miniDom.style.display = '';
- if (!this.miniDollhouse) {
- this.miniDollhouse = new MiniDollhouse(this.$app.core.get('Player'), this, miniDom);
- }
- this.viewports.push(this.miniDollhouse);
- this.miniDollhouse.disable = false;
- this.miniDollhouse.needupdate = true;
- this.miniDollhouse.setClipArea(this.renderWidth, this.renderHeight);
- } else {
- this.viewports.length > 1 && this.viewports.pop();
- this.miniDollhouse.disable = true;
- }
- }
- /* setMiniDollEnable(state) {
- //是否打开三维迷你视角。权重比上面那个高
- this.enableMiniDoll = state
- let miniDom = document.querySelector('div[xui_min_map]')
- let player = this.$app.core.get('Player')
- if (state) {
- let judge = ()=>{
- let show = player.mode == 'panorama'
- miniDom.style.display = show ? '' : 'none'
- this.setMiniDollDisplay(show)
- }
- if (!this.miniEventBinded) {
- player.on('mode.changed', () => {
- if (this.enableMiniDoll) {
- judge()
- }
- })
- this.miniEventBinded = true
- }
- judge()
- } else {
- this.setMiniDollDisplay(false)
- }
- } */
- }, {
- key: "update3dTiles",
- value: function update3dTiles() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var player = this.$app.core.get('Player');
- var _3dTilesRuntime = player.model._3dTilesRuntime;
- if (_3dTilesRuntime) {
- var deltaTime = this.updateClock2.getDelta(); //判断数量 __sdk.core.get('Player').model._3dTilesRuntime.getTileset().tiles.filter(e=>e._visible)
- if (this.autoUpdate3dTiles || options.force) {
- /**
- * tilesetUpdate需要满足条件:
- * 1. deltaTime累计超过UPDATE_INTERVAL
- * 2. 相机发生变化 lastFrameChanged //xzw 2023.11.27
- * options.force==true时,会忽视上述两点进行更新
- */
- if (player.lastFrameChanged || options.force) {
- var _options$viewport;
- 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);
- _3dTilesRuntime.update(deltaTime, this.renderer, camera, options.force);
- _3dTilesRuntime.stats && _3dTilesRuntime.stats.update();
- }
- }
- if (player.mode !== Viewmode$1.PANORAMA) {
- // 遍历tiles
- _3dTilesRuntime.getTileset().tiles.forEach(function (tile) {
- var tileContent = _3dTilesRuntime.getRenderMap()[tile.id];
- if (tileContent && tileContent.modified !== 'remove') {
- deltaTime = 9999; // 因为需要实时计算可视范围内的tile,所以一旦相机发生变化就要tilesetUpdate
- if (tile.isVisibleAndInRequestVolume || player.mode === Viewmode$1.TRANSITIONING) {
- // 如果tile在可视范围内或相机过渡中,则添加会对应floor
- player.model.floors.get(tile.floorIndex).add(tileContent);
- } else {
- // 如果tile不在可视范围内,就从场景中remove
- tileContent.removeFromParent();
- tileContent.traverse(function (obj) {
- if (obj.isChunk && obj.geometry) {
- obj.geometry.dispose();
- obj.material.dispose();
- obj.material.uniforms.map && obj.material.uniforms.map.value.dispose();
- }
- });
- }
- }
- });
- }
- }
- }
- }, {
- key: "uploadTexture2D",
- value:
- /* uploadTexture2D = function (e, t, i, renderer, r, o) {
- var a = this.renderer,
- s = a.context,
- l = a.state,
- c = a.properties.get(t)
- l.bindTexture(s.TEXTURE_2D, c.__webglTexture)
- s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, t.flipY)
- s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t.premultiplyAlpha)
- s.pixelStorei(s.UNPACK_ALIGNMENT, t.unpackAlignment)
- s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, a.paramThreeToGL(t.wrapS))
- s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, a.paramThreeToGL(t.wrapT))
- s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, a.paramThreeToGL(t.magFilter))
- s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, a.paramThreeToGL(t.minFilter))
- s.texSubImage2D(s.TEXTURE_2D, 0, i, renderer, s.RGBA, s.UNSIGNED_BYTE, e)
- t.generateMipmaps && s.generateMipmap(s.TEXTURE_2D)
- l.bindTexture(s.TEXTURE_2D, null)
- } */
- function uploadTexture2D(img, tex, startX, startY, width, height) {
- var renderer = this.renderer,
- gl = renderer.getContext(),
- webglState = renderer.state,
- c = renderer.properties.get(tex);
- webglState.bindTexture(gl.TEXTURE_2D, c.__webglTexture);
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, tex.flipY);
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, tex.premultiplyAlpha);
- gl.pixelStorei(gl.UNPACK_ALIGNMENT, tex.unpackAlignment);
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, renderer.paramThreeToGL(tex.wrapS));
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, renderer.paramThreeToGL(tex.wrapT));
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, renderer.paramThreeToGL(tex.magFilter));
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, renderer.paramThreeToGL(tex.minFilter));
- gl.texSubImage2D(gl.TEXTURE_2D, 0, startX, startY, gl.RGBA, gl.UNSIGNED_BYTE, img);
- tex.generateMipmaps && gl.generateMipmap(gl.TEXTURE_2D);
- webglState.bindTexture(gl.TEXTURE_2D, null);
- }
- /*
- 注:tileY的方向同UV,从下到上
- renderToCubeMap里的画布or镜头的xy范围是-0.5到0.5
- */
- }, {
- key: "setBg",
- value: function setBg(color, opacity) {
- if (color) {
- this.renderer.setClearColor(color);
- }
- if (opacity != void 0) {
- this.renderer.setClearAlpha(opacity);
- }
- }
- }]);
- return SceneRenderer;
- }(EventEmitter);
- });
- /*
- Copyright (c) 2008, Adobe Systems Incorporated
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of Adobe Systems Incorporated nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- function JPEGEncoder$1(quality) {
- var ffloor = Math.floor;
- var YTable = new Array(64);
- var UVTable = new Array(64);
- var fdtbl_Y = new Array(64);
- var fdtbl_UV = new Array(64);
- var YDC_HT;
- var UVDC_HT;
- var YAC_HT;
- var UVAC_HT;
- var bitcode = new Array(65535);
- var category = new Array(65535);
- var outputfDCTQuant = new Array(64);
- var DU = new Array(64);
- var byteout = [];
- var bytenew = 0;
- var bytepos = 7;
- var YDU = new Array(64);
- var UDU = new Array(64);
- var VDU = new Array(64);
- var clt = new Array(256);
- var RGB_YUV_TABLE = new Array(2048);
- var currentQuality;
- 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];
- var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0];
- var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
- var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d];
- 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];
- var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
- var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
- var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77];
- 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];
- function initQuantTables(sf) {
- 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];
- for (var i = 0; i < 64; i++) {
- var t = ffloor((YQT[i] * sf + 50) / 100);
- if (t < 1) {
- t = 1;
- } else if (t > 255) {
- t = 255;
- }
- YTable[ZigZag[i]] = t;
- }
- 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];
- for (var j = 0; j < 64; j++) {
- var u = ffloor((UVQT[j] * sf + 50) / 100);
- if (u < 1) {
- u = 1;
- } else if (u > 255) {
- u = 255;
- }
- UVTable[ZigZag[j]] = u;
- }
- var aasf = [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.5411961, 0.275899379];
- var k = 0;
- for (var row = 0; row < 8; row++) {
- for (var col = 0; col < 8; col++) {
- fdtbl_Y[k] = 1.0 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
- fdtbl_UV[k] = 1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
- k++;
- }
- }
- }
- function computeHuffmanTbl(nrcodes, std_table) {
- var codevalue = 0;
- var pos_in_table = 0;
- var HT = new Array();
- for (var k = 1; k <= 16; k++) {
- for (var j = 1; j <= nrcodes[k]; j++) {
- HT[std_table[pos_in_table]] = [];
- HT[std_table[pos_in_table]][0] = codevalue;
- HT[std_table[pos_in_table]][1] = k;
- pos_in_table++;
- codevalue++;
- }
- codevalue *= 2;
- }
- return HT;
- }
- function initHuffmanTbl() {
- YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values);
- UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values);
- YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values);
- UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values);
- }
- function initCategoryNumber() {
- var nrlower = 1;
- var nrupper = 2;
- for (var cat = 1; cat <= 15; cat++) {
- //Positive numbers
- for (var nr = nrlower; nr < nrupper; nr++) {
- category[32767 + nr] = cat;
- bitcode[32767 + nr] = [];
- bitcode[32767 + nr][1] = cat;
- bitcode[32767 + nr][0] = nr;
- } //Negative numbers
- for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) {
- category[32767 + nrneg] = cat;
- bitcode[32767 + nrneg] = [];
- bitcode[32767 + nrneg][1] = cat;
- bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg;
- }
- nrlower <<= 1;
- nrupper <<= 1;
- }
- }
- function initRGBYUVTable() {
- for (var i = 0; i < 256; i++) {
- RGB_YUV_TABLE[i] = 19595 * i;
- RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i;
- RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 0x8000;
- RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i;
- RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i;
- RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 0x807fff;
- RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i;
- RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i;
- }
- } // IO functions
- function writeBits(bs) {
- var value = bs[0];
- var posval = bs[1] - 1;
- while (posval >= 0) {
- if (value & 1 << posval) {
- bytenew |= 1 << bytepos;
- }
- posval--;
- bytepos--;
- if (bytepos < 0) {
- if (bytenew == 0xff) {
- writeByte(0xff);
- writeByte(0);
- } else {
- writeByte(bytenew);
- }
- bytepos = 7;
- bytenew = 0;
- }
- }
- }
- function writeByte(value) {
- //byteout.push(clt[value]); // write char directly instead of converting later
- byteout.push(value);
- if (byteout.length === 1) ;
- }
- function writeWord(value) {
- writeByte(value >> 8 & 0xff);
- writeByte(value & 0xff);
- } // DCT & quantization core
- function fDCTQuant(data, fdtbl) {
- var d0, d1, d2, d3, d4, d5, d6, d7;
- /* Pass 1: process rows. */
- var dataOff = 0;
- var i;
- var I8 = 8;
- var I64 = 64;
- for (i = 0; i < I8; ++i) {
- d0 = data[dataOff];
- d1 = data[dataOff + 1];
- d2 = data[dataOff + 2];
- d3 = data[dataOff + 3];
- d4 = data[dataOff + 4];
- d5 = data[dataOff + 5];
- d6 = data[dataOff + 6];
- d7 = data[dataOff + 7];
- var tmp0 = d0 + d7;
- var tmp7 = d0 - d7;
- var tmp1 = d1 + d6;
- var tmp6 = d1 - d6;
- var tmp2 = d2 + d5;
- var tmp5 = d2 - d5;
- var tmp3 = d3 + d4;
- var tmp4 = d3 - d4;
- /* Even part */
- var tmp10 = tmp0 + tmp3;
- /* phase 2 */
- var tmp13 = tmp0 - tmp3;
- var tmp11 = tmp1 + tmp2;
- var tmp12 = tmp1 - tmp2;
- data[dataOff] = tmp10 + tmp11;
- /* phase 3 */
- data[dataOff + 4] = tmp10 - tmp11;
- var z1 = (tmp12 + tmp13) * 0.707106781;
- /* c4 */
- data[dataOff + 2] = tmp13 + z1;
- /* phase 5 */
- data[dataOff + 6] = tmp13 - z1;
- /* Odd part */
- tmp10 = tmp4 + tmp5;
- /* phase 2 */
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
- /* The rotator is modified from fig 4-8 to avoid extra negations. */
- var z5 = (tmp10 - tmp12) * 0.382683433;
- /* c6 */
- var z2 = 0.5411961 * tmp10 + z5;
- /* c2-c6 */
- var z4 = 1.306562965 * tmp12 + z5;
- /* c2+c6 */
- var z3 = tmp11 * 0.707106781;
- /* c4 */
- var z11 = tmp7 + z3;
- /* phase 5 */
- var z13 = tmp7 - z3;
- data[dataOff + 5] = z13 + z2;
- /* phase 6 */
- data[dataOff + 3] = z13 - z2;
- data[dataOff + 1] = z11 + z4;
- data[dataOff + 7] = z11 - z4;
- dataOff += 8;
- /* advance pointer to next row */
- }
- /* Pass 2: process columns. */
- dataOff = 0;
- for (i = 0; i < I8; ++i) {
- d0 = data[dataOff];
- d1 = data[dataOff + 8];
- d2 = data[dataOff + 16];
- d3 = data[dataOff + 24];
- d4 = data[dataOff + 32];
- d5 = data[dataOff + 40];
- d6 = data[dataOff + 48];
- d7 = data[dataOff + 56];
- var tmp0p2 = d0 + d7;
- var tmp7p2 = d0 - d7;
- var tmp1p2 = d1 + d6;
- var tmp6p2 = d1 - d6;
- var tmp2p2 = d2 + d5;
- var tmp5p2 = d2 - d5;
- var tmp3p2 = d3 + d4;
- var tmp4p2 = d3 - d4;
- /* Even part */
- var tmp10p2 = tmp0p2 + tmp3p2;
- /* phase 2 */
- var tmp13p2 = tmp0p2 - tmp3p2;
- var tmp11p2 = tmp1p2 + tmp2p2;
- var tmp12p2 = tmp1p2 - tmp2p2;
- data[dataOff] = tmp10p2 + tmp11p2;
- /* phase 3 */
- data[dataOff + 32] = tmp10p2 - tmp11p2;
- var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
- /* c4 */
- data[dataOff + 16] = tmp13p2 + z1p2;
- /* phase 5 */
- data[dataOff + 48] = tmp13p2 - z1p2;
- /* Odd part */
- tmp10p2 = tmp4p2 + tmp5p2;
- /* phase 2 */
- tmp11p2 = tmp5p2 + tmp6p2;
- tmp12p2 = tmp6p2 + tmp7p2;
- /* The rotator is modified from fig 4-8 to avoid extra negations. */
- var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
- /* c6 */
- var z2p2 = 0.5411961 * tmp10p2 + z5p2;
- /* c2-c6 */
- var z4p2 = 1.306562965 * tmp12p2 + z5p2;
- /* c2+c6 */
- var z3p2 = tmp11p2 * 0.707106781;
- /* c4 */
- var z11p2 = tmp7p2 + z3p2;
- /* phase 5 */
- var z13p2 = tmp7p2 - z3p2;
- data[dataOff + 40] = z13p2 + z2p2;
- /* phase 6 */
- data[dataOff + 24] = z13p2 - z2p2;
- data[dataOff + 8] = z11p2 + z4p2;
- data[dataOff + 56] = z11p2 - z4p2;
- dataOff++;
- /* advance pointer to next column */
- } // Quantize/descale the coefficients
- var fDCTQuant;
- for (i = 0; i < I64; ++i) {
- // Apply the quantization and scaling factor & Round to nearest integer
- fDCTQuant = data[i] * fdtbl[i];
- outputfDCTQuant[i] = fDCTQuant > 0.0 ? fDCTQuant + 0.5 | 0 : fDCTQuant - 0.5 | 0; //outputfDCTQuant[i] = fround(fDCTQuant);
- }
- return outputfDCTQuant;
- }
- function writeAPP0() {
- writeWord(0xffe0); // marker
- writeWord(16); // length
- writeByte(0x4a); // J
- writeByte(0x46); // F
- writeByte(0x49); // I
- writeByte(0x46); // F
- writeByte(0); // = "JFIF",'\0'
- writeByte(1); // versionhi
- writeByte(1); // versionlo
- writeByte(0); // xyunits
- writeWord(1); // xdensity
- writeWord(1); // ydensity
- writeByte(0); // thumbnwidth
- writeByte(0); // thumbnheight
- }
- function writeSOF0(width, height) {
- writeWord(0xffc0); // marker
- writeWord(17); // length, truecolor YUV JPG
- writeByte(8); // precision
- writeWord(height);
- writeWord(width);
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0x11); // HVY
- writeByte(0); // QTY
- writeByte(2); // IdU
- writeByte(0x11); // HVU
- writeByte(1); // QTU
- writeByte(3); // IdV
- writeByte(0x11); // HVV
- writeByte(1); // QTV
- }
- function writeDQT() {
- writeWord(0xffdb); // marker
- writeWord(132); // length
- writeByte(0);
- for (var i = 0; i < 64; i++) {
- writeByte(YTable[i]);
- }
- writeByte(1);
- for (var j = 0; j < 64; j++) {
- writeByte(UVTable[j]);
- }
- }
- function writeDHT() {
- writeWord(0xffc4); // marker
- writeWord(0x01a2); // length
- writeByte(0); // HTYDCinfo
- for (var i = 0; i < 16; i++) {
- writeByte(std_dc_luminance_nrcodes[i + 1]);
- }
- for (var j = 0; j <= 11; j++) {
- writeByte(std_dc_luminance_values[j]);
- }
- writeByte(0x10); // HTYACinfo
- for (var k = 0; k < 16; k++) {
- writeByte(std_ac_luminance_nrcodes[k + 1]);
- }
- for (var l = 0; l <= 161; l++) {
- writeByte(std_ac_luminance_values[l]);
- }
- writeByte(1); // HTUDCinfo
- for (var m = 0; m < 16; m++) {
- writeByte(std_dc_chrominance_nrcodes[m + 1]);
- }
- for (var n = 0; n <= 11; n++) {
- writeByte(std_dc_chrominance_values[n]);
- }
- writeByte(0x11); // HTUACinfo
- for (var o = 0; o < 16; o++) {
- writeByte(std_ac_chrominance_nrcodes[o + 1]);
- }
- for (var p = 0; p <= 161; p++) {
- writeByte(std_ac_chrominance_values[p]);
- }
- }
- function writeSOS() {
- writeWord(0xffda); // marker
- writeWord(12); // length
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0); // HTY
- writeByte(2); // IdU
- writeByte(0x11); // HTU
- writeByte(3); // IdV
- writeByte(0x11); // HTV
- writeByte(0); // Ss
- writeByte(0x3f); // Se
- writeByte(0); // Bf
- }
- function processDU(CDU, fdtbl, DC, HTDC, HTAC) {
- var EOB = HTAC[0x00];
- var M16zeroes = HTAC[0xf0];
- var pos;
- var I16 = 16;
- var I63 = 63;
- var I64 = 64;
- var DU_DCT = fDCTQuant(CDU, fdtbl); //ZigZag reorder
- for (var j = 0; j < I64; ++j) {
- DU[ZigZag[j]] = DU_DCT[j];
- }
- var Diff = DU[0] - DC;
- DC = DU[0]; //Encode DC
- if (Diff == 0) {
- writeBits(HTDC[0]); // Diff might be 0
- } else {
- pos = 32767 + Diff;
- writeBits(HTDC[category[pos]]);
- writeBits(bitcode[pos]);
- } //Encode ACs
- var end0pos = 63; // was const... which is crazy
- for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) {} //end0pos = first element in reverse order !=0
- if (end0pos == 0) {
- writeBits(EOB);
- return DC;
- }
- var i = 1;
- var lng;
- while (i <= end0pos) {
- var startpos = i;
- for (; DU[i] == 0 && i <= end0pos; ++i) {}
- var nrzeroes = i - startpos;
- if (nrzeroes >= I16) {
- lng = nrzeroes >> 4;
- for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) {
- writeBits(M16zeroes);
- }
- nrzeroes = nrzeroes & 0xf;
- }
- pos = 32767 + DU[i];
- writeBits(HTAC[(nrzeroes << 4) + category[pos]]);
- writeBits(bitcode[pos]);
- i++;
- }
- if (end0pos != I63) {
- writeBits(EOB);
- }
- return DC;
- }
- function initCharLookupTable() {
- var sfcc = String.fromCharCode;
- for (var i = 0; i < 256; i++) {
- ///// ACHTUNG // 255
- clt[i] = sfcc(i);
- }
- }
- this.encode = function (image, quality // image data object
- ) {
- new Date().getTime();
- if (quality) setQuality(quality); // Initialize bit writer
- byteout = []; //new Array(); //新版QQ浏览器使用new Array()可能得到一个 [empty × 4]……
- bytenew = 0;
- bytepos = 7; // Add JPEG headers
- writeWord(0xffd8); // SOI
- writeAPP0();
- writeDQT();
- writeSOF0(image.width, image.height);
- writeDHT();
- writeSOS(); // Encode 8x8 macroblocks
- var DCY = 0;
- var DCU = 0;
- var DCV = 0;
- bytenew = 0;
- bytepos = 7;
- this.encode.displayName = '_encode_';
- var imageData = image.data;
- var width = image.width;
- var height = image.height;
- var quadWidth = width * 4;
- var x,
- y = 0;
- var r, g, b;
- var start, p, col, row, pos;
- while (y < height) {
- x = 0;
- while (x < quadWidth) {
- start = quadWidth * y + x;
- p = start;
- col = -1;
- row = 0;
- for (pos = 0; pos < 64; pos++) {
- row = pos >> 3; // /8
- col = (pos & 7) * 4; // %8
- p = start + row * quadWidth + col;
- if (y + row >= height) {
- // padding bottom
- p -= quadWidth * (y + 1 + row - height);
- }
- if (x + col >= quadWidth) {
- // padding right
- p -= x + col - quadWidth + 4;
- }
- r = imageData[p++];
- g = imageData[p++];
- b = imageData[p++];
- /* // calculate YUV values dynamically
- YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
- UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
- VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
- */
- // use lookup table (slightly faster)
- YDU[pos] = (RGB_YUV_TABLE[r] + RGB_YUV_TABLE[g + 256 >> 0] + RGB_YUV_TABLE[b + 512 >> 0] >> 16) - 128;
- UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128;
- VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128;
- }
- DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
- DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
- DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
- x += 32;
- }
- y += 8;
- } ////////////////////////////////////////////////////////////////
- // Do the bit alignment of the EOI marker
- if (bytepos >= 0) {
- var fillbits = [];
- fillbits[1] = bytepos + 1;
- fillbits[0] = (1 << bytepos + 1) - 1;
- writeBits(fillbits);
- }
- writeWord(0xffd9); //EOI
- if (typeof module === 'undefined') return new Uint8Array(byteout);
- return Buffer.from(byteout);
- /* var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
- byteout = [];
- // benchmarking
- var duration = new Date().getTime() - time_start;
- //console.log('Encoding time: '+ duration + 'ms');
- //
- return jpegDataUri */
- };
- function setQuality(quality) {
- if (quality <= 0) {
- quality = 1;
- }
- if (quality > 100) {
- quality = 100;
- }
- if (currentQuality == quality) return; // don't recalc if unchanged
- var sf = 0;
- if (quality < 50) {
- sf = Math.floor(5000 / quality);
- } else {
- sf = Math.floor(200 - quality * 2);
- }
- initQuantTables(sf);
- currentQuality = quality; //console.log('Quality set to: '+quality +'%');
- }
- function init() {
- var time_start = new Date().getTime();
- if (!quality) quality = 50; // Create tables
- initCharLookupTable();
- initHuffmanTbl();
- initCategoryNumber();
- initRGBYUVTable();
- setQuality(quality);
- new Date().getTime() - time_start; //console.log('Initialization '+ duration + 'ms');
- }
- init();
- } //module.exports = encode;
- function encode$4(imgData, qu) {
- if (typeof qu === 'undefined') qu = 50;
- var encoder = new JPEGEncoder$1(qu);
- var data = encoder.encode(imgData, qu);
- return {
- data: data,
- width: imgData.width,
- height: imgData.height
- };
- } // helper function to get the imageData of an existing image on the current page.
- /* -*- tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
- /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
- /*
- Copyright 2011 notmasteryet
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
- // (www.w3.org/Graphics/JPEG/itu-t81.pdf)
- // - The JFIF specification can be found in the JPEG File Interchange Format
- // (www.w3.org/Graphics/JPEG/jfif3.pdf)
- // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
- // in PostScript Level 2, Technical Note #5116
- // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
- var JpegImage = function jpegImage() {
- 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]);
- var dctCos1 = 4017; // cos(pi/16)
- var dctSin1 = 799; // sin(pi/16)
- var dctCos3 = 3406; // cos(3*pi/16)
- var dctSin3 = 2276; // sin(3*pi/16)
- var dctCos6 = 1567; // cos(6*pi/16)
- var dctSin6 = 3784; // sin(6*pi/16)
- var dctSqrt2 = 5793; // sqrt(2)
- var dctSqrt1d2 = 2896; // sqrt(2) / 2
- function constructor() {}
- function buildHuffmanTable(codeLengths, values) {
- var k = 0,
- code = [],
- i,
- j,
- length = 16;
- while (length > 0 && !codeLengths[length - 1]) {
- length--;
- }
- code.push({
- children: [],
- index: 0
- });
- var p = code[0],
- q;
- for (i = 0; i < length; i++) {
- for (j = 0; j < codeLengths[i]; j++) {
- p = code.pop();
- p.children[p.index] = values[k];
- while (p.index > 0) {
- if (code.length === 0) throw new Error('Could not recreate Huffman Table');
- p = code.pop();
- }
- p.index++;
- code.push(p);
- while (code.length <= i) {
- code.push(q = {
- children: [],
- index: 0
- });
- p.children[p.index] = q.children;
- p = q;
- }
- k++;
- }
- if (i + 1 < length) {
- // p here points to last code
- code.push(q = {
- children: [],
- index: 0
- });
- p.children[p.index] = q.children;
- p = q;
- }
- }
- return code[0].children;
- }
- function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
- frame.precision;
- frame.samplesPerLine;
- frame.scanLines;
- var mcusPerLine = frame.mcusPerLine;
- var progressive = frame.progressive;
- frame.maxH;
- frame.maxV;
- var startOffset = offset,
- bitsData = 0,
- bitsCount = 0;
- function readBit() {
- if (bitsCount > 0) {
- bitsCount--;
- return bitsData >> bitsCount & 1;
- }
- bitsData = data[offset++];
- if (bitsData == 0xff) {
- var nextByte = data[offset++];
- if (nextByte) {
- throw new Error('unexpected marker: ' + (bitsData << 8 | nextByte).toString(16));
- } // unstuff 0
- }
- bitsCount = 7;
- return bitsData >>> 7;
- }
- function decodeHuffman(tree) {
- var node = tree,
- bit;
- while ((bit = readBit()) !== null) {
- node = node[bit];
- if (typeof node === 'number') return node;
- if (typeof node !== 'object') throw new Error('invalid huffman sequence');
- }
- return null;
- }
- function receive(length) {
- var n = 0;
- while (length > 0) {
- var bit = readBit();
- if (bit === null) return;
- n = n << 1 | bit;
- length--;
- }
- return n;
- }
- function receiveAndExtend(length) {
- var n = receive(length);
- if (n >= 1 << length - 1) return n;
- return n + (-1 << length) + 1;
- }
- function decodeBaseline(component, zz) {
- var t = decodeHuffman(component.huffmanTableDC);
- var diff = t === 0 ? 0 : receiveAndExtend(t);
- zz[0] = component.pred += diff;
- var k = 1;
- while (k < 64) {
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15,
- r = rs >> 4;
- if (s === 0) {
- if (r < 15) break;
- k += 16;
- continue;
- }
- k += r;
- var z = dctZigZag[k];
- zz[z] = receiveAndExtend(s);
- k++;
- }
- }
- function decodeDCFirst(component, zz) {
- var t = decodeHuffman(component.huffmanTableDC);
- var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
- zz[0] = component.pred += diff;
- }
- function decodeDCSuccessive(component, zz) {
- zz[0] |= readBit() << successive;
- }
- var eobrun = 0;
- function decodeACFirst(component, zz) {
- if (eobrun > 0) {
- eobrun--;
- return;
- }
- var k = spectralStart,
- e = spectralEnd;
- while (k <= e) {
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15,
- r = rs >> 4;
- if (s === 0) {
- if (r < 15) {
- eobrun = receive(r) + (1 << r) - 1;
- break;
- }
- k += 16;
- continue;
- }
- k += r;
- var z = dctZigZag[k];
- zz[z] = receiveAndExtend(s) * (1 << successive);
- k++;
- }
- }
- var successiveACState = 0,
- successiveACNextValue;
- function decodeACSuccessive(component, zz) {
- var k = spectralStart,
- e = spectralEnd,
- r = 0;
- while (k <= e) {
- var z = dctZigZag[k];
- var direction = zz[z] < 0 ? -1 : 1;
- switch (successiveACState) {
- case 0:
- // initial state
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15,
- r = rs >> 4;
- if (s === 0) {
- if (r < 15) {
- eobrun = receive(r) + (1 << r);
- successiveACState = 4;
- } else {
- r = 16;
- successiveACState = 1;
- }
- } else {
- if (s !== 1) throw new Error('invalid ACn encoding');
- successiveACNextValue = receiveAndExtend(s);
- successiveACState = r ? 2 : 3;
- }
- continue;
- case 1: // skipping r zero items
- case 2:
- if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
- r--;
- if (r === 0) successiveACState = successiveACState == 2 ? 3 : 0;
- }
- break;
- case 3:
- // set value for a zero item
- if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
- zz[z] = successiveACNextValue << successive;
- successiveACState = 0;
- }
- break;
- case 4:
- // eob
- if (zz[z]) zz[z] += (readBit() << successive) * direction;
- break;
- }
- k++;
- }
- if (successiveACState === 4) {
- eobrun--;
- if (eobrun === 0) successiveACState = 0;
- }
- }
- function decodeMcu(component, decode, mcu, row, col) {
- var mcuRow = mcu / mcusPerLine | 0;
- var mcuCol = mcu % mcusPerLine;
- var blockRow = mcuRow * component.v + row;
- var blockCol = mcuCol * component.h + col;
- decode(component, component.blocks[blockRow][blockCol]);
- }
- function decodeBlock(component, decode, mcu) {
- var blockRow = mcu / component.blocksPerLine | 0;
- var blockCol = mcu % component.blocksPerLine;
- decode(component, component.blocks[blockRow][blockCol]);
- }
- var componentsLength = components.length;
- var component, i, j, k, n;
- var decodeFn;
- if (progressive) {
- if (spectralStart === 0) decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;else decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
- } else {
- decodeFn = decodeBaseline;
- }
- var mcu = 0,
- marker;
- var mcuExpected;
- if (componentsLength == 1) {
- mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
- } else {
- mcuExpected = mcusPerLine * frame.mcusPerColumn;
- }
- if (!resetInterval) resetInterval = mcuExpected;
- var h, v;
- while (mcu < mcuExpected) {
- // reset interval stuff
- for (i = 0; i < componentsLength; i++) {
- components[i].pred = 0;
- }
- eobrun = 0;
- if (componentsLength == 1) {
- component = components[0];
- for (n = 0; n < resetInterval; n++) {
- decodeBlock(component, decodeFn, mcu);
- mcu++;
- }
- } else {
- for (n = 0; n < resetInterval; n++) {
- for (i = 0; i < componentsLength; i++) {
- component = components[i];
- h = component.h;
- v = component.v;
- for (j = 0; j < v; j++) {
- for (k = 0; k < h; k++) {
- decodeMcu(component, decodeFn, mcu, j, k);
- }
- }
- }
- mcu++; // If we've reached our expected MCU's, stop decoding
- if (mcu === mcuExpected) break;
- }
- } // find marker
- bitsCount = 0;
- marker = data[offset] << 8 | data[offset + 1];
- if (marker < 0xff00) {
- throw new Error('marker was not found');
- }
- if (marker >= 0xffd0 && marker <= 0xffd7) {
- // RSTx
- offset += 2;
- } else break;
- }
- return offset - startOffset;
- }
- function buildComponentData(frame, component) {
- var lines = [];
- var blocksPerLine = component.blocksPerLine;
- var blocksPerColumn = component.blocksPerColumn;
- var samplesPerLine = blocksPerLine << 3;
- var R = new Int32Array(64),
- r = new Uint8Array(64); // A port of poppler's IDCT method which in turn is taken from:
- // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
- // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
- // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
- // 988-991.
- function quantizeAndInverse(zz, dataOut, dataIn) {
- var qt = component.quantizationTable;
- var v0, v1, v2, v3, v4, v5, v6, v7, t;
- var p = dataIn;
- var i; // dequant
- for (i = 0; i < 64; i++) {
- p[i] = zz[i] * qt[i];
- } // inverse DCT on rows
- for (i = 0; i < 8; ++i) {
- var row = 8 * i; // check for all-zero AC coefficients
- 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) {
- t = dctSqrt2 * p[0 + row] + 512 >> 10;
- p[0 + row] = t;
- p[1 + row] = t;
- p[2 + row] = t;
- p[3 + row] = t;
- p[4 + row] = t;
- p[5 + row] = t;
- p[6 + row] = t;
- p[7 + row] = t;
- continue;
- } // stage 4
- v0 = dctSqrt2 * p[0 + row] + 128 >> 8;
- v1 = dctSqrt2 * p[4 + row] + 128 >> 8;
- v2 = p[2 + row];
- v3 = p[6 + row];
- v4 = dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128 >> 8;
- v7 = dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128 >> 8;
- v5 = p[3 + row] << 4;
- v6 = p[5 + row] << 4; // stage 3
- t = v0 - v1 + 1 >> 1;
- v0 = v0 + v1 + 1 >> 1;
- v1 = t;
- t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
- v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
- v3 = t;
- t = v4 - v6 + 1 >> 1;
- v4 = v4 + v6 + 1 >> 1;
- v6 = t;
- t = v7 + v5 + 1 >> 1;
- v5 = v7 - v5 + 1 >> 1;
- v7 = t; // stage 2
- t = v0 - v3 + 1 >> 1;
- v0 = v0 + v3 + 1 >> 1;
- v3 = t;
- t = v1 - v2 + 1 >> 1;
- v1 = v1 + v2 + 1 >> 1;
- v2 = t;
- t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
- v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
- v7 = t;
- t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
- v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
- v6 = t; // stage 1
- p[0 + row] = v0 + v7;
- p[7 + row] = v0 - v7;
- p[1 + row] = v1 + v6;
- p[6 + row] = v1 - v6;
- p[2 + row] = v2 + v5;
- p[5 + row] = v2 - v5;
- p[3 + row] = v3 + v4;
- p[4 + row] = v3 - v4;
- } // inverse DCT on columns
- for (i = 0; i < 8; ++i) {
- var col = i; // check for all-zero AC coefficients
- 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) {
- t = dctSqrt2 * dataIn[i + 0] + 8192 >> 14;
- p[0 * 8 + col] = t;
- p[1 * 8 + col] = t;
- p[2 * 8 + col] = t;
- p[3 * 8 + col] = t;
- p[4 * 8 + col] = t;
- p[5 * 8 + col] = t;
- p[6 * 8 + col] = t;
- p[7 * 8 + col] = t;
- continue;
- } // stage 4
- v0 = dctSqrt2 * p[0 * 8 + col] + 2048 >> 12;
- v1 = dctSqrt2 * p[4 * 8 + col] + 2048 >> 12;
- v2 = p[2 * 8 + col];
- v3 = p[6 * 8 + col];
- v4 = dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048 >> 12;
- v7 = dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048 >> 12;
- v5 = p[3 * 8 + col];
- v6 = p[5 * 8 + col]; // stage 3
- t = v0 - v1 + 1 >> 1;
- v0 = v0 + v1 + 1 >> 1;
- v1 = t;
- t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
- v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
- v3 = t;
- t = v4 - v6 + 1 >> 1;
- v4 = v4 + v6 + 1 >> 1;
- v6 = t;
- t = v7 + v5 + 1 >> 1;
- v5 = v7 - v5 + 1 >> 1;
- v7 = t; // stage 2
- t = v0 - v3 + 1 >> 1;
- v0 = v0 + v3 + 1 >> 1;
- v3 = t;
- t = v1 - v2 + 1 >> 1;
- v1 = v1 + v2 + 1 >> 1;
- v2 = t;
- t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
- v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
- v7 = t;
- t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
- v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
- v6 = t; // stage 1
- p[0 * 8 + col] = v0 + v7;
- p[7 * 8 + col] = v0 - v7;
- p[1 * 8 + col] = v1 + v6;
- p[6 * 8 + col] = v1 - v6;
- p[2 * 8 + col] = v2 + v5;
- p[5 * 8 + col] = v2 - v5;
- p[3 * 8 + col] = v3 + v4;
- p[4 * 8 + col] = v3 - v4;
- } // convert to 8-bit integers
- for (i = 0; i < 64; ++i) {
- var sample = 128 + (p[i] + 8 >> 4);
- dataOut[i] = sample < 0 ? 0 : sample > 0xff ? 0xff : sample;
- }
- }
- var i, j;
- for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
- var scanLine = blockRow << 3;
- for (i = 0; i < 8; i++) {
- lines.push(new Uint8Array(samplesPerLine));
- }
- for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
- quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
- var offset = 0,
- sample = blockCol << 3;
- for (j = 0; j < 8; j++) {
- var line = lines[scanLine + j];
- for (i = 0; i < 8; i++) {
- line[sample + i] = r[offset++];
- }
- }
- }
- }
- return lines;
- }
- function clampTo8bit(a) {
- return a < 0 ? 0 : a > 255 ? 255 : a;
- }
- constructor.prototype = {
- load: function load(path) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', path, true);
- xhr.responseType = 'arraybuffer';
- xhr.onload = function () {
- // TODO catch parse error
- var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
- this.parse(data);
- if (this.onload) this.onload();
- }.bind(this);
- xhr.send(null);
- },
- parse: function parse(data) {
- var offset = 0;
- data.length;
- function readUint16() {
- var value = data[offset] << 8 | data[offset + 1];
- offset += 2;
- return value;
- }
- function readDataBlock() {
- var length = readUint16();
- var array = data.subarray(offset, offset + length - 2);
- offset += array.length;
- return array;
- }
- function prepareComponents(frame) {
- var maxH = 0,
- maxV = 0;
- var component, componentId;
- for (componentId in frame.components) {
- if (frame.components.hasOwnProperty(componentId)) {
- component = frame.components[componentId];
- if (maxH < component.h) maxH = component.h;
- if (maxV < component.v) maxV = component.v;
- }
- }
- var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
- var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
- for (componentId in frame.components) {
- if (frame.components.hasOwnProperty(componentId)) {
- component = frame.components[componentId];
- var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
- var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
- var blocksPerLineForMcu = mcusPerLine * component.h;
- var blocksPerColumnForMcu = mcusPerColumn * component.v;
- var blocks = [];
- for (var i = 0; i < blocksPerColumnForMcu; i++) {
- var row = [];
- for (var j = 0; j < blocksPerLineForMcu; j++) {
- row.push(new Int32Array(64));
- }
- blocks.push(row);
- }
- component.blocksPerLine = blocksPerLine;
- component.blocksPerColumn = blocksPerColumn;
- component.blocks = blocks;
- }
- }
- frame.maxH = maxH;
- frame.maxV = maxV;
- frame.mcusPerLine = mcusPerLine;
- frame.mcusPerColumn = mcusPerColumn;
- }
- var jfif = null;
- var adobe = null;
- var frame, resetInterval;
- var quantizationTables = [],
- frames = [];
- var huffmanTablesAC = [],
- huffmanTablesDC = [];
- var fileMarker = readUint16();
- if (fileMarker != 0xffd8) {
- // SOI (Start of Image)
- throw new Error('SOI not found');
- }
- fileMarker = readUint16();
- while (fileMarker != 0xffd9) {
- // EOI (End of image)
- var i, j;
- switch (fileMarker) {
- case 0xff00:
- break;
- case 0xffe0: // APP0 (Application Specific)
- case 0xffe1: // APP1
- case 0xffe2: // APP2
- case 0xffe3: // APP3
- case 0xffe4: // APP4
- case 0xffe5: // APP5
- case 0xffe6: // APP6
- case 0xffe7: // APP7
- case 0xffe8: // APP8
- case 0xffe9: // APP9
- case 0xffea: // APP10
- case 0xffeb: // APP11
- case 0xffec: // APP12
- case 0xffed: // APP13
- case 0xffee: // APP14
- case 0xffef: // APP15
- case 0xfffe:
- // COM (Comment)
- var appData = readDataBlock();
- if (fileMarker === 0xffe0) {
- if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
- // 'JFIF\x00'
- jfif = {
- version: {
- major: appData[5],
- minor: appData[6]
- },
- densityUnits: appData[7],
- xDensity: appData[8] << 8 | appData[9],
- yDensity: appData[10] << 8 | appData[11],
- thumbWidth: appData[12],
- thumbHeight: appData[13],
- thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
- };
- }
- } // TODO APP1 - Exif
- if (fileMarker === 0xffee) {
- if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) {
- // 'Adobe\x00'
- adobe = {
- version: appData[6],
- flags0: appData[7] << 8 | appData[8],
- flags1: appData[9] << 8 | appData[10],
- transformCode: appData[11]
- };
- }
- }
- break;
- case 0xffdb:
- // DQT (Define Quantization Tables)
- var quantizationTablesLength = readUint16();
- var quantizationTablesEnd = quantizationTablesLength + offset - 2;
- while (offset < quantizationTablesEnd) {
- var quantizationTableSpec = data[offset++];
- var tableData = new Int32Array(64);
- if (quantizationTableSpec >> 4 === 0) {
- // 8 bit values
- for (j = 0; j < 64; j++) {
- var z = dctZigZag[j];
- tableData[z] = data[offset++];
- }
- } else if (quantizationTableSpec >> 4 === 1) {
- //16 bit
- for (j = 0; j < 64; j++) {
- var z = dctZigZag[j];
- tableData[z] = readUint16();
- }
- } else throw new Error('DQT: invalid table spec');
- quantizationTables[quantizationTableSpec & 15] = tableData;
- }
- break;
- case 0xffc0: // SOF0 (Start of Frame, Baseline DCT)
- case 0xffc1: // SOF1 (Start of Frame, Extended DCT)
- case 0xffc2:
- // SOF2 (Start of Frame, Progressive DCT)
- readUint16(); // skip data length
- frame = {};
- frame.extended = fileMarker === 0xffc1;
- frame.progressive = fileMarker === 0xffc2;
- frame.precision = data[offset++];
- frame.scanLines = readUint16();
- frame.samplesPerLine = readUint16();
- frame.components = {};
- frame.componentsOrder = [];
- var componentsCount = data[offset++],
- componentId;
- for (i = 0; i < componentsCount; i++) {
- componentId = data[offset];
- var h = data[offset + 1] >> 4;
- var v = data[offset + 1] & 15;
- var qId = data[offset + 2];
- frame.componentsOrder.push(componentId);
- frame.components[componentId] = {
- h: h,
- v: v,
- quantizationIdx: qId
- };
- offset += 3;
- }
- prepareComponents(frame);
- frames.push(frame);
- break;
- case 0xffc4:
- // DHT (Define Huffman Tables)
- var huffmanLength = readUint16();
- for (i = 2; i < huffmanLength;) {
- var huffmanTableSpec = data[offset++];
- var codeLengths = new Uint8Array(16);
- var codeLengthSum = 0;
- for (j = 0; j < 16; j++, offset++) {
- codeLengthSum += codeLengths[j] = data[offset];
- }
- var huffmanValues = new Uint8Array(codeLengthSum);
- for (j = 0; j < codeLengthSum; j++, offset++) {
- huffmanValues[j] = data[offset];
- }
- i += 17 + codeLengthSum;
- (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
- }
- break;
- case 0xffdd:
- // DRI (Define Restart Interval)
- readUint16(); // skip data length
- resetInterval = readUint16();
- break;
- case 0xffda:
- // SOS (Start of Scan)
- readUint16();
- var selectorsCount = data[offset++];
- var components = [],
- component;
- for (i = 0; i < selectorsCount; i++) {
- component = frame.components[data[offset++]];
- var tableSpec = data[offset++];
- component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
- component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
- components.push(component);
- }
- var spectralStart = data[offset++];
- var spectralEnd = data[offset++];
- var successiveApproximation = data[offset++];
- var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);
- offset += processed;
- break;
- case 0xffff:
- // Fill bytes
- if (data[offset] !== 0xff) {
- // Avoid skipping a valid marker.
- offset--;
- }
- break;
- default:
- if (data[offset - 3] == 0xff && data[offset - 2] >= 0xc0 && data[offset - 2] <= 0xfe) {
- // could be incorrect encoding -- last 0xFF byte of the previous
- // block was eaten by the encoder
- offset -= 3;
- break;
- }
- throw new Error('unknown JPEG marker ' + fileMarker.toString(16));
- }
- fileMarker = readUint16();
- }
- if (frames.length != 1) throw new Error('only single frame JPEGs supported'); // set each frame's components quantization table
- for (var i = 0; i < frames.length; i++) {
- var cp = frames[i].components;
- for (var j in cp) {
- cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];
- delete cp[j].quantizationIdx;
- }
- }
- this.width = frame.samplesPerLine;
- this.height = frame.scanLines;
- this.jfif = jfif;
- this.adobe = adobe;
- this.components = [];
- for (var i = 0; i < frame.componentsOrder.length; i++) {
- var component = frame.components[frame.componentsOrder[i]];
- this.components.push({
- lines: buildComponentData(frame, component),
- scaleX: component.h / frame.maxH,
- scaleY: component.v / frame.maxV
- });
- }
- },
- getData: function getData(width, height) {
- var scaleX = this.width / width,
- scaleY = this.height / height;
- var component1, component2, component3, component4;
- var component1Line, component2Line, component3Line, component4Line;
- var x, y;
- var offset = 0;
- var Y, Cb, Cr, K, C, M, Ye, R, G, B;
- var colorTransform;
- var dataLength = width * height * this.components.length;
- var data = new Uint8Array(dataLength);
- switch (this.components.length) {
- case 1:
- component1 = this.components[0];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
- for (x = 0; x < width; x++) {
- Y = component1Line[0 | x * component1.scaleX * scaleX];
- data[offset++] = Y;
- }
- }
- break;
- case 2:
- // PDF might compress two component data in custom colorspace
- component1 = this.components[0];
- component2 = this.components[1];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
- component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
- for (x = 0; x < width; x++) {
- Y = component1Line[0 | x * component1.scaleX * scaleX];
- data[offset++] = Y;
- Y = component2Line[0 | x * component2.scaleX * scaleX];
- data[offset++] = Y;
- }
- }
- break;
- case 3:
- // The default transform for three components is true
- colorTransform = true; // The adobe transform marker overrides any previous setting
- if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
- component1 = this.components[0];
- component2 = this.components[1];
- component3 = this.components[2];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
- component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
- component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
- for (x = 0; x < width; x++) {
- if (!colorTransform) {
- R = component1Line[0 | x * component1.scaleX * scaleX];
- G = component2Line[0 | x * component2.scaleX * scaleX];
- B = component3Line[0 | x * component3.scaleX * scaleX];
- } else {
- Y = component1Line[0 | x * component1.scaleX * scaleX];
- Cb = component2Line[0 | x * component2.scaleX * scaleX];
- Cr = component3Line[0 | x * component3.scaleX * scaleX];
- R = clampTo8bit(Y + 1.402 * (Cr - 128));
- G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
- B = clampTo8bit(Y + 1.772 * (Cb - 128));
- }
- data[offset++] = R;
- data[offset++] = G;
- data[offset++] = B;
- }
- }
- break;
- case 4:
- if (!this.adobe) throw new Error('Unsupported color mode (4 components)'); // The default transform for four components is false
- colorTransform = false; // The adobe transform marker overrides any previous setting
- if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
- component1 = this.components[0];
- component2 = this.components[1];
- component3 = this.components[2];
- component4 = this.components[3];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
- component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
- component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
- component4Line = component4.lines[0 | y * component4.scaleY * scaleY];
- for (x = 0; x < width; x++) {
- if (!colorTransform) {
- C = component1Line[0 | x * component1.scaleX * scaleX];
- M = component2Line[0 | x * component2.scaleX * scaleX];
- Ye = component3Line[0 | x * component3.scaleX * scaleX];
- K = component4Line[0 | x * component4.scaleX * scaleX];
- } else {
- Y = component1Line[0 | x * component1.scaleX * scaleX];
- Cb = component2Line[0 | x * component2.scaleX * scaleX];
- Cr = component3Line[0 | x * component3.scaleX * scaleX];
- K = component4Line[0 | x * component4.scaleX * scaleX];
- C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
- M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
- Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
- }
- data[offset++] = 255 - C;
- data[offset++] = 255 - M;
- data[offset++] = 255 - Ye;
- data[offset++] = 255 - K;
- }
- }
- break;
- default:
- throw new Error('Unsupported color mode');
- }
- return data;
- },
- copyToImageData: function copyToImageData(imageData, formatAsRGBA) {
- var width = imageData.width,
- height = imageData.height;
- var imageDataArray = imageData.data;
- var data = this.getData(width, height);
- var i = 0,
- j = 0,
- x,
- y;
- var Y, K, C, M, R, G, B;
- switch (this.components.length) {
- case 1:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- Y = data[i++];
- imageDataArray[j++] = Y;
- imageDataArray[j++] = Y;
- imageDataArray[j++] = Y;
- if (formatAsRGBA) {
- imageDataArray[j++] = 255;
- }
- }
- }
- break;
- case 3:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- R = data[i++];
- G = data[i++];
- B = data[i++];
- imageDataArray[j++] = R;
- imageDataArray[j++] = G;
- imageDataArray[j++] = B;
- if (formatAsRGBA) {
- imageDataArray[j++] = 255;
- }
- }
- }
- break;
- case 4:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- C = data[i++];
- M = data[i++];
- Y = data[i++];
- K = data[i++];
- R = 255 - clampTo8bit(C * (1 - K / 255) + K);
- G = 255 - clampTo8bit(M * (1 - K / 255) + K);
- B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
- imageDataArray[j++] = R;
- imageDataArray[j++] = G;
- imageDataArray[j++] = B;
- if (formatAsRGBA) {
- imageDataArray[j++] = 255;
- }
- }
- }
- break;
- default:
- throw new Error('Unsupported color mode');
- }
- }
- };
- return constructor;
- }();
- function decode$6(jpegData, opts) {
- var defaultOpts = {
- useTArray: false,
- // "undefined" means "Choose whether to transform colors based on the image’s color model."
- colorTransform: undefined,
- formatAsRGBA: true
- };
- if (opts) {
- if (typeof opts === 'object') {
- opts = {
- useTArray: typeof opts.useTArray === 'undefined' ? defaultOpts.useTArray : opts.useTArray,
- colorTransform: typeof opts.colorTransform === 'undefined' ? defaultOpts.colorTransform : opts.colorTransform,
- formatAsRGBA: typeof opts.formatAsRGBA === 'undefined' ? defaultOpts.formatAsRGBA : opts.formatAsRGBA
- };
- } else {
- // backwards compatiblity, before 0.3.5, we only had the useTArray param
- opts = defaultOpts;
- opts.useTArray = true;
- }
- } else {
- opts = defaultOpts;
- }
- var arr = new Uint8Array(jpegData);
- var decoder = new JpegImage();
- decoder.parse(arr);
- decoder.colorTransform = opts.colorTransform;
- var channels = opts.formatAsRGBA ? 4 : 3;
- var bytesNeeded = decoder.width * decoder.height * channels;
- try {
- var image = {
- width: decoder.width,
- height: decoder.height,
- data: opts.useTArray ? new Uint8Array(bytesNeeded) : new Buffer(bytesNeeded)
- };
- } catch (err) {
- if (err instanceof RangeError) {
- throw new Error('Could not allocate enough memory for the image. ' + 'Required: ' + bytesNeeded);
- } else {
- throw err;
- }
- }
- decoder.copyToImageData(image, opts.formatAsRGBA);
- return image;
- }
- var JPEGEncoder = {
- encode: encode$4,
- decode: decode$6
- };
- function n$3(e, t, i) {
- e && (e = e.toLowerCase().trim());
- var n = new I.UP.clone(),
- r = Math.PI / 3,
- o = Math.PI / 2;
- switch (e) {
- case 'left':
- i.copy(t), i.applyAxisAngle(n, o);
- break;
- case 'right':
- i.copy(t), i.applyAxisAngle(n, -o);
- break;
- case 'forwardleft':
- i.copy(t), i.applyAxisAngle(n, r);
- break;
- case 'forwardright':
- i.copy(t), i.applyAxisAngle(n, -r);
- break;
- case 'forward':
- default:
- i.copy(t);
- }
- return i;
- }
- function r$2(e, t) {
- if (e) {
- var i = {
- pano: e,
- lookAtPoint: null,
- duration: null,
- maxDistanceOverride: null,
- skipWarpingCheck: !1
- };
- this.player.flyToPano(i, function () {
- t && t({
- success: !0,
- message: 'Transition complete.'
- });
- });
- } else R.warn('Showcase -> clickPanoObject: Unable to find pano.'), t && t({
- success: !1,
- error: 'Unable to find pano.'
- });
- }
- function o$1(e, t) {
- var i = this.findRankedPano(e, t);
- return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedPanoObject: Unable to find nearby pano.'), null);
- }
- function a$2(e, t) {
- var i = this.findRankedtag(e, t);
- return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedtagObject: Unable to find nearby tag.'), null);
- }
- function s$2(e, t) {
- t.copy(I.FORWARD), e.getDirection(t);
- }
- var myObjects = {
- director: null,
- player: null,
- controls: null,
- sceneRenderer: null,
- model: null,
- //app中会调用
- init: function init(director, controls, player, sceneRenderer) {
- this.director = director;
- this.player = player;
- this.controls = controls;
- this.sceneRenderer = sceneRenderer;
- },
- handleToObject: {},
- objectToHandle: {},
- handleCount: 0,
- onMessageReceive: function onMessageReceive(e) {
- if (e) {
- var t = e.targetFunction,
- i = e.params,
- n = e.onDone;
- t && this[t] && this[t](i, n);
- }
- },
- waitForInit: function waitForInit(e, t) {
- F.then(t.bind({
- success: !0,
- message: 'Init complete.'
- }));
- },
- moveToPano: function (e, t) {
- var i = new THREE.Euler(0, 0, 0, 'YXZ'),
- n = new THREE.Quaternion();
- return function (e, t) {
- var r = e.pano,
- o = e.rotation,
- a = e.transition;
- if (!this.model) return t({
- success: !1,
- error: 'The model has not been loaded yet'
- });
- var s = this.model.panos.get(r);
- if (!s) return t({
- success: !1,
- error: r + ' does not exist in this model'
- });
- if (!o) return t({
- sucess: !1,
- erorr: o + ' is not a valid rotation'
- });
- 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);
- var l = {
- success: !0,
- message: r
- };
- if (a === A.FADEOUT) n.setFromEuler(i), this.player.warpToPano(s, n, null, null, b.BLACK, null, null, t.bind(this, l));else {
- var h, u;
- a === A.INSTANT && (h = 0, u = 0);
- var d = I.FORWARD.clone().applyEuler(i).add(s.position);
- this.player.flyToPano({
- pano: s,
- lookAtPoint: d,
- duration: h,
- aimDuration: u
- }, t.bind(this, l));
- }
- };
- }(),
- moveInDirection: function moveInDirection(e, t) {
- var i = e.direction;
- return 'undefined' == typeof v[i] ? (R.warn('Showcase -> moveInDirection: Cannot move in invalid direction.'), void (t && t({
- success: !1,
- error: 'Invalid direction.'
- }))) : void this.player.flyLocalDirection(I[i].clone()).then(function (e) {
- t(e ? {
- success: !0,
- message: 'moved ' + i
- } : {
- success: !1,
- error: 'Cannot move in direction: ' + i
- });
- });
- },
- getPose: function getPose(e, t) {
- this.player.camera.position, new THREE.Euler().setFromQuaternion(this.player.camera.quaternion, 'YXZ');
- return t({
- success: !0,
- message: B(this.player)
- });
- },
- //截图,我们有用到
- takeScreenShot: function () {
- var camera = new THREE.PerspectiveCamera(),
- webGLRenderTarget = new THREE.WebGLRenderTarget(); //图片分辨率,图片质量,回调函数
- return function (imgInfo, callFunc) {
- if (!imgInfo.resolution) return callFunc({
- success: !1,
- error: 'An invalid resolution was specified'
- });
- if (imgInfo.resolution.width === -1 || imgInfo.resolution.height === -1) {
- var size = this.sceneRenderer.renderer.getSize();
- imgInfo.resolution.width = size.width;
- imgInfo.resolution.height = size.height;
- }
- common$1.setCameraLayers(camera, ['DEFAULT', 'SKYBOX', 'MODEL']); //camera.layers.set(RenderLayers.DEFAULT)
- if (imgInfo.visibleObjects) {
- imgInfo.visibleObjects.showPucks && camera.layers.enable(RenderLayers.PANOMARKERS);
- imgInfo.visibleObjects.showReticule && camera.layers.enable(RenderLayers.RETICULE);
- }
- var width = imgInfo.resolution.width,
- height = imgInfo.resolution.height,
- aspect = width / height;
- 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双面时有效否则是黑色的
- webGLRenderTarget.setSize(width, height), this.sceneRenderer.renderer.setRenderTarget(webGLRenderTarget);
- if (imgInfo.bgOpacity != void 0) {
- imgInfo.bgOpacityOld = this.sceneRenderer.renderer.getClearAlpha();
- this.sceneRenderer.setBg(null, imgInfo.bgOpacity);
- }
- var alpha = this.sceneRenderer.renderer.getClearAlpha();
- this.sceneRenderer.renderer.render(this.sceneRenderer.scene, camera);
- this.sceneRenderer.renderer.setRenderTarget(null);
- if (imgInfo.bgOpacity != void 0) {
- this.sceneRenderer.setBg(null, imgInfo.bgOpacityOld);
- } //var pixelBuffer = new Uint8Array(width * height * 4)
- //this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer)
- // var c = JPEGEncoder.encode({
- // data: pixelBuffer,
- // width: width,
- // height: height,
- // heading: 180,
- // pitch: 0
- // }, {
- // quality: imgInfo.quality || 75,
- // flipY: !1 //许钟文改 原本是true. 不在这里翻转,因为它翻转后会使顶部像素重复高10像素,底部少了10像素。
- // })
- // , imgBase64Url = "data:image/jpg;base64," + common.uint8ToBase64(c.data);
- //https://github.com/eugeneware/jpeg-js/blob/master/lib/encoder.js
- var usePng = alpha < 1 || imgInfo.png;
- if (usePng) {
- var imgBase64Url = common$1.renderTargetToDataUrl(webGLRenderTarget, webGLRenderTarget.width, webGLRenderTarget.height, this.sceneRenderer.renderer, imgInfo.quality ? imgInfo.quality / 100 : undefined, true);
- } else {
- var pixelBuffer = new Uint8Array(width * height * 4);
- this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer);
- var rawImageData = JPEGEncoder.encode( //无法透明
- {
- data: pixelBuffer,
- width: width,
- height: height,
- heading: 180,
- pitch: 0
- }, imgInfo.quality);
- var imgBase64Url = 'data:image/jpg;base64,' + common$1.uint8ToBase64(rawImageData.data);
- } //jpg 开头通常是 /9j/
- callFunc({
- success: !0,
- message: imgBase64Url,
- camera: camera
- });
- };
- }(),
- findRankedPano: function (e, t) {
- var i = new THREE.Vector3(),
- r = new THREE.Vector3();
- return function (e, t) {
- s$2(this.player, r), n$3(t, r, i);
- var o = this.player.rankedPanoInDirection(e, i);
- if (o) {
- var a = this.objectToHandle[o.id];
- return a || (this.objectToHandle[o.id] = a = this.handleCount++, this.handleToObject[a] = o), a;
- }
- return R.warn('Showcase -> findRankedPano: Unable to find nearby pano.'), -1;
- };
- }(),
- findRankedtag: function (e, t) {
- var i = new THREE.Vector3(),
- r = new THREE.Vector3();
- return function (e, t) {
- s$2(this.player, r), n$3(t, r, i);
- var o = this.player.rankedtagInDirection(e, i);
- if (o) {
- var a = this.objectToHandle[o.sid];
- return a || (this.objectToHandle[o.sid] = a = this.handleCount++, this.handleToObject[a] = o), a;
- }
- return R.warn('Showcase -> findRankedtag: Unable to find nearby tag.'), -1;
- };
- }(),
- clickNearesttag: function clickNearesttag(e) {
- this.clickRankedtag(0, e);
- },
- clickRankedtag: function clickRankedtag(e, t) {
- var i = a$2.call(this, e, t);
- i && O.call(this, i);
- },
- clickNearestPano: function clickNearestPano(e, t) {
- this.clickRankedPano(0, e, t);
- },
- clickRankedPano: function clickRankedPano(e, t, i) {
- var n = o$1.call(this, e, t);
- n ? r$2.call(this, n, i) : i(null);
- },
- clickPano: function clickPano(e, t) {
- var i = this.handleTable[e];
- i ? r$2.call(this, i, t) : t(null);
- },
- rotateDirection: function () {
- return function (e, t) {
- var i = e.direction,
- n = e.angle;
- if (!P.active) {
- var r = 0,
- o = 0,
- a = 0,
- s = 0;
- if (!n || isNaN(n)) return R.warn('Showcase -> rotateDirection: Invalid rotation angle.'), void (t && t({
- success: !1,
- error: 'Invalid rotation angle.'
- }));
- if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotateDirection: Cannot rotate while transitioning'), void (t && t({
- success: !1,
- error: 'Cannot rotate while transitioning'
- }));
- if (i === v.RIGHT || i === v.LEFT) i === v.RIGHT && (n = -n), r = n > 0 ? -1 : 1, a = n;else {
- if (i !== v.UP && i !== v.DOWN) return R.warn('Showcase -> rotateDirection: Invalid direction for rotation: ' + i), void (t && t({
- success: !1,
- error: 'Invalid direction for rotation.'
- }));
- if (this.player.mode === E.FLOORPLAN) return R.warn('Showcase -> rotateDirection: Cannot rotate ' + i + ' in floorplan mode'), void (t && t({
- success: !1,
- error: 'Cannot rotate ' + i + ' in floorplan mode'
- }));
- 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({
- success: !1,
- error: 'Already at maximum rotation in direction: ' + i
- }));
- o = n > 0 ? 1 : -1, s = n;
- }
- var l = n;
- n = c.Math.degToRad(n), a = c.Math.degToRad(a), s = c.Math.degToRad(s);
- var h = this.controls.activeControl,
- u = function u() {
- h.stopRotating(!0), t && t({
- success: !0,
- message: 'Rotated ' + l.toFixed(2) + '° in direction: ' + e.direction
- });
- };
- h.startRotating(r, o), P.start(a, s, this.player, u);
- }
- };
- }(),
- rotate: function () {
- var e = new THREE.Vector3(),
- t = new THREE.Vector3();
- return function (i, n) {
- var r = i.xAngle,
- o = i.yAngle;
- if (!P.active) {
- if (r = r || 0, o = o || 0, isNaN(r) || isNaN(o)) return R.warn('Showcase -> rotate: Invalid rotation angle.'), void (n && n({
- success: !1,
- error: 'Invalid rotation angle.'
- }));
- if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotate: Cannot rotate while transitioning'), void (n && n({
- success: !1,
- error: 'Cannot rotate while transitioning'
- }));
- Math.abs(r) < 0.01 && (r = 0), Math.abs(o) < 0.01 && (o = 0);
- var a = o;
- o = N.call(this, o), r = -r;
- var s = a > 0 ? 'UP' : 'DOWN';
- if (!r && a && !o) return R.warn('Showcase -> rotate: Already at maximum rotation in direction: ' + s), void (n && n({
- success: !1,
- error: 'Already at maximum rotation in direction: ' + s
- }));
- a > o && R.warn('Showcase -> rotate: Reached maximum rotation in direction: ' + s);
- var l = o;
- 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);
- var h = (e.angleTo(t), r > 0 ? -1 : r < 0 ? 1 : 0),
- u = o > 0 ? 1 : o < 0 ? -1 : 0;
- Math.abs(r) > Math.abs(o) ? u *= Math.abs(o / r) : Math.abs(o) > Math.abs(r) && (h *= Math.abs(r / o));
- var d = this.controls.activeControl,
- p = function p() {
- d.stopRotating(!0), n && n({
- success: !0,
- message: 'Rotated ' + i.xAngle.toFixed(2) + '° horizontally, ' + l.toFixed(2) + '° vertically'
- });
- };
- d.startRotating(h, u), P.start(r, o, this.player, p);
- }
- };
- }(),
- panCamera: function panCamera(e, t) {
- function i(e) {
- switch (r.removeAllListeners(T.AutoPanComplete), r.removeAllListeners(T.AutoPanInterrupt), r.removeAllListeners(T.AutoPanClamped), e) {
- case T.AutoPanInterrupt:
- t({
- success: !0,
- message: 'Camera panning interrupted.'
- });
- break;
- case T.AutoPanClamped:
- if (r.autoPanPosition.x !== n.x || r.autoPanPosition.z !== n.z) {
- 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({
- success: !1,
- error: 'Already at edge of current model bounds.'
- });
- var i = 'The view point is outside the bounds for the current model. ';
- i += 'The view point was clamped to ' + o(r.target.x, r.target.z), console.warn(i);
- }
- case T.AutoPanComplete:
- t({
- success: !0,
- message: 'Panned camera to position ' + o(r.autoPanPosition.x, r.autoPanPosition.z)
- });
- }
- }
- if (this.player.mode !== E.DOLLHOUSE && this.player.mode !== E.FLOORPLAN) return t({
- success: !1,
- error: 'Camera panning is not available in the current mode: ' + this.player.mode
- });
- var n = e.position,
- r = this.player.control;
- r.setAutoPanPosition(n.x, n.z), r.autoPan = !0;
- var o = function o(e, t) {
- return '(' + e.toFixed(2) + ', ' + t.toFixed(2) + ')';
- };
- 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));
- },
- click: function click(e, t) {
- var i = e.x,
- n = e.y,
- r = e.percentage;
- 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);
- },
- mouseOver: function mouseOver(e, t) {
- var i = e.x,
- n = e.y,
- r = e.percentage;
- r === !0 && (i = i / 100 * $('#player').width(), n = n / 100 * $('#player').height()), this.player.handleInputMove(i, n), this.player.updateIntersect();
- },
- moveToMode: function moveToMode(e, t) {
- function i(e) {
- t(e ? {
- success: !1,
- error: 'Failed to load new mode: ' + e
- } : {
- success: !0,
- message: 'Moved to new mode: ' + n
- });
- }
- var n = e.mode;
- n === E.PANORAMA || n === E.DOLLHOUSE || n === E.FLOORPLAN ? this.director.changeMode(n).then(function () {
- i();
- }, function (e) {
- i(e);
- }) : t({
- success: !1,
- error: 'Invalid mode selection'
- });
- }
- };
- var automation = {
- init: function init(e, t, i, n, r) {
- myObjects.init(e, t, i, r);
- },
- //许钟文加:
- takeScreenShot: function takeScreenShot(o, f) {
- myObjects.takeScreenShot(o, f);
- }
- };
- defineComponent('Screenshot', function () {
- var _execute, _recover, _toFish, _unFish;
- return _execute = /*#__PURE__*/_classPrivateFieldKey("execute"), _recover = /*#__PURE__*/_classPrivateFieldKey("recover"), _toFish = /*#__PURE__*/_classPrivateFieldKey("toFish"), _unFish = /*#__PURE__*/_classPrivateFieldKey("unFish"), /*#__PURE__*/function () {
- function Screenshot() {
- _classCallCheck(this, Screenshot);
- Object.defineProperty(this, _execute, {
- value: _execute2
- });
- Object.defineProperty(this, _recover, {
- writable: true,
- value: function value(changeBefore) {
- this.player.reticule.visible = true;
- this.player.model.floorLogos.firstLogo.visible = changeBefore.fL0;
- this.player.model.floorLogos.secondLogo.visible = changeBefore.fL1;
- this.player.path.currentPanoMarker.mesh.visible = true;
- this.player.model.panos.list.forEach(function (pano) {
- pano.isAligned() && (pano.marker.visible = pano.marker.forceHide);
- });
- this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = null;
- if (this.player.mode != Viewmode$1.PANORAMA) {
- if (ModelSide.side === null) {
- //兼容ModelSide
- this.player.model.chunks.forEach(function (chunk) {
- chunk.material.side = THREE.FrontSide;
- });
- }
- var skyboxBG = this.$app.core.get('SceneRenderer').scene.skyboxBG;
- skyboxBG && (skyboxBG.material.side = THREE.BackSide);
- }
- this.player.model.skybox.material.side = THREE.BackSide;
- this.player.OverlayManager.show('all', true);
- if (changeBefore.includes && changeBefore.includes.includes('billboards')) {
- this.player.OverlayManager.decoratePlaneGroup.children.forEach(function (e) {
- return e.show('screenshot');
- });
- } else {
- this.player.OverlayManager.show('all', true);
- }
- this.player.GLTFEditor.show('all', true);
- changeBefore.notHideMonitors || this.player.$app.Camera.monitor.control.showAll();
- }
- });
- Object.defineProperty(this, _toFish, {
- writable: true,
- value: function value(changeBefore) {
- if (!this.player.model.fishSkybox) {
- this.player.model.fishSkybox = new THREE.Mesh(new THREE.SphereGeometry(constants$4.skyRadius, 80, 50), this.player.model.skybox.material);
- this.core.get('SceneRenderer').scene.add(this.player.model.fishSkybox);
- }
- this.player.model.fishSkybox.position.copy(this.player.position);
- this.player.model.fishSkybox.visible = true;
- this.player.model.skybox.visible = false;
- for (var i = 0; i < this.player.model.chunks.length; i++) {
- //场景过小的话可能比fishSkybox还小所以隐藏
- this.player.model.chunks[i].visible = false;
- }
- changeBefore.cameraPosOld = this.player.camera.position.clone();
- this.player.cameraControls.activeControl.fishState = true; //切换到鱼眼镜头
- this.player.cameraControls.activeControl.camera.fov = settings$3.fish.insideFOV;
- this.player.cameraControls.activeControl.target.copy(this.player.position);
- this.player.updateFromControls();
- }
- });
- Object.defineProperty(this, _unFish, {
- writable: true,
- value: function value(changeBefore) {
- if (this.player.mode == Viewmode$1.PANORAMA) {
- this.player.cameraControls.activeControl.camera.position.copy(changeBefore.cameraPosOld);
- this.player.cameraControls.activeControl.fishState = false; //this.player.cameraControls.activeControl.update(0);
- this.player.model.fishSkybox.visible = false;
- this.player.model.skybox.visible = true;
- for (var i = 0; i < this.player.model.chunks.length; i++) {
- this.player.model.chunks[i].visible = true;
- }
- this.player.cameraControls.activeControl.camera.fov = settings$3.insideFOV;
- }
- this.player.updateFromControls();
- }
- });
- }
- _createClass(Screenshot, [{
- key: "capture",
- value: function capture(options) {
- this.player = this.$app.core.get('Player');
- console.log(options);
- if (this.player.flying || this.player.isWarping() || this.player.mode == Viewmode$1.TRANSITIONING) {
- logger$1.warn('you take a screenshot on flying or transitioning mode!!');
- } //之前这么写,改变了当前canvas大小截图:R.updateScreenSize(options);
- var _this$player$getSize = this.player.getSize(),
- clientWidth = _this$player$getSize.clientWidth,
- clientHeight = _this$player$getSize.clientHeight;
- var fL0 = this.player.model.floorLogos.firstLogo.visible;
- var fL1 = this.player.model.floorLogos.secondLogo.visible;
- this.player.model.panos.list.forEach(function (pano) {
- pano.isAligned() && (pano.marker.forceHide = pano.marker.visible, pano.marker.visible = false);
- });
- this.player.reticule.visible = false;
- this.player.model.floorLogos.firstLogo.visible = false;
- this.player.model.floorLogos.secondLogo.visible = false;
- this.player.path.currentPanoMarker.mesh.visible = false; //因为修改了截图时的projection中y的正负,如果side不反向,会黑(可能因为渲染到了背面?)。
- if (this.player.mode != Viewmode$1.PANORAMA) {
- if (ModelSide.side === null) {
- //兼容ModelSide
- this.player.model.chunks.forEach(function (chunk) {
- chunk.material.side = THREE.BackSide;
- });
- } //this.$app.core.get('SceneRenderer').scene.skyboxBG.material.side = THREE.FrontSide
- }
- this.player.model.skybox.material.side = THREE.DoubleSide;
- this.player.GLTFEditor.hide('all');
- options.notHideMonitors || this.player.$app.Camera.monitor.control.hideAll();
- if (options.includes && options.includes.includes('billboards')) {
- // 显示指示牌
- this.player.OverlayManager.decoratePlaneGroup.children.forEach(function (e) {
- return e.hide('screenshot');
- });
- } else {
- this.player.OverlayManager.hide('all');
- }
- if (options.snapshotTopview && this.player.mode == Viewmode$1.FLOORPLAN) {
- this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = clientWidth / clientHeight;
- }
- options.changeBefore = Object.assign({}, options, {
- fL0,
- fL1
- }); // fL0, fL1, notHideTags: options.notHideTags, notHideMonitors: options.notHideMonitors,
- _classPrivateFieldBase(this, _execute)[_execute](options);
- }
- /**
- * 按顺序在当前视角一个个截图
- * @param {*} options
- * @param {*} lastState
- */
- }]);
- return Screenshot;
- }();
- function _execute2(options, lastState) {
- var _this = this;
- var task, state;
- if (options.tasks.unFish && options.tasks.unFish.length) {
- task = options.tasks.unFish.splice(0, 1)[0];
- state = 'unFish';
- } else if (options.tasks.fish && options.tasks.fish.length) {
- task = options.tasks.fish.splice(0, 1)[0];
- state = 'fish';
- } else {
- state = 'finish';
- } //turn state:
- if (lastState == 'unFish' && state == 'fish') {
- //变成鱼眼
- _classPrivateFieldBase(this, _toFish)[_toFish](options.changeBefore);
- } else if (lastState == 'fish' && state == 'finish') {
- //结束鱼眼
- _classPrivateFieldBase(this, _unFish)[_unFish](options.changeBefore);
- _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
- } else if (state == 'finish') {
- _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
- } else {
- logger$1.info('other state:' + lastState + '|' + state);
- }
- if (state != 'finish') automation.takeScreenShot({
- resolution: {
- width: task.width,
- height: task.height
- },
- bgOpacity: task.bgOpacity,
- quality: options.quality || (settings$3.isSafari ? 50 : 65)
- }, function (d) {
- options.done && options.done(d.message, task.name, d);
- _classPrivateFieldBase(_this, _execute)[_execute](options, state);
- });
- }
- });
- var PathDisplayMode = Object.freeze({
- Show: 0,
- Hide: 1,
- Retain: 2
- });
- var PathDiscardMode = Object.freeze({
- Standard: 0,
- Slow: 1,
- Retain: 2
- });
- 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); }; }
- 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; } }
- defineComponent('Director', function () {
- return /*#__PURE__*/function (_EventEmitter) {
- _inherits(Director, _EventEmitter);
- var _super = _createSuper$S(Director);
- function Director() {
- var _this;
- _classCallCheck(this, Director);
- _this = _super.call(this);
- _this.endlessLoop = settings$3.warp.loop;
- _this.clock = new THREE.Clock(true);
- _this.currentItem = null;
- _this.destinationItem = null;
- _this.tourIsPlaying = false;
- _this.nextFunc = null;
- _this.onTheBus = false;
- _this.reachSource = null;
- _this.interrupted = false;
- _this.nItems = 0;
- _this.currentScript = 0;
- _this.walkingSectionPaused = false;
- _this.C = Object.freeze({
- None: 0,
- Moving: 1,
- Aiming: 2,
- Interlude: 3
- });
- _this.I = Object.freeze({
- Forward: 1,
- NoChange: 0,
- Backwards: -1
- });
- _this.transitionStage = _this.C.None;
- _this.player = _this.$app.core.get('Player');
- return _this;
- }
- _createClass(Director, [{
- key: "init",
- value: function init() {
- this.updateModel();
- this.resetAll();
- this.bindEvents();
- }
- }, {
- key: "resetAll",
- value: function resetAll() {
- this.currentItem = null;
- this.destinationItem = null;
- this.tourIsPlaying = false;
- this.transitionStage = this.C.None;
- this.nextFunc = null;
- this.onTheBus = false;
- this.reachSource = null;
- this.interrupted = false;
- if (this.player.model) {
- switch (this.player.model.switch_scene_type) {
- case 1:
- this.defaultWarpStyle = WarpStyle.BLACK;
- break;
- case 2:
- this.defaultWarpStyle = WarpStyle.WALK;
- break;
- case 3:
- this.defaultWarpStyle = WarpStyle.STD;
- break;
- default:
- this.defaultWarpStyle = WarpStyle.BLACK;
- break;
- }
- } else {
- this.defaultWarpStyle = WarpStyle.BLACK, logger$1.warn('No model yet, choosing "' + this.defaultWarpStyle + '" transitions');
- }
- this.resetSpecialTransition();
- }
- }, {
- key: "updateModel",
- value: function updateModel() {
- this.player.model = this.modelManager.getActiveModel();
- this.nItems = 0;
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- 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));
- }
- }, {
- key: "handleFlyToWarpInterruption",
- value: function handleFlyToWarpInterruption(warpStyle, func) {
- if (warpStyle === WarpStyle.WALK) {
- this.interrupt(BlackoutStyle.NONE), this.pauseWalkingSection(), this.player.fastForwardActivePanoFlight();
- } else if (this.transitionStage === this.C.Interlude) {
- this.interrupt(BlackoutStyle.NONE);
- func && func();
- }
- }
- }, {
- key: "handlePlayerMove",
- value: function handlePlayerMove(t) {
- this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
- }
- }, {
- key: "handlePlayerPanoChosen",
- value: function handlePlayerPanoChosen(e, t) {
- this.intermediateState() || e.id === t.id || (this.onTheBus = !1, this.emit('update.controls'));
- }
- }, {
- key: "handlePlayerModeChanged",
- value: function handlePlayerModeChanged(e, t) {
- this.intermediateState() || e === t || (this.onTheBus = !1, this.emit('update.controls'));
- }
- }, {
- key: "handlePlayerInputStart",
- value: function handlePlayerInputStart(e) {
- this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
- }
- }, {
- key: "handlePlayerFlyingStarted",
- value: function handlePlayerFlyingStarted() {
- this.clearWalkingSectionPaused();
- }
- }, {
- key: "describe",
- value: function describe() {
- return {
- nItems: this.nItems,
- currentItem: this.currentItem,
- destinationItem: this.destinationItem,
- tourIsPlaying: this.tourIsPlaying,
- onTheBus: this.onTheBus,
- endlessLoop: this.endlessLoop,
- viewMode: this.player.mode,
- inTransition: this._inTransition(),
- transitionStage: this.transitionStage,
- tourInProgress: this.tourInProgress
- };
- }
- }, {
- key: "_inTransition",
- value: function _inTransition() {
- return this.player.flying || this.player.isWarping() || this.player.isWaitingToWarp() || this.player.mode === Viewmode.TRANSITIONING || this.tourIsPlaying;
- }
- }, {
- key: "bounceable",
- value: function bounceable() {
- var e = this.clock.getDelta();
- return this.isInterrupted() || e < 0.9 && e > 0.01 || this.player.flying && !this.player.isWarping();
- }
- }, {
- key: "currentMoveDirection",
- value: function currentMoveDirection() {
- 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;
- }
- }, {
- key: "clearPath",
- value: function clearPath() {
- this._inTransition() || this.player.path.discardPathObject();
- }
- }, {
- key: "allFloors",
- value: function allFloors() {
- /* var t = this.player.controls[this.player.mode];
- t && t.emit("move", "gui"),
- this.player.controls[ViewMode.PANORAMA].emit(ControlEvents.InteractionGui, "floor-control"),*/
- this.player.model.toggleAllFloors();
- }
- }, {
- key: "actionComplete",
- value: function actionComplete(t) {
- var state = this.transitionStage;
- 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');
- if (this.currentScript && (this.player.model.enableTagMovie && state === this.C.Interlude || this.player.model.enableTagMovie && state === this.C.Aiming && this.nextFunc === null)) {
- this.openTag();
- } else {
- if (this.nextFunc) {
- var e = this.nextFunc;
- this.nextFunc = null;
- e();
- }
- }
- }
- }, {
- key: "awaitCompletion",
- value: function awaitCompletion(e, t) {
- this.nextFunc = t;
- e();
- }
- }, {
- key: "updateSuccessFunction",
- value: function updateSuccessFunction(e) {
- this.nextFunc = e;
- }
- }, {
- key: "interrupt",
- value: function interrupt(e, t) {
- if (!this.wouldInterrupt()) {
- return false;
- }
- this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled);
- this.tourIsPlaying = !1;
- this.interrupted = !0;
- this.nextFunc = null;
- this.emit(DirectorEvents.ActionInterrupted);
- null !== e && void 0 !== e || (e = BlackoutStyle.BEGINNING);
- this.player.interruptAndFastForward(e, t);
- return true;
- }
- }, {
- key: "wouldInterrupt",
- value: function wouldInterrupt() {
- return this.transitionStage !== this.C.None;
- }
- }, {
- key: "intermediateState",
- value: function intermediateState() {
- return this.transitionStage !== this.C.None;
- }
- }, {
- key: "isInterrupted",
- value: function isInterrupted() {
- return this.interrupted;
- }
- }, {
- key: "pauseWalkingSection",
- value: function pauseWalkingSection() {
- this.walkingSectionPaused = !0;
- }
- }, {
- key: "clearWalkingSectionPaused",
- value: function clearWalkingSectionPaused() {
- this.walkingSectionPaused = !1;
- }
- }, {
- key: "autoTour",
- value: function autoTour() {
- if (!settings$3.nestscenes || !settings$3.nestscenes.scenes || !settings$3.nestscenes.scenes.length || settings$3.nestscenes.scenes[0].script) return;
- if (settings$3.basic.menu.scene_autoplay) {
- settings$3.warp.auto = 0;
- $('#play').removeClass('play').addClass('pause');
- G.playing = true;
- $('.gui-floor').hide();
- $('.rightbar').hide();
- $('#userlogo').hide();
- $('#page-view').hide();
- $('#back-url').hide();
- $('.indoordir, .indoorscale').hide();
- $('#virgule, #barrageShow, #barrageCon').hide();
- }
- settings$3.warp.auto >= 0 && transitions.trigger({
- duration: 1e3 * Math.min(300, settings$3.warp.auto),
- done: function () {
- this.playTour();
- }.bind(this),
- name: '_atr'
- });
- }
- }, {
- key: "atDestinationPano",
- value: function atDestinationPano() {
- if (!this.player.currentPano || null === this.destinationItem) return false;
- var t = this.player.currentPano.id;
- if (void 0 === t) return false;
- var e = this.player.model.heroLocations;
- return null !== this.destinationItem && void 0 !== e[this.destinationItem] && t == e[this.destinationItem].panoId;
- }
- }, {
- key: "redirectToItem",
- value: function redirectToItem(t, e) {
- if (null === t || void 0 === t) return void logger$1.warn('Director.redirectToItem() -> Redirecting to null item.');
- if (!this.wouldInterrupt()) return void logger$1.warn('Director.redirectToItem() -> Director cannot redirect if there is nothing to interrupt.');
- if (this.player.mode === Viewmode$1.TRANSITIONING) return void logger$1.debug('Director.redirectToItem() -> Cannot redirect while transitioning.');
- logger$1.debug('Director.redirectToItem() -> Redirecting to ' + t + ' via ' + e);
- var i = function () {
- transitions.setTimeout(function () {
- this.setDestinationItem(t), logger$1.info('from redirectToItem'), this.goToDestination(true, BlackoutStyle.BEGINNING, settings$3.warp.warpInterruptionRedirectTime, false);
- }.bind(this), 0);
- }.bind(this);
- this.interrupt(BlackoutStyle.END, 0), this.updateSuccessFunction(i);
- }
- }, {
- key: "useSpecialTransition",
- value: function useSpecialTransition(t) {
- void 0 !== t && this.defaultWarpStyle !== WarpStyle.BLACK && logger$1.debug('useSpecialTransition(): ' + t), this.nextWarpStyle = this.defaultWarpStyle;
- }
- }, {
- key: "resetSpecialTransition",
- value: function resetSpecialTransition() {
- this.nextWarpStyle = this.defaultWarpStyle;
- }
- }, {
- key: "arrivedAtDestination",
- value: function arrivedAtDestination(e) {
- if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot advance to interlude or aiming while player is flying or warping.');else {
- this.transitionStage = this.C.Aiming;
- var t = this.tourIsPlaying ? this.tourInterlude.bind(this, this.nextItem(this.currentItem)) : null;
- this.player.model.fadePanoMarkers(0), this.awaitCompletion(function () {
- this.resetSpecialTransition(), e ? this.player.aimTourCamera(this.destinationItem, PathDisplayMode.Retain, PathDisplayMode.Slow, this.actionComplete.bind(this)) : this.actionComplete();
- }.bind(this), t);
- }
- if (!this.play.control.canPlay) {
- this.play.control.canPlay = true;
- }
- if (this.play.control.wait && this.play.control.isPlaying) {
- this.record.updateFragmentUI(this.play.control.currentIndex);
- this.play.control.wait = false;
- }
- }
- }, {
- key: "toast",
- value: function toast(msg) {
- setTimeout(function () {
- document.getElementsByClassName('toast-wrap')[0].getElementsByClassName('toast-msg')[0].innerHTML = msg;
- var toastTag = document.getElementsByClassName('toast-wrap')[0];
- toastTag.className = toastTag.className.replace('toastAnimate', '');
- setTimeout(function () {
- toastTag.className = toastTag.className + ' toastAnimate';
- }, 10);
- }, 10);
- }
- }, {
- key: "tour360view",
- value: function tour360view() {
- //360显示toast
- if (this.player.currentPano && this.player.currentPano.alignmentType === 2) {
- var language = this.player.model.language;
- this.toast(language.watchPr); // settings.basic.menu.compass_enable && $(".indoordir, .indoorscale").fadeOut(300);
- } else if ($('#play').hasClass('play')) ;
- }
- }, {
- key: "goToDestination",
- value: function goToDestination(e, t, i, n) {
- this.destinationItem = objects.play.control.currentIndex;
- if (this.onTheBus = !0, this.emit('update.controls'), !n && this.atDestinationPano()) return void this.arrivedAtDestination(!0);
- if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot go to new destination while player is flying or warping.');else {
- var r = this.player.model.getHeroDescriptorByIndex(this.destinationItem),
- o = null,
- a = null;
- if (r.pano != null && typeof r.pano != 'undefined') {
- var s = 0 === this.destinationItem || e ? WarpStyle.BLACK : this.nextWarpStyle;
- 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);
- } else a = this.player.warpToNonPanoByHeroIndex.bind(this.player, this.destinationItem, this.actionComplete.bind(this)), o = this.arrivedAtDestination.bind(this, !1);
- this.transitionStage = this.C.Moving, this.player.model.fadePanoMarkers(0, null, {
- hideVideoFlag: true
- }), this.awaitCompletion(function () {
- a();
- }.bind(this), o), this.emit('update.controls');
- }
- }
- }, {
- key: "tourInterlude",
- value: function tourInterlude() {
- // if (h.trackAlways("reach_highlight", {
- // reach_source: this.reachSource
- // }),
- this.player.model.fadePanoMarkers(0);
- this.emit('update.controls');
- 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 () {
- this.transitionStage = this.C.Interlude, this.player.tourInterlude(this.nextItem(this.currentItem), this.actionComplete.bind(this));
- }.bind(this), this.goNext.bind(this));
- }
- }, {
- key: "playTour",
- value: function playTour() {
- 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()));
- }
- }, {
- key: "hideTourBar",
- value: function hideTourBar() {
- if (browser.isMobile()) {
- $('.btn-cat-play').removeClass('cat-mob-pause').addClass('cat-mob-play');
- } else {
- $('.btn-cat-play').removeClass('cat-pc-pause').addClass('cat-pc-play');
- }
- $('#gui').show();
- }
- }, {
- key: "stopTour",
- value: function stopTour() {
- 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'));
- }
- }, {
- key: "endTourProgress",
- value: function endTourProgress() {
- this.tourInProgress = !1, this.emit('update.controls'), this.emit(DirectorEvents.TourEnd);
- }
- }, {
- key: "goToHighlight",
- value: function goToHighlight(t) {
- this.clearWalkingSectionPaused();
- this.destinationItem = t;
- this.useSpecialTransition('Hilight');
- this.goToDestination();
- }
- }, {
- key: "goToHighlightByLocation",
- value: function goToHighlightByLocation(location) {
- function getLocation(item) {
- if (item.panoId && item.panoId == location) {
- return true;
- } else {
- return false;
- }
- }
- var index = this.player.model.heroLocations.findIndex(getLocation); //if (this.canInterrupt() || !this.wouldInterrupt()) {
- if (!this.wouldInterrupt()) {
- if (logger$1.debug('<tour.goto ' + index + '>'), this.wouldInterrupt() && (index === this.destinationItem ? this.interrupt() : this.redirectToItem(index, 'goToHighlight')), this.isInterrupted()) return;
- this.clearWalkingSectionPaused(), this.setDestinationItem(index), this.useSpecialTransition('Hilight'), this.goToDestination(); // analytics.trackAlways("USER", {
- // event_type: "reach_highlight",
- // reach_source: "thumb"
- // })
- }
- }
- }, {
- key: "prevHighlight",
- value: function prevHighlight() {
- this.bounceable() || (this.player.emit('tour_manual', 'prev'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'prev', this.goPrev()));
- }
- }, {
- key: "nextHighlight",
- value: function nextHighlight() {
- this.bounceable() || (this.player.emit('tour_manual', 'next'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'next', this.goNext()));
- }
- }, {
- key: "changeMode",
- value: function changeMode(t, e) {
- var i = e || 'gui';
- switch (this.wouldInterrupt() && this.interrupt(), this.player.controls[t].emit('interaction.' + i), this.clearWalkingSectionPaused(), t) {
- case Viewmode$1.PANORAMA:
- this.player.insideMode();
- break;
- case Viewmode$1.DOLLHOUSE:
- case Viewmode$1.FLOORPLAN:
- this.player.flyToNewMode({
- mode: t
- });
- }
- }
- }, {
- key: "atEndOfTour",
- value: function atEndOfTour() {
- var t = this.currentItem >= this.nItems - 1;
- return t;
- }
- }, {
- key: "firstDestination",
- value: function firstDestination() {
- if (this.nItems <= 0) {
- return null;
- }
- for (var i = 0; i < this.nItems; i++) {
- if (this.player.model.images['list'][i].script === this.currentScript) {
- return i;
- }
- }
- return 0;
- }
- }, {
- key: "finalDestination",
- value: function finalDestination() {
- if (this.nItems <= 0) return null;
- for (var i = this.nItems - 1; i >= 0; i--) {
- if (this.player.model.images['list'][i].script === this.currentScript) {
- return i;
- }
- }
- return 0;
- }
- }, {
- key: "goPrev",
- value: function goPrev() {
- this.tourAdvance(-1);
- }
- }, {
- key: "goNext",
- value: function goNext() {
- this.tourAdvance(1);
- }
- }, {
- key: "setDestinationItem",
- value: function setDestinationItem(t) {
- if (t > this.nItems) {
- t = this.firstDestination();
- }
- this.destinationItem = t;
- this.emit('update.controls');
- }
- }, {
- key: "setCurrentItem",
- value: function setCurrentItem(t) {
- this.currentItem = t, this.emit('update.controls');
- }
- }, {
- key: "nextItem",
- value: function nextItem(t) {
- return null === t ? this.firstDestination() : t >= this.nItems - 1 ? this.endlessLoop ? this.firstDestination() : null : t + 1;
- }
- }, {
- key: "prevItem",
- value: function prevItem(t) {
- return null === t ? this.firstDestination() : t < 0 ? this.endlessLoop ? this.lastDestination() : null : t - 1;
- }
- }, {
- key: "tourAdvance",
- value: function tourAdvance(t) {
- logger$1.debug('tourAdvance(' + t + ')');
- null === this.currentItem || void 0 === this.currentItem ? this.setDestinationItem(this.firstDestination()) : this.setDestinationItem(this.currentItem + t);
- 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'));
- this.goToDestination();
- }
- }]);
- return Director;
- }(EventEmitter);
- });
- /*
- 热点markSpot的拖拽定位
- */
- var MoveCtrl = function MoveCtrl(o) {
- this.elem = o.elem;
- this.domParent = o.domParent;
- this.elem.addEventListener('mousedown', this.beginMove.bind(this));
- this.elem.addEventListener('touchstart', this.beginMove.bind(this));
- this.elem.addEventListener('pointerdown', this.beginMove.bind(this)); //this.elem.on('pointerdown mousedown touchstart', this.beginMove.bind(this))
- document.addEventListener('mousedown', this.move.bind(this));
- document.addEventListener('touchmove', this.move.bind(this));
- document.addEventListener('pointermove', this.move.bind(this)); //$(document).on('pointermove mousemove touchmove', this.move.bind(this))
- {
- //A screen(edit player屏幕的侦听难加上所以直接写在controls里吧 )
- o.cameraControls.on('pointerUp', this.moveDone.bind(this)); //B screen
- document.addEventListener('pointerup', this.moveDone.bind(this));
- document.addEventListener('mouseup', this.moveDone.bind(this));
- document.addEventListener('touchend', this.moveDone.bind(this));
- document.addEventListener('touchcancel', this.moveDone.bind(this)); //$(document).on('pointerup mouseup touchend touchcancel', this.moveDone.bind(this))
- }
- this.beginMoveFuc = o.beginMoveFuc;
- this.moveDoneFuc = o.moveDoneFuc;
- this.hasBound = o.hasBound;
- this.useTransform = o.useTransform; //为true时适用于页面resize时,elem不需要
- if (o.hasBound) {
- this.needGetBound = 1;
- window.addEventListener('resize', function () {
- this.needGetBound = 1;
- }.bind(this));
- }
- this.recover();
- };
- MoveCtrl.prototype.beginMove = function (e) {
- //每次begin
- e.preventDefault(); //防止页面滑动
- e.stopPropagation();
- if (this.hasBound) this.getMoveBound();
- if (this.moving) return;
- e = e.originalEvent || e;
- var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
- this.moving = true;
- if (this.useTransform) {
- //‘translate(55.5556px, 71.1111px)’
- var transform = this.elem.style.transform;
- var x, y;
- if (!transform) {
- x = y = 0;
- } else {
- var a1 = transform.indexOf('(');
- var a2 = transform.indexOf(')');
- transform = transform.slice(a1 + 1, a2).split(',');
- x = parseFloat(transform[0]);
- y = parseFloat(transform[1]);
- }
- this.dragInfo = {
- startElem: {
- x,
- y
- },
- endElem: {
- x,
- y
- }
- };
- } else {
- this.dragInfo = {
- startElem: {
- x: parseFloat(this.elem[0].style.left),
- y: parseFloat(this.elem[0].style.top)
- }
- /* ,
- endElem: {
- x: 0,
- y: 0
- } */
- };
- }
- this.dragInfo.startMouse = {
- x: isTouch ? e.changedTouches[0].clientX : e.clientX,
- y: isTouch ? e.changedTouches[0].clientY : e.clientY
- };
- if (this.beginMoveFuc) this.beginMoveFuc(); //console.log('beginMove')
- //if(this.controlEvent)this.dealMoveCallBack();
- };
- MoveCtrl.prototype.move = function (e) {
- //位移
- if (!this.moving) return;
- e = e.originalEvent || e;
- var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
- var x = isTouch ? e.changedTouches[0].clientX : e.clientX;
- var y = isTouch ? e.changedTouches[0].clientY : e.clientY;
- this.dragInfo.vector = {
- //位移
- x: x - this.dragInfo.startMouse.x,
- y: y - this.dragInfo.startMouse.y
- };
- this.dragInfo.endElem = {
- x: this.dragInfo.startElem.x + this.dragInfo.vector.x,
- y: this.dragInfo.startElem.y + this.dragInfo.vector.y
- }; //console.log(this.dragInfo.endElem)
- //限制移动范围
- if (this.hasBound) {
- this.dragInfo.endElem.x = Math.max(this.bound.left, this.dragInfo.endElem.x);
- this.dragInfo.endElem.x = Math.min(this.bound.right, this.dragInfo.endElem.x);
- this.dragInfo.endElem.y = Math.max(this.bound.top, this.dragInfo.endElem.y);
- this.dragInfo.endElem.y = Math.min(this.bound.bottom, this.dragInfo.endElem.y);
- }
- if (this.useTransform) {
- this.elem.style.transform = 'translate(' + this.dragInfo.endElem.x + 'px,' + this.dragInfo.endElem.y + 'px)';
- } else {
- this.elem.style.left = this.dragInfo.endElem.x + 'px';
- this.elem.style.top = this.dragInfo.endElem.y + 'px';
- }
- };
- MoveCtrl.prototype.moveDone = function (e) {
- if (!this.moving) return;
- this.getMoveBound();
- this.moving = false;
- this.move(e);
- if (this.moveDoneFuc) this.moveDoneFuc(this.reportPos()); //最后一次刷新一下位置
- this.dragInfo.startElem = this.dragInfo.endElem;
- this.dragInfo.vector = {
- x: 0,
- y: 0
- }; //console.log('moveDone')
- };
- MoveCtrl.prototype.getMoveBound = function () {
- //限制移动范围
- if (!this.needGetBound) return;
- var width = isMobile ? 68 : 100;
- var height = isMobile ? 32 : 60; //this.$elem[0].scrollHeight; //scrollHeight没用的
- var w = ($('#player').width() - width) / 2;
- if (isMobile) {
- this.bound = {
- left: -w,
- right: w,
- top: -($('#player').height() / 2 - $('header')[0].offsetTop - $('header').height() - height / 2),
- bottom: $('#player').height() / 2 - $('footer').height() - height / 2
- };
- } else {
- this.bound = {
- left: -w,
- right: w,
- top: -($('#player').height() / 2 - 50 - height / 2),
- bottom: $('#player').height() / 2 - height / 2
- };
- }
- console.log(this.bound);
- this.needGetBound = 0;
- };
- MoveCtrl.prototype.reportPos = function () {
- //输出创建热点所需要的平面上的坐标
- return {
- x: this.dragInfo.endElem.x + this.domParent.clientWidth / 2,
- y: this.dragInfo.endElem.y + this.domParent.clientHeight / 2
- };
- }; //外部调用----------
- MoveCtrl.prototype.recover = function () {
- //恢复到初始状态
- this.dragInfo = {
- startElem: {
- x: 0,
- y: 0
- },
- endElem: {
- x: 0,
- y: 0
- }
- };
- if (this.useTransform) {
- this.elem.style.transform = '';
- } else {
- this.elem.style.left = 0;
- this.elem.style.top = 0;
- }
- };
- 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); }; }
- 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; } }
- var Label2D = /*#__PURE__*/function (_EventEmitter) {
- _inherits(Label2D, _EventEmitter);
- var _super = _createSuper$R(Label2D);
- function Label2D() {
- var _this;
- var info = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var player = arguments.length > 1 ? arguments[1] : undefined;
- _classCallCheck(this, Label2D);
- _this = _super.call(this);
- if (info.pos3d) {
- _this.pos3d = new THREE.Vector3().copy(info.pos3d);
- }
- if (info.pos2d) {
- _this.pos2d = new THREE.Vector2().copy(info.pos2d);
- _this.setElemPos();
- }
- _this.name = info.name;
- _this.elem = info.elem;
- _this.camera = info.camera;
- _this.domParent = info.domParent;
- _this.player = player;
- _this.useTransform = info.useTransform;
- _this.mayShelter = info.mayShelter;
- return _this;
- }
- _createClass(Label2D, [{
- key: "update",
- value: function update() {
- /* if(objects.player.mode !== 'dollhouse' || !this.enable || !this.text
- || objects.model.currentFloor.floorIndex != this.floorIndex && !objects.model.allFloorsVisible
- || config.isEdit && (objects.mainDesign && objects.mainDesign.editing || objects.player.EditOverlay && objects.player.EditOverlay.editing||
- objects.player.linkEditor && (objects.player.linkEditor.setPanoVisible || objects.player.linkEditor.setTagVisible)
- )
- ){
- this.elem.css('display','none'); return;
- } */
- if (!this.pos3d || this.dragging) return; //console.log(this.name, this.camera.matrixWorldInverse.elements, this.camera.projectionMatrix.elements)
- var p = convertTool.getPos2d(this.pos3d, this.player, this.camera, this.domParent);
- if (!p.trueSide) {
- this.elem.style.display = 'none';
- return;
- } //判断label是否被模型遮挡,遮挡则消失
- if (this.mayShelter && convertTool.ifShelter(this.pos3d, this.player, {
- x: p.vector.x,
- y: p.vector.y
- }, this.camera
- /* , objects.model.allFloorsVisible ? null : this.floorIndex */
- )) {
- this.elem.style.display = 'none';
- return;
- }
- this.elem.style.display = 'block'; //先显示,driftDir才能计算位置
- if (this.driftDir) {
- //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
- var driftPoint = convertTool.getPos2d(this.pos3d.clone().add(this.driftDir)); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
- var rect = this.elem[0].children[0].getBoundingClientRect();
- 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);
- var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
- var dis = this.pos3d.distanceTo(this.camera.position);
- var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
- //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
- this.pos2d = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
- } else {
- this.pos2d = new THREE.Vector2().copy(p.vector);
- }
- this.setElemPos();
- }
- }, {
- key: "setElemPos",
- value: function setElemPos() {
- if (this.useTransform) {
- var transformX = this.pos2d.x / 2 * this.domParent.clientWidth;
- var transformY = -this.pos2d.y / 2 * this.domParent.clientHeight;
- this.elem.style.transform = 'translate(' + Math.round(transformX) + 'px,' + Math.round(transformY) + 'px)';
- } else {
- this.elem.style.left = this.pos2d.x + 'px', this.elem.style.top = this.pos2d.y + 'px';
- }
- }
- }]);
- return Label2D;
- }(EventEmitter);
- 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); }; }
- 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; } }
- var player$g;
- var isMobile$2;
- var playerB$1,
- markBmoveCtrl,
- lastMouseB = new THREE.Vector2();
- var MatchDataGetWrong = {};
- var MatchData = {};
- var insideLookLimitDownOld, insideLookLimitUpOld;
- function mousedownB(e) {
- //editSpot.playerBmousedown = true
- lastMouseB = getMouseB(e);
- /* if (config.isEdit && editor.mainDesign.floorExamingStep == 2) { //模型地面高度
- if (editor.mainDesign.hoverPull) {
- editor.mainDesign.dragLineBegin(editSpot);
- }
- return;
- } */
- }
- function getMouseB(e) {
- e = e.originalEvent || e;
- var isTouch = e.type.indexOf('touch') > -1;
- var x = isTouch ? e.changedTouches[0].clientX : e.offsetX;
- var y = isTouch ? isMobile$2 ? e.changedTouches[0].clientY - player$g.domElement.clientHeight : e.changedTouches[0].clientY : e.offsetY; //手机的上下分屏有点麻烦。电脑触屏使用的后者没有测过
- return {
- x: x,
- y: y
- };
- }
- function getPoint(dir, panoB) {
- //获取B的click dir是经过matrix变换的方向,要变成没有变换的点击点
- var dir = dir.clone();
- var matrixWorld = panoB.matrixWorld.clone();
- matrixWorld.invert(); //求逆矩阵
- dir = math$2.crossRight(dir, matrixWorld); //dir右乘逆矩阵 得无matrix转化的向量O’B
- //console.log('B的dir(无matrix转化):')
- //console.log(dir.clone().normalize())
- return panoB.position.clone().add(dir);
- }
- defineComponent('TagEditManager', function () {
- return /*#__PURE__*/function (_Emiter) {
- _inherits(Editspot, _Emiter);
- var _super = _createSuper$Q(Editspot);
- function Editspot(splitView) {
- var _this;
- var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- _classCallCheck(this, Editspot);
- _this = _super.call(this);
- _this.splitView = splitView;
- _this.panoA; //不同于splitView的panoA. 只有getA时才会改变
- _this.paonB; //基本和splitView的paonB一样,因为右侧不能移动所以不会变
- _this.markTagPos; //被计算出的热点位置
- _this.init(info);
- /* splitView.on('leave', () => {
- //player.unableChangePano = false
- }) */
- return _this;
- }
- _createClass(Editspot, [{
- key: "init",
- value: function init(info) {
- var _this2 = this;
- if (this.inited) return;
- playerB$1 = this.$app.dom.querySelector('.player[name="copy"]'); //副屏
- player$g = this.$app.core.get('Player');
- this.$app.core.get('TagManager');
- isMobile$2 = this.$app.config.mobile;
- this.panosHistory = []; //每次定位时左侧走过的点位
- /* this.mouseA = new THREE.Vector2(Infinity, Infinity)
- this.mouseB = new THREE.Vector2(Infinity, Infinity) */
- //两个热点标记
- this.markSpotA = new Label2D({
- name: 'markSpotA',
- elem: info.spotA,
- domParent: player$g.domElement,
- camera: player$g.camera,
- useTransform: true
- }, player$g); //不使用panorama那个camera,因为在飞向下一个点时camera不更新
- this.markSpotB = new Label2D({
- name: 'markSpotB',
- elem: info.spotB,
- domParent: playerB$1,
- camera: this.splitView.panoramaCam,
- useTransform: true
- }, player$g);
- this.markSpotA.name = 'markSpotA';
- this.markSpotB.name = 'markSpotB'; //热点的拖拽控制
- new MoveCtrl({
- elem: this.markSpotA.elem,
- domParent: player$g.domElement,
- useTransform: true,
- cameraControls: player$g.cameraControls,
- beginMoveFuc: function beginMoveFuc() {
- if (!_this2.editing) return;
- _this2.markSpotA.dragging = true; //this.markSpotA.elem.addClass("dragging")
- player$g.cameraControls.controls.panorama.locked = true;
- _this2.splitView.panoramaCtl.locked = true;
- },
- moveDoneFuc: function moveDoneFuc(e) {
- if (!_this2.editing) return;
- _this2.markSpotA.dragging = false; //this.markSpotA.elem.removeClass("dragging")
- player$g.cameraControls.controls.panorama.locked = false;
- _this2.splitView.panoramaCtl.locked = false;
- e && _this2.moveToReGetA(e);
- player$g.mouseCouldBeClickToMove = false;
- }
- });
- markBmoveCtrl = new MoveCtrl({
- elem: this.markSpotB.elem,
- domParent: playerB$1,
- useTransform: true,
- cameraControls: player$g.cameraControls,
- beginMoveFuc: function beginMoveFuc() {
- _this2.markSpotB.dragging = true; //this.markSpotB.elem.addClass("dragging")
- _this2.splitView.panoramaCtl.locked = true; //防止相机移动
- player$g.cameraControls.controls.panorama.locked = true; //避免在B区抬起不触发moveDone
- },
- moveDoneFuc: function moveDoneFuc(e) {
- _this2.markSpotB.dragging = false; //this.markSpotB.elem.removeClass("dragging")
- _this2.splitView.panoramaCtl.locked = false;
- player$g.cameraControls.controls.panorama.locked = false;
- e && _this2.moveToReGetB(e);
- }
- });
- playerB$1.addEventListener('pointerdown', mousedownB);
- playerB$1.addEventListener('touchstart', mousedownB);
- playerB$1.addEventListener('pointerup', this.clickToReGetB.bind(this)); //iphone pointerup无效
- playerB$1.addEventListener('touchend', this.clickToReGetB.bind(this)); //player不断更新时,如果画面改变,要更新热点位置。
- player$g.on('update', function (e) {
- if (_this2.editing) {
- if (e.hasChanged.cameraChanged2) {
- /* this.markSpotA.camera.updateMatrix() //没自动更新
- this.markSpotA.camera.updateMatrixWorld() */
- _this2.markSpotA.update();
- }
- if (_this2.splitView.changed()
- /* || this.changed() */
- ) {
- _this2.markSpotB.update();
- }
- }
- }); //左屏改变漫游点
- player$g.on('pano.chosen', function (pano1, pano2) {
- _this2.changePano(pano2);
- }); //左侧第一次点击确定位置
- player$g.on('click', function (e) {
- if (_this2.editing && !_this2.clickA) {
- e.intersect && _this2.getA(e.intersect);
- e.consume(); //使用了,阻止后续进行
- }
- }); //左屏改变漫游点时询问是否有要转向的aim target。 转向markTagPos
- player$g.on('ifFocusPoint', function (askAim) {
- if (_this2.editing && _this2.markTagPos) {
- var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
- if (askAim.importance < importance) {
- askAim.importance = importance;
- askAim.aim = _this2.markTagPos.clone();
- }
- }
- });
- this.inited = true;
- }
- /* changed = (function () {
- var previousState = {}
- return function () {
- let changed = !previousState.mouseB || !this.mouseB.equals(previousState.mouseB)
- previousState.mouseB = this.mouseB.clone()
- return changed
- }
- })() */
- //添加热点
- }, {
- key: "enter",
- value: function enter() {
- var _this3 = this;
- /* var checkCanAddSpot = function(){
- if(player.is360View(player.mode, player.currentPano)){
- player.currentPano.view.backToPanorama();
- $waiting.show()
- }
- return player.currentPano && (config.settings.visions != 2 || player.currentPano.assistPano)
- }
- if(!checkCanAddSpot()){
- var timer = setInterval(() => {
- if(checkCanAddSpot()){
- editSpot.addSpot()
- clearInterval(timer)
- }
- }, 50)
- return;
- } */
- player$g.viewLinkManager.exitView().then(function () {
- if (player$g.flying || player$g.flyingToTag) {
- if (player$g.flyingToTag) ;
- player$g.once(PlayerEvents.FlyingEnded, function () {
- //等到飞行结束后再开始
- _this3.enter();
- });
- return;
- }
- player$g.flyToMode('panorama', function () {
- var begin = function begin() {
- if (!player$g.currentPano) {
- setTimeout(begin, 50);
- return;
- } //$waiting.hide()
- _this3.editing = true;
- if (_this3.setSpotPos || player$g.flying) return;
- _this3.splitView.enter();
- _this3.panosHistory = [];
- /* this.splitView.changePano(player.currentPano) //因为在enter之前已经分屏了,但之后可能飞到另一个漫游点了,所以同步下,保证右侧和左侧是对应的
- this.splitView.setSceneB() */
- _this3.panoB = _this3.splitView.panoB;
- _this3.markSpotA.elem.style.display = 'none';
- _this3.markSpotB.elem.style.display = 'none';
- _this3.markSpotA.pos3d = _this3.clickA = null;
- _this3.markSpotB.pos3d = _this3.clickB = null;
- _this3.markTagPos = null; //clear focus
- player$g.reticule.visible = false;
- player$g.locked = true; //左屏禁止移动,直到第一次点击
- /* if (settings.visions == 1) {
- player.unableChangePano = true
- } */
- if (insideLookLimitDownOld == void 0) {
- insideLookLimitDownOld = settings$3.insideLookLimitDown;
- insideLookLimitUpOld = settings$3.insideLookLimitUp;
- settings$3.insideLookLimitDown = -35;
- settings$3.insideLookLimitUp = 35;
- }
- };
- begin();
- });
- });
- }
- /*
-
- 开始热点位置修改
-
- */
- }, {
- key: "reSetPos",
- value: function reSetPos(pos) {
- var _this4 = this;
- this.markTagPos = new THREE.Vector3().copy(pos);
- player$g.viewLinkManager.exitView().then(function () {
- if (player$g.flying || player$g.flyingToTag) {
- if (player$g.flyingToTag) ;
- player$g.once(PlayerEvents.FlyingEnded, function () {
- //等到飞行结束后再开始
- _this4.reSetPos(pos);
- });
- return;
- }
- _this4.editing = true;
- _this4.panosHistory = []; //$waiting.hide() //objects.gui.showWaiting(false, "reSetPos")
- _this4.hotRePos = true;
- _this4.markSpotA.pos3d = _this4.clickA = _this4.markTagPos.clone();
- _this4.markSpotA.enable = true;
- _this4.markSpotB.pos3d = _this4.clickB = _this4.markTagPos.clone();
- _this4.markSpotA.elem.style.display = 'block';
- _this4.markSpotB.elem.style.display = 'block'; //store.commit('SetPlayerOptions', { showPositionMarks: true }) //热点hotspot可见
- _this4.markSpotB.enable = true;
- setTimeout(function () {
- _this4.markSpotA.update();
- _this4.markSpotB.update();
- }, 300); //console.log('reSetPos', player.currentPano.id)
- /* this.splitView.changePano(player.currentPano)
-
- this.splitView.setSceneB() */
- _this4.splitView.enter();
- _this4.panoA = _this4.splitView.panoA;
- _this4.panoB = _this4.splitView.panoB;
- if (insideLookLimitDownOld == void 0) {
- insideLookLimitDownOld = settings$3.insideLookLimitDown;
- insideLookLimitUpOld = settings$3.insideLookLimitUp;
- settings$3.insideLookLimitDown = -35;
- settings$3.insideLookLimitUp = 35;
- } //转向:
- player$g.flyToPano({
- pano: player$g.currentPano,
- aimDuration: 500,
- lookAtPoint: _this4.markTagPos
- });
- return true;
- });
- } //确定热点位置
- }, {
- key: "confirmPos",
- value: function confirmPos(Tag) {
- if (!this.editing) return;
- var sid = common$1.getRandomSid();
- var pos = this.computeHotPos();
- if (Tag) {
- //测试
- player$g.model.add(new Tag(sid, {
- position: pos
- }));
- }
- if (!this.panoA) {
- return {};
- }
- return {
- sid,
- position: pos,
- panoId: this.panoA.id //添加热点时,相机站在当前点
- };
- }
- }, {
- key: "exit",
- value: function exit() {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (o.cancel) ;
- this.clickA = this.clickB = null;
- this.markSpotA.pos3d = this.markSpotB.pos3d = null;
- /* markSpotA.enable = false;
- markSpotB.enable = false; */
- this.splitView.leave();
- this.markSpotA.elem.style.display = 'none';
- this.markSpotB.elem.style.display = 'none'; // 每次退出需要将markSpot位置重置屏幕中央
- this.markSpotA.pos2d = new THREE.Vector2();
- this.markSpotB.pos2d = new THREE.Vector2();
- this.markSpotA.setElemPos();
- this.markSpotB.setElemPos();
- player$g.reticule.visible = true;
- if (this.hideMarker) {
- editSpot.hideMarker.visible = true;
- editSpot.hideMarker = null;
- }
- this.hotRePos = false;
- this.editing = false;
- player$g.locked = false;
- if (insideLookLimitDownOld != void 0) {
- settings$3.insideLookLimitDown = insideLookLimitDownOld;
- settings$3.insideLookLimitUp = insideLookLimitUpOld;
- insideLookLimitDownOld = insideLookLimitUpOld = null;
- }
- } //左方更改位置
- }, {
- key: "changePano",
- value: function changePano(pano) {
- if (!this.editing) return;
- this.splitView.changePano(pano); //if (!this.markTagPos) return
- if (this.markTagPos) {
- this.markSpotA.pos3d = this.markTagPos.clone(); //使用计算出的坐标
- this.panosHistory.push(pano);
- }
- if (pano.assistPano == this.splitView.panoB || pano == this.splitView.panoB) {
- this.splitView.pauseCameraBind = false;
- } else {
- if (!this.splitView.pauseCameraBind) {
- this.splitView.pauseCameraBind = true;
- this.markSpotB.pos3d && this.splitView.panoramaCtl.startLookAt(this.markSpotB.pos3d); //重新focus回tag一下,因为刚为了很可能转到别的方向了
- }
- }
- } //在左边屏确定位置时
- }, {
- key: "getA",
- value: function getA(intersect) {
- var _this5 = this;
- if (player$g.flying || !this.editing) return;
- this.panoA = player$g.currentPano; //记录改变位置时的左屏pano
- player$g.locked = false; //没有下相机的信息时,分屏后左右pano一样,当左屏确定位置后需要自动飞向别的pano
- if (settings$3.visions != 2 && this.panoA == this.panoB) {
- var modelViewMatrix = player$g.model.matrixWorld.clone().invert();
- var pos = intersect.point.clone().applyMatrix4(modelViewMatrix); //自动飞到旁边最近的点:(为了避免走到的点可能看不见目标,所以取最近的)
- //var metadata = store.getters['scene/metadata'];
- if (
- /* metadata.sceneSource != 12 && */
- !this.clickA) {
- //123的点位在不同房间,全景图很不一样所以不飞(用户需尽量走到可以看到热点的其他位置进行校准,如果没有可见位置,就当做在该房间内的局部全景热点,因为其他房间看不到所以不准确没有关系)
- this.clickA = this.clickB = pos;
- var nearestPano = player$g.model.panos.find([function (pano) {
- return player$g.currentPano.neighbourPanos[pano.id] && player$g.currentPano != pano && pano.isAligned();
- }], [Panorama.sortFunctions.distanceToPoint(player$g.currentPano.position)]); //player.unableChangePano = false
- if (nearestPano) player$g.flyToPano({
- pano: nearestPano,
- lookAtPoint: pos.clone()
- });else {
- console.log('当前场景只有一个pano,所以不走到下一个点');
- }
- }
- this.clickA = this.clickB = pos;
- } else {
- if (player$g.currentPano.assistPano != this.splitView.panoB || this.panosHistory.length > 0) {
- //左屏已经到另一个点 或者又回来这个点,右侧都不用自动改位置
- if (!this.clickA) {
- //测距第二步时左边走到别的地方,右边要加载对应的
- this.splitView.setSceneB();
- this.panoB = this.splitView.panoB;
- this.splitView.pauseCameraBind = false;
- if (settings$3.visions != 2) {
- //恢复到两边一样,再次执行,以类似第一步开始时
- this.splitView.panoramaCtl.startLookAt(intersect.point);
- return this.getA(intersect);
- }
- } else {
- this.panoA = player$g.currentPano;
- var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
- this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
- this.markSpotA.pos3d = this.clickA;
- this.markSpotA.update();
- this.computeHotPos(); //objects.tagManager.markTag.rePos(markSpotA.computeHotPos({ onlyGetPos: true, dontRestric: editSpot.editType == "measure" })) //总是记录最新算出的坐标 A或B到下一个位置时就使用它
- //console.log("远近:" + objects.tagManager.markTag.position.distanceTo(player.position));
- return;
- }
- }
- if (settings$3.visions != 2) {
- console.warn('settings.visions != 2 ???');
- }
- var data = this.getMatchData();
- if (!data) {
- //$waiting.show() ////objects.gui.showWaiting(true, "getMatchData")
- var name = this.panoA.id + '_' + this.panoB.id;
- MatchDataGetWrong[name] = (MatchDataGetWrong[name] || 0) + 1;
- if (MatchDataGetWrong[name] > 5) {
- console.error('获取不到matchdata 放弃使用: ' + name);
- } else {
- setTimeout(function () {
- _this5.getA(intersect);
- }, 200);
- return;
- }
- } //if (texGetted) $waiting.hide() //objects.gui.showWaiting(false, "getMatchData")
- var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
- this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
- this.dirA = math$2.getNormalDir(this.clickA,
- /* player.model.supportsTiles, */
- player$g.currentPano); //经过matrix变换的方向
- //通过A预测B
- this.UVa = math$2.getUVfromDir(this.dirA);
- this.UVb = this.searchPointAtLeft(this.UVa);
- if (!this.UVb) {
- //因为B相机相对A相机在y向偏移,所以预估UV
- console.log('找不到UVb,假设一个'); //$tips({ content: "辅助校准位置可能不准确,请检查并拖动到"+ (config.isMobile ? "上方":"左侧")+"相同位置" })
- //$tips({ content: i18n.t('modules.hotspot.m_location_move_tips', { direction: i18n.t(`modules.hotspot.m_location_${config.isMobile?'up':'left'}`) }) })
- var shiftY = -0.02; //最好根据历史统计一下。因为x也可能很不一样
- this.UVb = {
- x: this.UVa.x,
- y: this.UVa.y + shiftY
- };
- } else {
- this.UVb.x = this.UVb.x.toFixed(3) - 0;
- this.UVb.y = this.UVb.y.toFixed(3) - 0;
- }
- this.dirB = math$2.getDirFromUV(this.UVb);
- this.clickB = getPoint(this.dirB, this.splitView.panoB); //更新相机朝向,并记得要立刻updateMatrix,getPos2d需要用到matrix
- /* panoramaCam.lookAt(this.clickB)
- panoramaCam.updateMatrix();
- panoramaCam.updateMatrixWorld(); */
- //UV显示对照更新
- /* $("#IMGparent > div").eq(0).find('.cursor1').css({"display":"block",
- "left": this.UVa.x*100+"100%",
- "top": this.UVa.y*100+"100%"})
- $("#IMGparent > div").eq(1).find('.cursor1').css({"display":"block",
- "left": this.UVb.x*100+"100%",
- "top": this.UVb.y*100+"100%"}) */
- }
- this.markSpotA.pos3d = this.clickA;
- this.markSpotB.pos3d = this.clickB; //热点标记可见
- //store.commit('SetPlayerOptions', { showPositionMarks: true })
- this.markSpotA.elem.style.display = 'block';
- this.markSpotB.elem.style.display = 'block';
- this.markSpotA.enable = true;
- this.markSpotB.enable = true;
- this.markSpotA.update();
- this.markSpotB.update();
- if (settings$3.visions != 2 && this.panoA == this.panoB) {
- this.markTagPos = this.markSpotA.pos3d.clone();
- } else {
- this.computeHotPos();
- } //$('#player').css('cursor', '');
- this.$app.TagManager.emit('tagManager.markTagPos');
- } //在右边屏确定位置时
- }, {
- key: "getB",
- value: function getB(mouse) {
- var intersect = convertTool.getMouseIntersect(this.splitView.panoramaCam, [this.splitView.cube], mouse);
- var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
- this.clickB = intersect.point.clone().applyMatrix4(modelViewMatrix);
- this.markSpotB.pos3d = this.clickB; //更新hotspot三维位置
- this.markSpotB.update(); //更新hotspot二维位置
- this.computeHotPos();
- }
- }, {
- key: "moveToReGetA",
- value: function moveToReGetA(e) {
- //拖拽左侧热点到新的位置
- player$g.handleInputStart(e.x, e.y, true, true); //更新mouse
- player$g.updateIntersect({}); //let intersect = player.getMouseIntersect(null, this.linkEditor.footIcons)
- player$g.intersect ? this.getA(player$g.intersect) : this.markSpotA.update(); //update:回到原来的位置
- player$g.mouseDown = false; //移动端这个不会归零 所以手动
- }
- }, {
- key: "moveToReGetB",
- value: function moveToReGetB(e) {
- //拖拽右侧热点到新的位置
- var mouse = new THREE.Vector2();
- math$2.convertScreenPositionToNDC(e.x, e.y, mouse, playerB$1); //获取在canvasB的mouse
- this.getB(mouse);
- }
- }, {
- key: "clickToReGetB",
- value: function clickToReGetB(e) {
- //点击右侧,热点到新的位置(左侧点击不能确定位置)
- //this.playerBmousedown = false
- if (markBmoveCtrl.moving) return; //这时候使用的是moveToReGetB 因为拖拽热点
- var mouseB = getMouseB(e);
- if (Math.abs(lastMouseB.x - mouseB.x) > 3 || Math.abs(lastMouseB.y - mouseB.y) > 3) return; //在拖拽画布
- if (!this.clickA && !this.hotRePos) {
- console.log('..?..');
- this.$app.TagManager.emit('tagManager.firstMarkTagPosB'); //$tips({ content:i18n.t(`show.location_start_tips`,{direction: i18n.t(`show.location_${config.isMobile?'up':'left'}`)}) });
- return;
- }
- var mouse = new THREE.Vector2();
- math$2.convertScreenPositionToNDC(mouseB.x, mouseB.y, mouse, playerB$1); //获取在canvasB的mouse
- this.getB(mouse);
- }
- }, {
- key: "restricPosAtRoom",
- value: function restricPosAtRoom(pos3d) {
- var A = player$g.currentPano.position; //如果不支持编辑户型的话就得不到rooms 直接使用模型判断 但可能出门 能限制在skybox内
- /* var group = objects.player.model.wallManager.roomInfo && objects.player.model.wallManager.roomInfo.oriRoomGroup;
- if(group){
- group.visible = true;
- var intersect = convertTool.ifIntersectChunks(A, pos3d, {model: group.children});
- if(intersect && intersect.length ){
- console.log('热点飘出房间')
- var pos = intersect[0].point.clone().setY(intersect[0].point.y + 0.001)//+ 0.001防止重叠
- pos3d.copy(pos)
- }
- group.visible = false;
- //新版只有一个房间,可能需要用柱子等其他物体隔开(不在oriRoomData内),还是用模型好。且oriRoomData需一开始就初始化mainDesign。
- }else{ */
- var B = pos3d;
- var dir = B.clone().sub(A).normalize();
- var ray = new THREE.Raycaster(A, dir, 0, A.distanceTo(B));
- var o = ray.intersectObjects(player$g.model.skyBoxTight
- /* .colliders */
- ); //模型不准时热点就永远放不准 只有激光的比较准
- if (o && o.length) {
- console.log('热点飘出skyBoxTight外,矫正:' + pos3d.toArray() + ' --> ' + o[0].point.toArray());
- pos3d.copy(o[0].point).sub(dir.clone().multiplyScalar(0.001));
- } //}
- return pos3d;
- }
- }, {
- key: "computeHotPos",
- value: function computeHotPos() {
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //通过采集的两个点位信息,来计算3d坐标
- if (!this.panoA || !this.clickA) {
- return null;
- }
- var A = this.panoA.position.clone();
- var B = this.panoB.position.clone();
- var p1 = this.clickA;
- var p2 = this.clickB;
- var _math$getLineIntersec = math$2.getLineIntersect({
- A,
- B,
- p1,
- p2
- }),
- pos3d = _math$getLineIntersec.pos3d;
- if (!o.dontRestric) this.restricPosAtRoom(pos3d);
- this.markTagPos = pos3d;
- console.log('markTagPos: ', pos3d.toArray());
- return pos3d;
- } //-----------通过上下相机来预测初始位置-------------
- }, {
- key: "getMatchData",
- value: function getMatchData() {
- //获取上下相机的 view pair 对照数据
- var name = this.panoA.id + '_' + this.panoB.id;
- if (MatchData[name]) return MatchData[name];else {
- http.get(this.$app.resource.getEditDataURL("mapping/".concat(name, ".json"))).then(function (data) {
- MatchData[name] = data;
- });
- }
- }
- }, {
- key: "searchPointAtLeft",
- value: function searchPointAtLeft(UVa) {
- //借用view pair数据 通过UVa(热点在左屏的uv位置) 预测UVb
- var data = this.getMatchData();
- if (!UVa) {
- console.log('!!!');
- }
- if (!data || !data['view pair'] || !data['view pair']['uv']) return null; /////////////////////////
- var tx = UVa.x;
- var ty = UVa.y;
- var leftTop = {},
- rightTop = {},
- leftBot = {},
- rightBot = {};
- var info = {
- leftTop: leftTop,
- rightTop: rightTop,
- leftBot: leftBot,
- rightBot: rightBot
- };
- var result; //$('#IMGparent .cursor2').remove()
- data['view pair']['uv'].forEach(function (pair) {
- if (pair[0] < tx && pair[1] <= ty) {
- judge(leftTop, pair);
- } else if (pair[0] >= tx && pair[1] <= ty) {
- judge(rightTop, pair);
- } else if (pair[0] < tx && pair[1] >= ty) {
- judge(leftBot, pair);
- } else {
- judge(rightBot, pair);
- }
- });
- function judge(o, pair) {
- var x = pair[0];
- var y = pair[1]; //var dis = Math.abs(x-tx) + Math.abs(y-ty);
- var dis = (x - tx) * (x - tx) + (y - ty) * (y - ty);
- if (o.dis == void 0 || o.dis > dis) {
- o.dis = dis;
- o.pair = pair;
- }
- }
- var hasValue = 0; //四个方向有值的个数
- for (var i in info) {
- if (info[i].pair) hasValue++;
- }
- var percent = {}; //根据距离算出比例 近似成左右边的uv比例
- if (hasValue >= 3) {
- //有三个值就足够算出
- result = compute();
- } else if (hasValue == 2) {
- //两个值的需要 对角线上都有值
- if (leftTop.pair && rightBot.pair || leftBot.pair && rightTop.pair) {
- result = compute();
- }
- } else ;
- function getSmallest(dir1, dir2) {
- if (!dir1.pair) return dir2;else if (!dir2.pair) return dir1;
- if (dir1.dis < dir2.dis) return dir1;else return dir2;
- }
- function compute() {
- //线性插值计算(比例) uvA对应的uvB
- var left = getSmallest(leftTop, leftBot);
- var right = getSmallest(rightTop, rightBot);
- var top = getSmallest(leftTop, rightTop);
- var bottom = getSmallest(leftBot, rightBot);
- percent.x = (tx - left.pair[0]) / (right.pair[0] - left.pair[0]);
- percent.y = (ty - top.pair[1]) / (bottom.pair[1] - top.pair[1]); //得到对应的uv
- var x = left.pair[2] + (right.pair[2] - left.pair[2]) * percent.x;
- var y = top.pair[3] + (bottom.pair[3] - top.pair[3]) * percent.y;
- return {
- x: x,
- y: y
- };
- }
- return result;
- }
- }]);
- return Editspot;
- }(tinyEmitter);
- });
- /*
- 若关联全景中加热点, 热点仅在此pano可见。无需分屏
- */
- /*
- 初始画面
- */
- var FirstView = /*#__PURE__*/function () {
- function FirstView(metadata, panos) {
- _classCallCheck(this, FirstView);
- this.quickstart = true;
- this.mode = Viewmode$1.PANORAMA;
- this.zoom = -1, this.fov = browser$1.urlHasValue('fov') ? Number(browser$1.urlQueryValue('fov')) : settings$3.insideFOV;
- this.pano = null;
- this.position = new THREE.Vector3();
- this.quaternion = new THREE.Quaternion();
- this.init(metadata, panos);
- }
- _createClass(FirstView, [{
- key: "init",
- value: function init(metadata, panos) {
- var urlFirstView = browser$1.urlHasValue('pose', true); //使用地址栏的信息 如 &pose=pano:2,qua:-0.2205,-0.718,-0.2613,0.605
- if (urlFirstView) {
- try {
- urlFirstView = common$1.replaceAll(urlFirstView, 'pano', '"pano"');
- urlFirstView = common$1.replaceAll(urlFirstView, 'qua:', '"qua":[');
- urlFirstView = '{' + urlFirstView + ']}';
- var info = JSON.parse(urlFirstView);
- this.pano = panos.get(info.pano);
- if (!this.pano) {
- urlFirstView = false;
- console.error('检测到firstView但是 找不到该pano');
- } else {
- this.quaternion = new THREE.Quaternion().fromArray(info.qua);
- this.zoom = -1;
- this.setByUrl = true;
- }
- } catch (e) {
- urlFirstView = false;
- console.error('检测到firstView但是解析出错' + e);
- }
- } else {
- if (metadata && metadata.entry) {
- var entry = metadata.entry;
- this.updateByEntry(entry, panos);
- } else {
- this.pano = panos.list[0];
- this.quaternion.copy(this.pano.quaternion);
- }
- }
- this.position.copy(this.pano.position);
- if (this.quaternion.equals(new THREE.Quaternion(-0.5, 0.5, 0.5, 0.5))) {
- //俯视向下会黑屏
- this.quaternion.set(0, 0, 0, 1);
- console.log('检测到初始画面quaternion为-0.5,0.5,0.5,0.5,强制更改为0,0,0,1');
- }
- }
- }, {
- key: "updateByEntry",
- value: function updateByEntry(entry, panos) {
- if (typeof entry == 'string') {
- entry = JSON.parse(entry);
- }
- if (entry.pano) {
- this.pano = panos.get(entry.pano);
- } //有可能客户补拍,那时候这个id可能不存在了。
- if (this.pano == void 0) {
- this.pano = panos.list[0];
- }
- this.quaternion.copy(this.pano.quaternion);
- if (entry.camera) {
- this.quaternion = new THREE.Quaternion().fromArray(entry.camera.quaternion);
- this.zoom = entry.camera.zoom;
- }
- }
- }, {
- key: "fromGuideView",
- value: function fromGuideView(guidItem, panos) {
- this.mode = guidItem.value.mode;
- this.zoom = guidItem.value.zoom;
- this.position.copy(guidItem.value.pos);
- this.quaternion.set(guidItem.value.qua._x, guidItem.value.qua._y, guidItem.value.qua._z, guidItem.value.qua._w);
- this.pano = panos.get(guidItem.value.pano);
- }
- }]);
- return FirstView;
- }();
- 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); }; }
- 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; } }
- var renderer$1, playerB, player$f;
- var texWaitTimer = {};
- var panos2; //分屏模块
- var SplitView = /*#__PURE__*/function (_EventEmitter) {
- _inherits(SplitView, _EventEmitter);
- var _super = _createSuper$P(SplitView);
- function SplitView($app, editType) {
- var _this;
- _classCallCheck(this, SplitView);
- _this = _super.call(this);
- _this.changed = function () {
- //判断右边分屏是否移动了panoramaCam 即是否需要更新markB的位置
- var previousState;
- return function () {
- var cameraChanged;
- var p = this.panoramaCam.position.clone(),
- q = this.panoramaCam.quaternion.clone();
- if (!previousState || !MathLight.closeTo(previousState.position, p, 5) || !MathLight.closeTo(previousState.quaternion, q, 5)) cameraChanged = true;
- if (cameraChanged) {
- previousState = {
- position: p,
- quaternion: q
- };
- }
- return cameraChanged;
- };
- }();
- _this.$app = $app;
- {
- _this.init();
- }
- _this.editType = editType;
- _this.pauseCameraBind; //右屏是否不跟左屏动
- return _this;
- }
- _createClass(SplitView, [{
- key: "init",
- value: function init() {
- var _this2 = this;
- player$f = this.$app.core.get('Player'); //-------------设置副屏-------------
- playerB = this.$app.dom.querySelector('.player[name="copy"]'); //创建新的renderer、 scene 和 相机控制
- renderer$1 = new THREE.WebGLRenderer({
- antialias: true
- /* !config.isMobile */
- });
- renderer$1.setPixelRatio(window.devicePixelRatio);
- renderer$1.setSize(300, 300, false);
- playerB.appendChild(renderer$1.domElement);
- var ctls = this.$app.withNewComponent('CameraControls');
- ctls.init(playerB, ['panorama']);
- ctls.activateControls('panorama');
- this.panoramaCtl = ctls.activeControl;
- this.panoramaCam = ctls.activeControl.camera;
- this.panoramaCam.fov = 60;
- this.panoramaCam.name = 'splitViewCam';
- this.panoramaCam.layers.toggle(RenderLayers.DEFAULT);
- this.panoramaCam.layers.enable(RenderLayers.PANOMARKERS);
- this.panoramaCam.layers.enable(RenderLayers.SubScreen); //this.panoramaCam.layers.enable(RenderLayers.Tag3d)
- if (settings$3.visions == 2 && !player$f.model.panos.list[0].assistPano) {
- //诊断出没有vision2的数据
- settings$3.visions = 1;
- console.warn('自动更改 visions = 1');
- }
- if (settings$3.visions != 2 && player$f.model.supportsTiles) {
- //没有下相机的单张全景图,所以只加载和左侧一样的tiles贴图,需要重新创建tiles相关,因贴图无法共用(会报错)
- var sceneRenderer2 = this.$app.withNewComponent('SceneRenderer', 1);
- var panoRenderer2 = this.$app.withNewComponent('PanoRenderer', 1);
- var tileDownloader2 = this.$app.withNewComponent('TileDownloader', {
- $app: this.$app
- });
- tileDownloader2.index = 1;
- sceneRenderer2.renderer = renderer$1;
- tileDownloader2.processPriorityQueue = true; //?
- panoRenderer2.init(sceneRenderer2, tileDownloader2);
- panos2 = new PanoramaCollection();
- panos2.extend(player$f.model.panos.list.map(function (pano) {
- var panoCopy = new Panorama(_this2.$app, pano.id, pano);
- panoCopy.floorPosition = pano.floorPosition;
- panoCopy.copyForSplitView = true; //mark
- panoCopy.attachToPanoRenderer(panoRenderer2);
- panoCopy.tileDownloader = tileDownloader2;
- panoCopy.qualityManager = _this2.$app.core.get('QualityManager');
- return panoCopy;
- }));
- tileDownloader2.setPanoData(panos2, [], this.$app.core.get('ModelManager').projectNum);
- tileDownloader2.setUrls(player$f.model.urls); //?
- tileDownloader2.useComponent();
- this.tileDownloader = tileDownloader2;
- tileDownloader2.tilePrioritizer = new TilePrioritizer(this.$app.core.get('QualityManager'), player$f.basePanoSize, player$f.standardPanoSize, player$f.highPanoSize, player$f.ultraHighPanoSize);
- tileDownloader2.tilePrioritizer.name = 'forSplitView';
- }
- {
- //添加天空盒
- this.cube = new THREE.Mesh(new THREE.BoxGeometry(10, 10, 10), new ModelTextureMaterial({
- side: THREE.BackSide,
- transparent: false,
- name: 'splitViewCubeMat',
- not_Cube: settings$3.visions == 2 || !player$f.model.supportsTiles //如果有下相机,右侧是单张图,否则和左侧一样
- }, 'skybox'));
- this.cube.name = 'splitView-cube';
- this.cube.layers.set(RenderLayers.SubScreen);
- this.$app.core.get('SceneRenderer').scene.add(this.cube);
- }
- {
- //--event
- player$f.on('updateFromControls', function (player, e) {
- if (_this2.editing) {
- var _this2$tileDownloader;
- if (_this2.pauseCameraBind) {
- _this2.panoramaCtl.update(e);
- } else {
- _this2.panoramaCtl.lon = player.cameraControls.controls.panorama.lon;
- _this2.panoramaCtl.lat = player.cameraControls.controls.panorama.lat;
- _this2.panoramaCtl.update(e);
- player.cameraControls.controls.panorama.lon = _this2.panoramaCtl.lon;
- player.cameraControls.controls.panorama.lat = _this2.panoramaCtl.lat;
- } //console.log('同步')
- (_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));
- }
- });
- }
- }
- }, {
- key: "enter",
- value: function enter() {
- var _this$tileDownloader;
- //开始分屏
- if (this.editing) return;
- this.editing = true;
- this.$app.core.get('SceneRenderer').addComponent(this);
- (_this$tileDownloader = this.tileDownloader2) === null || _this$tileDownloader === void 0 ? void 0 : _this$tileDownloader.start();
- var camera = player$f.cameraControls.cameras.panorama;
- camera.fov = camera.staticFov = 60;
- this.zoomEnabled = settings$3.zoom.enabled;
- settings$3.zoom.enabled = false; //这个决定滚轮是缩放或者前进
- this.pauseCameraBind = false; //false时两个相机的旋转角度是一致的,互相影响
- this.panoA = player$f.currentPano;
- this.setSize();
- this.setSceneB();
- this.emit('enter');
- player$f.OverlayManager.hide('all');
- player$f.GLTFEditor.hide('all');
- }
- }, {
- key: "leave",
- value: function leave() {
- var _this$tileDownloader2;
- //结束分屏
- if (!this.editing) return;
- this.$app.core.get('SceneRenderer').removeComponent(this);
- this.emit('leave');
- this.editing = false;
- settings$3.zoom.enabled = this.zoomEnabled;
- player$f.OverlayManager.show('all', true);
- player$f.GLTFEditor.show('all', true);
- player$f.cameraControls.cameras.panorama.staticFov = null;
- if (this.panoB && this.panoB != this.panoA) {
- this.panoB.exit();
- this.panoB.useAtScreenB = false;
- }
- (_this$tileDownloader2 = this.tileDownloader2) === null || _this$tileDownloader2 === void 0 ? void 0 : _this$tileDownloader2.stop();
- }
- }, {
- key: "setSceneB",
- value: function setSceneB() {
- //设置右屏
- var oldPanoB = this.panoB;
- if (settings$3.visions != 2) {
- this.panoB = this.panoA;
- this.cube.position.copy(this.panoB.position);
- this.panoramaCam.position.copy(this.panoB.position);
- } else if (this.panoB != this.panoA.assistPano) {
- this.panoB = this.panoA.assistPano;
- this.cube.position.copy(this.panoB.position);
- this.panoramaCam.position.copy(this.panoB.position); //隐藏marker
- /* if (!config.isMobile || this.editType != "measure") */
- {
- this.hideMarker && (this.hideMarker.visible = true);
- this.hideMarker = this.panoA.marker;
- this.hideMarker.visible = false;
- }
- }
- this.getTextureForCube(this.panoB);
- this.panoB.useAtScreenB = true;
- if (oldPanoB && oldPanoB != this.panoB) {
- oldPanoB.exit();
- oldPanoB.useAtScreenB = false;
- }
- }
- /*
- 注意:当visions==2时,才有下相机assistPano,而下相机没有tile
- */
- }, {
- key: "getTextureForCube",
- value: function getTextureForCube(pano) {
- var _this3 = this;
- //获取右方贴图
- console.log('getTextureForCube', pano.id);
- var pano = pano || this.panoB;
- if (settings$3.visions != 2 && player$f.model.supportsTiles) {
- pano = panos2.index[pano.id]; //加载tiles贴图需要换成panos2的pano
- }
- /* var wait = player.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, () => {
- //标准pc:2048
- this.getTextureForCube(pano)
- }) */
- var loaded = function loaded() {
- if (texWaitTimer[_this3.panoB.id]) {
- clearTimeout(texWaitTimer[_this3.panoB.id]);
- delete texWaitTimer[_this3.panoB.id];
- }
- if (pano && _this3.panoB.id != pano.id) {
- console.log('getTextureForCube退出');
- return;
- } //可能加载好就退出或者换到别的点
- console.log('texGetted', pano.id);
- pano.ensureSkyboxReadyForRender();
- var tex = pano.getSkyboxTexture();
- _this3.cube.material.uniforms.pano1Map.value = tex;
- _this3.cube.material.uniforms.pano1Matrix.value.copy(_this3.panoB.matrixWorld);
- };
- if (pano.tiled) {
- //若无下相机,使用和左侧一样的漫游点(的copy), 是tiled
- player$f.checkAndWaitForPanoLoad(pano, 'high', 'high', 512, function () {
- loaded();
- /* var d = cameraLight.getHFOVForCamera(player.camera, player.domElement.clientWidth / 2, player.domElement.clientHeight),
- p = player.zoomFov,
- r = player.getDirection()
- var loadPromise = pano.loadTiledPano( 2048, r,
- {
- hFov: d,
- vFov: p,
- },
- !1,
- !1,
- !0
- )
- loadPromise.then(() => {
- loaded()
- }) */
- //改为用tilePrioritizer
- });
- } else {
- //下相机都是单张贴图
- player$f.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, function () {
- loaded();
- }); //修改位置时 右侧可能变黑 为何
- }
- /* if (!wait) {
- if (texWaitTimer[this.panoB.id]) {
- clearTimeout(texWaitTimer[this.panoB.id])
- delete texWaitTimer[this.panoB.id]
- }
- if (pano && this.panoB.id != pano.id) {
- console.log('getTextureForCube退出')
- return
- } //可能加载好就退出或者换到别的点
- //$waiting.hide()
- texGetted = true
- console.log('texGetted ')
- pano.ensureSkyboxReadyForRender()
- var tex = pano.getSkyboxTexture()
- this.cube.material.uniforms.pano1Map.value = tex
- this.cube.material.uniforms.pano1Matrix.value.copy(this.panoB.matrixWorld)
- } else {
- if (!texWaitTimer[this.panoB.id]) {
- //如果20秒后还没加载好贴图就停止
- texWaitTimer[this.panoB.id] = setTimeout(() => {
- //$waiting.hide()
- clearTimeout(texWaitTimer[this.panoB.id])
- delete texWaitTimer[this.panoB.id]
- console.log('无法获取贴图,可能网络状态不佳')
- }, 20e3)
- }
- //$waiting.show() // objects.gui.showWaiting(true, "getTextureForCube")
- texGetted = false
- } */
- }
- }, {
- key: "update",
- value: function update() {
- //渲染右屏
- if (!this.editing) return;
- /* objects.tagManager.tagDiscs.forEach((disc) => {
- if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
- disc.canvasA_Qua = disc.quaternion.clone();
- disc.canvasA_Scale = disc.scale.clone();
- disc.tag.update(player.mode, panoramaCam, player.currentPano, player.flying)
- }) */
- renderer$1.render(this.$app.core.get('SceneRenderer').scene, this.panoramaCam);
- /* objects.tagManager.tagDiscs.forEach((disc) => {
- if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
- disc.quaternion.copy(disc.canvasA_Qua)
- disc.scale.copy(disc.canvasA_Scale)
- }) */
- }
- }, {
- key: "setSize",
- value: function setSize() {
- //右屏更改大小
- if (!this.editing) return;
- renderer$1.setSize(playerB.clientWidth, playerB.clientHeight, true, Math.min(window.devicePixelRatio, 2));
- this.panoramaCam.updateAspect(playerB.clientWidth / playerB.clientHeight);
- }
- }, {
- key: "changePano",
- value: function changePano(pano) {
- this.panoA = pano;
- }
- }]);
- return SplitView;
- }(EventEmitter);
- var Preloaders = /*#__PURE__*/function () {
- function Preloaders(model, player) {
- _classCallCheck(this, Preloaders);
- this.model = model;
- this.panos = model.panos;
- this.player = player;
- this.retryMinimumTime = 1e4;
- }
- _createClass(Preloaders, [{
- key: "start",
- value: function start() {
- this.loadNextPano(function (e) {
- if (e) {
- this.start();
- } else {
- logger$1.debug('No suitable pano loaded, waiting a little while before looking again');
- setTimeout(function () {
- this.start();
- }.bind(this), 1e3);
- }
- }.bind(this));
- }
- }, {
- key: "validLoadTarget",
- value: function validLoadTarget(e) {
- return e && !e.isLoaded('high') && Date.now() - e.failedLoadingAt > this.retryMinimumTime;
- }
- }, {
- key: "listImagePanos",
- value: function listImagePanos() {
- var e = [],
- t = this;
- this.model.images.forEach(function (i) {
- if (i.metadata && i.metadata.scan_id) {
- var n = t.model.panos.get(i.metadata.scan_id);
- n && !n.isLoaded('high') && e.push(n);
- }
- });
- return e;
- }
- }, {
- key: "loadNextPano",
- value: function loadNextPano(e) {
- var pano,
- i,
- n = this.model.waitQueue.filter(function (e) {
- return e.object instanceof Panorama;
- });
- if (n.length > 0) {
- pano = n[0].object;
- logger$1.debug('Overrode pano selection: Flying to an unloaded pano ' + pano.id);
- } else if (this.validLoadTarget(this.player.currentPano)) {
- pano = this.player.currentPano;
- logger$1.debug('Overrode pano selection: Currently at an unloaded pano ' + pano.id);
- } else if (this.validLoadTarget(this.player.closestPano)) {
- pano = this.player.closestPano;
- logger$1.debug('Overrode pano selection: Hovering over an unloaded pano ' + pano.id);
- } else if (this.player.mode === Viewmode$1.PANORAMA) {
- 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())]);
- pano && logger$1.debug('Normal pano selection: neighbor ' + pano.id);
- }
- if (pano) {
- i = i || pano.isLoaded('low') ? 'high' : 'low';
- logger$1.debug('Preloading ' + i + '-res pano ' + pano.id);
- console.log('Preloading ' + i + '-res pano ' + pano.id);
- pano.loadCube(i).done(e).fail(function () {
- logger$1.warn('Failed preloading pano', pano.id, ', marking it as failed and forgetting it for a while'), e();
- });
- } else {
- e && e(null);
- }
- }
- }]);
- return Preloaders;
- }();
- 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; } } }; }
- 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); }
- 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; }
- var Shim = {};
- var _geometryId = 0; // Geometry uses even numbers as Id
- var _m1$3 = new THREE.Matrix4();
- var _obj$1 = new THREE.Object3D();
- var _offset$1 = new THREE.Vector3();
- function Geometry() {
- Object.defineProperty(this, 'id', {
- value: _geometryId += 2
- });
- this.uuid = THREE.MathUtils.generateUUID();
- this.name = '';
- this.type = 'Geometry';
- this.vertices = [];
- this.colors = [];
- this.faces = [];
- this.faceVertexUvs = [[]];
- this.morphTargets = [];
- this.morphNormals = [];
- this.skinWeights = [];
- this.skinIndices = [];
- this.lineDistances = [];
- this.boundingBox = null;
- this.boundingSphere = null; // update flags
- this.elementsNeedUpdate = false;
- this.verticesNeedUpdate = false;
- this.uvsNeedUpdate = false;
- this.normalsNeedUpdate = false;
- this.colorsNeedUpdate = false;
- this.lineDistancesNeedUpdate = false;
- this.groupsNeedUpdate = false;
- }
- Geometry.prototype = Object.assign(Object.create(THREE.EventDispatcher.prototype), {
- constructor: Geometry,
- isGeometry: true,
- applyMatrix4: function applyMatrix4(matrix) {
- var normalMatrix = new THREE.Matrix3().getNormalMatrix(matrix);
- for (var i = 0, il = this.vertices.length; i < il; i++) {
- var vertex = this.vertices[i];
- vertex.applyMatrix4(matrix);
- }
- for (var _i = 0, _il = this.faces.length; _i < _il; _i++) {
- var face = this.faces[_i];
- face.normal.applyMatrix3(normalMatrix).normalize();
- for (var j = 0, jl = face.vertexNormals.length; j < jl; j++) {
- face.vertexNormals[j].applyMatrix3(normalMatrix).normalize();
- }
- }
- if (this.boundingBox !== null) {
- this.computeBoundingBox();
- }
- if (this.boundingSphere !== null) {
- this.computeBoundingSphere();
- }
- this.verticesNeedUpdate = true;
- this.normalsNeedUpdate = true;
- return this;
- },
- rotateX: function rotateX(angle) {
- // rotate geometry around world x-axis
- _m1$3.makeRotationX(angle);
- this.applyMatrix4(_m1$3);
- return this;
- },
- rotateY: function rotateY(angle) {
- // rotate geometry around world y-axis
- _m1$3.makeRotationY(angle);
- this.applyMatrix4(_m1$3);
- return this;
- },
- rotateZ: function rotateZ(angle) {
- // rotate geometry around world z-axis
- _m1$3.makeRotationZ(angle);
- this.applyMatrix4(_m1$3);
- return this;
- },
- translate: function translate(x, y, z) {
- // translate geometry
- _m1$3.makeTranslation(x, y, z);
- this.applyMatrix4(_m1$3);
- return this;
- },
- scale: function scale(x, y, z) {
- // scale geometry
- _m1$3.makeScale(x, y, z);
- this.applyMatrix4(_m1$3);
- return this;
- },
- lookAt: function lookAt(vector) {
- _obj$1.lookAt(vector);
- _obj$1.updateMatrix();
- this.applyMatrix4(_obj$1.matrix);
- return this;
- },
- fromBufferGeometry: function fromBufferGeometry(geometry) {
- var scope = this;
- var index = geometry.index !== null ? geometry.index : undefined;
- var attributes = geometry.attributes;
- if (attributes.position === undefined) {
- console.error('THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion.');
- return this;
- }
- var position = attributes.position;
- var normal = attributes.normal;
- var color = attributes.color;
- var uv = attributes.uv;
- var uv2 = attributes.uv2;
- if (uv2 !== undefined) this.faceVertexUvs[1] = [];
- for (var i = 0; i < position.count; i++) {
- scope.vertices.push(new THREE.Vector3().fromBufferAttribute(position, i));
- if (color !== undefined) {
- scope.colors.push(new THREE.Color().fromBufferAttribute(color, i));
- }
- }
- function addFace(a, b, c, materialIndex) {
- var vertexColors = color === undefined ? [] : [scope.colors[a].clone(), scope.colors[b].clone(), scope.colors[c].clone()];
- var vertexNormals = normal === undefined ? [] : [new THREE.Vector3().fromBufferAttribute(normal, a), new THREE.Vector3().fromBufferAttribute(normal, b), new THREE.Vector3().fromBufferAttribute(normal, c)];
- var face = new Face3(a, b, c, vertexNormals, vertexColors, materialIndex);
- scope.faces.push(face);
- if (uv !== undefined) {
- scope.faceVertexUvs[0].push([new THREE.Vector2().fromBufferAttribute(uv, a), new THREE.Vector2().fromBufferAttribute(uv, b), new THREE.Vector2().fromBufferAttribute(uv, c)]);
- }
- if (uv2 !== undefined) {
- scope.faceVertexUvs[1].push([new THREE.Vector2().fromBufferAttribute(uv2, a), new THREE.Vector2().fromBufferAttribute(uv2, b), new THREE.Vector2().fromBufferAttribute(uv2, c)]);
- }
- }
- var groups = geometry.groups;
- if (groups.length > 0) {
- for (var _i2 = 0; _i2 < groups.length; _i2++) {
- var group = groups[_i2];
- var start = group.start;
- var count = group.count;
- for (var j = start, jl = start + count; j < jl; j += 3) {
- if (index !== undefined) {
- addFace(index.getX(j), index.getX(j + 1), index.getX(j + 2), group.materialIndex);
- } else {
- addFace(j, j + 1, j + 2, group.materialIndex);
- }
- }
- }
- } else {
- if (index !== undefined) {
- for (var _i3 = 0; _i3 < index.count; _i3 += 3) {
- addFace(index.getX(_i3), index.getX(_i3 + 1), index.getX(_i3 + 2));
- }
- } else {
- for (var _i4 = 0; _i4 < position.count; _i4 += 3) {
- addFace(_i4, _i4 + 1, _i4 + 2);
- }
- }
- }
- this.computeFaceNormals();
- if (geometry.boundingBox !== null) {
- this.boundingBox = geometry.boundingBox.clone();
- }
- if (geometry.boundingSphere !== null) {
- this.boundingSphere = geometry.boundingSphere.clone();
- }
- return this;
- },
- center: function center() {
- this.computeBoundingBox();
- this.boundingBox.getCenter(_offset$1).negate();
- this.translate(_offset$1.x, _offset$1.y, _offset$1.z);
- return this;
- },
- normalize: function normalize() {
- this.computeBoundingSphere();
- var center = this.boundingSphere.center;
- var radius = this.boundingSphere.radius;
- var s = radius === 0 ? 1 : 1.0 / radius;
- var matrix = new THREE.Matrix4();
- matrix.set(s, 0, 0, -s * center.x, 0, s, 0, -s * center.y, 0, 0, s, -s * center.z, 0, 0, 0, 1);
- this.applyMatrix4(matrix);
- return this;
- },
- computeFaceNormals: function computeFaceNormals() {
- var cb = new THREE.Vector3(),
- ab = new THREE.Vector3();
- for (var f = 0, fl = this.faces.length; f < fl; f++) {
- var face = this.faces[f];
- var vA = this.vertices[face.a];
- var vB = this.vertices[face.b];
- var vC = this.vertices[face.c];
- cb.subVectors(vC, vB);
- ab.subVectors(vA, vB);
- cb.cross(ab);
- cb.normalize();
- face.normal.copy(cb);
- }
- },
- computeVertexNormals: function computeVertexNormals() {
- var areaWeighted = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var vertices = new Array(this.vertices.length);
- for (var v = 0, vl = this.vertices.length; v < vl; v++) {
- vertices[v] = new THREE.Vector3();
- }
- if (areaWeighted) {
- // vertex normals weighted by triangle areas
- // http://www.iquilezles.org/www/articles/normals/normals.htm
- var cb = new THREE.Vector3(),
- ab = new THREE.Vector3();
- for (var f = 0, fl = this.faces.length; f < fl; f++) {
- var face = this.faces[f];
- var vA = this.vertices[face.a];
- var vB = this.vertices[face.b];
- var vC = this.vertices[face.c];
- cb.subVectors(vC, vB);
- ab.subVectors(vA, vB);
- cb.cross(ab);
- vertices[face.a].add(cb);
- vertices[face.b].add(cb);
- vertices[face.c].add(cb);
- }
- } else {
- this.computeFaceNormals();
- for (var _f = 0, _fl = this.faces.length; _f < _fl; _f++) {
- var _face = this.faces[_f];
- vertices[_face.a].add(_face.normal);
- vertices[_face.b].add(_face.normal);
- vertices[_face.c].add(_face.normal);
- }
- }
- for (var _v = 0, _vl = this.vertices.length; _v < _vl; _v++) {
- vertices[_v].normalize();
- }
- for (var _f2 = 0, _fl2 = this.faces.length; _f2 < _fl2; _f2++) {
- var _face2 = this.faces[_f2];
- var vertexNormals = _face2.vertexNormals;
- if (vertexNormals.length === 3) {
- vertexNormals[0].copy(vertices[_face2.a]);
- vertexNormals[1].copy(vertices[_face2.b]);
- vertexNormals[2].copy(vertices[_face2.c]);
- } else {
- vertexNormals[0] = vertices[_face2.a].clone();
- vertexNormals[1] = vertices[_face2.b].clone();
- vertexNormals[2] = vertices[_face2.c].clone();
- }
- }
- if (this.faces.length > 0) {
- this.normalsNeedUpdate = true;
- }
- },
- computeFlatVertexNormals: function computeFlatVertexNormals() {
- this.computeFaceNormals();
- for (var f = 0, fl = this.faces.length; f < fl; f++) {
- var face = this.faces[f];
- var vertexNormals = face.vertexNormals;
- if (vertexNormals.length === 3) {
- vertexNormals[0].copy(face.normal);
- vertexNormals[1].copy(face.normal);
- vertexNormals[2].copy(face.normal);
- } else {
- vertexNormals[0] = face.normal.clone();
- vertexNormals[1] = face.normal.clone();
- vertexNormals[2] = face.normal.clone();
- }
- }
- if (this.faces.length > 0) {
- this.normalsNeedUpdate = true;
- }
- },
- computeMorphNormals: function computeMorphNormals() {
- // save original normals
- // - create temp variables on first access
- // otherwise just copy (for faster repeated calls)
- for (var f = 0, fl = this.faces.length; f < fl; f++) {
- var face = this.faces[f];
- if (!face.__originalFaceNormal) {
- face.__originalFaceNormal = face.normal.clone();
- } else {
- face.__originalFaceNormal.copy(face.normal);
- }
- if (!face.__originalVertexNormals) face.__originalVertexNormals = [];
- for (var i = 0, il = face.vertexNormals.length; i < il; i++) {
- if (!face.__originalVertexNormals[i]) {
- face.__originalVertexNormals[i] = face.vertexNormals[i].clone();
- } else {
- face.__originalVertexNormals[i].copy(face.vertexNormals[i]);
- }
- }
- } // use temp geometry to compute face and vertex normals for each morph
- var tmpGeo = new Geometry();
- tmpGeo.faces = this.faces;
- for (var _i5 = 0, _il2 = this.morphTargets.length; _i5 < _il2; _i5++) {
- // create on first access
- if (!this.morphNormals[_i5]) {
- this.morphNormals[_i5] = {};
- this.morphNormals[_i5].faceNormals = [];
- this.morphNormals[_i5].vertexNormals = [];
- var dstNormalsFace = this.morphNormals[_i5].faceNormals;
- var dstNormalsVertex = this.morphNormals[_i5].vertexNormals;
- for (var _f3 = 0, _fl3 = this.faces.length; _f3 < _fl3; _f3++) {
- var faceNormal = new THREE.Vector3();
- var vertexNormals = {
- a: new THREE.Vector3(),
- b: new THREE.Vector3(),
- c: new THREE.Vector3()
- };
- dstNormalsFace.push(faceNormal);
- dstNormalsVertex.push(vertexNormals);
- }
- }
- var morphNormals = this.morphNormals[_i5]; // set vertices to morph target
- tmpGeo.vertices = this.morphTargets[_i5].vertices; // compute morph normals
- tmpGeo.computeFaceNormals();
- tmpGeo.computeVertexNormals(); // store morph normals
- for (var _f4 = 0, _fl4 = this.faces.length; _f4 < _fl4; _f4++) {
- var _face3 = this.faces[_f4];
- var _faceNormal = morphNormals.faceNormals[_f4];
- var _vertexNormals = morphNormals.vertexNormals[_f4];
- _faceNormal.copy(_face3.normal);
- _vertexNormals.a.copy(_face3.vertexNormals[0]);
- _vertexNormals.b.copy(_face3.vertexNormals[1]);
- _vertexNormals.c.copy(_face3.vertexNormals[2]);
- }
- } // restore original normals
- for (var _f5 = 0, _fl5 = this.faces.length; _f5 < _fl5; _f5++) {
- var _face4 = this.faces[_f5];
- _face4.normal = _face4.__originalFaceNormal;
- _face4.vertexNormals = _face4.__originalVertexNormals;
- }
- },
- computeBoundingBox: function computeBoundingBox() {
- if (this.boundingBox === null) {
- this.boundingBox = new THREE.Box3();
- }
- this.boundingBox.setFromPoints(this.vertices);
- },
- computeBoundingSphere: function computeBoundingSphere() {
- if (this.boundingSphere === null) {
- this.boundingSphere = new THREE.Sphere();
- }
- this.boundingSphere.setFromPoints(this.vertices);
- },
- merge: function merge(geometry, matrix) {
- var materialIndexOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- if (!(geometry && geometry.isGeometry)) {
- console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry);
- return;
- }
- var normalMatrix;
- var vertexOffset = this.vertices.length,
- vertices1 = this.vertices,
- vertices2 = geometry.vertices,
- faces1 = this.faces,
- faces2 = geometry.faces,
- colors1 = this.colors,
- colors2 = geometry.colors;
- if (matrix !== undefined) {
- normalMatrix = new THREE.Matrix3().getNormalMatrix(matrix);
- } // vertices
- for (var i = 0, il = vertices2.length; i < il; i++) {
- var vertex = vertices2[i];
- var vertexCopy = vertex.clone();
- if (matrix !== undefined) vertexCopy.applyMatrix4(matrix);
- vertices1.push(vertexCopy);
- } // colors
- for (var _i6 = 0, _il3 = colors2.length; _i6 < _il3; _i6++) {
- colors1.push(colors2[_i6].clone());
- } // faces
- for (var _i7 = 0, _il4 = faces2.length; _i7 < _il4; _i7++) {
- var face = faces2[_i7];
- var normal = void 0,
- color = void 0;
- var faceVertexNormals = face.vertexNormals,
- faceVertexColors = face.vertexColors;
- var faceCopy = new Face3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset);
- faceCopy.normal.copy(face.normal);
- if (normalMatrix !== undefined) {
- faceCopy.normal.applyMatrix3(normalMatrix).normalize();
- }
- for (var j = 0, jl = faceVertexNormals.length; j < jl; j++) {
- normal = faceVertexNormals[j].clone();
- if (normalMatrix !== undefined) {
- normal.applyMatrix3(normalMatrix).normalize();
- }
- faceCopy.vertexNormals.push(normal);
- }
- faceCopy.color.copy(face.color);
- for (var _j = 0, _jl = faceVertexColors.length; _j < _jl; _j++) {
- color = faceVertexColors[_j];
- faceCopy.vertexColors.push(color.clone());
- }
- faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
- faces1.push(faceCopy);
- } // uvs
- for (var _i8 = 0, _il5 = geometry.faceVertexUvs.length; _i8 < _il5; _i8++) {
- var faceVertexUvs2 = geometry.faceVertexUvs[_i8];
- if (this.faceVertexUvs[_i8] === undefined) this.faceVertexUvs[_i8] = [];
- for (var _j2 = 0, _jl2 = faceVertexUvs2.length; _j2 < _jl2; _j2++) {
- var uvs2 = faceVertexUvs2[_j2],
- uvsCopy = [];
- for (var k = 0, kl = uvs2.length; k < kl; k++) {
- uvsCopy.push(uvs2[k].clone());
- }
- this.faceVertexUvs[_i8].push(uvsCopy);
- }
- }
- },
- mergeMesh: function mergeMesh(mesh) {
- if (!(mesh && mesh.isMesh)) {
- console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh);
- return;
- }
- if (mesh.matrixAutoUpdate) mesh.updateMatrix();
- this.merge(mesh.geometry, mesh.matrix);
- },
- /*
- * Checks for duplicate vertices with hashmap.
- * Duplicated vertices are removed
- * and faces' vertices are updated.
- */
- mergeVertices: function mergeVertices() {
- var precisionPoints = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
- var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
- var unique = [],
- changes = [];
- var precision = Math.pow(10, precisionPoints);
- for (var i = 0, il = this.vertices.length; i < il; i++) {
- var v = this.vertices[i];
- var key = Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision);
- if (verticesMap[key] === undefined) {
- verticesMap[key] = i;
- unique.push(this.vertices[i]);
- changes[i] = unique.length - 1;
- } else {
- //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
- changes[i] = changes[verticesMap[key]];
- }
- } // if faces are completely degenerate after merging vertices, we
- // have to remove them from the geometry.
- var faceIndicesToRemove = [];
- for (var _i9 = 0, _il6 = this.faces.length; _i9 < _il6; _i9++) {
- var face = this.faces[_i9];
- face.a = changes[face.a];
- face.b = changes[face.b];
- face.c = changes[face.c];
- var indices = [face.a, face.b, face.c]; // if any duplicate vertices are found in a Face3
- // we have to remove the face as nothing can be saved
- for (var n = 0; n < 3; n++) {
- if (indices[n] === indices[(n + 1) % 3]) {
- faceIndicesToRemove.push(_i9);
- break;
- }
- }
- }
- for (var _i10 = faceIndicesToRemove.length - 1; _i10 >= 0; _i10--) {
- var idx = faceIndicesToRemove[_i10];
- this.faces.splice(idx, 1);
- for (var j = 0, jl = this.faceVertexUvs.length; j < jl; j++) {
- this.faceVertexUvs[j].splice(idx, 1);
- }
- } // Use unique set of vertices
- var diff = this.vertices.length - unique.length;
- this.vertices = unique;
- return diff;
- },
- setFromPoints: function setFromPoints(points) {
- this.vertices = [];
- for (var i = 0, l = points.length; i < l; i++) {
- var point = points[i];
- this.vertices.push(new THREE.Vector3(point.x, point.y, point.z || 0));
- }
- return this;
- },
- sortFacesByMaterialIndex: function sortFacesByMaterialIndex() {
- var faces = this.faces;
- var length = faces.length; // tag faces
- for (var i = 0; i < length; i++) {
- faces[i]._id = i;
- } // sort faces
- function materialIndexSort(a, b) {
- return a.materialIndex - b.materialIndex;
- }
- faces.sort(materialIndexSort); // sort uvs
- var uvs1 = this.faceVertexUvs[0];
- var uvs2 = this.faceVertexUvs[1];
- var newUvs1, newUvs2;
- if (uvs1 && uvs1.length === length) newUvs1 = [];
- if (uvs2 && uvs2.length === length) newUvs2 = [];
- for (var _i11 = 0; _i11 < length; _i11++) {
- var id = faces[_i11]._id;
- if (newUvs1) newUvs1.push(uvs1[id]);
- if (newUvs2) newUvs2.push(uvs2[id]);
- }
- if (newUvs1) this.faceVertexUvs[0] = newUvs1;
- if (newUvs2) this.faceVertexUvs[1] = newUvs2;
- },
- toJSON: function toJSON() {
- var data = {
- metadata: {
- version: 4.5,
- type: 'Geometry',
- generator: 'Geometry.toJSON'
- }
- }; // standard Geometry serialization
- data.uuid = this.uuid;
- data.type = this.type;
- if (this.name !== '') data.name = this.name;
- if (this.parameters !== undefined) {
- var parameters = this.parameters;
- for (var key in parameters) {
- if (parameters[key] !== undefined) data[key] = parameters[key];
- }
- return data;
- }
- var vertices = [];
- for (var i = 0; i < this.vertices.length; i++) {
- var vertex = this.vertices[i];
- vertices.push(vertex.x, vertex.y, vertex.z);
- }
- var faces = [];
- var normals = [];
- var normalsHash = {};
- var colors = [];
- var colorsHash = {};
- var uvs = [];
- var uvsHash = {};
- for (var _i12 = 0; _i12 < this.faces.length; _i12++) {
- var face = this.faces[_i12];
- var hasMaterial = true;
- var hasFaceUv = false; // deprecated
- var hasFaceVertexUv = this.faceVertexUvs[0][_i12] !== undefined;
- var hasFaceNormal = face.normal.length() > 0;
- var hasFaceVertexNormal = face.vertexNormals.length > 0;
- var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
- var hasFaceVertexColor = face.vertexColors.length > 0;
- var faceType = 0;
- faceType = setBit(faceType, 0, 0); // isQuad
- faceType = setBit(faceType, 1, hasMaterial);
- faceType = setBit(faceType, 2, hasFaceUv);
- faceType = setBit(faceType, 3, hasFaceVertexUv);
- faceType = setBit(faceType, 4, hasFaceNormal);
- faceType = setBit(faceType, 5, hasFaceVertexNormal);
- faceType = setBit(faceType, 6, hasFaceColor);
- faceType = setBit(faceType, 7, hasFaceVertexColor);
- faces.push(faceType);
- faces.push(face.a, face.b, face.c);
- faces.push(face.materialIndex);
- if (hasFaceVertexUv) {
- var faceVertexUvs = this.faceVertexUvs[0][_i12];
- faces.push(getUvIndex(faceVertexUvs[0]), getUvIndex(faceVertexUvs[1]), getUvIndex(faceVertexUvs[2]));
- }
- if (hasFaceNormal) {
- faces.push(getNormalIndex(face.normal));
- }
- if (hasFaceVertexNormal) {
- var vertexNormals = face.vertexNormals;
- faces.push(getNormalIndex(vertexNormals[0]), getNormalIndex(vertexNormals[1]), getNormalIndex(vertexNormals[2]));
- }
- if (hasFaceColor) {
- faces.push(getColorIndex(face.color));
- }
- if (hasFaceVertexColor) {
- var vertexColors = face.vertexColors;
- faces.push(getColorIndex(vertexColors[0]), getColorIndex(vertexColors[1]), getColorIndex(vertexColors[2]));
- }
- }
- function setBit(value, position, enabled) {
- return enabled ? value | 1 << position : value & ~(1 << position);
- }
- function getNormalIndex(normal) {
- var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
- if (normalsHash[hash] !== undefined) {
- return normalsHash[hash];
- }
- normalsHash[hash] = normals.length / 3;
- normals.push(normal.x, normal.y, normal.z);
- return normalsHash[hash];
- }
- function getColorIndex(color) {
- var hash = color.r.toString() + color.g.toString() + color.b.toString();
- if (colorsHash[hash] !== undefined) {
- return colorsHash[hash];
- }
- colorsHash[hash] = colors.length;
- colors.push(color.getHex());
- return colorsHash[hash];
- }
- function getUvIndex(uv) {
- var hash = uv.x.toString() + uv.y.toString();
- if (uvsHash[hash] !== undefined) {
- return uvsHash[hash];
- }
- uvsHash[hash] = uvs.length / 2;
- uvs.push(uv.x, uv.y);
- return uvsHash[hash];
- }
- data.data = {};
- data.data.vertices = vertices;
- data.data.normals = normals;
- if (colors.length > 0) data.data.colors = colors;
- if (uvs.length > 0) data.data.uvs = [uvs]; // temporal backward compatibility
- data.data.faces = faces;
- return data;
- },
- clone: function clone() {
- return new Geometry().copy(this);
- },
- copy: function copy(source) {
- // reset
- this.vertices = [];
- this.colors = [];
- this.faces = [];
- this.faceVertexUvs = [[]];
- this.morphTargets = [];
- this.morphNormals = [];
- this.skinWeights = [];
- this.skinIndices = [];
- this.lineDistances = [];
- this.boundingBox = null;
- this.boundingSphere = null; // name
- this.name = source.name; // vertices
- var vertices = source.vertices;
- for (var i = 0, il = vertices.length; i < il; i++) {
- this.vertices.push(vertices[i].clone());
- } // colors
- var colors = source.colors;
- for (var _i13 = 0, _il7 = colors.length; _i13 < _il7; _i13++) {
- this.colors.push(colors[_i13].clone());
- } // faces
- var faces = source.faces;
- for (var _i14 = 0, _il8 = faces.length; _i14 < _il8; _i14++) {
- this.faces.push(faces[_i14].clone());
- } // face vertex uvs
- for (var _i15 = 0, _il9 = source.faceVertexUvs.length; _i15 < _il9; _i15++) {
- var faceVertexUvs = source.faceVertexUvs[_i15];
- if (this.faceVertexUvs[_i15] === undefined) {
- this.faceVertexUvs[_i15] = [];
- }
- for (var j = 0, jl = faceVertexUvs.length; j < jl; j++) {
- var uvs = faceVertexUvs[j],
- uvsCopy = [];
- for (var k = 0, kl = uvs.length; k < kl; k++) {
- var uv = uvs[k];
- uvsCopy.push(uv.clone());
- }
- this.faceVertexUvs[_i15].push(uvsCopy);
- }
- } // morph targets
- var morphTargets = source.morphTargets;
- for (var _i16 = 0, _il10 = morphTargets.length; _i16 < _il10; _i16++) {
- var morphTarget = {};
- morphTarget.name = morphTargets[_i16].name; // vertices
- if (morphTargets[_i16].vertices !== undefined) {
- morphTarget.vertices = [];
- for (var _j3 = 0, _jl3 = morphTargets[_i16].vertices.length; _j3 < _jl3; _j3++) {
- morphTarget.vertices.push(morphTargets[_i16].vertices[_j3].clone());
- }
- } // normals
- if (morphTargets[_i16].normals !== undefined) {
- morphTarget.normals = [];
- for (var _j4 = 0, _jl4 = morphTargets[_i16].normals.length; _j4 < _jl4; _j4++) {
- morphTarget.normals.push(morphTargets[_i16].normals[_j4].clone());
- }
- }
- this.morphTargets.push(morphTarget);
- } // morph normals
- var morphNormals = source.morphNormals;
- for (var _i17 = 0, _il11 = morphNormals.length; _i17 < _il11; _i17++) {
- var morphNormal = {}; // vertex normals
- if (morphNormals[_i17].vertexNormals !== undefined) {
- morphNormal.vertexNormals = [];
- for (var _j5 = 0, _jl5 = morphNormals[_i17].vertexNormals.length; _j5 < _jl5; _j5++) {
- var srcVertexNormal = morphNormals[_i17].vertexNormals[_j5];
- var destVertexNormal = {};
- destVertexNormal.a = srcVertexNormal.a.clone();
- destVertexNormal.b = srcVertexNormal.b.clone();
- destVertexNormal.c = srcVertexNormal.c.clone();
- morphNormal.vertexNormals.push(destVertexNormal);
- }
- } // face normals
- if (morphNormals[_i17].faceNormals !== undefined) {
- morphNormal.faceNormals = [];
- for (var _j6 = 0, _jl6 = morphNormals[_i17].faceNormals.length; _j6 < _jl6; _j6++) {
- morphNormal.faceNormals.push(morphNormals[_i17].faceNormals[_j6].clone());
- }
- }
- this.morphNormals.push(morphNormal);
- } // skin weights
- var skinWeights = source.skinWeights;
- for (var _i18 = 0, _il12 = skinWeights.length; _i18 < _il12; _i18++) {
- this.skinWeights.push(skinWeights[_i18].clone());
- } // skin indices
- var skinIndices = source.skinIndices;
- for (var _i19 = 0, _il13 = skinIndices.length; _i19 < _il13; _i19++) {
- this.skinIndices.push(skinIndices[_i19].clone());
- } // line distances
- var lineDistances = source.lineDistances;
- for (var _i20 = 0, _il14 = lineDistances.length; _i20 < _il14; _i20++) {
- this.lineDistances.push(lineDistances[_i20]);
- } // bounding box
- var boundingBox = source.boundingBox;
- if (boundingBox !== null) {
- this.boundingBox = boundingBox.clone();
- } // bounding sphere
- var boundingSphere = source.boundingSphere;
- if (boundingSphere !== null) {
- this.boundingSphere = boundingSphere.clone();
- } // update flags
- this.elementsNeedUpdate = source.elementsNeedUpdate;
- this.verticesNeedUpdate = source.verticesNeedUpdate;
- this.uvsNeedUpdate = source.uvsNeedUpdate;
- this.normalsNeedUpdate = source.normalsNeedUpdate;
- this.colorsNeedUpdate = source.colorsNeedUpdate;
- this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
- this.groupsNeedUpdate = source.groupsNeedUpdate;
- return this;
- },
- dispose: function dispose() {
- this.dispatchEvent({
- type: 'dispose'
- });
- }
- });
- Shim.Geometry = Geometry;
- var DirectGeometry = /*#__PURE__*/function () {
- function DirectGeometry() {
- _classCallCheck(this, DirectGeometry);
- this.vertices = [];
- this.normals = [];
- this.colors = [];
- this.uvs = [];
- this.uvs2 = [];
- this.groups = [];
- this.morphTargets = {};
- this.skinWeights = [];
- this.skinIndices = []; // this.lineDistances = [];
- this.boundingBox = null;
- this.boundingSphere = null; // update flags
- this.verticesNeedUpdate = false;
- this.normalsNeedUpdate = false;
- this.colorsNeedUpdate = false;
- this.uvsNeedUpdate = false;
- this.groupsNeedUpdate = false;
- }
- _createClass(DirectGeometry, [{
- key: "computeGroups",
- value: function computeGroups(geometry) {
- var groups = [];
- var group, i;
- var materialIndex = undefined;
- var faces = geometry.faces;
- for (i = 0; i < faces.length; i++) {
- var face = faces[i]; // materials
- if (face.materialIndex !== materialIndex) {
- materialIndex = face.materialIndex;
- if (group !== undefined) {
- group.count = i * 3 - group.start;
- groups.push(group);
- }
- group = {
- start: i * 3,
- materialIndex: materialIndex
- };
- }
- }
- if (group !== undefined) {
- group.count = i * 3 - group.start;
- groups.push(group);
- }
- this.groups = groups;
- }
- }, {
- key: "fromGeometry",
- value: function fromGeometry(geometry) {
- var faces = geometry.faces;
- var vertices = geometry.vertices;
- var faceVertexUvs = geometry.faceVertexUvs;
- var hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0;
- var hasFaceVertexUv2 = faceVertexUvs[1] && faceVertexUvs[1].length > 0; // morphs
- var morphTargets = geometry.morphTargets;
- var morphTargetsLength = morphTargets.length;
- var morphTargetsPosition;
- if (morphTargetsLength > 0) {
- morphTargetsPosition = [];
- for (var i = 0; i < morphTargetsLength; i++) {
- morphTargetsPosition[i] = {
- name: morphTargets[i].name,
- data: []
- };
- }
- this.morphTargets.position = morphTargetsPosition;
- }
- var morphNormals = geometry.morphNormals;
- var morphNormalsLength = morphNormals.length;
- var morphTargetsNormal;
- if (morphNormalsLength > 0) {
- morphTargetsNormal = [];
- for (var _i21 = 0; _i21 < morphNormalsLength; _i21++) {
- morphTargetsNormal[_i21] = {
- name: morphNormals[_i21].name,
- data: []
- };
- }
- this.morphTargets.normal = morphTargetsNormal;
- } // skins
- var skinIndices = geometry.skinIndices;
- var skinWeights = geometry.skinWeights;
- var hasSkinIndices = skinIndices.length === vertices.length;
- var hasSkinWeights = skinWeights.length === vertices.length; //
- if (vertices.length > 0 && faces.length === 0) {
- console.error('THREE.DirectGeometry: Faceless geometries are not supported.');
- }
- for (var _i22 = 0; _i22 < faces.length; _i22++) {
- var face = faces[_i22];
- this.vertices.push(vertices[face.a], vertices[face.b], vertices[face.c]);
- var vertexNormals = face.vertexNormals;
- if (vertexNormals.length === 3) {
- this.normals.push(vertexNormals[0], vertexNormals[1], vertexNormals[2]);
- } else {
- var normal = face.normal;
- this.normals.push(normal, normal, normal);
- }
- var vertexColors = face.vertexColors;
- if (vertexColors.length === 3) {
- this.colors.push(vertexColors[0], vertexColors[1], vertexColors[2]);
- } else {
- var color = face.color;
- this.colors.push(color, color, color);
- }
- if (hasFaceVertexUv === true) {
- var vertexUvs = faceVertexUvs[0][_i22];
- if (vertexUvs !== undefined) {
- this.uvs.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]);
- } else {
- console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', _i22);
- this.uvs.push(new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2());
- }
- }
- if (hasFaceVertexUv2 === true) {
- var _vertexUvs = faceVertexUvs[1][_i22];
- if (_vertexUvs !== undefined) {
- this.uvs2.push(_vertexUvs[0], _vertexUvs[1], _vertexUvs[2]);
- } else {
- console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', _i22);
- this.uvs2.push(new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2());
- }
- } // morphs
- for (var j = 0; j < morphTargetsLength; j++) {
- var morphTarget = morphTargets[j].vertices;
- morphTargetsPosition[j].data.push(morphTarget[face.a], morphTarget[face.b], morphTarget[face.c]);
- }
- for (var _j7 = 0; _j7 < morphNormalsLength; _j7++) {
- var morphNormal = morphNormals[_j7].vertexNormals[_i22];
- morphTargetsNormal[_j7].data.push(morphNormal.a, morphNormal.b, morphNormal.c);
- } // skins
- if (hasSkinIndices) {
- this.skinIndices.push(skinIndices[face.a], skinIndices[face.b], skinIndices[face.c]);
- }
- if (hasSkinWeights) {
- this.skinWeights.push(skinWeights[face.a], skinWeights[face.b], skinWeights[face.c]);
- }
- }
- this.computeGroups(geometry);
- this.verticesNeedUpdate = geometry.verticesNeedUpdate;
- this.normalsNeedUpdate = geometry.normalsNeedUpdate;
- this.colorsNeedUpdate = geometry.colorsNeedUpdate;
- this.uvsNeedUpdate = geometry.uvsNeedUpdate;
- this.groupsNeedUpdate = geometry.groupsNeedUpdate;
- if (geometry.boundingSphere !== null) {
- this.boundingSphere = geometry.boundingSphere.clone();
- }
- if (geometry.boundingBox !== null) {
- this.boundingBox = geometry.boundingBox.clone();
- }
- return this;
- }
- }]);
- return DirectGeometry;
- }();
- THREE.BufferGeometry.prototype.fromGeometry = function (geometry) {
- geometry.__directGeometry = new DirectGeometry().fromGeometry(geometry);
- return this.fromDirectGeometry(geometry.__directGeometry);
- }, THREE.BufferGeometry.prototype.fromDirectGeometry = function (geometry) {
- var positions = new Float32Array(geometry.vertices.length * 3);
- this.setAttribute('position', new THREE.BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices));
- if (geometry.normals.length > 0) {
- var normals = new Float32Array(geometry.normals.length * 3);
- this.setAttribute('normal', new THREE.BufferAttribute(normals, 3).copyVector3sArray(geometry.normals));
- }
- if (geometry.colors.length > 0) {
- var colors = new Float32Array(geometry.colors.length * 3);
- this.setAttribute('color', new THREE.BufferAttribute(colors, 3).copyColorsArray(geometry.colors));
- }
- if (geometry.uvs.length > 0) {
- var uvs = new Float32Array(geometry.uvs.length * 2);
- this.setAttribute('uv', new THREE.BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs));
- }
- if (geometry.uvs2.length > 0) {
- var uvs2 = new Float32Array(geometry.uvs2.length * 2);
- this.setAttribute('uv2', new THREE.BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2));
- } // groups
- this.groups = geometry.groups; // morphs
- for (var name in geometry.morphTargets) {
- var array = [];
- var morphTargets = geometry.morphTargets[name];
- for (var i = 0, l = morphTargets.length; i < l; i++) {
- var morphTarget = morphTargets[i];
- var attribute = new Float32BufferAttribute(morphTarget.data.length * 3, 3);
- attribute.name = morphTarget.name;
- array.push(attribute.copyVector3sArray(morphTarget.data));
- }
- this.morphAttributes[name] = array;
- } // skinning
- if (geometry.skinIndices.length > 0) {
- var skinIndices = new Float32BufferAttribute(geometry.skinIndices.length * 4, 4);
- this.setAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices));
- }
- if (geometry.skinWeights.length > 0) {
- var skinWeights = new Float32BufferAttribute(geometry.skinWeights.length * 4, 4);
- this.setAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights));
- } //
- if (geometry.boundingSphere !== null) {
- this.boundingSphere = geometry.boundingSphere.clone();
- }
- if (geometry.boundingBox !== null) {
- this.boundingBox = geometry.boundingBox.clone();
- }
- return this;
- };
- var Face3 = /*#__PURE__*/function () {
- function Face3(a, b, c, normal, color) {
- var materialIndex = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
- _classCallCheck(this, Face3);
- this.a = a;
- this.b = b;
- this.c = c;
- this.normal = normal && normal.isVector3 ? normal : new THREE.Vector3();
- this.vertexNormals = Array.isArray(normal) ? normal : [];
- this.color = color && color.isColor ? color : new THREE.Color();
- this.vertexColors = Array.isArray(color) ? color : [];
- this.materialIndex = materialIndex;
- }
- _createClass(Face3, [{
- key: "clone",
- value: function clone() {
- return new this.constructor().copy(this);
- }
- }, {
- key: "copy",
- value: function copy(source) {
- this.a = source.a;
- this.b = source.b;
- this.c = source.c;
- this.normal.copy(source.normal);
- this.color.copy(source.color);
- this.materialIndex = source.materialIndex;
- for (var i = 0, il = source.vertexNormals.length; i < il; i++) {
- this.vertexNormals[i] = source.vertexNormals[i].clone();
- }
- for (var _i23 = 0, _il15 = source.vertexColors.length; _i23 < _il15; _i23++) {
- this.vertexColors[_i23] = source.vertexColors[_i23].clone();
- }
- return this;
- }
- }]);
- return Face3;
- }();
- Shim.Face3 = Face3;
- THREE.Shim = Shim; //扩展
- //export default Shim
- //修改
- THREE.EventDispatcher.prototype.addEventListener = function (type, listener) {
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- _ref$importance = _ref.importance,
- importance = _ref$importance === void 0 ? 0 : _ref$importance,
- once = _ref.once;
- //add importance
- if (this._listeners === undefined) this._listeners = {};
- var listeners = this._listeners;
- if (listeners[type] === undefined) {
- listeners[type] = [];
- }
- /* if(type == 'flyingDone'){
- console.log('addEventListener flyingDone')
- } */
- if (!listeners[type].some(function (e) {
- return e.listener == listener;
- })) {
- listeners[type].push({
- listener,
- importance,
- once
- });
- listeners[type] = listeners[type].sort(function (e, a) {
- return a.importance - e.importance;
- }); //add
- }
- };
- THREE.EventDispatcher.prototype.hasEventListener = function (type, listener) {
- if (this._listeners === undefined) return false;
- var listeners = this._listeners;
- return listeners[type] !== undefined && listeners[type].some(function (e) {
- return e.listener == listener;
- });
- };
- THREE.EventDispatcher.prototype.removeEventListener = function (type, listener) {
- if (this._listeners === undefined) return;
- var listeners = this._listeners;
- var listenerArray = listeners[type];
- if (listenerArray !== undefined) {
- /* const index = listenerArray.indexOf( listener );
- if ( index !== - 1 ) {
- listenerArray.splice( index, 1 );
- } */
- var item = listenerArray.find(function (e) {
- return e.listener == listener;
- });
- item && listenerArray.splice(listenerArray.indexOf(item), 1);
- }
- };
- THREE.EventDispatcher.prototype.removeEventListeners = function (type) {
- //add
- if (this._listeners && this._listeners[type] !== undefined) {
- delete this._listeners[type];
- }
- };
- THREE.EventDispatcher.prototype.removeAllListeners = function () {
- //add
- this._listeners = {};
- };
- THREE.EventDispatcher.prototype.dispatchEvent = function (event) {
- if (typeof event == 'string') {
- //add
- event = {
- type: event
- };
- }
- if (this._listeners === undefined) return;
- var listeners = this._listeners;
- var listenerArray = listeners[event.type];
- if (listenerArray !== undefined) {
- event.target = this; // Make a copy, in case listeners are removed while iterating.
- var _iterator = _createForOfIteratorHelper$7(listenerArray.slice(0)),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var _step$value = _step.value,
- listener = _step$value.listener,
- once = _step$value.once;
- if (once) {
- this.removeEventListener(event.type, listener);
- }
- var result = listener.call(this, event); //add stopContinue
- if (result && result.stopContinue) {
- break;
- }
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- }
- };
- THREE.EventDispatcher.prototype.traverse = function (callback) {
- var result = callback(this);
- if (result && result.stopContinue) {
- //xzw add
- return;
- }
- var children = this.children;
- if (children) {
- for (var i = 0, l = children.length; i < l; i++) {
- children[i].traverse(callback);
- }
- }
- };
- THREE.Quaternion.prototype.toObject = function (e) {
- return {
- x: this.x,
- y: this.y,
- z: this.z,
- w: this.w
- };
- };
- THREE.Euler.prototype.toObject = function (addOrder) {
- var euler = {
- x: this.x,
- y: this.y,
- z: this.z
- };
- addOrder && (euler.order = this.order);
- return euler;
- };
- THREE.Vector3.prototype.toObject = function () {
- return {
- x: this.x,
- y: this.y,
- z: this.z
- };
- };
- THREE.Vector2.prototype.toObject = function () {
- return {
- x: this.x,
- y: this.y
- };
- };
- THREE.Object3D.prototype.traverse = function (callback, lastResult) {
- var result = callback(this, lastResult); //lastResult一般用于收集祖先的visible
- if (result && result.stopContinue) {
- //xzw add
- return;
- }
- var children = this.children;
- for (var i = 0, l = children.length; i < l; i++) {
- children[i] && children[i].traverse(callback, result);
- }
- };
- THREE.Object3D.prototype.isChildOf = function (rootParent) {
- //是否后代, 包括自身
- var parent = this;
- while (parent) {
- if (parent == rootParent) {
- return true;
- }
- parent = parent.parent;
- }
- };
- THREE.Object3D.prototype.realVisible = function () {
- var v = true;
- var parent = this;
- var lastParent;
- while (parent) {
- if (parent.visible === false) {
- v = false;
- break;
- }
- lastParent = parent;
- parent = parent.parent;
- }
- if (v && !(lastParent instanceof THREE.Scene)) {
- //已被删除
- v = false;
- }
- return v;
- };
- THREE.Object3D.prototype.traverseVisible = function (callback) {
- if (this.realVisible() == false) return; //改
- callback(this);
- var children = this.children;
- for (var i = 0, l = children.length; i < l; i++) {
- children[i].traverseVisible(callback);
- }
- };
- THREE.Object3D.prototype.updateVisible = function () {
- console.log(arguments);
- common$1.updateVisible.apply(this, [this].concat(Array.prototype.slice.call(arguments)));
- };
- 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; } } }; }
- 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); }
- 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; }
- defineComponent('Scene', function () {
- return /*#__PURE__*/function () {
- function Scene() {
- _classCallCheck(this, Scene);
- this.ready = false;
- this.loaded = false;
- this.tilegen = true; //应该放到setting里
- this.quickstart = false;
- this.position = new THREE.Vector3(15, 10, 15); //默认初始点位置
- this.splitViews = []; //分屏
- // if (this.$app.config.view === false) {
- // this.locked = Deferred()
- // this.$app.store.on('auth', () => {
- // this.locked.resolve()
- // })
- // }
- }
- _createClass(Scene, [{
- key: "beforeLoad",
- value: function beforeLoad() {
- this.$app.withComponent('Screenshot');
- this.$app.withComponent('SceneRenderer');
- this.$app.withComponent('PanoRenderer');
- this.$app.withComponent('PanoVideoRenderer');
- this.$app.withComponent('QualityManager');
- this.$app.withComponent('ModelManager');
- this.$app.withComponent('CameraControls');
- this.$app.withComponent('DisplayController');
- this.$app.withComponent('TileDownloader', {
- concurrentDownloads: this.tilegen ? 6 : 2,
- $app: this.$app
- });
- this.$app.withComponent('Player');
- this.$app.withComponent('Director');
- this.$app.core.get('SceneRenderer').createScene();
- this.$app.core.get('CameraControls').init(this.$app.dom.querySelector('.player'));
- this.$app.core.get('QualityManager').init();
- this.$app.core.get('TileDownloader').init();
- this.$app.core.get('PanoRenderer').init();
- } //启动
- }, {
- key: "start",
- value: function () {
- var _start = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
- var _this = this;
- var auth, metadata, metadataForVideo, _iterator, _step, data, buildScene;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- if (!this.ready) {
- _context2.next = 2;
- break;
- }
- return _context2.abrupt("return");
- case 2:
- if (!(this.$app.config.view === false && this.$app.config.useAuth)) {
- _context2.next = 14;
- break;
- }
- _context2.prev = 3;
- _context2.next = 6;
- return this.$app.resource.auth();
- case 6:
- auth = _context2.sent;
- if (!(auth.success == false)) {
- _context2.next = 9;
- break;
- }
- return _context2.abrupt("return");
- case 9:
- _context2.next = 14;
- break;
- case 11:
- _context2.prev = 11;
- _context2.t0 = _context2["catch"](3);
- return _context2.abrupt("return");
- case 14:
- console.log('start0----------');
- _context2.next = 17;
- return this.$app.resource.metadata();
- case 17:
- metadata = _context2.sent;
- if (!(metadata == void 0)) {
- _context2.next = 20;
- break;
- }
- return _context2.abrupt("return");
- case 20:
- if (!(metadata.filters && metadata.filters == 1)) {
- _context2.next = 23;
- break;
- }
- _context2.next = 23;
- return this.$app.store.get('filters');
- case 23:
- if (!(metadata.cutModel && metadata.cutModel == 1)) {
- _context2.next = 27;
- break;
- }
- _context2.next = 26;
- return this.$app.store.get('cutModel');
- case 26:
- this.$app.store.getValue('metadata').cutModel = _context2.sent;
- case 27:
- // if (metadata.sceneDraw && metadata.sceneDraw == 1) {
- // let data = await this.$app.store.get('sceneDraw')
- // this.$app.store.getValue('metadata').sceneDraw = {
- // data,
- // labelVisible: this.$app.store.getValue('metadata').controls.showDrawTitle,
- // }
- // }
- console.log('load0--------------------');
- if (this.$app.store.getValue('metadata').controls.showAllModel === 1) {
- ModelSide.setSide(2);
- } else {
- ModelSide.setSide(null);
- }
- this.beforeLoad(); // 判断是否需要锁住场景不继续加载
- if (!this.$app.Scene.locked) {
- _context2.next = 33;
- break;
- }
- _context2.next = 33;
- return this.$app.Scene.locked;
- case 33:
- // 判断你是否加载单张4k全景图
- if (metadata.sceneKind && metadata.sceneKind == 'pano') {
- this.$app.core.get('Player').model.supportsTiles = false;
- } //是否加载tile图片
- // if (this.$app.core.get('Player').model.supportsTiles)
- this.$app.core.get('TileDownloader').start();
- metadataForVideo = JSON.parse(JSON.stringify(metadata));
- _context2.next = 38;
- return VersionControl.handle(metadataForVideo, this.$app);
- case 38:
- this.$app.core.get('PanoVideoRenderer').init(metadataForVideo.videos);
- /**
- * 加载paint图片
- */
- // console.error("start load", new Date().getTime())
- if (!(metadata.mosaic && metadata.mosaicList && metadata.mosaicList.length)) {
- _context2.next = 59;
- break;
- }
- _iterator = _createForOfIteratorHelper$6(metadata.mosaicList);
- _context2.prev = 41;
- _iterator.s();
- case 43:
- if ((_step = _iterator.n()).done) {
- _context2.next = 51;
- break;
- }
- data = _step.value;
- _context2.t1 = data.fileName;
- if (!_context2.t1) {
- _context2.next = 49;
- break;
- }
- _context2.next = 49;
- return texture.loadWithoutUpdate(this.$app.resource.getUserResourceURL(data.fileName));
- case 49:
- _context2.next = 43;
- break;
- case 51:
- _context2.next = 56;
- break;
- case 53:
- _context2.prev = 53;
- _context2.t2 = _context2["catch"](41);
- _iterator.e(_context2.t2);
- case 56:
- _context2.prev = 56;
- _iterator.f();
- return _context2.finish(56);
- case 59:
- _context2.next = 61;
- return this.$app.resource.visions();
- case 61:
- //步骤1
- this.initPanos(metadata); //解析漫游点,步骤1的延伸
- this.$app.FilterManager.initFilters(); // 初始化滤镜数据
- _context2.next = 65;
- return this.isQuick(metadata);
- case 65:
- //步骤2 Quick Start
- /**
- * 基础资源已准备完毕
- */
- this.$app.Scene.emit('ready');
- this.ready = true;
- buildScene = /*#__PURE__*/function () {
- var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- console.log('buildScene--------------------'); //await this.$app.resource.floorcad()
- _context.next = 3;
- return _this.$app.resource.flooruser();
- case 3:
- _this.$app.core.get('SceneRenderer').addComponent(transitions$1); //将加载的模型构建好以便于直接使用
- _this.$app.core.get('Player').model.build();
- _this.afterLoad();
- if (!_this.$app.core.get('Player').model.supportsTiles) {
- new Preloaders(_this.$app.core.get('Player').model, _this.$app.core.get('Player')).start();
- }
- _context.next = 9;
- return _this.loadPanos();
- case 9:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function buildScene() {
- return _ref.apply(this, arguments);
- };
- }();
- console.log('load2--------------------', this.$app.config.isRouteSnap);
- /* if(this.$app.config.isRouteSnap){//xzw add
- console.log('load3--------------------')
- this.$app.core.get('SceneRenderer').addComponent(transitions)
- this.afterLoad()
- this.$app.Scene.emit('loaded')
- }else */
- if (!(metadata.modelKind === '3dtiles')) {
- _context2.next = 75;
- break;
- }
- _context2.next = 72;
- return this.$app.resource.modelmesh3dTiles();
- case 72:
- //步骤3
- this.$app.Scene.on('3dTilesLoaded', buildScene);
- _context2.next = 81;
- break;
- case 75:
- _context2.next = 77;
- return this.$app.resource.modelmeshDam();
- case 77:
- _context2.next = 79;
- return this.$app.resource.textures();
- case 79:
- _context2.next = 81;
- return buildScene();
- case 81:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this, [[3, 11], [41, 53, 56, 59]]);
- }));
- function start() {
- return _start.apply(this, arguments);
- }
- return start;
- }()
- }, {
- key: "isQuick",
- value: function () {
- var _isQuick = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(metadata) {
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- if (!this.firstView.quickstart) {
- _context3.next = 3;
- break;
- }
- _context3.next = 3;
- return this.quickEnter(this.firstView, metadata
- /* , startOption */
- );
- case 3:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- function isQuick(_x) {
- return _isQuick.apply(this, arguments);
- }
- return isQuick;
- }()
- }, {
- key: "loadPanos",
- value: function () {
- var _loadPanos = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
- var _this2 = this;
- var loadData;
- return regenerator.wrap(function _callee5$(_context5) {
- while (1) {
- switch (_context5.prev = _context5.next) {
- case 0:
- _context5.next = 2;
- return this.$app.core.get('Player').start(this.firstView);
- case 2:
- if (this.firstView.quickstart) {
- this.$app.core.get('SceneRenderer').removeComponent(this.$app.core.get('QuickstartManager'));
- this.$app.core.get('QuickstartManager').destroy();
- } // 第一个点位加载完后执行
- this.loaded = true;
- this.$app.Scene.emit('loaded', this.$app.core.get('Player').currentPano); //-------这两个争取addComponent在最后-------
- this.$app.core.get('TileDownloader').useComponent();
- this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('PanoRenderer'), true); //------------------------------------------
- loadData = /*#__PURE__*/function () {
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
- return regenerator.wrap(function _callee4$(_context4) {
- while (1) {
- switch (_context4.prev = _context4.next) {
- case 0:
- _context4.next = 2;
- return _this2.$app.store.get('tags');
- case 2:
- _context4.next = 4;
- return _this2.$app.store.get('tours');
- case 4:
- _context4.next = 6;
- return _this2.$app.store.get('links');
- case 6:
- _context4.next = 8;
- return _this2.$app.store.get('cameras');
- case 8:
- _context4.next = 10;
- return _this2.$app.store.get('billboards');
- case 10:
- _context4.next = 12;
- return _this2.$app.store.get('cutModel');
- case 12:
- _context4.next = 14;
- return _this2.$app.store.get('sceneDraw');
- case 14:
- _context4.next = 16;
- return _this2.$app.store.get('traces');
- case 16:
- // await this.$app.store.get('filters')
- // await this.$app.store.get('mosaics')
- _this2.$app.Scene.emit('loadeddata');
- case 17:
- case "end":
- return _context4.stop();
- }
- }
- }, _callee4);
- }));
- return function loadData() {
- return _ref2.apply(this, arguments);
- };
- }(); // TRANSITIONING时loadData会造成动画卡顿
- if (!(this.$app.core.get('Player').mode !== Viewmode$1.TRANSITIONING)) {
- _context5.next = 13;
- break;
- }
- _context5.next = 11;
- return loadData();
- case 11:
- _context5.next = 14;
- break;
- case 13:
- this.$app.Camera.once('mode.afterChange', loadData);
- case 14:
- setTimeout(function () {
- logSth(_this2.$app);
- }, 2000);
- case 15:
- case "end":
- return _context5.stop();
- }
- }
- }, _callee5, this);
- }));
- function loadPanos() {
- return _loadPanos.apply(this, arguments);
- }
- return loadPanos;
- }()
- }, {
- key: "initPanos",
- value: function initPanos(metadata) {
- this.startSceneRenderer();
- var model = this.$app.core.get('Player').model;
- this.$app.core.get('ModelManager').init();
- this.$app.core.get('ModelManager').addModel(model);
- this.firstView = new FirstView(metadata, model.panos);
- this.firstView.quickstart = true;
- }
- }, {
- key: "afterLoad",
- value: function afterLoad() {
- this.$app.core.get('SceneRenderer').scene.add(this.$app.core.get('Player').model);
- this.$app.core.get('Player').init();
- this.$app.core.get('Player').setScene();
- this.$app.core.get('DisplayController').init();
- effects$1.bindEvents(this.$app.core.get('Player'));
- this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('Player'));
- 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'));
- }
- }, {
- key: "startSceneRenderer",
- value: function startSceneRenderer() {
- if (this.$app.core.get('SceneRenderer').started) return;
- try {
- this.$app.core.get('SceneRenderer').start(this.$app.dom.querySelector('.player'));
- } catch (msg) {
- logger$1.error(msg.message);
- } // 单实例才允许VR
- if (this.$app.uid == 1 && this.$app.config.mobile) {
- VR$1.Init(this.$app.core.get('SceneRenderer'), this.$app.core.get('Player'));
- }
- }
- }, {
- key: "quickEnter",
- value: function () {
- var _quickEnter = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(firstView, metadata) {
- var _this3 = this;
- var control, quickstartManager;
- return regenerator.wrap(function _callee6$(_context6) {
- while (1) {
- switch (_context6.prev = _context6.next) {
- case 0:
- //logger.warn('Quickstart engaged. Hold on to your knickers.')
- //var control = this.$app.core.get('CameraControls').controls[Viewmode.PANORAMA]
- this.$app.core.get('CameraControls').activateControls(Viewmode$1.PANORAMA);
- control = this.$app.core.get('CameraControls').controls[Viewmode$1.PANORAMA];
- this.$app.withComponent('QuickstartManager', this.$app.core.get('QualityManager'), this.$app.core.get('SceneRenderer').scene, this.$app.core.get('SceneRenderer').camera, control);
- quickstartManager = this.$app.core.get('QuickstartManager'); //quickstartManager.init(firstView, metadata)
- _context6.next = 6;
- return quickstartManager.load(firstView);
- case 6:
- this.$app.core.get('SceneRenderer').addComponent(quickstartManager);
- this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
- logger$1.info("".concat(_this3.$app.config.num, "First render after quickstart load finished."));
- });
- case 8:
- case "end":
- return _context6.stop();
- }
- }
- }, _callee6, this);
- }));
- function quickEnter(_x2, _x3) {
- return _quickEnter.apply(this, arguments);
- }
- return quickEnter;
- }()
- /**
- * 拆分
- */
- }, {
- key: "getSplit",
- value: function () {
- var _getSplit = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(editType, split) {
- return regenerator.wrap(function _callee7$(_context7) {
- while (1) {
- switch (_context7.prev = _context7.next) {
- case 0:
- this.$app.dom.classList.add('kankan-app__split');
- _context7.prev = 1;
- _context7.next = 4;
- return this.$app.resource.visions2();
- case 4:
- _context7.next = 9;
- break;
- case 6:
- _context7.prev = 6;
- _context7.t0 = _context7["catch"](1);
- logger$1.warn("".concat(this.$app.config.num, "[load visions2] fail"));
- case 9:
- //splitViews由许钟文定义
- if (!this.splitViews[editType]) {
- this.splitViews[editType] = new SplitView(this.$app, editType);
- }
- split && this.splitViews[editType].enter();
- return _context7.abrupt("return", this.splitViews[editType]);
- case 12:
- case "end":
- return _context7.stop();
- }
- }
- }, _callee7, this, [[1, 6]]);
- }));
- function getSplit(_x4, _x5) {
- return _getSplit.apply(this, arguments);
- }
- return getSplit;
- }()
- /**
- * 还原
- */
- }, {
- key: "restore",
- value: function restore(editType) {
- this.$app.dom.classList.remove('kankan-app__split');
- this.splitViews[editType].leave();
- }
- }]);
- return Scene;
- }();
- });
- function logSth(app) {
- var _app$TagManager$tagsI;
- var player = app.core.get('Player');
- var tagCount = ((_app$TagManager$tagsI = app.TagManager.tagsInitial) === null || _app$TagManager$tagsI === void 0 ? void 0 : _app$TagManager$tagsI.length) || 0;
- var chunkLen = player.model.chunks.length;
- var vertexC = player.model.chunks.reduce(function (total, chunk) {
- return total + chunk.geometry.attributes.position.count;
- }, 0);
- var texSizeBlock = player.model.texSizeBlock;
- var panoCount = player.model.panos.list.length;
- var videoPanoCount = player.model.panos.list.filter(function (p) {
- return p.hasVideo;
- }).length;
- var overlayCount = player.OverlayManager.list.length;
- var overlayVideoCount = player.OverlayManager.list.filter(function (e) {
- return e.info.type == 'video';
- }).length;
- var views = Object.keys(player.viewLinkManager.views);
- var viewLinkCount = views.length;
- var viewPanoLinkCount = views.filter(function (e) {
- return player.viewLinkManager.views[e].linkType == 'pano';
- }).length;
- 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');
- }
- /**
- * 解压采用protobuf的方式压缩的文件,比如:dam,vision.modeldata
- */
- var Deompress = {
- damPro: Base64.decode('bWVzc2FnZSBiaW5hcnlfbWVzaCB7CglyZXBlYXRlZCBjaHVua19zaW1wbGUgY2h1bmsgPSAxOwoJcmVwZWF0ZWQgY2h1bmtfcXVhbnRpemVkIHF1YW50aXplZF9jaHVuayA9IDI7Cn0KCi8vIERlZmluaXRpb24gb2YgdmVydGljZXM6IDNEIGNvb3JkaW5hdGVzLCBhbmQgMkQgdGV4dHVyZSBjb29yZGluYXRlcy4KbWVzc2FnZSB2ZXJ0aWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgZmxvYXQgeHl6ID0gMSBbcGFja2VkPXRydWVdOyAgLy8geF8wLHlfMCx6XzAsIHhfMSx5XzEsel8xLCAuLi4KCXJlcGVhdGVkIGZsb2F0IHV2ID0gMiBbcGFja2VkPXRydWVdOyAgLy8gdV8wLHZfMCwgdV8xLHZfMSwgLi4uCn0KCi8vIEluZGV4ZXMgb2YgdmVydGljZXMgb2YgZmFjZXMKbWVzc2FnZSBmYWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgdWludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgovLyBBIHNpbXBseSBlbmNvZGVkIGNodW5rLgovLyBUT0RPOiBhZGQgY2h1bmsgcHJvcGVyaXRlcyAoc3VjaCBhcyAicmVmbGVjdGl2ZSIpCm1lc3NhZ2UgY2h1bmtfc2ltcGxlIHsKCW9wdGlvbmFsIHZlcnRpY2VzX3NpbXBsZSB2ZXJ0aWNlcyA9IDE7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSAyOwoJb3B0aW9uYWwgc3RyaW5nIGNodW5rX25hbWUgPSAzOwoJb3B0aW9uYWwgc3RyaW5nIG1hdGVyaWFsX25hbWUgPSA0Owp9CgovLyBRdWFudGl6ZWQgdmVyc2lvbnMgZm9sbG93OgptZXNzYWdlIHZlcnRpY2VzX3F1YW50aXplZCB7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAxOwoJcmVwZWF0ZWQgZmxvYXQgdHJhbnNsYXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHggPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgeSA9IDQgW3BhY2tlZD10cnVlXTsKCXJlcGVhdGVkIHNpbnQzMiB6ID0gNSBbcGFja2VkPXRydWVdOwp9CgptZXNzYWdlIHV2X3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHUgPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgdiA9IDQgW3BhY2tlZD10cnVlXTsKfQoKLy8gSW5kZXhlcyBvZiB2ZXJ0aWNlcyBvZiBmYWNlcwptZXNzYWdlIGZhY2VzX2NvbXByZXNzZWQgewoJcmVwZWF0ZWQgc2ludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgptZXNzYWdlIGNodW5rX3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgY2h1bmtfbmFtZSA9IDE7CglvcHRpb25hbCBzdHJpbmcgbWF0ZXJpYWxfbmFtZSA9IDI7CglvcHRpb25hbCB2ZXJ0aWNlc19xdWFudGl6ZWQgdmVydGljZXMgPSAzOwoJcmVwZWF0ZWQgdXZfcXVhbnRpemVkIHV2cyA9IDQ7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSA1Owp9Cg=='),
- visionmodeldataPro: Base64.decode( //'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGZsb2F0IHNjb3JlcyA9IDc7IC8qIHVzZWQgYXMgcGFydCBvZiBzY29yaW5nIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGljaCBwdWNrIHRvIGdvIHRvIG5leHQgKi8KfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0K'
- 'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGludDMyIHZpc2libGVzMiA9IDc7IAoJcmVwZWF0ZWQgaW50MzIgdmlzaWJsZXMzID0gODsKfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0='),
- decoderMesh() {
- var builderMesh = dcodeIO.ProtoBuf.loadProto(this.damPro);
- return builderMesh.build('binary_mesh');
- },
- decoderModeldata() {
- var builderModeldata = dcodeIO.ProtoBuf.loadProto(this.visionmodeldataPro);
- return builderModeldata.build('NavigationInfo');
- },
- decompressMesh(content) {
- var data = null;
- try {
- data = this.decoderMesh().decode(content);
- } catch (k) {
- logger$1.error('failed parsing proto for .dam');
- return null;
- }
- return data;
- },
- decompressModeldata(content) {
- var data = null;
- try {
- data = this.decoderModeldata().decode(content);
- } catch (k) {
- logger$1.error('failed parsing proto for .modeldata');
- return null;
- }
- return data;
- }
- };
- 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); }; }
- 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; } }
- /*
- meshObject = {
- geometry: i,
- textureName: e.material_name,
- name: e.chunk_name,
- meshUrl: t
- }
- */
- //模型会分成多个chunk
- var Chunk = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(Chunk, _THREE$Mesh);
- var _super = _createSuper$O(Chunk);
- function Chunk(meshObject) {
- var _this;
- _classCallCheck(this, Chunk);
- var materialInside = new ModelTextureMaterial({
- side: THREE.DoubleSide
- });
- _this = _super.call(this, meshObject.geometry, materialInside);
- _this.materialInside = materialInside;
- var uniform = THREE.UniformsUtils.clone(shaders.modelOutside.uniforms);
- _this.materialOutside = new THREE.RawShaderMaterial({
- fragmentShader: shaders.modelOutside.fragmentShader,
- vertexShader: shaders.modelOutside.vertexShader,
- uniforms: uniform,
- side: THREE.FrontSide,
- name: 'chunkOut',
- transparent: true //只有设置了透明才能使用renderOrder 和 depthTest
- });
- _this.materialOutside.extraValues = {}; //xzw add
- _this.name = meshObject.name || '';
- _this.meshUrl = meshObject.meshUrl;
- _this.tileId = meshObject.tileId;
- if (meshObject.tileId) {
- _this.materialInside.defines['Is3dTiles'] = 1;
- _this.materialOutside.defines['Is3dTiles'] = 1;
- }
- if (meshObject.textureName) _this.textureName = meshObject.textureName;else _this.setTextureMap(meshObject.texture);
- _this.isChunk = true;
- _this.layers.set(RenderLayers.MODEL);
- return _this;
- }
- _createClass(Chunk, [{
- key: "setTextureMap",
- value: function setTextureMap(texture) {
- this.materialInside.uniforms.map.value = texture;
- this.materialOutside.uniforms.map.value = texture;
- }
- }, {
- key: "setMode",
- value: function setMode(mode) {
- var modeTran = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-';
- //mode可能是transitioning
- /* let getExtValue = (name)=>{//因为opacity两个材质都有 ,在其他地方设置后会被这里覆盖
- return material.extraValues && material.extraValues[name] != void 0 ? material.extraValues[name] : this.material.uniforms[name].value
- } */
- modeTran.split('-')[0];
- modeTran.split('-')[1];
- var material = this.materialInside;
- if ((mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN) && !(mode == 'transitioning' && modeTran.includes(Viewmode$1.PANORAMA))) {
- //xzw改:当dollhouse和floorplan转换时也用outside. 飞出飞入时都是materialInside
- material = this.materialOutside;
- }
- if (mode === Viewmode$1.PANORAMA) {
- material.side = THREE.DoubleSide; // material.side = THREE.BackSide
- } else {
- material.side = THREE.FrontSide;
- }
- if (mode == Viewmode$1.DOLLHOUSE && ModelSide.side !== null) {
- material.side = ModelSide.side;
- } //material.transparent = this.material.transparent
- //material.uniforms.opacity.value = getExtValue('opacity')
- this.material = material;
- }
- }]);
- return Chunk;
- }(THREE.Mesh);
- /*
- * @Author: Rindy
- * @Date: 2021-05-13 17:27:29
- * @LastEditors: Rindy
- * @LastEditTime: 2021-05-27 16:30:31
- * @Description: Process
- */
- var Process = {
- //读入dam文件后,需要进行处理才能转换成mesh,方法如下:
- //loaddata和e一样
- convertProtobufToSceneObject: function convertProtobufToSceneObject(app, loaddata, prefixTexture) {
- // function getMaterial(imgUrl) {
- // imgUrl in materails || (materails[imgUrl] = new THREE.MeshBasicMaterial({
- // map: THREE.ImageUtils.loadTexture(imgUrl)
- // }));
- // return materails[imgUrl];
- // }
- function getMesh(chunk) {
- var geometry = new THREE.BufferGeometry();
- geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk.vertices.xyz, 0, 3), 3));
- chunk.vertices.uv.length > 0 && geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(chunk.vertices.uv, 0, 2), 2));
- geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(chunk.faces.faces, 0, 1), 1));
- geometry.applyMatrix4(matrix);
- geometry.computeBoundingBox();
- var meshUrl = settings$3.job + settings$3.format;
- if (config$6.model.name) {
- meshUrl = config$6.model.name;
- }
- return new Chunk({
- geometry: geometry,
- textureName: chunk.material_name,
- name: chunk.chunk_name,
- meshUrl: app.resource.getViewImagesURL(meshUrl) //app.resource.getViewImagesURL(settings.job + settings.format),
- }); // var mesh = new THREE.Mesh(geometry,getMaterial(prefixTexture + chunk.material_name));
- // mesh.name = chunk.chunk_name;
- // logger.warn("No chunks in damfile...");
- // return mesh;
- }
- if (0 == loaddata.chunk.length) {
- logger$1.warn('No chunks in damfile...');
- return null;
- }
- var matrix = new THREE.Matrix4();
- matrix.set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1); //var materails = {};
- return loaddata.chunk.map(getMesh);
- },
- //vision.modeldata的数据不能直接用,需要转换,方法如下:
- visionModeldata: function visionModeldata(loaddata) {
- loaddata.sweepLocations.forEach(function (s) {
- //许钟文 add 将某些旧场景visibles3为[]的改成至少包含visibles的所有
- s.visibles3 = s.visibles3 || [];
- s.visibles.forEach(function (v) {
- s.visibles3.indexOf(v) == -1 && s.visibles3.push(v);
- });
- }); //------有的场景非4dkk拍摄、手动上传的,visibles2可能都是[],那么就转化为null,这样flying时才会有模型 by许钟文
- var hasVisibles2;
- for (var len = loaddata.sweepLocations.length, ss = 0; ss < len; ss++) {
- var v = loaddata.sweepLocations[ss].visibles2 && loaddata.sweepLocations[ss].visibles2.length || 0;
- if (v > 0) {
- hasVisibles2 = true;
- break;
- }
- }
- if (!hasVisibles2) {
- loaddata.sweepLocations.forEach(function (s) {
- s.visibles2 = null;
- });
- logger$1.info('检测到疑似没有noblock数据,应该是手动上传,block置空');
- } //-------------------
- var modeldata = loaddata.sweepLocations.map(function (n, i) {
- return {
- uuid: n.uuid.toUTF8().replace(/-/g, ''),
- position: {
- x: n.pose.translation.x,
- y: n.pose.translation.y,
- z: n.pose.translation.z
- },
- quaternion: {
- x: n.pose.rotation.x,
- y: n.pose.rotation.y,
- z: n.pose.rotation.z,
- w: n.pose.rotation.w
- },
- puck: {
- x: n.puck.x,
- y: n.puck.y,
- z: n.puck.z
- },
- //floor: n.group,
- alignmentType: n.alignment_type,
- neighbours: n.visibles3 || n.visibles,
- noBlocks: n.visibles2,
- // 过渡时出模型的点
- seeMarkers: n.visibles,
- //可以看见marker及热点的点
- group: n.group,
- subgroup: n.subgroup,
- index: i //add
- };
- }.bind(this)).map(function (n) {
- n.position = this.convertVisionVector(n.position);
- n.quaternion = this.convertVisionQuaternion(n.quaternion);
- n.puck = this.convertVisionVector(n.puck);
- return n;
- }.bind(this)); // modeldata.forEach(function (n) {
- // n.neighbours = n.neighbours.filter((o) => o >= 0 )
- // n.seeMarkers = n.seeMarkers.filter((o) => o >= 0 )
- // })
- modeldata.forEach(function (n) {
- n.neighbours = n.neighbours.filter(function (o) {
- return modeldata[o];
- }).map(function (o) {
- return modeldata[o].uuid;
- });
- });
- modeldata.forEach(function (t) {
- //xzw
- if (t.noBlocks) t.noBlocks = t.noBlocks.map(function (t) {
- return modeldata[t].uuid;
- });
- });
- modeldata.forEach(function (t) {
- //xzw
- if (t.seeMarkers) t.seeMarkers = t.seeMarkers.filter(function (t) {
- return modeldata[t];
- }).map(function (t) {
- return modeldata[t].uuid;
- });
- });
- return modeldata; //def.resolve(m);
- },
- panos: function panos($app, modeldata, metadata) {
- var panoramaCollection = $app.core.get('Player').model.panos;
- var panoVideoRenderer = $app.core.get('PanoVideoRenderer');
- var panoVideos = panoVideoRenderer.videosInfo.videos;
- if ($app.config.view) {
- // 展示页仅加载可视点位球幕视频
- var visiblePanoVideos = new Map();
- panoramaCollection.extend(modeldata.map(function (modeldataitem) {
- if (modeldataitem.neighbours.length) {
- var video = panoVideos.get(modeldataitem.uuid);
- video && visiblePanoVideos.set(modeldataitem.uuid, video);
- return new Panorama($app, modeldataitem.uuid, modeldataitem, video);
- } else {
- return new Panorama($app, modeldataitem.uuid, modeldataitem, null);
- }
- }.bind(this)), 'id');
- panoVideoRenderer.initVideoPlayer($app.dom, visiblePanoVideos);
- } else {
- // 编辑页加载所有点位球幕视频
- panoramaCollection.extend(modeldata.map(function (modeldataitem) {
- return new Panorama($app, modeldataitem.uuid, modeldataitem, panoVideos.get(modeldataitem.uuid));
- }.bind(this)), 'id');
- panoVideoRenderer.initVideoPlayer($app.dom, panoVideos);
- } //forEach是PanoramaCollection的函数
- //listItem是Panorama的一个对象
- panoramaCollection.forEach(function (listItem) {
- if (listItem.neighbourUUIDs) {
- listItem.neighbourUUIDs.forEach(function (uuid) {
- //get是PanoramaCollection的函数
- var pano = panoramaCollection.get(uuid);
- pano && panoramaCollection.setNeighbour(listItem, pano, !0);
- }); // 点位隐藏时neighbourPanos为undefined,会被赋默认值,导致点位隐藏不可用,所以取空对象
- listItem.neighbourPanos = panoramaCollection.getNeighbours(listItem) || {};
- }
- });
- if (0 === panoramaCollection.length) {
- logger$1.warn('Model has no panos, turning off inside mode');
- }
- return panoramaCollection;
- },
- panosAssist(modeldata, $app) {
- //xzw add
- return modeldata.map(function (data) {
- data.panoType = 'assistant'; //isAssist = true
- data.tiled = false;
- return new Panorama($app, data.uuid, data);
- }.bind(this));
- },
- //变换vision.modeldata里拍摄点的坐标
- convertVisionVector: function convertVisionVector(position) {
- return new THREE.Vector3(position.x, position.z, -position.y);
- },
- //变换vision.modeldata里拍摄点的旋转角度quaternion
- convertVisionQuaternion: function convertVisionQuaternion(quaternion) {
- 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)));
- },
- //变换初始点的坐标
- convertWorkshopVector: function convertWorkshopVector(position) {
- return new THREE.Vector3(-position.x, position.y, position.z);
- },
- //变换初始点的quaternion
- convertWorkshopQuaternion: function convertWorkshopQuaternion(quaternion) {
- 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));
- }
- };
- var Chunks = {
- parseIdsFromChunkName(chunkName, floorRoomIds) {
- floorRoomIds.floorId = this.parseFloor(chunkName);
- floorRoomIds.roomId = this.parseRoom(chunkName);
- },
- parseFloor(chunkName) {
- var floorInfo = chunkName.match(/_group([0-9]+)/);
- if (!floorInfo) return 0;
- try {
- return parseInt(floorInfo[1], 10);
- } catch (msg) {
- logger.warn('Non-int value "' + floorInfo[1] + '" for mesh group, defaulting to floor 0');
- return 0;
- }
- },
- parseRoom(chunkName) {
- var roomInfo = chunkName.match(/_sub([0-9]+)/);
- if (!roomInfo) return -1;
- try {
- return parseInt(roomInfo[1], 10);
- } catch (msg) {
- logger.warn('Non-int value "' + roomInfo[1] + '" for mesh subgroup, defaulting to subgroup 0');
- return 0;
- }
- }
- };
- var ModelTextureLoader = {
- load(model, textures, resource) {
- return new Promise(function (resolve) {
- function addTexture(flag, texture) {
- if (!flag) {
- textures.push(texture);
- p++;
- p === textureLen && resolve();
- }
- }
- if (!model.chunks[0] || !model.chunks[0].meshUrl) {
- return resolve();
- }
- var textureLen = common$1.countUnique(model.chunks.map(function (chunk) {
- return chunk.textureName;
- }));
- var modelVersion = '';
- if (model.chunks[0].meshUrl.indexOf('_50k') !== -1) ;
- var textureType = 'low';
- if (settings$3.minimalMemoryMode && 'high' === textureType) {
- if (browser$1.detectSamsungS6()) {
- logger$1.warn('Galaxy S6 cannot handle large textures, turning down quality.');
- textureType = 'low';
- } else if (textureLen > settings$3.maxMobileTextures) {
- logger$1.warn('Model probably too large for mobile, turning down quality.');
- textureType = 'low';
- }
- }
- var p = 0;
- var textureFoldName = model.data.job.uuid + modelVersion + '_50k_texture_jpg_' + 'high1' + '/';
- if (config$6.model.name) {
- textureFoldName = config$6.model.name.replace('.dam', '_texture/');
- }
- model.chunks.forEach(function (chunk) {
- if (!chunk.material.map && chunk.textureName) {
- var textureUrl = model.urls.get(textureFoldName + chunk.textureName);
- chunk.setTextureMap(texture.load(textureUrl, addTexture.bind(this, texture.isLoaded(textureUrl))));
- }
- });
- });
- }
- };
- function _defineProperty$1(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;
- }
- function _AwaitValue(value) {
- this.wrapped = value;
- }
- function _awaitAsyncGenerator(value) {
- return new _AwaitValue(value);
- }
- function AsyncGenerator(gen) {
- var front, back;
- function send(key, arg) {
- return new Promise(function (resolve, reject) {
- var request = {
- key: key,
- arg: arg,
- resolve: resolve,
- reject: reject,
- next: null
- };
- if (back) {
- back = back.next = request;
- } else {
- front = back = request;
- resume(key, arg);
- }
- });
- }
- function resume(key, arg) {
- try {
- var result = gen[key](arg);
- var value = result.value;
- var wrappedAwait = value instanceof _AwaitValue;
- Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
- if (wrappedAwait) {
- resume(key === "return" ? "return" : "next", arg);
- return;
- }
- settle(result.done ? "return" : "normal", arg);
- }, function (err) {
- resume("throw", err);
- });
- } catch (err) {
- settle("throw", err);
- }
- }
- function settle(type, value) {
- switch (type) {
- case "return":
- front.resolve({
- value: value,
- done: true
- });
- break;
- case "throw":
- front.reject(value);
- break;
- default:
- front.resolve({
- value: value,
- done: false
- });
- break;
- }
- front = front.next;
- if (front) {
- resume(front.key, front.arg);
- } else {
- back = null;
- }
- }
- this._invoke = send;
- if (typeof gen["return"] !== "function") {
- this["return"] = undefined;
- }
- }
- AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
- return this;
- };
- AsyncGenerator.prototype.next = function (arg) {
- return this._invoke("next", arg);
- };
- AsyncGenerator.prototype["throw"] = function (arg) {
- return this._invoke("throw", arg);
- };
- AsyncGenerator.prototype["return"] = function (arg) {
- return this._invoke("return", arg);
- };
- function _wrapAsyncGenerator(fn) {
- return function () {
- return new AsyncGenerator(fn.apply(this, arguments));
- };
- }
- function _asyncIterator(iterable) {
- var method;
- if (typeof Symbol !== "undefined") {
- if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
- if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
- }
- if (method == null) method = iterable["@@asyncIterator"];
- if (method == null) method = iterable["@@iterator"];
- if (method == null) throw new TypeError("Object is not async iterable");
- return method.call(iterable);
- }
- /**
- * @author Deepkolos / https://github.com/deepkolos
- */
- var WorkerPool$1 = /*#__PURE__*/function () {
- function WorkerPool() {
- var pool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
- _classCallCheck(this, WorkerPool);
- this.pool = pool;
- this.queue = [];
- this.workers = [];
- this.workersResolve = [];
- this.workerStatus = 0;
- }
- _createClass(WorkerPool, [{
- key: "_initWorker",
- value: function _initWorker(workerId) {
- if (!this.workers[workerId]) {
- var worker = this.workerCreator();
- worker.addEventListener('message', this._onMessage.bind(this, workerId));
- this.workers[workerId] = worker;
- }
- }
- }, {
- key: "_getIdleWorker",
- value: function _getIdleWorker() {
- for (var i = 0; i < this.pool; i++) {
- if (!(this.workerStatus & 1 << i)) return i;
- }
- return -1;
- }
- }, {
- key: "_onMessage",
- value: function _onMessage(workerId, msg) {
- var resolve = this.workersResolve[workerId];
- resolve && resolve(msg);
- if (this.queue.length) {
- var _this$queue$shift = this.queue.shift(),
- _resolve = _this$queue$shift.resolve,
- _msg = _this$queue$shift.msg,
- transfer = _this$queue$shift.transfer;
- this.workersResolve[workerId] = _resolve;
- this.workers[workerId].postMessage(_msg, transfer);
- } else {
- this.workerStatus ^= 1 << workerId;
- }
- }
- }, {
- key: "setWorkerCreator",
- value: function setWorkerCreator(workerCreator) {
- this.workerCreator = workerCreator;
- }
- }, {
- key: "setWorkerLimit",
- value: function setWorkerLimit(pool) {
- this.pool = pool;
- }
- }, {
- key: "postMessage",
- value: function postMessage(msg, transfer) {
- var _this = this;
- return new Promise(function (resolve) {
- var workerId = _this._getIdleWorker();
- if (workerId !== -1) {
- _this._initWorker(workerId);
- _this.workerStatus |= 1 << workerId;
- _this.workersResolve[workerId] = resolve;
- _this.workers[workerId].postMessage(msg, transfer);
- } else {
- _this.queue.push({
- resolve,
- msg,
- transfer
- });
- }
- });
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.workers.forEach(function (worker) {
- return worker.terminate();
- });
- this.workersResolve.length = 0;
- this.workers.length = 0;
- this.queue.length = 0;
- this.workerStatus = 0;
- }
- }]);
- return WorkerPool;
- }();
- var t = 0,
- n$2 = 2,
- p$1 = 1,
- x$1 = 2,
- nt = 0,
- ct = 9,
- gt = 15,
- yt = 16,
- dt = 22,
- Ot = 37,
- Ft = 43,
- $t = 76,
- se = 83,
- pe = 97,
- xe = 100,
- de = 103,
- Ae = 109;
- var Si = function Si() {
- _classCallCheck(this, Si);
- 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 = [{
- vendorId: 0,
- descriptorType: 0,
- descriptorBlockSize: 0,
- versionNumber: 2,
- colorModel: 0,
- colorPrimaries: 1,
- transferFunction: 2,
- flags: 0,
- texelBlockDimension: [0, 0, 0, 0],
- bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],
- samples: []
- }], this.keyValue = {}, this.globalData = null;
- };
- var Ii = /*#__PURE__*/function () {
- function Ii(t, e, n, i) {
- _classCallCheck(this, Ii);
- this._dataView = new DataView(t.buffer, t.byteOffset + e, n), this._littleEndian = i, this._offset = 0;
- }
- _createClass(Ii, [{
- key: "_nextUint8",
- value: function _nextUint8() {
- var t = this._dataView.getUint8(this._offset);
- return this._offset += 1, t;
- }
- }, {
- key: "_nextUint16",
- value: function _nextUint16() {
- var t = this._dataView.getUint16(this._offset, this._littleEndian);
- return this._offset += 2, t;
- }
- }, {
- key: "_nextUint32",
- value: function _nextUint32() {
- var t = this._dataView.getUint32(this._offset, this._littleEndian);
- return this._offset += 4, t;
- }
- }, {
- key: "_nextUint64",
- value: function _nextUint64() {
- var t = this._dataView.getUint32(this._offset, this._littleEndian) + Math.pow(2, 32) * this._dataView.getUint32(this._offset + 4, this._littleEndian);
- return this._offset += 8, t;
- }
- }, {
- key: "_nextInt32",
- value: function _nextInt32() {
- var t = this._dataView.getInt32(this._offset, this._littleEndian);
- return this._offset += 4, t;
- }
- }, {
- key: "_skip",
- value: function _skip(t) {
- return this._offset += t, this;
- }
- }, {
- key: "_scan",
- value: function _scan(t) {
- var e = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var n = this._offset;
- var i = 0;
- for (; this._dataView.getUint8(this._offset) !== e && i < t;) {
- i++, this._offset++;
- }
- return i < t && this._offset++, new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + n, i);
- }
- }]);
- return Ii;
- }();
- var Ti = [171, 75, 84, 88, 32, 50, 48, 187, 13, 10, 26, 10];
- function Ei(t) {
- return 'undefined' != typeof TextDecoder ? new TextDecoder().decode(t) : Buffer.from(t).toString('utf8');
- }
- function Pi(t) {
- var e = new Uint8Array(t.buffer, t.byteOffset, Ti.length);
- 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.');
- var n = new Si(),
- i = 17 * Uint32Array.BYTES_PER_ELEMENT,
- s = new Ii(t, Ti.length, i, !0);
- 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();
- var a = s._nextUint32();
- n.supercompressionScheme = s._nextUint32();
- var r = s._nextUint32(),
- o = s._nextUint32(),
- l = s._nextUint32(),
- f = s._nextUint32(),
- U = s._nextUint64(),
- c = s._nextUint64(),
- h = new Ii(t, Ti.length + i, 3 * a * 8, !0);
- for (var _e3 = 0; _e3 < a; _e3++) {
- n.levels.push({
- levelData: new Uint8Array(t.buffer, t.byteOffset + h._nextUint64(), h._nextUint64()),
- uncompressedByteLength: h._nextUint64()
- });
- }
- var _ = new Ii(t, r, o, !0),
- p = {
- vendorId: _._skip(4)._nextUint16(),
- descriptorType: _._nextUint16(),
- versionNumber: _._nextUint16(),
- descriptorBlockSize: _._nextUint16(),
- colorModel: _._nextUint8(),
- colorPrimaries: _._nextUint8(),
- transferFunction: _._nextUint8(),
- flags: _._nextUint8(),
- texelBlockDimension: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
- bytesPlane: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
- samples: []
- },
- g = (p.descriptorBlockSize / 4 - 6) / 4;
- for (var _t2 = 0; _t2 < g; _t2++) {
- var _e4 = {
- bitOffset: _._nextUint16(),
- bitLength: _._nextUint8(),
- channelType: _._nextUint8(),
- samplePosition: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
- sampleLower: -Infinity,
- sampleUpper: Infinity
- };
- 64 & _e4.channelType ? (_e4.sampleLower = _._nextInt32(), _e4.sampleUpper = _._nextInt32()) : (_e4.sampleLower = _._nextUint32(), _e4.sampleUpper = _._nextUint32()), p.samples[_t2] = _e4;
- }
- n.dataFormatDescriptor.length = 0, n.dataFormatDescriptor.push(p);
- var y = new Ii(t, l, f, !0);
- for (; y._offset < f;) {
- var _t3 = y._nextUint32(),
- _e5 = y._scan(_t3),
- _i2 = Ei(_e5),
- _s = y._scan(_t3 - _e5.byteLength);
- n.keyValue[_i2] = _i2.match(/^ktx/i) ? Ei(_s) : _s, y._offset % 4 && y._skip(4 - y._offset % 4);
- }
- if (c <= 0) return n;
- var x = new Ii(t, U, c, !0),
- u = x._nextUint16(),
- b = x._nextUint16(),
- d = x._nextUint32(),
- m = x._nextUint32(),
- w = x._nextUint32(),
- D = x._nextUint32(),
- B = [];
- for (var _t4 = 0; _t4 < a; _t4++) {
- B.push({
- imageFlags: x._nextUint32(),
- rgbSliceByteOffset: x._nextUint32(),
- rgbSliceByteLength: x._nextUint32(),
- alphaSliceByteOffset: x._nextUint32(),
- alphaSliceByteLength: x._nextUint32()
- });
- }
- var L = U + x._offset,
- A = L + d,
- k = A + m,
- v = k + w,
- S = new Uint8Array(t.buffer, t.byteOffset + L, d),
- I = new Uint8Array(t.buffer, t.byteOffset + A, m),
- O = new Uint8Array(t.buffer, t.byteOffset + k, w),
- T = new Uint8Array(t.buffer, t.byteOffset + v, D);
- return n.globalData = {
- endpointCount: u,
- selectorCount: b,
- imageDescs: B,
- endpointsData: S,
- selectorsData: I,
- tablesData: O,
- extendedData: T
- }, n;
- }
- var A$1, I$1, B$1;
- var g$1 = {
- env: {
- emscripten_notify_memory_growth: function emscripten_notify_memory_growth(A) {
- B$1 = new Uint8Array(I$1.exports.memory.buffer);
- }
- }
- };
- var Q = /*#__PURE__*/function () {
- function Q() {
- _classCallCheck(this, Q);
- }
- _createClass(Q, [{
- key: "init",
- value: function init() {
- return A$1 || (A$1 = 'undefined' != typeof fetch ? fetch('data:application/wasm;base64,' + C).then(function (A) {
- return A.arrayBuffer();
- }).then(function (A) {
- return WebAssembly.instantiate(A, g$1);
- }).then(this._init) : WebAssembly.instantiate(Buffer.from(C, 'base64'), g$1).then(this._init), A$1);
- }
- }, {
- key: "_init",
- value: function _init(A) {
- I$1 = A.instance, g$1.env.emscripten_notify_memory_growth(0);
- }
- }, {
- key: "decode",
- value: function decode(A) {
- var g = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- if (!I$1) throw new Error('ZSTDDecoder: Await .init() before decoding.');
- var _Q = A.byteLength,
- C = I$1.exports.malloc(_Q);
- B$1.set(A, C), g = g || Number(I$1.exports.ZSTD_findDecompressedSize(C, _Q));
- var E = I$1.exports.malloc(g),
- i = I$1.exports.ZSTD_decompress(E, g, C, _Q),
- D = B$1.slice(E, E + i);
- return I$1.exports.free(C), I$1.exports.free(E), D;
- }
- }]);
- return Q;
- }();
- 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';
- 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); }; }
- 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; } }
- var _taskCache = new WeakMap();
- var _activeLoaders = 0;
- var _zstd;
- var KTX2Loader = /*#__PURE__*/function (_Loader) {
- _inherits(KTX2Loader, _Loader);
- var _super = _createSuper$N(KTX2Loader);
- function KTX2Loader(manager) {
- var _this;
- _classCallCheck(this, KTX2Loader);
- _this = _super.call(this, manager);
- _this.transcoderPath = '';
- _this.transcoderBinary = null;
- _this.transcoderPending = null;
- _this.workerPool = new WorkerPool$1();
- _this.workerSourceURL = '';
- _this.workerConfig = null;
- if (typeof MSC_TRANSCODER !== 'undefined') {
- console.warn('THREE.KTX2Loader: Please update to latest "basis_transcoder".' + ' "msc_basis_transcoder" is no longer supported in three.js r125+.');
- }
- return _this;
- }
- _createClass(KTX2Loader, [{
- key: "setTranscoderPath",
- value: function setTranscoderPath(path) {
- this.transcoderPath = path;
- return this;
- }
- }, {
- key: "setWorkerLimit",
- value: function setWorkerLimit(num) {
- this.workerPool.setWorkerLimit(num);
- return this;
- }
- }, {
- key: "detectSupport",
- value: function detectSupport(renderer) {
- this.workerConfig = {
- astcSupported: renderer.extensions.has('WEBGL_compressed_texture_astc'),
- etc1Supported: renderer.extensions.has('WEBGL_compressed_texture_etc1'),
- etc2Supported: renderer.extensions.has('WEBGL_compressed_texture_etc'),
- dxtSupported: renderer.extensions.has('WEBGL_compressed_texture_s3tc'),
- bptcSupported: renderer.extensions.has('EXT_texture_compression_bptc'),
- pvrtcSupported: renderer.extensions.has('WEBGL_compressed_texture_pvrtc') || renderer.extensions.has('WEBKIT_WEBGL_compressed_texture_pvrtc')
- };
- if (renderer.capabilities.isWebGL2) {
- // https://github.com/mrdoob/three.js/pull/22928
- this.workerConfig.etc1Supported = false;
- }
- return this;
- }
- }, {
- key: "init",
- value: function init() {
- var _this2 = this;
- if (!this.transcoderPending) {
- // Load transcoder wrapper.
- var jsLoader = new THREE$1.FileLoader(this.manager);
- jsLoader.setPath(this.transcoderPath);
- jsLoader.setWithCredentials(this.withCredentials);
- var jsContent = jsLoader.loadAsync('basis_transcoder.js'); // Load transcoder WASM binary.
- var binaryLoader = new THREE$1.FileLoader(this.manager);
- binaryLoader.setPath(this.transcoderPath);
- binaryLoader.setResponseType('arraybuffer');
- binaryLoader.setWithCredentials(this.withCredentials);
- var binaryContent = binaryLoader.loadAsync('basis_transcoder.wasm');
- this.transcoderPending = Promise.all([jsContent, binaryContent]).then(function (_ref) {
- var _ref2 = _slicedToArray(_ref, 2),
- jsContent = _ref2[0],
- binaryContent = _ref2[1];
- var fn = KTX2Loader.BasisWorker.toString();
- 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');
- _this2.workerSourceURL = URL.createObjectURL(new Blob([body]));
- _this2.transcoderBinary = binaryContent;
- _this2.workerPool.setWorkerCreator(function () {
- var worker = new Worker(_this2.workerSourceURL);
- var transcoderBinary = _this2.transcoderBinary.slice(0);
- worker.postMessage({
- type: 'init',
- config: _this2.workerConfig,
- transcoderBinary
- }, [transcoderBinary]);
- return worker;
- });
- });
- if (_activeLoaders > 0) {
- // Each instance loads a transcoder and allocates workers, increasing network and memory cost.
- console.warn('THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + ' Use a single KTX2Loader instance, or call .dispose() on old instances.');
- }
- _activeLoaders++;
- }
- return this.transcoderPending;
- }
- }, {
- key: "load",
- value: function load(url, onLoad, onProgress, onError) {
- var _this3 = this;
- if (this.workerConfig === null) {
- throw new Error('THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.');
- }
- var loader = new THREE$1.FileLoader(this.manager);
- loader.setResponseType('arraybuffer');
- loader.setWithCredentials(this.withCredentials);
- loader.load(url, function (buffer) {
- // Check for an existing task using this buffer. A transferred buffer cannot be transferred
- // again from this thread.
- if (_taskCache.has(buffer)) {
- var cachedTask = _taskCache.get(buffer);
- return cachedTask.promise.then(onLoad).catch(onError);
- }
- _this3._createTexture(buffer).then(function (texture) {
- return onLoad ? onLoad(texture) : null;
- }).catch(onError);
- }, onProgress, onError);
- }
- }, {
- key: "_createTextureFrom",
- value: function _createTextureFrom(transcodeResult) {
- var mipmaps = transcodeResult.mipmaps,
- width = transcodeResult.width,
- height = transcodeResult.height,
- format = transcodeResult.format,
- type = transcodeResult.type,
- error = transcodeResult.error,
- dfdTransferFn = transcodeResult.dfdTransferFn,
- dfdFlags = transcodeResult.dfdFlags;
- if (type === 'error') return Promise.reject(error);
- var texture = new THREE$1.CompressedTexture(mipmaps, width, height, format, THREE$1.UnsignedByteType);
- texture.minFilter = mipmaps.length === 1 ? THREE$1.LinearFilter : THREE$1.LinearMipmapLinearFilter;
- texture.magFilter = THREE$1.LinearFilter;
- texture.generateMipmaps = false;
- texture.needsUpdate = true;
- texture.encoding = dfdTransferFn === x$1 ? THREE$1.sRGBEncoding : THREE$1.LinearEncoding;
- texture.premultiplyAlpha = !!(dfdFlags & p$1);
- return texture;
- }
- /**
- * @param {ArrayBuffer} buffer
- * @param {object?} config
- * @return {Promise<CompressedTexture|DataTexture|Data3DTexture>}
- */
- }, {
- key: "_createTexture",
- value: function _createTexture(buffer) {
- var _this4 = this;
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var container = Pi(new Uint8Array(buffer));
- if (container.vkFormat !== nt) {
- return createDataTexture(container);
- } //
- var taskConfig = config;
- var texturePending = this.init().then(function () {
- return _this4.workerPool.postMessage({
- type: 'transcode',
- buffer,
- taskConfig: taskConfig
- }, [buffer]);
- }).then(function (e) {
- return _this4._createTextureFrom(e.data);
- }); // Cache the task result.
- _taskCache.set(buffer, {
- promise: texturePending
- });
- return texturePending;
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.workerPool.dispose();
- if (this.workerSourceURL) URL.revokeObjectURL(this.workerSourceURL);
- _activeLoaders--;
- return this;
- }
- }]);
- return KTX2Loader;
- }(THREE$1.Loader);
- /* CONSTANTS */
- KTX2Loader.BasisFormat = {
- ETC1S: 0,
- UASTC_4x4: 1
- };
- KTX2Loader.TranscoderFormat = {
- ETC1: 0,
- ETC2: 1,
- BC1: 2,
- BC3: 3,
- BC4: 4,
- BC5: 5,
- BC7_M6_OPAQUE_ONLY: 6,
- BC7_M5: 7,
- PVRTC1_4_RGB: 8,
- PVRTC1_4_RGBA: 9,
- ASTC_4x4: 10,
- ATC_RGB: 11,
- ATC_RGBA_INTERPOLATED_ALPHA: 12,
- RGBA32: 13,
- RGB565: 14,
- BGR565: 15,
- RGBA4444: 16
- };
- KTX2Loader.EngineFormat = {
- RGBAFormat: THREE$1.RGBAFormat,
- RGBA_ASTC_4x4_Format: THREE$1.RGBA_ASTC_4x4_Format,
- RGBA_BPTC_Format: THREE$1.RGBA_BPTC_Format,
- RGBA_ETC2_EAC_Format: THREE$1.RGBA_ETC2_EAC_Format,
- RGBA_PVRTC_4BPPV1_Format: THREE$1.RGBA_PVRTC_4BPPV1_Format,
- RGBA_S3TC_DXT5_Format: THREE$1.RGBA_S3TC_DXT5_Format,
- RGB_ETC1_Format: THREE$1.RGB_ETC1_Format,
- RGB_ETC2_Format: THREE$1.RGB_ETC2_Format,
- RGB_PVRTC_4BPPV1_Format: THREE$1.RGB_PVRTC_4BPPV1_Format,
- RGB_S3TC_DXT1_Format: THREE$1.RGB_S3TC_DXT1_Format
- };
- /* WEB WORKER */
- KTX2Loader.BasisWorker = function () {
- var config;
- var transcoderPending;
- var BasisModule;
- var EngineFormat = _EngineFormat; // eslint-disable-line no-undef
- var TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef
- var BasisFormat = _BasisFormat; // eslint-disable-line no-undef
- self.addEventListener('message', function (e) {
- var message = e.data;
- switch (message.type) {
- case 'init':
- config = message.config;
- init(message.transcoderBinary);
- break;
- case 'transcode':
- transcoderPending.then(function () {
- try {
- var _transcode = transcode(message.buffer),
- width = _transcode.width,
- height = _transcode.height,
- hasAlpha = _transcode.hasAlpha,
- mipmaps = _transcode.mipmaps,
- format = _transcode.format,
- dfdTransferFn = _transcode.dfdTransferFn,
- dfdFlags = _transcode.dfdFlags;
- var buffers = [];
- for (var i = 0; i < mipmaps.length; ++i) {
- buffers.push(mipmaps[i].data.buffer);
- }
- self.postMessage({
- type: 'transcode',
- id: message.id,
- width,
- height,
- hasAlpha,
- mipmaps,
- format,
- dfdTransferFn,
- dfdFlags
- }, buffers);
- } catch (error) {
- console.error(error);
- self.postMessage({
- type: 'error',
- id: message.id,
- error: error.message
- });
- }
- });
- break;
- }
- });
- function init(wasmBinary) {
- transcoderPending = new Promise(function (resolve) {
- BasisModule = {
- wasmBinary,
- onRuntimeInitialized: resolve
- };
- BASIS(BasisModule); // eslint-disable-line no-undef
- }).then(function () {
- BasisModule.initializeBasis();
- if (BasisModule.KTX2File === undefined) {
- console.warn('THREE.KTX2Loader: Please update Basis Universal transcoder.');
- }
- });
- }
- function transcode(buffer) {
- var ktx2File = new BasisModule.KTX2File(new Uint8Array(buffer));
- function cleanup() {
- ktx2File.close();
- ktx2File.delete();
- }
- if (!ktx2File.isValid()) {
- cleanup();
- throw new Error('THREE.KTX2Loader: Invalid or unsupported .ktx2 file');
- }
- var basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;
- var width = ktx2File.getWidth();
- var height = ktx2File.getHeight();
- var levels = ktx2File.getLevels();
- var hasAlpha = ktx2File.getHasAlpha();
- var dfdTransferFn = ktx2File.getDFDTransferFunc();
- var dfdFlags = ktx2File.getDFDFlags();
- var _getTranscoderFormat = getTranscoderFormat(basisFormat, width, height, hasAlpha),
- transcoderFormat = _getTranscoderFormat.transcoderFormat,
- engineFormat = _getTranscoderFormat.engineFormat;
- if (!width || !height || !levels) {
- cleanup();
- throw new Error('THREE.KTX2Loader: Invalid texture');
- }
- if (!ktx2File.startTranscoding()) {
- cleanup();
- throw new Error('THREE.KTX2Loader: .startTranscoding failed');
- }
- var mipmaps = [];
- for (var mip = 0; mip < levels; mip++) {
- var levelInfo = ktx2File.getImageLevelInfo(mip, 0, 0);
- var mipWidth = levelInfo.origWidth;
- var mipHeight = levelInfo.origHeight;
- var dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, 0, 0, transcoderFormat));
- var status = ktx2File.transcodeImage(dst, mip, 0, 0, transcoderFormat, 0, -1, -1);
- if (!status) {
- cleanup();
- throw new Error('THREE.KTX2Loader: .transcodeImage failed.');
- }
- mipmaps.push({
- data: dst,
- width: mipWidth,
- height: mipHeight
- });
- }
- cleanup();
- return {
- width,
- height,
- hasAlpha,
- mipmaps,
- format: engineFormat,
- dfdTransferFn,
- dfdFlags
- };
- } //
- // Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),
- // device capabilities, and texture dimensions. The list below ranks the formats separately
- // for ETC1S and UASTC.
- //
- // In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at
- // significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently
- // chooses RGBA32 only as a last resort and does not expose that option to the caller.
- var FORMAT_OPTIONS = [{
- if: 'astcSupported',
- basisFormat: [BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4],
- engineFormat: [EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format],
- priorityETC1S: Infinity,
- priorityUASTC: 1,
- needsPowerOfTwo: false
- }, {
- if: 'bptcSupported',
- basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5],
- engineFormat: [EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format],
- priorityETC1S: 3,
- priorityUASTC: 2,
- needsPowerOfTwo: false
- }, {
- if: 'dxtSupported',
- basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.BC1, TranscoderFormat.BC3],
- engineFormat: [EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format],
- priorityETC1S: 4,
- priorityUASTC: 5,
- needsPowerOfTwo: false
- }, {
- if: 'etc2Supported',
- basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.ETC1, TranscoderFormat.ETC2],
- engineFormat: [EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format],
- priorityETC1S: 1,
- priorityUASTC: 3,
- needsPowerOfTwo: false
- }, {
- if: 'etc1Supported',
- basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.ETC1],
- engineFormat: [EngineFormat.RGB_ETC1_Format],
- priorityETC1S: 2,
- priorityUASTC: 4,
- needsPowerOfTwo: false
- }, {
- if: 'pvrtcSupported',
- basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
- transcoderFormat: [TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA],
- engineFormat: [EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format],
- priorityETC1S: 5,
- priorityUASTC: 6,
- needsPowerOfTwo: true
- }];
- var ETC1S_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
- return a.priorityETC1S - b.priorityETC1S;
- });
- var UASTC_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
- return a.priorityUASTC - b.priorityUASTC;
- });
- function getTranscoderFormat(basisFormat, width, height, hasAlpha) {
- var transcoderFormat;
- var engineFormat;
- var options = basisFormat === BasisFormat.ETC1S ? ETC1S_OPTIONS : UASTC_OPTIONS;
- for (var i = 0; i < options.length; i++) {
- var opt = options[i];
- if (!config[opt.if]) continue;
- if (!opt.basisFormat.includes(basisFormat)) continue;
- if (hasAlpha && opt.transcoderFormat.length < 2) continue;
- if (opt.needsPowerOfTwo && !(isPowerOfTwo(width) && isPowerOfTwo(height))) continue;
- transcoderFormat = opt.transcoderFormat[hasAlpha ? 1 : 0];
- engineFormat = opt.engineFormat[hasAlpha ? 1 : 0];
- return {
- transcoderFormat,
- engineFormat
- };
- }
- console.warn('THREE.KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.');
- transcoderFormat = TranscoderFormat.RGBA32;
- engineFormat = EngineFormat.RGBAFormat;
- return {
- transcoderFormat,
- engineFormat
- };
- }
- function isPowerOfTwo(value) {
- if (value <= 2) return true;
- return (value & value - 1) === 0 && value !== 0;
- }
- }; //
- // DataTexture and Data3DTexture parsing.
- var FORMAT_MAP = {
- [Ae]: THREE$1.RGBAFormat,
- [pe]: THREE$1.RGBAFormat,
- [Ot]: THREE$1.RGBAFormat,
- [Ft]: THREE$1.RGBAFormat,
- [de]: THREE$1.RGFormat,
- [se]: THREE$1.RGFormat,
- [yt]: THREE$1.RGFormat,
- [dt]: THREE$1.RGFormat,
- [xe]: THREE$1.RedFormat,
- [$t]: THREE$1.RedFormat,
- [gt]: THREE$1.RedFormat,
- [ct]: THREE$1.RedFormat
- };
- var TYPE_MAP = {
- [Ae]: THREE$1.FloatType,
- [pe]: THREE$1.HalfFloatType,
- [Ot]: THREE$1.UnsignedByteType,
- [Ft]: THREE$1.UnsignedByteType,
- [de]: THREE$1.FloatType,
- [se]: THREE$1.HalfFloatType,
- [yt]: THREE$1.UnsignedByteType,
- [dt]: THREE$1.UnsignedByteType,
- [xe]: THREE$1.FloatType,
- [$t]: THREE$1.HalfFloatType,
- [gt]: THREE$1.UnsignedByteType,
- [ct]: THREE$1.UnsignedByteType
- };
- var ENCODING_MAP = {
- [Ft]: THREE$1.sRGBEncoding,
- [dt]: THREE$1.sRGBEncoding,
- [gt]: THREE$1.sRGBEncoding
- };
- function createDataTexture(_x) {
- return _createDataTexture.apply(this, arguments);
- }
- function _createDataTexture() {
- _createDataTexture = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(container) {
- var vkFormat, pixelWidth, pixelHeight, pixelDepth, level, levelData, view, texture;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- vkFormat = container.vkFormat, pixelWidth = container.pixelWidth, pixelHeight = container.pixelHeight, pixelDepth = container.pixelDepth;
- if (!(FORMAT_MAP[vkFormat] === undefined)) {
- _context2.next = 3;
- break;
- }
- throw new Error('THREE.KTX2Loader: Unsupported vkFormat.');
- case 3:
- //
- level = container.levels[0];
- if (!(container.supercompressionScheme === t)) {
- _context2.next = 8;
- break;
- }
- levelData = level.levelData;
- _context2.next = 16;
- break;
- case 8:
- if (!(container.supercompressionScheme === n$2)) {
- _context2.next = 15;
- break;
- }
- if (!_zstd) {
- _zstd = new Promise( /*#__PURE__*/function () {
- var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve) {
- var zstd;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- zstd = new Q();
- _context.next = 3;
- return zstd.init();
- case 3:
- resolve(zstd);
- case 4:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function (_x2) {
- return _ref3.apply(this, arguments);
- };
- }());
- }
- _context2.next = 12;
- return _zstd;
- case 12:
- levelData = _context2.sent.decode(level.levelData, level.uncompressedByteLength);
- _context2.next = 16;
- break;
- case 15:
- throw new Error('THREE.KTX2Loader: Unsupported supercompressionScheme.');
- case 16:
- if (TYPE_MAP[vkFormat] === THREE$1.FloatType) {
- view = new Float32Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Float32Array.BYTES_PER_ELEMENT);
- } else if (TYPE_MAP[vkFormat] === THREE$1.HalfFloatType) {
- view = new Uint16Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT);
- } else {
- view = levelData;
- } //
- texture = pixelDepth === 0 ? new THREE$1.DataTexture(view, pixelWidth, pixelHeight) : new THREE$1.Data3DTexture(view, pixelWidth, pixelHeight, pixelDepth);
- texture.type = TYPE_MAP[vkFormat];
- texture.format = FORMAT_MAP[vkFormat];
- texture.encoding = ENCODING_MAP[vkFormat] || THREE$1.LinearEncoding;
- texture.needsUpdate = true; //
- return _context2.abrupt("return", Promise.resolve(texture));
- case 23:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2);
- }));
- return _createDataTexture.apply(this, arguments);
- }
- 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;/*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */ // !zeg改 必须将window赋值给globalThis,否则会导致钉钉和支付宝小程序打不开
- 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
- 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);/**
- * Common utilities
- * @module glMatrix
- */ // Configuration Constants
- 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);};/**
- * 2 Dimensional Vector
- * @module vec2
- */ /**
- * Creates a new, empty vec2
- *
- * @returns {vec2} a new 2D vector
- */function create$4(){var out=new ARRAY_TYPE(2);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;}return out;}/**
- * Transforms the vec2 with a mat2
- *
- * @param {vec2} out the receiving vector
- * @param {ReadonlyVec2} a the vector to transform
- * @param {ReadonlyMat2} m matrix to transform with
- * @returns {vec2} out
- */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;}/**
- * Transforms the vec2 with a mat2d
- *
- * @param {vec2} out the receiving vector
- * @param {ReadonlyVec2} a the vector to transform
- * @param {ReadonlyMat2d} m matrix to transform with
- * @returns {vec2} out
- */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;}/**
- * Transforms the vec2 with a mat3
- * 3rd vector component is implicitly '1'
- *
- * @param {vec2} out the receiving vector
- * @param {ReadonlyVec2} a the vector to transform
- * @param {ReadonlyMat3} m matrix to transform with
- * @returns {vec2} out
- */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;}/**
- * Transforms the vec2 with a mat4
- * 3rd vector component is implicitly '0'
- * 4th vector component is implicitly '1'
- *
- * @param {vec2} out the receiving vector
- * @param {ReadonlyVec2} a the vector to transform
- * @param {ReadonlyMat4} m matrix to transform with
- * @returns {vec2} out
- */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);/**
- * 3 Dimensional Vector
- * @module vec3
- */ /**
- * Creates a new, empty vec3
- *
- * @returns {vec3} a new 3D vector
- */function create$3(){var out=new ARRAY_TYPE(3);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;out[2]=0;}return out;}/**
- * Calculates the length of a vec3
- *
- * @param {ReadonlyVec3} a vector to calculate length of
- * @returns {Number} length of a
- */function length$2(a){var x=a[0];var y=a[1];var z=a[2];return Math.hypot(x,y,z);}/**
- * Creates a new vec3 initialized with the given values
- *
- * @param {Number} x X component
- * @param {Number} y Y component
- * @param {Number} z Z component
- * @returns {vec3} a new 3D vector
- */function fromValues(x,y,z){var out=new ARRAY_TYPE(3);out[0]=x;out[1]=y;out[2]=z;return out;}/**
- * Normalize a vec3
- *
- * @param {vec3} out the receiving vector
- * @param {ReadonlyVec3} a vector to normalize
- * @returns {vec3} out
- */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?
- len=1/Math.sqrt(len);}out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;return out;}/**
- * Calculates the dot product of two vec3's
- *
- * @param {ReadonlyVec3} a the first operand
- * @param {ReadonlyVec3} b the second operand
- * @returns {Number} dot product of a and b
- */function dot$2(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}/**
- * Computes the cross product of two vec3's
- *
- * @param {vec3} out the receiving vector
- * @param {ReadonlyVec3} a the first operand
- * @param {ReadonlyVec3} b the second operand
- * @returns {vec3} out
- */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;}/**
- * Transforms the vec3 with a mat4.
- * 4th vector component is implicitly '1'
- *
- * @param {vec3} out the receiving vector
- * @param {ReadonlyVec3} a the vector to transform
- * @param {ReadonlyMat4} m matrix to transform with
- * @returns {vec3} out
- */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;}/**
- * Transforms the vec3 with a mat3.
- *
- * @param {vec3} out the receiving vector
- * @param {ReadonlyVec3} a the vector to transform
- * @param {ReadonlyMat3} m the 3x3 matrix to transform with
- * @returns {vec3} out
- */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;}/**
- * Transforms the vec3 with a quat
- * Can also be used for dual quaternions. (Multiply it with the real part)
- *
- * @param {vec3} out the receiving vector
- * @param {ReadonlyVec3} a the vector to transform
- * @param {ReadonlyQuat} q quaternion to transform with
- * @returns {vec3} out
- */function transformQuat$1(out,a,q){// benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
- 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];
- // var uv = vec3.cross([], qvec, a);
- var uvx=qy*z-qz*y,uvy=qz*x-qx*z,uvz=qx*y-qy*x;// var uuv = vec3.cross([], qvec, uv);
- var uuvx=qy*uvz-qz*uvy,uuvy=qz*uvx-qx*uvz,uuvz=qx*uvy-qy*uvx;// vec3.scale(uv, uv, 2 * w);
- var w2=qw*2;uvx*=w2;uvy*=w2;uvz*=w2;// vec3.scale(uuv, uuv, 2);
- uuvx*=2;uuvy*=2;uuvz*=2;// return vec3.add(out, a, vec3.add(out, uv, uuv));
- out[0]=x+uvx+uuvx;out[1]=y+uvy+uuvy;out[2]=z+uvz+uuvz;return out;}/**
- * Rotate a 3D vector around the x-axis
- * @param {vec3} out The receiving vec3
- * @param {ReadonlyVec3} a The vec3 point to rotate
- * @param {ReadonlyVec3} b The origin of the rotation
- * @param {Number} rad The angle of rotation in radians
- * @returns {vec3} out
- */function rotateX$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
- p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
- 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
- out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
- * Rotate a 3D vector around the y-axis
- * @param {vec3} out The receiving vec3
- * @param {ReadonlyVec3} a The vec3 point to rotate
- * @param {ReadonlyVec3} b The origin of the rotation
- * @param {Number} rad The angle of rotation in radians
- * @returns {vec3} out
- */function rotateY$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
- p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
- 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
- out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
- * Rotate a 3D vector around the z-axis
- * @param {vec3} out The receiving vec3
- * @param {ReadonlyVec3} a The vec3 point to rotate
- * @param {ReadonlyVec3} b The origin of the rotation
- * @param {Number} rad The angle of rotation in radians
- * @returns {vec3} out
- */function rotateZ$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
- p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
- 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
- out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
- * Get the angle between two 3D vectors
- * @param {ReadonlyVec3} a The first operand
- * @param {ReadonlyVec3} b The second operand
- * @returns {Number} The angle in radians
- */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));}/**
- * Alias for {@link vec3.length}
- * @function
- */var len$2=length$2/**
- * Perform some operation over an array of vec3s.
- *
- * @param {Array} a the array of vectors to iterate over
- * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
- * @param {Number} offset Number of elements to skip at the beginning of the array
- * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
- * @param {Function} fn Function to call for each vector in the array
- * @param {Object} [arg] additional argument to pass to fn
- * @returns {Array} a
- * @function
- */;(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);/**
- * 3x3 Matrix
- * @module mat3
- */ /**
- * Creates a new identity mat3
- *
- * @returns {mat3} a new 3x3 matrix
- */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;}/**
- * Transpose the values of a mat3
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the source matrix
- * @returns {mat3} out
- */function transpose$1(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
- 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;}/**
- * Inverts a mat3
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the source matrix
- * @returns {mat3} out
- */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
- 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;}/**
- * Calculates the determinant of a mat3
- *
- * @param {ReadonlyMat3} a the source matrix
- * @returns {Number} determinant of a
- */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);}/**
- * Multiplies two mat3's
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the first operand
- * @param {ReadonlyMat3} b the second operand
- * @returns {mat3} out
- */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;}/**
- * Translate a mat3 by the given vector
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the matrix to translate
- * @param {ReadonlyVec2} v vector to translate by
- * @returns {mat3} out
- */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;}/**
- * Rotates a mat3 by the given angle
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the matrix to rotate
- * @param {Number} rad the angle to rotate the matrix by
- * @returns {mat3} out
- */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;}/**
- * Scales the mat3 by the dimensions in the given vec2
- *
- * @param {mat3} out the receiving matrix
- * @param {ReadonlyMat3} a the matrix to rotate
- * @param {ReadonlyVec2} v the vec2 to scale the matrix by
- * @returns {mat3} out
- **/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;}/**
- * Calculates a 3x3 matrix from the given quaternion
- *
- * @param {mat3} out mat3 receiving operation result
- * @param {ReadonlyQuat} q Quaternion to create matrix from
- *
- * @returns {mat3} out
- */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);/**
- * Set a mat4 to the identity matrix
- *
- * @param {mat4} out the receiving matrix
- * @returns {mat4} out
- */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;}/**
- * Transpose the values of a mat4
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the source matrix
- * @returns {mat4} out
- */function _transpose(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
- 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;}/**
- * Inverts a mat4
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the source matrix
- * @returns {mat4} out
- */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
- 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;}/**
- * Calculates the determinant of a mat4
- *
- * @param {ReadonlyMat4} a the source matrix
- * @returns {Number} determinant of a
- */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
- return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;}/**
- * Multiplies two mat4s
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the first operand
- * @param {ReadonlyMat4} b the second operand
- * @returns {mat4} out
- */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
- 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;}/**
- * Translate a mat4 by the given vector
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to translate
- * @param {ReadonlyVec3} v vector to translate by
- * @returns {mat4} out
- */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;}/**
- * Scales the mat4 by the dimensions in the given vec3 not using vectorization
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to scale
- * @param {ReadonlyVec3} v the vec3 to scale the matrix by
- * @returns {mat4} out
- **/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;}/**
- * Rotates a mat4 by the given angle around the given axis
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to rotate
- * @param {Number} rad the angle to rotate the matrix by
- * @param {ReadonlyVec3} axis the axis to rotate around
- * @returns {mat4} out
- */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
- 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
- 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
- out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}return out;}/**
- * Rotates a matrix by the given angle around the X axis
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to rotate
- * @param {Number} rad the angle to rotate the matrix by
- * @returns {mat4} out
- */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
- 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
- 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;}/**
- * Rotates a matrix by the given angle around the Y axis
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to rotate
- * @param {Number} rad the angle to rotate the matrix by
- * @returns {mat4} out
- */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
- 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
- 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;}/**
- * Rotates a matrix by the given angle around the Z axis
- *
- * @param {mat4} out the receiving matrix
- * @param {ReadonlyMat4} a the matrix to rotate
- * @param {Number} rad the angle to rotate the matrix by
- * @returns {mat4} out
- */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
- 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
- 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;}/**
- * Returns the scaling factor component of a transformation
- * matrix. If a matrix is built with fromRotationTranslationScale
- * with a normalized Quaternion paramter, the returned vector will be
- * the same as the scaling vector
- * originally supplied.
- * @param {vec3} out Vector to receive scaling factor component
- * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
- * @return {vec3} out
- */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;}/**
- * Calculates a 4x4 matrix from the given quaternion
- *
- * @param {mat4} out mat4 receiving operation result
- * @param {ReadonlyQuat} q Quaternion to create matrix from
- *
- * @returns {mat4} out
- */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;}/**
- * Generates a frustum matrix with the given bounds
- *
- * @param {mat4} out mat4 frustum matrix will be written into
- * @param {Number} left Left bound of the frustum
- * @param {Number} right Right bound of the frustum
- * @param {Number} bottom Bottom bound of the frustum
- * @param {Number} top Top bound of the frustum
- * @param {Number} near Near bound of the frustum
- * @param {Number} far Far bound of the frustum
- * @returns {mat4} out
- */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;}/**
- * Generates a perspective projection matrix with the given bounds.
- * Passing null/undefined/no value for far will generate infinite projection matrix.
- *
- * @param {mat4} out mat4 frustum matrix will be written into
- * @param {number} fovy Vertical field of view in radians
- * @param {number} aspect Aspect ratio. typically viewport width/height
- * @param {number} near Near bound of the frustum
- * @param {number} far Far bound of the frustum, can be null or Infinity
- * @returns {mat4} out
- */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;}/**
- * Generates a orthogonal projection matrix with the given bounds
- *
- * @param {mat4} out mat4 frustum matrix will be written into
- * @param {number} left Left bound of the frustum
- * @param {number} right Right bound of the frustum
- * @param {number} bottom Bottom bound of the frustum
- * @param {number} top Top bound of the frustum
- * @param {number} near Near bound of the frustum
- * @param {number} far Far bound of the frustum
- * @returns {mat4} out
- */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;}/**
- * Generates a look-at matrix with the given eye position, focal point, and up axis.
- * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.
- *
- * @param {mat4} out mat4 frustum matrix will be written into
- * @param {ReadonlyVec3} eye Position of the viewer
- * @param {ReadonlyVec3} center Point the viewer is looking at
- * @param {ReadonlyVec3} up vec3 pointing up
- * @returns {mat4} out
- */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;}/**
- * 4 Dimensional Vector
- * @module vec4
- */ /**
- * Creates a new, empty vec4
- *
- * @returns {vec4} a new 4D vector
- */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;}/**
- * Adds two vec4's
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a the first operand
- * @param {ReadonlyVec4} b the second operand
- * @returns {vec4} out
- */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;}/**
- * Scales a vec4 by a scalar number
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a the vector to scale
- * @param {Number} b amount to scale the vector by
- * @returns {vec4} out
- */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;}/**
- * Calculates the length of a vec4
- *
- * @param {ReadonlyVec4} a vector to calculate length of
- * @returns {Number} length of a
- */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);}/**
- * Calculates the squared length of a vec4
- *
- * @param {ReadonlyVec4} a vector to calculate squared length of
- * @returns {Number} squared length of a
- */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;}/**
- * Normalize a vec4
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a vector to normalize
- * @returns {vec4} out
- */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;}/**
- * Calculates the dot product of two vec4's
- *
- * @param {ReadonlyVec4} a the first operand
- * @param {ReadonlyVec4} b the second operand
- * @returns {Number} dot product of a and b
- */function dot$1(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];}/**
- * Performs a linear interpolation between two vec4's
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a the first operand
- * @param {ReadonlyVec4} b the second operand
- * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
- * @returns {vec4} out
- */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;}/**
- * Transforms the vec4 with a mat4.
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a the vector to transform
- * @param {ReadonlyMat4} m matrix to transform with
- * @returns {vec4} out
- */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;}/**
- * Transforms the vec4 with a quat
- *
- * @param {vec4} out the receiving vector
- * @param {ReadonlyVec4} a the vector to transform
- * @param {ReadonlyQuat} q quaternion to transform with
- * @returns {vec4} out
- */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
- 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
- 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);/**
- * Quaternion
- * @module quat
- */ /**
- * Creates a new identity quat
- *
- * @returns {quat} a new quaternion
- */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;}/**
- * Set a quat to the identity quaternion
- *
- * @param {quat} out the receiving quaternion
- * @returns {quat} out
- */function _identity(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out;}/**
- * Sets a quat from the given angle and rotation axis,
- * then returns it.
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyVec3} axis the axis around which to rotate
- * @param {Number} rad the angle in radians
- * @returns {quat} out
- **/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;}/**
- * Multiplies two quat's
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @returns {quat} out
- */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;}/**
- * Rotates a quaternion by the given angle about the X axis
- *
- * @param {quat} out quat receiving operation result
- * @param {ReadonlyQuat} a quat to rotate
- * @param {number} rad angle (in radians) to rotate
- * @returns {quat} out
- */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;}/**
- * Rotates a quaternion by the given angle about the Y axis
- *
- * @param {quat} out quat receiving operation result
- * @param {ReadonlyQuat} a quat to rotate
- * @param {number} rad angle (in radians) to rotate
- * @returns {quat} out
- */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;}/**
- * Rotates a quaternion by the given angle about the Z axis
- *
- * @param {quat} out quat receiving operation result
- * @param {ReadonlyQuat} a quat to rotate
- * @param {number} rad angle (in radians) to rotate
- * @returns {quat} out
- */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;}/**
- * Calculates the W component of a quat from the X, Y, and Z components.
- * Assumes that quaternion is 1 unit in length.
- * Any existing W component will be ignored.
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a quat to calculate W component of
- * @returns {quat} out
- */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;}/**
- * Performs a spherical linear interpolation between two quat
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
- * @returns {quat} out
- */function _slerp(out,a,b,t){// benchmarks:
- // http://jsperf.com/quaternion-slerp-implementations
- 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
- cosom=ax*bx+ay*by+az*bz+aw*bw;// adjust signs (if necessary)
- if(cosom<0.0){cosom=-cosom;bx=-bx;by=-by;bz=-bz;bw=-bw;}// calculate coefficients
- if(1.0-cosom>EPSILON){// standard case (slerp)
- 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
- // ... so we can do a linear interpolation
- scale0=1.0-t;scale1=t;}// calculate final values
- 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;}/**
- * Calculates the inverse of a quat
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a quat to calculate inverse of
- * @returns {quat} out
- */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
- out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out;}/**
- * Calculates the conjugate of a quat
- * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a quat to calculate conjugate of
- * @returns {quat} out
- */function _conjugate(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out;}/**
- * Creates a quaternion from the given 3x3 rotation matrix.
- *
- * NOTE: The resultant quaternion is not normalized, so you should be sure
- * to renormalize the quaternion yourself where necessary.
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyMat3} m rotation matrix
- * @returns {quat} out
- * @function
- */function fromMat3(out,m){// Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
- // article "Quaternion Calculus and Fast Animation".
- var fTrace=m[0]+m[4]+m[8];var fRoot;if(fTrace>0.0){// |w| > 1/2, may as well choose w > 1/2
- fRoot=Math.sqrt(fTrace+1.0);// 2w
- out[3]=0.5*fRoot;fRoot=0.5/fRoot;// 1/(4w)
- 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
- 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;}/**
- * Adds two quat's
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @returns {quat} out
- * @function
- */var _add=add$1;/**
- * Scales a quat by a scalar number
- *
- * @param {quat} out the receiving vector
- * @param {ReadonlyQuat} a the vector to scale
- * @param {Number} b amount to scale the vector by
- * @returns {quat} out
- * @function
- */var _scale2=scale$1;/**
- * Calculates the dot product of two quat's
- *
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @returns {Number} dot product of a and b
- * @function
- */var _dot=dot$1;/**
- * Performs a linear interpolation between two quat's
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
- * @returns {quat} out
- * @function
- */var _lerp=lerp$1;/**
- * Calculates the length of a quat
- *
- * @param {ReadonlyQuat} a vector to calculate length of
- * @returns {Number} length of a
- */var length=length$1;/**
- * Calculates the squared length of a quat
- *
- * @param {ReadonlyQuat} a vector to calculate squared length of
- * @returns {Number} squared length of a
- * @function
- */var squaredLength=squaredLength$1;/**
- * Normalize a quat
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a quaternion to normalize
- * @returns {quat} out
- * @function
- */var normalize=normalize$1;/**
- * Sets a quaternion to represent the shortest rotation from one
- * vector to another.
- *
- * Both vectors are assumed to be unit length.
- *
- * @param {quat} out the receiving quaternion.
- * @param {ReadonlyVec3} a the initial vector
- * @param {ReadonlyVec3} b the destination vector
- * @returns {quat} out
- */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);}};}()/**
- * Performs a spherical linear interpolation with two control points
- *
- * @param {quat} out the receiving quaternion
- * @param {ReadonlyQuat} a the first operand
- * @param {ReadonlyQuat} b the second operand
- * @param {ReadonlyQuat} c the third operand
- * @param {ReadonlyQuat} d the fourth operand
- * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
- * @returns {quat} out
- */;(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;};})()/**
- * Sets the specified quaternion with values corresponding to the given
- * axes. Each axis is a vec3 and is expected to be unit length and
- * perpendicular to all other specified axes.
- *
- * @param {ReadonlyVec3} view the vector representing the viewing direction
- * @param {ReadonlyVec3} right the vector representing the local "right" direction
- * @param {ReadonlyVec3} up the vector representing the local "up" direction
- * @returns {quat} out
- */;(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
- 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做调整
- 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 改
- var height=frameState.height,sseDenominator=frameState.sseDenominator;var viewDistanceScale=tileset.options.viewDistanceScale;// 屏幕空间误差SSE = (几何误差geometricError * canvas高度) / (相机到tile的距离 * 相机指数)
- 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
- _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
- },{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模型)
- var isFloorShow=tile.tileset.options.currentFloorId=='all'||tile.floorIndex==void 0||tile.floorIndex==tile.tileset.options.currentFloorId;// 循环遍历子tile
- if(this.canTraverse(tile,frameState)&&isFloorShow){this.updateChildTiles(tile,frameState);// 根据isVisibleAndInRequestVolume判断是否select
- 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
- 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,模型会需要重新加载
- if(stack.find(child)){stack.delete(child);}stack.push(child);// 如果hasVisibleChild全都不为true,则tile全在可视范围外,不会被selectTile
- 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;}// 判断是否遍历(即判断是否更新更精细的模型)
- },{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一般不可能只有一层)
- 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都将重新加载
- // // 如果tile不在可视范围内,则不加载更精细的模型
- // if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {
- // return false
- // }
- 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;}// 是否更新更精细的模型
- },{key:"shouldRefine",value:function shouldRefine(tile,frameState,useParentMetric){if(tile.tileset.options.loadMaxLevelDirect){return true;//xzw add : 直接加载到最高清晰度,用于截图
- }var screenSpaceError=tile._screenSpaceError;if(useParentMetric){screenSpaceError=tile.getScreenSpaceError(frameState,true);}// 距离越近,SSE越大
- 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可视
- },{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所在楼层
- 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;}// 是否在可视范围内
- },{key:"isVisibleAndInRequestVolume",get:function get(){return this.tileset.visible&&this._visible&&this._inRequestVolume;//xzw add this.tileset.visible
- }},{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请求
- this.controller=new AbortController();contentUrl=this.tileset.getTileUrl(this.contentUrl)+"?_=".concat(this.tileset.options.imageVersion);// !zeg改 添加version后缀
- 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
- 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
- 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也不可视
- 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
- {var v=true;Object.defineProperty(_assertThisInitialized(_this15),'visible',{//xzw add。false的时候其tiles将不会显示
- 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改
- }},{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);}/**
- * -----------------------CesiumIonLoader--------------------------
- */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
- 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
- function generateGradientTexture(gradient){var size=64;// create canvas
- var canvas=document.createElement('canvas');canvas.width=size;canvas.height=size;// get context
- var context=canvas.getContext('2d');// draw gradient
- 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);
- 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;
- return texture;}function _getCameraFrustum(camera){camera.updateMatrix();// make sure camera's local matrix is updated
- camera.updateMatrixWorld();// make sure camera's world matrix is updated
- 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
- var planeGeometry=new THREE$1.PlaneGeometry(10,5);// Align the geometry to the plane
- 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
- /*
- const edges = new EdgesGeometry(planeGeometry)
- var dispPlane = new LineSegments(edges, new LineBasicMaterial({ color: 0x00ffff }))*/ //plane
- 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
- 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;}/*
- * from https://github.com/tentone/geo-three
- * Tree-shaking did not work, probably due to static class methods
- */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/
- 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
- // values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f
- // original file licensed under Apache-2.0
- 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:/**
- * Loads a tileset of 3D Tiles according to the given {@link LoaderProps}
- * @public
- *
- * @param props - Properties for this load call {@link LoaderProps}.
- * @returns An object containing the 3D Model to be added to the scene
- * and a runtime engine to be updated every frame.
- */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
- if(disposeFlag||options.pauseTilesetUpdate){return;}// Assumes camera fov, near and far are not changing
- 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
- sseDenominator=0.25*(camera.top-camera.bottom);//等同于相机距离,因为越远看的越广//camera.aspect > 1 ? (camera.right - camera.left) : (camera.top - camera.bottom)
- //越大越粗糙
- }lastCameraAspect=camera.aspect;lastCameraTop=camera.top;//add
- lastCameraLeft=camera.left;//add
- 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
- type:camera.type,//xzw add
- left:camera.left,right:camera.right,top:camera.top,bottom:camera.bottom//xzw add
- },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更新
- tileset._cache.reset();tileset._traverser.traverse(tileset.root,frameState,tileset.options);// 遍历更新
- 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
- 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
- }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
- 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对不上
- renderMap={};boxMap={};unloadQueue=[];// !zeg改 使用4dkankan里传入的model
- root=props.model||new THREE$1.Group();tileBoxes=new THREE$1.Group();if(options.debug){root.add(tileBoxes);// 只在debug的时候才把tileBoxes添加进root
- }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改 用于兼容专属逻辑
- imageVersion:options.imageVersion,// !zeg改 用于更新瓦片模型的version
- ingoreVisibleCompute:!!options.ingoreVisibleCompute,// !zeg改 禁用屏幕外瓦片计算
- 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
- 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}})}));//
- // transformations
- 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
- // https://github.com/visgl/loaders.gl/issues/1994
- 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
- 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无需等待
- //let lastCameraTransform = null
- 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
- 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) {
- // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
- //} else {
- //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
- //if (cameraChanged || isForse) {
- //if (lastCameraTransform == null) {
- // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
- //} else {
- //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
- //if (cameraChanged || isForse) {
- timer=0;tileset._frameNumber++;camera.getWorldPosition(lastCameraPosition);//lastCameraTransform.copy(camera.matrixWorld)
- //lastCameraTransform.copy(camera.matrixWorld)
- tilesetUpdate(tileset,renderMap,renderer,camera);//}
- //}
- }},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改
- // 显示并让所有tile按照相机位置细化,不受可视范围影响
- ingoreVisibleCompute:function ingoreVisibleCompute(visi){tileset.options.ingoreVisibleCompute=visi;tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);},// 暂停tile更新,保持当前tile的显隐和depth
- pauseTilesetUpdate:function pauseTilesetUpdate(isPause){options.pauseTilesetUpdate=isPause;if(!isPause){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 设置是否限制为最低精度tile深度
- limit2lowestDepth:function limit2lowestDepth(isLowest){options.isLowestDepth=!!isLowest;if(cameraReference){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 清空正在加载的tile
- clearLoadingTiles:function clearLoadingTiles(){tileset.loadingTiles.forEach(function(tile){return tile.controller&&tile.controller.abort();});},// 模型的总体积
- 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
- // The computed trasnform already contains the root's transform, so we have to invert it
- 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
- }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
- // 模型加载成功
- var tileContent=gltf.scenes[0];var meshes=[];tileContent.traverse(function(object){if(object.type=='Mesh'){meshes.push(object);// 提取tileContent里面的所有mesh
- }});tileContent.clear();// 清空tileContent
- // 清空tileContent
- 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里
- 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])
- }if(tile.tileset.options.type=='4dkk'){// 将mesh转为chunk
- 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
- }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
- 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
- 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);}}
- var baseURL = getScriptURL(); // 兼容V2
- var compatiblev2 = function compatiblev2(data) {
- if (!data.floors) {
- data = {
- floors: [data]
- };
- }
- data.floors.map(function (data) {
- data.column = data.column || [];
- data.window = data.window || [];
- data.door = data.door || [];
- data.groundCase = data.groundCase || [];
- data.bayCase = data.bayCase || [];
- data.slideDoor = data.slideDoor || [];
- data.tagging = data.tagging || [];
- data.furnColumn = data.furnColumn || [];
- data.furnFlue = data.furnFlue || [];
- if (data.rooms || data.room || data.points) {
- data.room = data.rooms || data.room || data.points;
- data.room.forEach(function (room) {
- if (!isNumber(room.top)) {
- room.top = isNumber(data.top) ? data.top : 1;
- }
- if (!isNumber(room.bottom)) {
- room.bottom = isNumber(data.bottom) ? data.bottom : 1;
- }
- if (!room.ground && room.points) {
- room.ground = room.points;
- }
- if (!room.hole) {
- room.hole = [];
- }
- room.close = true;
- });
- }
- return data;
- });
- return data;
- };
- defineComponent('resource', function () {
- return /*#__PURE__*/function () {
- function Resource() {
- _classCallCheck(this, Resource);
- this.reload = false;
- this.version = Date.now();
- this.nowTime = Date.now();
- this.imageVersion = 0;
- this.linkVersion = 0;
- }
- _createClass(Resource, [{
- key: "num",
- get: function get() {
- return this.$app.config.num;
- }
- }, {
- key: "mode",
- get: function get() {
- return this.$app.config.view ? 'view' : 'edit';
- }
- }, {
- key: "time",
- get: function get() {
- if (this.reload || this.refresh) {
- if (this.reload) {
- this.reload = false;
- this.refresh = Date.now();
- }
- return this.refresh;
- }
- return this.version;
- }
- }, {
- key: "base",
- value: function base(path) {
- return baseURL + path;
- }
- }, {
- key: "auth",
- value: function () {
- var _auth = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var data;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- if (!(this.mode != 'edit')) {
- _context.next = 2;
- break;
- }
- return _context.abrupt("return");
- case 2:
- _context.prev = 2;
- _context.next = 5;
- return this.$app.remote_editor.getAuth({
- num: this.num
- });
- case 5:
- data = _context.sent;
- if (data.success) {
- this.$app.store.set('auth', data.data);
- }
- return _context.abrupt("return", data);
- case 10:
- _context.prev = 10;
- _context.t0 = _context["catch"](2);
- throw _context.t0;
- case 13:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this, [[2, 10]]);
- }));
- function auth() {
- return _auth.apply(this, arguments);
- }
- return auth;
- }()
- }, {
- key: "metadata",
- value: function () {
- var _metadata = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
- var data, resp, params;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- logger$1.time("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
- data = null;
- resp = null;
- params = "?num=".concat(this.$app.config.num);
- if (this.$app.config.params) {
- params += "&".concat(this.$app.config.params);
- }
- if (browser$1.urlHasValue('sign')) {
- params += "&sign=".concat(browser$1.valueFromUrl('sign'));
- }
- params += "&_=".concat(this.time);
- if (!this.$app.config.view) {
- _context2.next = 23;
- break;
- }
- if (!(this.$app.config.deploy == 'local' && !this.$app.config.server)) {
- _context2.next = 14;
- break;
- }
- _context2.next = 11;
- return http.get(this.getViewResourceURL("data/scene.json?_=".concat(this.time)));
- case 11:
- resp = _context2.sent;
- _context2.next = 21;
- break;
- case 14:
- if (!window.__KANKAN_DATA) {
- _context2.next = 18;
- break;
- }
- resp = window.__KANKAN_DATA;
- _context2.next = 21;
- break;
- case 18:
- _context2.next = 20;
- return http.get("/service/scene/getInfo" + params);
- case 20:
- resp = _context2.sent;
- case 21:
- _context2.next = 26;
- break;
- case 23:
- _context2.next = 25;
- return http.get("/service/scene/edit/getInfo" + params);
- case 25:
- resp = _context2.sent;
- case 26:
- if (!(resp.success != void 0)) {
- _context2.next = 34;
- break;
- }
- if (!resp.success) {
- _context2.next = 31;
- break;
- }
- data = resp.data;
- _context2.next = 32;
- break;
- case 31:
- return _context2.abrupt("return");
- case 32:
- _context2.next = 35;
- break;
- case 34:
- data = resp;
- case 35:
- if (data.entry) {
- if (typeof data.entry === 'string') {
- data.entry = JSON.parse(data.entry);
- }
- }
- if (data.boxVideos) {
- if (typeof data.boxVideos === 'string') {
- data.boxVideos = JSON.parse(data.boxVideos);
- }
- }
- if (data.boxPhotos) {
- if (typeof data.boxPhotos === 'string') {
- data.boxPhotos = JSON.parse(data.boxPhotos);
- }
- }
- if (data.boxModels) {
- if (typeof data.boxModels === 'string') {
- data.boxModels = JSON.parse(data.boxModels);
- }
- }
- if (data.videos) {
- if (typeof data.videos === 'string') {
- data.videos = JSON.parse(data.videos);
- }
- }
- if (data.version) {
- this.version = data.version;
- this.imageVersion = data.imgVersion || 0;
- this.linkVersion = data.linkVersion || 0;
- }
- if (data.sns == void 0) {
- data.sns = {};
- if (data.sns.share == void 0) {
- data.sns.share = {};
- data.sns.share = {
- __init__: true,
- title: data.title,
- keywords: '',
- description: data.description,
- image: data.entry ? 'thumb-1k.jpg' : null
- };
- }
- }
- if (data.orientation) {
- data.orientation = Number(data.orientation);
- }
- logger$1.timeEnd("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
- this.$app.store.set('metadata', data);
- return _context2.abrupt("return", data);
- case 46:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this);
- }));
- function metadata() {
- return _metadata.apply(this, arguments);
- }
- return metadata;
- }()
- /**
- * 加载漫游点
- */
- }, {
- key: "visions",
- value: function () {
- var _visions = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
- var _this = this;
- var data, metadata, decompress;
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- logger$1.time("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
- _context3.next = 3;
- return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision.modeldata?_=".concat(this.version)));
- case 3:
- data = _context3.sent;
- _context3.next = 6;
- return this.$app.store.get('metadata');
- case 6:
- metadata = _context3.sent;
- logger$1.timeEnd("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
- decompress = function decompress(buffer) {
- logger$1.time("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid));
- var sweepLocations = Deompress.decompressModeldata(buffer);
- if (metadata.dataSync == 'ajk') {
- //同步漫游点数据(安居客需要)
- _this.$app.DataSYNC.use('DataAJK', {
- sweepLocations: sweepLocations
- });
- }
- var modeldata = Process.visionModeldata(sweepLocations);
- logger$1.timeEnd("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid)); // todo
- //将vision.modeldata数据进行处理,生成Panorama对象数组,以及设置邻居点, metadata用于检测球幕视频
- _this.$app.core.get('Player').model.panos = Process.panos(_this.$app, modeldata, metadata);
- _this.$app.core.get('Player').model.dispatchEvent({
- type: 'gotPanos'
- });
- };
- decompress(data);
- case 10:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- function visions() {
- return _visions.apply(this, arguments);
- }
- return visions;
- }()
- /**
- * 加载辅助点位
- */
- }, {
- key: "visions2",
- value: function () {
- var _visions2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
- var _this2 = this;
- var model, data, decompress;
- return regenerator.wrap(function _callee4$(_context4) {
- while (1) {
- switch (_context4.prev = _context4.next) {
- case 0:
- model = this.$app.core.get('Player').model;
- logger$1.time("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
- _context4.next = 4;
- return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision2.modeldata?_=".concat(this.version)));
- case 4:
- data = _context4.sent;
- logger$1.timeEnd("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
- decompress = function decompress(buffer) {
- logger$1.time("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
- var sweepLocations = Deompress.decompressModeldata(buffer);
- var modeldata = Process.visionModeldata(sweepLocations);
- logger$1.timeEnd("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
- var panos = Process.panosAssist(modeldata, _this2.$app);
- panos.forEach(function (pano) {
- model.panos.index[pano.id - 1].assistPano = pano;
- });
- };
- decompress(data);
- case 8:
- case "end":
- return _context4.stop();
- }
- }
- }, _callee4, this);
- }));
- function visions2() {
- return _visions2.apply(this, arguments);
- }
- return visions2;
- }()
- /**
- * 加载模型
- */
- }, {
- key: "modelmesh3dTiles",
- value: function () {
- var _modelmesh3dTiles = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
- var _this3 = this;
- var player, sceneRenderer, result, runtime;
- return regenerator.wrap(function _callee5$(_context5) {
- while (1) {
- switch (_context5.prev = _context5.next) {
- case 0:
- logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
- player = this.$app.core.get('Player');
- sceneRenderer = this.$app.core.get('SceneRenderer');
- _context5.next = 5;
- return Loader3DTiles.load({
- // url: texture.getImageURL('images/3dtiles/tileset.json'),
- // url: texture.getImageURL('images/3dtiles_tianranqi/tileset.json'),
- // url: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
- // url: 'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
- url: this.getResourceURL("scene_view_data/{num}/images/3dtiles/tileset.json?_=".concat(Date.now())),
- renderer: sceneRenderer.renderer,
- options: {
- dracoDecoderPath: texture.getImageURL('images/loaders/DRACOLoader/draco'),
- basisTranscoderPath: texture.getImageURL('images/loaders/KTX2Loader/basis'),
- maximumScreenSpaceError: browser$1.isMobile() ? 5000 : 40,
- // 和geometryError的计算有关,值越小,瓦片细化所需距离越远
- maxConcurrency: 2,
- isLowestDepth: true,
- // 限制为最低精度
- // debug: true, // 显示tiles的boundingVolume线框
- // updateInterval: 0.01, // update的频率(ms)
- ingoreVisibleCompute: true,
- // 禁用屏幕外瓦片计算,防止初始画面没有模型时不加载tiles
- maximumMemoryUsage: browser$1.detectIOS() ? 0.1 : 64,
- // 最大tiles缓存,默认32(ios防崩) xzw2024:ios不缓存?
- imageVersion: this.imageVersion,
- // 用于更新瓦片模型的version
- type: '4dkk' // 用于兼容专属逻辑
- },
- model: player.model
- });
- case 5:
- result = _context5.sent;
- runtime = result.runtime;
- player.model._3dTilesRuntime = runtime;
- sceneRenderer.autoUpdate3dTiles = true; // // 3dtiles调试面板
- // // ---------------- stats-widget -------------------
- // const statsParent = document.createElement('div')
- // statsParent.id = 'stats-widget'
- // statsParent.style.position = 'absolute'
- // statsParent.style.top = '20px'
- // statsParent.style.left = '100px'
- // statsParent.style.backgroundColor = 'rgb(255 255 255 / 83%)'
- // statsParent.style.padding = '10px'
- // statsParent.style.width = '300px'
- // statsParent.style.wordBreak = 'break-all'
- // statsParent.style.zIndex = '9999'
- // statsParent.style.fontSize = '18px'
- // document.querySelector('body').appendChild(statsParent)
- // player.model._3dTilesRuntime.stats = new StatsWidget(runtime.getStats(), { container: statsParent })
- // // -------------------------------------------------
- // 当瓦片都加载完时,继续加载其他场景数据
- runtime.getTileset().on('endTileLoading', function (data) {
- if (data.loadingCount == 0 && !player.model.mesh3dTilesLoaded) {
- player.model.mesh3dTilesLoaded = true;
- player.model.floors.sort();
- if (browser$1.detectIOS()) {
- // ios要计算模型体积,当体积过大时,不会加载最精细一层
- var modelBox = new THREE.Box3();
- player.model.floors.forEach(function (floor) {
- return modelBox.union(floor.boundingBox);
- });
- player.model._3dTilesRuntime.setModelSize(modelBox.getSize(new THREE.Vector3()));
- }
- _this3.$app.Scene.emit('3dTilesLoaded');
- player.model._3dTilesRuntime.pauseTilesetUpdate(false); // 先update一次
- player.model._3dTilesRuntime.pauseTilesetUpdate(true);
- logger$1.timeEnd("".concat(_this3.$app.config.num, "[load modelmesh]").concat(_this3.$app.uid));
- }
- });
- case 10:
- case "end":
- return _context5.stop();
- }
- }
- }, _callee5, this);
- }));
- function modelmesh3dTiles() {
- return _modelmesh3dTiles.apply(this, arguments);
- }
- return modelmesh3dTiles;
- }()
- }, {
- key: "modelmeshDam",
- value: function () {
- var _modelmeshDam = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6() {
- var _this4 = this;
- var dam, data, addToModel, decompress;
- return regenerator.wrap(function _callee6$(_context6) {
- while (1) {
- switch (_context6.prev = _context6.next) {
- case 0:
- addToModel = function _addToModel(chunks, player) {
- if (0 === chunks.length) {
- logger$1.warn('No geometry found for model, loading faux geometry, disabling outside mode');
- player.model.supportedModes[Viewmode$1.DOLLHOUSE] = !1;
- player.model.supportedModes[Viewmode$1.FLOORPLAN] = !1;
- var chunk = new Chunk({
- geometry: new THREE.PlaneBufferGeometry(5, 5, 1, 1)
- });
- chunk.material.visible = !1;
- chunk.rotateX(-Math.PI / 2);
- chunk.geometry.computeBoundingBox();
- chunks = [chunk];
- }
- chunks.forEach(function (mesh) {
- var floorIndex = 0;
- if (player.model.floorsEnabled) {
- floorIndex = Chunks.parseFloor(mesh.name);
- }
- player.model.addChunk(floorIndex, mesh);
- });
- player.model.floors.sort(); //deferred.resolve(player.model);
- };
- dam = settings$3.job + settings$3.format; //dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam
- if (this.$app.config.model.name) {
- dam = this.$app.config.model.name;
- }
- logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
- _context6.next = 6;
- return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/".concat(dam, "?_=").concat(this.imageVersion)));
- case 6:
- data = _context6.sent;
- logger$1.timeEnd("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
- decompress = function decompress(buffer) {
- logger$1.time("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
- var meshdata = Deompress.decompressMesh(buffer);
- var chunks = Process.convertProtobufToSceneObject(_this4.$app, meshdata);
- logger$1.timeEnd("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
- addToModel(chunks, _this4.$app.core.get('Player'));
- };
- decompress(data);
- case 10:
- case "end":
- return _context6.stop();
- }
- }
- }, _callee6, this);
- }));
- function modelmeshDam() {
- return _modelmeshDam.apply(this, arguments);
- }
- return modelmeshDam;
- }()
- }, {
- key: "textures",
- value: function () {
- var _textures = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7() {
- return regenerator.wrap(function _callee7$(_context7) {
- while (1) {
- switch (_context7.prev = _context7.next) {
- case 0:
- logger$1.time("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
- _context7.next = 3;
- return ModelTextureLoader.load(this.$app.core.get('Player').model, this.$app.core.get('Player').model.meshTextures, this);
- case 3:
- logger$1.timeEnd("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
- this.$app.core.get('Player').model.meshTexturesLoaded = !0;
- case 5:
- case "end":
- return _context7.stop();
- }
- }
- }, _callee7, this);
- }));
- function textures() {
- return _textures.apply(this, arguments);
- }
- return textures;
- }()
- /**
- * 原始算法楼层数据(数据同步使用)
- * @returns
- */
- }, {
- key: "floor",
- value: function () {
- var _floor = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8() {
- var data;
- return regenerator.wrap(function _callee8$(_context8) {
- while (1) {
- switch (_context8.prev = _context8.next) {
- case 0:
- data = null;
- _context8.prev = 1;
- logger$1.time("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
- _context8.next = 5;
- return http.get(this.getResourceURL("scene_view_data/{num}/data/floor.json?_=".concat(this.time)));
- case 5:
- data = _context8.sent;
- logger$1.timeEnd("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
- _context8.next = 12;
- break;
- case 9:
- _context8.prev = 9;
- _context8.t0 = _context8["catch"](1);
- logger$1.warn('loaded [floor] error');
- case 12:
- return _context8.abrupt("return", data);
- case 13:
- case "end":
- return _context8.stop();
- }
- }
- }, _callee8, this, [[1, 9]]);
- }));
- function floor() {
- return _floor.apply(this, arguments);
- }
- return floor;
- }()
- }, {
- key: "floorcad",
- value: function () {
- var _floorcad = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {
- var data;
- return regenerator.wrap(function _callee9$(_context9) {
- while (1) {
- switch (_context9.prev = _context9.next) {
- case 0:
- data = null;
- _context9.prev = 1;
- logger$1.time("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
- _context9.next = 5;
- return http.get(this.getResourceURL("scene_view_data/{num}/data/floorplan_cad.json?_=".concat(this.time)));
- case 5:
- data = _context9.sent;
- if (!data.floors) {
- data = compatiblev2(data);
- }
- if (data && data.floors) {
- data.floors = data.floors.filter(function (floor) {
- return floor.segment && floor.segment.length > 0;
- });
- }
- logger$1.timeEnd("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
- _context9.next = 14;
- break;
- case 11:
- _context9.prev = 11;
- _context9.t0 = _context9["catch"](1);
- logger$1.warn('loaded [floorcad] error');
- case 14:
- this.$app.store.set('floorcad', data);
- return _context9.abrupt("return", data);
- case 16:
- case "end":
- return _context9.stop();
- }
- }
- }, _callee9, this, [[1, 11]]);
- }));
- function floorcad() {
- return _floorcad.apply(this, arguments);
- }
- return floorcad;
- }()
- }, {
- key: "flooruser",
- value: function () {
- var _flooruser = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee10() {
- var data, meta;
- return regenerator.wrap(function _callee10$(_context10) {
- while (1) {
- switch (_context10.prev = _context10.next) {
- case 0:
- data = null;
- meta = this.$app.store.getValue('metadata');
- _context10.prev = 2;
- logger$1.time("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
- if (!meta.floorPlanUser) {
- _context10.next = 10;
- break;
- }
- _context10.next = 7;
- return http.get(this.getUserResourceURL("floorplan.json", this.reload));
- case 7:
- data = _context10.sent;
- _context10.next = 13;
- break;
- case 10:
- _context10.next = 12;
- return http.get(this.getViewDataURL("floorplan.json"));
- case 12:
- data = _context10.sent;
- case 13:
- logger$1.timeEnd("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
- _context10.next = 30;
- break;
- case 16:
- _context10.prev = 16;
- _context10.t0 = _context10["catch"](2);
- logger$1.warn('loaded [flooruser] error');
- if (!meta.floorPlanUser) {
- _context10.next = 29;
- break;
- }
- _context10.prev = 20;
- _context10.next = 23;
- return http.get(this.getViewDataURL("floorplan.json"));
- case 23:
- data = _context10.sent;
- _context10.next = 29;
- break;
- case 26:
- _context10.prev = 26;
- _context10.t1 = _context10["catch"](20);
- logger$1.warn('loaded [flooruser] error');
- case 29:
- if (!data) {
- data = {
- unit: 'm',
- floors: [{
- walls: {
- Wall7: {
- important: false,
- geoType: 'Wall',
- children: [],
- start: 'Point3',
- vectorId: 'Wall7',
- width: 0.2,
- end: 'Point0',
- out: false
- },
- Wall6: {
- important: false,
- geoType: 'Wall',
- children: [],
- start: 'Point2',
- vectorId: 'Wall6',
- width: 0.2,
- end: 'Point3',
- out: false
- },
- Wall5: {
- important: false,
- geoType: 'Wall',
- children: [],
- start: 'Point1',
- vectorId: 'Wall5',
- width: 0.2,
- end: 'Point2',
- out: false
- },
- Wall4: {
- important: false,
- geoType: 'Wall',
- children: [],
- start: 'Point0',
- vectorId: 'Wall4',
- width: 0.2,
- end: 'Point1',
- out: false
- }
- },
- subgroup: 0,
- name: '1楼',
- id: 0,
- points: {
- Point1: {
- parent: {
- Wall5: 'start',
- Wall4: 'end'
- },
- geoType: 'Point',
- vectorId: 'Point1',
- x: 5.531,
- y: 5.777
- },
- Point0: {
- parent: {
- Wall7: 'end',
- Wall4: 'start'
- },
- geoType: 'Point',
- vectorId: 'Point0',
- x: 5.531,
- y: -6.046
- },
- Point3: {
- parent: {
- Wall7: 'start',
- Wall6: 'end'
- },
- geoType: 'Point',
- vectorId: 'Point3',
- x: -2.663,
- y: -6.046
- },
- Point2: {
- parent: {
- Wall6: 'start',
- Wall5: 'end'
- },
- geoType: 'Point',
- vectorId: 'Point2',
- x: -2.663,
- y: 5.777
- }
- }
- }],
- currentId: 8,
- angle: 0,
- type: 'cad',
- version: 'v4.0'
- };
- }
- case 30:
- // if (meta.orientation && data.cadInfo == void 0) {
- // data.angle = 0
- // data.compass = Number(meta.orientation)
- // }
- this.$app.store.set('flooruser', data);
- return _context10.abrupt("return", data);
- case 32:
- case "end":
- return _context10.stop();
- }
- }
- }, _callee10, this, [[2, 16], [20, 26]]);
- }));
- function flooruser() {
- return _flooruser.apply(this, arguments);
- }
- return flooruser;
- }()
- }, {
- key: "billboards",
- value: function () {
- var _billboards = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee11() {
- var _metadata2, data;
- return regenerator.wrap(function _callee11$(_context11) {
- while (1) {
- switch (_context11.prev = _context11.next) {
- case 0:
- _context11.prev = 0;
- _context11.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata2 = _context11.sent;
- data = null;
- if (!(this.mode === 'view')) {
- _context11.next = 14;
- break;
- }
- if (_metadata2.billboards) {
- _context11.next = 8;
- break;
- }
- return _context11.abrupt("return");
- case 8:
- _context11.next = 10;
- return http.get(this.getUserResourceURL("billboards.json"));
- case 10:
- data = _context11.sent;
- this.$app.store.set('billboards', data);
- _context11.next = 18;
- break;
- case 14:
- _context11.next = 16;
- return this.$app.remote_editor.billboards_list({
- num: this.num
- });
- case 16:
- data = _context11.sent;
- this.$app.store.set('billboards', data.data);
- case 18:
- _context11.next = 23;
- break;
- case 20:
- _context11.prev = 20;
- _context11.t0 = _context11["catch"](0);
- logger$1.error('loaded [billboards] error', _context11.t0);
- case 23:
- case "end":
- return _context11.stop();
- }
- }
- }, _callee11, this, [[0, 20]]);
- }));
- function billboards() {
- return _billboards.apply(this, arguments);
- }
- return billboards;
- }()
- }, {
- key: "cutModel",
- value: function () {
- var _cutModel = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee12() {
- var _metadata3, data;
- return regenerator.wrap(function _callee12$(_context12) {
- while (1) {
- switch (_context12.prev = _context12.next) {
- case 0:
- _context12.prev = 0;
- _context12.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata3 = _context12.sent;
- data = null;
- if (_metadata3.cutModel) {
- _context12.next = 7;
- break;
- }
- return _context12.abrupt("return");
- case 7:
- if (!(this.mode === 'view')) {
- _context12.next = 14;
- break;
- }
- _context12.next = 10;
- return http.get(this.getUserResourceURL("cutModel.json"));
- case 10:
- data = _context12.sent;
- this.$app.store.set('cutModel', data);
- _context12.next = 18;
- break;
- case 14:
- _context12.next = 16;
- return this.$app.remote_editor.cutModel_list({
- num: this.num
- });
- case 16:
- data = _context12.sent;
- this.$app.store.set('cutModel', data.data);
- case 18:
- _context12.next = 23;
- break;
- case 20:
- _context12.prev = 20;
- _context12.t0 = _context12["catch"](0);
- logger$1.error('loaded [cutModel] error', _context12.t0);
- case 23:
- case "end":
- return _context12.stop();
- }
- }
- }, _callee12, this, [[0, 20]]);
- }));
- function cutModel() {
- return _cutModel.apply(this, arguments);
- }
- return cutModel;
- }()
- }, {
- key: "tags",
- value: function () {
- var _tags = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee13(tagsURL) {
- var _this5 = this;
- var response, _metadata4;
- return regenerator.wrap(function _callee13$(_context13) {
- while (1) {
- switch (_context13.prev = _context13.next) {
- case 0:
- if (!(!this.$app.config.isLoadTags && !tagsURL)) {
- _context13.next = 2;
- break;
- }
- return _context13.abrupt("return");
- case 2:
- response = {
- data: {
- icons: [],
- tags: []
- }
- };
- _context13.prev = 3;
- _context13.next = 6;
- return this.$app.store.get('metadata');
- case 6:
- _metadata4 = _context13.sent;
- // if (metadata.tags) {
- logger$1.time("".concat(this.num, "[load tags]").concat(this.$app.uid));
- if (!(this.mode == 'view')) {
- _context13.next = 24;
- break;
- }
- if (_metadata4.tags) {
- _context13.next = 11;
- break;
- }
- return _context13.abrupt("return");
- case 11:
- response.success = true;
- if (!tagsURL) {
- _context13.next = 18;
- break;
- }
- _context13.next = 15;
- return http.get(tagsURL);
- case 15:
- _context13.t0 = _context13.sent;
- _context13.next = 21;
- break;
- case 18:
- _context13.next = 20;
- return http.get(this.getUserResourceURL("hot.json"));
- case 20:
- _context13.t0 = _context13.sent;
- case 21:
- response.data.tags = _context13.t0;
- _context13.next = 27;
- break;
- case 24:
- _context13.next = 26;
- return this.$app.remote_editor.tag_list({
- num: this.num
- });
- case 26:
- response = _context13.sent;
- case 27:
- if (response.success && response.data && response.data.tags) {
- response.data.tags.map(function (tag) {
- if (tag.position) {
- tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z); // visiblePanos不知为何在obj场景里会有重复id,保险起见初始化统一去重
- tag.visiblePanos ? tag.visiblePanos = Array.from(new Set(tag.visiblePanos)).map(function (id) {
- return _this5.$app.core.get('Player').model.panos.index[id];
- }) : tag.visiblePanos = _this5.$app.TagManager.getVisiblePano(tag.position, {
- maxDis: 5
- });
- }
- return tag;
- });
- }
- logger$1.timeEnd("".concat(this.num, "[load tags]").concat(this.$app.uid)); // }
- _context13.next = 34;
- break;
- case 31:
- _context13.prev = 31;
- _context13.t1 = _context13["catch"](3);
- logger$1.error('loaded [tags] error', _context13.t1);
- case 34:
- this.$app.store.set('tags', response.data);
- return _context13.abrupt("return", response.data);
- case 36:
- case "end":
- return _context13.stop();
- }
- }
- }, _callee13, this, [[3, 31]]);
- }));
- function tags(_x) {
- return _tags.apply(this, arguments);
- }
- return tags;
- }() //加载痕迹物证
- }, {
- key: "traces",
- value: function () {
- var _traces = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee14() {
- var _this6 = this;
- var response, _metadata5, data;
- return regenerator.wrap(function _callee14$(_context14) {
- while (1) {
- switch (_context14.prev = _context14.next) {
- case 0:
- response = {
- data: {
- icons: [],
- traces: []
- }
- };
- _context14.prev = 1;
- _context14.next = 4;
- return this.$app.store.get('metadata');
- case 4:
- _metadata5 = _context14.sent;
- // if (metadata.traces) {
- logger$1.time("".concat(this.num, "[load traces]").concat(this.$app.uid));
- if (!(this.mode == 'view')) {
- _context14.next = 15;
- break;
- }
- if (_metadata5.evidence) {
- _context14.next = 9;
- break;
- }
- return _context14.abrupt("return");
- case 9:
- response.success = true;
- _context14.next = 12;
- return http.get(this.getUserResourceURL("evidence.json"));
- case 12:
- response.data.evidences = _context14.sent;
- _context14.next = 18;
- break;
- case 15:
- _context14.next = 17;
- return this.$app.remote_editor.evidence_list({
- num: this.num
- });
- case 17:
- response = _context14.sent;
- case 18:
- if (response.success && response.data && response.data.evidences) {
- response.data.evidences.map(function (trace) {
- if (trace.position) {
- trace.position = new THREE.Vector3(trace.position.x, trace.position.y, trace.position.z); // visiblePanos不知为何在obj场景里会有重复id,保险起见初始化统一去重
- trace.visiblePanos ? trace.visiblePanos = Array.from(new Set(trace.visiblePanos)).map(function (id) {
- return _this6.$app.core.get('Player').model.panos.index[id];
- }) : trace.visiblePanos = _this6.$app.TagManager.getVisiblePano(trace.position, {
- maxDis: 5
- });
- }
- return trace;
- });
- }
- logger$1.timeEnd("".concat(this.num, "[load traces]").concat(this.$app.uid)); // }
- _context14.next = 25;
- break;
- case 22:
- _context14.prev = 22;
- _context14.t0 = _context14["catch"](1);
- logger$1.error('loaded [traces] error', _context14.t0);
- case 25:
- data = {
- traces: response.data.evidences || [],
- icons: response.data.icons || []
- };
- this.$app.store.set('traces', data);
- return _context14.abrupt("return", data);
- case 28:
- case "end":
- return _context14.stop();
- }
- }
- }, _callee14, this, [[1, 22]]);
- }));
- function traces() {
- return _traces.apply(this, arguments);
- }
- return traces;
- }()
- }, {
- key: "tours",
- value: function () {
- var _tours = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee15() {
- var data, _metadata6;
- return regenerator.wrap(function _callee15$(_context15) {
- while (1) {
- switch (_context15.prev = _context15.next) {
- case 0:
- data = [];
- _context15.prev = 1;
- _context15.next = 4;
- return this.$app.store.get('metadata');
- case 4:
- _metadata6 = _context15.sent;
- if (!_metadata6.tours) {
- _context15.next = 9;
- break;
- }
- _context15.next = 8;
- return http.get(this.getUserResourceURL("tour.json"));
- case 8:
- data = _context15.sent;
- case 9:
- _context15.next = 14;
- break;
- case 11:
- _context15.prev = 11;
- _context15.t0 = _context15["catch"](1);
- logger$1.error('loaded [tour] error', _context15.t0);
- case 14:
- this.$app.store.set('tours', data);
- return _context15.abrupt("return", data);
- case 16:
- case "end":
- return _context15.stop();
- }
- }
- }, _callee15, this, [[1, 11]]);
- }));
- function tours() {
- return _tours.apply(this, arguments);
- }
- return tours;
- }()
- }, {
- key: "links",
- value: function () {
- var _links = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee16() {
- var _this7 = this;
- var _metadata7, data;
- return regenerator.wrap(function _callee16$(_context16) {
- while (1) {
- switch (_context16.prev = _context16.next) {
- case 0:
- _context16.prev = 0;
- _context16.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata7 = _context16.sent;
- data = null;
- if (!(this.mode === 'view')) {
- _context16.next = 15;
- break;
- }
- if (_metadata7.links) {
- _context16.next = 8;
- break;
- }
- return _context16.abrupt("return");
- case 8:
- _context16.next = 10;
- return http.get(this.getUserResourceURL("links.json"));
- case 10:
- data = _context16.sent;
- data = data.filter(function (tag) {
- return tag.panoId !== undefined || _this7.$app.core.get('Player').model.panos.get(tag.nearestPano);
- }); // 过滤掉无效Pano
- this.$app.store.set('links', data);
- _context16.next = 20;
- break;
- case 15:
- _context16.next = 17;
- return this.$app.remote_editor.linkPan_list({
- num: this.num
- });
- case 17:
- data = _context16.sent;
- data.data.tags = data.data.tags.filter(function (tag) {
- return tag.panoId !== undefined || _this7.$app.core.get('Player').model.panos.get(tag.nearestPano);
- }); // 过滤掉无效Pano
- this.$app.store.set('links', data.data);
- case 20:
- _context16.next = 25;
- break;
- case 22:
- _context16.prev = 22;
- _context16.t0 = _context16["catch"](0);
- logger$1.error('loaded [tour] error', _context16.t0);
- case 25:
- case "end":
- return _context16.stop();
- }
- }
- }, _callee16, this, [[0, 22]]);
- }));
- function links() {
- return _links.apply(this, arguments);
- }
- return links;
- }()
- }, {
- key: "cameras",
- value: function () {
- var _cameras = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee17() {
- var _metadata8, data;
- return regenerator.wrap(function _callee17$(_context17) {
- while (1) {
- switch (_context17.prev = _context17.next) {
- case 0:
- _context17.prev = 0;
- _context17.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata8 = _context17.sent;
- if (_metadata8.surveillances) {
- _context17.next = 6;
- break;
- }
- return _context17.abrupt("return");
- case 6:
- data = null;
- if (!(this.mode === 'view')) {
- _context17.next = 14;
- break;
- }
- _context17.next = 10;
- return http.get(this.getUserResourceURL("surveillance.json"));
- case 10:
- data = _context17.sent;
- this.$app.store.set('cameras', data);
- _context17.next = 18;
- break;
- case 14:
- _context17.next = 16;
- return this.$app.remote_editor.surveillance_list({
- num: this.num
- });
- case 16:
- data = _context17.sent;
- this.$app.store.set('cameras', data.data);
- case 18:
- _context17.next = 23;
- break;
- case 20:
- _context17.prev = 20;
- _context17.t0 = _context17["catch"](0);
- logger$1.error('loaded [cameras] error', _context17.t0);
- case 23:
- case "end":
- return _context17.stop();
- }
- }
- }, _callee17, this, [[0, 20]]);
- }));
- function cameras() {
- return _cameras.apply(this, arguments);
- }
- return cameras;
- }()
- }, {
- key: "sceneDraw",
- value: function () {
- var _sceneDraw = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee18() {
- var _metadata9, data;
- return regenerator.wrap(function _callee18$(_context18) {
- while (1) {
- switch (_context18.prev = _context18.next) {
- case 0:
- _context18.prev = 0;
- _context18.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata9 = _context18.sent;
- if (!(!_metadata9.sceneDraw && !_metadata9.hasSegAi)) {
- _context18.next = 6;
- break;
- }
- return _context18.abrupt("return");
- case 6:
- data = null;
- if (!(this.mode === 'view')) {
- _context18.next = 14;
- break;
- }
- _context18.next = 10;
- return http.get(this.getUserResourceURL("sceneDraw.json"));
- case 10:
- data = _context18.sent;
- this.$app.store.set('sceneDraw', data);
- _context18.next = 18;
- break;
- case 14:
- _context18.next = 16;
- return this.$app.remote_editor.sceneDraw_list({
- num: this.num
- });
- case 16:
- data = _context18.sent;
- this.$app.store.set('sceneDraw', data.data);
- case 18:
- _context18.next = 23;
- break;
- case 20:
- _context18.prev = 20;
- _context18.t0 = _context18["catch"](0);
- logger$1.error('loaded [sceneDraw] error', _context18.t0);
- case 23:
- case "end":
- return _context18.stop();
- }
- }
- }, _callee18, this, [[0, 20]]);
- }));
- function sceneDraw() {
- return _sceneDraw.apply(this, arguments);
- }
- return sceneDraw;
- }()
- }, {
- key: "mosaics",
- value: function () {
- var _mosaics = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee19() {
- var _metadata10, data;
- return regenerator.wrap(function _callee19$(_context19) {
- while (1) {
- switch (_context19.prev = _context19.next) {
- case 0:
- _context19.prev = 0;
- _context19.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata10 = _context19.sent;
- if (_metadata10.mosaic) {
- _context19.next = 6;
- break;
- }
- return _context19.abrupt("return");
- case 6:
- data = null;
- if (!(this.mode === 'view')) {
- _context19.next = 14;
- break;
- }
- _context19.next = 10;
- return http.get(this.getUserResourceURL("mosaic.json"));
- case 10:
- data = _context19.sent;
- this.$app.store.set('mosaics', data);
- _context19.next = 18;
- break;
- case 14:
- _context19.next = 16;
- return this.$app.remote_editor.mosaics_list({
- num: this.num
- });
- case 16:
- data = _context19.sent;
- this.$app.store.set('mosaics', data.data);
- case 18:
- _context19.next = 23;
- break;
- case 20:
- _context19.prev = 20;
- _context19.t0 = _context19["catch"](0);
- logger$1.error('loaded [tour] error', _context19.t0);
- case 23:
- case "end":
- return _context19.stop();
- }
- }
- }, _callee19, this, [[0, 20]]);
- }));
- function mosaics() {
- return _mosaics.apply(this, arguments);
- }
- return mosaics;
- }()
- }, {
- key: "filters",
- value: function () {
- var _filters = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee20() {
- var _metadata11, data;
- return regenerator.wrap(function _callee20$(_context20) {
- while (1) {
- switch (_context20.prev = _context20.next) {
- case 0:
- _context20.prev = 0;
- _context20.next = 3;
- return this.$app.store.get('metadata');
- case 3:
- _metadata11 = _context20.sent;
- if (_metadata11.filters) {
- _context20.next = 6;
- break;
- }
- return _context20.abrupt("return");
- case 6:
- data = null;
- if (!(this.mode === 'view')) {
- _context20.next = 14;
- break;
- }
- _context20.next = 10;
- return http.get(this.getUserResourceURL("filter.json"));
- case 10:
- data = _context20.sent;
- this.$app.store.set('filters', data);
- _context20.next = 18;
- break;
- case 14:
- _context20.next = 16;
- return this.$app.remote_editor.filter_list({
- num: this.num
- });
- case 16:
- data = _context20.sent;
- this.$app.store.set('filters', data.data);
- case 18:
- _context20.next = 23;
- break;
- case 20:
- _context20.prev = 20;
- _context20.t0 = _context20["catch"](0);
- logger$1.error('loaded [tour] error', _context20.t0);
- case 23:
- case "end":
- return _context20.stop();
- }
- }
- }, _callee20, this, [[0, 20]]);
- }));
- function filters() {
- return _filters.apply(this, arguments);
- }
- return filters;
- }()
- /**
- * 获取场景相关的资源图片
- * @param {*} path
- * @returns
- */
- }, {
- key: "getImage",
- value: function () {
- var _getImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee21(path) {
- var data;
- return regenerator.wrap(function _callee21$(_context21) {
- while (1) {
- switch (_context21.prev = _context21.next) {
- case 0:
- _context21.next = 2;
- return http.getImage("".concat(this.$app.config.resource).concat(path));
- case 2:
- data = _context21.sent;
- this.$app.store.set(path, data);
- return _context21.abrupt("return", data);
- case 5:
- case "end":
- return _context21.stop();
- }
- }
- }, _callee21, this);
- }));
- function getImage(_x2) {
- return _getImage.apply(this, arguments);
- }
- return getImage;
- }()
- }, {
- key: "getUserImage",
- value: function () {
- var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee22(path) {
- var data;
- return regenerator.wrap(function _callee22$(_context22) {
- while (1) {
- switch (_context22.prev = _context22.next) {
- case 0:
- data = http.getImage(this.getUserResourceURL(path));
- this.$app.store.set(path, data);
- return _context22.abrupt("return", data);
- case 3:
- case "end":
- return _context22.stop();
- }
- }
- }, _callee22, this);
- }));
- function getUserImage(_x3) {
- return _getUserImage.apply(this, arguments);
- }
- return getUserImage;
- }()
- /**
- * 获取SDK相关的资源图片
- * @param {*} path
- * @returns
- */
- }, {
- key: "getAppImage",
- value: function () {
- var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee23(path) {
- var data;
- return regenerator.wrap(function _callee23$(_context23) {
- while (1) {
- switch (_context23.prev = _context23.next) {
- case 0:
- _context23.next = 2;
- return http.getImage(this.base(path));
- case 2:
- data = _context23.sent;
- this.$app.store.set(path, data);
- return _context23.abrupt("return", data);
- case 5:
- case "end":
- return _context23.stop();
- }
- }
- }, _callee23, this);
- }));
- function getAppImage(_x4) {
- return _getAppImage.apply(this, arguments);
- }
- return getAppImage;
- }()
- }, {
- key: "getAppURL",
- value: function getAppURL(url) {
- return this.base(url);
- }
- /**
- * 获取服务器资源
- */
- }, {
- key: "getServerURL",
- value: function getServerURL(url) {
- return this.$app.config.server + url;
- }
- /**
- * 获取场景资源地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getResourceURL",
- value: function getResourceURL(url) {
- return this.$app.config.resource + url.replace(/\{num\}/g, this.num);
- }
- /**
- * 获取用户资源地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getUserResourceURL",
- value: function getUserResourceURL(url, clearCache, now) {
- if (!url || !url.trim()) {
- return url;
- }
- if (url.indexOf('data:image') === 0 || url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
- return url;
- }
- if (clearCache) {
- this.reload = true;
- }
- var full;
- if (url.indexOf('?t=') != -1) {
- full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url);
- } else {
- if (now) {
- //防止热点icon第一次查看抖动问题
- full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.nowTime);
- } else {
- full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.time);
- }
- var search = url.split('?')[1];
- if (search) {
- full += '&' + search;
- }
- }
- return full;
- }
- /**
- * 获取用户空间模型资源地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getUserModelResourceURL",
- value: function getUserModelResourceURL(url, clearCache) {
- if (!url || !url.trim()) {
- return url;
- }
- if (url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
- return url;
- }
- if (clearCache) {
- this.reload = true;
- }
- return this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/boxModels/").concat(url, "?_=").concat(this.time);
- }
- /**
- * 获取导览视频上传oss地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getTourVideoURL",
- value: function getTourVideoURL(url, clearCache) {
- if (clearCache) {
- this.reload = true;
- }
- return this.$app.config.resource + "".concat(url, "?_=").concat(this.time);
- }
- /**
- * 获取展示资源地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getViewResourceURL",
- value: function getViewResourceURL(url) {
- return this.$app.config.resource + "scene_view_data/".concat(this.num, "/").concat(url);
- }
- /**
- * 获取展示数据地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getViewDataURL",
- value: function getViewDataURL(url) {
- return this.$app.config.resource + "scene_view_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
- }
- /**
- * 获取编辑数据地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getEditDataURL",
- value: function getEditDataURL(url) {
- return this.$app.config.resource + "scene_edit_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
- }
- /**
- * 获取展示全景图地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getViewImagesURL",
- value: function getViewImagesURL(url) {
- if (url.indexOf('&_=') !== -1) {
- return url;
- }
- var version = url.indexOf('/panorama/') !== -1 ? this.linkVersion : this.imageVersion;
- if (url.indexOf('?') !== -1) {
- return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "&_=").concat(version);
- }
- return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "?_=").concat(version);
- }
- /**
- * 获取编辑页全景图地址
- * @param {*} url
- * @returns
- */
- }, {
- key: "getUserImagesURL",
- value: function getUserImagesURL(url) {
- var str;
- if (this.mode == 'view') {
- str = 'scene_view_data';
- } else {
- str = 'scene_edit_data';
- }
- if (url.indexOf('&_=') !== -1) {
- return url;
- } else if (url.indexOf('?') !== -1) {
- return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "&_=").concat(this.version);
- }
- return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "?_=").concat(this.version);
- }
- }]);
- return Resource;
- }();
- });
- /**
- * Make a map and return a function for checking if a key
- * is in that map.
- * IMPORTANT: all calls of this function must be prefixed with
- * \/\*#\_\_PURE\_\_\*\/
- * So that rollup can tree-shake them if necessary.
- */
- function makeMap(str, expectsLowerCase) {
- var map = Object.create(null);
- var list = str.split(',');
- for (var i = 0; i < list.length; i++) {
- map[list[i]] = true;
- }
- return expectsLowerCase ? function (val) {
- return !!map[val.toLowerCase()];
- } : function (val) {
- return !!map[val];
- };
- }
- Object.freeze({}) ;
- Object.freeze([]) ;
- var extend = Object.assign;
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- var hasOwn = function hasOwn(val, key) {
- return hasOwnProperty.call(val, key);
- };
- var isArray$1 = Array.isArray;
- var isMap = function isMap(val) {
- return toTypeString(val) === '[object Map]';
- };
- var isString$1 = function isString(val) {
- return typeof val === 'string';
- };
- var isSymbol = function isSymbol(val) {
- return typeof val === 'symbol';
- };
- var isObject$1 = function isObject(val) {
- return val !== null && typeof val === 'object';
- };
- var objectToString = Object.prototype.toString;
- var toTypeString = function toTypeString(value) {
- return objectToString.call(value);
- };
- var toRawType = function toRawType(value) {
- // extract "RawType" from strings like "[object RawType]"
- return toTypeString(value).slice(8, -1);
- };
- var isIntegerKey = function isIntegerKey(key) {
- return isString$1(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key;
- };
- var cacheStringFunction$1 = function cacheStringFunction(fn) {
- var cache = Object.create(null);
- return function (str) {
- var hit = cache[str];
- return hit || (cache[str] = fn(str));
- };
- };
- /**
- * @private
- */
- var capitalize = cacheStringFunction$1(function (str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
- });
- var hasChanged = function hasChanged(value, oldValue) {
- return !Object.is(value, oldValue);
- };
- 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; } } }; }
- 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); }
- 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; }
- var activeEffectScope;
- function recordEffectScope(effect) {
- var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : activeEffectScope;
- if (scope && scope.active) {
- scope.effects.push(effect);
- }
- }
- var createDep = function createDep(effects) {
- var dep = new Set(effects);
- dep.w = 0;
- dep.n = 0;
- return dep;
- };
- var wasTracked = function wasTracked(dep) {
- return (dep.w & trackOpBit) > 0;
- };
- var newTracked = function newTracked(dep) {
- return (dep.n & trackOpBit) > 0;
- };
- var initDepMarkers = function initDepMarkers(_ref) {
- var deps = _ref.deps;
- if (deps.length) {
- for (var i = 0; i < deps.length; i++) {
- deps[i].w |= trackOpBit; // set was tracked
- }
- }
- };
- var finalizeDepMarkers = function finalizeDepMarkers(effect) {
- var deps = effect.deps;
- if (deps.length) {
- var ptr = 0;
- for (var i = 0; i < deps.length; i++) {
- var dep = deps[i];
- if (wasTracked(dep) && !newTracked(dep)) {
- dep.delete(effect);
- } else {
- deps[ptr++] = dep;
- } // clear bits
- dep.w &= ~trackOpBit;
- dep.n &= ~trackOpBit;
- }
- deps.length = ptr;
- }
- };
- var targetMap = new WeakMap(); // The number of effects currently being tracked recursively.
- var effectTrackDepth = 0;
- var trackOpBit = 1;
- /**
- * The bitwise track markers support at most 30 levels of recursion.
- * This value is chosen to enable modern JS engines to use a SMI on all platforms.
- * When recursion depth is greater, fall back to using a full cleanup.
- */
- var maxMarkerBits = 30;
- var activeEffect;
- var ITERATE_KEY = Symbol('iterate' );
- var MAP_KEY_ITERATE_KEY = Symbol('Map key iterate' );
- var ReactiveEffect = /*#__PURE__*/function () {
- function ReactiveEffect(fn) {
- var scheduler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
- var scope = arguments.length > 2 ? arguments[2] : undefined;
- _classCallCheck(this, ReactiveEffect);
- this.fn = fn;
- this.scheduler = scheduler;
- this.active = true;
- this.deps = [];
- this.parent = undefined;
- recordEffectScope(this, scope);
- }
- _createClass(ReactiveEffect, [{
- key: "run",
- value: function run() {
- if (!this.active) {
- return this.fn();
- }
- var parent = activeEffect;
- var lastShouldTrack = shouldTrack;
- while (parent) {
- if (parent === this) {
- return;
- }
- parent = parent.parent;
- }
- try {
- this.parent = activeEffect;
- activeEffect = this;
- shouldTrack = true;
- trackOpBit = 1 << ++effectTrackDepth;
- if (effectTrackDepth <= maxMarkerBits) {
- initDepMarkers(this);
- } else {
- cleanupEffect(this);
- }
- return this.fn();
- } finally {
- if (effectTrackDepth <= maxMarkerBits) {
- finalizeDepMarkers(this);
- }
- trackOpBit = 1 << --effectTrackDepth;
- activeEffect = this.parent;
- shouldTrack = lastShouldTrack;
- this.parent = undefined;
- }
- }
- }, {
- key: "stop",
- value: function stop() {
- if (this.active) {
- cleanupEffect(this);
- if (this.onStop) {
- this.onStop();
- }
- this.active = false;
- }
- }
- }]);
- return ReactiveEffect;
- }();
- function cleanupEffect(effect) {
- var deps = effect.deps;
- if (deps.length) {
- for (var i = 0; i < deps.length; i++) {
- deps[i].delete(effect);
- }
- deps.length = 0;
- }
- }
- function effect$1(fn, options) {
- if (fn.effect) {
- fn = fn.effect.fn;
- }
- var _effect = new ReactiveEffect(fn);
- if (options) {
- extend(_effect, options);
- if (options.scope) recordEffectScope(_effect, options.scope);
- }
- if (!options || !options.lazy) {
- _effect.run();
- }
- var runner = _effect.run.bind(_effect);
- runner.effect = _effect;
- return runner;
- }
- function stop(runner) {
- runner.effect.stop();
- }
- var shouldTrack = true;
- var trackStack = [];
- function pauseTracking() {
- trackStack.push(shouldTrack);
- shouldTrack = false;
- }
- function resetTracking() {
- var last = trackStack.pop();
- shouldTrack = last === undefined ? true : last;
- }
- function track(target, type, key) {
- if (shouldTrack && activeEffect) {
- var depsMap = targetMap.get(target);
- if (!depsMap) {
- targetMap.set(target, depsMap = new Map());
- }
- var dep = depsMap.get(key);
- if (!dep) {
- depsMap.set(key, dep = createDep());
- }
- var eventInfo = {
- effect: activeEffect,
- target,
- type,
- key
- } ;
- trackEffects(dep, eventInfo);
- }
- }
- function trackEffects(dep, debuggerEventExtraInfo) {
- var shouldTrack = false;
- if (effectTrackDepth <= maxMarkerBits) {
- if (!newTracked(dep)) {
- dep.n |= trackOpBit; // set newly tracked
- shouldTrack = !wasTracked(dep);
- }
- } else {
- // Full cleanup mode.
- shouldTrack = !dep.has(activeEffect);
- }
- if (shouldTrack) {
- dep.add(activeEffect);
- activeEffect.deps.push(dep);
- if (activeEffect.onTrack) {
- activeEffect.onTrack(Object.assign({
- effect: activeEffect
- }, debuggerEventExtraInfo));
- }
- }
- }
- function trigger$1(target, type, key, newValue, oldValue, oldTarget) {
- var depsMap = targetMap.get(target);
- if (!depsMap) {
- // never been tracked
- return;
- }
- var deps = [];
- if (type === "clear"
- /* CLEAR */
- ) {
- // collection being cleared
- // trigger all effects for target
- deps = _toConsumableArray(depsMap.values());
- } else if (key === 'length' && isArray$1(target)) {
- depsMap.forEach(function (dep, key) {
- if (key === 'length' || key >= newValue) {
- deps.push(dep);
- }
- });
- } else {
- // schedule runs for SET | ADD | DELETE
- if (key !== void 0) {
- deps.push(depsMap.get(key));
- } // also run for iteration key on ADD | DELETE | Map.SET
- switch (type) {
- case "add"
- /* ADD */
- :
- if (!isArray$1(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- if (isMap(target)) {
- deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
- }
- } else if (isIntegerKey(key)) {
- // new index added to array -> length changes
- deps.push(depsMap.get('length'));
- }
- break;
- case "delete"
- /* DELETE */
- :
- if (!isArray$1(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- if (isMap(target)) {
- deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
- }
- }
- break;
- case "set"
- /* SET */
- :
- if (isMap(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- }
- break;
- }
- }
- var eventInfo = {
- target,
- type,
- key,
- newValue,
- oldValue,
- oldTarget
- } ;
- if (deps.length === 1) {
- if (deps[0]) {
- {
- triggerEffects(deps[0], eventInfo);
- }
- }
- } else {
- var effects = [];
- var _iterator = _createForOfIteratorHelper$4(deps),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var dep = _step.value;
- if (dep) {
- effects.push.apply(effects, _toConsumableArray(dep));
- }
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- {
- triggerEffects(createDep(effects), eventInfo);
- }
- }
- }
- function triggerEffects(dep, debuggerEventExtraInfo) {
- // spread into array for stabilization
- var _iterator2 = _createForOfIteratorHelper$4(isArray$1(dep) ? dep : _toConsumableArray(dep)),
- _step2;
- try {
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
- var _effect2 = _step2.value;
- if (_effect2 !== activeEffect || _effect2.allowRecurse) {
- if ("development" !== 'production' && _effect2.onTrigger) {
- _effect2.onTrigger(extend({
- effect: _effect2
- }, debuggerEventExtraInfo));
- }
- if (_effect2.scheduler) {
- _effect2.scheduler();
- } else {
- _effect2.run();
- }
- }
- }
- } catch (err) {
- _iterator2.e(err);
- } finally {
- _iterator2.f();
- }
- }
- var isNonTrackableKeys = /*#__PURE__*/makeMap("__proto__,__v_isRef,__isVue");
- var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) {
- return Symbol[key];
- }).filter(isSymbol));
- var get = /*#__PURE__*/createGetter();
- var readonlyGet = /*#__PURE__*/createGetter(true);
- var arrayInstrumentations = /*#__PURE__*/createArrayInstrumentations();
- function createArrayInstrumentations() {
- var instrumentations = {};
- ['includes', 'indexOf', 'lastIndexOf'].forEach(function (key) {
- instrumentations[key] = function () {
- var arr = toRaw(this);
- for (var i = 0, l = this.length; i < l; i++) {
- track(arr, "get"
- /* GET */
- , i + '');
- } // we run the method using the original args first (which may be reactive)
- for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
- args[_key3] = arguments[_key3];
- }
- var res = arr[key].apply(arr, args);
- if (res === -1 || res === false) {
- // if that didn't work, run it again using raw values.
- return arr[key].apply(arr, _toConsumableArray(args.map(toRaw)));
- } else {
- return res;
- }
- };
- });
- ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(function (key) {
- instrumentations[key] = function () {
- pauseTracking();
- for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
- args[_key4] = arguments[_key4];
- }
- var res = toRaw(this)[key].apply(this, args);
- resetTracking();
- return res;
- };
- });
- return instrumentations;
- }
- function createGetter() {
- var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- return function get(target, key, receiver) {
- if (key === "__v_isReactive"
- /* IS_REACTIVE */
- ) {
- return !isReadonly;
- } else if (key === "__v_isReadonly"
- /* IS_READONLY */
- ) {
- return isReadonly;
- } else if (key === "__v_isShallow"
- /* IS_SHALLOW */
- ) {
- return shallow;
- } else if (key === "__v_raw"
- /* RAW */
- && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
- return target;
- }
- var targetIsArray = isArray$1(target);
- if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
- return Reflect.get(arrayInstrumentations, key, receiver);
- }
- var res = Reflect.get(target, key, receiver);
- if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
- return res;
- }
- if (!isReadonly) {
- track(target, "get"
- /* GET */
- , key);
- }
- if (shallow) {
- return res;
- }
- if (isRef(res)) {
- // ref unwrapping - does not apply for Array + integer key.
- var shouldUnwrap = !targetIsArray || !isIntegerKey(key);
- return shouldUnwrap ? res.value : res;
- }
- if (isObject$1(res)) {
- // Convert returned value into a proxy as well. we do the isObject check
- // here to avoid invalid value warning. Also need to lazy access readonly
- // and reactive here to avoid circular dependency.
- return isReadonly ? readonly(res) : reactive(res);
- }
- return res;
- };
- }
- var set = /*#__PURE__*/createSetter();
- function createSetter() {
- var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- return function set(target, key, value, receiver) {
- var oldValue = target[key];
- if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
- return false;
- }
- if (!shallow && !isReadonly(value)) {
- if (!isShallow(value)) {
- value = toRaw(value);
- oldValue = toRaw(oldValue);
- }
- if (!isArray$1(target) && isRef(oldValue) && !isRef(value)) {
- oldValue.value = value;
- return true;
- }
- }
- var hadKey = isArray$1(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
- var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original
- if (target === toRaw(receiver)) {
- if (!hadKey) {
- trigger$1(target, "add"
- /* ADD */
- , key, value);
- } else if (hasChanged(value, oldValue)) {
- trigger$1(target, "set"
- /* SET */
- , key, value, oldValue);
- }
- }
- return result;
- };
- }
- function deleteProperty(target, key) {
- var hadKey = hasOwn(target, key);
- var oldValue = target[key];
- var result = Reflect.deleteProperty(target, key);
- if (result && hadKey) {
- trigger$1(target, "delete"
- /* DELETE */
- , key, undefined, oldValue);
- }
- return result;
- }
- function has(target, key) {
- var result = Reflect.has(target, key);
- if (!isSymbol(key) || !builtInSymbols.has(key)) {
- track(target, "has"
- /* HAS */
- , key);
- }
- return result;
- }
- function ownKeys$3(target) {
- track(target, "iterate"
- /* ITERATE */
- , isArray$1(target) ? 'length' : ITERATE_KEY);
- return Reflect.ownKeys(target);
- }
- var mutableHandlers = {
- get,
- set,
- deleteProperty,
- has,
- ownKeys: ownKeys$3
- };
- var readonlyHandlers = {
- get: readonlyGet,
- set(target, key) {
- {
- console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
- }
- return true;
- },
- deleteProperty(target, key) {
- {
- console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
- }
- return true;
- }
- };
- var toShallow = function toShallow(value) {
- return value;
- };
- var getProto = function getProto(v) {
- return Reflect.getPrototypeOf(v);
- };
- function get$1(target, key) {
- var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- // #1772: readonly(reactive(Map)) should return readonly + reactive version
- // of the value
- target = target["__v_raw"
- /* RAW */
- ];
- var rawTarget = toRaw(target);
- var rawKey = toRaw(key);
- if (key !== rawKey) {
- !isReadonly && track(rawTarget, "get"
- /* GET */
- , key);
- }
- !isReadonly && track(rawTarget, "get"
- /* GET */
- , rawKey);
- var _getProto = getProto(rawTarget),
- has = _getProto.has;
- var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
- if (has.call(rawTarget, key)) {
- return wrap(target.get(key));
- } else if (has.call(rawTarget, rawKey)) {
- return wrap(target.get(rawKey));
- } else if (target !== rawTarget) {
- // #3602 readonly(reactive(Map))
- // ensure that the nested reactive `Map` can do tracking for itself
- target.get(key);
- }
- }
- function has$1(key) {
- var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var target = this["__v_raw"
- /* RAW */
- ];
- var rawTarget = toRaw(target);
- var rawKey = toRaw(key);
- if (key !== rawKey) {
- !isReadonly && track(rawTarget, "has"
- /* HAS */
- , key);
- }
- !isReadonly && track(rawTarget, "has"
- /* HAS */
- , rawKey);
- return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
- }
- function size$2(target) {
- var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- target = target["__v_raw"
- /* RAW */
- ];
- !isReadonly && track(toRaw(target), "iterate"
- /* ITERATE */
- , ITERATE_KEY);
- return Reflect.get(target, 'size', target);
- }
- function add(value) {
- value = toRaw(value);
- var target = toRaw(this);
- var proto = getProto(target);
- var hadKey = proto.has.call(target, value);
- if (!hadKey) {
- target.add(value);
- trigger$1(target, "add"
- /* ADD */
- , value, value);
- }
- return this;
- }
- function set$1(key, value) {
- value = toRaw(value);
- var target = toRaw(this);
- var _getProto2 = getProto(target),
- has = _getProto2.has,
- get = _getProto2.get;
- var hadKey = has.call(target, key);
- if (!hadKey) {
- key = toRaw(key);
- hadKey = has.call(target, key);
- } else {
- checkIdentityKeys(target, has, key);
- }
- var oldValue = get.call(target, key);
- target.set(key, value);
- if (!hadKey) {
- trigger$1(target, "add"
- /* ADD */
- , key, value);
- } else if (hasChanged(value, oldValue)) {
- trigger$1(target, "set"
- /* SET */
- , key, value, oldValue);
- }
- return this;
- }
- function deleteEntry(key) {
- var target = toRaw(this);
- var _getProto3 = getProto(target),
- has = _getProto3.has,
- get = _getProto3.get;
- var hadKey = has.call(target, key);
- if (!hadKey) {
- key = toRaw(key);
- hadKey = has.call(target, key);
- } else {
- checkIdentityKeys(target, has, key);
- }
- var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions
- var result = target.delete(key);
- if (hadKey) {
- trigger$1(target, "delete"
- /* DELETE */
- , key, undefined, oldValue);
- }
- return result;
- }
- function clear() {
- var target = toRaw(this);
- var hadItems = target.size !== 0;
- var oldTarget = isMap(target) ? new Map(target) : new Set(target) ; // forward the operation before queueing reactions
- var result = target.clear();
- if (hadItems) {
- trigger$1(target, "clear"
- /* CLEAR */
- , undefined, undefined, oldTarget);
- }
- return result;
- }
- function createForEach(isReadonly, isShallow) {
- return function forEach(callback, thisArg) {
- var observed = this;
- var target = observed["__v_raw"
- /* RAW */
- ];
- var rawTarget = toRaw(target);
- var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
- !isReadonly && track(rawTarget, "iterate"
- /* ITERATE */
- , ITERATE_KEY);
- return target.forEach(function (value, key) {
- // important: make sure the callback is
- // 1. invoked with the reactive map as `this` and 3rd arg
- // 2. the value received should be a corresponding reactive/readonly.
- return callback.call(thisArg, wrap(value), wrap(key), observed);
- });
- };
- }
- function createIterableMethod(method, isReadonly, isShallow) {
- return function () {
- var target = this["__v_raw"
- /* RAW */
- ];
- var rawTarget = toRaw(target);
- var targetIsMap = isMap(rawTarget);
- var isPair = method === 'entries' || method === Symbol.iterator && targetIsMap;
- var isKeyOnly = method === 'keys' && targetIsMap;
- var innerIterator = target[method].apply(target, arguments);
- var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
- !isReadonly && track(rawTarget, "iterate"
- /* ITERATE */
- , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the
- // values emitted from the real iterator
- return {
- // iterator protocol
- next() {
- var _innerIterator$next = innerIterator.next(),
- value = _innerIterator$next.value,
- done = _innerIterator$next.done;
- return done ? {
- value,
- done
- } : {
- value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
- done
- };
- },
- // iterable protocol
- [Symbol.iterator]() {
- return this;
- }
- };
- };
- }
- function createReadonlyMethod(type) {
- return function () {
- {
- var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : "";
- console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this));
- }
- return type === "delete"
- /* DELETE */
- ? false : this;
- };
- }
- function createInstrumentations() {
- var mutableInstrumentations = {
- get(key) {
- return get$1(this, key);
- },
- get size() {
- return size$2(this);
- },
- has: has$1,
- add,
- set: set$1,
- delete: deleteEntry,
- clear,
- forEach: createForEach(false, false)
- };
- var shallowInstrumentations = {
- get(key) {
- return get$1(this, key, false, true);
- },
- get size() {
- return size$2(this);
- },
- has: has$1,
- add,
- set: set$1,
- delete: deleteEntry,
- clear,
- forEach: createForEach(false, true)
- };
- var readonlyInstrumentations = {
- get(key) {
- return get$1(this, key, true);
- },
- get size() {
- return size$2(this, true);
- },
- has(key) {
- return has$1.call(this, key, true);
- },
- add: createReadonlyMethod("add"
- /* ADD */
- ),
- set: createReadonlyMethod("set"
- /* SET */
- ),
- delete: createReadonlyMethod("delete"
- /* DELETE */
- ),
- clear: createReadonlyMethod("clear"
- /* CLEAR */
- ),
- forEach: createForEach(true, false)
- };
- var shallowReadonlyInstrumentations = {
- get(key) {
- return get$1(this, key, true, true);
- },
- get size() {
- return size$2(this, true);
- },
- has(key) {
- return has$1.call(this, key, true);
- },
- add: createReadonlyMethod("add"
- /* ADD */
- ),
- set: createReadonlyMethod("set"
- /* SET */
- ),
- delete: createReadonlyMethod("delete"
- /* DELETE */
- ),
- clear: createReadonlyMethod("clear"
- /* CLEAR */
- ),
- forEach: createForEach(true, true)
- };
- var iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
- iteratorMethods.forEach(function (method) {
- mutableInstrumentations[method] = createIterableMethod(method, false, false);
- readonlyInstrumentations[method] = createIterableMethod(method, true, false);
- shallowInstrumentations[method] = createIterableMethod(method, false, true);
- shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true);
- });
- return [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations];
- }
- var _createInstrumentatio = /* #__PURE__*/createInstrumentations(),
- _createInstrumentatio2 = _slicedToArray(_createInstrumentatio, 4),
- mutableInstrumentations = _createInstrumentatio2[0],
- readonlyInstrumentations = _createInstrumentatio2[1],
- shallowInstrumentations = _createInstrumentatio2[2],
- shallowReadonlyInstrumentations = _createInstrumentatio2[3];
- function createInstrumentationGetter(isReadonly, shallow) {
- var instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
- return function (target, key, receiver) {
- if (key === "__v_isReactive"
- /* IS_REACTIVE */
- ) {
- return !isReadonly;
- } else if (key === "__v_isReadonly"
- /* IS_READONLY */
- ) {
- return isReadonly;
- } else if (key === "__v_raw"
- /* RAW */
- ) {
- return target;
- }
- return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
- };
- }
- var mutableCollectionHandlers = {
- get: /*#__PURE__*/createInstrumentationGetter(false, false)
- };
- var readonlyCollectionHandlers = {
- get: /*#__PURE__*/createInstrumentationGetter(true, false)
- };
- function checkIdentityKeys(target, has, key) {
- var rawKey = toRaw(key);
- if (rawKey !== key && has.call(target, rawKey)) {
- var type = toRawType(target);
- 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.");
- }
- }
- var reactiveMap = new WeakMap();
- var shallowReactiveMap = new WeakMap();
- var readonlyMap = new WeakMap();
- var shallowReadonlyMap = new WeakMap();
- function targetTypeMap(rawType) {
- switch (rawType) {
- case 'Object':
- case 'Array':
- return 1
- /* COMMON */
- ;
- case 'Map':
- case 'Set':
- case 'WeakMap':
- case 'WeakSet':
- return 2
- /* COLLECTION */
- ;
- default:
- return 0
- /* INVALID */
- ;
- }
- }
- function getTargetType(value) {
- return value["__v_skip"
- /* SKIP */
- ] || !Object.isExtensible(value) ? 0
- /* INVALID */
- : targetTypeMap(toRawType(value));
- }
- function reactive(target) {
- // if trying to observe a readonly proxy, return the readonly version.
- if (isReadonly(target)) {
- return target;
- }
- return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
- }
- /**
- * Creates a readonly copy of the original object. Note the returned copy is not
- * made reactive, but `readonly` can be called on an already reactive object.
- */
- function readonly(target) {
- return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
- }
- function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
- if (!isObject$1(target)) {
- {
- console.warn("value cannot be made reactive: ".concat(String(target)));
- }
- return target;
- } // target is already a Proxy, return it.
- // exception: calling readonly() on a reactive object
- if (target["__v_raw"
- /* RAW */
- ] && !(isReadonly && target["__v_isReactive"
- /* IS_REACTIVE */
- ])) {
- return target;
- } // target already has corresponding Proxy
- var existingProxy = proxyMap.get(target);
- if (existingProxy) {
- return existingProxy;
- } // only a whitelist of value types can be observed.
- var targetType = getTargetType(target);
- if (targetType === 0
- /* INVALID */
- ) {
- return target;
- }
- var proxy = new Proxy(target, targetType === 2
- /* COLLECTION */
- ? collectionHandlers : baseHandlers);
- proxyMap.set(target, proxy);
- return proxy;
- }
- function isReadonly(value) {
- return !!(value && value["__v_isReadonly"
- /* IS_READONLY */
- ]);
- }
- function isShallow(value) {
- return !!(value && value["__v_isShallow"
- /* IS_SHALLOW */
- ]);
- }
- function toRaw(observed) {
- var raw = observed && observed["__v_raw"
- /* RAW */
- ];
- return raw ? toRaw(raw) : observed;
- }
- var toReactive = function toReactive(value) {
- return isObject$1(value) ? reactive(value) : value;
- };
- var toReadonly = function toReadonly(value) {
- return isObject$1(value) ? readonly(value) : value;
- };
- function isRef(r) {
- return !!(r && r.__v_isRef === true);
- }
- Promise.resolve();
- function _createForOfIteratorHelper$3(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
- function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); }
- function _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
- var queued = false;
- var queue = [];
- var p = Promise.resolve();
- var nextTick = function nextTick(fn) {
- return p.then(fn);
- };
- var queueJob = function queueJob(job) {
- if (!queue.includes(job)) queue.push(job);
- if (!queued) {
- queued = true;
- nextTick(flushJobs);
- }
- };
- var flushJobs = function flushJobs() {
- var _iterator = _createForOfIteratorHelper$3(queue),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var job = _step.value;
- job();
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- queue.length = 0;
- queued = false;
- };
- function normalizeStyle(value) {
- if (isArray(value)) {
- var res = {};
- for (var i = 0; i < value.length; i++) {
- var item = value[i];
- var normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
- if (normalized) {
- for (var key in normalized) {
- res[key] = normalized[key];
- }
- }
- }
- return res;
- } else if (isString(value)) {
- return value;
- } else if (isObject(value)) {
- return value;
- }
- }
- var listDelimiterRE = /;(?![^(]*\))/g;
- var propertyDelimiterRE = /:(.+)/;
- function parseStringStyle(cssText) {
- var ret = {};
- cssText.split(listDelimiterRE).forEach(function (item) {
- if (item) {
- var tmp = item.split(propertyDelimiterRE);
- tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
- }
- });
- return ret;
- }
- function normalizeClass(value) {
- var res = '';
- if (isString(value)) {
- res = value;
- } else if (isArray(value)) {
- for (var i = 0; i < value.length; i++) {
- var normalized = normalizeClass(value[i]);
- if (normalized) {
- res += normalized + ' ';
- }
- }
- } else if (isObject(value)) {
- for (var name in value) {
- if (value[name]) {
- res += name + ' ';
- }
- }
- }
- return res.trim();
- }
- function looseCompareArrays(a, b) {
- if (a.length !== b.length) return false;
- var equal = true;
- for (var i = 0; equal && i < a.length; i++) {
- equal = looseEqual(a[i], b[i]);
- }
- return equal;
- }
- function looseEqual(a, b) {
- if (a === b) return true;
- var aValidType = isDate(a);
- var bValidType = isDate(b);
- if (aValidType || bValidType) {
- return aValidType && bValidType ? a.getTime() === b.getTime() : false;
- }
- aValidType = isArray(a);
- bValidType = isArray(b);
- if (aValidType || bValidType) {
- return aValidType && bValidType ? looseCompareArrays(a, b) : false;
- }
- aValidType = isObject(a);
- bValidType = isObject(b);
- if (aValidType || bValidType) {
- /* istanbul ignore if: this if will probably never be called */
- if (!aValidType || !bValidType) {
- return false;
- }
- var aKeysCount = Object.keys(a).length;
- var bKeysCount = Object.keys(b).length;
- if (aKeysCount !== bKeysCount) {
- return false;
- }
- for (var key in a) {
- var aHasKey = a.hasOwnProperty(key);
- var bHasKey = b.hasOwnProperty(key);
- if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
- return false;
- }
- }
- }
- return String(a) === String(b);
- }
- function looseIndexOf(arr, val) {
- return arr.findIndex(function (item) {
- return looseEqual(item, val);
- });
- }
- Object.freeze({}) ;
- Object.freeze([]) ;
- var remove = function remove(arr, el) {
- var i = arr.indexOf(el);
- if (i > -1) {
- arr.splice(i, 1);
- }
- };
- var isArray = Array.isArray;
- var isDate = function isDate(val) {
- return val instanceof Date;
- };
- var isString = function isString(val) {
- return typeof val === 'string';
- };
- var isObject = function isObject(val) {
- return val !== null && typeof val === 'object';
- };
- var cacheStringFunction = function cacheStringFunction(fn) {
- var cache = Object.create(null);
- return function (str) {
- var hit = cache[str];
- return hit || (cache[str] = fn(str));
- };
- };
- var camelizeRE = /-(\w)/g;
- /**
- * @private
- */
- var camelize = cacheStringFunction(function (str) {
- return str.replace(camelizeRE, function (_, c) {
- return c ? c.toUpperCase() : '';
- });
- });
- var hyphenateRE = /\B([A-Z])/g;
- /**
- * @private
- */
- var hyphenate = cacheStringFunction(function (str) {
- return str.replace(hyphenateRE, '-$1').toLowerCase();
- });
- var toNumber = function toNumber(val) {
- var n = parseFloat(val);
- return isNaN(n) ? val : n;
- };
- var forceAttrRE = /^(spellcheck|draggable|form|list|type)$/;
- var bind = function bind(_ref) {
- var el = _ref.el,
- get = _ref.get,
- effect = _ref.effect,
- arg = _ref.arg,
- modifiers = _ref.modifiers;
- var prevValue; // record static class
- if (arg === 'class') {
- el._class = el.className;
- }
- effect(function () {
- var value = get();
- if (arg) {
- if (modifiers === null || modifiers === void 0 ? void 0 : modifiers.camel) {
- arg = camelize(arg);
- }
- setProp(el, arg, value, prevValue);
- } else {
- for (var key in value) {
- setProp(el, key, value[key], prevValue && prevValue[key]);
- }
- for (var _key in prevValue) {
- if (!value || !(_key in value)) {
- setProp(el, _key, null);
- }
- }
- }
- prevValue = value;
- });
- };
- var setProp = function setProp(el, key, value, prevValue) {
- if (key === 'class') {
- el.setAttribute('class', normalizeClass(el._class ? [el._class, value] : value) || '');
- } else if (key === 'style') {
- value = normalizeStyle(value);
- var style = el.style;
- if (!value) {
- el.removeAttribute('style');
- } else if (isString(value)) {
- if (value !== prevValue) style.cssText = value;
- } else {
- for (var _key2 in value) {
- setStyle(style, _key2, value[_key2]);
- }
- if (prevValue && !isString(prevValue)) {
- for (var _key3 in prevValue) {
- if (value[_key3] == null) {
- setStyle(style, _key3, '');
- }
- }
- }
- }
- } else if (!(el instanceof SVGElement) && key in el && !forceAttrRE.test(key)) {
- // @ts-ignore
- el[key] = value;
- if (key === 'value') {
- // @ts-ignore
- el._value = value;
- }
- } else {
- // special case for <input v-model type="checkbox"> with
- // :true-value & :false-value
- // store value as dom properties since non-string values will be
- // stringified.
- if (key === 'true-value') {
- el._trueValue = value;
- } else if (key === 'false-value') {
- el._falseValue = value;
- } else if (value != null) {
- el.setAttribute(key, value);
- } else {
- el.removeAttribute(key);
- }
- }
- };
- var importantRE = /\s*!important$/;
- var setStyle = function setStyle(style, name, val) {
- if (isArray(val)) {
- val.forEach(function (v) {
- return setStyle(style, name, v);
- });
- } else {
- if (name.startsWith('--')) {
- // custom property definition
- style.setProperty(name, val);
- } else {
- if (importantRE.test(val)) {
- // !important
- style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');
- } else {
- style[name] = val;
- }
- }
- }
- };
- var checkAttr = function checkAttr(el, name) {
- var val = el.getAttribute(name);
- if (val != null) el.removeAttribute(name);
- return val;
- };
- var listen = function listen(el, event, handler, options) {
- el.addEventListener(event, handler, options);
- };
- var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
- var systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];
- var modifierGuards = {
- stop: function stop(e) {
- return e.stopPropagation();
- },
- prevent: function prevent(e) {
- return e.preventDefault();
- },
- self: function self(e) {
- return e.target !== e.currentTarget;
- },
- ctrl: function ctrl(e) {
- return !e.ctrlKey;
- },
- shift: function shift(e) {
- return !e.shiftKey;
- },
- alt: function alt(e) {
- return !e.altKey;
- },
- meta: function meta(e) {
- return !e.metaKey;
- },
- left: function left(e) {
- return 'button' in e && e.button !== 0;
- },
- middle: function middle(e) {
- return 'button' in e && e.button !== 1;
- },
- right: function right(e) {
- return 'button' in e && e.button !== 2;
- },
- exact: function exact(e, modifiers) {
- return systemModifiers.some(function (m) {
- return e["".concat(m, "Key")] && !modifiers[m];
- });
- }
- };
- var on = function on(_ref) {
- var el = _ref.el,
- get = _ref.get,
- exp = _ref.exp,
- arg = _ref.arg,
- modifiers = _ref.modifiers;
- if (!arg) {
- {
- console.error("v-on=\"obj\" syntax is not supported in petite-vue.");
- }
- return;
- }
- var handler = simplePathRE.test(exp) ? get("(e => ".concat(exp, "(e))")) : get("($event => { ".concat(exp, " })")); // special lifecycle events
- if ((arg === 'mounted' || arg === 'unmounted')) {
- console.error("mounted and unmounted hooks now need to be prefixed with vue: " + "- use @vue:".concat(arg, "=\"handler\" instead."));
- }
- if (arg === 'vue:mounted') {
- nextTick(handler);
- return;
- } else if (arg === 'vue:unmounted') {
- return function () {
- return handler();
- };
- }
- if (modifiers) {
- // map modifiers
- if (arg === 'click') {
- if (modifiers.right) arg = 'contextmenu';
- if (modifiers.middle) arg = 'mouseup';
- }
- var raw = handler;
- handler = function handler(e) {
- if ('key' in e && !(hyphenate(e.key) in modifiers)) {
- return;
- }
- for (var key in modifiers) {
- var guard = modifierGuards[key];
- if (guard && guard(e, modifiers)) {
- return;
- }
- }
- return raw(e);
- };
- }
- listen(el, arg, handler, modifiers);
- };
- var show = function show(_ref) {
- var el = _ref.el,
- get = _ref.get,
- effect = _ref.effect;
- var initialDisplay = el.style.display;
- effect(function () {
- el.style.display = get() ? initialDisplay : 'none';
- });
- };
- var text = function text(_ref) {
- var el = _ref.el,
- get = _ref.get,
- effect = _ref.effect;
- effect(function () {
- el.textContent = toDisplayString(get());
- });
- };
- var toDisplayString = function toDisplayString(value) {
- return value == null ? '' : isObject(value) ? JSON.stringify(value, null, 2) : String(value);
- };
- var html = function html(_ref) {
- var el = _ref.el,
- get = _ref.get,
- effect = _ref.effect;
- effect(function () {
- el.innerHTML = get();
- });
- };
- var model = function model(_ref) {
- var el = _ref.el,
- exp = _ref.exp,
- get = _ref.get,
- effect = _ref.effect,
- modifiers = _ref.modifiers;
- var type = el.type;
- var assign = get("(val) => { ".concat(exp, " = val }"));
- var _ref2 = modifiers || {},
- trim = _ref2.trim,
- _ref2$number = _ref2.number,
- number = _ref2$number === void 0 ? type === 'number' : _ref2$number;
- if (el.tagName === 'SELECT') {
- var sel = el;
- listen(el, 'change', function () {
- var selectedVal = Array.prototype.filter.call(sel.options, function (o) {
- return o.selected;
- }).map(function (o) {
- return number ? toNumber(getValue(o)) : getValue(o);
- });
- assign(sel.multiple ? selectedVal : selectedVal[0]);
- });
- effect(function () {
- var value = get();
- var isMultiple = sel.multiple;
- for (var i = 0, l = sel.options.length; i < l; i++) {
- var option = sel.options[i];
- var optionValue = getValue(option);
- if (isMultiple) {
- if (isArray(value)) {
- option.selected = looseIndexOf(value, optionValue) > -1;
- } else {
- option.selected = value.has(optionValue);
- }
- } else {
- if (looseEqual(getValue(option), value)) {
- if (sel.selectedIndex !== i) sel.selectedIndex = i;
- return;
- }
- }
- }
- if (!isMultiple && sel.selectedIndex !== -1) {
- sel.selectedIndex = -1;
- }
- });
- } else if (type === 'checkbox') {
- listen(el, 'change', function () {
- var modelValue = get();
- var checked = el.checked;
- if (isArray(modelValue)) {
- var elementValue = getValue(el);
- var index = looseIndexOf(modelValue, elementValue);
- var found = index !== -1;
- if (checked && !found) {
- assign(modelValue.concat(elementValue));
- } else if (!checked && found) {
- var filtered = _toConsumableArray(modelValue);
- filtered.splice(index, 1);
- assign(filtered);
- }
- } else {
- assign(getCheckboxValue(el, checked));
- }
- });
- var oldValue;
- effect(function () {
- var value = get();
- if (isArray(value)) {
- el.checked = looseIndexOf(value, getValue(el)) > -1;
- } else if (value !== oldValue) {
- el.checked = looseEqual(value, getCheckboxValue(el, true));
- }
- oldValue = value;
- });
- } else if (type === 'radio') {
- listen(el, 'change', function () {
- assign(getValue(el));
- });
- var _oldValue;
- effect(function () {
- var value = get();
- if (value !== _oldValue) {
- el.checked = looseEqual(value, getValue(el));
- }
- });
- } else {
- // text-like
- var resolveValue = function resolveValue(val) {
- if (trim) return val.trim();
- if (number) return toNumber(val);
- return val;
- };
- listen(el, 'compositionstart', onCompositionStart);
- listen(el, 'compositionend', onCompositionEnd);
- listen(el, (modifiers === null || modifiers === void 0 ? void 0 : modifiers.lazy) ? 'change' : 'input', function () {
- if (el.composing) return;
- assign(resolveValue(el.value));
- });
- if (trim) {
- listen(el, 'change', function () {
- el.value = el.value.trim();
- });
- }
- effect(function () {
- if (el.composing) {
- return;
- }
- var curVal = el.value;
- var newVal = get();
- if (document.activeElement === el && resolveValue(curVal) === newVal) {
- return;
- }
- if (curVal !== newVal) {
- el.value = newVal;
- }
- });
- }
- };
- var getValue = function getValue(el) {
- return '_value' in el ? el._value : el.value;
- }; // retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
- var getCheckboxValue = function getCheckboxValue(el, checked) {
- var key = checked ? '_trueValue' : '_falseValue';
- return key in el ? el[key] : checked;
- };
- var onCompositionStart = function onCompositionStart(e) {
- e.target.composing = true;
- };
- var onCompositionEnd = function onCompositionEnd(e) {
- var target = e.target;
- if (target.composing) {
- target.composing = false;
- trigger(target, 'input');
- }
- };
- var trigger = function trigger(el, type) {
- var e = document.createEvent('HTMLEvents');
- e.initEvent(type, true, true);
- el.dispatchEvent(e);
- };
- var evalCache = Object.create(null);
- var evaluate = function evaluate(scope, exp, el) {
- return execute(scope, "return(".concat(exp, ")"), el);
- };
- var execute = function execute(scope, exp, el) {
- var fn = evalCache[exp] || (evalCache[exp] = toFunction(exp));
- try {
- return fn(scope, el);
- } catch (e) {
- {
- console.warn("Error when evaluating expression \"".concat(exp, "\":"));
- }
- console.error(e);
- }
- };
- var toFunction = function toFunction(exp) {
- try {
- return new Function("$data", "$el", "with($data){".concat(exp, "}"));
- } catch (e) {
- console.error("".concat(e.message, " in expression: ").concat(exp));
- return function () {};
- }
- };
- var effect = function effect(_ref) {
- var el = _ref.el,
- ctx = _ref.ctx,
- exp = _ref.exp,
- effect = _ref.effect;
- nextTick(function () {
- return effect(function () {
- return execute(ctx.scope, exp, el);
- });
- });
- };
- var builtInDirectives = {
- bind,
- on,
- show,
- text,
- html,
- model,
- effect
- };
- var _if = function _if(el, exp, ctx) {
- if (!exp.trim()) {
- console.warn("v-if expression cannot be empty.");
- }
- var parent = el.parentElement;
- var anchor = new Comment('v-if');
- parent.insertBefore(anchor, el);
- var branches = [{
- exp,
- el
- }]; // locate else branch
- var elseEl;
- var elseExp;
- while (elseEl = el.nextElementSibling) {
- elseExp = null;
- if (checkAttr(elseEl, 'v-else') === '' || (elseExp = checkAttr(elseEl, 'v-else-if'))) {
- parent.removeChild(elseEl);
- branches.push({
- exp: elseExp,
- el: elseEl
- });
- } else {
- break;
- }
- }
- var nextNode = el.nextSibling;
- parent.removeChild(el);
- var block;
- var activeBranchIndex = -1;
- var removeActiveBlock = function removeActiveBlock() {
- if (block) {
- parent.insertBefore(anchor, block.el);
- block.remove();
- block = undefined;
- }
- };
- ctx.effect(function () {
- for (var i = 0; i < branches.length; i++) {
- var _branches$i = branches[i],
- _exp = _branches$i.exp,
- _el = _branches$i.el;
- if (!_exp || evaluate(ctx.scope, _exp)) {
- if (i !== activeBranchIndex) {
- removeActiveBlock();
- block = new Block(_el, ctx);
- block.insert(parent, anchor);
- parent.removeChild(anchor);
- activeBranchIndex = i;
- }
- return;
- }
- } // no matched branch.
- activeBranchIndex = -1;
- removeActiveBlock();
- });
- return nextNode;
- };
- var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
- var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
- var stripParensRE = /^\(|\)$/g;
- var destructureRE = /^[{[]\s*((?:[\w_$]+\s*,?\s*)+)[\]}]$/;
- var _for = function _for(el, exp, ctx) {
- var inMatch = exp.match(forAliasRE);
- if (!inMatch) {
- console.warn("invalid v-for expression: ".concat(exp));
- return;
- }
- var nextNode = el.nextSibling;
- var parent = el.parentElement;
- var anchor = new Text('');
- parent.insertBefore(anchor, el);
- parent.removeChild(el);
- var sourceExp = inMatch[2].trim();
- var valueExp = inMatch[1].trim().replace(stripParensRE, '').trim();
- var destructureBindings;
- var isArrayDestructure = false;
- var indexExp;
- var objIndexExp;
- var keyAttr = 'key';
- var keyExp = el.getAttribute(keyAttr) || el.getAttribute(keyAttr = ':key') || el.getAttribute(keyAttr = 'v-bind:key');
- if (keyExp) {
- el.removeAttribute(keyAttr);
- if (keyAttr === 'key') keyExp = JSON.stringify(keyExp);
- }
- var match;
- if (match = valueExp.match(forIteratorRE)) {
- valueExp = valueExp.replace(forIteratorRE, '').trim();
- indexExp = match[1].trim();
- if (match[2]) {
- objIndexExp = match[2].trim();
- }
- }
- if (match = valueExp.match(destructureRE)) {
- destructureBindings = match[1].split(',').map(function (s) {
- return s.trim();
- });
- isArrayDestructure = valueExp[0] === '[';
- }
- var mounted = false;
- var blocks;
- var childCtxs;
- var keyToIndexMap;
- var createChildContexts = function createChildContexts(source) {
- var map = new Map();
- var ctxs = [];
- if (isArray(source)) {
- for (var i = 0; i < source.length; i++) {
- ctxs.push(createChildContext(map, source[i], i));
- }
- } else if (typeof source === 'number') {
- for (var _i = 0; _i < source; _i++) {
- ctxs.push(createChildContext(map, _i + 1, _i));
- }
- } else if (isObject(source)) {
- var _i2 = 0;
- for (var key in source) {
- ctxs.push(createChildContext(map, source[key], _i2++, key));
- }
- }
- return [ctxs, map];
- };
- var createChildContext = function createChildContext(map, value, index, objKey) {
- var data = {};
- if (destructureBindings) {
- destructureBindings.forEach(function (b, i) {
- return data[b] = value[isArrayDestructure ? i : b];
- });
- } else {
- data[valueExp] = value;
- }
- if (objKey) {
- indexExp && (data[indexExp] = objKey);
- objIndexExp && (data[objIndexExp] = index);
- } else {
- indexExp && (data[indexExp] = index);
- }
- var childCtx = createScopedContext(ctx, data);
- var key = keyExp ? evaluate(childCtx.scope, keyExp) : index;
- map.set(key, index);
- childCtx.key = key;
- return childCtx;
- };
- var mountBlock = function mountBlock(ctx, ref) {
- var block = new Block(el, ctx);
- block.key = ctx.key;
- block.insert(parent, ref);
- return block;
- };
- ctx.effect(function () {
- var source = evaluate(ctx.scope, sourceExp);
- var prevKeyToIndexMap = keyToIndexMap;
- var _createChildContexts = createChildContexts(source);
- var _createChildContexts2 = _slicedToArray(_createChildContexts, 2);
- childCtxs = _createChildContexts2[0];
- keyToIndexMap = _createChildContexts2[1];
- if (!mounted) {
- blocks = childCtxs.map(function (s) {
- return mountBlock(s, anchor);
- });
- mounted = true;
- } else {
- for (var _i3 = 0; _i3 < blocks.length; _i3++) {
- if (!keyToIndexMap.has(blocks[_i3].key)) {
- blocks[_i3].remove();
- }
- }
- var nextBlocks = [];
- var i = childCtxs.length;
- var nextBlock;
- var prevMovedBlock;
- while (i--) {
- var childCtx = childCtxs[i];
- var oldIndex = prevKeyToIndexMap.get(childCtx.key);
- var block = void 0;
- if (oldIndex == null) {
- // new
- block = mountBlock(childCtx, nextBlock ? nextBlock.el : anchor);
- } else {
- // update
- block = blocks[oldIndex];
- Object.assign(block.ctx.scope, childCtx.scope);
- if (oldIndex !== i) {
- // moved
- if (blocks[oldIndex + 1] !== nextBlock || // If the next has moved, it must move too
- prevMovedBlock === nextBlock) {
- prevMovedBlock = block;
- block.insert(parent, nextBlock ? nextBlock.el : anchor);
- }
- }
- }
- nextBlocks.unshift(nextBlock = block);
- }
- blocks = nextBlocks;
- }
- });
- return nextNode;
- };
- var ref = function ref(_ref) {
- var el = _ref.el,
- $refs = _ref.ctx.scope.$refs,
- get = _ref.get,
- effect = _ref.effect;
- var prevRef;
- effect(function () {
- var ref = get();
- $refs[ref] = el;
- if (prevRef && ref !== prevRef) {
- delete $refs[prevRef];
- }
- prevRef = ref;
- });
- return function () {
- prevRef && delete $refs[prevRef];
- };
- };
- var dirRE = /^(?:v-|:|@)/;
- var modifierRE = /\.([\w-]+)/g;
- var inOnce = false;
- var walk = function walk(node, ctx) {
- var type = node.nodeType;
- if (type === 1) {
- // Element
- var el = node;
- if (el.hasAttribute('v-pre')) {
- return;
- }
- checkAttr(el, 'v-cloak');
- var exp; // v-if
- if (exp = checkAttr(el, 'v-if')) {
- return _if(el, exp, ctx);
- } // v-for
- if (exp = checkAttr(el, 'v-for')) {
- return _for(el, exp, ctx);
- } // v-scope
- if ((exp = checkAttr(el, 'v-scope')) || exp === '') {
- var scope = exp ? evaluate(ctx.scope, exp) : {};
- ctx = createScopedContext(ctx, scope);
- if (scope.$template) {
- resolveTemplate(el, scope.$template);
- }
- } // v-once
- var hasVOnce = checkAttr(el, 'v-once') != null;
- if (hasVOnce) {
- inOnce = true;
- } // ref
- if (exp = checkAttr(el, 'ref')) {
- applyDirective(el, ref, "\"".concat(exp, "\""), ctx);
- } // process children first before self attrs
- walkChildren(el, ctx); // other directives
- var deferred = [];
- for (var _i = 0, _arr = _toConsumableArray(el.attributes); _i < _arr.length; _i++) {
- var _arr$_i = _arr[_i],
- name = _arr$_i.name,
- value = _arr$_i.value;
- if (dirRE.test(name) && name !== 'v-cloak') {
- if (name === 'v-model') {
- // defer v-model since it relies on :value bindings to be processed
- // first, but also before v-on listeners (#73)
- deferred.unshift([name, value]);
- } else if (name[0] === '@' || /^v-on\b/.test(name)) {
- deferred.push([name, value]);
- } else {
- processDirective(el, name, value, ctx);
- }
- }
- }
- for (var _i2 = 0, _deferred = deferred; _i2 < _deferred.length; _i2++) {
- var _deferred$_i = _slicedToArray(_deferred[_i2], 2),
- _name = _deferred$_i[0],
- _value = _deferred$_i[1];
- processDirective(el, _name, _value, ctx);
- }
- if (hasVOnce) {
- inOnce = false;
- }
- } else if (type === 3) {
- // Text
- var data = node.data;
- if (data.includes(ctx.delimiters[0])) {
- var segments = [];
- var lastIndex = 0;
- var match;
- while (match = ctx.delimitersRE.exec(data)) {
- var leading = data.slice(lastIndex, match.index);
- if (leading) segments.push(JSON.stringify(leading));
- segments.push("$s(".concat(match[1], ")"));
- lastIndex = match.index + match[0].length;
- }
- if (lastIndex < data.length) {
- segments.push(JSON.stringify(data.slice(lastIndex)));
- }
- applyDirective(node, text, segments.join('+'), ctx);
- }
- } else if (type === 11) {
- walkChildren(node, ctx);
- }
- };
- var walkChildren = function walkChildren(node, ctx) {
- var child = node.firstChild;
- while (child) {
- child = walk(child, ctx) || child.nextSibling;
- }
- };
- var processDirective = function processDirective(el, raw, exp, ctx) {
- var dir;
- var arg;
- var modifiers; // modifiers
- raw = raw.replace(modifierRE, function (_, m) {
- (modifiers || (modifiers = {}))[m] = true;
- return '';
- });
- if (raw[0] === ':') {
- dir = bind;
- arg = raw.slice(1);
- } else if (raw[0] === '@') {
- dir = on;
- arg = raw.slice(1);
- } else {
- var argIndex = raw.indexOf(':');
- var dirName = argIndex > 0 ? raw.slice(2, argIndex) : raw.slice(2);
- dir = builtInDirectives[dirName] || ctx.dirs[dirName];
- arg = argIndex > 0 ? raw.slice(argIndex + 1) : undefined;
- }
- if (dir) {
- if (dir === bind && arg === 'ref') dir = ref;
- applyDirective(el, dir, exp, ctx, arg, modifiers);
- el.removeAttribute(raw);
- } else {
- console.error("unknown custom directive ".concat(raw, "."));
- }
- };
- var applyDirective = function applyDirective(el, dir, exp, ctx, arg, modifiers) {
- var get = function get() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : exp;
- return evaluate(ctx.scope, e, el);
- };
- var cleanup = dir({
- el,
- get,
- effect: ctx.effect,
- ctx,
- exp,
- arg,
- modifiers
- });
- if (cleanup) {
- ctx.cleanups.push(cleanup);
- }
- };
- var resolveTemplate = function resolveTemplate(el, template) {
- if (template[0] === '#') {
- var templateEl = document.querySelector(template);
- if (!templateEl) {
- console.error("template selector ".concat(template, " has no matching <template> element."));
- }
- el.appendChild(templateEl.content.cloneNode(true));
- return;
- }
- el.innerHTML = template;
- };
- var createContext = function createContext(parent) {
- var ctx = Object.assign(Object.assign({
- delimiters: ['{{', '}}'],
- delimitersRE: /\{\{([^]+?)\}\}/g
- }, parent), {
- scope: parent ? parent.scope : reactive({}),
- dirs: parent ? parent.dirs : {},
- effects: [],
- blocks: [],
- cleanups: [],
- effect: function effect(fn) {
- if (inOnce) {
- queueJob(fn);
- return fn;
- }
- var e = effect$1(fn, {
- scheduler: function scheduler() {
- return queueJob(e);
- }
- });
- ctx.effects.push(e);
- return e;
- }
- });
- return ctx;
- };
- var createScopedContext = function createScopedContext(ctx) {
- var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var parentScope = ctx.scope;
- var mergedScope = Object.create(parentScope);
- Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data));
- mergedScope.$refs = Object.create(parentScope.$refs);
- var reactiveProxy = reactive(new Proxy(mergedScope, {
- set(target, key, val, receiver) {
- // when setting a property that doesn't exist on current scope,
- // do not create it on the current scope and fallback to parent scope.
- if (receiver === reactiveProxy && !target.hasOwnProperty(key)) {
- return Reflect.set(parentScope, key, val);
- }
- return Reflect.set(target, key, val, receiver);
- }
- }));
- bindContextMethods(reactiveProxy);
- return Object.assign(Object.assign({}, ctx), {
- scope: reactiveProxy
- });
- };
- var bindContextMethods = function bindContextMethods(scope) {
- for (var _i = 0, _Object$keys = Object.keys(scope); _i < _Object$keys.length; _i++) {
- var key = _Object$keys[_i];
- if (typeof scope[key] === 'function') {
- scope[key] = scope[key].bind(scope);
- }
- }
- };
- var Block = /*#__PURE__*/function () {
- function Block(template, parentCtx) {
- var isRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- _classCallCheck(this, Block);
- this.isFragment = template instanceof HTMLTemplateElement;
- if (isRoot) {
- this.template = template;
- } else if (this.isFragment) {
- this.template = template.content.cloneNode(true);
- } else {
- this.template = template.cloneNode(true);
- }
- if (isRoot) {
- this.ctx = parentCtx;
- } else {
- // create child context
- this.parentCtx = parentCtx;
- parentCtx.blocks.push(this);
- this.ctx = createContext(parentCtx);
- }
- walk(this.template, this.ctx);
- }
- _createClass(Block, [{
- key: "el",
- get: function get() {
- return this.start || this.template;
- }
- }, {
- key: "insert",
- value: function insert(parent) {
- var anchor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
- if (this.isFragment) {
- if (this.start) {
- // already inserted, moving
- var node = this.start;
- var next;
- while (node) {
- next = node.nextSibling;
- parent.insertBefore(node, anchor);
- if (node === this.end) break;
- node = next;
- }
- } else {
- this.start = new Text('');
- this.end = new Text('');
- parent.insertBefore(this.end, anchor);
- parent.insertBefore(this.start, this.end);
- parent.insertBefore(this.template, this.end);
- }
- } else {
- parent.insertBefore(this.template, anchor);
- }
- }
- }, {
- key: "remove",
- value: function remove$1() {
- if (this.parentCtx) {
- remove(this.parentCtx.blocks, this);
- }
- if (this.start) {
- var parent = this.start.parentNode;
- var node = this.start;
- var next;
- while (node) {
- next = node.nextSibling;
- parent.removeChild(node);
- if (node === this.end) break;
- node = next;
- }
- } else {
- this.template.parentNode.removeChild(this.template);
- }
- this.teardown();
- }
- }, {
- key: "teardown",
- value: function teardown() {
- this.ctx.blocks.forEach(function (child) {
- child.teardown();
- });
- this.ctx.effects.forEach(stop);
- this.ctx.cleanups.forEach(function (fn) {
- return fn();
- });
- }
- }]);
- return Block;
- }();
- var escapeRegex = function escapeRegex(str) {
- return str.replace(/[-.*+?^${}()|[\]\/\\]/g, '\\$&');
- };
- var createApp = function createApp(initialData) {
- // root context
- var ctx = createContext();
- if (initialData) {
- ctx.scope = reactive(initialData);
- bindContextMethods(ctx.scope); // handle custom delimiters
- if (initialData.$delimiters) {
- var _ctx$delimiters = ctx.delimiters = initialData.$delimiters,
- _ctx$delimiters2 = _slicedToArray(_ctx$delimiters, 2),
- open = _ctx$delimiters2[0],
- close = _ctx$delimiters2[1];
- ctx.delimitersRE = new RegExp(escapeRegex(open) + '([^]+?)' + escapeRegex(close), 'g');
- }
- } // global internal helpers
- ctx.scope.$s = toDisplayString;
- ctx.scope.$nextTick = nextTick;
- ctx.scope.$refs = Object.create(null);
- var rootBlocks;
- return {
- directive(name, def) {
- if (def) {
- ctx.dirs[name] = def;
- return this;
- } else {
- return ctx.dirs[name];
- }
- },
- mount(el) {
- if (typeof el === 'string') {
- el = document.querySelector(el);
- if (!el) {
- console.error("selector ".concat(el, " has no matching element."));
- return;
- }
- }
- el = el || document.documentElement;
- var roots;
- if (el.hasAttribute('v-scope')) {
- roots = [el];
- } else {
- roots = _toConsumableArray(el.querySelectorAll("[v-scope]")).filter(function (root) {
- return !root.matches("[v-scope] [v-scope]");
- });
- }
- if (!roots.length) {
- roots = [el];
- }
- if (roots.length === 1 && roots[0] === document.documentElement) {
- 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`.");
- }
- rootBlocks = roots.map(function (el) {
- return new Block(el, ctx, true);
- });
- return this;
- },
- unmount() {
- rootBlocks.forEach(function (block) {
- return block.teardown();
- });
- }
- };
- };
- var s = document.currentScript;
- if (s && s.hasAttribute('init')) {
- createApp().mount();
- }
- var PetiteVue = /*#__PURE__*/Object.freeze({
- __proto__: null,
- createApp: createApp,
- nextTick: nextTick,
- reactive: reactive
- });
- var base64ToBlob = function base64ToBlob(base64) {
- var arr = base64.split(','),
- mime = arr[0].match(/:(.*?);/)[1],
- bstr = atob(arr[1]),
- n = bstr.length,
- u8arr = new Uint8Array(n);
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n);
- }
- return new Blob([u8arr], {
- type: mime
- });
- };
- function convertBlob2File(blob, name) {
- return new File([blob], name, {
- type: blob.type
- });
- }
- function download(blob, name) {
- if (!blob || !name) {
- return;
- }
- var objectUrl = window.URL.createObjectURL(blob);
- var a = document.createElement('a');
- a.href = objectUrl;
- a.download = name;
- a.click();
- a.remove();
- window.URL.revokeObjectURL(objectUrl);
- }
- function downloadFromURL(url, name) {
- return new Promise( /*#__PURE__*/function () {
- var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {
- var response, blob;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- if (!(!url || !name)) {
- _context.next = 2;
- break;
- }
- return _context.abrupt("return", reject("url or name is null"));
- case 2:
- if (!(url instanceof Blob)) {
- _context.next = 7;
- break;
- }
- download(url, name);
- resolve(true);
- _context.next = 19;
- break;
- case 7:
- if (!(url.indexOf('data:') === 0)) {
- _context.next = 12;
- break;
- }
- download(base64ToBlob(url), name);
- resolve(true);
- _context.next = 19;
- break;
- case 12:
- _context.next = 14;
- return fetch(url);
- case 14:
- response = _context.sent;
- _context.next = 17;
- return response.blob();
- case 17:
- blob = _context.sent;
- // 创建隐藏的可下载链接
- if (blob) {
- download(blob, name);
- resolve(true);
- } else {
- reject(false);
- }
- case 19:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function (_x, _x2) {
- return _ref.apply(this, arguments);
- };
- }());
- }
- var file = /*#__PURE__*/Object.freeze({
- __proto__: null,
- base64ToBlob: base64ToBlob,
- convertBlob2File: convertBlob2File,
- download: download,
- downloadFromURL: downloadFromURL
- });
- 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); }; }
- 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; } }
- var vec1 = new THREE.Vector3(),
- vec2 = new THREE.Vector3(),
- vec3 = new THREE.Vector3();
- var quat1 = new THREE.Quaternion(),
- quat2 = new THREE.Quaternion();
- var cameraModel; // 监控相机颜色
- var normalColor = new THREE.Color(1, 1, 1);
- var hoverColor = new THREE.Color(2, 2, 2);
- /**
- * 监控相机
- */
- var SecurityCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
- _inherits(SecurityCamera, _THREE$PerspectiveCam);
- var _super = _createSuper$L(SecurityCamera);
- function SecurityCamera(control, options, videoPlayer) {
- var _this;
- _classCallCheck(this, SecurityCamera);
- _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);
- _this.shake = function () {
- var id0 = transitions$1.getUniqueId(),
- id1 = transitions$1.getUniqueId();
- var _self = _assertThisInitialized(_this);
- var targetQuat;
- return function shake(needsShake) {
- targetQuat = targetQuat && targetQuat.equals(_self.shakingRange.to) ? _self.shakingRange.from : _self.shakingRange.to;
- if (needsShake) {
- transitions$1.start(lerp.quaternion(_self.quaternion, targetQuat), _self.shakingDuration, null, 0, null, null, id0);
- transitions$1.start(lerp.quaternion(_self.cylinder.quaternion, targetQuat), _self.shakingDuration, function () {
- return shake(true);
- }, 0, null, null, id1);
- } else {
- transitions$1.cancelById(id0);
- transitions$1.cancelById(id1);
- }
- };
- }();
- _this.options = options;
- _this.control = control;
- _this.player = _this.control.player;
- _this.videoPlayer = videoPlayer;
- _this.sid = options.sid;
- _this.name = options.name || '';
- _this.videoType = options.videoType;
- _this.type = 'SecurityCamera';
- _this.panoId = options.panoId;
- _this.videoSrc = options.video;
- _this.videoActive = false;
- _this.overWeight = options.overWeight;
- _this.shakingDuration = options.duration || 2000;
- _this.shakingRange = {
- from: new THREE.Quaternion(),
- to: new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2)
- };
- options.from && _this.shakingRange.from.setFromEuler(options.from);
- options.to && _this.shakingRange.to.setFromEuler(options.to);
- _this.posOri = options.posOri || new THREE.Vector3();
- _this.posOffset = options.posOffset || new THREE.Vector3(); // options.position && this.position.copy(options.position)
- _this.position.copy(_this.posOri).add(_this.posOffset); // target的优先级大于rotation
- if (options.target) {
- _this.target = options.target;
- _this.lookAt(options.target);
- } else {
- options.rotation && _this.quaternion.setFromEuler(options.rotation);
- _this.target = new THREE.Vector3(0, 0, -1).applyQuaternion(_this.quaternion).add(_this.position);
- }
- _this.cylinderNear = options.near || 0.03;
- _this.cylinderFar = options.far || 3;
- _this.roll = 0;
- _this.init(); // this.layers.toggle(RenderLayers.DEFAULT)
- _this.layers.enable(RenderLayers.PANOMARKERS);
- _this.layers.enable(RenderLayers.RETICULE);
- _this.player.model.add(_assertThisInitialized(_this));
- /* this.events = {
- onDomElementTouchStart: () => {
- if (this.shouldPlay) {
- console.log('onDomElementTouchStart')
- this.video.play()
- this.player.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart)
- }
- },
- } */
- return _this;
- } // 横滚角
- _createClass(SecurityCamera, [{
- key: "setRoll",
- value: function setRoll(angle) {
- this.roll = angle % 360;
- this.obj3d.quaternion.setFromAxisAngle(vec1.set(0, 0, -1), THREE.MathUtils.degToRad(angle));
- }
- }, {
- key: "yaw",
- get: function get() {
- // 左右转角
- var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
- var lookAtXZ = lookAt.setY(0);
- var frontDir = vec2.set(0, 0, 1);
- var frontCross = vec3.set(1, 0, 0);
- var angle = (THREE.MathUtils.radToDeg(lookAtXZ.angleTo(frontDir) * Math.sign(lookAtXZ.dot(frontCross))) + 180) % 360;
- if (angle > 180) angle = angle - 360;
- return angle;
- },
- set: function set(yaw) {
- var pitch = this.pitch; // 要先计算pitch,防止窜数据
- var upDir = vec1.set(0, 1, 0);
- var rightDir = vec2.set(1, 0, 0);
- var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
- var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
- this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
- this.updateTarget();
- }
- }, {
- key: "pitch",
- get: function get() {
- // 上下转角
- var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
- var projectVec = vec2.copy(lookAt).projectOnPlane(vec3.set(0, 1, 0));
- var pitch = THREE.MathUtils.radToDeg(lookAt.angleTo(projectVec) * Math.sign(lookAt.y)) % 180;
- if (pitch > 90) pitch = 90 - pitch;
- return pitch;
- },
- set: function set(pitch) {
- pitch = Math.min(Math.max(pitch, -89.9), 89.9); // 防止万向锁
- var yaw = this.yaw < 0 ? this.yaw + 360 : this.yaw;
- var upDir = vec1.set(0, 1, 0);
- var rightDir = vec2.set(1, 0, 0); //.applyQuaternion(this.quaternion)
- var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
- var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
- this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
- this.updateTarget();
- } // 监控镜头摇晃(暂未使用)
- }, {
- key: "init",
- value: function init() {
- var _this2 = this;
- // 投射体材质
- this.normalMat = new THREE.MeshBasicMaterial({
- color: Colors.mainColor,
- //0x00c8af,
- transparent: true,
- opacity: 0.1,
- side: THREE.DoubleSide,
- depthTest: false
- });
- this.build();
- this.options.pitch && (this.pitch = this.options.pitch);
- this.options.yaw && (this.yaw = this.options.yaw);
- this.options.roll && this.setRoll(this.options.roll);
- this.updateInfo(true);
- var video = this.createVideo();
- var canPlayed = function canPlayed(e) {
- _this2.player.$app.Camera.emit('SecurityCamera.videoActive', _this2.sid);
- _this2.videoActive = true; //console.error(' videoActive ',this.sid)
- // this.aspect = video.videoWidth / video.videoHeight
- //this.rebuildCylinder()
- _this2.updateInfo(true);
- };
- if (this.overWeight) {
- canPlayed(); //等点击时再报不能看
- } else if (this.videoSrc) {
- //console.error('createVideo', this.videoSrc, this.sid)
- video.onloadedmetadata = function () {
- video.canPlayed = true;
- video.masters.forEach(function (v) {
- //一个video可以对应多个camera,因为它们链接一样
- v.dispatchEvent({
- type: 'loadedmetadata'
- });
- });
- };
- if (video.canPlayed) {
- canPlayed();
- } else {
- this.addEventListener('loadedmetadata', canPlayed);
- }
- if (Hls.isSupported() && this.videoType !== 2) {
- //似乎Hls不支持就无法播放
- var hls = new Hls();
- hls.loadSource(this.videoSrc);
- hls.attachMedia(video);
- hls.on(Hls.Events.ERROR, function (event, data) {
- return console.log('HLS加载失败', event, data);
- });
- this.hlsVideoPlayer = hls;
- } // else {
- // console.log(video.src)
- // video.onerror = () => {
- // debugger
- // console.log('###replace')
- // video.src = this.videoSrc
- // video.src = video.src.replace('.flv', '.mp4')
- // }
- // //console.error('Hls is not Supported')
- // }
- this.play(); // ios需要
- this.pause();
- } // 监控视频材质
- this.videoMat = new THREE.MeshBasicMaterial({
- map: new THREE.VideoTexture(video),
- side: THREE.DoubleSide,
- depthTest: false,
- transparent: true // opacity: 0.5,
- });
- this.events = {
- setSize: function setSize(width, height) {
- if (_this2.isWatching) {
- _this2.updateAspect();
- }
- }
- };
- this.player.on('setSize', this.events.setSize);
- }
- }, {
- key: "updateAspect",
- value: function updateAspect() {
- //更新aspect且修改geometry
- var aspect = this.player.cameraControls.cameras.dollhouse.aspect;
- if (aspect != this.aspect) {
- this.aspect = aspect;
- this.updateMesh();
- }
- }
- }, {
- key: "updateMesh",
- value: function updateMesh() {
- var nearHeight, nearWidth, farHeight, farWidth;
- nearHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderNear;
- nearWidth = nearHeight * this.aspect;
- farHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderFar;
- farWidth = farHeight * this.aspect;
- /* if (this.control.player.$app.config.mobile) {
- ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
- ;[farHeight, farWidth] = [farWidth, farHeight]
- } */
- // 投射体(底面以外)
- var vertices = [],
- bottomVertices = [];
- vertices.push(-nearWidth, nearHeight, -this.cylinderNear);
- vertices.push(nearWidth, nearHeight, -this.cylinderNear);
- vertices.push(nearWidth, -nearHeight, -this.cylinderNear);
- vertices.push(-nearWidth, -nearHeight, -this.cylinderNear);
- bottomVertices.push(-farWidth, farHeight, -this.cylinderFar);
- bottomVertices.push(farWidth, farHeight, -this.cylinderFar);
- bottomVertices.push(farWidth, -farHeight, -this.cylinderFar);
- bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar);
- vertices = vertices.concat(bottomVertices);
- var firstBuild = !this.cylinder;
- if (firstBuild) {
- var uvs = [];
- uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
- uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
- var indexs = [];
- indexs.push(0, 1, 3, 2, 3, 1);
- indexs.push(0, 1, 4, 5, 4, 1);
- indexs.push(1, 2, 5, 6, 5, 2);
- indexs.push(2, 3, 6, 7, 6, 3);
- indexs.push(3, 0, 7, 4, 7, 0); // indexs.push(4, 7, 5, 6, 5, 7)
- var cylinderGeo = new THREE.BufferGeometry();
- cylinderGeo.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
- cylinderGeo.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
- this.cylinder = new THREE.Mesh(cylinderGeo, this.normalMat); //if (this.control.player.$app.config.mobile) this.cylinder.rotateZ(-Math.PI / 2) //用户自己旋转屏幕吧
- this.obj3d.add(this.cylinder);
- }
- this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3)); // 投射体底面 (视频)
- var bottomGeo = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2);
- if (firstBuild) {
- this.cylinder.bottom = new THREE.Mesh(bottomGeo, this.normalMat);
- this.cylinder.add(this.cylinder.bottom);
- } else {
- this.cylinder.bottom.geometry.dispose();
- this.cylinder.bottom.geometry = bottomGeo;
- }
- this.cylinder.bottom.position.set(0, 0, this.cylinderNear - this.cylinderFar); // 投射体线框
- if (firstBuild) {
- this.cylinder.line = new THREE.LineSegments(new THREE.EdgesGeometry(this.cylinder.geometry), new THREE.LineBasicMaterial({
- color: 0xffffff,
- opacity: 0.6,
- transparent: true
- }));
- this.cylinder.add(this.cylinder.line);
- } else {
- this.cylinder.line.geometry.dispose();
- this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry);
- }
- }
- }, {
- key: "createVideo",
- value: function createVideo(src) {
- src && (this.videoSrc = src);
- var video = this.videoPlayer.getVideo(this.videoSrc, this);
- this.video = video;
- return video;
- } // 创建投射体,加载摄像头模型
- }, {
- key: "build",
- value: function build() {
- this.obj3d = new THREE.Group();
- this.obj3d.camera = this;
- this.add(this.obj3d); // 摄像头
- if (!cameraModel) {
- var self = this;
- loaders.gltf(texture.getImageURL('images/camera.glb'), function (gltf) {
- self.tag = gltf.scene.children[0].children[0];
- self.tag.geometry.translate(30, 50, -10);
- self.tag.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, Math.PI, 0));
- self.obj3d.add(self.tag);
- cameraModel = self.tag.clone();
- });
- } else {
- this.tag = cameraModel.clone();
- this.obj3d.add(this.tag);
- }
- this.updateMesh();
- this.titleLabel = new TextSprite({
- text: this.name,
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- textshadowColor: '#888',
- borderRadius: 2,
- fontsize: 34,
- renderOrder: 5,
- margin: {
- x: 12,
- y: 10
- },
- //fixOrient:true,
- player: this.player,
- sizeInfo: {
- scale: 0.4,
- nearBound: 3
- }
- });
- this.titleLabel.sprite.material.depthTest = this.titleLabel.sprite.material.depthWrite = true;
- this.titleLabel.position.set(0, -0.2, 0.1);
- this.add(this.titleLabel);
- this.dispatchEvent({
- type: 'build'
- });
- } // 显示监控视频或显示投射体
- }, {
- key: "showVideo",
- value: function showVideo(isShow) {
- //console.warn('showVideo', this.info.sid, isShow )
- if (this.player.cameraControls.activeControl) {
- this.player.cameraControls.activeControl.enabled = isShow ? this.control.isEdit : true;
- }
- if (!this.videoActive) return;
- if (isShow) {
- /* if (browser.detectIOS()) {
- this.player.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true)
- } */
- this.play();
- this.normalMat.opacity = 0;
- common$1.updateVisible(this.cylinder, 'watch', true, 1, 'add');
- this.cylinder.bottom.material = this.videoMat; // this.player.$app.core.get('SceneRenderer').camera = this
- this.cylinder.bottom.renderOrder = RenderOrder.monitorPlane;
- } else {
- this.pause();
- this.normalMat.opacity = 0.08;
- common$1.updateVisible(this.cylinder, 'watch', false, 1, 'cancel');
- this.cylinder.bottom.material = this.normalMat; // this.player.$app.core.get('SceneRenderer').camera = this.player.camera
- this.cylinder.bottom.renderOrder = RenderOrder.visibleFloor;
- }
- }
- }, {
- key: "play",
- value: function play() {
- var _this3 = this;
- //console.log('play monitor', this.sid, this.videoSrc)
- this.shouldPlay = true;
- if (browser$1.detectWeixin()) {
- //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
- try {
- top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
- _this3.video.play();
- }, false);
- } catch (error) {
- this.video.play();
- }
- } else {
- this.video.play();
- if (this.video.paused) {
- console.log('播放不了');
- /* this.player.once('pointerStart', () => {
- this.play()
- }) */
- }
- }
- }
- }, {
- key: "pause",
- value: function pause() {
- this.shouldPlay = false;
- this.video.pause();
- } // 观看监控
- }, {
- key: "watch",
- value: function watch(watchPosition) {
- var _this4 = this;
- this.player.compass.setDisplay(false, true); //产品修改需求监控隐藏指南针 2024/3/18
- if (!this.player.$app.config.view) this.player.compass.switch('axis');
- this.updateAspect(); //console.warn("watch", this.sid)
- this.isWatching = true;
- var dollhouseControl = this.player.cameraControls.controls.dollhouse;
- dollhouseControl.minDistance = 0;
- dollhouseControl.minPolarAngle = -Math.PI;
- dollhouseControl.maxPolarAngle = Math.PI;
- dollhouseControl.mode = 'security';
- dollhouseControl.forbitSetRanges = true; //防止resize时minDistance改变
- this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
- if (!this.videoActive && !this.isNew) {
- //console.error('cannotWatchVideo', this.sid, this.videoSrc)
- this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.sid);
- } // 切换当前楼层
- var changeFloor = function changeFloor() {
- if (!_this4.player.model.panos.get(_this4.panoId)) return; //当无法获取到pano.floorIndex时无需切换楼层(#43674 监控所绑定的点位被删除)
- var floorIndex = _this4.player.model.panos.get(_this4.panoId).floorIndex;
- var currentFloorId = _this4.player.model.currentFloorId;
- if (currentFloorId != floorIndex
- /*&& currentFloorId != 'all'*/
- ) {
- _this4.player.$app.Scene.emit('Scene.gotoFloor', floorIndex); // 直接emit事件给UI就行,不用额外再调Scene.gotoFloor()
- }
- };
- transitions$1.cancelById('leaveMonitor');
- if (this.player.mode == Viewmode$1.DOLLHOUSE) {
- changeFloor();
- var activeControl = this.player.cameraControls.activeControl;
- transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', this.fov, function (v) {
- dollhouseControl.camera.staticFov = v;
- }), 1000);
- transitions$1.start(lerp.vector(activeControl.target, this.target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
- transitions$1.start(lerp.vector(activeControl.camera.position, watchPosition || this.position), 1000, function () {
- if (_this4.player.mode != Viewmode$1.DOLLHOUSE) return;
- _this4.showVideo(true);
- _this4.tag.material.color.copy(hoverColor);
- dollhouseControl.camera.near = 0.09; // 调太小的话摄像机会露出来
- }, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
- } else {
- dollhouseControl.camera.staticFov = dollhouseControl.camera.fov = this.fov;
- dollhouseControl.camera.updateProjectionMatrix(); // console.error("watch")
- this.player.flyToNewMode({
- mode: Viewmode$1.DOLLHOUSE,
- position: watchPosition || this.position,
- target: this.target,
- callback: function callback() {
- changeFloor();
- _this4.showVideo(true);
- _this4.tag.material.color.copy(hoverColor);
- dollhouseControl.camera.near = 0.09;
- }
- });
- }
- this.player.emit('beginShowMonitor');
- } // 停止观看监控
- }, {
- key: "leave",
- value: function leave() {
- var _this5 = this;
- this.player.compass.setDisplay(true, false); //产品修改需求监控隐藏指南针 2024/3/18
- if (!this.player.$app.config.view) this.player.compass.switch('direction'); //console.warn("leave", this.sid)
- this.showVideo(false);
- this.isWatching = false; // if (this.control.isEdit) {
- // this.player.reticule.visible = true
- // }
- this.tag.material.color.copy(normalColor);
- var dollhouseControl = this.player.cameraControls.controls.dollhouse;
- dollhouseControl.camera.near = 1;
- dollhouseControl.minPolarAngle = 25 / 180 * Math.PI;
- dollhouseControl.maxPolarAngle = Math.PI / 2;
- dollhouseControl.mode = 'model'; // transitions.start(lerp.property(dollhouseControl.camera, 'fov', 70), 200, () => dollhouseControl.camera.updateProjectionMatrix())
- transitions$1.cancelById('leaveMonitor');
- transitions$1.cancelById(settings$3.freeze.LookRotationForPlay); //xzw add
- var endFov = this.player.baseFov * (1 / this.player.zoomLevel);
- transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', endFov, function (v) {
- dollhouseControl.camera.staticFov = v;
- }), 1000, function () {
- dollhouseControl.camera.staticFov = null;
- dollhouseControl.camera.fov = endFov;
- dollhouseControl.camera.updateProjectionMatrix();
- dollhouseControl.forbitSetRanges = false;
- dollhouseControl.updateDistance(dollhouseControl.camera.aspect);
- _this5.player.emit('leavedShowMonitor');
- }, null, null, null, 'leaveMonitor');
- } // 设置position
- }, {
- key: "updatePosition",
- value: function updatePosition(position) {
- this.position.set(position.x, position.y, position.z);
- this.updateTarget();
- } // 设置rotation
- }, {
- key: "updateRotation",
- value: function updateRotation(rotation) {
- this.rotation.set(rotation.x, rotation.y, rotation.z);
- this.updateTarget();
- } // 设置target
- }, {
- key: "updateTarget",
- value: function updateTarget(target) {
- if (target) {
- this.target.set(target.x, target.y, target.z); //.sub(this.position).multiplyScalar(-1).add(this.position)
- this.lookAt(this.target);
- } else {
- this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
- }
- } // 根据fov、cylinderFar等数据更新线框
- /* rebuildCylinder() {
- this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position)
- let nearHeight, nearWidth, farHeight, farWidth
- if (this.aspect <= window.innerWidth / window.innerHeight) {
- nearHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear
- nearWidth = nearHeight * this.aspect
- farHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar
- farWidth = farHeight * this.aspect
- if (this.control.player.$app.config.mobile) {
- ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
- ;[farHeight, farWidth] = [farWidth, farHeight]
- }
- } else {
- nearWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear * (window.innerWidth / window.innerHeight)
- nearHeight = nearWidth / this.aspect
- farWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar * (window.innerWidth / window.innerHeight)
- farHeight = farWidth / this.aspect
- }
- // 投射体
- let vertices = [],
- bottomVertices = []
- vertices.push(-nearWidth, nearHeight, -this.cylinderNear)
- vertices.push(nearWidth, nearHeight, -this.cylinderNear)
- vertices.push(nearWidth, -nearHeight, -this.cylinderNear)
- vertices.push(-nearWidth, -nearHeight, -this.cylinderNear)
- bottomVertices.push(-farWidth, farHeight, -this.cylinderFar)
- bottomVertices.push(farWidth, farHeight, -this.cylinderFar)
- bottomVertices.push(farWidth, -farHeight, -this.cylinderFar)
- bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar)
- vertices = vertices.concat(bottomVertices)
- this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3))
- // this.cylinder.bottom.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(bottomVertices), 3))
- this.cylinder.bottom.geometry.dispose()
- this.cylinder.bottom.geometry = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2)
- // 投射体线框
- this.cylinder.line.geometry.dispose()
- this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry)
- } */
- /**
- * @param {*} isSave 是否保存当前数据
- * @returns 返回监控当前数据
- */
- }, {
- key: "updateInfo",
- value: function updateInfo(isSave) {
- var info = {
- sid: this.sid,
- name: this.name,
- panoId: this.panoId,
- posOri: {
- x: this.posOri.x,
- y: this.posOri.y,
- z: this.posOri.z
- },
- posOffset: {
- x: this.posOffset.x,
- y: this.posOffset.y,
- z: this.posOffset.z
- },
- fov: this.fov,
- aspect: this.aspect,
- far: this.cylinderFar,
- roll: Math.round(this.roll),
- pitch: Math.round(this.pitch),
- yaw: Math.round(this.yaw),
- /* playUrl */
- video: this.videoSrc,
- videoType: this.videoType
- };
- if (isSave) this.info = info;
- return info;
- }
- /* show(reason, level=0) {
- console.warn('show',this.info.sid, reason, level)
- if(!reason) common.updateVisible(this, 'common', true)
- else common.updateVisible(this, reason, true, level, 'add')
- }
- hide(reason, level=0) {
- if(!reason) common.updateVisible(this, 'common', true)
- else common.updateVisible(this, reason, false, level, 'cancel')
- } */
- }, {
- key: "dispose",
- value: function dispose() {
- var parent = this.parent;
- parent.remove(this);
- transitions$1.cancelById('cameraHighlight' + this.sid);
- this.tag.geometry.dispose();
- this.tag.material.dispose();
- this.cylinder.line.geometry.dispose();
- this.cylinder.line.material.dispose();
- this.cylinder.geometry.dispose();
- this.normalMat.dispose();
- this.videoMat.dispose();
- this.player.off('setSize', this.events.setSize);
- this.titleLabel.dispose();
- this.hlsVideoPlayer && this.hlsVideoPlayer.destroy();
- }
- }, {
- key: "highlight",
- value: function highlight(state) {
- if (this.hightlighted == state) return;
- this.hightlighted = state;
- transitions$1.cancelById('cameraHighlight' + this.sid);
- transitions$1.start(lerp.color(this.tag.material.color, state ? hoverColor : normalColor), 100, null, null, null, null, 'cameraHighlight' + this.sid);
- }
- }]);
- return SecurityCamera;
- }(THREE.PerspectiveCamera);
- /*
- xzw 2023.6.9
- 新增需求:视频永远铺满屏幕,而非和场景背景对应。
- 这样一来fov那些改变没有意义其实,只是mesh有直观变化,相机不变fov也行,只要能铺满。
-
- 视频mesh不需要旋转,在手机端时用户可以自行旋转手机来观看。电脑的话就只能自己把屏幕变窄了。
- */
- var SecurityControls = /*#__PURE__*/function () {
- function SecurityControls(player) {
- var _this = this;
- _classCallCheck(this, SecurityControls);
- this.onModeChange = function (fromMode, toMode) {
- // 在floorplan隐藏(编辑时跳到floorplan不用隐藏)
- if (fromMode == void 0 && toMode == void 0) {
- var modes = _this.player.modeTran.split('-');
- fromMode = modes[0], toMode = modes[1];
- }
- if (fromMode === Viewmode$1.FLOORPLAN) {
- _this.isFloorplan = false;
- _this.isEdit || _this.cameras.forEach(function (cam) {
- return common$1.updateVisible(cam, 'mode', true);
- }
- /* cam.show() */
- );
- }
- if (toMode === Viewmode$1.FLOORPLAN) {
- _this.isFloorplan = true;
- _this.isEdit || _this.cameras.forEach(function (cam) {
- return common$1.updateVisible(cam, 'mode', false);
- }
- /* cam.hide() */
- );
- }
- };
- this.app = player.$app;
- this.player = player;
- this.isEdit = false; // 是否进入编辑页面
- this.unbindDollhouse = false; // dollhouseCamera是否跟随当前监控一起动
- this.cameras = [];
- this.hoverCamera = null;
- this.watchingCamera = null; // 正在观看的相机
- this.editingCamera = null; // 正在编辑的相机
- this.selectType = null; // 相机还是投影面
- this.transformType = 0;
- this.hideCylinder = true; // 用于标明是否隐藏线框
- //this.isFloorplan = player.mode === Viewmode.FLOORPLAN // 用于在FLOORPLAN模式下隐藏obj3d
- // 退出监控的移动范围
- this.maxVisiAngle = Math.PI / 6;
- this.maxVisiZoom = 2;
- this.maxVisiDistance = 1;
- this.bindEvents();
- }
- _createClass(SecurityControls, [{
- key: "currentCamera",
- get: function get() {
- if (this.isEdit) {
- return this.editingCamera;
- } else {
- return this.watchingCamera;
- }
- }
- }, {
- key: "editingCamera",
- get: function get() {
- return this._editingCamera;
- },
- set: function set(c) {
- if (c != this._editingCamera) {
- this._editingCamera && common$1.updateVisible(this._editingCamera, 'edit', false, 2, 'cancel');
- if (c) common$1.updateVisible(c, 'edit', true, 2, 'add');
- this._editingCamera = c;
- }
- }
- }, {
- key: "addCamera",
- value: function addCamera(camera) {
- this.cameras.push(camera);
- }
- }, {
- key: "removeCamera",
- value: function removeCamera(camera) {
- // this.disableTransformControl()
- camera.isWatching && this.stopWatch();
- this.cameras = this.cameras.filter(function (c) {
- return c != camera;
- });
- camera.dispose();
- }
- /**
- * 观看监控
- * @param { Vector3 } watchPosition dollhose相机跳转位置,有则unbindDollhouse为true,无则默认监控位置
- */
- }, {
- key: "watch",
- value: function () {
- var _watch = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(camera, watchPosition) {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- if (!camera.overWeight) {
- _context.next = 2;
- break;
- }
- return _context.abrupt("return", this.player.$app.Camera.emit('fileOverSize', {
- sid: camera.sid
- }));
- case 2:
- if (!(this.player.mode == 'transitioning')) {
- _context.next = 4;
- break;
- }
- return _context.abrupt("return");
- case 4:
- if (!(this.app.Camera.monitor.locked && this.app.Camera.monitor.locked.then)) {
- _context.next = 7;
- break;
- }
- _context.next = 7;
- return this.app.Camera.monitor.locked;
- case 7:
- if (this.watchingCamera) {
- this.watchingCamera != camera && this.stopWatch();
- } else {
- // 只记录还没在watch时的状态
- this.lastViewState = {
- mode: this.player.mode,
- floorIndex: this.player.model.allFloorsVisible ? 'all' : this.player.model.currentFloorId,
- quaternion: this.player.quaternion.clone(),
- position: this.player.position.clone(),
- target: this.player.cameraControls.activeControl.target.clone(),
- currentScale: this.player.cameraControls.activeControl.currentScale
- };
- }
- camera.watch(watchPosition);
- this.watchingCamera = camera;
- this.player.$app.Camera.emit('SecurityCamera.watch', {
- sid: camera.sid,
- supportPlay: Hls.isSupported() || camera.videoActive
- }); //
- this.app.TagManager.switchAllDisplay(false, 'watchMonitor', {
- cameras: true
- }); // // 进入监控后,使currentPano变为监控所在pano
- // let pano = this.player.model.panos.get(camera.panoId)
- // if (pano.neighbourUUIDs.filter(id => id != pano.id).length > 0) {
- // this.player.currentPano = pano
- // } else {
- // let notAlonePano = this.player.model.panos.closestPanoTowardPoint({
- // point: camera.position,
- // require: [pano => pano.neighbourUUIDs.filter(id => id != pano.id).length > 0],
- // })
- // notAlonePano && (this.player.currentPano = notAlonePano)
- // }
- if (this.isEdit) {
- this.unbindDollhouse = !!watchPosition;
- this.editingCamera = camera;
- this.selectType = 'camera';
- this.player.$app.Camera.emit('SecurityCamera.select', this.currentCamera.updateInfo());
- }
- case 13:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function watch(_x, _x2) {
- return _watch.apply(this, arguments);
- }
- return watch;
- }()
- }, {
- key: "stopWatch",
- value: function stopWatch() {
- if (this.watchingCamera) {
- //console.error('stopWatch', this.watchingCamera.sid)
- this.watchingCamera.isWatching && this.watchingCamera.leave();
- this.player.$app.Camera.emit('SecurityCamera.stopWatch', this.watchingCamera.sid);
- this.watchingCamera = null;
- if (this.isEdit) {
- this.editingCamera = null;
- this.selectType = null;
- this.player.$app.Camera.emit('SecurityCamera.unselect');
- }
- this.app.TagManager.switchAllDisplay(true, 'watchMonitor', {
- cameras: true
- });
- }
- }
- }, {
- key: "hideAll",
- value: function hideAll(floorIndex) {
- var _this2 = this;
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
- var level = arguments.length > 2 ? arguments[2] : undefined;
- var type = arguments.length > 3 ? arguments[3] : undefined;
- this.cameras.forEach(function (cam) {
- if (floorIndex == void 0 || _this2.player.model.panos.get(cam.panoId) && _this2.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
- // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
- // /* cam != this.editingCamera && */ cam.hide(reason) // 编辑中的监控不会被隐藏
- common$1.updateVisible(cam, reason, false, level, type);
- }
- });
- }
- }, {
- key: "showAll",
- value: function showAll(floorIndex) {
- var _this3 = this;
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
- var level = arguments.length > 2 ? arguments[2] : undefined;
- var type = arguments.length > 3 ? arguments[3] : undefined;
- //if (this.isFloorplan) return
- this.cameras.forEach(function (cam) {
- if (floorIndex == void 0 || _this3.player.model.panos.get(cam.panoId) && _this3.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
- // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
- //cam.show(reason)
- common$1.updateVisible(cam, reason, true, level, type);
- }
- });
- } // enableTransformControl() {
- // this.player.model.transformControls.switchEditState('overlay')
- // }
- // disableTransformControl() {
- // this.player.model.transformControls.detach()
- // this.editingCamera && this.editingCamera.showVideo(false)
- // this.editingCamera = null
- // this.selectType = null
- // this.player.$app.Camera.emit('SecurityCamera.unselect')
- // }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- var _this4 = this;
- this.player.on('pointerUp', this.onMouseUp.bind(this));
- this.player.on('touchend', this.onMouseUp.bind(this));
- this.player.on('pointerMove', this.onMouseMove.bind(this));
- this.player.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this));
- {
- var cameraMeshes = [];
- this.player.on('collectIntersectMesh', function (meshes, e) {
- //推送要intersect的mesh
- cameraMeshes = _this4.cameras.filter(function (camera) {
- return camera.tag && camera.obj3d.visible;
- }).map(function (camera) {
- return camera.tag;
- });
- meshes.push.apply(meshes, _toConsumableArray(cameraMeshes));
- });
- this.player.on('judgeIntersect', function (intersect, e) {
- //判断是否intersect了overlay
- if (e.getConsumed()) return;
- if (intersect && cameraMeshes.includes(intersect.object)) {
- _this4.hoverCamera = intersect.object.parent.camera;
- _this4.player.$app.Camera.emit('SecurityCamera.hover', _this4.hoverCamera.sid);
- _this4.hoverCamera.highlight(true);
- CursorDeal.add('hoverMonitor');
- e.consume();
- } else {
- if (_this4.hoverCamera) {
- _this4.hoverCamera.highlight(false);
- _this4.hoverCamera = null;
- _this4.player.$app.Camera.emit('SecurityCamera.nothover');
- CursorDeal.remove('hoverMonitor');
- }
- }
- });
- }
- this.player.on(PlayerEvents.PanoChosen, function () {
- _this4.isEdit || _this4.stopWatch(); // 在浏览监控时退出当前监控
- });
- this.player.on(PlayerEvents.ModeChanging, function (currentMode, mode) {
- _this4.isEdit || _this4.stopWatch(); // 在浏览监控时退出当前监控
- _this4.onModeChange(currentMode, mode);
- });
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(e) {
- if (!this.hoverCamera) this.onMouseMove();
- if (this.hoverCamera && this.hoverCamera.visible === true) {
- e.consume();
- if (!this.hoverCamera.videoActive && !this.hoverCamera.isNew && this.app.config.view == true) {
- // #42503 在展示页时若监控无法播放不飞入
- this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.hoverCamera.sid);
- return;
- }
- this.watch(this.hoverCamera);
- }
- }
- }, {
- key: "onMouseMove",
- value: function onMouseMove() {
- if (this.watchingCamera && this.watchingCamera.isWatching) {
- if (this.isEdit) {
- if (this.player.mouseDown) {
- this.unbindDollhouse = true;
- }
- }
- }
- /* // hover 高亮
- let intersect = this.player.getMouseIntersect(
- null,
- this.cameras.filter(camera => camera.tag && camera.obj3d.visible).map(camera => camera.tag)
- )
- if (intersect) {
- this.hoverCamera = intersect.object.parent.camera
- if (!this.watchingCamera) {
- transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.hoverColor), 100)
- this.player.$app.Camera.emit('SecurityCamera.hover', this.hoverCamera.sid)
- }
- } else if (this.hoverCamera) {
- if (!this.watchingCamera) {
- transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.normalColor), 100)
- this.player.$app.Camera.emit('SecurityCamera.nothover')
- }
- this.hoverCamera = null
- } */
- }
- }, {
- key: "onMouseWheel",
- value: function onMouseWheel() {
- if (this.watchingCamera && this.watchingCamera.isWatching) {
- if (this.isEdit) {
- this.unbindDollhouse = true;
- }
- }
- }
- }]);
- return SecurityControls;
- }();
- 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); }; }
- 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; } }
- var TagSpot = /*#__PURE__*/function (_THREE$Group) {
- _inherits(TagSpot, _THREE$Group);
- var _super = _createSuper$K(TagSpot);
- function TagSpot(player) {
- var _this;
- _classCallCheck(this, TagSpot);
- _this = _super.call(this);
- _this.player = player;
- _this.renderOrder = RenderOrder.reticule;
- _this.name = 'TagSpot3d';
- _this.visible = false;
- _this.height = new THREE.Vector3(0, 0, 0.12);
- player.model.add(_assertThisInitialized(_this));
- _this.build();
- player.on('update', function (e) {
- if (e.lastFrameChanged) _this.updateSize();
- });
- return _this;
- }
- _createClass(TagSpot, [{
- key: "build",
- value: function build() {
- var tagMap = common$1.loadTextureFromCache(texture.getImageURL('images/tag_icon_default.png'));
- tagMap.minFilter = THREE.LinearMipMapLinearFilter;
- tagMap.generateMipmaps = true;
- var tag = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.15, 0.15, 1, 1), new THREE.MeshBasicMaterial({
- transparent: true,
- depthTest: false,
- map: tagMap
- }));
- tag.renderOrder = RenderOrder.tagDisc;
- tag.position.copy(this.height);
- this.topMesh = tag;
- this.add(tag);
- var stemLine = LineDraw.createLine([this.height, new THREE.Vector3(0, 0, 0)], {
- width: 2,
- color: '#eee'
- }); //垂线
- this.line = stemLine;
- this.add(stemLine);
- var arrowMap = common$1.loadTextureFromCache(texture.getImageURL('images/tag_pointer.png'));
- arrowMap.anisotropy = 5;
- arrowMap.minFilter = THREE.LinearMipMapLinearFilter;
- arrowMap.generateMipmaps = true;
- var arrow = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.35, 0.35, 1, 1), new THREE.MeshBasicMaterial({
- transparent: true,
- depthTest: false,
- map: arrowMap
- }));
- this.bottomMesh = arrow;
- this.add(arrow);
- }
- }, {
- key: "updateSize",
- value: function updateSize() {
- if (!this.visible) return;
- var s = math$2.getScaleForConstantSize({
- width2d: 500,
- position: this.position,
- player: this.player
- });
- this.topMesh.scale.set(s, s, s);
- }
- }]);
- return TagSpot;
- }(THREE.Group);
- 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); }; }
- 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; } }
- var maxFileSize = 50;
- var Monitor = /*#__PURE__*/function () {
- function Monitor(app) {
- var _this = this;
- _classCallCheck(this, Monitor);
- this.app = app;
- this.edit = {};
- this.isSingleView = false;
- this.locked = null;
- this.deferred = Deferred$1();
- if (!Hls.isSupported()) {
- console.error('Hls is not Supported, 部分监控视频可能不支持'); //iphoneX不支持 小米Civi 1S支持。
- }
- this.app.Scene.on('loaded', function () {
- var player = _this.app.core.get('Player');
- _this.control = new SecurityControls(player);
- !_this.app.config.view && !_this.app.config.mobile; //手机编辑页无法编辑监控所以当做展示页面处理
- //if (!Hls.isSupported() && !canEdit) return //不支持
- var nonsupportH5Video = window.MediaSource && browser$1.detectAndroidMobile();
- _this.videoPlayer = nonsupportH5Video ? new FlvVideoPlayer(player) : new H5VideoPlayer(player); // if (!this.app.config.mobile) {
- // // 移动端禁用监控
- // 初始数据
- var addMonitorsFromData = function addMonitorsFromData(arr) {
- // 编辑页要先隐藏cylinder
- //this.control.hideCylinder = true //showSurveilScope //canEdit 默认不显示范围
- arr.forEach(function (data) {
- var option = {
- sid: data.sid,
- name: data.name,
- panoId: data.panoId,
- video: data.urlType === 2 ? app.resource.getUserResourceURL(data.fileName) : data.playUrl,
- //1=m3u8 2=mp4
- posOri: new THREE.Vector3(parseFloat(data.data['posOri-x']), parseFloat(data.data['posOri-y']), parseFloat(data.data['posOri-z'])),
- posOffset: new THREE.Vector3(parseFloat(data.data['posOffset-x']), parseFloat(data.data['posOffset-y']), parseFloat(data.data['posOffset-z'])),
- fov: parseInt(data.data.fov),
- //纵向fov
- far: parseFloat(data.data.far),
- yaw: parseInt(data.data.yaw),
- roll: parseInt(data.data.roll),
- pitch: parseInt(data.data.pitch),
- videoType: data.urlType
- };
- if (_this.app.config.mobile && data.urlType === 2 && data.fileSize > (1 << 20) * maxFileSize) {
- option.overWeight = true;
- }
- if (nonsupportH5Video && data.urlType === 2) {
- option.video = option.video.replace('.mp4', '.flv');
- }
- var camera = new SecurityCamera(_this.control, option, _this.videoPlayer);
- _this.control.addCamera(camera);
- });
- _this.edit.hideCylinder(true); //默认关闭
- if (!_this.app.store.getValue('metadata').controls.showCameraTitle) {
- _this.changeTitlesShow(false);
- }
- _this.control.onModeChange();
- _this.deferred && _this.deferred.resolve();
- };
- var monitorData = _this.app.store.getValue('cameras');
- if (monitorData) addMonitorsFromData(monitorData);else _this.app.store.on('cameras', function (data) {
- return addMonitorsFromData(data);
- }); // }
- // 判断,激光场景在单屏内添加热点
- var isSingleView_ = function isSingleView_(metadata) {
- _this.isSingleView = metadata.sceneFrom == 'laser' || metadata.threeCamType == 'yzl';
- };
- var metadata = _this.app.store.getValue('metadata');
- if (metadata) isSingleView_(metadata);else _this.app.store.on('metadata', function (data) {
- return isSingleView_(data);
- }); // spot3d,用于单屏 -----------------------------------
- if (_this.isSingleView) {
- _this.spot3d = new TagSpot(player);
- _this.spot3d.visible = false;
- var intersectSpot3d;
- var lookAt = new THREE.Vector3(); // spot3d相关事件
- player.on('pointerStart', function (e) {
- if (!_this.isSingleView) return;
- if (!_this.editingCamera) return;
- if (intersectSpot3d) {
- _this.updateTagPos = true;
- player.cameraControls.activeControl.enabled = false;
- }
- });
- player.on('pointerMove', function (e) {
- if (!_this.isSingleView) return;
- if (!_this.editingCamera && !_this.updateTagPos) return;
- intersectSpot3d = player.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
- if (intersectSpot3d) {
- player.domElement.style.cursor = 'move';
- } else if (_this.editingCamera && !_this.updateTagPos) {
- player.domElement.style.cursor = 'default';
- }
- if (_this.updateTagPos) {
- var intersect = player.getMouseIntersect(null, player.OverlayManager.list.concat(player.model.colliders));
- if (intersect) {
- _this.spot3d.visible = true;
- _this.spot3d.position.copy(intersect.point);
- _this.spot3d.lookAt(lookAt.addVectors(intersect.point, intersect.normal));
- _this.spot3d.topMesh.lookAt(player.camera.position);
- _this.spot3d.updateSize();
- } else {
- _this.spot3d.visible = false;
- }
- }
- });
- player.on('pointerUp', function (e) {
- if (!_this.isSingleView) return;
- if (_this.spot3d && _this.spot3d.visible) {
- player.cameraControls.activeControl.enabled = true;
- player.cameraControls.activeControl.pointerDragOn = false;
- _this.updateTagPos = false;
- if (!_this.editingCamera) {
- _this.editingCamera = {
- position: _this.spot3d.position,
- sid: common$1.getRandomSid()
- };
- }
- }
- });
- } // --------------------------------------------------
- player.on('update', function () {
- // 显隐过滤
- if (_this.camPosChosing || // 选择监控位置时
- _this.control.isEdit || // 编辑监控时
- _this.app.TagManager.tagPosChosing || // 选择热点位置时
- _this.app.TagManager.tagInfoEditing || // 编辑热点时
- _this.app.TourManager.editing || // 进入导览模块
- _this.app.ViewLinkEdit.markView || // 编辑场景关联时
- player.currentPano.panoType == '360view' || player.paintEditor && player.paintEditor.painting || player.linkEditor && player.linkEditor.setPanoVisible || player.linkEditor && player.linkEditor.setTagVisible // 设置热点可视时
- ) {
- // 只显示正在观看的监控
- _this.control.cameras.forEach(function (camera) {
- //camera.obj3d.visible = !!camera.isWatching
- common$1.updateVisible(camera, 'hideAtSomePage', !!camera.isWatching);
- });
- } else {
- _this.control.cameras.forEach(function (camera) {
- //camera.obj3d.visible = true
- common$1.updateVisible(camera, 'hideAtSomePage', true);
- });
- }
- });
- });
- /**
- * ------------------------进入或离开当前模块--------------------------
- */
- this.edit.enterModule = function (isShowCylinder) {
- if (_this.control) {
- //this.edit.hideCylinder(!isShowCylinder) //说要默认不显示
- // 在进入模块的时候还必须传videoActive给UI
- setTimeout(function () {
- //等待侦听加上
- _this.control.cameras.forEach(function (camera) {
- camera.videoActive && _this.app.Camera.emit('SecurityCamera.videoActive', camera.sid);
- });
- }, 1);
- } else {
- _this.deferred.then(function () {
- return _this.edit.enterModule(isShowCylinder);
- });
- }
- };
- this.edit.leaveModule = function () {
- if (_this.control) ; else {
- _this.deferred = null;
- }
- };
- /**
- * ------------------------新增或编辑(确定坐标)---------------------
- */
- this.edit.enter = function (camera) {
- _this.editingCamera = camera;
- _this.camPosChosing = true;
- if (_this.isSingleView) {
- _this.app.TagManager.switchAllDisplay(false, 'editMonitor', {
- cameras: true
- });
- var player = _this.app.core.get('Player');
- player.reticule.visible = false;
- if (camera) {
- // 修改
- player.flyToPano({
- pano: player.model.panos.get(camera.panoId),
- lookAtPoint: camera.position.clone(),
- aimDuration: 500,
- checkAlone: true
- }, function () {
- player.locked = true;
- _this.updateTagPos = false;
- _this.spot3d.position.set(camera.position.x, camera.position.y, camera.position.z);
- _this.spot3d.updateSize();
- setTimeout(function () {
- var tagScreenPos = new THREE.Vector3(0, 0, 0);
- var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
- math$2.projectPositionToCanvas(camera.position, player.camera, tagScreenPos, player.domElement);
- math$2.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, player.domElement);
- var intersect = player.getMouseIntersect(tagNDCPos, player.OverlayManager.list.concat(player.model.colliders));
- intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(player.camera.position));
- _this.spot3d.visible = true;
- }, 10);
- });
- } else {
- // 新增
- _this.edit.cancelWatching();
- player.locked = true;
- _this.updateTagPos = true;
- _this.spot3d.position.set(0, 1000, 0);
- _this.spot3d.updateSize();
- _this.spot3d.visible = true;
- }
- } else {
- _this.app.core.get('Scene').getSplit('TAG').then(function (view) {
- if (_this.editHandle == void 0) {
- _this.editHandle = _this.app.withNewComponent('TagEditManager', view, {
- spotA: _this.app.dom.querySelector('.player[name="main"] .player-mark'),
- spotB: _this.app.dom.querySelector('.player[name="copy"] .player-mark')
- });
- }
- if (camera) {
- // 修改
- _this.editHandle.reSetPos(camera.position);
- } else {
- // 新增
- _this.editHandle.enter();
- }
- });
- }
- camera && common$1.updateVisible(camera.titleLabel, 'editPos', false);
- }; // 修改监控坐标
- this.edit.modify = function (sid) {
- _this.checkMonitorExist(sid, function (camera) {
- _this.edit.enter(camera);
- });
- }; // 退出坐标选择
- this.edit.exit = function () {
- var player = _this.app.core.get('Player');
- if (_this.isSingleView) {
- player.domElement.style.cursor = 'default';
- player.locked = false;
- player.reticule.visible = true;
- _this.spot3d.visible = false;
- _this.updateTagPos = false;
- _this.app.TagManager.switchAllDisplay(true, 'editMonitor', {
- cameras: true
- });
- } else {
- if (!_this.editHandle) {
- return;
- }
- app.core.get('Scene').restore('TAG');
- _this.editHandle.exit({
- cancel: true
- });
- setTimeout(function () {
- player.cameraControls.activeControl.camera.fov = 70;
- player.camera.fov = player.baseFov * (1 / player.zoomLevel);
- }, 50);
- }
- _this.editingCamera && _this.editingCamera.titleLabel && common$1.updateVisible(_this.editingCamera.titleLabel, 'editPos', true);
- _this.editingCamera = null;
- _this.camPosChosing = false;
- }; // 确认监控坐标
- this.edit.confirm = function (onlyExitWithPosition) {
- var player = _this.app.core.get('Player');
- if (_this.isSingleView) {
- if (!_this.editingCamera) return;
- if (!_this.spot3d.visible) {
- _this.edit.exit();
- return null;
- }
- var sid = _this.editingCamera.sid;
- var position = _this.spot3d.position;
- if (_this.editingCamera.type != 'SecurityCamera') {
- var panoId = player.currentPano.id;
- var camera = new SecurityCamera(_this.control, {
- sid,
- posOri: position,
- panoId,
- target: player.currentPano.position.clone()
- }, _this.videoPlayer);
- camera.isNew = true;
- _this.control.addCamera(camera);
- _this.control.editingCamera = camera;
- } else {
- _this.editingCamera.updatePosition(position);
- _this.editingCamera.posOri.copy(position);
- _this.editingCamera.posOffset.set(0, 0, 0);
- }
- _this.edit.exit();
- _this.edit.watch(sid, true, true);
- return sid;
- } else {
- if (!_this.editHandle) {
- return null;
- }
- var _this$editHandle$conf = _this.editHandle.confirmPos(),
- _position = _this$editHandle$conf.position,
- _sid = _this$editHandle$conf.sid;
- if (!_position) {
- onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
- return null;
- }
- if (!_this.editingCamera) {
- var _panoId = player.currentPano.id;
- var _camera = new SecurityCamera(_this.control, {
- sid: _sid,
- posOri: _position,
- panoId: _panoId,
- target: player.currentPano.position.clone()
- }, _this.videoPlayer);
- _camera.isNew = true;
- _this.control.addCamera(_camera);
- _this.control.editingCamera = _camera;
- } else {
- _sid = _this.editingCamera.sid;
- _this.editingCamera.updatePosition(_position);
- _this.editingCamera.posOri.copy(_position);
- _this.editingCamera.posOffset.set(0, 0, 0);
- _this.control.editingCamera = _this.editingCamera;
- }
- _this.edit.exit();
- setTimeout(function () {
- _this.edit.watch(_sid, true, true);
- }, 100);
- return _sid;
- }
- };
- /**
- * ----------------------------查看、删除、保存等---------------------------------
- */
- /**
- * 观看监控
- * @param { true | false } isEdit 是否是进入编辑
- * @param { true | false } isAdd 是否是新增监控
- */
- this.edit.watch = function () {
- var watchPosition = new THREE.Vector3();
- return function (sid, isEdit, isAdd) {
- _this.checkMonitorExist(sid, function (camera) {
- _this.control.isEdit = !!isEdit;
- if (isEdit) {
- _this.app.core.get('Player').locked = true;
- _this.app.core.get('Player').cameraControls.activeControl.enabled = true;
- common$1.updateVisible(camera.cylinder, 'enterEdit', true, 1, 'add');
- }
- if (isAdd) {
- watchPosition.set(-1.5, 0, 0.2).applyQuaternion(camera.quaternion).add(camera.position);
- _this.control.watch(camera, watchPosition);
- } else {
- _this.control.watch(camera);
- }
- });
- if (isEdit || isAdd) {
- _this.app.core.get('Player').modelSideManager.tempAuto();
- }
- };
- }(); // 保存监控数据
- this.edit.save = function () {
- _this.control.currentCamera.isNew = false;
- return _this.control.currentCamera.updateInfo(true);
- }; // 退出监控编辑或查看
- this.edit.cancel = function () {
- var player = _this.app.core.get('Player'); // this.control.editingCamera.videoMat.opacity = 1
- // 查看时退出,没有selectCamera,直接cancelWatching
- // 新增时退出,selectCamera会被undoEdit的removeCamera清除,然后cancelWatching
- if (_this.control.editingCamera) {
- common$1.updateVisible(_this.control.editingCamera.cylinder, 'enterEdit', false, 1, 'cancel');
- player.modelSideManager.recover();
- _this.edit.hideCylinder(_this.control.hideCylinder); //新添加的设置
- }
- if (!_this.control.editingCamera) {
- _this.edit.cancelWatching();
- }
- _this.control.isEdit = false;
- _this.control.editingCamera = null;
- _this.control.selectType = null;
- player.locked = false; // 如果没有cancelWatching,则重新watch一次,保证镜头正对着监控视频
- if (_this.control.watchingCamera) {
- _this.control.watch(_this.control.watchingCamera);
- }
- }; // 退出监控查看
- this.edit.cancelWatching = function () {
- var player = _this.app.core.get('Player');
- if (!_this.control.watchingCamera) return;
- _this.control.stopWatch(); // 回到查看前的位置和视角
- var _this$control$lastVie = _this.control.lastViewState,
- mode = _this$control$lastVie.mode,
- floorIndex = _this$control$lastVie.floorIndex,
- target = _this$control$lastVie.target,
- quaternion = _this$control$lastVie.quaternion,
- position = _this$control$lastVie.position,
- currentScale = _this$control$lastVie.currentScale;
- if (mode == Viewmode$1.DOLLHOUSE && player.mode == Viewmode$1.DOLLHOUSE) {
- // 切换当前楼层
- var currentFloorId = player.model.allFloorsVisible ? 'all' : player.model.currentFloorId;
- if (currentFloorId != floorIndex) {
- player.$app.Scene.gotoFloor(floorIndex);
- }
- var activeControl = player.cameraControls.activeControl;
- transitions$1.start(lerp.vector(activeControl.target, target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
- transitions$1.start(lerp.vector(activeControl.camera.position, position), 1000, function () {}, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
- } else if (mode == Viewmode$1.PANORAMA) {
- player.flyToNewMode({
- mode: Viewmode$1.PANORAMA,
- pano: player.currentPano,
- quaternion,
- callback: function callback() {}
- });
- } else {
- player.flyToNewMode({
- mode,
- quaternion,
- target,
- position,
- currentScale,
- floor: floorIndex,
- callback: function callback() {}
- });
- }
- }; // 删除监控
- this.edit.delete = function (sid) {
- _this.checkMonitorExist(sid, function (camera) {
- camera.isWatching && _this.edit.cancelWatching();
- _this.control.removeCamera(camera);
- });
- }; // 隐藏监控线框
- this.edit.hideCylinder = function (isHide) {
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'force';
- //有按钮控制
- //按钮控制
- console.log('hideCylinder', isHide, reason);
- _this.control.hideCylinder = isHide;
- _this.control.cameras.forEach(function (camera) {
- common$1.updateVisible(camera.cylinder, reason, !isHide);
- });
- };
- /**
- * ---------------------属性设置-------------------------------
- */
- // 设置监控名称
- this.edit.setName = function (name) {
- _this.control.currentCamera.name = name;
- _this.control.currentCamera.titleLabel.setText(name);
- }; // 设置监控坐标
- this.edit.setPosition = function (position) {
- _this.control.currentCamera.updatePosition(position);
- if (!_this.control.unbindDollhouse) {
- var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
- dollhouseControl.camera.position.copy(_this.control.currentCamera.position);
- dollhouseControl.target.copy(_this.control.currentCamera.target);
- }
- };
- /**
- * 根据xyz分别设置监控坐标,传入的是posOffset的值
- * key: 'x' | 'y' | 'z'
- */
- this.edit.setSeparatePosition = function () {
- var position = new THREE.Vector3();
- return function (key, value) {
- if (isNaN(parseFloat(value))) return;
- _this.control.currentCamera.posOffset[key] = parseFloat(value);
- position.copy(_this.control.currentCamera.posOri).add(_this.control.currentCamera.posOffset);
- _this.edit.setPosition(position);
- };
- }(); // 设置监控fov
- this.edit.setFov = function (fov) {
- if (_this.control.currentCamera.isWatching && !_this.control.unbindDollhouse) _this.app.core.get('Player').cameraControls.cameras.dollhouse.fov = fov;
- _this.control.currentCamera.fov = fov;
- _this.control.currentCamera.updateProjectionMatrix();
- _this.control.currentCamera.updateMesh();
- }; // 设置视频长宽比
- this.edit.setAspect = function (aspect) {
- _this.control.currentCamera.updateAspect(aspect);
- }; // 设置视频透明度
- this.edit.setOpacity = function (opacity) {
- _this.control.currentCamera.videoMat.opacity = opacity / 100;
- }; // 设置横向角
- this.edit.setRoll = function (angle) {
- _this.control.currentCamera.setRoll(angle);
- }; // 设置左右转角
- this.edit.setYaw = function (angle) {
- _this.control.currentCamera.yaw = angle;
- if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
- var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
- dollhouseControl.target.copy(_this.control.currentCamera.target);
- }
- }; // 设置上下转角
- this.edit.setPitch = function (angle) {
- _this.control.currentCamera.pitch = angle;
- if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
- var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
- dollhouseControl.target.copy(_this.control.currentCamera.target);
- }
- }; // 设置监控视频地址
- this.edit.setVideoSrc = function (videoSrc, reload) {
- //videoSrc = {src:xxx, urlType:xxx}
- // let time0 = new Date().getTime()
- var currentCamera = _this.control.currentCamera;
- currentCamera.videoActive = false;
- currentCamera.showVideo(false); // 1秒内没load好就reload一次,防止在路径正确的情况下偶尔不知为何加载不出来
- var reloadHandle = setTimeout(function () {
- if (!reload) {
- console.error('reload');
- _this.edit.setVideoSrc(videoSrc, true);
- }
- }, 1000);
- if (currentCamera.videoType === 2) {
- videoSrc.src = common$1.getDealedUrl(videoSrc.src, _this.app);
- }
- var video = currentCamera.createVideo(videoSrc.src);
- video.onloadedmetadata = function () {
- clearTimeout(reloadHandle);
- _this.app.Camera.emit('SecurityCamera.videoActive', currentCamera.sid);
- currentCamera.videoActive = true; // currentCamera.aspect = video.videoWidth / video.videoHeight
- //currentCamera.updateMesh()
- currentCamera.showVideo(true);
- };
- currentCamera.hlsVideoPlayer && currentCamera.hlsVideoPlayer.destroy();
- currentCamera.videoType = videoSrc.urlType;
- if (Hls.isSupported() && currentCamera.videoType === 1) {
- var hls = new Hls();
- hls.loadSource(videoSrc.src);
- hls.attachMedia(video);
- hls.on(Hls.Events.ERROR, function (event, data) {
- return console.log('HLS加载失败', event, data);
- });
- currentCamera.hlsVideoPlayer = hls;
- } else {
- video.src = videoSrc.src;
- }
- currentCamera.play();
- currentCamera.videoMat.map = new THREE.VideoTexture(currentCamera.video);
- }; // 设置线框距离
- this.edit.setCylinderFar = function (far) {
- _this.control.currentCamera.cylinderFar = far;
- _this.control.currentCamera.cylinder.bottom.position.set(0, 0, -far);
- _this.control.currentCamera.updateMesh(); // if (this.control.watchingCamera) {
- // let dollhouseControl = this.app.core.get('Player').cameraControls.controls.dollhouse
- // dollhouseControl.target.copy(this.control.currentCamera.target)
- // }
- }; // 切换控制器(暂时用不到)
- // this.edit.switchTransformType = type => {
- // if (type == this.control.transformType) return
- // if (this.control.transformType == 0) {
- // this.control.enableTransformControl()
- // }
- // this.control.transformType = type
- // if (type == 0) {
- // this.control.disableTransformControl()
- // }
- // if (type == 1) {
- // this.app.core.get('Player').model.transformControls.space = 'world'
- // this.app.core.get('Player').model.transformControls.setMode('translate')
- // }
- // if (type == 2) {
- // this.app.core.get('Player').model.transformControls.space = 'world'
- // this.app.core.get('Player').model.transformControls.setMode('rotate')
- // }
- // }
- /**
- * ------------------------数据回退------------------------------
- */
- // Transform改为默认值
- this.edit.undoTransform = function () {
- // let info = this.control.currentCamera.info
- // this.edit.setSeparatePosition('x', info.posOffset.x)
- // this.edit.setSeparatePosition('y', info.posOffset.y)
- // this.edit.setSeparatePosition('z', info.posOffset.z)
- // this.edit.setRoll(info.roll)
- // this.edit.setPitch(info.pitch)
- // this.edit.setYaw(info.yaw)
- _this.edit.setRoll(0);
- _this.edit.setPitch(0);
- _this.edit.setYaw(0);
- _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
- }; // fov和线框距离改为默认值
- this.edit.undoScope = function () {
- // let info = this.control.currentCamera.info
- // this.edit.setCylinderFar(info.far)
- // this.edit.setFov(info.fov)
- _this.edit.setCylinderFar(3);
- _this.edit.setFov(70);
- _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
- }; // 回撤
- this.edit.undoEdit = function () {
- var camera = _this.control.currentCamera;
- if (camera.isNew) {
- // 删除添加的模型
- _this.control.removeCamera(camera);
- } else {
- // 回退数据
- var info = camera.info;
- if (info.far != camera.cylinderFar) _this.edit.setCylinderFar(info.far); // 需要将far放在第一个
- camera.posOri.x = info.posOri.x;
- camera.posOri.y = info.posOri.y;
- camera.posOri.z = info.posOri.z;
- _this.edit.setSeparatePosition('x', info.posOffset.x);
- _this.edit.setSeparatePosition('y', info.posOffset.y);
- _this.edit.setSeparatePosition('z', info.posOffset.z);
- if (info.fov != camera.fov) _this.edit.setFov(info.fov); //if (info.aspect != camera.aspect) this.edit.setAspect(info.aspect)
- if (info.roll != camera.roll) _this.edit.setRoll(info.roll);
- if (info.pitch != camera.pitch) _this.edit.setPitch(info.pitch);
- if (info.yaw != camera.yaw) _this.edit.setYaw(info.yaw);
- if (info.video != camera.videoSrc) _this.edit.setVideoSrc({
- src: info.video,
- urlType: info.videoType
- });
- _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
- }
- };
- }
- _createClass(Monitor, [{
- key: "showAll",
- value: function showAll(reason, level, type) {
- var _this2 = this;
- this.waitSecurityControls(function () {
- _this2.control.showAll(null, reason, level, type);
- }, this.showAll.bind(this));
- }
- }, {
- key: "hideAll",
- value: function hideAll(reason, level, type) {
- var _this3 = this;
- this.waitSecurityControls(function () {
- _this3.control.hideAll(null, reason, level, type);
- }, this.hideAll.bind(this));
- }
- /* showRange(show) {
- this.edit.hideCylinder(!show, 'showRange')
- } */
- }, {
- key: "changeTitlesShow",
- value: function changeTitlesShow(state) {
- var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
- //xzw add
- this.control.showTitles = !!state;
- this.control.cameras.forEach(function (cam) {
- common$1.updateVisible(cam.titleLabel, cause, !!state);
- });
- } // 等待SecurityControls
- }, {
- key: "waitSecurityControls",
- value: function waitSecurityControls(func, waitFunc) {
- if (this.control) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- } // 检测监控sid是否存在
- }, {
- key: "checkMonitorExist",
- value: function checkMonitorExist(sid, func) {
- var camera = this.control.cameras.find(function (cam) {
- return cam.sid == sid;
- });
- if (camera) {
- func(camera);
- } else {
- console.error('监控sid不存在!');
- }
- }
- }, {
- key: "watch",
- value: function watch(sid) {
- var cameras = this.app.store.getValue('cameras');
- if (cameras == void 0 || !cameras.length) {
- return;
- }
- var find = cameras.find(function (c) {
- return c.sid == sid;
- });
- if (find == void 0) {
- return;
- }
- this.edit.watch(sid);
- }
- }, {
- key: "lock",
- value: function lock() {
- this.locked = Deferred$1();
- }
- }, {
- key: "unlock",
- value: function unlock() {
- if (this.locked && this.locked.resolve) {
- this.locked.resolve();
- }
- this.locked = null;
- }
- }, {
- key: "highlight",
- value: function highlight(sid) {
- var cam = this.control.cameras.find(function (c) {
- return c.sid == sid;
- });
- this.control.cameras.forEach(function (e) {
- return e.highlight(false);
- }); //先取消,一次只能高亮一个camera
- cam && cam.highlight(true);
- }
- }]);
- return Monitor;
- }();
- var FlvVideoPlayer = /*#__PURE__*/function (_FlvVideoPlayerBase) {
- _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
- var _super = _createSuper$J(FlvVideoPlayer);
- function FlvVideoPlayer(player) {
- _classCallCheck(this, FlvVideoPlayer);
- return _super.call(this, player);
- }
- _createClass(FlvVideoPlayer, [{
- key: "_getVideoPath",
- value: function _getVideoPath(src) {
- return src;
- }
- }]);
- return FlvVideoPlayer;
- }(FlvVideoPlayerBase);
- var H5VideoPlayer = /*#__PURE__*/function (_H5VideoPlayerBase) {
- _inherits(H5VideoPlayer, _H5VideoPlayerBase);
- var _super2 = _createSuper$J(H5VideoPlayer);
- function H5VideoPlayer(player) {
- _classCallCheck(this, H5VideoPlayer);
- return _super2.call(this, player);
- }
- _createClass(H5VideoPlayer, [{
- key: "_getVideoPath",
- value: function _getVideoPath(src) {
- return src;
- }
- }]);
- return H5VideoPlayer;
- }(H5VideoPlayerBase);
- /*
- note:
- https的地址不能使用http的链接
- 即使不支持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
-
- */
- 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); }; }
- 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; } }
- /**
- * 视角截取
- */
- var ViewExtract = /*#__PURE__*/function (_Emiter) {
- _inherits(ViewExtract, _Emiter);
- var _super = _createSuper$I(ViewExtract);
- function ViewExtract(app) {
- var _this;
- _classCallCheck(this, ViewExtract);
- _this = _super.call(this);
- _this.app = app;
- /**
- * 数据状态
- */
- _this.state = {
- /**
- * 固定输出的图长宽比
- */
- scale: 1.78,
- /**
- * 缩放滑动条范围
- */
- range: {
- min: 0.7,
- max: 3,
- current: 0
- },
- /**
- * 默认设置
- */
- defaults: {
- zoomMax: 0,
- zoomMin: 0,
- zoomEnabled: 0,
- zoomToDefaultWhenToPano: 0
- },
- options: {
- padding: {},
- beforeExport: null,
- afterExport: null
- }
- };
- _this.player = null;
- _this.__is_enter = false;
- _this.__on_zoom = function (zoom) {
- return _this.emit('zoom', zoom);
- };
- _this.__on_size = function () {
- var domElement = _this.player.domElement;
- var paddingTop = _this.state.options.padding.top || 0;
- var paddingBottom = _this.state.options.padding.bottom || 0;
- var paddingLeft = _this.state.options.padding.left || 0;
- var paddingRight = _this.state.options.padding.right || 0;
- var offsetWidth = paddingLeft + paddingRight;
- var offsetHeight = paddingTop + paddingBottom;
- var canvasWidth = window.innerWidth - offsetWidth;
- var canvasHeight = window.innerHeight - offsetHeight;
- if (canvasWidth / canvasHeight < _this.state.scale) {
- //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
- var height = canvasWidth / _this.state.scale;
- domElement.style.height = "".concat(height, "px");
- domElement.style.top = (canvasHeight - height) / 2 + offsetHeight + 'px';
- } else {
- domElement.style.top = "".concat(offsetHeight, "px");
- domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
- }
- };
- _this.__on_update = function () {
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- _ref$hasChanged = _ref.hasChanged,
- hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
- var force = arguments.length > 1 ? arguments[1] : undefined;
- if (!_this.__is_enter || !_this.player.lastFrameChanged && !force) {
- return;
- } //监听outside模式下的zoom
- var control = _this.player.cameraControls.activeControl;
- if (_this.player.mode == 'dollhouse') {
- var dis = control.camera.position.distanceTo(control.target);
- var zoomlevel = math$2.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), _this.state.range.max, _this.state.range.min);
- _this.emit('zoom', zoomlevel);
- } else if (_this.player.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
- var absoluteScale = control.getDefaultAbsoluteScale(_this.player.model.size); //改
- var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
- var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
- var _zoomlevel = math$2.linearClamp(control.absoluteScale, minS, maxS, _this.state.range.max, _this.state.range.min);
- _this.emit('zoom', _zoomlevel);
- }
- };
- return _this;
- }
- _createClass(ViewExtract, [{
- key: "options",
- value: function options(option) {
- this.state.options = Object.assign(this.state.options, option || {});
- return this;
- }
- }, {
- key: "enter",
- value: function enter() {
- if (this.__is_enter) {
- return;
- }
- if (this.player === null) {
- this.player = this.app.core.get('Player');
- }
- this.__is_enter = true;
- this.__on_size();
- this.state.defaults.zoomMax = settings$3.zoom.max;
- this.state.defaults.zoomMin = settings$3.zoom.min;
- this.state.defaults.zoomEnabled = settings$3.zoom.enabled;
- this.state.defaults.zoomToDefaultWhenToPano = settings$3.zoom.zoomToDefaultWhenToPano;
- settings$3.zoom.max = this.state.range.max;
- settings$3.zoom.min = this.state.range.min;
- settings$3.zoom.enabled = true;
- settings$3.zoom.zoomToDefaultWhenToPano = false;
- settings$3.highestQualityTile = true;
- this.player.on('zoomTo', this.__on_zoom);
- this.player.on('setSize', this.__on_size);
- this.player.on('update', this.__on_update);
- this.__on_zoom(this.player.zoomLevel);
- this.__on_update(0, true);
- return this;
- }
- }, {
- key: "leave",
- value: function leave() {
- if (this.__is_enter === false) {
- return;
- }
- this.__is_enter = false;
- this.player.zoomTo(1);
- settings$3.zoom.max = this.state.defaults.zoomMax;
- settings$3.zoom.min = this.state.defaults.zoomMin;
- settings$3.zoom.enabled = this.state.defaults.zoomEnabled;
- settings$3.zoom.zoomToDefaultWhenToPano = this.state.defaults.zoomToDefaultWhenToPano;
- settings$3.highestQualityTile = false;
- this.player.off('zoomTo', this.__on_zoom);
- this.player.off('setSize', this.__on_size);
- this.player.off('update', this.__on_update);
- this.player.domElement.style.top = 0;
- this.player.domElement.style.height = '100%';
- return this;
- }
- /**
- *
- * @param {String} type camera | scale
- * @returns
- */
- }, {
- key: "reset",
- value: function reset(type) {
- var _this2 = this;
- if (!this.__is_enter) {
- return this;
- }
- if (type === 'camera') {
- if (this.player.mode == 'panorama') {
- this.player.cameraControls.activeControl.lat = 0;
- }
- } else if (type == 'scale') {
- var control = this.player.cameraControls.activeControl;
- if (this.player.mode == 'transitioning') {
- return player.once('mode.changed', function (fromMode, toMode) {
- if (!_this2.__is_enter) return;
- _this2.reset(type);
- });
- } else if (this.player.mode == 'panorama') {
- this.player.zoomTo(1);
- } else if (this.player.mode == 'dollhouse') {
- //自己定一个target
- control.target.copy(this.player.model.center); //this.onRangeChange({ value: 100 })
- } else if (this.player.mode == 'floorplan') {
- //自己定一个target
- control.target.setX(this.player.model.center.x);
- control.target.setZ(this.player.model.center.z);
- control.camera.position.setX(this.player.model.center.x); //使角度归零
- control.camera.position.setZ(this.player.model.center.z);
- control.rotateToView(this.player.model.size, this.player.getDirection()); //再旋转
- control.zoomToContain(this.player.model.size);
- }
- }
- return this;
- }
- }, {
- key: "scale",
- value: function scale(value) {
- if (!this.__is_enter) {
- return this;
- }
- value = value > 1 ? parseInt(value) / 100 : value;
- if (value < this.state.range.min) {
- value = this.state.range.min;
- } else if (value > this.state.range.max) {
- value = this.state.range.max;
- }
- this.state.range.current = value;
- var control = this.player.cameraControls.activeControl;
- var zoomLevel = value;
- if (this.player.mode == 'panorama') {
- settings$3.zoom.enabled = true;
- this.player.zoomTo(zoomLevel);
- } else if (this.player.mode == 'dollhouse') {
- 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
- control.camera.position.copy(control.target).add(this.player.getDirection().multiplyScalar(-disWanted));
- } else if (this.player.mode == 'floorplan') {
- var absoluteScale = control.getDefaultAbsoluteScale(this.player.model.size); //改
- var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
- var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
- control.absoluteScale = math$2.linearClamp(zoomLevel, this.state.range.min, this.state.range.max, maxS, minS);
- }
- return this;
- }
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
- var deferre = Deferred$1();
- if (this.__is_enter == false) {
- deferre.reject('please call enter before');
- } else if (this.player.mode == 'panorama') {
- var timer = setInterval(function () {
- if (_this3.player.currentPano && !_this3.player.flying) {
- clearInterval(timer);
- if (typeof _this3.state.options.beforeExport === 'function') {
- _this3.state.options.beforeExport();
- }
- var tileSize = _this3.getTileSize();
- var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(_this3.player.quaternion);
- var camera = _this3.player.cameraControls.activeControl.camera;
- var vFov = camera.fov;
- var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
- var promise = _this3.player.currentPano.loadTiledPano(tileSize, vec, {
- hFov,
- vFov
- }, !1, !1, !0);
- promise.done(function () {
- return deferre.resolve();
- }).fail(function () {
- return deferre.resolve();
- });
- }
- }, 200);
- } else {
- deferre.resolve();
- }
- return deferre;
- }
- }, {
- key: "export",
- value: function _export(func) {
- var _this4 = this;
- if (typeof func !== 'function') {
- return this;
- }
- this.ready().done( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var _this4$getViewSize, width, height, captures;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _this4$getViewSize = _this4.getViewSize(), width = _this4$getViewSize.width, height = _this4$getViewSize.height;
- _context.next = 3;
- return _this4.app.Camera.screenshot([{
- width,
- height,
- name: 'capture'
- }]);
- case 3:
- captures = _context.sent;
- if (captures.length) {
- func(captures[0]);
- } else {
- func(null);
- }
- if (typeof _this4.state.options.afterExport === 'function') {
- _this4.state.options.afterExport();
- }
- case 6:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }))).fail(function () {
- func(null);
- if (typeof _this4.state.options.afterExport === 'function') {
- _this4.state.options.afterExport();
- }
- });
- return this;
- }
- /**
- * 导出图片
- * @param {*} filename
- * @returns
- */
- }, {
- key: "exportFile",
- value: function exportFile(filename) {
- this.export(function (capture) {
- var url = window.URL.createObjectURL(capture.data);
- var link = document.createElement('a');
- link.href = url;
- link.download = filename;
- link.click();
- });
- return this;
- }
- /**
- * 获取全景图高度
- * @returns
- */
- }, {
- key: "getMaxHeight",
- value: function getMaxHeight() {
- return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
- }
- /**
- * 获取单面大小
- * @returns
- */
- }, {
- key: "getTileSize",
- value: function getTileSize() {
- return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
- }
- }, {
- key: "getViewSize",
- value: function getViewSize() {
- if (this.player.mode != 'panorama') {
- return {
- width: 1780,
- height: 1000
- };
- }
- var maxHeight = this.getMaxHeight();
- var height = this.player.cameraControls.activeControl.camera.fov / 180 * maxHeight;
- var width = height * this.state.scale;
- var size = {
- width: Math.round(width),
- height: Math.round(height)
- };
- return size;
- }
- }]);
- return ViewExtract;
- }(tinyEmitter);
- var AStart = /*#__PURE__*/function () {
- function AStart() {
- _classCallCheck(this, AStart);
- this.panos = null;
- } //
- _createClass(AStart, [{
- key: "getPointForPano",
- value: function getPointForPano(paonId) {
- return {
- id: paonId,
- G: 0,
- position: this.panos[paonId].position,
- contact: this.panos[paonId].neighbourUUIDs
- };
- } //返回值是数组
- }, {
- key: "getNeighbourUUIDs",
- value: function getNeighbourUUIDs(pano) {
- return pano.neighbourUUIDs;
- }
- }, {
- key: "searchRoad",
- value: function searchRoad(panos, startPanoId, endPanoId) {
- try {
- this.panos = panos;
- if (startPanoId == endPanoId) {
- console.log('点击的点和当前点是同一个点');
- return null;
- }
- var startPoint = this.getPointForPano(startPanoId); //如果startPano与endPano互为邻居,则返回
- if (startPoint.contact.indexOf(endPanoId) > -1) {
- //return [startPanoId, endPanoId]
- return [endPanoId];
- }
- var endPoint = this.getPointForPano(endPanoId);
- var openList = [],
- //开启列表
- closeList = []; //关闭列表
- var result = []; //结果数组
- var result_index; //结果数组在开启列表中的序号
- //把当前点加入到开启列表中,并且G是0
- openList.push({
- id: startPanoId,
- G: 0,
- position: startPoint.position,
- contact: startPoint.contact
- }); //把当前点加入到开启列表中,并且G是0
- do {
- var currentPoint = openList.pop();
- closeList.push(currentPoint);
- if (closeList.length > 10000) {
- console.log('错误过渡路径:', closeList.length);
- return null;
- }
- var neighPointIds = [];
- var _point = this.getPointForPano(currentPoint.id);
- neighPointIds = _point.contact;
- for (var i = 0; i < neighPointIds.length; ++i) {
- var neighPointId = neighPointIds[i];
- var neighPoint = this.getPointForPano(neighPointId);
- if (this.existList(neighPoint, closeList) != -1) {
- continue;
- }
- neighPoint.id = neighPointId; //g 到父节点的位置
- var g = currentPoint.G + this.getDistance(currentPoint.position, neighPoint.position);
- if (this.existList(neighPoint, openList) == -1) {
- //如果不在开启列表中
- neighPoint['H'] = this.getDistance(endPoint.position, neighPoint.position);
- neighPoint['G'] = g;
- neighPoint['F'] = neighPoint.H + neighPoint.G;
- neighPoint['parent'] = currentPoint;
- openList.push(neighPoint);
- } else {
- //存在在开启列表中,比较目前的g值和之前的g的大小
- var index = this.existList(neighPoint, openList); //如果当前点的g更小
- if (g < openList[index].G) {
- openList[index].parent = currentPoint;
- openList[index].G = g;
- openList[index].F = g + openList[index].H;
- }
- }
- } //如果开启列表空了,没有通路,结果为空
- if (openList.length == 0) {
- break;
- }
- openList.sort(this.sortF); //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉
- } while ((result_index = this.existList(endPoint, openList)) == -1); //判断结果列表是否为空
- var currentObj;
- if (typeof result_index == 'undefined' || result_index == -1) {
- result = [];
- } else {
- currentObj = openList[result_index];
- do {
- //把路劲节点添加到result当中
- result.unshift(currentObj.id);
- currentObj = currentObj.parent;
- if (!currentObj) {
- break;
- }
- } while (result.length < 50 && currentObj.contact.indexOf(startPanoId) < 0);
- }
- if (result.length > 50) {
- console.log('错误过渡路径:' + result); // debugger;
- return null;
- }
- if (currentObj) {
- result.unshift(currentObj.id);
- } //result.unshift(startPanoId)
- console.log('path-end' + result);
- return result;
- } catch (error) {
- console.error('searchRoad', error);
- return [];
- }
- } //用F值对数组排序
- }, {
- key: "sortF",
- value: function sortF(a, b) {
- return b.F - a.F;
- } //判断点是否存在在列表中,是的话返回的是序列号
- }, {
- key: "existList",
- value: function existList(point, list) {
- for (var i = 0; i < list.length; ++i) {
- if (point.id == list[i].id) {
- return i;
- }
- }
- return -1;
- }
- }, {
- key: "getDistance",
- value: function getDistance(position1, position2) {
- 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));
- }
- }]);
- return AStart;
- }();
- var aStart = new AStart();
- //照片制卷 已知热点位置和
- var player$e, tagManager;
- 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]
- /* [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] */
- ];
- for (var i$1 = 0, len$1 = sideBoundPoints$1.length; i$1 < len$1; i$1++) {
- sideBoundPoints$1.push([-sideBoundPoints$1[i$1][0], -sideBoundPoints$1[i$1][1]]);
- }
- var canvasRes$1 = new THREE.Vector2(1024, 512); //const snapResolution = new THREE.Vector2(1.78*500, 500) //5671*3186
- var snapAspect$1 = 1.78; //和截图页面实际会有一点偏差
- var imgResolution$1 = new THREE.Vector2(4096, 2048); // (8192,4096)
- var RouteSnap = {
- //deferred : Deferred(),
- init(app) {
- if (this.inited) return true;
- this.app = app;
- player$e = app.core.get('Player');
- tagManager = app.TagManager;
- if (!tagManager.tag3dInited) {
- return;
- }
- this.camera = player$e.camera.clone();
- this.camera.aspect = snapAspect$1;
- this.camera.updateProjectionMatrix();
- window.testSnap = this;
- this.showPanoRenderArea(); //this.deferred.resolve()
- this.inited = true;
- return true;
- },
- generateAll(app) {
- var _this = this;
- /* if(!this.inited){
- return this.deferred.then(()=>{
- this.generateAll( )
- })
- } */
- if (!this.init(app)) return tagManager.on('tag3dInited', function () {
- _this.generateAll(app);
- });
- var sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.08, 4, 4), new THREE.MeshBasicMaterial({
- color: '#f11' //depthTest:false, transparent:true
- }));
- sphere.renderOrder = 100;
- app.core.get('SceneRenderer').scene.add(sphere);
- var doorPos = app.store.getValue('metadata').enterDoor;
- if (!doorPos) {
- alert('没有入户门!enterDoor, 使用自定义的');
- var defaultDoor = {
- 'SG-hx-kgqfd2wuVld': {
- "x": 4.430859088897705,
- "y": -0.04475339502096176,
- "z": 1.170697569847107
- },
- 'SG-hx-7R336wSsXwL': {
- "x": -1.8618323213679517,
- "y": -1.5661438582778084,
- "z": 7.593649473830825
- }
- };
- debugger;
- doorPos = new THREE.Vector3().copy(defaultDoor[this.app.config.num] || {
- "x": 0,
- "y": 0,
- "z": 0
- });
- }
- sphere.position.copy(doorPos);
- window.sphere_ = sphere;
- var list = tagManager.tag3ds.map(function (tag) {
- return {
- tag,
- snap: _this.generate(tag, doorPos)
- };
- });
- console.error('snap list---', list);
- },
- generate(tag, doorPos) {
- var panoStart = tagManager.findBestPanoForWatching(tag);
- var panoEnd = player$e.model.panos.findClosest(doorPos);
- var route = this.findRoute(panoStart, panoEnd);
- var list = this.findTurnPanos(route);
- console.log('拐点', list); //let tagSnap = this.getSnapCorners(panoStart, tag.position)
- //let cornerList = [tagSnap]
- var cornerList = [];
- for (var _i = 0, _len = list.length; _i < _len; _i++) {
- cornerList.push(this.getSnapCorners(list[_i], _i == 0 ? tag.position : list[_i - 1].position));
- cornerList.push(this.getSnapCorners(list[_i], _i == _len - 1 ? doorPos : list[_i + 1].position));
- } //console.error('cornerList',cornerList)
- return cornerList;
- },
- findRoute(panoStart, panoEnd) {
- var panos = aStart.searchRoad(player$e.model.panos.index, panoStart.id, panoEnd.id) || [];
- return [panoStart.id].concat(panos);
- },
- findTurnPanos(panos) {
- var turnPanos = [panos[0]];
- for (var _i2 = 0, _len2 = panos.length; _i2 < _len2; _i2++) {
- var last = player$e.model.panos.index[turnPanos[turnPanos.length - 1]]; //上次的拐点
- if (!last.neighbourPanos[panos[_i2]]) {
- turnPanos.push(panos[_i2 - 1]); //前一个是拐点
- }
- }
- if (turnPanos[turnPanos.length - 1] != panos[panos.length - 1]) {
- //加入最后一个点
- turnPanos.push(panos[panos.length - 1]);
- }
- return turnPanos.map(function (e) {
- return player$e.model.panos.get(e);
- });
- /* let list = [], vec1 = new THREE.Vector3, vec2 = new THREE.Vector3
- for(let i=0,len=turnPanos.length; i<len;i++){
- let last = turnPanos[i-1]
- let next = turnPanos[i+1]
- vec1.quaternion
- }
-
- return list */
- },
- getSnapCorners(pano, target) {
- var _this2 = this;
- //得到四个角在全景图的像素坐标
- //假定相机的aspect刚好等于snapAspect
- //该方法需要先让相机在对应位置,然后得到屏幕所显示的完整截图
- player$e.cameraControls.activeControl.camera;
- this.camera.position.copy(pano.position);
- this.camera.lookAt(target);
- this.camera.updateMatrixWorld();
- var corners_ = [[-1, 1], [1, 1], [1, -1], [-1, -1]]; //从左上开始顺时针的四个角
- var corners = corners_.map(function (mouse) {
- var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(_this2.camera); //let dir = new THREE.Vector3().subVectors(point, pano.position)
- var dirInPano = math$2.getNormalDir(point, pano);
- return math$2.getUVfromDir(dirInPano).multiply(imgResolution$1);
- });
- return {
- panoId: pano.id,
- corners
- };
- },
- initPanoVisible() {},
- getImgUrl(id) {
- return "http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3";
- },
- showPanoRenderArea() {
- var _this3 = this;
- var pano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : player$e.currentPano;
- //勾勒出当前视口在全景图上的范围
- if (!this.imgReview) {
- var panoImgReview = document.createElement('div');
- panoImgReview.id = 'panoImgReview';
- document.querySelector('body').appendChild(panoImgReview);
- 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 "; //< >
- var style = document.createElement('style');
- style.type = 'text/css';
- 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 ";
- document.head.appendChild(style);
- this.imgReview = panoImgReview;
- var btn = this.imgReview.querySelector('button');
- btn.addEventListener('click', function () {
- _this3.showPanoRenderArea();
- });
- var _canvasRes = new THREE.Vector2(1024, 512);
- var canvas = this.imgReview.querySelector('canvas');
- canvas.width = _canvasRes.x;
- canvas.height = _canvasRes.y;
- this.ctx = canvas.getContext('2d');
- this.ctx.strokeStyle = 'rgb(255,50,200)';
- this.ctx.fillStyle = 'rgb(50,40,250)';
- var r = imgResolution$1.x / _canvasRes.x;
- this.showCoordPoint = function (coords, clear) {
- //输入给算法的坐标
- clear && _this3.ctx.clearRect(0, 0, _canvasRes.x, _canvasRes.y);
- var pointSize = 14;
- coords.forEach(function (coord) {
- _this3.ctx.fillRect(coord.x / r - pointSize / 2, coord.y / r - pointSize / 2, pointSize, pointSize); // 画一个点
- });
- };
- }
- this.imgReview.querySelector('img').src = pano.getCubemapUrls('high');
- var cameraReal = player$e.cameraControls.activeControl.camera; //创建屏幕四边若干序列点
- var coords = sideBoundPoints$1.map(function (mouse) {
- var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(cameraReal); //let dir = new THREE.Vector3().subVectors(point, pano.position)
- var dirInPano = math$2.getNormalDir(point, pano);
- return math$2.getUVfromDir(dirInPano).multiply(canvasRes$1);
- });
- var ctx = this.ctx;
- ctx.clearRect(0, 0, canvasRes$1.x, canvasRes$1.y);
- ctx.lineWidth = 5;
- ctx.beginPath();
- ctx.moveTo(coords[0].x, coords[0].y);
- for (var _i3 = 1, _len3 = coords.length; _i3 < _len3; _i3++) {
- ctx.lineTo(coords[_i3].x, coords[_i3].y);
- }
- ctx.closePath(); // 闭合路径,回到起点
- //ctx.fill();
- ctx.stroke();
- }
- };
- /*
- let math_ = {
- getUVfromDir(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone()
- dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI
- return new THREE.Vector2( tx, ty )
- //理想状态下tx相同
- },
- crossRight(vec3, matrix) {//似乎是只取旋转。当年不知道怎么想到这函数的- -
- var e = matrix.elements
- var v = new THREE.Vector3()
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
-
- return v
- },
- getNormalDir(dir, currentPano) {
- if (currentPano.tiled) {
- var matrixWorld = currentPano.rot90Matrix.clone()
- } else {
- var matrixWorld = currentPano.matrixWorld.clone()
- }
- dir = this.crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
- dir.normalize()
- return dir
- },
-
- getQuaByAim(aim, center = new THREE.Vector3() ) {
- //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
- var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
- var aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
- return aimQua
- }
- } */
- //还要对tag截一张图 所以需要我这加载tag,初始化tag, 然后focus
- //入户门可能还要算点位
- /*
- 视图的mouse 左下角是(-1,-1)
- */
- /* 全景图 http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3
- see getCubemapUrls
- */
- /*
- 在console界面输出当前点位屏幕四个角在全景图上的像素坐标
- let getUVfromDir = function(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone()
- dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI
- return new THREE.Vector2( tx, ty )
- //理想状态下tx相同
- }
- let crossRight = function(vec3, matrix) {
- var e = matrix.elements
- var v = new THREE.Vector3()
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
-
- return v
- }
- let getNormalDir = function(point, currentPano) {
-
- var dir = point.clone().sub(currentPano.position) //OA
- if (supportsTiles) {
- var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- } else {
- var matrixWorld = currentPano.matrixWorld.clone()
- }
- dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
- dir.normalize()
-
- return dir
- }
- let player = __sdk.core.get('Player')
- // let dir = player.getDirection()
- //let quaInv = new THREE.Quaternion().copy(player.currentPano.quaternion).invert()
- // dir.applyQuaternion(quaInv)
- //console.log(getUVfromDir(dir))
- let camera = player.camera
- let imgResolution = new THREE.Vector2(8192,4096)
- let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
- console.log(corners.map(mouse=>{
-
- var point = new THREE.Vector3(mouse[0],mouse[1],-1).unproject( camera)
- let dir = getNormalDir(point, player.currentPano)
- return getUVfromDir(dir).multiply(imgResolution)
-
- }))
- //当全景图不旋转时,得到的框 y一样,x不一样
- =====ver2=====
- 根据给定的fov:
- 得到的结果不对! 舍弃
- let getQuaByAim = function(aim, center = new THREE.Vector3() ) {
- //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
- var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
- aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
- return aimQua
- }
- let getUVfromDir = function(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone()
- dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI
- return new THREE.Vector2( tx, ty )
- //理想状态下tx相同
- }
- let crossRight = function(vec3, matrix) {
- var e = matrix.elements
- var v = new THREE.Vector3()
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
- return v
- }
- let getNormalDir = function(dir, currentPano) {
- if (currentPano.tiled) {
- var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- } else {
- var matrixWorld = currentPano.matrixWorld.clone()
- }
- dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
- dir.normalize()
-
- return dir
- }
- let player = __sdk.core.get('Player')
- let camera = player.camera
- let cameraReal = player.cameraControls.activeControl.camera
- let imgResolution = new THREE.Vector2(8192,4096)
- let vfov = THREE.MathUtils.degToRad(cameraReal.fov)
- const vFovHalf = vfov / 2
- const hFovHalf = Math.atan(Math.tan(vFovHalf) * cameraReal.aspect)
- let viewQua = getQuaByAim(player.getDirection() )
- console.log('viewQua', viewQua, camera.quaternion)
- let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
- console.log(corners.map(c=>{
-
- let dir = new THREE.Vector3(0, 0, -1);
- dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), vFovHalf * c[1]);
- dir.applyAxisAngle(new THREE.Vector3(0, 1, 0), hFovHalf * -c[0]);//得到相机不旋转时该偏移角度的方向
- dir.applyQuaternion(viewQua)
- let dirInPano = getNormalDir(dir, player.currentPano )
- return getUVfromDir(dirInPano).multiply(imgResolution)
- }))
- ========
- 问题:入户门如何指定? 算法是否能给出完全遮挡的漫游点信息,甚至给出了后续还是可能要模型
- 现在加载不了那些包
- */
- 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); }; }
- 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; } }
- var Camera = /*#__PURE__*/function (_Emiter) {
- _inherits(Camera, _Emiter);
- var _super = _createSuper$H(Camera);
- function Camera(app) {
- var _this;
- _classCallCheck(this, Camera);
- _this = _super.call(this);
- _this.adjustControlAngel = function (target, quaternion) {
- var player = this.app.core.get('Player'); //console.log("adjustControlAngel")
- if (player.mode == 'panorama') {
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion || player.quaternion).add(player.position);
- this.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
- } else {
- //专业录屏需要
- if (!target) return;
- this.cameraControls.activeControl && player.cameraControls.activeControl.target.copy(target);
- }
- };
- _this.app = app;
- _this.app.Scene.on('loaded', function () {
- var player = _this.app.core.get('Player'); // 漫游点选择事件
- player.on(PlayerEvents.PanoChosen, function (pano) {
- _this.emit(PlayerEvents.PanoChosen, pano);
- }); // 漫游点开始过渡事件
- player.on(PlayerEvents.FlyingStarted, function (params) {
- _this.emit(PlayerEvents.FlyingStarted, params);
- }); // 漫游点结束过渡事件
- player.on(PlayerEvents.FlyingEnded, function (params) {
- _this.emit(PlayerEvents.FlyingEnded, params);
- }); // 旋转
- player.on(PlayerEvents.Rotate, function (params) {
- _this.emit(PlayerEvents.Rotate, params);
- }); // 终止旋转
- player.on(PlayerEvents.EndRotation, function (params) {
- _this.emit(PlayerEvents.EndRotation, params);
- }); // 鼠标滚动
- player.on(PlayerEvents.Zoom, function (params) {
- _this.emit(PlayerEvents.Zoom, params);
- }); // 移动模型
- player.on(PlayerEvents.MoveModel, function (params) {
- _this.emit(PlayerEvents.MoveModel, params);
- }); // 模式切换
- player.on(PlayerEvents.ModeChanging, function (fromMode, toMode) {
- return _this.emit(PlayerEvents.ModeChanging, {
- fromMode,
- toMode
- });
- });
- var model = _this.app.core.get('Player').model;
- model.on('floor.changed', function (floor, mode, oldFloor) {
- _this.emit('floor.changed', {
- toMode: mode,
- floorIndex: floor.floorIndex,
- allVisible: model.allFloorsVisible
- });
- });
- }); //if(!app.config.isRouteSnap){
- _this.monitor = new Monitor(app);
- _this.extract = new ViewExtract(app); //}
- return _this;
- }
- _createClass(Camera, [{
- key: "mode",
- get: function get() {
- return this.app.core.get('Player').mode;
- }
- }, {
- key: "locked",
- get: function get() {
- return this.app.core.get('Player').locked;
- }
- /**
- * 判断当时点位是否有球幕视频
- */
- }, {
- key: "isCurrentPanoHasVideo",
- get: function get() {
- return this.app.core.get('Player').currentPano.hasVideo;
- }
- }, {
- key: "panorama",
- value: function panorama() {
- if (!this.app.Scene.ready) {
- return Promise.resolve();
- }
- return this.app.core.get('Player').insideMode();
- }
- }, {
- key: "floorplan",
- value: function floorplan() {
- var deferred = Deferred$1();
- this.app.core.get('Player').flyToNewMode({
- mode: Viewmode$1.FLOORPLAN
- }, deferred);
- return deferred;
- }
- }, {
- key: "dollhouse",
- value: function dollhouse() {
- var deferred = Deferred$1();
- return this.app.core.get('Player').flyToNewMode({
- mode: Viewmode$1.DOLLHOUSE
- }, deferred);
- }
- }, {
- key: "vr",
- value: function vr() {
- var player = this.app.core.get('Player');
- player.vrEnabled = !player.vrEnabled; //提前标记
- return player.flyToMode('panorama', function () {
- return player.vrModeChange();
- });
- }
- }, {
- key: "zoom",
- value: function zoom(zoomLevel) {
- this.app.core.get('Player').zoomTo(zoomLevel);
- }
- }, {
- key: "rotate",
- value: function rotate(data) {
- var _this2 = this;
- //{"quaternion":{"_x":-0.0030889924058959475,"_y":-0.7194824153023747,"_z":-0.003200125539693273,"_w":0.6944964156805331},"mode":"panorama","currentPanoId":"6",rotationSpeed: {x: 59.48871572048137, y: -2.0739152478003122}}
- var player = this.app.core.get('Player');
- function checkSamePano(data, player) {
- if (data.mode == player.mode) {
- //漫游模式情况下,还需要考虑当前漫游点是否对的上
- if (data.mode == Viewmode$1.PANORAMA) {
- if (data.currentPanoId == player.currentPano.id) {
- return true;
- }
- }
- }
- return false;
- }
- var flag = checkSamePano(data, player);
- if (flag) {
- player.cameraControls.activeControl.locked = true;
- player.cameraControls.activeControl.camera.quaternion.set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position);
- player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
- if (data.rotationSpeed) {
- setTimeout(function () {
- _this2.rotateEnd(data);
- }, 100);
- }
- }
- }
- }, {
- key: "rotateEnd",
- value: function rotateEnd(data) {
- var player = this.app.core.get('Player');
- player.cameraControls.activeControl.locked = false;
- if (data.rotationSpeed) {
- player.cameraControls.activeControl.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
- }
- }
- }, {
- key: "getPose",
- value: function getPose() {
- var player = this.app.core.get('Player');
- return JSON.parse(JSON.stringify({
- mode: player.mode,
- position: player.position,
- quaternion: player.quaternion,
- zoomLevel: player.zoomLevel,
- //or fov, baseFov...
- panoId: player.currentPano && player.currentPano.id,
- currentScale: player.cameraControls.controls.floorplan.currentScale,
- //when floorplan
- modeTran: player.modeTran,
- flying: player.flying,
- nextPano: null
- }));
- }
- /**
- * 获取当前视角,转为URL参数
- * @returns
- */
- }, {
- key: "getPoseUrlParams",
- value: function getPoseUrlParams() {
- var getInfo = function getInfo(info) {
- return "pose=pano:".concat(info.metadata.scan_id, ",qua:").concat(math$2.toPrecision(info.metadata.camera_quaternion.toArray(), 4));
- };
- return getInfo(this.app.core.get('Player').getSnapAngleInfo());
- }
- }, {
- key: "setPose",
- value: function setPose(info) {
- //复刻player、camera的状态(如果要瞬间变化:duration:0)
- var player = this.app.core.get('Player');
- if (player.flying || info.flying) return;
- if (info.position && info.position instanceof THREE.Vector3 === false) {
- info.position = new THREE.Vector3(info.position.x, info.position.y, info.position.z);
- }
- if (info.quaternion && info.quaternion instanceof THREE.Quaternion === false) {
- if (info.quaternion.hasOwnProperty('_x')) {
- info.quaternion = new THREE.Quaternion(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
- } else {
- info.quaternion = new THREE.Quaternion(info.quaternion.x, info.quaternion.y, info.quaternion.z, info.quaternion.w);
- }
- }
- var pano = player.model.panos.index[info.panoId];
- var options = {
- mode: info.mode,
- pano: pano,
- quaternion: info.quaternion,
- zoomLevel: info.zoomLevel,
- position: info.position,
- currentScale: info.currentScale,
- duration: info.duration,
- aimDuration: info.duration
- };
- if (player.mode != info.mode) {
- /* if(player.mode == 'panorama' && info.mode == 'dollhouse'){
-
- }else if(player.mode == 'panorama' && info.mode == 'dollhouse'){
-
- }else if(info.mode == 'panorama'){
-
- }else{
-
- } */
- player.flyToNewMode(options);
- } else {
- if (info.mode == 'panorama') {
- pano && player.flyToPano(options);
- } else {
- var control = player.cameraControls.controls[info.mode];
- var camera = control.camera;
- info.target && control.target.copy(info.target);
- info.position && camera.position.copy(info.position);
- control.offset.copy(camera.position).sub(control.target); //offset才是决定此时camera转向的关键
- if (info.mode == 'floorplan') {
- if (info.zoom) {
- //currentScale如果是要经过convertWorkshopOrthoZoom转换
- info.currentScale = MathLight.convertWorkshopOrthoZoom(info.zoom); //根据屏幕适应性缩放
- }
- if (info.currentScale) {
- control.currentScale = control.absoluteScale = info.currentScale;
- control.updateZoom();
- }
- }
- }
- }
- }
- }, {
- key: "flyToMode",
- value: function flyToMode(func, mode) {
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- //飞到某个模式,然后执行某函数
- options.mode = mode;
- if (this.mode == mode) {
- func && func();
- } else {
- if (mode == 'panorama' && !options.pano) {
- options.pano = this.currentPano;
- }
- if (this.mode == 'transitioning' && this.modeTran.split('-')[1] != mode) {
- //正飞向其他模式,就要先飞完再飞进来然后执行
- this.afterCModeFuc.unique = function () {
- this.afterCModeFuc.unique = func;
- this.flyToNewMode(options); //这个fuc在trainsitioning状态下传入是无效的,所以后面得用afterCModeFuc。但是执行完afterCModeFuc,afterCModeFuc会变为null,所以里面得用fuc。。orz
- }.bind(this);
- } else {
- this.afterCModeFuc.unique = func; //飞入后执行
- /* try{ //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
- this.flyToNewMode(options);
- }catch(e){
- console.log('FlyToMode遇到问题?')
- } */
- this.flyToNewMode(options);
- }
- }
- }
- }, {
- key: "flyToPano",
- value: function flyToPano(panoId, aim, dur) {
- //如果用的是quaternion,直接用setPose更好
- var defe = Deferred$1();
- var pano = this.app.core.get('Player').model.panos.index[panoId];
- if (pano) {
- this.app.core.get('Player').flyToPano({
- mode: 'panorama',
- pano,
- lookAtPoint: aim,
- duration: dur,
- aimDuration: dur,
- callback: function callback() {
- return defe.resolve();
- }
- });
- } else {
- defe.resolve();
- }
- return defe;
- }
- }, {
- key: "flyToTag",
- value: function flyToTag(tag, force) {
- //xzw 飞向热点
- if (objects.tagManager.activeTag && objects.tagManager.activeTag != tag) {
- this.tagManager.dismissActiveTag();
- }
- objects.tagManager.navigatingViaTag = true; //防止在examine时在tagManager.onPanoChange中dismissExaminedTag
- //setTimeout(function(){
- objects.tagManager.activateTag(tag, 'examine'); //"browse"
- tag.updateBoardOrient = true;
- tag.examine(this, force, function () {
- if (this.following) {
- this.play.control.noFly = true;
- }
- }.bind(this)); //}.bind(this),200)
- }
- }, {
- key: "flyToPoint",
- value: function flyToPoint(aim, o) {
- //飞向某一点的近处看它,类同tag.examine
- var pano;
- if (o.dealDistance) {
- if (this.app.core.get('Player').position.distanceTo(aim) < o.dealDistance) {
- pano = this.app.core.get('Player').currentPano;
- }
- }
- if (!pano) {
- pano = this.app.core.get('Player').model.panos.closestPanoTowardPoint({
- point: aim,
- require: o && o.require,
- rank: o && o.rank
- }) || this.currentPano || this.app.core.get('Player').currentPano;
- }
- this.app.core.get('Player').flyToPano({
- pano: pano,
- lookAtPoint: aim,
- duration: o && o.dur,
- aimDuration: o && o.aimDur
- }, o && o.done);
- } //录屏时panorama关键部位的最后一帧设置一下control的lon lat等属性 否则update的时候视角会被恢复
- }, {
- key: "setCompassDisplay",
- value:
- /**
- * 设置指南针是否可见
- */
- function setCompassDisplay(visible, force) {
- this.app.core.get('Player').compass.setDisplay(visible, force);
- }
- /**
- * 获取截图信息
- * @returns
- */
- }, {
- key: "getScreenshotInfo",
- value: function getScreenshotInfo() {
- var getInfo = function getInfo(info) {
- // 转化得到和初始视角相关的所有信息
- return {
- camera: {
- quaternion: math$2.toPrecision(info.metadata.camera_quaternion.toArray(), 4),
- zoom: info.metadata.ortho_zoom || -1
- },
- mode: info.metadata.camera_mode || 0,
- pano: info.metadata.scan_id || '',
- lon: info.metadata.lon,
- //兼容旧版
- lat: info.metadata.lat
- };
- };
- var info = getInfo(this.app.core.get('Player').getSnapAngleInfo());
- this.app.core.get('Scene').firstView.updateByEntry(info, this.app.core.get('Player').model.panos);
- return info;
- }
- }, {
- key: "lock",
- value: function lock() {
- var player = this.app.core.get('Player');
- player.locked = true;
- }
- }, {
- key: "unlock",
- value: function unlock() {
- var player = this.app.core.get('Player');
- player.locked = false;
- }
- }, {
- key: "autoRotate",
- value: function autoRotate(isRotate) {
- var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.1;
- var control = this.app.core.get('Player').cameraControls.activeControl;
- var mode = this.app.core.get('Player').mode;
- if (isRotate) {
- // 开始
- mode == 'dollhouse' && (control.autoRotateSpeed = speed * 10, control.autoRotate = true);
- mode == 'panorama' && control.startRotating(speed, 0);
- } else {
- // 暂停
- mode == 'dollhouse' && (control.autoRotate = false);
- mode == 'panorama' && control.stopRotating(true);
- }
- }
- /**
- * 截图
- * @param {*} options
- * @returns
- */
- }, {
- key: "screenshot",
- value: function screenshot() {
- var _this3 = this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
- var toBlob = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var prop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- if (!options.length) {
- options = [{
- width: 2048,
- height: 1024,
- name: '2k'
- }, {
- width: 1024,
- height: 512,
- name: '1k'
- }, {
- width: 128,
- height: 128,
- name: '128'
- }];
- }
- return new Promise(function (resolve) {
- var _done = options.length;
- var result = [];
- var player = _this3.app.core.get('Player');
- var timer = setInterval(function () {
- if (player.path && player.path.currentPanoMarker) {
- clearInterval(timer);
- _this3.app.core.get('Screenshot').capture(Object.assign({
- tasks: {
- unFish: options
- },
- snapshotTopview: true,
- notHideTags: true,
- done: function done(data, name, o) {
- if (toBlob) {
- result.push({
- data: base64ToBlob(data),
- name,
- type: 'blob'
- });
- } else {
- result.push({
- data,
- name,
- type: 'base64'
- });
- }
- if (result.length == _done) {
- result.name = name;
- result.o = o;
- resolve(result);
- }
- }
- }, prop));
- }
- }, 50);
- });
- }
- }, {
- key: "screenshot2",
- value: function screenshot2() {
- var sceneRenderer = this.app.core.get('SceneRenderer');
- var link = document.createElement('a');
- var canvas = sceneRenderer.renderer.domElement;
- sceneRenderer.render();
- link.href = canvas.toDataURL().replace('image/png', 'image/octet-stream');
- link.download = 'screenshot2.png';
- link.click();
- }
- /**
- * 设置无缝过渡
- * @param {*} enabled
- */
- }, {
- key: "setFastTransition",
- value: function setFastTransition(enabled) {
- this.app.core.get('Player').setPanoTaskEnable(enabled);
- }
- }, {
- key: "checkXRSupport",
- value: function checkXRSupport() {
- return VR$1.isSupportXR();
- }
- /**
- * 切换模型显示面
- * @param {number} side 0 => auto || 1 => DoubleSide
- */
- }, {
- key: "setModelSide",
- value: function setModelSide(side, dontFly) {
- var player = this.app.core.get('Player');
- if (side === 0) {
- ModelSide.setSide(null);
- } else if (side === 1) {
- ModelSide.setSide(2);
- } else {
- ModelSide.setSide(side);
- }
- player.model.setMode(player.mode
- /* 'dollhouse' */
- ); //update
- dontFly || this.app.core.get('Player').flyToMode('dollhouse');
- }
- }, {
- key: "routeSnapGenerate",
- value: function routeSnapGenerate() {
- //__sdk.TagManager
- RouteSnap.generateAll(this.app);
- }
- }]);
- return Camera;
- }(tinyEmitter);
- Camera.MODE = Viewmode$1;
- 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); }; }
- 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; } }
- var Decoration = /*#__PURE__*/function (_Emiter) {
- _inherits(Decoration, _Emiter);
- var _super = _createSuper$G(Decoration);
- function Decoration(scene) {
- var _this;
- _classCallCheck(this, Decoration);
- _this = _super.call(this);
- _this.app = scene.app;
- _this.edit = {};
- var player;
- _this.deferred = Deferred$1();
- scene.on('loaded', function () {
- player = _this.app.core.get('Player');
- player.GLTFEditor = new GLTFAddManager(player); // GLTFEditor初始化
- // 初始数据加载
- var init = function init(metadata) {
- metadata.boxModels && metadata.boxModels.forEach(function (data) {
- player.GLTFEditor.add(data);
- });
- };
- var metadata = _this.app.store.getValue('metadata');
- if (metadata) init(metadata);else _this.app.store.on('metadata', init);
- _this.deferred.resolve();
- }); // 进入空间装饰模块
- _this.edit.enterModule = function () {
- _this.waitGLTFEditor(function () {
- player.GLTFEditor.editing = true;
- }, _this.edit.enterModule.bind(_assertThisInitialized(_this)));
- }; // 离开空间装饰模块
- _this.edit.leaveModule = function () {
- player.GLTFEditor.editing = false;
- }; // 仅用于新增模型
- _this.edit.addGLTF = function () {
- player.GLTFEditor.add();
- player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
- player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- }; // 删除
- _this.edit.deleteGLTF = function (sid) {
- var gltf = player.GLTFEditor.group.children.find(function (gltf) {
- return gltf.sid === sid;
- });
- player.GLTFEditor.delete(gltf);
- }; // 选中(isEdit为true时选中加编辑)
- _this.edit.focusGLTF = function (sid, isEdit) {
- var gltf = player.GLTFEditor.group.children.find(function (gltf) {
- return gltf.sid === sid;
- });
- if (isEdit) {
- player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
- player.GLTFEditor.select(gltf);
- player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- }
- player.flyToPano({
- pano: player.model.panos.get(gltf.panoId),
- lookAtPoint: gltf.position,
- checkAlone: true
- });
- }; // 保存(返回data和successCallBack)
- _this.edit.confirmGLTFEdit = function () {
- return player.GLTFEditor.save(function () {
- player.modelSideManager.recover(); //恢复modelside设置
- player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
- });
- }; // 退出
- _this.edit.cancelGLTFEdit = function () {
- player.GLTFEditor.unselect();
- player.GLTFEditor.group.children.forEach(function (gltf) {
- if (gltf.isNew) {
- player.GLTFEditor.delete(gltf);
- } else {
- gltf.setFromInfo(gltf.info);
- }
- });
- player.modelSideManager.recover();
- player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
- }; // 重置三维变换
- _this.edit.resetGLTFTranform = function () {
- // player.GLTFEditor.selecting.setTransformFromInfo(player.GLTFEditor.selecting.info)
- player.GLTFEditor.selecting.rotation.set(0, 0, 0);
- player.GLTFEditor.selecting.axisAngle = {
- x: 0,
- y: 0,
- z: 0
- };
- player.GLTFEditor.selecting.scale.set(1, 1, 1);
- _this.emit('Decoration.GLTF.select', player.GLTFEditor.selecting.updateInfo());
- }; // 设置新的模型路径
- _this.edit.setGLTFUrl = function (info) {
- player.GLTFEditor.selecting.zipName = info.zipName;
- player.GLTFEditor.selecting.load(info.url);
- }; // 设置坐标
- _this.edit.setGLTFPosition = function (key, value) {
- player.GLTFEditor.selecting.position[key] = value;
- }; // 设置缩放
- _this.edit.setGLTFScale = function (key, value) {
- player.GLTFEditor.selecting.scale[key] = value;
- }; // 设置旋转
- _this.edit.setGLTFRotation = function (key, value) {
- player.GLTFEditor.selecting.setAxisAngle(key, THREE.MathUtils.degToRad(value)); // player.GLTFEditor.selecting.rotation[key] = THREE.MathUtils.degToRad(value)
- }; // 设置模型显隐
- _this.edit.setGLTFVisible = function (visi) {
- player.GLTFEditor.selecting.visible = !!visi;
- if (visi) {
- player.model.transformControls.attach(player.GLTFEditor.selecting);
- } else {
- player.model.transformControls.detach();
- }
- }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
- _this.edit.switchTransformControlsMode = function (mode) {
- if (parseInt(mode) == 0) mode = 'translate';
- if (parseInt(mode) == 1) mode = 'rotate';
- if (parseInt(mode) == 2) mode = 'scale';
- player.model.transformControls.mode = mode;
- };
- return _this;
- }
- _createClass(Decoration, [{
- key: "showAll",
- value: function showAll() {
- var _this2 = this;
- this.waitGLTFEditor(function () {
- var player = _this2.app.core.get('Player');
- common$1.updateVisible(player.GLTFEditor.group, 'decoration', true); //player.GLTFEditor.group.visible = true
- }, this.showAll.bind(this));
- }
- }, {
- key: "hideAll",
- value: function hideAll() {
- var _this3 = this;
- this.waitGLTFEditor(function () {
- var player = _this3.app.core.get('Player');
- common$1.updateVisible(player.GLTFEditor.group, 'decoration', false);
- }, this.hideAll.bind(this));
- } // 等待GLTFEditor
- }, {
- key: "waitGLTFEditor",
- value: function waitGLTFEditor(func, waitFunc) {
- var player = this.app.core.get('Player');
- if (player && player.GLTFEditor) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- }]);
- return Decoration;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var global$2 = window; //----------------------复制以下内容---------------------------------
- var player$d,
- skyBoxTight,
- meshGroup$1,
- modelBound$1 = new THREE.Box3(),
- ray$1 = new THREE.Raycaster(),
- groundPlane$1 = new THREE.Plane(),
- groundY$1,
- safeBound$1,
- boundConfirmed$1,
- startTime$1,
- boxesSolid$1 = [];
- var MinBoxInitialScore = 0.68; //找不到匹配时,若box分数低于该值,不createSinglePano
- var colors$1 = {
- yellow: new THREE.Color(238 / 255, 217 / 255, 35 / 255),
- green: new THREE.Color(39 / 255, 160 / 255, 146 / 255),
- labelYellow: {
- r: 238,
- g: 217,
- b: 35,
- a: 0.5
- },
- labelGreen: {
- r: 39,
- g: 160,
- b: 146,
- a: 0.5
- }
- };
- var isExt$1, isDiwei$1;
- var standards$1 = {
- cabinet: {
- widthNormal: {
- min: 0.55,
- max: 1.05
- /* max: 0.65 */
- },
- //widthNormal是不计宽还是厚度的平均宽度 //个别场景如S9yepREK8Jl 宽0.8米
- height: {
- min: 0.3,
- max: 2.5,
- standard: 2
- },
- closeRatio: 0.7 //数值越小越容易findRest。一般在墙上的位置不准要设置大些,扎堆放置的设置小些
- },
- fire: {
- widthNormal: {
- min: 0.12,
- max: 0.16
- },
- height: {
- min: 0.4,
- max: 0.58
- },
- widthSame: true,
- //长宽相等
- closeRatio: 4,
- tinyXZ: true //可以通过它近似确定地面高度
- },
- air: {
- widthNormal: {
- min: 0.35,
- max: 0.7
- },
- width: {
- min: 0.48,
- max: 0.75
- },
- //因为总是斜着放所以范围较大
- thick: {
- min: 0.33,
- max: 0.5
- },
- height: {
- min: 1.2,
- max: 2.2,
- standard: 1.8
- },
- atWall: 0.8,
- closeRatio: 1.1
- },
- airSmart: {
- widthNormal: {
- min: 0.35,
- max: 0.7
- },
- width: {
- min: 0.48,
- max: 0.75
- },
- //因为总是斜着放所以范围较大
- thick: {
- min: 0.33,
- max: 0.5
- },
- height: {
- min: 1.2,
- max: 2.2,
- standard: 1.8
- },
- atWall: 0.8,
- closeRatio: 1.1
- },
- 'air-hanging': {
- widthNormal: {
- min: 0.3,
- max: 1
- },
- width: {
- min: 0.8,
- max: 1.1
- },
- thick: {
- min: 0.2,
- max: 0.3
- },
- height: {
- min: 0.3,
- max: 0.5,
- standard: 0.4
- },
- //standard是通常出现的最高高度. 有这个值的在离地的时候直接使用该高度
- bottom: {
- min: 0.8,
- max: 2.0
- },
- // 不绝对,大部分
- atWall: 1,
- //在墙壁的可能性
- closeRatio: 1.5
- },
- battery: {
- widthNormal: {
- min: 0.45,
- max: 1.35
- },
- width: {
- min: 0.7,
- max: 1.4
- },
- thick: {
- min: 0.35,
- max: 0.5
- },
- height: {
- min: 0.3,
- max: 2.5
- },
- //maxHeight
- //有的电池很小。考虑是否追加battery-little 并且限制大电池的长宽高比例
- atWall: 0.9,
- closeRatio: 0.9
- },
- groundBar: {
- widthNormal: {
- min: 0.06,
- max: 0.4
- },
- width: {
- min: 0.3,
- max: 0.5
- },
- thick: {
- min: 0.05,
- max: 0.08
- },
- height: {
- min: 0.1,
- max: 0.2
- },
- bottom: {
- min: 1.2,
- max: 3
- },
- atWall: 1,
- closeRatio: 2
- },
- hlkcWindow: {
- widthNormal: {
- min: 0.08,
- max: 0.5
- },
- width: {
- min: 0.35,
- max: 0.5
- },
- thick: {
- min: 0.03,
- max: 0.06
- },
- height: {
- min: 0.35,
- max: 0.5
- },
- bottom: {
- min: 1.2,
- max: 3
- },
- atWall: 1,
- closeRatio: 2
- },
- electric: {
- widthNormal: {
- min: 0.2,
- max: 0.7
- },
- width: {
- min: 0.5,
- max: 0.65
- },
- thick: {
- min: 0.2,
- max: 0.3
- },
- height: {
- min: 0.5,
- max: 1
- },
- //maxHeight 4GqaqNdyjGf一米高
- bottom: {
- min: 0.8,
- max: 1.8
- },
- atWall: 1,
- closeRatio: 2
- },
- monitor: {
- widthNormal: {
- min: 0.08,
- max: 0.11
- },
- height: {
- min: 0.1,
- max: 0.2,
- standard: 0.15
- },
- //maxHeight
- bottom: {
- min: 1.2,
- max: 3
- },
- atWall: 1,
- closeRatio: 4,
- tiny: true //因为较小且无方向,所以近似一个点,用射线算出的位置比墙面还准,所以其最终位置可用于expandModelBound
- },
- rowBigBox: {
- widthNormal: {
- min: 0.55,
- max: Infinity
- },
- height: {
- min: 0.7,
- max: 2.4,
- standard: 2
- }
- }
- /*"cabling-wall":{
- },
- "cabling-ceil":{
- atCeil:1
- } */
- };
- /* const typeNames = {
- cabinet : 'cabinet', //标准机柜
- air : 'air', //普通空调柜式
- battery : 'battery', //蓄电池组
- }
- */
- var typeNames$1 = {
- fire: 'extinguisher',
- //灭火器
- monitor: 'surveillance_camera',
- //监控摄像机 放第一个,用于继续确定边界
- hlkcWindow: 'hlkc',
- //馈线窗
- groundBar: 'grounding_bar',
- //接地排
- cabinet: 'equipment_cabinet',
- //标准机柜
- battery: 'accumulator',
- //蓄电池组
- /* ac : 'ac_switchboard', //交流配电柜 //这两种合并,因为差别太小了,见QlJau21WP8G的,在全景图两侧识别的竟然一个ac一个dc
- dc : 'dc_distribution', //直流配电设备 */
- electric: ['ac_switchboard', 'dc_distribution'],
- air: 'sdkt',
- //普通空调柜式
- airSmart: 'ventilation_installation' //智能通风设备
- //cabling : 'cabling_rack', //单层走线架 因为在天花板的走线有点复杂,经常断开,无法确定方向所以放弃
- };
- var addLabel$1 = function addLabel(pos, text) {
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- bgcolor = _ref.bgcolor,
- a = _ref.a;
- new THREE.Vector3(0, -0.2, 0);
- bgcolor = bgcolor ? new THREE.Color(bgcolor) : {
- r: 1,
- g: 1,
- b: 1
- }; //let endPos = new THREE.Vector3().addVectors(pos,shift);
- text instanceof Array || (text = [text]);
- var lineCount = Math.round(Math.random() * 6) + 1;
- var lines = [];
- while (lineCount-- > 0) {
- lines.push('|');
- }
- text = [].concat(_toConsumableArray(text), lines, ['o']);
- var textMesh = new TextSprite({
- text,
- textColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- },
- backgroundColor: {
- r: bgcolor.r * 255,
- g: bgcolor.g * 255,
- b: bgcolor.b * 250,
- a: a || 0
- },
- textBorderColor: {
- r: bgcolor.r * 255,
- g: bgcolor.g * 255,
- b: bgcolor.b * 250,
- a: a || 0.9
- },
- textBorderThick: 2,
- margin: {
- x: 0,
- y: 0
- },
- borderRadius: 0,
- player: player$d,
- sizeInfo: {
- minSize: 90,
- maxSize: 300,
- nearBound: 1,
- farBound: 7
- }
- });
- textMesh.position.copy(pos); //textMesh.scale.set(0.3, 0.3, 0.3)
- meshGroup$1.add(textMesh);
- textMesh.sprite.position.y += textMesh.sprite.scale.y * 0.4;
- return textMesh;
- };
- var getBoxFinalPos$1 = function getBoxFinalPos(info) {
- //创建solidbox时的position
- var position;
- var center = getBoxPos$1(info);
- if (standards$1[info.boxType].bottom) {
- //悬挂
- position = center;
- } else {
- position = center.clone().setY(groundY$1 + info.size.y / 2); //使着地
- }
- return position;
- };
- var boxGeo$1 = new THREE.BoxBufferGeometry();
- var boxMat$1 = new THREE.MeshBasicMaterial({
- color: colors$1.yellow,
- opacity: 0.3,
- transparent: true,
- depthTest: false
- });
- 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)];
- var traverse$1 = function traverse(info, fun) {
- //忽略.infos的row 的信息
- fun(info);
- info.list && info.list.forEach(function (a) {
- return traverse(a, fun);
- });
- info.mixedFrom && info.mixedFrom.forEach(function (a) {
- return traverse(a, fun);
- });
- };
- var Box$1 = /*#__PURE__*/function () {
- //结果
- function Box(info) {
- _classCallCheck(this, Box);
- //preDealBox(info)
- this.setFromInfo(info);
- this.buildFromData || (this.name = this.boxType + '-' + this.name);
- if ((this.buildFromData || boundConfirmed$1)) this.draw();
- boxesSolid$1.push(this);
- }
- _createClass(Box, [{
- key: "setFromInfo",
- value: function setFromInfo(info) {
- for (var i in info) {
- this[i] = info[i];
- }
- /* let h = info.size.y
- let standardH = standards[info.boxType].height.standard
- if (h > standardH) {
- h = standardH + Math.log(1 + (h - standardH) / 2) //Math.log2: 以2为底的对数 ,Math.log:自然对数
- info.size.y = h
- } */
- this.position = this.buildFromData ? this.center : getBoxFinalPos$1(this);
- var bound = new THREE.Box3().setFromCenterAndSize(this.position, this.size);
- this.bound = bound;
- }
- }, {
- key: "draw",
- value: function draw() {
- var color = colors$1.yellow; //green //new THREE.Color().setHSL(hue, 0.9, 0.85)
- this.boxHelper = new THREE.Box3Helper(this.bound, color);
- this.boxHelper.material.depthTest = false; //this.boxHelper.material.opacity = 0.5
- this.boxHelper.material.transparent = true;
- this.boxHelper.renderOrder = 30;
- /* let { warnStr, exStr } = this
- warnStr && (exStr += `【${warnStr}】`) */
- //this.label = addLabel(this.position, /* exStr ? [this.name, exStr] : */ this.score ? [this.name, this.score.toFixed(1)] : this.name, { bgcolor: color })
- this.label = new TextSprite({
- text: this.external ? [this.external.eqpName || '', this.external.eqpType || ''] : this.name,
- backgroundColor: Object.assign(colors$1.labelYellow
- /* labelGreen */
- ),
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- borderRadius: 15,
- renderOrder: 10,
- fontSize: 20,
- player: player$d
- });
- meshGroup$1.add(this.label);
- this.label.position.copy(this.position);
- this.label.position.y += 0.3;
- var s = 0.2;
- this.label.scale.set(s, s, s);
- var box = new THREE.Mesh(boxGeo$1, boxMat$1);
- box.position.copy(this.position);
- box.scale.copy(this.size);
- box.masterBox = this;
- box.name = this.name;
- box.renderOrder = 20;
- meshGroup$1.add(box);
- this.boxMesh = box;
- meshGroup$1.add(this.boxHelper);
- isDiwei$1 && this.updateVisible(false, 'unhover');
- }
- }, {
- key: "updateVisible",
- value: function updateVisible(show, reason) {
- common$1.updateVisible(this.boxHelper, reason, show);
- common$1.updateVisible(this.label, reason, show);
- common$1.updateVisible(this.boxMesh, reason, show);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var index = boxesSolid$1.indexOf(this);
- if (index > -1) {
- boxesSolid$1.splice(index, 1);
- if (boundConfirmed$1) {
- this.label.sprite.material.opacity = 0.3;
- this.boxHelper.material.opacity = 0.2;
- this.boxMesh.removeFromParent();
- }
- }
- }
- }, {
- key: "traversePair",
- value: function traversePair(fun) {
- traverse$1(this, fun);
- }
- }, {
- key: "getDirection",
- value: function getDirection() {
- //获得正面朝向。 需要全部box都创建完再调用
- var xProp = this.xProp;
- var dir; //哪边pano多朝哪边
- if (this.boxType == 'cabinet' && this.name.includes('row')) {
- if (this.infos.rowboxs.length > 1) {
- var k = this.infos.reduce(function (w, c) {
- return w + c.k;
- }, 0);
- xProp = k > 1 ? 'width' : 'thick';
- } else {
- //直接使用别的多box的row的方向 ,大多数都相同(会有例外,无所谓了)
- var rows = boxesSolid$1.filter(function (e) {
- return e.boxType == 'cabinet' && e.name.includes('row') && e.dirQua;
- });
- rows.sort(function (a, b) {
- return b.infos.rowboxs.length - a.infos.rowboxs.length;
- });
- var box = rows[0];
- if (box) {
- return this.dirQua = box.dirQua;
- }
- }
- }
- if (!xProp) {
- //根据房间的长宽 散落的cabinet。 fire monitor
- var _getBoxDirProp = getBoxDirProp$1(this, true);
- _getBoxDirProp.xWidthPossible;
- _getBoxDirProp.yWidthPossible;
- xProp = this.xProp;
- /* if(Math.abs(xWidthPossible - yWidthPossible) < 0.3){
- let size = new THREE.Vector3()
- safeBound.getSize(size)
-
- xWidthPossible += (size.x - size.z) * 0.5
-
- if(xWidthPossible > yWidthPossible){
- xProp = 'width'
- }
- } */
- }
- if (xProp) {
- if (!this.panosDir) getPanosDir$1(this);
- if (xProp == 'width') {
- if (Math.abs(this.panosDir['z+']) < Math.abs(this.panosDir['z-'])) {
- //朝-z//也就是新坐标系的y
- //this.dirQua='下'
- dir = new THREE.Vector3(0, 1, 0);
- } else {
- //朝+z
- //this.dirQua='上'
- dir = new THREE.Vector3(0, -1, 0);
- }
- } else {
- if (Math.abs(this.panosDir['x+']) < Math.abs(this.panosDir['x-'])) {
- //朝-x
- //this.dirQua='右'
- dir = new THREE.Vector3(-1, 0, 0);
- } else {
- //朝+x
- //this.dirQua='左'
- dir = new THREE.Vector3(1, 0, 0);
- }
- }
- } //addLabel(this.position, this.dirQua)
- this.dirQua = convertTool.getQuaByAim(dir, new THREE.Vector3(), new THREE.Vector3(0, 0, 1)
- /* new THREE.Vector3(0, 1, 0) */
- );
- return this.dirQua;
- /*飞到俯视图查看(不旋转视图,x朝右,z朝下)。以下四个qua是四个墙壁每个墙壁上的dirQua。
- _x: 0, _y: -0, _z: 1, _w: 0
- _x: 0, _y: 0, _z: -0.707, _w: 0.707 _x: 0, _y: -0, _z: 0.707, _w: 0.707
- x: 0, _y: 0, _z: 0, _w: 1
-
- */
- }
- }, {
- key: "toJson",
- value: function toJson() {
- var _this = this;
- //转出的坐标系是z朝上的
- var category = typeNames$1[this.boxType];
- if (category instanceof Array) {
- var scoreMap = new Map();
- category = category.slice(0);
- category.forEach(function (e) {
- return scoreMap.set(e, 0);
- }); //初始化
- //判断boxType: 寻找所使用的box总分最高的boxType
- var add = function add(box) {
- if (!box) return;
- var score = scoreMap.get(box.category) + box.score;
- scoreMap.set(box.category, score);
- };
- this.traversePair(function (e) {
- add(e.box0);
- add(e.box1);
- });
- category = category.sort(function (a, b) {
- return scoreMap.get(b) - scoreMap.get(a);
- });
- category = category[0]; //最高分
- }
- this.getDirection();
- var json = {
- points: axises$1.map(function (axis) {
- return math$2.invertVisionVector(new THREE.Vector3().addVectors(_this.position, _this.size.clone().multiply(axis).multiplyScalar(0.5))).toArray();
- }),
- category,
- type: this.boxType,
- sid: this.name,
- quaternion: this.dirQua.toArray()
- };
- return json;
- }
- }]);
- return Box;
- }(); // 2d坐标转3d坐标
- var getDirByUV$2 = function getDirByUV(uv, pano) {
- // 计算方向向量
- var yaw = -uv.x * (Math.PI * 2);
- var pitch = Math.PI / 2 - uv.y * Math.PI;
- var dir = new THREE.Vector3();
- dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
- return dir;
- };
- var getCenterDir$2 = function getCenterDir(box) {
- if (box.centerDir) return; //假设不存在在box中间拍摄的情况,所以y不会横跨两边
- var bbox = box.bbox2;
- var center = {
- x: getBbox2center$2(bbox[0], bbox[2]),
- y: (bbox[1] + bbox[3]) / 2
- };
- box.bbox2CenterX = center.x;
- var dir = getDirByUV$2(center, box.pano);
- box.centerDir = dir;
- var centerTop = {
- x: center.x,
- y: bbox[1]
- };
- box.centerTopDir = getDirByUV$2(centerTop, box.pano);
- var centerBtm = {
- x: center.x,
- y: bbox[3]
- };
- box.centerBtmDir = getDirByUV$2(centerBtm, box.pano);
- var leftBtm = {
- x: bbox[0],
- y: bbox[3]
- };
- box.leftBtmDir = getDirByUV$2(leftBtm, box.pano);
- var rightBtm = {
- x: bbox[2],
- y: bbox[3]
- };
- box.rightBtmDir = getDirByUV$2(rightBtm, box.pano);
- };
- var getOtherPos$1 = function getOtherPos(box) {
- if (!box.boxType) return;
- var config = standards$1[box.boxType];
- if (!boundConfirmed$1) {
- if (!config.bottom) {
- ray$1.set(box.pano.position, box.centerBtmDir);
- box.btmPosPredict = ray$1.ray.intersectPlane(groundPlane$1, new THREE.Vector3()); //没有的话就在空中 (部分air-hanging也会有)。 fire的这个值会较大误差,因为groundY还不确定,但不影响,因只用它射线交点的位置。
- if (box.btmPosPredict) {
- var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
- var _standards$box$boxTyp = standards$1[box.boxType].widthNormal,
- min = _standards$box$boxTyp.min,
- max = _standards$box$boxTyp.max;
- min = min * 0.4;
- max = max * 0.4;
- var minA = Math.min(Math.abs(dir2d.x), Math.abs(dir2d.y));
- var depth = math$2.linearClamp(minA, 0, 1, min, max);
- /* const depth = box.category == typeNames.cabinet ? 0.5 : 0.4
- */
- dir2d = dir2d.clone().multiplyScalar(depth);
- box.btmPosPredict.x += dir2d.x;
- box.btmPosPredict.z += dir2d.y; //addLabel(box.btmPosPredict,'b_'+box.category+"_"+box.sid, {bgcolor:'#6ff',a:0.1})
- //box.btmPosPredict.clamp(safeBound.min, safeBound.max)
- }
- }
- return;
- }
- if (!box.posAtWall && config.atWall > 0) {
- //console.log(box.sid, 'getPosWall')
- var shrink = config.thick ? config.thick.min : config.widthNormal.min;
- ray$1.set(box.pano.position, box.centerDir);
- var o = ray$1.intersectObjects([skyBoxTight]);
- if (o[0]) box.posAtWall = new THREE.Vector3().addVectors(box.pano.position, box.centerDir.clone().multiplyScalar(o[0].distance - shrink)); //因墙壁不准确,所以还是尽量不用墙的位置
- /* if(box.btmPos){
- let wallRatio = 0.5;
- if(new THREE.Vector3().subVectors(box.btmPos, box.posAtWall).setY(0).length() > 1 )wallRatio = 0.2 //可能墙壁位置不准,靠后了
- box.predictCenter = new THREE.Vector3().addVectors(box.btmPos.clone().multiplyScalar(1-wallRatio), box.posAtWall.clone().multiplyScalar(wallRatio))
- //box.predictCenter = new THREE.Vector3().addVectors(box.posAtWall, box.btmPos).multiplyScalar(0.5) //也许能当中心点? 虽然y会低一些
- addLabel(box.predictCenter, box.sid+'-preC')
- } */
- }
- if (!box.btmPos) {
- getBoxBtm$1(box);
- }
- if (!box.topPos) {
- getBoxTop$1(box);
- }
- };
- var getUVs$2 = function getUVs(box, imageWidth, imageHeight) {
- if (box.bbox2) return;
- if (!imageWidth) {
- imageWidth = global$2.boxFrame.datas[box.pano.id].imageWidth;
- imageHeight = global$2.boxFrame.datas[box.pano.id].imageHeight;
- }
- if (imageWidth != imageWidth || imageHeight != imageHeight) {
- console.log(imageWidth, imageHeight);
- }
- box.bbox2 = box.bbox.map(function (e, i) {
- //(x1,y1,x2,y2)
- return i % 2 == 0 ? e / imageWidth
- /* + 0.25 */
- : e / imageHeight;
- });
- };
- var getBoxBase$1 = function getBoxBase(box, imageWidth, imageHeight) {
- getBoxType$1(box);
- getUVs$2(box, imageWidth, imageHeight);
- getCenterDir$2(box);
- getOtherPos$1(box);
- };
- var getBbox2Diff$1 = function getBbox2Diff(x1, x2) {
- //获取x1-x2,如果x1在x2右边则为正
- if (Math.abs(x1 - x2) < 0.5) return x1 - x2;else {
- if (x1 > x2) x1 -= 1;else x2 -= 1;
- return x1 - x2;
- }
- };
- var getBbox2center$2 = function getBbox2center(x1, x2) {
- //找中间位置
- if (Math.abs(x1 - x2) > 0.5) {
- //永远找小于180度的那一边
- return (x1 + x2 + 1) / 2; //另外半边
- } else {
- return (x1 + x2) / 2;
- }
- };
- var getBoxTop$1 = function getBoxTop(info) {
- /* if(info.sid == 'pano0-11(mix4,8)'){
- console.log(5)
- } */
- if (info.box1) {
- var o2 = getIntersect2$1(info.box0.pano.position, info.box0.centerTopDir, info.box1.pano.position, info.box1.centerTopDir);
- info.topPos = o2.pos3d;
- info.diffHeight = o2.mid2 ? o2.mid2.distanceTo(o2.mid1) : 1;
- if (info.box0.topPos && info.box1.topPos) {
- info.topPos.y = (info.box0.topPos.y + info.box1.topPos.y) / 2; //原先的不准
- }
- } else {
- //取btm上方对应的位置 ( 因为和skybox的交点会因离墙远而偏上或偏下)
- var box = info.box0 || info;
- var btm = box.btmPos;
- if (!btm) {
- btm = getBoxBtm$1(info);
- }
- box.topPos = btm.clone(); //xz同btm,要求y
- var xDelta = btm.x - box.pano.position.x;
- var zDelta = btm.z - box.pano.position.z;
- var yDelta; //因为pano有旋转所以btm和top的xz其实是不一样的,所以会有误差。 故这里选择delta较大的
- if (Math.abs(xDelta) < Math.abs(zDelta)) {
- yDelta = zDelta * box.centerTopDir.y / box.centerTopDir.z;
- /* console.log('use z', box)
- if(Math.abs(xDelta)<0.1)console.error('!!!!!!!!!!!!!!!!!!!!!!! xDelta',xDelta, box.sid ) */
- } else {
- yDelta = xDelta * box.centerTopDir.y / box.centerTopDir.x; // console.log('use x', box)
- }
- box.topPos.y = yDelta + box.pano.position.y;
- var minHeight =
- /* info.boxType ? standards[info.boxType].height.min : box.category == typeNames.air ? 0.5 : */
- standards$1[getBoxType$1(box)].height.min;
- var diffH = Math.max(box.topPos.y - btm.y, minHeight);
- box.topPos.y = btm.y + diffH;
- info.topPos = box.topPos;
- /* if (box.sid == 'pano2-1') {
- addLabel(box.topPos,'t_'+box.sid,{bgcolor:'#ff4399'})
- addLine(box.pano.position,box.centerTopDir, 20)
- } */
- }
- return info.topPos;
- };
- var getBoxBtm$1 = function getBoxBtm(info) {
- if (info.box1) {
- var o2 = getIntersect2$1(info.box0.pano.position, info.box0.centerBtmDir, info.box1.pano.position, info.box1.centerBtmDir);
- info.btmPos = o2.pos3d; //info.btmPos.y = (info.box0.btmPos.y + info.box1.btmPos.y)/2 //原先的不准
- } else {
- var box = info.box0 || info;
- if (!box.btmPos) {
- /*if (box.sid == 'pano0-7') {
- console.log(3)
- addLine(box.pano.position, box.centerBtmDir, 20)
- }*/
- if (!boundConfirmed$1) {
- return box.btmPosPredict;
- }
- ray$1.set(box.pano.position, box.centerBtmDir);
- var o = ray$1.intersectObjects([skyBoxTight]); //如果skybound有问题,位置就会错
- box.btmPosOri = o[0].point.clone();
- var depth; //缩进 //let depth = Math.abs(o[0].face.normal.y) > 0.9 ? 0.4 : -0.4
- getBoxType$1(box);
- var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
- if (standards$1[box.boxType].thick && standards$1[box.boxType].atWall
- /* box.boxType == 'battery' */
- ) {
- //平贴于墙上,且厚度和宽度相差较大
- //注:air-hanging主要用的是posAtWall
- var _standards$box$boxTyp2 = standards$1[box.boxType].widthNormal,
- min = _standards$box$boxTyp2.min,
- max = _standards$box$boxTyp2.max;
- min = min * 0.3;
- max = max * 0.5;
- if (!box.xProp) getBoxDirProp$1(box);
- if (box.xProp == 'width') {
- depth = math$2.linearClamp(Math.abs(dir2d.x), 0, 1, min, max);
- } else {
- depth = math$2.linearClamp(Math.abs(dir2d.y), 0, 1, min, max);
- }
- } else {
- var w = standards$1[box.boxType].thick || standards$1[box.boxType].widthNormal;
- var w0 = (w.min + w.max) / 2;
- var _min = w0 * 0.5,
- _max = w0 * 0.8;
- var minA = Math.min(Math.abs(box.centerBtmDir.x), Math.abs(box.centerBtmDir.z));
- depth = math$2.linearClamp(minA, 0, 0.707, _min
- /* 0.3 */
- , _max
- /* 0.5 */
- ); //在45度时需要最长的距离。主要针对cabinet
- }
- if (Math.abs(o[0].face.normal.y) < 0.9) {
- if (standards$1[box.boxType].atWall || o[0].point.y - groundY$1 > 0.3) {
- //battery的识别框比较乱,有可能一个电池被识别出好几个,所以
- depth *= -1; //at wall
- }
- }
- var dir2d1 = dir2d.clone().multiplyScalar(depth);
- box.btmPos = o[0].point.clone();
- box.btmPos.x += dir2d1.x;
- box.btmPos.z += dir2d1.y; //addLabel(box.btmPos,'b_'+box.sid,{bgcolor:'#ff4399'})
- }
- info.btmPos = box.btmPos;
- }
- return info.btmPos;
- };
- var getIntersect2$1 = function getIntersect2(pano0Pos, dir0, pano1Pos, dir1) {
- var pos0 = new THREE.Vector3().addVectors(pano0Pos, dir0);
- var pos1 = new THREE.Vector3().addVectors(pano1Pos, dir1);
- var o = math$2.getLineIntersect2({
- A: pano0Pos.clone(),
- B: pano1Pos.clone(),
- p1: pos0,
- p2: pos1,
- dir0,
- dir1
- }); //不用getLineIntersect,因为这个针对热点写的,当无交点时选用的点不是想要的
- if (!o.pos3d) {
- console.error('getIntersect2 no result? ?');
- }
- return o;
- };
- var getBoxPos$1 = function getBoxPos(info) {
- var boxType = getBoxType$1(info);
- 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;
- };
- var isType$1 = function isType(category, type) {
- return type == category || typeNames$1[type] instanceof Array ? typeNames$1[type].includes(category) : typeNames$1[type] == category;
- };
- var getBoxType$1 = function getBoxType(info) {
- if (info.boxType) return info.boxType;
- var category = info.category || info.box0.category;
- if (category == 'rowBigBox') info.boxType = 'rowBigBox';else {
- var type;
- if (category == 'ac_switchboard') {
- console.log(1);
- }
- for (var i in typeNames$1) {
- /* if (i == category || typeNames[i] instanceof Array ? typeNames[i].includes(category) : typeNames[i] == category) {
- type = i
- break //type = typeNamesReverse[type]
- } */
- if (isType$1(category, i)) {
- type = i;
- break;
- }
- }
- /* if(type == 'ac' || type == 'dc'){
- type = 'electric' //合并
- } */
- info.boxType = type;
- }
- return info.boxType;
- };
- /* let getBoxType = info => {
- let type = info.category || info.box0.category
-
- if (type == 'air') {
- let btm = info.btmPos || info.btmPos //btmPosAtWall
- if (!btm) {
- btm = getBoxBtm(info)
- }
- if (!btm) return
- let center = info.posAtWall || (info.preDealRes && info.preDealRes.position) || info.center
- const s = standards['air-hanging']
- if (btm.y - groundY > s.bottom.min) {
- let h0 = btm.y - groundY
- let h1 = (modelBound.max.y - center.y) / (modelBound.max.y - modelBound.min.y)
- let h2 = center.y - btm.y
- let score = h0 * 2 - h1 * 3 - h2 * 3
- if (score > 0) {
- type = 'air-hanging'
- }
- //console.error( score, h0,h1,h2, info.sid||info.name)
- } //注意:如果air被遮住底部,露出的部分只有一点,还是有可能被识别成air-hanging。只能希望
- //console.error( type, info.sid||info.name)
- }
- if (info.box0) {
- info.boxType = type
- //info.box1 && (info.box1.type = type) //因为box0和box1不一定匹配,所以不能直接赋值
- } else {
- info.type = type
- }
- } */
- var getPanosDir$1 = function getPanosDir(info, center) {
- center = center || getBoxPos$1(info);
- var dirs = {
- 'x+': 0,
- 'x-': 0,
- 'z+': 0,
- 'z-': 0,
- got: false
- };
- var getDirs = function getDirs() {
- //靠墙的在它到墙之间是不会有漫游点的
- if (dirs.got || !center) return;
- player$d.model.panos.list.forEach(function (pano) {
- var dir = new THREE.Vector3().subVectors(pano.position, center);
- if (dir.x > 0) {
- dirs['x+'] += dir.x;
- } else {
- dirs['x-'] += dir.x;
- }
- if (dir.z > 0) {
- dirs['z+'] += dir.z;
- } else {
- dirs['z-'] += dir.z;
- }
- });
- dirs.got = true;
- };
- getDirs();
- if (info.panosDir) {
- console.error('already has dir');
- }
- info.panosDir = dirs;
- return dirs;
- };
- var getBoxDirProp$1 = function getBoxDirProp(info, force) {
- //仅适用于方形单个房间房间,不可以是多边形、两个房间
- var xProp, yProp;
- if (info.name == 'pano10-8&pano12-6') {
- console.log(4);
- } //if (info.boxType == 'battery' || info.boxType == 'air-hanging' || info.boxType == 'air' || info.category == 'battery' || info.category == 'air') {
- if (standards$1[info.boxType].atWall && standards$1[info.boxType].thick || force) {
- //根据比例判断
- /* let r1 = Math.abs((center.x - skyBoxTight.position.x) / (center.z - skyBoxTight.position.z))
- let r2 = player.model.size.x / player.model.size.z
- if(!math.closeTo(r1,r2, 0.05)){
- if (r1<r2) {
- ;(xProp = 'width'), (yProp = 'thick') //贴附x(横)墙
- } else {
- ;(xProp = 'thick'), (yProp = 'width') //贴附y(竖)墙
- }
- matchInfo.xProp = xProp
- matchInfo.yProp = yProp
- } */
- //根据距离判断
- var center = getBoxPos$1(info);
- var bound = safeBound$1;
- var minXDiff = Math.min(center.x - bound.min.x, bound.max.x - center.x);
- var minYDiff = Math.min(center.z - bound.min.z, bound.max.z - center.z);
- var dirs = getPanosDir$1(info, center);
- var noX = dirs['x+'] == 0 || dirs['x-'] == 0,
- noZ = dirs['z+'] == 0 || dirs['z-'] == 0; //yi6dsPTWwFM klkcWindow pano0-1&pano2-0
- if (dirs['x+'] == 0 && dirs['x-'] != 0) {
- minXDiff = bound.max.x - center.x;
- } else if (dirs['x-'] == 0 && dirs['x+'] != 0) {
- minXDiff = center.x - bound.min.x;
- }
- if (dirs['z+'] == 0 && dirs['z-'] != 0) {
- minYDiff = bound.max.z - center.z;
- } else if (dirs['z-'] == 0 && dirs['z+'] != 0) {
- minYDiff = center.z - bound.min.z;
- }
- var xWidthPossible = noZ ? 1 : 0,
- yWidthPossible = noX ? 1 : 0;
- xWidthPossible += minXDiff - minYDiff;
- if (!math$2.closeTo(xWidthPossible, yWidthPossible, 0.2) && (minXDiff < 0.7 || minYDiff < 0.7)) {
- if (xWidthPossible < yWidthPossible) {
- xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
- } else {
- xProp = 'width', yProp = 'thick'; //贴附x(横)墙
- }
- }
- if (!xProp) {
- if (!force) {
- //force的话是fire等无方向的类型
- if (info.category) {
- //是box
- info.pose || (info.pose = getBoxPoseByPos$1(info, center));
- xWidthPossible += info.pose.xWidthPossible;
- yWidthPossible += info.pose.yWidthPossible;
- } else {
- traverse$1(info, function (info) {
- if (info.boxposes) {
- //是matchInfo
- info.boxposes.forEach(function (e) {
- xWidthPossible += e.xWidthPossible;
- yWidthPossible += e.yWidthPossible;
- });
- }
- });
- }
- }
- /* if(noX!=noZ){
- if(noX)xWidthPossible
- } */
- if (xWidthPossible > yWidthPossible) {
- xProp = 'width', yProp = 'thick'; //贴附x(横)墙
- } else {
- xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
- }
- }
- xProp && (info.xProp = xProp, info.yProp = yProp);
- return {
- xWidthPossible,
- yWidthPossible
- };
- }
- };
- var preDealBox$1 = function preDealBox(matchInfo) {
- if (matchInfo.preDealRes || !matchInfo.center) return;
- matchInfo.preDealRes = {};
- matchInfo.boxType || getBoxType$1(matchInfo);
- var config = standards$1[matchInfo.boxType];
- config.widthNormal.min;
- var needGetPose;
- var dis = safeBound$1.distanceToPoint(matchInfo.center);
- if (matchInfo.name == 'pano2-5') {
- console.log(4);
- }
- if (dis > 0.3 && !config.tiny && !config.tinyXZ) {
- //Tmo1vLp9Q13: hlkcWindow超出才准确
- //tiny的位置优先级高于bound,因为他们可以确定bound
- /* matchInfo.str && matchInfo.str.includes('outsideBound') */
- //const shrink = minWidth * 0.85
- //addLabel(matchInfo.center, '原')
- var finalPos = matchInfo.center.clone().clamp(safeBound$1.min, safeBound$1.max);
- matchInfo.preDealRes.position = finalPos; //addLabel(finalPos, 'finalPos')
- getBoxType$1(matchInfo);
- needGetPose = true;
- }
- var center = getBoxPos$1(matchInfo);
- if (needGetPose || !matchInfo.boxposes) {
- matchInfo.boxposes = [];
- [matchInfo.box0, matchInfo.box1].forEach(function (box) {
- box && matchInfo.boxposes.push(getBoxPoseByPos$1(box, center));
- });
- } //-----------------
- getBoxDirProp$1(matchInfo);
- };
- var getBoxPoseByPos$1 = function getBoxPoseByPos(box, centerPos) {
- var addDis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- //当得知box的大概位置时,求box在这个角度上的宽度、朝向
- //在这个方向看的box的宽度
- var config = standards$1[box.boxType];
- var angle = getBbox2Diff$1(box.bbox2[2], box.bbox2[0]) * Math.PI; //角度的一半
- var dis = new THREE.Vector3().subVectors(box.pano.position, centerPos).setY(0).length() + addDis;
- var projectWidth = 2 * Math.tan(angle) * dis; //投影宽度 (准确的投影宽度无法求得,只能近似)
- var camDir =
- /* new THREE.Vector2(centerPos.x-box.pano.position.x, centerPos.z-box.pano.position.z).normalize() */
- box.centerDir.clone().setY(0).normalize();
- var camTangent = math$2.getNormal({
- points: [{
- x: 0,
- y: 0
- },
- /* camDir */
- {
- x: camDir.x,
- y: camDir.z
- }]
- }); //视线切线方向
- camTangent.x = Math.abs(camTangent.x);
- camTangent.y = Math.abs(camTangent.y);
- /* if (box.sid == 'pano4-6') {
- console.log(7)
- } */
- var maxWidth = config.widthNormal.max;
- var minWidth = config.widthNormal.min;
- var minProjectWidth; //= (camTangent.x + camTangent.y) * minWidth
- var maxProjectWidth; //= (camTangent.x + camTangent.y) * maxWidth
- var maxX, maxY, minX, minY;
- if (!standards$1[box.boxType].thick) {
- minProjectWidth = (camTangent.x + camTangent.y) * minWidth;
- maxProjectWidth = (camTangent.x + camTangent.y) * maxWidth; //该角度下该类型允许的最大投影距离
- maxX = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最大值(假设y为最小值)
- maxY = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最大值(假设x为最小值)
- minX = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最小值(假设y为最大值)
- minY = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最小值(假设x为最大值)
- } else {
- var minThick_ = config.thick.min;
- var minWidth_ = config.width.min;
- var maxThick_ = config.thick.max;
- var maxWidth_ = config.width.max;
- var maxProjectWidth1 = camTangent.x * maxWidth_ + camTangent.y * maxThick_;
- var maxProjectWidth2 = camTangent.x * maxThick_ + camTangent.y * maxWidth_;
- var minProjectWidth1 = camTangent.x * minWidth_ + camTangent.y * minThick_;
- var minProjectWidth2 = camTangent.x * minThick_ + camTangent.y * minWidth_;
- minProjectWidth = Math.min(minProjectWidth1, minProjectWidth2);
- maxProjectWidth = Math.max(maxProjectWidth1, maxProjectWidth2);
- (camTangent.x + camTangent.y) * maxWidth; //console.log('diffaaaaaa',maxProjectWidth,a, box.sid)
- maxX = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.y) / camTangent.x, minThick_, maxWidth_); //可得x的最大值(假设y为最小值)
- maxY = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.x) / camTangent.y, minThick_, maxWidth_); //可得y的最大值(假设x为最小值)
- minX = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.y) / camTangent.x, minThick_, maxWidth_);
- minY = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.x) / camTangent.y, minThick_, maxWidth_);
- }
- /*
- let maxX = projectWidth / camTangent.x //可得x的最大值(假设y为0)
- let maxY = projectWidth / camTangent.y //可得y的最大值(假设x为0)
- */
- //判断方向
- var o = {
- box,
- projectWidth,
- camTangent,
- maxProjectWidth,
- minProjectWidth,
- dis,
- maxX,
- maxY,
- minX,
- minY
- };
- if (config.atWall > 0
- /* isType(box.category,battery) || isType(box.category,air) */
- ) {
- //为了获取朝向
- o.xWidthPossible = -Math.abs(projectWidth - camTangent.x * maxWidth - camTangent.y * minWidth);
- o.yWidthPossible = -Math.abs(projectWidth - camTangent.x * minWidth - camTangent.y * maxWidth); //在接近45度时容易不准。另外如果被遮住一部分更会错,因此尽量不让被遮住的匹配
- }
- return o;
- };
- var getPoseScore$1 = function getPoseScore(boxposes, boxType) {
- var score = 0;
- var minDis = 1.5;
- /* if (boxposes[0].box.sid == 'pano12-13' && boxposes[1].box.sid == 'pano8-6') {
- console.log(4)
- } */
- boxposes.forEach(function (pose) {
- //pose.lowR = pose.dis < minDis ? Math.pow(THREE.MathUtils.smoothstep(pose.dis / minDis, 0, 1),2) : 1 //太近的话误差大
- pose.lowR = pose.dis < minDis ? Math.pow(pose.dis / minDis, 1.4) : 1; //太近的话误差大
- if (pose.projectWidth > pose.maxProjectWidth) {
- score += Math.pow((pose.projectWidth / pose.maxProjectWidth - 1) * pose.lowR, 2) * 500; //超过的话数字较大所以乘的数小一些
- } else if (
- /* isSingle && */
- pose.projectWidth < pose.minProjectWidth) {
- score += Math.pow((pose.minProjectWidth / pose.projectWidth - 1) * pose.lowR, 2) * 500;
- }
- var _standards$boxType$wi = standards$1[boxType].widthNormal,
- min = _standards$boxType$wi.min;
- _standards$boxType$wi.max;
- if (standards$1[boxType].atWall == 1 && min < 0.3 || boxposes.length == 2 && boxType == 'battery') {
- var _standards$boxType$wi2 = standards$1[boxType].widthNormal,
- _min2 = _standards$boxType$wi2.min,
- _max2 = _standards$boxType$wi2.max; //let r = Math.max(0.001, (pose.projectWidth - min) / (max - min))
- var diff = _max2 - _min2;
- var r = math$2.linearClamp(pose.projectWidth, _min2, _min2 + diff * 0.5, 600, 0); //if(boxposes.length == 2 && boxType == 'battery'){//由于battery经常出现遮挡,导致方向出错,因此尽量不匹配projectWidth较短的,尽管这本有可能是对的
- score += r; //}
- /* if (min < 0.3 && r < 0.5) {
- //从贴近墙面的位置看侧面的话,容易被挡住,不准,尤其是电箱
- score += ((max - min) / r / min) * 5
- } */
- }
- });
- score = Math.min(score, 1300); //压低一点,因为得的宽度可能不准
- if (boxposes.length == 2) {
- //每一个方向对应有四个方向(每个象限一个)看到的projectWidth应该接近。
- //先把camTangent转化为第一个象限的
- var camTangent0 = new THREE.Vector2(Math.abs(boxposes[0].camTangent.x), Math.abs(boxposes[0].camTangent.y));
- var camTangent1 = new THREE.Vector2(Math.abs(boxposes[1].camTangent.x), Math.abs(boxposes[1].camTangent.y));
- var a = camTangent0.dot(camTangent1);
- if (a > 0.8) {
- //WcLVXvmV9AU
- //0.9: 25度之内. 0.8: 36.8度之内
- var diff = Math.abs(boxposes[0].projectWidth - boxposes[1].projectWidth);
- boxposes.score2 = a * diff * 1300 * boxposes[0].lowR * boxposes[1].lowR;
- score += boxposes.score2; //console.warn('在同一个方向看到的projectWidth应该接近。 ', diff)
- }
- boxposes.camTangentCos = a;
- } //要不要加上minX等的差距?
- score = Math.min(score, 1200);
- return -score;
- };
- var getBoxSize$1 = function getBoxSize(info) {
- if (info.boxType == 'groundBar') {
- console.log(1);
- }
- if (info.size) return; //console.warn('开始算 ' + info.name)
- var exStr = '',
- warnStr = '';
- var x, y; //求对角线的向量 x>0,y>0
- //假设盒子的长宽为x,y (x>0,y>0),视线切线单位向量为(k,m),投影距离:x'k+y'm.(x'是正负x,y'是正负y)
- //由于盒子的对角线有四个可选方向,(类似四个象限) 则需要能使投影距离最长的一个对角线向量。
- //如,当k<0,m>0时,要使xk+ym 最大,必有x<0,y>0. 故 x = -x', y = y', 故 投影距离:x'k+y'm = x(-k)+ym 。
- //故无论km的符号如何,只要变为正数,再去联立方程即可得xy。(相当于切线转到第一象限)
- //注:但是因为无法获取准确的投影距离(角平分线左右两边的端点到角平分线的距离不相等,垂足也无法确定),所以所算的误差非常大。
- if (info.name == 'pano6-13&pano4-13') {
- console.log(6);
- }
- var center = getBoxPos$1(info);
- var oriX, oriY;
- if (info.predictSize) {
- x = oriX = info.predictSize.x, y = oriY = info.predictSize.y;
- } else {
- if (info.box1) {
- var x1 = info.boxposes[0].camTangent.x,
- x2 = info.boxposes[1].camTangent.x,
- y1 = info.boxposes[0].camTangent.y,
- y2 = info.boxposes[1].camTangent.y,
- w1 =
- /* info.boxposes[0].projectWidth, */
- THREE.MathUtils.clamp(info.boxposes[0].projectWidth, info.boxposes[0].minProjectWidth, info.boxposes[0].maxProjectWidth * 1.1),
- //校准。如果projectwidth不准那算出来更不准. 但XswQxwmn2ZC的里侧电池是前者更准
- w2 =
- /* info.boxposes[1].projectWidth */
- THREE.MathUtils.clamp(info.boxposes[1].projectWidth, info.boxposes[1].minProjectWidth, info.boxposes[1].maxProjectWidth * 1.1); //如果识别到柜门上,(柜体被遮住了),整体中心就会在柜门上,且厚度小于真实值。
- if (x1 == 0) {
- y = w1;
- x = (w2 - y2 * y) / x2;
- } else {
- //联立方程得:
- y = (w2 - x2 / x1 * w1) / (y2 - x2 / x1 * y1);
- x = (w1 - y1 * y) / x1;
- } //console.log('xy', { x, y })
- (x < 0.3 || x > 1.4) && (exStr += ' x:' + math$2.toPrecision(x, 2));
- (y < 0.3 || y > 1.4) && (exStr += ' y:' + math$2.toPrecision(y, 2));
- if (y < 0 || x < 0) {
- //console.log('<0 ?????????')
- warnStr = x < 0 ? 'x<0!' : 'y<0!';
- }
- oriX = x, oriY = y;
- } else {
- //single pano data
- //将maxX maxY 限定在标准范围内
- if (info.xProp) {
- var widthValue = standards$1[info.boxType].width;
- var thickValue = standards$1[info.boxType].thick;
- var maxX, maxY, minX, minY;
- if (info.xProp == 'width') {
- /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max)
- y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max)
- */
- maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max); //AG0bi2fhb3 需要将得到的minX等这四项都clamp后再平均
- maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max);
- minX = THREE.MathUtils.clamp(info.boxposes[0].minX, widthValue.min, widthValue.max);
- minY = THREE.MathUtils.clamp(info.boxposes[0].minY, thickValue.min, thickValue.max);
- } else {
- /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max)
- y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max)
- */
- maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max);
- maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max);
- minX = THREE.MathUtils.clamp(info.boxposes[0].minX, thickValue.min, thickValue.max);
- minY = THREE.MathUtils.clamp(info.boxposes[0].minY, widthValue.min, widthValue.max);
- }
- x = oriX = (maxX + minX) / 2;
- y = oriY = (maxY + minY) / 2;
- } else {
- //x = oriX = y = oriY = (min+max)/2
- var standard = standards$1[info.boxType].widthNormal;
- x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, standard.min, standard.max);
- y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, standard.min, standard.max);
- }
- } //按正常来说,得到的x,y都应>0,但是由于箱子会被遮挡,导致投影宽度比真实的小,算出的也不准,可能是负数
- //所以手动将过小的宽度矫正
- }
- /* if(info.name == "pano2-6"){
- console.log(7)
- } */
- var height;
- if (standards$1[info.boxType].bottom) {
- //悬挂的
- //挂式空调最好把长宽固定。 不过极少出错
- //center.y -= 0.1 //很可能过高
- height = standards$1[info.boxType].height.standard;
- getBoxBtm$1(info);
- if (height) {
- var d = center.y - info.btmPos.y;
- center.y -= THREE.MathUtils.clamp((d - height / 2) / 2, -0.1, 0.1); //如果中心点到底部的距离和height的一半不同,中心点移动差值的一半
- } else {
- var btmY = info.btmPos.y;
- /* let ys = [info.btmPos.y]//info.btmPos.y蛮不准的
- if(info.box0){
- ys.push(info.box0.btmPos.y)
- }
- if(info.box1){
- ys.push(info.box1.btmPos.y)
- }
- btmY = ys.reduce((w,c)=>{return w+c},0)
- btmY/=ys.length //平均 */
- height = (center.y - btmY) * 2;
- }
- } else {
- if (!info.topPos) getBoxTop$1(info);
- height = info.topPos.y - groundY$1;
- }
- var o = restrictSize$1(x, height, y, info);
- x = o.x, height = o.y, y = o.z;
- if (standards$1[info.boxType].widthSame) {
- x = y = (x + y) / 2;
- }
- info.size = new THREE.Vector3(x, height, y);
- info.sizeAdjust = Math.pow(Math.abs(x - oriX), 1.3) + Math.pow(Math.abs(y - oriY), 1.3); //计算得到的值和标准值之间的差距,可以反映该info的匹配分值
- if (info.sizeAdjust) info.score = (info.score || 0) - Math.min(info.sizeAdjust * 100, 400);
- info.size.oriX = oriX, info.size.oriY = oriY;
- info.exStr = exStr, info.warnStr = warnStr;
- };
- var restrictSize$1 = function restrictSize(x, y, z, info) {
- var s;
- var xProp = info.xProp,
- yProp = info.yProp;
- if (xProp != void 0) {
- var _standards$info$boxTy = standards$1[info.boxType][xProp],
- min = _standards$info$boxTy.min,
- max = _standards$info$boxTy.max;
- x = THREE.MathUtils.clamp(x, min, max);
- var _standards$info$boxTy2 = standards$1[info.boxType][yProp],
- min = _standards$info$boxTy2.min,
- max = _standards$info$boxTy2.max;
- z = THREE.MathUtils.clamp(z, min, max);
- s = true;
- }
- if (!s) {
- var _standards$info$boxTy3 = standards$1[info.boxType].widthNormal,
- min = _standards$info$boxTy3.min,
- max = _standards$info$boxTy3.max;
- x = THREE.MathUtils.clamp(x, min, max);
- z = THREE.MathUtils.clamp(z, min, max);
- }
- var _standards$info$boxTy4 = standards$1[info.boxType].height,
- min = _standards$info$boxTy4.min,
- max = _standards$info$boxTy4.max;
- y = THREE.MathUtils.clamp(y, min, max);
- return {
- x,
- y,
- z
- };
- };
- var getMixBox$1 = function getMixBox(box0, box1) {
- //重叠部分
- var box = new THREE.Box2();
- box.min.set(Math.max(box0.min.x, box1.min.x), Math.max(box0.min.y, box1.min.y));
- box.max.set(Math.min(box0.max.x, box1.max.x), Math.min(box0.max.y, box1.max.y));
- return box;
- };
- var getLeftRight$1 = function getLeftRight(boxArr) {
- //获取pano的boxes中最左和最右的bbox.x
- var lefts = boxArr.map(function (e) {
- return e.bbox2[0];
- });
- var rights = boxArr.map(function (e) {
- return e.bbox2[2];
- });
- lefts.sort(function (a, b) {
- return getBbox2Diff$1(a, b);
- });
- rights.sort(function (a, b) {
- return getBbox2Diff$1(b, a);
- });
- var leftX = lefts[0]; //最左
- var rightX = rights[0]; //最右
- return {
- leftX,
- rightX
- };
- };
- global$2.searchCount1 = 0, global$2.escapeCount1 = 0;
- var searchPair$1 = function searchPair(beginItem, group0_, group1_, parentPairs, resultPairs, evaluateFun, minScore) {
- //配对结果个数为n!,其中n是每组的元素个数。注意当n=10时,已经有40320个,非常恐怖。
- var pair = [],
- parentExit = !!parentPairs;
- var removeParent = function removeParent() {
- //元结点裂变出多个,来装新的pair
- if (parentExit) {
- var i = resultPairs.indexOf(parentPairs);
- resultPairs.splice(i, 1);
- parentExit = false;
- }
- };
- if (!parentPairs) {
- //首次
- if (group0_.length == 0 || group1_.length == 0) return; //保证第一个的个数<=第二个,否则第一组多出来的永远匹配不上
- if (group0_.length > group1_.length) {
- var t = group0_;
- group0_ = group1_;
- group1_ = t;
- }
- beginItem = group0_[0];
- var complex = Object.keys(global$2.boxFrame.datas).length;
- if (complex < 10) evaluateFun = null;else minScore = math$2.linearClamp(complex, 10, 80, -4000, -500); //console.log('searchPair length',group0_.length,group1_.length)
- }
- searchCount1++;
- for (var j = 0; j < group1_.length; j++) {
- pair = [beginItem, group1_[j]]; //if(pair[0].sid == 'void' || pair[1].sid == 'void')continue
- var evaluate = void 0;
- if (evaluateFun
- /* && !(pair[0].sid == 'void' || pair[1].sid == 'void') */
- ) {
- evaluate = evaluateFun(pair[0], pair[1]);
- if (evaluate == void 0 || evaluate.score <= minScore) {
- //console.log('因为评估出匹配可能性低所以跳过',pair[0],pair[1],evaluate)
- escapeCount1++;
- continue;
- }
- }
- var newPairs = void 0; //用来存放该组pair
- if (parentPairs) {
- removeParent();
- newPairs = parentPairs.slice(0); //复制
- newPairs.push(pair);
- } else {
- newPairs = [pair]; //新的容器
- }
- resultPairs.push(newPairs);
- var newGroup0 = group0_.slice(0);
- var newGroup1 = group1_.slice(0);
- var index = newGroup0.indexOf(pair[0]);
- newGroup0.splice(index, 1);
- index = newGroup1.indexOf(pair[1]);
- newGroup1.splice(index, 1);
- if (newGroup0.length > 0 && newGroup1.length > 0) {
- searchPair(newGroup0[0], newGroup0, newGroup1, newPairs, resultPairs, evaluateFun, minScore);
- }
- }
- }; //如果第一个元素就和后面所有的都不匹配,就直接返回了怎么办?
- var PanoBoxFrame = /*#__PURE__*/function (_THREE$Group) {
- _inherits(PanoBoxFrame, _THREE$Group);
- var _super = _createSuper$F(PanoBoxFrame);
- function PanoBoxFrame(player_, ifAnalyze, dataList) {
- var _this2;
- _classCallCheck(this, PanoBoxFrame);
- _this2 = _super.call(this);
- _this2.clear();
- player$d = player_;
- player$d.model.add(_assertThisInitialized(_this2));
- global$2.boxFrame = _assertThisInitialized(_this2);
- if (browser$1.urlHasValue('ext')) {
- isExt$1 = true;
- isDiwei$1 = isExt$1 && !browser$1.urlHasValue('ctrl');
- }
- _this2.ifAnalyze = ifAnalyze;
- _this2.wireframes = new THREE.Object3D();
- _this2.wireframes.name = 'wireframes';
- _this2.add(_this2.wireframes);
- _this2.matchScoreMap = {};
- _this2.bindEvents();
- meshGroup$1 = new THREE.Object3D();
- meshGroup$1.name = 'testBox';
- _this2.add(meshGroup$1);
- _this2.visiInfos = {};
- _this2.compute(dataList);
- return _this2;
- }
- _createClass(PanoBoxFrame, [{
- key: "compute",
- value: function () {
- var _compute = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(dataList) {
- var _this3 = this;
- var beginCompute, done, loadAll, _loadAll;
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- _loadAll = function _loadAll3() {
- _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
- var _this5 = this;
- var data, box4;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- _context2.next = 2;
- return http.post('/service/shapes/sceneMarkShape/getInfos', {
- num: player$d.$app.config.num
- });
- case 2:
- data = _context2.sent;
- if (!(!data.data || !data.success)) {
- _context2.next = 5;
- break;
- }
- return _context2.abrupt("return");
- case 5:
- if (isExt$1) {
- (data.data.box8.dataSet.boxes || data.data.box8.dataSet).forEach(function (e) {
- // if (e.external && !e.external.show) {
- // return
- // }
- // e.external = {
- // eqpType: 'equipment_cabinet',
- // eqpName: '送变电机房BATS_1',
- // show: true,
- // eqpId: '150035210000000000125288',
- // url: 'http://120.194.14.251:40004/vr_3dWeb/deviceInfo?rackId=7a323f16-ac13-4434-bf97-c44d1783a217',
- // }
- var point1 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[0]));
- var point2 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[1]));
- var point3 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[2]));
- var point4 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[4]));
- var size = new THREE.Vector3(point1.distanceTo(point2), point1.y - point4.y, point3.distanceTo(point2));
- var center = new THREE.Vector3().addVectors(point3, point4).multiplyScalar(0.5); //对角线中点
- //可能需要考虑上rotation,现暂时不需要
- new Box$1({
- buildFromData: true,
- center,
- size,
- boxType: e.type,
- name: e.sid,
- external: e.external
- });
- });
- this.ifAnalyze = false;
- this.visible = false;
- }
- if (!isExt$1 || browser$1.urlHasValue('ctrl')) {
- box4 = Array.isArray(data.data) ? data.data : data.data.box4; // 兼容旧数据
- box4.forEach(function (e) {
- var panoId = e.imagePath.split('.jpg')[0];
- _this5.datas[panoId] = e;
- });
- this.visible = true;
- }
- done();
- case 8:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this);
- }));
- return _loadAll.apply(this, arguments);
- };
- loadAll = function _loadAll2() {
- return _loadAll.apply(this, arguments);
- };
- startTime$1 = Date.now();
- this.datas = {};
- this.datasMixed = {};
- this.boxesSolid = boxesSolid$1;
- beginCompute = function beginCompute() {
- //获取匹配分数
- var getMatchScore = function getMatchScore(box0, box1) {
- var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- isSingle = _ref2.isSingle,
- center = _ref2.center,
- onlyGet = _ref2.onlyGet,
- dontCheckDis = _ref2.dontCheckDis;
- var name0 = box0.sid + '&' + box1.sid;
- var name1 = box1.sid + '&' + box0.sid;
- var boxType = getBoxType$1(box0);
- var matchInfo0 = _this3.matchScoreMap[boxType].get(name0);
- var matchInfo1 = _this3.matchScoreMap[boxType].get(name1);
- var matchInfo = matchInfo0 || matchInfo1;
- if (onlyGet) return matchInfo;
- var name;
- if (!matchInfo) {
- name = name0;
- matchInfo = {
- name,
- box0,
- box1,
- center
- };
- _this3.matchScoreMap[boxType].set(name, matchInfo);
- } else {
- return matchInfo;
- }
- if (name == 'pano120-20&pano130-17') {
- console.log(5);
- }
- getBoxBase$1(box0);
- getBoxBase$1(box1);
- var A = box0.pano.position.clone();
- var B = box1.pano.position.clone();
- var AB = new THREE.Vector3().subVectors(B, A);
- var AB2d = new THREE.Vector2(AB.x, AB.z).normalize();
- 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();
- 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();
- var angleA = Math.acos(AB2d.dot(AP12d));
- var angleB = Math.PI - Math.acos(AB2d.dot(BP22d));
- var score = 100,
- str = [];
- if (angleA + angleB > Math.PI + 0.2) {
- //无交点(比180大是因为中心角度有误差,所以给一定的容错)
- //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因角度大于180度 不匹配`)
- return Object.assign(matchInfo, {
- score: -5000,
- str: ['angle>180']
- });
- }
- if (box0.type != box1.type) {
- return Object.assign(matchInfo, {
- score: -5000,
- str: ['typeNotSame']
- });
- }
- if (matchInfo.dirAngleXZ == void 0) {
- matchInfo.dirAngleXZ = THREE.MathUtils.radToDeg(Math.acos(AP12d.dot(BP22d))); //需要尽量接近90度算出来的交点会比较准
- matchInfo.minAng = Math.min(180 - matchInfo.dirAngleXZ, matchInfo.dirAngleXZ); //角度小的getIntersect2容易算不准
- if (isSingle) {
- var bestDisSquared = 2; //单个匹配单个,而非多个匹配多个(没有固定到两个漫游点),所以可以直接寻找最优角度
- score += Math.sin(THREE.MathUtils.degToRad(matchInfo.dirAngleXZ)) * 300;
- score += matchInfo.dirAngleXZ; //另外角度越大越不容易偏向一边
- score -= Math.abs(getBoxPos$1(box0).distanceToSquared(box0.pano.position) - bestDisSquared) * 10;
- score -= Math.abs(getBoxPos$1(box1).distanceToSquared(box1.pano.position) - bestDisSquared) * 10;
- }
- }
- var shinkRatio = 1;
- var btmPos0 = box0.btmPos || box0.btmPosPredict; //fire类型先用btmPosPredict,测定groundY后才有btmPos
- var btmPos1 = box1.btmPos || box1.btmPosPredict;
- if (!dontCheckDis) {
- //let r = box0.boxType == 'air' ? 1 : box0.boxType == 'cabinet' ? 0.9 : 0.7 //随着宽度增加而降低
- var r = THREE.MathUtils.clamp(0.8 / standards$1[boxType].widthNormal.max, 0.6, 2); //随着宽度增加而降低 UWrshepp0G5的fire
- if (!standards$1[boxType].bottom && btmPos0 && btmPos1) {
- //注:挂空调不应使用btmPosPredict
- var d = btmPos0.distanceToSquared(btmPos1);
- matchInfo.btmPosPreDis = d;
- score -= d * 1300 * r * shinkRatio;
- if (box1.topPos) {
- var a = box0.topPos.distanceToSquared(box1.topPos);
- matchInfo.topPosPreDis = a;
- var u = a * 700 * r * shinkRatio;
- var AP0 = new THREE.Vector2(btmPos0.x - A.x, btmPos0.z - A.z).lengthSq();
- var AP1 = new THREE.Vector2(btmPos1.x - B.x, btmPos1.z - B.z).lengthSq();
- if (AP0 < 0.4 || AP1 < 0.4) u *= 0.3; //太近
- score -= u;
- }
- } else if (box0.posAtWall && box1.posAtWall) {
- //
- var _d = box0.posAtWall.distanceToSquared(box1.posAtWall);
- matchInfo.wallPosPreDis = _d;
- score -= _d * 200 * r; //墙面不准所以分低 ftMTQIrs79
- _d = box0.btmPosOri.distanceToSquared(box1.btmPosOri); //还是加一下
- matchInfo.btmPosPreDis = _d;
- score -= _d * 200 * r * shinkRatio;
- /* let h0 = box0.topPos.y - box0.btmPos.y
- let h1 = box1.topPos.y - box1.btmPos.y
- score -= Math.abs(h0-h1) * 3000 * r * shinkRatio //高度差 倾斜角度大的不准
- */
- }
- }
- if (!matchInfo.center) {
- var o = getIntersect2$1(A, box0.centerDir, B, box1.centerDir);
- matchInfo.center = o.pos3d.clone();
- /* let o2 = math.getLineIntersect({ A, B, p1: A.clone().add(box0.centerDir), p2:B.clone().add(box1.centerDir) })
- matchInfo.center2 = o2.pos3d.clone() */
- /* if (name == "pano16-4&pano18-5") {
- addLine(A, box0.centerBtmDir, 10), addLine(B, box1.centerBtmDir, 10)
- } */
- //验证是否漫游点到中心点的方向和centerDir一样
- var dir0 = new THREE.Vector3().subVectors(o.pos3d, A).normalize();
- var dir1 = new THREE.Vector3().subVectors(o.pos3d, B).normalize();
- var sum = dir0.dot(box0.centerDir) + dir1.dot(box1.centerDir);
- var wrongDir = sum < 1.95;
- score -= (2 - sum) * 10000;
- if (wrongDir) {
- str.push('wrongDir');
- return Object.assign(matchInfo, {
- score: score - 5000,
- str
- });
- }
- if (!dontCheckDis && !standards$1[boxType].bottom && box0.btmPos && box1.btmPos) {
- //墙壁位置不准所以不用 KK-ftMTQIrs79
- var p0 = new THREE.Vector2(box0.btmPos.x, box0.btmPos.z);
- var p1 = new THREE.Vector2(box1.btmPos.x, box1.btmPos.z);
- var p = new THREE.Vector2(matchInfo.center.x, matchInfo.center.z);
- var dis = p0.distanceToSquared(p) + p1.distanceToSquared(p);
- var s = math$2.linearClamp(matchInfo.minAng, 0, 20, 0, 1);
- score -= dis * 1500 * s; //如果距离较远就说明算的center误差大,不可信。可能有一个框不准确
- matchInfo.centerDrift = dis;
- }
- getBoxBtm$1(matchInfo);
- var cr; //getIntersect2结果的权重
- if (standards$1[box0.boxType].atWall == 1) {
- cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, 1); //墙壁误差大,所以尽量完全依赖cIntersect。。。后期如果该墙壁校准了可以调整
- } else {
- cr = math$2.linearClamp(matchInfo.minAng, 2, 20, 0, 0.4);
- }
- var predict0 = !standards$1[boxType].bottom && box0.btmPos || box0.posAtWall || matchInfo.topPos; //在墙上的除非角度小,否则不考虑cIntersect
- var predict1 = !standards$1[boxType].bottom && box1.btmPos || box1.posAtWall || matchInfo.topPos; //相对来说btmPos要比center准一点?因为center有在两个维度上的误差
- var btmRatio = 0.5;
- var cIntersect = new THREE.Vector3().addVectors(matchInfo.center.clone().multiplyScalar(1 - btmRatio), matchInfo.btmPos.clone().multiplyScalar(btmRatio)).setY(o.pos3d.y);
- if (predict0 && predict1) {
- matchInfo.center = new THREE.Vector3().addVectors(cIntersect.clone().multiplyScalar(cr), predict0.clone().add(predict1).multiplyScalar(1 / 2 * (1 - cr))).setY(o.pos3d.y);
- } else {
- matchInfo.center = cIntersect;
- }
- matchInfo.cIntersect = cIntersect; //addLabel(matchInfo.center, matchInfo.name + '-c')
- }
- getBoxType$1(matchInfo);
- /* if (matchInfo.boxType != box0.type || matchInfo.boxType != box1.type) {
- ;(score -= 1000), str.push('typeNotSame2')
- } */
- {
- var vec0 = new THREE.Vector3().subVectors(box0.pano.position, matchInfo.center);
- var vec1 = new THREE.Vector3().subVectors(box1.pano.position, matchInfo.center);
- if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0) {
- //同一个象限(center会偏向一侧)
- score -= 200;
- }
- }
- if (!safeBound$1.containsPoint(matchInfo.center)) {
- var _dis = safeBound$1.distanceToPoint(matchInfo.center) //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因中心点在bounding外不匹配`, center, 'dis: ' + dis)
- ;
- score -= 1000 * _dis * _dis, str.push('outsideBound');
- Object.assign(matchInfo, {
- score,
- str,
- center: matchInfo.center,
- disToBound: _dis
- });
- if (_dis > 0.5) return matchInfo;
- } //检查宽度
- var boxposes;
- var checkWidth = function checkWidth() {
- boxposes = [];
- [box0, box1].forEach(function (box) {
- var pose = getBoxPoseByPos$1(box, matchInfo.center);
- boxposes.push(pose); //如果超出标准,基本上这二者不匹配;但过小的话,有可能是被遮挡所以残缺,因此不予过滤
- });
- };
- checkWidth();
- score += getPoseScore$1(boxposes, boxType
- /* isSingle */
- ); //根据投影信息预测的长度再得匹配分数
- return Object.assign(matchInfo, {
- score: score,
- str,
- /* diffHalfHeight, */
- boxposes
- });
- };
- _this3.rows = {};
- /* let getchainNext = (left, end, chain, boxes) => {
- chain.push(left)
- if (left == end) return boxes.chains.push(chain)
- let nodes = boxes.relationships.filter(pair => pair.includes(left))
- let rights = nodes.map(pair => pair.find(e => e != left))
- rights = rights.filter(e => !chain.includes(e) && boxes.indexOf(e) > boxes.indexOf(left))
- rights.forEach(right => {
- getchainNext(right, end, chain.slice(), boxes)
- })
- } */
- var getPanoBigRowBox = function getPanoBigRowBox(panoBoxes) {
- var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- _ref3$reason = _ref3.reason,
- reason = _ref3$reason === void 0 ? 'row' : _ref3$reason;
- //将一个pano中的所有boxes分组,识别哪些是一排的。也可用于识别融合
- var pano = panoBoxes[0].pano;
- var category = panoBoxes[0].category;
- var type = category + '|' + reason;
- _this3.rows[type] || (_this3.rows[type] = {});
- if (_this3.rows[type][pano.id]) return _this3.rows[type][pano.id];
- var bigBoxes;
- var bigBox = {
- sid: 'pano' + pano.id + (reason == 'mix' ? '-mix' : '-row'),
- pano,
- category: reason == 'mix' ? category : 'rowBigBox',
- boxType: reason == 'mix' ? panoBoxes[0].boxType : 'rowBigBox'
- };
- var rows = [];
- for (var i = 0; i < panoBoxes.length; i++) {
- var box0 = panoBoxes[i];
- getBoxBase$1(box0);
- var _ref4 = [box0.bbox2[0], box0.bbox2[2]],
- left0 = _ref4[0],
- right0 = _ref4[1];
- for (var j = i + 1; j < panoBoxes.length; j++) {
- var box1 = panoBoxes[j];
- getBoxBase$1(box1);
- if (box0.boxType != box0.boxType) continue; //类型不同
- var _ref5 = [box1.bbox2[0], box1.bbox2[2]],
- left1 = _ref5[0],
- right1 = _ref5[1];
- var d1 = getBbox2Diff$1(left1, right0),
- d2 = getBbox2Diff$1(left1, left0),
- d3 = getBbox2Diff$1(left0, right1);
- if (box0.sid == 'pano2-4' && box1.sid == 'pano2-5') {
- console.log(9);
- }
- var min = reason == 'mix' ? 0.004 : 0.003; //mix代表寻找分裂的重新融合到一起
- if (d1 <= min && d2 >= min || d3 <= min && d2 <= min) {
- //边框交接
- var atEdgeMight = left1 < 0.002 && right0 > 0.998 ? [left1, right0] : left0 < 0.002 && right1 > 0.998 ? [left0, right1] : null; //有在全景图的边界的可能性
- //if (reason == 'mix' && box0.category == typeNames.cabinet && !atEdgeMight) continue //柜子容易并排,尽量不融合 //再看,啥意思,没懂
- if (reason == 'mix' && !atEdgeMight) continue; //不在边缘
- var max = standards$1[box0.boxType].widthNormal.max; //standards[box0.btmPos ? category : 'air-hanging'].widthNormal
- var tolerate = max * max * (reason == 'mix' ? 0.7 : 1.8); //yDCiaTQvRYn:row不能低于1.5
- var p0 = standards$1[box0.boxType].atWall == 1 ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri || box0.btmPosPredict : box0.btmPos;
- 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
- //let p1 = box1.type == 'air-hanging' ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri : box1.btmPos
- var dis = p0.distanceToSquared(p1);
- if (reason == 'mix') {
- var allY = box0.bbox2[3] - box0.bbox2[1] + (box1.bbox2[3] - box1.bbox2[1]); //各自高度和
- var wholeY = Math.max(box0.bbox2[3], box1.bbox2[3]) - Math.min(box0.bbox2[1], box1.bbox2[1]); //总跨越高度
- var coverY = allY - wholeY; //重合区域的y高度,可为负数
- var disY = (1 - coverY / wholeY + (wholeY - coverY) * 3) * 4 * tolerate; //既要考虑占比也要考虑差值
- dis += disY; //SGyhEzZNGP9案例:虽然是atEdge但并不应该融合,便通过disY来阻挡 ; MW6MEeCOy9Y:pano16-15
- //console.log('disY',disY, box0.sid, box1.sid )
- var atEdgePossib = atEdgeMight ? 0.002 / (atEdgeMight[0] + (1 - atEdgeMight[1])) : 0; // 两条线越接近越可能融合
- atEdgePossib = Math.min(6, atEdgePossib); //原本计算得 min:1, max:Infinity
- dis -= atEdgePossib * tolerate; //给点点优势
- }
- /* if(box0.sid == "pano2-0"){
- console.log('dis',dis,'tolerate',tolerate,[box0, box1],disY)
- }
- if (box0.sid == 'pano2-1' && box1.sid == 'pano2-4') {
- reason == 'mix' && console.log(dis, tolerate, box0.sid, box1.sid)
- }*/
- if (dis < tolerate) {
- //reason == 'mix' && console.log('-------------------')
- common$1.pushToGroupAuto([box0, box1], rows);
- }
- }
- }
- } //一排箱子的角度范围不可超过180度,因为不可能站在箱子上拍,所以超过的话肯定有边缘的不在这一排中。
- //可判断边缘箱子的是否角度偏大,一般中间的被遮挡所以偏小
- rows.forEach(function (boxes) {
- //从左到右排序
- boxes.sort(function (a, b) {
- //但因有的box跨越到别的box区域,所以这个顺序不准确
- return getBbox2Diff$1(a.bbox2CenterX, b.bbox2CenterX);
- });
- }); //去除不在一条直线上的连接. 当bound超出后就断开
- if (reason == 'row') {
- rows.slice(0).forEach(function (boxes) {
- if (boxes.length >= 2) {
- var removes = [],
- bound = new THREE.Box2(),
- size = new THREE.Vector2(),
- maxW = 0.6;
- for (var _i = 0, _j = boxes.length; _i < _j; _i++) {
- var box = boxes[_i];
- var pos2d = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
- bound.expandByPoint(pos2d);
- bound.getSize(size);
- var _min3 = Math.min(size.x, size.y);
- if (_min3 > maxW) {
- removes.push([boxes[_i], boxes[_i - 1]]);
- bound = new THREE.Box2();
- bound.expandByPoint(pos2d); //console.log('removes', size)
- } //console.log('removes',k, box1.sid)
- }
- if (removes.length) {
- /* console.log(
- '去除错误row连接',
- removes.map(e => e.map(a => a.sid))
- ) */
- var _common$disconnectGro = common$1.disconnectGroup(removes, rows);
- _common$disconnectGro.newGroups; //if(newGroups.length>1){//分裂成多组了,重新计算
- // console.log(newGroups)
- //}
- }
- }
- });
- rows.forEach(function (boxes) {
- //从左到右重新排序
- boxes.sort(function (a, b) {
- //但因有的box跨越到别的box区域,所以这个顺序不准确
- return getBbox2Diff$1(a.bbox2CenterX, b.bbox2CenterX);
- });
- });
- }
- rows.sort(function (a, b) {
- return b.length - a.length;
- }); //箱子数量从大到小排序
- bigBoxes = rows.map(function (boxes, i) {
- var _getLeftRight = getLeftRight$1(boxes),
- leftX = _getLeftRight.leftX,
- rightX = _getLeftRight.rightX; //最左
- var topY = boxes.slice().sort(function (a, b) {
- return a.bbox2[1] - b.bbox2[1];
- })[0].bbox2[1];
- var btmY = boxes.slice().sort(function (a, b) {
- return b.bbox2[3] - a.bbox2[3];
- })[0].bbox2[3];
- var rowBigBox = Object.assign({}, bigBox, {
- boxes,
- bbox2: [leftX, topY, rightX, btmY],
- //整排的bbox
- left: boxes.find(function (e) {
- return e.bbox2[0] == leftX;
- }),
- right: boxes.find(function (e) {
- return e.bbox2[2] == rightX;
- })
- });
- var p0 = getBoxPos$1(rowBigBox.left);
- var p1 = getBoxPos$1(rowBigBox.right);
- var vec = new THREE.Vector2(p0.x - p1.x, p0.z - p1.z);
- rowBigBox.k = Math.abs(vec.x / vec.y);
- rowBigBox.predictLen = (rowBigBox.k > 1 ? Math.abs(vec.x) : Math.abs(vec.y)) + 0.6; //加入一个宽度
- /* if(boxes.length <= boxes.relationships.length){//多条链(为了识别一个box嵌套多个的情况。不过后来在开头时处理了一部分)
- boxes.chains = []
- getchainNext(left,right,[], boxes )
-
- let aveAngle = (getBbox2Diff(left.bbox2[2], left.bbox2[0]) + getBbox2Diff(right.bbox2[2], right.bbox2[0]) ) / 2 -0.01 //首尾的angle平均数。但如果这两个不准那就导致整体出错了
- let middleAngle = getBbox2Diff(right.bbox2[0], left.bbox2[2])
- let counts = boxes.chains.map(e=>e.length)
- counts.sort((a,b)=>a-b)
- let min = counts[0],max = counts[counts.length-1]
- let r = [], cur = min;
- while(cur<=max){
- r.push({cur, diff:Math.abs((middleAngle / (cur-2) - aveAngle)}) //加 0.01是因为增加边缘
- cur++
- }
- r.sort((a,b)=>a.diff-b.diff)
- rowBigBox.predictBoxCount = r[0].cur
- //---------
-
- let goodCountChains = boxes.chains.filter(e=>e.length == rowBigBox.predictBoxCount)
- if(goodCountChains.length == 1) rowBigBox.bestChain = goodCountChains[0]
- else{
- goodCountChains = goodCountChains.map((chain,i)=>{
- let j = 1, diff=0 //中间的box的angle的方差
- while(j<rowBigBox.predictBoxCount){
- let angle = getBbox2Diff(chain[j].bbox2[2], chain[j].bbox2[0])
- diff += Math.pow(angle - aveAngle, 2)
- j++;
- }
- return {diff, chain}
- })
- goodCountChains.sort((a,b)=>a.diff-b.diff)
- rowBigBox.bestChain = goodCountChains[0].chain
- }
- console.log('getChains',boxes.chains, 'predictBoxCount',rowBigBox.predictBoxCount, r)
- } */
- return rowBigBox;
- });
- if (reason != 'mix') {
- panoBoxes.forEach(function (box) {
- //加入单个的
- if (!rows.some(function (row) {
- return row.includes(box);
- })) {
- var boxBig = Object.assign({}, bigBox, {
- bbox2: box.bbox2,
- boxes: [box],
- left: box,
- right: box
- });
- bigBoxes.push(boxBig);
- }
- });
- } //mix的之前的btm因pose错误而延伸了不对的depth所以不准
- bigBoxes.forEach(function (bigBox) {
- bigBox.sid += '-' + bigBox.boxes.map(function (e) {
- return e.index;
- }).join(',');
- /* if (bigBox.sid == 'pano0-rowBigBox-1,0,2,4') {
- console.log(3)
- } */
- if (reason == 'row') {
- //取平均值
- if (bigBox.boxes[0].btmPos) {
- bigBox.btmPos = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.btmPos);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length); //addLabel(bigBox.btmPos,'b_'+bigBox.sid, {bgcolor:'#f93',a:0.4})
- }
- if (bigBox.boxes[0].topPos) {
- bigBox.topPos = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.topPos);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
- }
- if (bigBox.boxes[0].posAtWall) {
- bigBox.posAtWall = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.posAtWall);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
- }
- } //mix的需要合并后计算才准确
- });
- _this3.rows[type][pano.id] = bigBoxes; //当前pano的所有row
- return bigBoxes;
- };
- /* let getPanoBoxAngleTrend = rowBox => {
- //顺时针方向该pano的box角度范围是越来越大还是越来越小
- let diffs = []
- let angles = rowBox.boxes.map(box => getBbox2Diff(box.bbox2[2], box.bbox2[0]))
- for (let i = 0, j = angles.length; i < j - 1; i++) {
- //得所有相邻之间的差
- let a0 = angles[i],
- a1 = angles[i + 1]
- diffs.push(a1 - a0)
- }
- diffs.sort((a, b) => a - b)
- return diffs[Math.floor(diffs.length / 2)] //中位数
- } */
- /* let getBoxCount = (rowBigBox)=>{
- return rowBigBox.predictBoxCount || rowBigBox.boxes.length
- } */
- var getReverseInfo = function getReverseInfo(rowBigBox0, rowBigBox1) {
- //两个row的方向对应
- var reversed = false;
- var lefts = [rowBigBox0.left, rowBigBox1.left];
- var rights = [rowBigBox0.right, rowBigBox1.right];
- var dis0 = lefts[0].btmPos.distanceToSquared(lefts[1].btmPos);
- var dis1 = rights[0].btmPos.distanceToSquared(rights[1].btmPos);
- var dis2 = lefts[0].btmPos.distanceToSquared(rights[1].btmPos);
- var dis3 = rights[0].btmPos.distanceToSquared(lefts[1].btmPos);
- var posLeft2, posRight2;
- if (dis0 + dis1 > dis2 + dis3) {
- //距离近的代表是同一端
- reversed = true;
- posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
- posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
- } else {
- posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
- posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
- }
- var vec = new THREE.Vector2(posLeft2.x - posRight2.x, posLeft2.z - posRight2.z);
- var k = Math.abs(vec.x / vec.y); //这个算斜率更准,但位置容易偏向一侧(可能用边缘的bbox算会好些?)
- return {
- reversed,
- k
- };
- };
- var searchByRow = function searchByRow(groups, datas) {
- //先查找row,匹配row,再slice row的方法
- _this3.matchScoreMap['rowBigBox'] = new Map();
- var rowInfos = new Map();
- var getRowMatchInfo = function getRowMatchInfo(rowBigBox0, rowBigBox1, ignoreCountMatch) {
- //获取row间的匹配信息
- //获取bigBox位置。由于一排的盒子比较长,中心方向误差大,所以采用先获取两边位置,再求中点的方法
- //if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return //太难了,不算不一样的情况了
- var name = rowBigBox0.sid + '&' + rowBigBox1.sid;
- var row = rowInfos.get(name);
- if (row) {
- return row;
- }
- if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return; //if (getBoxCount(rowBigBox0) != getBoxCount(rowBigBox1) && getBoxCount(rowBigBox0) != 1 && getBoxCount(rowBigBox1) != 1)return
- /* if (rowBigBox0.sid == 'pano0-row-1,2,6' && rowBigBox1.sid == 'pano2-row-0,2,6') {
- console.log(4)
- } */
- var rowInfo;
- if (rowBigBox0.boxes.length > 1 && rowBigBox1.boxes.length > 1) {
- //多对多,可以求两端的位置
- var lefts = [rowBigBox0.left, rowBigBox1.left];
- var rights = [rowBigBox0.right, rowBigBox1.right];
- var leftInfo;
- var rightInfo;
- var info2 = getReverseInfo(rowBigBox0, rowBigBox1);
- var len0 = rowBigBox0.predictLen,
- //长度应该接近
- len1 = rowBigBox1.predictLen;
- var overLen = Math.abs(len0 - len1);
- /* / (rowBigBox0.boxes.length + rowBigBox1.boxes.length) * 5 */
- if (overLen > 1) {
- //console.warn('overLen> 1', overLen, rowBigBox0.sid, '和', rowBigBox1.sid)
- return done();
- }
- if (info2.reversed) {
- leftInfo = getMatchScore(lefts[0], rights[1], {
- isSingle: true
- });
- rightInfo = getMatchScore(rights[0], lefts[1], {
- isSingle: true
- });
- } else {
- leftInfo = getMatchScore(lefts[0], lefts[1], {
- isSingle: true
- });
- rightInfo = getMatchScore(rights[0], rights[1], {
- isSingle: true
- });
- }
- var posLeft = getBoxPos$1(leftInfo);
- var posRight = getBoxPos$1(rightInfo);
- if (!posLeft || !posRight || leftInfo.score < -4000 || rightInfo.score < -4000) {
- return done(); //漫游点重合、>180度会导致此问题
- }
- preDealBox$1(leftInfo); //getBoxSize(leftInfo)
- preDealBox$1(rightInfo); //getBoxSize(rightInfo)
- posLeft = getBoxPos$1(leftInfo);
- posRight = getBoxPos$1(rightInfo); //验证是否是垂直或水平
- var vec = new THREE.Vector2(posLeft.x - posRight.x, posLeft.z - posRight.z);
- var k = Math.abs(vec.x / vec.y);
- if (info2.k > 1 && k < 1 || info2.k < 1 && k > 1) {
- console.error('请检查!info2.k > 1 && k < 1 || info2.k < 1 && k > 1', rowBigBox0.sid, '和', rowBigBox1.sid); //绘制的方向错误,尺寸错误
- return done();
- }
- var wrongK = 0;
- if (rowBigBox0.k > 1 && rowBigBox1.k < 1 || rowBigBox0.k < 1 && rowBigBox1.k > 1) {
- wrongK = rowBigBox0.k / rowBigBox1.k;
- if (wrongK < 1) wrongK = 1 / wrongK;
- }
- /*
- let trend0 = getPanoBoxAngleTrend(rowBigBox0)
- let trend1 = getPanoBoxAngleTrend(rowBigBox1)
- let judgeReverse = () => { //这个方法有时不准
- let disLeftSquared0 = new THREE.Vector2(posLeft.x - rowBigBox0.pano.position.x, posLeft.z - rowBigBox0.pano.position.z).lengthSq()
- let disRightSquared0 = new THREE.Vector2(posRight.x - rowBigBox0.pano.position.x, posRight.z - rowBigBox0.pano.position.z).lengthSq()
- let a = trend0 * (disLeftSquared0 - disRightSquared0)
- if (a < 0 && Math.abs(a) > 0.1) return true
- let posLeft2 = reversed ? posRight : posLeft, //反向过的对第二个漫游点来说左右是反的
- posRight2 = reversed ? posLeft : posRight
- let disLeftSquared1 = new THREE.Vector2(posLeft2.x - rowBigBox1.pano.position.x, posLeft2.z - rowBigBox1.pano.position.z).lengthSq()
- let disRightSquared1 = new THREE.Vector2(posRight2.x - rowBigBox1.pano.position.x, posRight2.z - rowBigBox1.pano.position.z).lengthSq()
- let b = trend1 * (disLeftSquared1 - disRightSquared1)
- if (b < 0 && Math.abs(b) > 0.1) return true
- }
- if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
- //反向试试
- leftInfo = getMatchScore(lefts[0], rights[1], { isSingle: true })
- rightInfo = getMatchScore(rights[0], lefts[1], { isSingle: true })
- posLeft = getBoxPos(leftInfo)
- posRight = getBoxPos(rightInfo)
- reversed = true //rowBigBox1 反向了
- }
- if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
- return console.log('getCenter ;两个方向都不符合', rowBigBox0.sid, rowBigBox1.sid)
- } */
- /*const maxK = Math.max(0.6 / Math.sqrt(rowBigBox0.boxes.length), 0.2) // 最大斜率
- if (k < maxK && k > 1 / maxK) {
- return //console.log('放弃,斜率', k)
- } */
- //横的话,按x从小到大,竖的按z从小到大
- if (k < 1 && posLeft.z > posRight.z || k > 1 && posLeft.x > posRight.x) {
- var temp = posRight;
- posRight = posLeft, posLeft = temp;
- } //addLabel(posLeft, 'left-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
- //addLabel(posRight, 'right-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
- /* if (rowBigBox0.pano.id + '&' + rowBigBox1.pano.id == '22&26') {
- console.log(777)
- } */
- /* var line1 = LineDraw.createLine([posLeft, posRight])
- meshGroup.add(line1) */
- //根据btmPos矫正一下中心位置, 否则容易偏漫游点这一侧
- var center = new THREE.Vector3().addVectors(posLeft, posRight).multiplyScalar(0.5);
- center.add(rowBigBox0.btmPos).add(rowBigBox1.btmPos).multiplyScalar(1 / 3);
- var _match = getMatchScore(rowBigBox0, rowBigBox1, {
- isSingle: true,
- center
- }); //是否预先传送center ?
- //rowInfo.minAngs = [leftInfo.minAng , rightInfo.minAng]
- /* if (match.name == 'pano4-row-6,4,1,3&pano0-row-0,1,4,5') {
- console.log(8)
- } */
- var sc = _match.score - overLen * 1000 - wrongK * 100 + leftInfo.score + rightInfo.score;
- if (sc < -4000) {
- //console.log('放弃,匹配分过低,可能不是一组', rowBigBox0.sid, '和', rowBigBox1.sid, sc)
- return done();
- } //console.log('getcenter', rowBigBox0.sid, '和', rowBigBox1.sid, overLen, match.score + overLen * 1000 + leftInfo.score + rightInfo.score)
- rowInfo = {
- rowBigBox0,
- rowBigBox1,
- match: _match,
- k,
- posLeft,
- posRight,
- score: sc / 3 + 500,
- //700 + match.score*0.7 + (leftInfo.score + rightInfo.score)*0.3 ,
- reversed: info2.reversed
- };
- } else {
- if (rowBigBox0.boxes.length == 1 && rowBigBox1.boxes.length == 1) {
- rowInfo = getMatchScore(rowBigBox0.boxes[0], rowBigBox1.boxes[0]); //直接匹配box
- } else {
- //一对多。getMatchScore计算误差大(长度越长中心误差越大、宽度计算也误差大)所以再写点限制。直接使用btm来预测长度和位置似乎更准
- var mulBoxRow = rowBigBox0.boxes.length > 1 ? rowBigBox0 : rowBigBox1;
- var singleBox = rowBigBox0.boxes.length == 1 ? rowBigBox0 : rowBigBox1;
- /* if(rowBigBox0.sid == "pano12-row-3" && rowBigBox1.sid == "pano0-row-3,1,0" ){
- console.log(5)
- } */
- rowInfo = getMatchScore(rowBigBox0, rowBigBox1, {
- dontCheckDis: true
- }); //一对多 也可以根据方向检查距离,如仅检查z
- rowInfo.k = mulBoxRow.k;
- if (rowInfo.center) {
- rowInfo.center.add(getBoxPos$1(mulBoxRow)).multiplyScalar(0.5);
- }
- if (rowInfo.name == 'pano0-row-14&pano4-row-8,11') {
- addLabel$1(rowInfo.center, 'c');
- }
- rowInfo.predictSize = rowInfo.k > 1 ? {
- x: mulBoxRow.predictLen,
- y: 0.6
- } : {
- y: mulBoxRow.predictLen,
- x: 0.6
- }; //单个的应该和多个的其中一端一样,且是离单个漫游点近的那端(也就是要走到箱子一端看不见其他箱子才行)
- var dis0 = getBoxPos$1(mulBoxRow.left).distanceToSquared(singleBox.pano.position);
- var dis1 = getBoxPos$1(mulBoxRow.right).distanceToSquared(singleBox.pano.position);
- var near = dis0 < dis1 ? mulBoxRow.left : mulBoxRow.right;
- var p0 = getBoxPos$1(singleBox);
- var dis = getBoxPos$1(near).distanceToSquared(p0);
- rowInfo.score -= dis * 1000;
- var p1 = getBoxPos$1(mulBoxRow);
- var vec1 = new THREE.Vector2(p1.x - singleBox.pano.position.x, p1.z - singleBox.pano.position.z).normalize(); //看向中心的方向
- var vec2 = new THREE.Vector2(singleBox.centerDir.x, singleBox.centerDir.z).normalize();
- rowInfo.score += (vec1.dot(vec2) - 1) * 1000; //同一个方向是最好
- }
- }
- function done(rowInfo) {
- //rowInfo && rowInfos.push(rowInfo)
- rowInfos.set(name, rowInfo);
- }
- done(rowInfo);
- return rowInfo;
- };
- var matchGroups = [];
- var getK = function getK(info) {
- var k;
- if (info.left) {
- var vec = new THREE.Vector2(info.left.x - info.right.x, info.left.z - info.right.z);
- k = Math.abs(vec.x / vec.y);
- } else {
- k = Math.abs(Math.max(info.size.x, 0.6) / Math.max(info.size.z, 0.6));
- }
- return k;
- };
- var ignoreCountMatch = groups.filter(function (e) {
- return e.length > 1;
- }).length == 1; //是否不同数量box的row也能匹配
- var minScore = boundConfirmed$1 ? -2000 : -800;
- var match = function match(searchType) {
- if (searchType == 'second') ignoreCountMatch = true;
- for (var i = 0; i < groups.length - 1; i++) {
- var rowBigBoxes_0 = getPanoBigRowBox(groups[i]);
- var pano0 = groups[i][0].pano;
- if (searchType == 'second') rowBigBoxes_0 = rowBigBoxes_0.filter(function (e) {
- return !matchGroups.some(function (u) {
- return u.includes(e);
- });
- });
- var _loop = function _loop(j) {
- var rowBigBoxes_1 = getPanoBigRowBox(groups[j]);
- if (searchType == 'second') rowBigBoxes_1 = rowBigBoxes_1.filter(function (e) {
- return !matchGroups.some(function (u) {
- return u.includes(e);
- });
- });
- var pano1 = groups[j][0].pano;
- if (pano0.id == 54 && pano1.id == 56) {
- console.log(2);
- }
- var resultPairs = [];
- var evaluateFun = function evaluateFun(row0, row1) {
- return getRowMatchInfo(row0, row1, ignoreCountMatch);
- };
- searchPair$1(null
- /* bigBoxes_0[0] */
- , rowBigBoxes_0.slice(), rowBigBoxes_1.slice(), null, resultPairs, evaluateFun);
- resultPairs = resultPairs.map(function (pairs) {
- var infos = pairs.map(function (pair) {
- return pair.some(function (e) {
- return e.sid == 'void';
- }) ? null : getRowMatchInfo(pair[0], pair[1], ignoreCountMatch);
- }); //infos.sort((a,b)=>{return a.score-b.score});
- var score = infos.reduce(function (s, e) {
- return s + (e && e.score > minScore ? e.score : minScore / 2); //只考虑组成功的分数
- }, 0);
- return {
- pairs,
- infos,
- score,
- name: pairs.map(function (pair) {
- return pair.map(function (item) {
- return item.sid;
- }).join(' & ');
- })
- };
- });
- resultPairs.sort(function (a, b) {
- return b.score - a.score;
- });
- /* if (resultPairs[0].name[0].includes('pano8') && resultPairs[0].name[0].includes('pano0')) {
- console.log(111)
- } */
- resultPairs[0] && resultPairs[0].pairs.forEach(function (pair, i) {
- var info = resultPairs[0].infos[i];
- if (info && info.score > minScore) {
- var items = pair.filter(function (e) {
- return e.sid != 'void';
- });
- common$1.pushToGroupAuto(items, matchGroups, null, function (atGroup) {
- //需要朝向一致才行
- if (!info.k) return true; //(box识别的宽高识别不准所以不需要)
- var onePair = atGroup.relationships[0];
- var name = onePair[0].sid + '&' + onePair[1].sid;
- if (!rowInfos.get(name).k) return true; //不过不应该有这种情况,否则匹配不到一起才对
- if (rowInfos.get(name).k < 1 && info.k < 1 || rowInfos.get(name).k > 1 && info.k > 1) {
- return true;
- } else {
- console.log('k不一致无法匹配', info, atGroup);
- }
- }); //根据目前的规则应该是有端点的和有端点的匹配,box和box匹配
- }
- }); //console.log(resultPairs[0])
- };
- for (var j = i + 1; j < groups.length; j++) {
- _loop(j);
- }
- }
- };
- match();
- ignoreCountMatch || match('second'); //再次将剩余的匹配一下,这次允许个数不同的row匹配
- //console.log('matchGroups', matchGroups)
- //识别出来的多组,可能有重复的,因为box个数不同所以才没到一组
- //整理一下,每个组整理出一个info,同时重新检查一下,挑去每组中和其他成员非常不同的
- var groupInfo = [];
- var getGroupInfo = function getGroupInfo(group) {
- var left = new THREE.Vector3(),
- right = new THREE.Vector3(),
- pointsLen = 0;
- var bigBoxes = [];
- var info = {};
- group.relationships.forEach(function (pair) {
- var name = pair[0].sid + '&' + pair[1].sid;
- var matchInfo = rowInfos.get(name); //this.matchScoreMap["rowBigBox"][name] || this.matchScoreMap["cabinet"][name];
- if (matchInfo.posLeft) {
- left.add(matchInfo.posLeft), right.add(matchInfo.posRight), pointsLen++;
- } else {
- bigBoxes.push(matchInfo);
- preDealBox$1(matchInfo);
- getBoxSize$1(matchInfo);
- }
- });
- if (pointsLen > 0) {
- left.multiplyScalar(1 / pointsLen);
- right.multiplyScalar(1 / pointsLen); //addLabel(left, 'Left' + index, { bgcolor: '#F00', a: 0.2 })
- //addLabel(right, 'Right' + index, { bgcolor: '#F00', a: 0.2 })
- var center = new THREE.Vector3().addVectors(left, right).multiplyScalar(0.5) //addLabel(center, 'center' + index, { bgcolor: '#F00', a: 0.3 })
- ;
- info.left = left, info.right = right, info.center = center;
- info.pointsLen = pointsLen;
- }
- if (bigBoxes.length > 0) {
- var getAve = function getAve(bigBoxes) {
- var center1 = new THREE.Vector3(),
- size = new THREE.Vector3();
- bigBoxes.forEach(function (box) {
- var center0 = getBoxPos$1(box);
- center1.add(center0);
- size.add(box.size);
- });
- if (pointsLen > 0) {
- var size0 = new THREE.Vector3(Math.abs(left.x - right.x), size.y, Math.abs(left.z - right.z));
- size.add(size0.multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
- center1.add(info.center.clone().multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
- } else {
- size.multiplyScalar(1 / bigBoxes.length);
- center1.multiplyScalar(1 / bigBoxes.length);
- }
- return {
- center1,
- size
- };
- };
- var getScores = function getScores(center, size) {
- //获得相对于center,size的差别分数
- bigBoxes.forEach(function (box) {
- box.sc = -box.center.distanceToSquared(center1) - size.distanceToSquared(box.size) * 0.5;
- });
- };
- var _getAve = getAve(bigBoxes),
- center1 = _getAve.center1,
- size = _getAve.size; //console.log(center1, size)
- getScores(center1, size);
- bigBoxes.sort(function (a, b) {
- return b.sc - a.sc;
- });
- var midItem = bigBoxes[Math.floor(bigBoxes.length / 2)]; //中位数
- getScores(midItem.center, midItem.size);
- var _minScore = -8;
- var removes = bigBoxes.filter(function (e) {
- return e.sc < _minScore;
- });
- if (removes.length) {
- var _common$disconnectGro2 = common$1.disconnectGroup(removes.map(function (e) {
- return [e.box0, e.box1];
- }), matchGroups),
- newGroups = _common$disconnectGro2.newGroups;
- console.log('去除错误数据', removes);
- if (newGroups.length > 1) {
- //分裂成多组了,重新计算
- newGroups.forEach(function (e) {
- getGroupInfo(e);
- });
- return;
- }
- bigBoxes = bigBoxes.filter(function (e) {
- return e.sc >= _minScore;
- });
- }
- if (bigBoxes.length) {
- var o = getAve(bigBoxes) //again
- ;
- info.center = o.center1, info.size = o.size;
- }
- }
- info.k = getK(info);
- info.bigBoxes = bigBoxes;
- info.group = group;
- groupInfo.push(info);
- };
- matchGroups.slice(0).forEach(function (group) {
- getGroupInfo(group);
- });
- var getLength = function getLength(c) {
- //获取bigbox长度
- 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;
- };
- var getLeft = function getLeft(group, k) {
- var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
- return group.left ? group.left[dirAxis] - 0.3 : group.center[dirAxis] - group.size[dirAxis] / 2; //left和right加减半个宽度
- };
- var getRight = function getRight(group, k) {
- var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
- return group.right ? group.right[dirAxis] + 0.3 : group.center[dirAxis] + group.size[dirAxis] / 2;
- }; //识别是否group之间有一样的, 去重
- {
- var _ret = function () {
- var realGroups = [];
- var getAveWidth = function getAveWidth(infos, len) {
- //获取这些infos最合适的箱子平均宽度和个数
- var boxCounts = [];
- infos.forEach(function (e) {
- boxCounts.push.apply(boxCounts, _toConsumableArray(e.group.map(function (bigBox) {
- return bigBox.boxes.length;
- })));
- });
- boxCounts.sort(function (a, b) {
- return a - b;
- });
- var midCounts = [];
- var r0 = 0.3,
- r1 = 0.7; //取中间这部分的算最适合的个数,结果不一定是中位数
- boxCounts.slice(Math.floor(boxCounts.length * r0), Math.floor(boxCounts.length * r1) + 1).forEach(function (c) {
- if (!midCounts.includes(c)) midCounts.push(c);
- });
- var _standards$cabinet$wi = standards$1.cabinet.widthNormal,
- min = _standards$cabinet$wi.min,
- max = _standards$cabinet$wi.max;
- var standardW = (min + max) / 2;
- var aveWs = midCounts.map(function (e) {
- return {
- aveW: len / e,
- count: e
- };
- });
- aveWs.sort(function (a, b) {
- return Math.abs(a.aveW - standardW) - Math.abs(b.aveW - standardW);
- });
- var aveW = aveWs[0].aveW;
- var count = aveWs[0].count;
- if (aveW > max || aveW < min) {
- var w = THREE.MathUtils.clamp(aveW, min, max); //console.warn(`box aveW宽度不太对,从${aveW}修改到${w}`)
- aveW = w;
- }
- return {
- aveW,
- count
- };
- };
- var getBox2 = function getBox2(center, len, thick, k) {
- var box2 = new THREE.Box2();
- box2.expandByPoint(new THREE.Vector2(center.x, center.z));
- var sizeVec = k > 1 ? new THREE.Vector2(len / 2, thick / 2) : new THREE.Vector2(thick / 2, len / 2);
- box2.expandByVector(sizeVec);
- return box2;
- };
- var standardW = 0.6; //两排之间最小距离
- var _loop2 = function _loop2(m) {
- var group0 = groupInfo[m];
- var _loop3 = function _loop3(n) {
- var _group1$bigBoxes$, _group0$bigBoxes$;
- var group1 = groupInfo[n];
- 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') {
- console.log(4);
- }
- if ((group0.k > 1 && group1.k < 1 || group0.k < 1 && group1.k > 1) && getLength(group0) > 1.5 && getLength(group1) > 1.5) return "continue"; //如果是方块状的无视k
- //间距
- var spaceAxis = (group0.k + group1.k) / 2 > 1 ? 'z' : 'x';
- var spaceDis = Math.abs(group0.center[spaceAxis] - group1.center[spaceAxis]);
- if (spaceDis > standardW * 1.5) return "continue";
- var o0 = getAveWidth([group0], getLength(group0)); //因为有可能长度和箱子个数不匹配,所以需要得到限制后的宽度再比较
- var o1 = getAveWidth([group1], getLength(group1));
- var len0 = group0.predictLen = o0.aveW * o0.count;
- var len1 = group1.predictLen = o1.aveW * o1.count;
- // if( len0 / len1 < minR || len0 / len1 > 1/minR) continue
- var area0 = group0.area = len0 * o0.aveW;
- var area1 = group1.area = len1 * o1.aveW;
- var getBoxMixArea = function getBoxMixArea(expandRatio1, expandRatio2) {
- var box0 = getBox2(group0.center, len0 + expandRatio1, o0.aveW + expandRatio2, group0.k);
- var box1 = getBox2(group1.center, len1 + expandRatio1, o1.aveW + expandRatio2, group1.k);
- var mixBox = getMixBox$1(box0, box1); //重叠部分
- var s = mixBox.getSize(new THREE.Vector2());
- return {
- box0,
- box1,
- areaMix: Math.max(0, s.x) * Math.max(0, s.y)
- }; //可能是0
- };
- var areaMixExpand = getBoxMixArea(0.1, 0.3).areaMix;
- if (areaMixExpand / area0 < 0.65 && areaMixExpand / area1 < 0.65) return "continue"; //包含的可以通过
- /*let areaMix = getBoxMixArea(0, 0).areaMix //实际重合面积
- group0.contains = group0.contains || []
- group1.contains = group1.contains || []
- group0.contains.push({ group: group1, selfPercent: areaMix / area0, percent2: areaMix / area1, areaMix })
- group1.contains.push({ group: group0, selfPercent: areaMix / area1, percent2: areaMix / area0, areaMix })
- */
- //console.log('两个合并', group0, group1)
- common$1.pushToGroupAuto([group0, group1], realGroups); //包含的直接合并吧 - - ,这样会使结果偏移,不过没办法了,多个重叠面积太难算了
- };
- for (var n = m + 1; n < groupInfo.length; n++) {
- var _ret2 = _loop3(n);
- if (_ret2 === "continue") continue;
- }
- };
- for (var m = 0; m < groupInfo.length - 1; m++) {
- _loop2(m);
- } //但没合并前样本数量少,包含关系可能有错 - -
- /*for(let m=0; m<groupInfo.length;m++){
- let group = groupInfo[m]
- let contains = group.contains.filter(e=> e.percent2 > 0.8) //所有包含的
- contains.reduce
- } */
- groupInfo.forEach(function (info) {
- //加入单个的
- if (!realGroups.some(function (groups) {
- return groups.includes(info);
- })) {
- realGroups.push([info]);
- }
- }); //console.log('realGroups', realGroups)
- //get boxes
- realGroups.forEach(function (infos, i) {
- var sampleCount = infos.reduce(function (w, c) {
- return w += c.pointsLen || c.bigBoxes.length;
- }, 0);
- var k;
- /* {
- //const k = infos.reduce((w, c) => (w += c.k), 0) / infos.length
- let ks = infos.map(e => e.k)
- ks.sort((a, b) => a - b)
- let min = ks[0],
- max = ks[ks.length - 1]
- if (min < 1 && max > 1) {
- //比较最小和最大,选取更极端的那个
- let min_ = 1 / min
- if (min_ < max) k = max
- else k = min
- } else k = (min + max) / 2
- } */
- {
- //看>1的和<1的平均数哪个多用哪个
- var ks = {
- '<1': {
- count: 0,
- sum: 0
- },
- '>1': {
- count: 0,
- sum: 0
- }
- };
- infos.forEach(function (e) {
- if (e.k < 1) {
- ks['<1'].count++, ks['<1'].sum += 1 / e.k;
- } else {
- ks['>1'].count++, ks['>1'].sum += e.k;
- }
- });
- ks['<1'].count && (ks['<1'].ave = ks['<1'].sum / ks['<1'].count);
- ks['>1'].count && (ks['>1'].ave = ks['>1'].sum / ks['>1'].count);
- if (ks['<1'].ave > ks['>1'].ave) {
- k = 1 / ks['<1'].ave;
- } else {
- k = ks['>1'].ave;
- }
- }
- var centerPos = infos.reduce(function (w, c) {
- return w.add(c.center.clone().multiplyScalar(c.pointsLen || c.bigBoxes.length));
- }, new THREE.Vector3()).multiplyScalar(1 / sampleCount); //预得中心点
- //获取左右端点(需要排除可能的误差,所以采用最靠近端点的三个点。但无法排除前三个点中万一含有包含box的、或者误差大的端点)
- var lefts = infos.map(function (e) {
- return getLeft(e, k);
- }).sort(function (a, b) {
- return a - b;
- }).filter(function (a) {
- return a < centerPos[k > 1 ? 'x' : 'z'];
- }).slice(0, 3);
- var rights = infos.map(function (e) {
- return getRight(e, k);
- }).sort(function (a, b) {
- return b - a;
- }).filter(function (a) {
- return a > centerPos[k > 1 ? 'x' : 'z'];
- }).slice(0, 3);
- var left = 0,
- right = 0;
- var c0 = (lefts.length + 1) * lefts.length / 2;
- lefts.forEach(function (e, i) {
- //越靠近最外侧权重越高。
- left += e * ((lefts.length - i) / c0);
- });
- c0 = (rights.length + 1) * rights.length / 2;
- rights.forEach(function (e, i) {
- right += e * ((rights.length - i) / c0);
- });
- centerPos[k > 1 ? 'x' : 'z'] = (left + right) / 2;
- var len = right - left; //加一点值是因为之前计算长度,用的是最外box的中心点,会少box一半宽度
- var infos2 = infos.filter(function (e) {
- return !e.predictLen || e.predictLen / len > 0.7;
- });
- if (infos2.length == 0) {
- infos2 = infos.sort(function (a, b) {
- return b.predictLen - a.predictLen;
- }).slice(0, 1);
- }
- var _getAveWidth = getAveWidth(infos2, len),
- aveW = _getAveWidth.aveW,
- count = _getAveWidth.count; //长宽比中心点的误差更大,尤其是box类型的、或样本少的
- //获取高度
- var heights = [];
- {
- var heightss;
- /* infos.forEach(e => {
- pairs.push(...e.group.relationships.filter(pair => pair[0].boxes.length == count && pair[1].boxes.length == count))
- })
- if (pairs.length) {
- heightss = pairs.map(pair => {
- let boxes = pair.map(e => {
- return e.boxes.slice()
- })
- let match = rowInfos[pair[0].sid + '&' + pair[1].sid]
- let ifReverse = match.reversed
- if (match.reversed == void 0 && pair[0].boxes.length > 1 && pair[1].boxes.length > 1) {
- let { reversed } = getReverseInfo(pair[0], pair[1])
- ifReverse = reversed
- }
- if (ifReverse) {
- boxes[1].reverse()
- }
- let heights1 = []
- let topPoss = []
- for (let i = 0; i < count; i++) {
- let match1 = getMatchScore(boxes[0][i], boxes[1][i], { onlyGet: true })
- let topPos = match1 && match1.topPos
- if (!topPos) {
- topPos = getBoxTop({ box0: boxes[0][i], box1: boxes[1][i] })
- }
- heights1.push(topPos.y - groundY)
- if (topPos.y - groundY < 0) {
- console.log('?')
- }
- topPoss.push(topPos)
- }
- if ((k < 1 && topPoss[0].z > topPoss[count - 1].z) || (k > 1 && topPoss[0].x > topPoss[count - 1].x)) {
- heights1.reverse()
- }
- return heights1
- })
- } else { */
- var bigBoxes = [];
- infos.forEach(function (e) {
- bigBoxes.push.apply(bigBoxes, _toConsumableArray(e.group.filter(function (e) {
- return !bigBoxes.includes(e) && e.boxes.length == count;
- })));
- });
- heightss = bigBoxes.map(function (bigBox) {
- var topPoss = bigBox.boxes.map(function (box) {
- var a = {
- box0: box
- };
- getBoxTop$1(a);
- return a.topPos;
- });
- if (k < 1 && topPoss[0].z > topPoss[count - 1].z || k > 1 && topPoss[0].x > topPoss[count - 1].x) {
- topPoss.reverse();
- }
- var heights1 = topPoss.map(function (topPos) {
- return topPos.y - groundY$1;
- });
- return heights1;
- }); //}
- heightss.forEach(function (arr) {
- for (var _i2 = 0; _i2 < count; _i2++) {
- heights[_i2] = (heights[_i2] || 0) + arr[_i2];
- }
- });
- heights = heights.map(function (e) {
- var h = e / heightss.length;
- return h;
- }); //console.log('heightss',heightss, pairs, heights)
- } //拆分成小box
- var size = new THREE.Vector3(aveW, 2, aveW);
- var c = 0;
- infos.rowboxs = [];
- while (c < count) {
- var center = void 0;
- if (k > 1) {
- var startX = centerPos.x - (count - 1) / 2 * aveW;
- center = new THREE.Vector3(startX + c * aveW, centerPos.y, centerPos.z);
- } else {
- var startZ = centerPos.z - (count - 1) / 2 * aveW;
- center = new THREE.Vector3(centerPos.x, centerPos.y, startZ + c * aveW);
- }
- var size1 = heights[c] ? size.clone().setY(heights[c]) : size; //如1*3的是得不到height的
- var box = new Box$1({
- name: 'row' + i + '-' + c,
- center,
- size: size1,
- boxType: 'cabinet',
- infos
- });
- c++;
- infos.rowboxs.push(box);
- }
- });
- return {
- v: realGroups.length > 0
- };
- }();
- if (typeof _ret === "object") return _ret.v;
- }
- };
- var removeContain = function removeContain(arr) {
- //去除嵌套
- var len = arr.length;
- if (len < 2) return;
- for (var i = 0; i < len - 1; i++) {
- var box0 = arr[i];
- getBoxBase$1(box0);
- box0.contains = box0.contains || [];
- for (var j = i + 1; j < len; j++) {
- var box1 = arr[j];
- /* if (box0.sid == 'pano2-1' && box1.sid == 'pano2-7') {
- console.log(6)
- } */
- getBoxBase$1(box1);
- box1.contains = box1.contains || [];
- var d3 = Math.abs(box1.bbox2CenterX - box0.bbox2CenterX); //限制d3是因为在相差180度两端可能也符合
- //d4 = Math.abs(box1.bbox2[3] - box0.bbox2[3])
- if (d3 > 0.4
- /* || d4 > 0.01 */
- ) continue;
- var d0 = getBbox2Diff$1(box1.bbox2[0], box0.bbox2[0]),
- d1 = getBbox2Diff$1(box0.bbox2[2], box1.bbox2[2]),
- w0 = getBbox2Diff$1(box0.bbox2[2], box0.bbox2[0]),
- w1 = getBbox2Diff$1(box1.bbox2[2], box1.bbox2[0]);
- var min = Math.min(0.005, Math.min(w0, w1) * 0.2); //如果本身w0,w1宽度就小,差距更要小
- if (d1 >= 0 && Math.abs(d0) < min || d0 >= 0 && Math.abs(d1) < min || d1 >= 0 && d0 >= 0) {
- box0.contains.push(box1);
- } else if (d0 <= 0 && Math.abs(d1) < min || d1 <= 0 && Math.abs(d0) < min || d1 <= 0 && d0 <= 0) {
- box1.contains.push(box0);
- }
- }
- }
- var getWidthScore = function getWidthScore(box, type) {
- var addDis = 0.1; //因为用的是btm的pos,比中心点近了一些,所以加上一段距离
- var o = getBoxPoseByPos$1(box, getBoxPos$1(box), addDis);
- var boxPjW = o.projectWidth;
- var standardPjW = (o.maxProjectWidth + o.minProjectWidth) / 2;
- var s = type == 'out' ? boxPjW - standardPjW : standardPjW - boxPjW;
- return -Math.pow(s, 2) * 10;
- };
- var minChildCount = arr[0].boxType == 'battery' ? 1 : 2;
- arr.slice().forEach(function (box) {
- if (box.contains.length >= minChildCount) {
- //假设不存在第二层嵌套, 假设每个只能被一个嵌套
- //决定留大还是留小
- //先只去掉包含两个以上的,且角度范围一致
- //尽量保留内层,除非内层太小
- var _getLeftRight2 = getLeftRight$1(box.contains),
- leftX = _getLeftRight2.leftX,
- rightX = _getLeftRight2.rightX;
- 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; //范围不一致
- var remainChild = true;
- if (box.contains.length == 1) {
- //cdi6xzNiNdS 电池包含单个 感觉一般都是留大
- remainChild = false;
- } else {
- var outScore = getWidthScore(box, 'out');
- var childrenScores = box.contains.map(function (e) {
- return getWidthScore(e, 'in');
- });
- var childAve = childrenScores.reduce(function (w, c) {
- return w + c;
- }, 0) / childrenScores.length;
- if (childAve < -4) {
- //let outScore = getWidthScore(box, 'out')
- remainChild = childAve > outScore;
- }
- }
- if (!remainChild) {
- box.contains.forEach(function (e) {
- var _console;
- e.state = '因被嵌套被删除', e.containBy = box;
- arr.splice(arr.indexOf(e), 1);
- (_console = console).log.apply(_console, ['因被嵌套被删除'].concat(_toConsumableArray(box.contains)));
- });
- } else {
- box.state = '因嵌套其他被删除';
- console.log('因嵌套其他被删除', box);
- arr.splice(arr.indexOf(box), 1);
- }
- }
- });
- };
- var waitFindRest = [];
- var Search = function Search(type) {
- console.error('开始search', type);
- var matchScoreMap = _this3.matchScoreMap[type] = new Map();
- var datas = {};
- var panoIds = [];
- for (var id in _this3.datas) {
- if (!_this3.datas[id]) continue;
- datas[id] = _this3.datas[id].shapes.filter(function (e) {
- return isType$1(e.category, type);
- });
- datas[id].length && panoIds.push(id);
- }
- var _loop4 = function _loop4(_id) {
- //对data预处理
- //(之后如果还出现不同类型重叠在一起的,需要先识别摘除下。 )4GqaqNdyjGf
- if (!_this3.datas[_id]) return "continue";
- removeContain(datas[_id]); //去除线框中的嵌套,主要是一个嵌套两个的。案例:KK-1Zjm9Rbl47
- if (datas[_id].length) {
- //融合。很多box被一分为二了,基本都是在全景图左右边界处。
- var bigBoxes = getPanoBigRowBox(datas[_id], {
- reason: 'mix'
- });
- bigBoxes.forEach(function (bigBox) {
- if (bigBox.boxes.length > 1) {
- bigBox.boxes.forEach(function (box) {
- box.state = '被删除', box.mixTo = bigBox;
- var i = datas[_id].indexOf(box);
- datas[_id].splice(i, 1);
- {
- i = _this3.datasMixed[_id].shapes.findIndex(function (e) {
- return e.sid == box.sid;
- });
- _this3.datasMixed[_id].shapes.splice(i, 1);
- }
- }); //console.log('因融合而删除', bigBox.boxes)
- datas[_id].push(bigBox);
- {
- _this3.datasMixed[_id].shapes.push(bigBox);
- }
- var shapes = _this3.datas[_id].shapes;
- bigBox.index = shapes.length > 1 ? shapes[shapes.length - 1].index + 1 : 0;
- {
- var a = bigBox.sid.split('mix-');
- bigBox.sid = a[0] + bigBox.index + '(mix' + a[1] + ')'; //"pano20-mix-1,2"
- }
- }
- });
- }
- };
- for (var _id in _this3.datas) {
- var _ret3 = _loop4(_id);
- if (_ret3 === "continue") continue;
- }
- if (panoIds.length == 0) {
- if (standards$1[type].tinyXZ) {
- //fire 调试:nZrBdvRaDuC
- _this3.expandModelBound();
- }
- return;
- }
- panoIds.sort(function (a, b) {
- return datas[b].length - datas[a].length;
- });
- var groups = panoIds.map(function (e) {
- return datas[e];
- }); //console.log('按box个数排序:', groups.slice())
- var group0 = groups[0],
- len0 = group0.length;
- if (groups.length == 1) {
- //只有一个全景里有数据
- if (standards$1[type].tinyXZ) {
- //fire. 无法match以获取groundY, 就取消。 调试: eGhyf5QdVHA
- _this3.expandModelBound(type);
- }
- group0.forEach(function (e) {
- return createSinglePano(e);
- });
- return combines(type);
- }
- var finish = function finish(groups) {
- waitFindRest.push({
- type,
- args: [groups]
- }); //等待最后检查遗漏
- if (standards$1[type].tinyXZ) {
- //fire 调试:nZrBdvRaDuC
- _this3.confirmGroundY(type);
- }
- if (standards$1[type].tiny) {
- //monitor 调试:S9yepREK8Jl
- _this3.expandModelBound2(type);
- }
- };
- if (len0 == 1) {
- //最多的也只有一个box。此情况大部分是空调
- panoIds.forEach(function (e) {
- return getBoxBase$1(datas[e][0]);
- });
- for (var i = 0; i < panoIds.length; i++) {
- var box0 = datas[panoIds[i]][0];
- for (var j = i + 1; j < panoIds.length; j++) {
- var box1 = datas[panoIds[j]][0];
- getMatchScore(box0, box1, {
- isSingle: true
- });
- }
- }
- /* let list = Object.keys(matchScoreMap)
- list.sort((a, b) => {
- return matchScoreMap[b].score - matchScoreMap[a].score
- })
- let match = matchScoreMap[list[0]] */
- var list = Array.from(matchScoreMap).map(function (e) {
- return e[1];
- }).sort(function (a, b) {
- return b.score - a.score;
- });
- var match = list[0];
- preDealBox$1(match);
- if (match.score > -100) {
- getBoxSize$1(match);
- if (match.score > 0 && match.sizeAdjust < 0.1) {
- new Box$1(match); //waitFindRest.push({ type, args: [groups] }) //等待最后检查遗漏
- finish(groups);
- return;
- }
- } //根据分数重排序,前两个已匹配的pano放在第一第二(reMatchLowScores会跳过),获得groups2
- var panoIds2 = [];
- /* list.forEach(e => {
- let info = matchScoreMap[e]
- if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id)
- if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id)
- }) */
- list.forEach(function (info) {
- if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id);
- if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id);
- });
- var groups2 = panoIds2.map(function (e) {
- return datas[e];
- }); //继续match
- reMatchLowScores([match], groups2);
- finish(groups2);
- return;
- }
- {
- //重新根据距离排序,挑选离所有box距离最近的两个pano (远的可能看不到box,或者得到的线框计算的位置不准。不过其实太近也不准-,-)
- var counts = {};
- groups.forEach(function (e) {
- e.forEach(function (a) {
- return getBoxBase$1(a);
- });
- counts[e.length] || (counts[e.length] = []);
- counts[e.length].push(e);
- });
- groups = [];
- standards$1[type].atWall;
- var nums = Object.keys(counts);
- var bestDisSquared = 2;
- nums.reverse();
- nums.forEach(function (count) {
- var _groups;
- var groups_ = counts[count];
- if (groups_.length > 1) {
- groups_.forEach(function (e) {
- e.disSc = e.reduce(function (w, c) {
- var pos = getBoxPos$1(c); //let s = atWall ? Math.pow(Math.abs(c.centerDir.y), 3)*100 : 0 //在墙上的话尽量平视
- //console.log(c.sid,s)
- return w + Math.abs(c.pano.position.distanceToSquared(pos) - bestDisSquared); //+ s
- }, 0);
- });
- groups_.sort(function (a, b) {
- return a.disSc - b.disSc;
- });
- }
- (_groups = groups).push.apply(_groups, _toConsumableArray(groups_));
- }); //console.log('按距离和个数排序:', groups)
- group0 = groups[0];
- len0 = group0.length;
- }
- if (type == 'cabinet') {
- //转化为分组
- if (searchByRow(groups)) {
- waitFindRest.push({
- type,
- args: [groups, 0]
- }); //等待最后检查遗漏
- return;
- }
- } //零散匹配。
- var match2Group = function match2Group(group0, group1) {
- var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- fake = _ref6.fake;
- group0.length;
- group1.length;
- /* for (let i = 0; i < len0; i++) {
- //复杂度:n的平方次
- for (let j = 0; j < len1; j++) {
- let box1 = group0[i]
- let box2 = group1[j]
- let result = getMatchScore(box1, box2)
- }
- } */
- //寻找最佳配对 n!种组合(是否要限制个数多的情况?) 超过8个就很恐怖
- //仅先查找选中的两个pano配对
- var resultPairs = [];
- var newGroup0 = group0.slice(0);
- var newGroup1 = group1.slice(0);
- /* while (newGroup1.length < newGroup0.length) {
- newGroup1.push({ sid: 'void' }) //为了使排列正确,补个空,使左右两边个数相等,过后和void匹配的不会计算box
- } */
- var evaluateFun = getMatchScore.bind(_this3);
- searchPair$1(
- /* group0[0] */
- null, newGroup0, newGroup1, null, resultPairs, evaluateFun);
- /* console.log(
- 'resultPairs',
- resultPairs.map(pairs => pairs.map(pair => pair.map(item => item.sid).join(' & ')))
- ) */
- resultPairs = resultPairs.map(function (pairs) {
- var infos = pairs.map(function (pair) {
- return getMatchScore(pair[0], pair[1]);
- }); //matchScoreMap[pair[0].sid + '&' + pair[1].sid])
- var score = infos.reduce(function (s, e) {
- return s + (e ? e.score : 0);
- }, 0);
- var o = {
- infos,
- score,
- pairs,
- name: pairs.map(function (pair) {
- return pair.map(function (item) {
- return item.sid;
- }).join(' & ');
- })
- };
- return o;
- }); //console.log('resultPairs', resultPairs.slice())
- console.log('resultPairs按分数高低', resultPairs.sort(function (a, b) {
- return b.score - a.score;
- })); //console.log('compu',compu)
- var minScore = boundConfirmed$1 ? -2000 : -800;
- var noMatches = []; //和void匹配的,需要和其他pano的重新匹配
- var lowScores = [];
- if (resultPairs[0]) {
- resultPairs[0].infos.forEach(function (info, i) {
- if (!info) {
- noMatches.push(resultPairs[0].pairs[i].find(function (e) {
- return e.sid != 'void';
- }));
- return; //match with void
- }
- if (info.score < minScore || standards$1[info.boxType].bottom && info.minAng < 5) {
- lowScores.push(info);
- return;
- }
- preDealBox$1(info);
- getBoxSize$1(info);
- if (info.sizeAdjust && standards$1[info.boxType].tiny || info.sizeAdjust > 0.2) {
- //或者识别下悬挂的且线的角度较小
- lowScores.push(info);
- return;
- }
- if (info.box0.category == typeNames$1.battery && info.size.x < 1 && info.size.z < 1) {
- //宽度较小
- var vec0 = new THREE.Vector3().subVectors(info.box0.pano.position, getBoxPos$1(info));
- var vec1 = new THREE.Vector3().subVectors(info.box1.pano.position, getBoxPos$1(info));
- /* let k0 = Math.abs(vec0.x / vec0.z), k1 = Math.abs(vec1.x / vec1.z), maxR = 6
- if(info.name == '') */
- if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0
- /* || k0/k1 > maxR || k0/k1 < 1/maxR */
- ) {
- //同一个象限 或 偏向一侧
- lowScores.push(info);
- return;
- }
- }
- info.fake = fake;
- new Box$1(info);
- });
- }
- if (noMatches.length) {
- reMatchLowScores(noMatches.map(function (e) {
- return {
- box0: e
- };
- }), groups, {
- fake
- });
- }
- reMatchLowScores(lowScores, groups, {
- fake
- });
- };
- {
- var disScores = []; //避免两个组之间距离太远 //KJ-iUrPonbhCQo 大的场景有很多柜子时,groups的前两个元素很可能相隔很远,导致匹配不到柜子。
- for (var _i3 = 0; _i3 < groups.length - 1; _i3++) {
- var disSqure = groups[_i3][0].pano.position.distanceToSquared(groups[_i3 + 1][0].pano.position);
- var disScore = math$2.linearClamp(disSqure, [0, 0.4, 2, 6, 100], [-10, 0, 10, 5, -100]);
- var score = disScore + (groups[_i3].length + groups[_i3 + 1].length);
- disScores.push({
- score,
- i: _i3,
- disSqure,
- length1: groups[_i3].length,
- length2: groups[_i3 + 1].length
- });
- }
- disScores.sort(function (a, b) {
- return b.score - a.score;
- });
- for (var _j2 = 0; _j2 < groups.length - 1; _j2++) {
- match2Group(groups[disScores[_j2].i], groups[disScores[_j2].i + 1], {
- fake: _j2 > 0
- });
- if (!standards$1[type].tinyXZ) {
- // 只有tinyXZ的多match几组 (如果场景比较大,最好也多match几组?)
- break;
- }
- }
- }
- finish(groups);
- };
- function blocked(box) {
- //该box是否被实体box遮挡
- //WcLVXvmV9AU:pano2-2 和 pano12-4 ; 5yhlMduTHL8:pano2-10
- /* if (box.sid == 'pano6-7') {
- console.log(1)
- addLine(box.pano.position, box.centerBtmDir, 20)
- } */
- if (!standards$1[box.boxType].bottom) {
- //当底部每个方向都有遮挡物时,其位置很可能不准。但若是部分遮住,还是有可能识别对的
- if (!box.blocked) {
- box.blocked = {
- centerBtmDir: null,
- leftBtmDir: null,
- rightBtmDir: null
- };
- }
- var _loop5 = function _loop5(dir) {
- if (!box.blocked[dir]) {
- var block = boxesSolid$1.find(function (boxSolid) {
- ray$1.set(box.pano.position, box[dir]);
- var o = ray$1.ray.intersectsBox(boxSolid.bound);
- if (o) {
- // 遮挡
- return true;
- }
- });
- if (block) {
- //若不存在,即都遮挡了,就算真的遮挡
- box.blocked[dir] = block;
- } else {
- box.blocked[dir] = false;
- return {
- v: false
- }; //找到一个方向无遮挡则可返回
- }
- }
- };
- for (var dir in box.blocked) {
- var _ret4 = _loop5(dir);
- if (typeof _ret4 === "object") return _ret4.v;
- }
- return true; //暂定,若某个方向已得到遮挡了,就不计算。但若没有,就再搜一遍(如果会重复搜之后再增加一个stamp啥的,比如记录下当前所有solidBoxes的name,如果改变了就重新搜下)
- } else {
- //若中心方向已经有同类型的box,很可能它就是自身(因为挂墙的预测位置很不准,所以需要这一步。越tiny的越能通过此来筛选)
- var block = boxesSolid$1.find(function (boxSolid) {
- if (boxSolid.boxType != box.boxType) return;
- ray$1.set(box.pano.position, box.centerDir);
- var o = ray$1.ray.intersectsBox(boxSolid.bound);
- if (o) {
- // 遮挡
- return true;
- }
- });
- if (block) {
- box.blocked = block;
- return true;
- }
- }
- } //调试 O540aEVF3b7 jQUQlER160 n4z0yd5tQaF WcLVXvmV9AU 8czlwsbSe5 NlUM8yGve9
- function findRest(groups
- /* ,startIndex=2 */
- ) {
- //查找是否有遗漏。
- //1 可能有距离较远的box不在头两个pano的附近导致被漏掉。(概率很小)
- //2 被剩余的 (包括低分匹配中放弃的,这种需要的距离识别度高)
- var tolerateWidth = {
- min: 0.1,
- max: 0.5
- };
- var boxes = [],
- scores = new Map(),
- bestDisSquared = 2;
- groups.forEach(function (g) {
- var _boxes;
- (_boxes = boxes).push.apply(_boxes, _toConsumableArray(g));
- });
- boxes = boxes.filter(function (box) {
- return !used(box);
- });
- boxes.forEach(function (box) {
- getBoxBase$1(box);
- var p1 = new THREE.Vector2(box.pano.position.x, box.pano.position.z);
- var p2 = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
- var dis = p1.distanceToSquared(p2);
- var s1 = -Math.abs(dis - bestDisSquared); //将距离最佳的排前面,距离远的得到的位置不准确,也容易被遮
- if (!box.pose) box.pose = getBoxPoseByPos$1(box, getBoxPos$1(box));
- var s2 = getPoseScore$1([box.pose], box.boxType) + THREE.MathUtils.clamp(box.pose.projectWidth, box.pose.minProjectWidth, box.pose.maxProjectWidth) * 7; //projectWidth长的更安全
- scores.set(box, {
- s1,
- s2,
- sum: s1 + s2
- });
- }); //console.log(boxes[0].boxType,scores)
- boxes = boxes.sort(function (a, b) {
- return scores.get(b).sum - scores.get(a).sum;
- }); //FXcq5PI9QGv
- //console.log(boxes)
- boxes.forEach(function (box) {
- if (box.sid == 'pano0-4') {
- console.log(3);
- }
- if (!used(box) && !blocked(box)) {
- //如果和现有的box的距离都很远,很可能是漏掉的
- var near = boxesSolid$1.find(function (solidBox) {
- if (solidBox.name == 'air-pano16-7&pano14-13') {
- console.log(3);
- }
- if (solidBox.boxType != box.boxType && (solidBox.boxType == 'air-hanging' || box.boxType == 'air-hanging')) return; //挂空调一般不会撞到地面上的
- var p1 = getBoxPos$1(solidBox);
- var p2 = getBoxPos$1(box);
- new THREE.Vector2(p1.x, p1.z);
- new THREE.Vector2(p2.x, p2.z);
- var maxWidth = standards$1[box.boxType].widthNormal.max / 2;
- maxWidth = THREE.MathUtils.clamp(maxWidth, tolerateWidth.min, tolerateWidth.max); //因为场景精度存在较大误差,所以maxWidth不能过小,否则像灭火器摄像头都容易findRest多个
- var dis = solidBox.bound.distanceToPoint(p2); //let r0 = solidBox.boxType == 'air' ? 2 : solidBox.boxType == 'battery' ? 1.1 : 1 //空调最不容易扎堆放置,所以范围设置广一些
- var r0 = standards$1[box.boxType].closeRatio;
- var r1 = math$2.linearClamp(box.pano.position.distanceTo(p2), 3, 20, 1, 5); //距离远的话识别、计算都会更不准确,给一定的容错. 远的尽量不findRest,即尽量>0
- var ra = (solidBox.boxType == box.boxType ? 1 : 0.5) * r0 * r1; //数字越小限制越大
- /* let a = maxWidth * maxWidth * ra - p1_.distanceToSquared(p2_)
- let b = -dis * dis * 0.7
- let c = a + b*/
- var c = maxWidth * ra - dis * 1.3;
- /* if (c > 0) {
- //太近 不创建
- console.log(1)
- } */
- return c > 0;
- });
- if (!near) {
- reMatchLowScores([{
- box0: box,
- log: 'findRest'
- }], groups, {
- startIndex: 0
- });
- }
- }
- });
- }
- function used(box) {
- //是否已经使用过
- var has = function has(e) {
- return e.box0 == box || e.box1 == box;
- };
- var traverse = function traverse(e) {
- return has(e) || e.list && e.list.some(function (a) {
- return traverse(a);
- }) || e.mixedFrom && e.mixedFrom.some(function (a) {
- return traverse(a);
- }) || e.infos && e.infos.some(function (u) {
- return u.group.some(function (r) {
- return r.boxes.some(function (b) {
- return b == box;
- });
- });
- }); //row
- };
- return boxesSolid$1.some(function (e) {
- return traverse(e);
- });
- }
- function reMatchLowScores(lowScores, groups) {
- var _ref7 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- _ref7$startIndex = _ref7.startIndex,
- startIndex = _ref7$startIndex === void 0 ? 2 : _ref7$startIndex,
- fake = _ref7.fake;
- var tooLows = [];
- var minScore = boundConfirmed$1 ? -2000 : -800;
- var isSameMatch = function isSameMatch(match0, match1) {
- //是否对应同一个box实体(不一定准),通过两两box之间是否都match来判断
- //如果是相同pano但不同的box肯定不是对应同一个box实体
- var ifWrong = function ifWrong(box0, box1) {
- if (box0 == box1) return;
- if (box0.pano == box1.pano) return true;
- var match2 = getMatchScore(box0, box1, {
- isSingle: true,
- restMatch: true
- });
- if (match2.score < minScore) return true;
- };
- if (ifWrong(match0.box0, match1.box0) || ifWrong(match0.box1, match1.box1) || ifWrong(match0.box0, match1.box1) || ifWrong(match0.box1, match1.box0)) return;
- return true;
- };
- if (lowScores.length) {
- //console.warn(lowScores[0].log || (lowScores[0].box1 ? '低分重新匹配' : '剩余匹配'), lowScores[0].box0.boxType, ...lowScores)
- if (lowScores[0].box1) {
- lowScores.sort(function (a, b) {
- //低分优先
- return a.score - b.score;
- });
- }
- lowScores.forEach(function (info) {
- //info中的box0和box1分别向后寻找其他的配对。选择分数高的配对。 但box0和box1可能是错误配对,会导致找到了替代的也可能遗漏。
- /* if (info.name == 'pano0-3&pano2-3') {
- console.log(1)
- } */
- var box01 = info.box0;
- var box02 = info.box1;
- var bigGroup = [];
- box02 && bigGroup.push(info);
- var _loop6 = function _loop6(cur) {
- var thirdGroup = groups[cur];
- var scores0 = [],
- scores1 = [];
- thirdGroup.forEach(function (box1) {
- //if (matched.includes(box1.sid)) return
- if (used(box1)) return; //会不会太严格?
- if (box1.pano != box01.pano && box1 != box02) {
- var r1 = getMatchScore(box01, box1, {
- isSingle: true,
- restMatch: true
- });
- r1.score > minScore * 1.5 && scores0.push(r1);
- }
- if (box02 && box1.pano != box02.pano && box1 != box01) {
- var r2 = getMatchScore(box02, box1, {
- isSingle: true,
- restMatch: true
- });
- r2.score > minScore * 1.5 && scores1.push(r2);
- }
- });
- scores0.sort(function (a, b) {
- return b.score - a.score;
- });
- scores1.sort(function (a, b) {
- return b.score - a.score;
- });
- scores0[0] && bigGroup.push(scores0[0]);
- scores1[0] && bigGroup.push(scores1[0]);
- };
- for (var cur = startIndex; cur < groups.length; cur++) {
- _loop6(cur);
- }
- bigGroup.sort(function (a, b) {
- return b.score - a.score;
- });
- var goodList = bigGroup.slice(0, 10).map(function (e) {
- if (!getBoxPos$1(e)) return e;
- preDealBox$1(e);
- getBoxSize$1(e);
- return e;
- });
- var goodList2 = goodList.sort(function (a, b) {
- return b.score - a.score;
- }).slice(0, 3);
- if (goodList2.length == 0) {
- return fake || createSinglePano(box01, 0.6); //minScorePercent原因:剩余匹配时位置不太好的案例: AhMgXXjM15
- }
- if (goodList2[0].score > minScore * 0.65) {
- goodList2 = goodList2.filter(function (e) {
- return e.score > minScore * 0.65;
- });
- } else {
- /* goodList2 = [goodList2[0]] // 最高分已经过小
- if (goodList2[0].score < -1500) { */
- if (!box02) {
- if (info.log == 'findRest' || getBoxPos$1(box01).distanceTo(box01.pano.position) < 2.5) {
- //远距离不准,留到过后findRest
- fake || createSinglePano(box01);
- }
- return;
- } //console.warn('分数过低,是否有匹配错误?', goodList2[0])
- return tooLows.push(goodList2[0]); //}
- }
- if (goodList2.length) {
- //需要确认两两之间是配对的,也就是都对应同一个box
- var subGroups = [],
- boxes = [];
- var _loop7 = function _loop7(i, len) {
- //向后选择队友
- var match0 = goodList2[i];
- if (subGroups.some(function (e) {
- return e.includes(match0);
- })) return "continue"; //被挑选了的没有选择权
- var gr = [match0];
- for (var j = i + 1; j < len; j++) {
- var match1 = goodList2[j];
- if (isSameMatch(match0, match1)) {
- //可能不是同一个,所以需要检验
- gr.push(match1);
- }
- } //if(gr.length>1){
- subGroups.push(gr); //}
- };
- for (var i = 0, len = goodList2.length; i < len; i++) {
- var _ret5 = _loop7(i, len);
- if (_ret5 === "continue") continue;
- } //console.log('lowScores subGroups', subGroups)
- subGroups.forEach(function (pair) {
- boxes.push(mixMatchBox(pair, lowScores[0].log, fake));
- });
- fake || combineBoxes(boxes); //很可能其实还是同一个,需要检验是否要融合
- }
- }); //改为之后 findRest, 因为两者都single的可能性低
- /* let judge = box => {
- if (!used(box)) {
- matched.push(box)
- createSinglePano(box)
- }
- }
- tooLows.forEach(e => {
- judge(e.box0)
- judge(e.box1)
- }) */
- }
- }
- function mixMatchBox(list, log, fake) {
- var center = new THREE.Vector3(),
- size = new THREE.Vector3(),
- bound = new THREE.Box3();
- list.forEach(function (e) {
- var _bound = new THREE.Box3().setFromCenterAndSize(getBoxFinalPos$1(e), e.size);
- bound.union(_bound);
- }); //bound.getCenter(center) //这两种获得center的方法哪个准?
- bound.getSize(size);
- list.forEach(function (e) {
- return center.add(getBoxPos$1(e));
- });
- center.multiplyScalar(1 / list.length);
- var _ref8 = list.find(function (e) {
- return e.xProp;
- }) || {},
- xProp = _ref8.xProp,
- yProp = _ref8.yProp;
- if (xProp && list.find(function (e) {
- return e.xProp && e.xProp != xProp;
- })) {
- //如果有不同的话
- xProp = yProp = null;
- }
- var prefix = log == 'findRest' ? 'rest:' : 'low:';
- var object = {
- name: prefix + list.map(function (e) {
- return e.name;
- }),
- boxType: list[0].boxType,
- center,
- size,
- list,
- xProp,
- yProp
- };
- xProp || getBoxDirProp$1(object);
- var o = restrictSize$1(size.x, size.y, size.z, object);
- size.x = o.x;
- size.y = o.y;
- size.z = o.z;
- object.fake = fake;
- var box = new Box$1(object); //console.log('mixMatchBox', box)
- return box;
- }
- function combineBoxes(boxes, typeCount) {
- //调试 tY4ot33f8vT UWrshepp0G5的一高一低的电箱
- //判断这些实体boxes是否需要合并 主要用于重复识别(重叠面积较大) 电池还可能是拼接
- var group = [];
- if (boxes.length > 1) {
- var boxType = boxes[0].boxType;
- var _standards$boxType$wi3 = standards$1[boxType].widthNormal;
- _standards$boxType$wi3.min;
- var max = _standards$boxType$wi3.max;
- for (var i = 0, len = boxes.length; i < len - 1; i++) {
- var box0 = boxes[i];
- if (box0.fake) continue;
- for (var j = i + 1; j < len; j++) {
- var box1 = boxes[j];
- if (box1.fake) continue;
- var bound = box0.bound.clone().union(box1.bound);
- var size = bound.getSize(new THREE.Vector3());
- var intersect = box0.bound.intersectsBox(box1.bound);
- if (box0.boxType == 'electric') {
- console.log(1);
- }
- var maxX = max,
- maxZ = max,
- maxY = standards$1[boxType].height.max;
- if (box0.xProp && box1.xProp && box0.xProp == box1.xProp) {
- maxX = standards$1[boxType][box0.xProp].max;
- maxZ = standards$1[boxType][box0.yProp].max;
- /* minX = standards[boxType][box0.xProp].min
- minZ = standards[boxType][box0.yProp].min */
- if (box0.boxType != box1.boxType) {
- //air & airSmart
- maxX = Math.max(maxX, standards$1[box1.boxType][box1.xProp].max);
- maxZ = Math.max(maxZ, standards$1[box1.boxType][box1.yProp].max);
- /* minX = Math.min(minX, standards[box1.boxType][box1.xProp].min)
- minZ = Math.min(minZ, standards[box1.boxType][box1.yProp].min) */
- }
- }
- maxX = Math.max(maxX, box0.size.x, box1.size.x); //必须大于各自的size,否则无法去除本身就oversize的box中包含的
- maxZ = Math.max(maxZ, box0.size.z, box1.size.z);
- maxY = Math.max(maxY, box0.size.y, box1.size.y);
- var r = intersect ? 1.5 : 1.3;
- /* / standards[box1.boxType].closeRatio */
- //如果是没有交集,限制更大些
- //若需要更精确的结果,可以getMixBox算出重叠面积,重叠少,且各自都不太小,就不合并。但考虑到电池边界很模糊,合并了也无大碍。
- if (box0.boxType == 'battery') {
- r *= 1.3; //比较可能扎堆
- }
- var maxDiff = 0.4,
- maxDiffX = maxDiff,
- maxDiffZ = maxDiff,
- rx = r,
- rz = r;
- if (standards$1[box0.boxType].atWall == 1) {
- //在墙面上不可能叠放,所以厚度限制可放宽
- var s = 4;
- if (box0.yProp == 'width') {
- maxDiffX *= s;
- rx *= s;
- } else if (box0.xProp == 'width') {
- maxDiffZ *= s;
- rz *= s;
- }
- } //如果某个点位含有类似和这俩相近的box: A9rCPzp2UD9两个fire合并了。好难写,算了
- /* if(box0.boxType){
- this.datasMixed
- rx = rz = 1.1
- } */
- 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) {
- //总size不会太大
- common$1.pushToGroupAuto([box0, box1], group);
- }
- }
- }
- if (group.length) {
- //虽然如果三个以上可能会超出maxWidth。 不过3个的概率很低,且可以限制宽度
- group.forEach(function (pair) {
- var boxTypes = [];
- var bound = new THREE.Box3();
- pair.forEach(function (e) {
- bound.union(e.bound);
- e.dispose();
- if (typeCount > 1) {
- //判断boxType: 寻找所使用的box总分最高的boxType
- var a = boxTypes.find(function (a) {
- return a.boxType == e.boxType;
- });
- var score = 0;
- var add = function add(box) {
- box && (score += box.score);
- };
- e.traversePair(function (e) {
- add(e.box0);
- add(e.box1);
- });
- if (a) {
- a.score += score;
- } else {
- boxTypes.push({
- score,
- boxType: e.boxType
- });
- }
- }
- });
- if (typeCount > 1) {
- boxTypes.sort(function (a, b) {
- return b.score - a.score;
- });
- boxType = boxTypes[0].boxType;
- }
- var size = bound.getSize(new THREE.Vector3());
- var center = bound.getCenter(new THREE.Vector3());
- var _ref9 = pair.find(function (e) {
- return e.xProp;
- }) || {},
- xProp = _ref9.xProp,
- yProp = _ref9.yProp;
- if (xProp && pair.find(function (e) {
- return e.xProp && e.xProp != xProp;
- })) {
- //如果有不同的话
- xProp = yProp = null;
- }
- var info = {
- name: 'mix:' + pair.map(function (e) {
- return ' ' + e.name;
- }),
- mixedFrom: pair,
- boxType,
- center,
- size,
- xProp,
- yProp
- };
- xProp || getBoxDirProp$1(info);
- var o = restrictSize$1(size.x, size.y, size.z, info);
- size.x = o.x;
- size.y = o.y;
- size.z = o.z;
- var box = new Box$1(info);
- console.error('混合', boxType, pair, box);
- });
- }
- }
- }
- function combines(types) {
- //合并boxSolids . battery经常嵌套
- if (!(types instanceof Array)) types = [types];
- var boxes = boxesSolid$1.filter(function (e) {
- return types.includes(e.boxType);
- });
- combineBoxes(boxes, types.length);
- }
- var createSinglePano = function createSinglePano(box) {
- var minScorePercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- //仅用一个pano中的data来创建。 悬挂于墙上的准确性依赖于墙的准确性。
- if (box.score < MinBoxInitialScore) {
- //如Xszq2fv03b的电池pano8-0其实是纸箱、 WZQoMbNmNTu的pano14-0分数0.649
- return console.error('取消createSinglePano: 线框识别分数低,可能错误', box.sid, box);
- }
- getBoxBase$1(box);
- var center = getBoxPos$1(box);
- if (safeBound$1.distanceToPoint(center) > 0) {
- return console.log('取消createSinglePano:超出safebound', box); //可能是错误的线框,如H7pg1tO9oeJ pano8-1
- }
- var info = {
- name: box.sid,
- box0: box,
- center,
- topPos: box.topPos,
- btmPos: box.btmPos
- };
- preDealBox$1(info);
- var minScore = -500 * minScorePercent; //调试 3MnIWabM6ne Tmo1vLp9Q13
- var a = getPoseScore$1(info.boxposes, box.boxType
- /* true */
- );
- if (!standards$1[box.boxType].bottom && box.btmPos) {
- a -= (box.btmPos.y - groundY$1) * 3000; //底部被遮住一部分(但是像vHC1GfkdKtD在户外,容易底部变高到bound外去怎么办)
- }
- var failed = a < minScore;
- console.log('createSinglePano', failed ? '失败' : '成功', 'pose score:', a, box.sid, box);
- if (failed) return; //addLabel(center, 'center', { a: 0.3 })
- //info.topPos && addLabel(info.topPos, 'topPos', { a: 0.3 })
- info.score = a;
- getBoxSize$1(info);
- new Box$1(info);
- }; //去除挨得很近的漫游点,因为两个接近的点match出的值误差很大
- {
- _this3.removedDatas = {};
- var panoIds = Object.keys(_this3.datas).filter(function (id) {
- if (!player$d.model.panos.index[id]) {
- //排除数据错误
- _this3.removedDatas[id] = _this3.datas[id];
- delete _this3.datas[id];
- console.log('???', id);
- return;
- }
- return true;
- });
- var len = panoIds.length;
- for (var i = 0; i < len; i++) {
- var pano0 = player$d.model.panos.index[panoIds[i]];
- for (var j = i + 1; j < len; j++) {
- var pano1 = player$d.model.panos.index[panoIds[j]];
- if (pano0.position.distanceToSquared(pano1.position) < 0.01) {
- //离的很近。保留shape多的那个data
- var remove = void 0;
- if (_this3.datas[panoIds[i]].shapes.length > _this3.datas[panoIds[j]].shapes.length) {
- remove = panoIds[j];
- } else {
- remove = panoIds[i];
- }
- console.log("\u5220\u9664pano".concat(remove, "\u7684data\uFF0C\u56E0pano").concat(panoIds[i], "\u548Cpano").concat(panoIds[j], "\u5F88\u8FD1"));
- _this3.removedDatas[remove] = _this3.datas[remove];
- delete _this3.datas[remove];
- }
- }
- }
- } //this.expandModelBound()
- // if (version == 'vision') this.datasMixed = common.CloneObject(this.datas, null, [player.model.panos.list[0].constructor])
- _this3.datasMixed = common$1.CloneObject(_this3.datas, null, undefined, function (data) {
- return data['category'];
- });
- /* Search('cabinet')
- Search('air')
- Search('battery') */
- for (var _i4 in typeNames$1) {
- Search(_i4);
- }
- console.log('----FindRest----');
- waitFindRest.forEach(function (e) {
- findRest.apply(void 0, _toConsumableArray(e.args));
- if (e.type != 'air' && e.type != 'airSmart' && e.type != 'cabinet') combines(e.type);
- });
- combines(['air', 'airSmart']); //这两种合在一起combine,因为太像了容易识别出多个 nZrBdvRaDuC
- console.log('cost:', Date.now() - startTime$1, 'ms, boxSolid:', _this3.boxesSolid, '共' + _this3.boxesSolid.length + '个');
- };
- /* let getSid = (function(){
- let sid = 0
- return function(){
- return sid++
- }
- })() */
- done = function done() {
- var _loop8 = function _loop8(panoId) {
- if (!_this3.datas[panoId]) return "continue";
- _this3.datas[panoId].shapes = _this3.datas[panoId].shapes.map(function (shape, i) {
- return Object.assign({
- sid: 'pano' + panoId + '-' + i,
- category: shape.category,
- //提前 便于调试
- pano: player$d.model.panos.index[panoId],
- index: i
- }, shape);
- });
- };
- for (var panoId in _this3.datas) {
- var _ret6 = _loop8(panoId);
- if (_ret6 === "continue") continue;
- }
- _this3.panoBound = new THREE.Box3();
- player$d.model.chunks.forEach(function (e) {
- modelBound$1.union(e.geometry.boundingBox); //注:不用model.boundingBox是 因为union了pano的position的
- }); //针对部分模型错误,只有底面的,union一下pano.position
- var minY = Infinity,
- minYs = [];
- var panos = player$d.model.panos.list.filter(function (e) {
- return e.isAligned();
- });
- panos.forEach(function (e) {
- var bound = new THREE.Box3().setFromCenterAndSize(e.position, new THREE.Vector3(0.1, 0.1, 0.1));
- modelBound$1.union(bound);
- _this3.panoBound.union(bound);
- minY = Math.min(e.floorPosition.y, minY); //avePanoFY += e.floorPosition.y
- minYs.push(e.floorPosition.y);
- });
- groundY$1 = modelBound$1.min.y;
- minYs.sort(function (a, b) {
- return a - b;
- }); //console.log(minYs)
- var midFloorY = minYs[Math.floor(minYs.length / 2)];
- console.error('minY', minY, 'midFloorY', midFloorY, '原groundY', groundY$1);
- _this3.minY = minY; //部分模型底部高度错误
- /* if (minY > groundY) {
- console.error('minY > groundY', minY, groundY)
- groundY = modelBound.min.y = midFloorY //案例nZrBdvRaDuC
- } else {
- if (groundY - minY > 0.05) console.warn('minY', minY, 'groundY', groundY)
- groundY = modelBound.min.y = midFloorY , document.title += ' new' //修改以后未必更好所以暂时不修改 变更好的:eGhyf5QdVHA
- } */
- groundY$1 = modelBound$1.min.y = midFloorY; //这个y可能不准。需要通过fire的btmPos.y来确定
- safeBound$1 = _this3.safeBound = modelBound$1;
- groundPlane$1.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY$1, 0));
- if (_this3.ifAnalyze) {
- beginCompute();
- }
- {
- _this3.load(player$d.currentPano.id);
- _this3.updateBoxVisiInPano();
- }
- };
- if (!dataList) {
- /* player.model.panos.list.forEach(e => {
- if (!e.isAligned()) return
- panosCount++
- load.bind(this)(e.id)
- }) */
- loadAll.bind(this)(); //测试环境
- } else {
- //when version == 'output'
- dataList.forEach(function (e) {
- var panoId = e.imagePath.split('.jpg')[0];
- _this3.datas[panoId] = e;
- });
- done();
- }
- case 13:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- function compute(_x) {
- return _compute.apply(this, arguments);
- }
- return compute;
- }()
- }, {
- key: "expandModelBound",
- value: function expandModelBound() {
- var _this6 = this;
- //有的模型太窄,容易将一排的柜体当做墙壁。所以可以根据box位置扩展bound. (如果因为点位太少,导致内部的电池远超模型范围,就不管了。R7xZsmm9FsG)
- var maxDis0 = 1,
- //最终位置不会超过这个距离
- maxDis1 = 3; //搜寻范围。不可扩展太宽,否则不准确的框会飘很远,甚至多画多个box,如R7xZsmm9FsG
- var newBound = modelBound$1.clone();
- var list = [];
- var _loop9 = function _loop9(panoId) {
- if (!_this6.datas[panoId]) return "continue";
- var _this6$datas$panoId = _this6.datas[panoId],
- imageWidth = _this6$datas$panoId.imageWidth,
- imageHeight = _this6$datas$panoId.imageHeight;
- _this6.datas[panoId].shapes.forEach(function (box) {
- getBoxBase$1(box, imageWidth, imageHeight);
- if (box.sid == 'pano2-10') {
- console.log(4);
- }
- if (box.btmPosPredict) {
- var far = box.pano.position.distanceToSquared(box.btmPosPredict);
- if (far > 20) return; //太远不准
- var dis = modelBound$1.distanceToPoint(box.btmPosPredict);
- if (dis > 0 && dis < maxDis1) {
- //maxDis1用来防air-hanging和一些错误的框
- list.push({
- box,
- dis
- });
- }
- }
- });
- };
- for (var panoId in this.datas) {
- var _ret7 = _loop9(panoId);
- if (_ret7 === "continue") continue;
- }
- list.sort(function (a, b) {
- return a.dis - b.dis;
- }); //let mid = list[Math.floor(list.length/2)]
- var mid = list.length; // /2
- for (var i = 0; i < mid; i++) {
- var box = list[i].box;
- var pos = box.btmPosPredict;
- if (list[i].dis > maxDis0) {
- var p1 = pos.clone().clamp(modelBound$1.min, modelBound$1.max);
- var vec = new THREE.Vector3().subVectors(pos, p1).normalize().multiplyScalar(maxDis0);
- pos = new THREE.Vector3().addVectors(p1, vec);
- }
- var marginBound = new THREE.Box3().setFromCenterAndSize(pos, new THREE.Vector3(0.2, 0, 0.2));
- newBound.union(marginBound);
- }
- skyBoxTight = new BoundingMesh(newBound, new THREE.MeshBasicMaterial({
- side: THREE.DoubleSide,
- wireframe: true,
- transparent: true,
- opacity: 0.05
- }), 0); //skyBoxTight.visible = false
- skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
- meshGroup$1.add(skyBoxTight);
- this.skyBoxTight = skyBoxTight;
- this.safeBound = this.safeBoundFirstVer = safeBound$1 = newBound;
- boundConfirmed$1 = true;
- console.log('bound1:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
- }
- }, {
- key: "expandModelBound2",
- value: function expandModelBound2(type) {
- var _this7 = this;
- var material = skyBoxTight.material;
- skyBoxTight.geometry.dispose();
- boxesSolid$1.forEach(function (e) {
- if (e.boxType != type) return;
- _this7.safeBound.union(e.bound);
- });
- skyBoxTight = new BoundingMesh(this.safeBound, material, 0); //skyBoxTight.visible = false
- skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
- meshGroup$1.add(skyBoxTight);
- this.skyBoxTight = skyBoxTight;
- console.log('bound2:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
- }
- /* adjustModelBound(type){
- if(standards[type].atWall != 1)return //必须是挂墙的
-
- this.lastSafeBound = this.safeBound.clone()
- let list = []
- let add = e => {
- if (e.btmPos && e.box1 && e.minAng>10 ) {
- //有 box1才能确定是getIntersect得到的pos
- list.includes(e) || e.push(e)
- }
- }
- this.boxesSolid.forEach((solidBox)=>{
- if(solidBox.boxType != type)return
- solidBox.traversePair(add)
- })
- let wallSides = {'x+': 0, 'x-': 0, 'z+': 0, 'z-': 0}
- let getBoxSide = (e)=>{
- for(let i in e.panosDir){
- if(e.panosDir[i] != 0){
- wallSides[i] += 1
- }
- }
- }
-
- if(list.length){
- this.safeBound = this.panoBound.clone()
- list.forEach((e)=>{
- this.safeBound.union(e.bound)//还是说使用cIntersect来expand?
- getBoxSide()
- })
- }
-
-
- skyBoxTight = new BoundingMesh(this.safeBound, material, 0)
- //skyBoxTight.visible = false
- skyBoxTight.updateMatrixWorld() //不update的话raycaster是错的
- meshGroup.add(skyBoxTight)
- this.skyBoxTight = skyBoxTight
-
- //主要目的,针对那些模型比room大得多的情况,比如多了门外的部分,造成墙面不准。
- //monitor的可以完全决定位置。其他的只能收缩(但是不能收缩超过panos和第一次expand的那些btm的bound里)
- //太麻烦了,且考虑到即使墙面完全准确也可能反倒把它变的不准的风险。
-
- } */
- /* 最低点使用fire的吗
- MW6MEeCOy9Y 只有最近三个点和fire接近
- 3MnIWabM6ne fire combine了
- ov5NTEImzhW fire多个
- n4z0yd5tQaF fire多两个错位离谱的。。 位置和显示的不一样。。
- 5BaiXkK6Ag1 fire算的不太准 低了0.1 样本数仅两个
- */
- }, {
- key: "updateBoxVisiInPano",
- value: function updateBoxVisiInPano() {
- if (!isDiwei$1) return;
- if (player$d.mode != 'panorama') {
- this.boxesSolid.forEach(function (e) {
- return e.updateVisible(true, 'panoVisi');
- });
- return;
- }
- var data = this.datasMixed[player$d.currentPano.id] || this.datas[player$d.currentPano.id];
- if (!data) return;
- var visiBoxes = this.visiInfos[player$d.currentPano.id];
- if (!visiBoxes) {
- visiBoxes = [];
- this.boxesSolid.forEach(function (box) {
- var sizeXZ = new THREE.Vector2(box.size.x, box.size.z);
- var extLen = -sizeXZ.length() / 2 - 0.5;
- var intersect = convertTool.ifIntersectChunks(player$d.position, box.position, player$d.model, {
- extLen
- });
- if (!intersect) {
- //是否和当前pano的box框位置接近
- var pos2d1 = new THREE.Vector2(box.position.x, box.position.z); //return visiBoxes.push(box)
- var shape = data.shapes.find(function (e) {
- //getBoxBtm(e)
- //return true
- if (isExt$1) {
- var imageWidth = data.imageWidth,
- imageHeight = data.imageHeight;
- getBoxBase$1(e, imageWidth, imageHeight);
- getOtherPos$1(e);
- }
- var pos = getBoxPos$1(e);
- if (!pos) return;
- var pos2d2 = new THREE.Vector2(pos.x, pos.z);
- if (pos2d1.distanceToSquared(pos2d2) < 3) return true; //效果:有一些一排中2d框稀疏的可能会不显示
- });
- if (shape) {
- visiBoxes.push(box);
- }
- }
- });
- this.visiInfos[player$d.currentPano.id] = visiBoxes;
- }
- this.boxesSolid.forEach(function (e) {
- e.updateVisible(visiBoxes.includes(e), 'panoVisi');
- });
- }
- }, {
- key: "confirmGroundY",
- value: function confirmGroundY(type) {
- //利用fire来确定地面高度(会稍低于地板,但box框不打滑且xz更准,估计因box框比box大)。调试:3MnIWabM6ne up9PPZkx1px 4GqaqNdyjGfs GFbQi1LiSij
- if (boundConfirmed$1) return;
- var btmYs = [],
- pairs = [],
- needCount = 5,
- maxDis = 3,
- btmY = 0;
- var add = function add(e) {
- if (e.btmPos && e.box1
- /* && e.score >= minScore */
- ) {
- //有 box1才能确定是getIntersect得到的pos
- pairs.push(e);
- }
- };
- boxesSolid$1.forEach(function (e) {
- if (e.boxType != type) return;
- e.traversePair(add);
- });
- var usePairs = pairs;
- if (pairs.length > needCount) {
- //调试:Y8czF2Z3h9m
- var disMap = new Map();
- pairs.forEach(function (e) {
- disMap.set(e, Math.max(e.box0.pano.position.distanceTo(e.box0.btmPosPredict), e.box1.pano.position.distanceTo(e.box1.btmPosPredict)));
- });
- pairs.sort(function (a, b) {
- return disMap.get(a) - disMap.get(b);
- }); //距离从近到远 . 远处的高度可能偏离严重,就不管了,而且框也不一定准
- usePairs = pairs.slice(0, needCount);
- for (var i = needCount; i < pairs.length; i++) {
- if (disMap.get(pairs[i]) < maxDis) {
- usePairs.push(pairs[i]);
- }
- }
- }
- usePairs.forEach(function (e) {
- //有 box1才能确定是getIntersect得到的pos
- var btmY_ = e.btmPos.y;
- var width = e.size.x / 2;
- var h0 = width / Math.tan(Math.acos(-e.box0.centerBtmDir.y)); //|centerBtmDir.y| 即俯视角度的cos
- var h1 = width / Math.tan(Math.acos(-e.box1.centerBtmDir.y));
- var h = Math.min(h0, h1); //选个小的吧,因浅的会更快接触到中心,虽然交点是两条射线最近点 不一定在fire中心
- //如果毫无误差,且centerBtmDir.y相同,只要两条线centerBtmDir的xz相同,交点就是和地面的交点,而只要不同,交点就是和地面的交点,而只要不同,交点必然是在fire中心之下。随着minAng和centerBtmDir.y 交点在这中间变化
- var r = math$2.linearClamp(e.minAng, 0, 90, 0, 1);
- btmY_ += h * r;
- btmYs.push(btmY_);
- btmY += btmY_;
- });
- btmY /= btmYs.length;
- if (btmYs.length) {
- console.error('confirmGroundY', btmY,
- /* '样本数', btmYs.length, */
- btmYs, usePairs.map(function (e) {
- return e.name;
- }), pairs);
- /* if(btmYs.length == 1 && pairs[0].minAngle<12 && ){
-
- } */
- groundY$1 = this.safeBound.min.y = this.panoBound.min.y = btmY; // = -1.1
- groundPlane$1.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY$1, 0));
- }
- var _standards$type$heigh = standards$1[type].height,
- min = _standards$type$heigh.min,
- max = _standards$type$heigh.max;
- boxesSolid$1.slice().forEach(function (e) {
- if (e.boxType != type) return;
- if (e.fake) {
- e.dispose();
- return;
- }
- var topY = e.topPos ? e.topPos.y : e.list.reduce(function (w, c) {
- return w + c.topPos.y;
- }, 0) / e.list.length;
- e.size.y = THREE.MathUtils.clamp(topY - groundY$1, min, max);
- e.setFromInfo(e);
- e.draw();
- });
- this.panoBound;
- this.expandModelBound();
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- var _this8 = this;
- player$d.on(PlayerEvents.FlyingStarted, function (e) {
- //if(e.mode == 'dollhouse')return
- // 点位跳转前清除已有线框
- _this8.traverse(function (obj) {
- if (obj.isMesh) {
- obj.geometry.dispose();
- obj.material.dispose();
- }
- });
- _this8.wireframes.clear();
- _this8.currentId = null;
- });
- player$d.on(PlayerEvents.FlyingEnded, function () {
- // 点位跳转后加载线框
- _this8.updateBoxVisiInPano();
- if (player$d.mode != Viewmode$1.PANORAMA) return; // 只有PANORAMA模式下需要加载
- _this8.load(player$d.currentPano.id);
- });
- var allBoxMesh = [];
- player$d.on('collectIntersectMesh', function (meshes, e) {
- if (!isDiwei$1) return; //allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
- allBoxMesh = _this8.boxesSolid.filter(function (e) {
- return common$1.getObjVisiByReason(e.label, 'panoVisi');
- }).map(function (e) {
- return e.boxMesh;
- }); //过滤掉隐藏的
- //meshes.push(...allBoxMesh)
- });
- player$d.on('judgeIntersect', function (intersect_, e) {
- if (e.getConsumed() || !isDiwei$1) return;
- var intersect = player$d.getMouseIntersect(null, allBoxMesh, {});
- var hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null;
- if (hoveredBox != _this8.hoveredBox) {
- if (_this8.hoveredBox) ;
- if (hoveredBox) {
- // hoveredBox.updateVisible(true, 'unhover')
- /* hoveredBox.boxMesh.visible = true
- hoveredBox.boxHelper.material.opacity = 1
- hoveredBox.boxHelper.material.color.copy(colors.yellow)
- hoveredBox.label.setBackgroundColor(Object.assign(colors.labelYellow)) //text
- */
- CursorDeal.add('hoverMonitor');
- } else {
- CursorDeal.remove('hoverMonitor');
- }
- _this8.hoveredBox = hoveredBox;
- }
- hoveredBox && e.consume();
- });
- player$d.on('click', function (e) {
- if (e.getConsumed() || !isDiwei$1) return;
- if (_this8.hoveredBox) {
- player$d.$app.Scene.emit('box-frame-click', _this8.hoveredBox);
- e.consume();
- }
- });
- /*let allBoxMesh = []
- player.on('collectIntersectMesh', (meshes, e) => {
- allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
- meshes.push(...allBoxMesh)
- })
- player.on('judgeIntersect', (intersect, e) => {
- if (e.getConsumed()) return
- let hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null
- if (hoveredBox != this.hoveredBox) {
- if (this.hoveredBox) {
- this.hoveredBox.boxMesh.visible = false
- this.hoveredBox.boxHelper.material.opacity = 0.5
- this.hoveredBox.boxHelper.material.color.copy(colors.green)
- this.hoveredBox.label.setBackgroundColor( Object.assign(colors.labelGreen) )//text
- }
- if (hoveredBox) {
- hoveredBox.boxMesh.visible = true
- hoveredBox.boxHelper.material.opacity = 1
- hoveredBox.boxHelper.material.color.copy(colors.yellow)
- hoveredBox.label.setBackgroundColor( Object.assign(colors.labelYellow ))//text
- CursorDeal.add('hoverMonitor')
- } else {
- CursorDeal.remove('hoverMonitor')
- }
- this.hoveredBox = hoveredBox
- }
- hoveredBox && e.consume()
- })
- player.on('click', e => {
- if (e.getConsumed()) return
- if (this.hoveredBox) {
- player.$app.Scene.emit('box-frame-click', this.hoveredBox)
- e.consume()
- }
- }) */
- /* let allRectMesh
- player.on('collectIntersectMesh', (meshes, e) => {
- if(!this.wireframes || !this.wireframes.visible)return
- allRectMesh = this.wireframes.children.filter(e=>e.name == 'rectInPano').map(e => e.plane) //plane
-
- meshes.push(...allRectMesh)
- })
- player.on('judgeIntersect', (intersect, e) => {
- if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
- let hoveredRect = intersect && allRectMesh.includes(intersect.object) ? intersect.object.parent.parent : null
- if (hoveredRect != this.hoveredRect) {
- if (this.hoveredRect) {
- this.hoveredRect.wireframe.material.color.copy(colors.green)//框
- this.hoveredRect.label.setBackgroundColor( colors.labelGreen )//text
-
- this.hoveredRect.plane.visible = false //plane
-
-
- }
- if (hoveredRect) {
- hoveredRect.wireframe.material.color.copy(colors.yellow)//框
- hoveredRect.label.setBackgroundColor(colors.labelYellow )//text
-
- hoveredRect.plane.visible = true //plane
- CursorDeal.add('hoverMonitor')
- } else {
- CursorDeal.remove('hoverMonitor')
- }
- this.hoveredRect = hoveredRect
- }
- hoveredRect && e.consume()
- })
- player.on('click', e => {
- if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
- if (this.hoveredRect) {
- console.log(this.hoveredRect.data)
- e.consume()
- }
- }) */
- if (this.ifAnalyze && !isDiwei$1) {
- setTimeout(function () {
- {
- var btn = document.createElement('button');
- btn.innerHTML = '点击切换box显示';
- var visi;
- btn.onclick = function () {
- visi = !visi; //this.boxesSolid.forEach(e => ((e.boxHelper.visible = visi), (e.label.visible = visi), (e.boxMesh.visible = false)))
- _this8.boxesSolid.forEach(function (e) {
- return e.updateVisible(visi, 'whole');
- });
- _this8.showBoxes = visi;
- };
- document.querySelector('#app').appendChild(btn);
- btn.id = 'boxWire';
- btn.style.position = 'fixed';
- btn.style['z-index'] = '100';
- btn.style.background = '#e00472';
- btn.style.padding = '10px';
- btn.style.bottom = '80px';
- }
- {
- var _btn = document.createElement('button');
- _btn.innerHTML = '点击切换矩形框显示';
- _btn.onclick = function () {
- _this8.wireframes.visible = !_this8.wireframes.visible;
- };
- document.querySelector('#app').appendChild(_btn);
- _btn.id = 'wireframes';
- _btn.style.position = 'fixed';
- _btn.style['z-index'] = '100';
- _btn.style.background = '#419aff';
- _btn.style.padding = '10px';
- _btn.style.bottom = '130px';
- }
- }, 1000);
- }
- }
- /**
- * 加载点位标记数据
- * @param {*} panoId
- */
- }, {
- key: "load",
- value: function load(panoId) {
- var _this9 = this;
- var data = this.datasMixed[panoId] || this.datas[panoId];
- if (!data) {
- if (!(panoId in this.datas)) setTimeout(function () {
- _this9.load(panoId);
- }, 100); //否则无数据
- return;
- }
- if (player$d.currentPano.id != panoId || player$d.flying || this.currentId == panoId) return; // 防止连续跳转点位时,clear后才load好上一点位的数据,导致出现之前的标记
- this.currentId = panoId;
- var shapes = data.shapes,
- imageHeight = data.imageHeight,
- imageWidth = data.imageWidth; //data.data
- var allShapes = shapes.slice();
- shapes.forEach(function (e) {
- if (e.boxes) allShapes.push.apply(allShapes, _toConsumableArray(e.boxes));
- });
- allShapes.forEach(function (shape) {
- // 填充色和线框色
- // let { fill_color, line_color } = shape
- getUVs$2(shape);
- getCenterDir$2(shape, player$d.currentPano);
- var fill_color = shape.fill_color,
- _shape$color = shape.color,
- color = _shape$color === void 0 ? [56, 56, 255] : _shape$color;
- var line_color = [].concat(_toConsumableArray(color), [255]);
- if (!fill_color) fill_color = [255, 255, 255, 0];
- if (!line_color) line_color = [255, 0, 0, 255];
- if (shape.boxes) {
- line_color = [20, 205, 255, 255];
- }
- var pos = getBoxPos$1(shape);
- var dis = pos ? shape.pano.position.distanceTo(getBoxPos$1(shape)) : 1;
- var labelShift = (shape.boxType == 'fire' ? 0 : -0.2) / dis;
- var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
- name = [name, 'sc: ' + math$2.toPrecision(shape.score, 3)]; //}
- _this9.showSignalFrom2d(name, shape.bbox2, imageWidth, imageHeight, {
- fill: {
- color:
- /* colors.yellow, // */
- new THREE.Color().setRGB(fill_color[0] / 255, fill_color[1] / 255, fill_color[2] / 255),
- opacity:
- /* 0.2, */
- fill_color[3] / 255
- },
- line: {
- color:
- /* colors.green,// */
- new THREE.Color().setRGB(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255),
- opacity: shape.category == 'cabling_rack' ? 0.4 : line_color[3] / 255 //走线架太绕,扰乱视线
- }
- }, shape.centerDir, labelShift, shape.state == '被删除', shape);
- }); // })
- // .catch(err => console.log(`点位${panoId}无标记数据或数据出错:`, err))
- }
- /**
- * 根据坐标标记全景图
- *
- * 存在的问题:如果要准确复现全景图上的线框,上下边框会变为弧形。而按顶点连直线的话,180度以上会出bug。
- * 解决方式:目前150度以下只画出4个顶点然后连直线,150度以上准确画出全景图线框。
- */
- }, {
- key: "showSignalFrom2d",
- value: function showSignalFrom2d(name, rect, w, h, options, centerDir, labelShift, removed, data) {
- // 目前rect给的是矩形对角的两个点坐标,将它扩展成四个顶点
- 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])]; // 根据四个顶点,填充中间点
- var pointArr = [];
- for (var i = 0; i < cornerArr.length; i++) {
- var corner1 = cornerArr[i];
- pointArr.push(corner1);
- /* // 横向角度超过150度时,3d中边框的弧线已经不太明显,准确画出全景图线框
- if ((rect[2] - rect[0]) / w < 5 / 12 && i % 2 == 0) continue
- const vec = [corner2[0] - corner1[0], corner2[1] - corner1[1]]
- let length = Math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
- let num = length / 150
- for (let j = 1; j <= num; j++) {
- pointArr.push([corner1[0] + (vec[0] / num) * j, corner1[1] + (vec[1] / num) * j])
- } */
- } //pointArr.push(cornerArr[0], cornerArr[2], cornerArr[1], cornerArr[3]) //对角线
- var points = [];
- pointArr.forEach(function (uv) {
- var dir = getDirByUV$2(uv, player$d.currentPano); // points.push(dir.sub(centerVec)) // 计算其他点相对于中点的坐标,方便旋转平移等
- points.push(dir);
- }); // 线框
- var lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
- var lineMaterial = new THREE.LineBasicMaterial({
- color: options.line.color,
- opacity: options.line.opacity,
- transparent: true,
- depthTest: false
- });
- var wireframe = new THREE.LineLoop(lineGeometry, lineMaterial); // wireframe.position.copy(centerVec) // 将中点作为线框坐标
- wireframe.renderOrder = 100; // 填充颜色
- var fillGeometry = lineGeometry.clone().setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 3, 2, 3, 1]), 1));
- var fillMaterial = new THREE.MeshBasicMaterial({
- color: options.fill.color,
- opacity: options.fill.opacity,
- transparent: true,
- side: THREE.DoubleSide,
- depthTest: false
- });
- var plane = new THREE.Mesh(fillGeometry, fillMaterial);
- plane.renderOrder = wireframe.renderOrder - 1;
- wireframe.add(plane);
- plane.visible = false; // 名称
- var textMesh = new TextSprite({
- text: name,
- backgroundColor: {
- r: options.line.color.r * 255,
- g: options.line.color.g * 255,
- b: options.line.color.b * 255,
- a: options.line.opacity * 0.5
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: options.line.opacity * 1.1
- },
- borderRadius: 15,
- renderOrder: wireframe.renderOrder + 1,
- player: player$d
- }); //const shift = new THREE.Vector3(0, labelShift , 0)
- textMesh.position.copy(centerDir
- /* .clone().add(shift).normalize() */
- );
- textMesh.lookAt(0, 0, 0); // 看向相机
- textMesh.scale.set(0.12, 0.12, 0.12);
- /* let line = addLine(centerDir, shift, null, options.line.color)
- line.material.opacity = options.line.opacity */
- var group = new THREE.Group();
- group.name = 'rectInPano';
- group.position.copy(player$d.currentPano.position);
- group.add(wireframe);
- group.add(textMesh); //group.add(line)
- this.wireframes.add(group);
- group.label = textMesh;
- group.wireframe = wireframe;
- group.plane = plane;
- if (removed) {
- textMesh.sprite.material.opacity = 0.4;
- lineMaterial.opacity *= 0.6;
- lineMaterial.color.set('#efe');
- }
- group.data = data;
- }
- }, {
- key: "clear",
- value: function clear() {
- skyBoxTight = null, meshGroup$1 = null, modelBound$1 = new THREE.Box3(), groundY$1 = null, safeBound$1 = null, boundConfirmed$1 = null, boxesSolid$1 = [];
- }
- }]);
- return PanoBoxFrame;
- }(THREE.Group);
- function _createSuper$E(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$E(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
- function _isNativeReflectConstruct$E() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
- var global$1 = window; //----------------------复制以下内容---------------------------------
- var fineModelLevel = 1; //如果模型准的话 可能多楼层。另外暂时不用expandMound
- //1级: 有分房间,但模型不精细 KK-t-QzlzQoim4P0
- //2级: 一般是3dTiles 家具有模型,墙壁不光滑 SG-t-N6no657Kuze SG-t-g3kcZ3tcaVG
- var player$c,
- skyboxTight,
- meshGroup,
- modelBound = new THREE.Box3(),
- ray = new THREE.Raycaster(),
- groundPlane = new THREE.Plane(),
- groundY,
- safeBound,
- boundConfirmed = true,
- startTime,
- boxesSolid = [],
- isExt,
- isDiwei,
- shelterFilterEnable = true,
- shelterByModel = false,
- isLocalTest = location.href.includes('192.168.0.59:') || location.href.includes('localhost:'); //my pc
- var colors = {
- yellow: new THREE.Color(238 / 255, 217 / 255, 35 / 255),
- green: new THREE.Color(39 / 255, 160 / 255, 146 / 255),
- labelYellow: {
- r: 238,
- g: 217,
- b: 35,
- a: 0.5
- },
- labelGreen: {
- r: 39,
- g: 160,
- b: 146,
- a: 0.5
- }
- };
- /* const typeNames = {
- fire: 'extinguisher', //灭火器
- monitor: 'surveillance_camera', //监控摄像机 放第一个,用于继续确定边界
- hlkcWindow: 'hlkc', //馈线窗
- groundBar: 'grounding_bar', //接地排
- cabinet: 'equipment_cabinet', //标准机柜
- battery: 'accumulator', //蓄电池组
- electric: ['ac_switchboard', 'dc_distribution'],
- air: 'sdkt', //普通空调柜式
- airSmart: 'ventilation_installation', //智能通风设备
- //cabling : 'cabling_rack', //单层走线架 因为在天花板的走线有点复杂,经常断开,无法确定方向所以放弃
- } */
- //注意:为了让getBoxPoseByPos的长宽更准确,thick最大值尽量小于width最小值
- var standards = {
- cabinet: {
- widthNormal: {
- min: 0.55,
- max: 1.05
- },
- //widthNormal是不计宽还是厚度的平均宽度 //个别场景如S9yepREK8Jl 宽0.8米
- height: {
- min: 0.3,
- max: 2.5,
- standard: 2
- },
- closeRatio: 0.7 //数值越小越容易findRest。一般在墙上的位置不准要设置大些,扎堆放置的设置小些
- },
- sofa: {
- widthNormal: {
- min: 0.8,
- max: 3
- },
- width: {
- min: 1.2,
- max: 3
- },
- thick: {
- min: 0.6,
- max: 1.19
- },
- height: {
- min: 0.5,
- max: 1.2,
- standard: 1
- },
- closeRatio: 0.1,
- atWall: 0.3
- },
- desk: {
- widthNormal: {
- min: 0.55,
- max: 3
- },
- width: {
- min: 1.0,
- max: 3
- },
- thick: {
- min: 0.5,
- max: 0.9
- },
- height: {
- min: 0.7,
- max: 1.2,
- standard: 1
- },
- closeRatio: 2
- },
- bed: {
- widthNormal: {
- min: 0.9,
- max: 2
- },
- width: {
- min: 1.85,
- max: 2.1
- },
- thick: {
- min: 0.8,
- max: 1.5
- },
- height: {
- min: 0.3,
- max: 0.9,
- standard: 0.4
- },
- closeRatio: 2
- },
- tv: {
- //假设是比较大而薄的放电视柜上的电视
- widthNormal: {
- min: 0.2,
- max: 1.2
- },
- width: {
- min: 0.5,
- max: 1.1
- },
- thick: {
- min: 0.05,
- max: 0.2
- },
- height: {
- min: 0.5,
- max: 1.2,
- standard: 0.7
- },
- bottom: {
- min: 0.3,
- max: 0.7
- },
- atWall: 0.8 ,
- closeRatio: 2
- }
- };
- var typeNames = {
- sofa: 'CombinationSofa',
- //组合沙发
- desk: 'Desk',
- bed: 'DoubleBed',
- tv: 'TV'
- };
- var getChName$1 = {
- sofa: '组合沙发',
- desk: '书桌',
- bed: '双人床',
- tv: '电视'
- };
- var addLine = function addLine(origin, dir, len, color) {
- return;
- };
- var addLabel = function addLabel(pos, text) {
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- bgcolor = _ref.bgcolor,
- a = _ref.a;
- new THREE.Vector3(0, -0.2, 0);
- bgcolor = bgcolor ? new THREE.Color(bgcolor) : {
- r: 1,
- g: 1,
- b: 1
- }; //let endPos = new THREE.Vector3().addVectors(pos,shift);
- text instanceof Array || (text = [text]);
- var lineCount = Math.round(Math.random() * 6) + 1;
- var lines = [];
- while (lineCount-- > 0) {
- lines.push('|');
- }
- text = [].concat(_toConsumableArray(text), lines, ['o']);
- var textMesh = new TextSprite({
- text,
- textColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 1
- },
- backgroundColor: {
- r: bgcolor.r * 255,
- g: bgcolor.g * 255,
- b: bgcolor.b * 250,
- a: a || 0
- },
- textBorderColor: {
- r: bgcolor.r * 255,
- g: bgcolor.g * 255,
- b: bgcolor.b * 250,
- a: a || 0.9
- },
- textBorderThick: 2,
- margin: {
- x: 0,
- y: 0
- },
- borderRadius: 0,
- player: player$c,
- sizeInfo: {
- minSize: 90,
- maxSize: 300,
- nearBound: 1,
- farBound: 7
- }
- });
- textMesh.position.copy(pos); //textMesh.scale.set(0.3, 0.3, 0.3)
- meshGroup.add(textMesh);
- textMesh.sprite.position.y += textMesh.sprite.scale.y * 0.4;
- return textMesh;
- };
- var getBoxFinalPos = function getBoxFinalPos(info) {
- //创建solidbox时的position
- var position;
- var center = getBoxPos(info);
- if (standards[info.boxType].bottom) {
- //悬挂
- position = center;
- } else {
- //fineModelLevel不用这个因为可能有楼梯
- var groundY_ = groundY;
- {
- var samplers = [];
- traverse(info, function (e) {
- if (!e.btmPos) return;
- samplers.push(e.btmPos.y);
- });
- groundY_ = samplers.reduce(function (w, y) {
- return w += y;
- }, 0);
- groundY_ /= samplers.length; //平均值
- }
- position = center.clone().setY(groundY_ + info.size.y / 2); //使着地
- }
- return position;
- };
- var boxGeo = new THREE.BoxBufferGeometry();
- var boxMat = new THREE.MeshBasicMaterial({
- color: colors.yellow,
- opacity: 0.3,
- transparent: true,
- depthTest: !!shelterByModel
- });
- 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)];
- var traverse = function traverse(info, fun) {
- //忽略.infos的row 的信息
- fun(info);
- info.list && info.list.forEach(function (a) {
- return traverse(a, fun);
- });
- info.mixedFrom && info.mixedFrom.forEach(function (a) {
- return traverse(a, fun);
- });
- };
- var Box = /*#__PURE__*/function () {
- //结果
- function Box(info) {
- _classCallCheck(this, Box);
- //preDealBox(info)
- this.setFromInfo(info);
- this.buildFromData || (this.name = this.boxType + '-' + this.name);
- if ((this.buildFromData || boundConfirmed)) this.draw();
- boxesSolid.push(this);
- }
- _createClass(Box, [{
- key: "setFromInfo",
- value: function setFromInfo(info) {
- for (var i in info) {
- this[i] = info[i];
- }
- /* let h = info.size.y
- let standardH = standards[info.boxType].height.standard
- if (h > standardH) {
- h = standardH + Math.log(1 + (h - standardH) / 2) //Math.log2: 以2为底的对数 ,Math.log:自然对数
- info.size.y = h
- } */
- this.position = this.buildFromData ? this.center : getBoxFinalPos(this);
- var bound = new THREE.Box3().setFromCenterAndSize(this.position, this.size);
- this.bound = bound;
- }
- }, {
- key: "draw",
- value: function draw() {
- var color = colors.yellow; //green //new THREE.Color().setHSL(hue, 0.9, 0.85)
- this.boxHelper = new THREE.Box3Helper(this.bound, color);
- (this.boxHelper.material.depthTest = false); //this.boxHelper.material.opacity = 0.5
- this.boxHelper.material.transparent = true;
- this.boxHelper.renderOrder = 10;
- /* let { warnStr, exStr } = this
- warnStr && (exStr += `【${warnStr}】`) */
- //this.label = addLabel(this.position, /* exStr ? [this.name, exStr] : */ this.score ? [this.name, this.score.toFixed(1)] : this.name, { bgcolor: color })
- this.label = new TextSprite({
- text: (player$c.$app.config.lang == 'zh' ? getChName$1[this.boxType] : typeNames[this.boxType]) + '-' + (boxesSolid.length + 1),
- //this.external ? [this.external.eqpName || '', this.external.eqpType || ''] : this.name,
- backgroundColor: Object.assign(colors.labelYellow
- /* labelGreen */
- ),
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- borderRadius: 15,
- renderOrder: 10,
- fontSize: 20,
- player: player$c,
- sizeInfo: {
- minSize: 50,
- maxSize: 200,
- nearBound: 1,
- farBound: 20
- }
- });
- meshGroup.add(this.label);
- this.label.position.copy(this.position);
- this.label.position.y += 0.3;
- var s = 0.2;
- this.label.scale.set(s, s, s);
- var box = new THREE.Mesh(boxGeo, boxMat);
- box.position.copy(this.position);
- box.scale.copy(this.size);
- box.masterBox = this;
- box.name = this.name;
- box.renderOrder = 20;
- meshGroup.add(box);
- this.boxMesh = box;
- meshGroup.add(this.boxHelper);
- isDiwei && this.updateVisible(false, 'unhover');
- }
- }, {
- key: "updateVisible",
- value: function updateVisible(show, reason) {
- common$1.updateVisible(this.boxHelper, reason, show);
- common$1.updateVisible(this.label, reason, show);
- common$1.updateVisible(this.boxMesh, reason, show);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var index = boxesSolid.indexOf(this);
- if (index > -1) {
- boxesSolid.splice(index, 1);
- if (boundConfirmed) {
- if (isLocalTest) {
- this.label.sprite.material.opacity = 0.3;
- this.boxHelper.material.opacity = 0.2;
- } else {
- this.boxHelper.removeFromParent();
- this.label.removeFromParent();
- }
- this.boxMesh.removeFromParent();
- }
- }
- }
- }, {
- key: "traversePair",
- value: function traversePair(fun) {
- traverse(this, fun);
- }
- }, {
- key: "getDirection",
- value: function getDirection() {
- //获得正面朝向。 需要全部box都创建完再调用
- var xProp = this.xProp;
- var dir; //哪边pano多朝哪边
- if (this.boxType == 'cabinet' && this.name.includes('row')) {
- if (this.infos.rowboxs.length > 1) {
- var k = this.infos.reduce(function (w, c) {
- return w + c.k;
- }, 0);
- xProp = k > 1 ? 'width' : 'thick';
- } else {
- //直接使用别的多box的row的方向 ,大多数都相同(会有例外,无所谓了)
- var rows = boxesSolid.filter(function (e) {
- return e.boxType == 'cabinet' && e.name.includes('row') && e.dirQua;
- });
- rows.sort(function (a, b) {
- return b.infos.rowboxs.length - a.infos.rowboxs.length;
- });
- var box = rows[0];
- if (box) {
- return this.dirQua = box.dirQua;
- }
- }
- }
- if (!xProp) {
- //根据房间的长宽 散落的cabinet。 fire monitor
- var _getBoxDirProp = getBoxDirProp();
- _getBoxDirProp.xWidthPossible;
- _getBoxDirProp.yWidthPossible;
- xProp = this.xProp;
- /* if(Math.abs(xWidthPossible - yWidthPossible) < 0.3){
- let size = new THREE.Vector3()
- safeBound.getSize(size)
-
- xWidthPossible += (size.x - size.z) * 0.5
-
- if(xWidthPossible > yWidthPossible){
- xProp = 'width'
- }
- } */
- }
- if (xProp) {
- if (!this.panosDir) getPanosDir(this);
- if (xProp == 'width') {
- if (Math.abs(this.panosDir['z+']) < Math.abs(this.panosDir['z-'])) {
- //朝-z//也就是新坐标系的y
- //this.dirQua='下'
- dir = new THREE.Vector3(0, 1, 0);
- } else {
- //朝+z
- //this.dirQua='上'
- dir = new THREE.Vector3(0, -1, 0);
- }
- } else {
- if (Math.abs(this.panosDir['x+']) < Math.abs(this.panosDir['x-'])) {
- //朝-x
- //this.dirQua='右'
- dir = new THREE.Vector3(-1, 0, 0);
- } else {
- //朝+x
- //this.dirQua='左'
- dir = new THREE.Vector3(1, 0, 0);
- }
- }
- } //addLabel(this.position, this.dirQua)
- this.dirQua = convertTool.getQuaByAim(dir, new THREE.Vector3(), new THREE.Vector3(0, 0, 1));
- return this.dirQua;
- /*飞到俯视图查看(不旋转视图,x朝右,z朝下)。以下四个qua是四个墙壁每个墙壁上的dirQua。
- _x: 0, _y: -0, _z: 1, _w: 0
- _x: 0, _y: 0, _z: -0.707, _w: 0.707 _x: 0, _y: -0, _z: 0.707, _w: 0.707
- x: 0, _y: 0, _z: 0, _w: 1
-
- */
- }
- }, {
- key: "toJson",
- value: function toJson() {
- var _this = this;
- //转出的坐标系是z朝上的
- var category = typeNames[this.boxType];
- if (category instanceof Array) {
- var scoreMap = new Map();
- category = category.slice(0);
- category.forEach(function (e) {
- return scoreMap.set(e, 0);
- }); //初始化
- //判断boxType: 寻找所使用的box总分最高的boxType
- var add = function add(box) {
- if (!box) return;
- var score = scoreMap.get(box.category) + box.score;
- scoreMap.set(box.category, score);
- };
- this.traversePair(function (e) {
- add(e.box0);
- add(e.box1);
- });
- category = category.sort(function (a, b) {
- return scoreMap.get(b) - scoreMap.get(a);
- });
- category = category[0]; //最高分
- }
- this.getDirection();
- var json = {
- points: axises.map(function (axis) {
- return math$2.toPrecision(convert.invertVisionVector(new THREE.Vector3().addVectors(_this.position, _this.size.clone().multiply(axis).multiplyScalar(0.5))).toArray(), 4);
- }),
- category,
- type: this.boxType,
- sid: this.name,
- quaternion: this.dirQua.toArray()
- };
- return json;
- }
- }, {
- key: "getClosetPano",
- value: function getClosetPano() {
- var _this2 = this;
- if (this.closetPano) return this.closetPano;
- this.visiPanos = player$c.model.panos.list.filter(function (pano) {
- if (global$1.aiBox.visiInfos[pano.id]) return global$1.aiBox.visiInfos[pano.id].includes(_this2);else return _this2.cptVisiAtPano(pano);
- });
- var bestDisSquared = this.size.length();
- var nearestPanos = common$1.sortByScore(this.visiPanos, [Panorama.filters.isPanoAligned()], [function (pano) {
- return -Math.abs(bestDisSquared - _this2.position.distanceToSquared(pano.position));
- }]).map(function (e) {
- return e.item;
- });
- this.closetPano = nearestPanos[0];
- if (!this.closetPano) {
- this.traversePair(function (e) {
- var _e$box;
- if (!_this2.closetPano) _this2.closetPano = (_e$box = e.box0) === null || _e$box === void 0 ? void 0 : _e$box.pano;
- });
- console.log('box没找到可见的closetPano,使用了自身的一个pano', this.closetPano.id); //加入可见列表:
- if (global$1.aiBox.visiInfos[this.closetPano.id]) global$1.aiBox.visiInfos[this.closetPano.id].push(this);else this.visiPanos.push(this.closetPano);
- }
- return this.closetPano;
- }
- }, {
- key: "cptVisiAtPano",
- value: function cptVisiAtPano(pano) {
- var _this3 = this;
- if (pano.id == 6
- /* this.label.text[0].includes('8') */
- ) {
- console.log(1);
- }
- var bound = this.bound;
- var ifNoShelterByBox = function ifNoShelterByBox() {
- 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));
- var standInBox = box2.containsPoint(new THREE.Vector2(pano.position.x, pano.position.z));
- 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) {
- var faceCenter = new THREE.Vector3().addVectors(_this3.position, dir); //在box前后左右上 面上的中心点
- var camDir = new THREE.Vector3().subVectors(faceCenter, pano.position).normalize();
- if (!standInBox) {
- if (camDir.dot(dir) >= 0) return false; //在背面
- }
- ray.set(pano.position, camDir);
- var far = pano.position.distanceTo(faceCenter);
- ray.far = far;
- var o = ray.intersectObjects(global$1.aiBox.boxesSolid.filter(function (e) {
- return e != _this3;
- }).map(function (e) {
- return e.boxMesh;
- })); //加了个true遍历子集//ray.ray.intersectsBox(box2.bound)
- return !(o && o.length);
- });
- };
- var ifNoShelterByWall = function ifNoShelterByWall() {
- 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)];
- var noIntersect = boundPoints.some(function (p) {
- var intersect = convertTool.ifIntersectChunks(pano.position, p, player$c.model, {
- extLen: 0
- });
- return !intersect;
- });
- if (noIntersect) {
- var _player$$app$store$ge;
- //模型墙面缺失时用cad代替
- 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;
- var curFloorJson = floors === null || floors === void 0 ? void 0 : floors.find(function (floorData0, index) {
- //参见labelManager
- index = player$c.model.floors.list.length > 1 ? floorData0.subgroup != void 0 ? floorData0.subgroup : floorData0.id : index; //旧版单层model的id和json不对应,使用model的
- return index == pano.floorIndex;
- });
- if (curFloorJson) {
- noIntersect = boundPoints.slice(0, 4).some(function (p) {
- return !player$c.labelManager.isShelter(curFloorJson, p, pano.position, false, true);
- });
- }
- }
- return noIntersect;
- };
- return ifNoShelterByBox() && ifNoShelterByWall();
- }
- }]);
- return Box;
- }(); // 2d坐标转3d坐标
- var getDirByUV$1 = function getDirByUV(uv, pano) {
- // 计算方向向量
- var yaw = -uv.x * (Math.PI * 2);
- var pitch = Math.PI / 2 - uv.y * Math.PI;
- var dir = new THREE.Vector3();
- dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
- return dir;
- };
- var getCenterDir$1 = function getCenterDir(box) {
- if (box.centerDir) return; //假设不存在在box中间拍摄的情况,所以y不会横跨两边
- var bbox = box.bbox2;
- var center = {
- x: getBbox2center$1(bbox[0], bbox[2]),
- y: (bbox[1] + bbox[3]) / 2
- };
- box.bbox2CenterX = center.x;
- var dir = getDirByUV$1(center, box.pano);
- box.centerDir = dir;
- var centerTop = {
- x: center.x,
- y: bbox[1]
- };
- box.centerTopDir = getDirByUV$1(centerTop, box.pano);
- var centerBtm = {
- x: center.x,
- y: bbox[3]
- };
- box.centerBtmDir = getDirByUV$1(centerBtm, box.pano);
- var leftBtm = {
- x: bbox[0],
- y: bbox[3]
- };
- box.leftBtmDir = getDirByUV$1(leftBtm, box.pano);
- var rightBtm = {
- x: bbox[2],
- y: bbox[3]
- };
- box.rightBtmDir = getDirByUV$1(rightBtm, box.pano);
- };
- var getOtherPos = function getOtherPos(box) {
- if (!box.boxType) return;
- var config = standards[box.boxType];
- if (!boundConfirmed) {
- if (!config.bottom) {
- ray.set(box.pano.position, box.centerBtmDir);
- box.btmPosPredict = ray.ray.intersectPlane(groundPlane, new THREE.Vector3()); //没有的话就在空中 (部分air-hanging也会有)。 fire的这个值会较大误差,因为groundY还不确定,但不影响,因只用它射线交点的位置。
- if (box.btmPosPredict) {
- var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
- var _standards$box$boxTyp = standards[box.boxType].widthNormal,
- min = _standards$box$boxTyp.min,
- max = _standards$box$boxTyp.max;
- min = min * 0.4;
- max = max * 0.4;
- var minA = Math.min(Math.abs(dir2d.x), Math.abs(dir2d.y));
- var depth = math$2.linearClamp(minA, 0, 1, min, max);
- /* const depth = box.category == typeNames.cabinet ? 0.5 : 0.4
- */
- dir2d = dir2d.clone().multiplyScalar(depth);
- box.btmPosPredict.x += dir2d.x;
- box.btmPosPredict.z += dir2d.y; //addLabel(box.btmPosPredict,'b_'+box.category+"_"+box.sid, {bgcolor:'#6ff',a:0.1})
- //box.btmPosPredict.clamp(safeBound.min, safeBound.max)
- }
- }
- return;
- }
- if (!box.posAtWall && config.atWall > 0) {
- //console.log(box.sid, 'getPosWall')
- var shrink = config.thick ? (config.thick.min + config.thick.max) / 2 : config.widthNormal.min; //尽量多shrink些,box别到墙另一边去,用于中和相交得到的center
- ray.set(box.pano.position, box.centerDir);
- var o = ray.intersectObjects(player$c.model.colliders );
- if (o[0] && config.atWall > 0.6) {
- box.posAtWall = new THREE.Vector3().addVectors(box.pano.position, box.centerDir.clone().multiplyScalar(o[0].distance - shrink));
- {
- var _o$0$face$normal;
- 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);
- if (nor) {
- if (Math.abs(nor.z) > 0.8) {
- box.xProp = 'width', box.yProp = 'thick';
- } else if (Math.abs(nor.x) > 0.8) {
- box.xProp = 'thick', box.yProp = 'width';
- }
- }
- }
- } //因墙壁不准确,所以还是尽量不用墙的位置
- /* if(box.btmPos){
- let wallRatio = 0.5;
- if(new THREE.Vector3().subVectors(box.btmPos, box.posAtWall).setY(0).length() > 1 )wallRatio = 0.2 //可能墙壁位置不准,靠后了
- box.predictCenter = new THREE.Vector3().addVectors(box.btmPos.clone().multiplyScalar(1-wallRatio), box.posAtWall.clone().multiplyScalar(wallRatio))
- //box.predictCenter = new THREE.Vector3().addVectors(box.posAtWall, box.btmPos).multiplyScalar(0.5) //也许能当中心点? 虽然y会低一些
- addLabel(box.predictCenter, box.sid+'-preC')
- } */
- }
- if (!box.btmPos) {
- getBoxBtm(box);
- }
- if (!box.topPos) {
- getBoxTop(box);
- }
- };
- var getUVs$1 = function getUVs(box, imageWidth, imageHeight) {
- if (box.bbox2) return;
- if (!imageWidth) {
- imageWidth = global$1.aiBox.datas[box.pano.id].imageWidth;
- imageHeight = global$1.aiBox.datas[box.pano.id].imageHeight;
- }
- if (imageWidth != imageWidth || imageHeight != imageHeight) {
- console.log(imageWidth, imageHeight);
- }
- box.bbox2 = box.bbox.map(function (e, i) {
- //(x1,y1,x2,y2)
- return i % 2 == 0 ? e / imageWidth
- /* + 0.25 */
- : e / imageHeight;
- });
- };
- var getBoxBase = function getBoxBase(box, imageWidth, imageHeight) {
- getBoxType(box);
- getUVs$1(box, imageWidth, imageHeight);
- getCenterDir$1(box);
- getOtherPos(box);
- };
- var getBbox2Diff = function getBbox2Diff(x1, x2) {
- //获取x1-x2,如果x1在x2右边则为正
- if (Math.abs(x1 - x2) < 0.5) return x1 - x2;else {
- if (x1 > x2) x1 -= 1;else x2 -= 1;
- return x1 - x2;
- }
- };
- var getBbox2center$1 = function getBbox2center(x1, x2) {
- //找中间位置
- if (Math.abs(x1 - x2) > 0.5) {
- //永远找小于180度的那一边
- return (x1 + x2 + 1) / 2; //另外半边
- } else {
- return (x1 + x2) / 2;
- }
- };
- var getBoxTop = function getBoxTop(info) {
- /* if(info.sid == 'pano0-11(mix4,8)'){
- console.log(5)
- } */
- if (info.box1) {
- var o2 = getIntersect2(info.box0.pano.position, info.box0.centerTopDir, info.box1.pano.position, info.box1.centerTopDir);
- info.topPos = o2.pos3d;
- info.diffHeight = o2.mid2 ? o2.mid2.distanceTo(o2.mid1) : 1;
- if (info.box0.topPos && info.box1.topPos) {
- info.topPos.y = (info.box0.topPos.y + info.box1.topPos.y) / 2; //原先的不准
- }
- } else {
- //取btm上方对应的位置 ( 因为和skybox的交点会因离墙远而偏上或偏下)
- var box = info.box0 || info;
- var btm = box.btmPos;
- if (!btm) {
- btm = getBoxBtm(info);
- }
- box.topPos = btm.clone(); //xz同btm,要求y
- var xDelta = btm.x - box.pano.position.x;
- var zDelta = btm.z - box.pano.position.z;
- var yDelta; //因为pano有旋转所以btm和top的xz其实是不一样的,所以会有误差。 故这里选择delta较大的
- if (Math.abs(xDelta) < Math.abs(zDelta)) {
- yDelta = zDelta * box.centerTopDir.y / box.centerTopDir.z;
- /* console.log('use z', box)
- if(Math.abs(xDelta)<0.1)console.error('!!!!!!!!!!!!!!!!!!!!!!! xDelta',xDelta, box.sid ) */
- } else {
- yDelta = xDelta * box.centerTopDir.y / box.centerTopDir.x; // console.log('use x', box)
- }
- box.topPos.y = yDelta + box.pano.position.y;
- var minHeight =
- /* info.boxType ? standards[info.boxType].height.min : box.category == typeNames.air ? 0.5 : */
- standards[getBoxType(box)].height.min;
- var diffH = Math.max(box.topPos.y - btm.y, minHeight);
- box.topPos.y = btm.y + diffH;
- info.topPos = box.topPos;
- /* if (box.sid == 'pano2-1') {
- addLabel(box.topPos,'t_'+box.sid,{bgcolor:'#ff4399'})
- addLine(box.pano.position,box.centerTopDir, 20)
- } */
- }
- return info.topPos;
- };
- var getBoxBtm = function getBoxBtm(info) {
- if (info.box1) {
- {
- info.btmPos = new THREE.Vector3().addVectors(info.box0.btmPos, info.box1.btmPos).multiplyScalar(0.5);
- }
- } else {
- var box = info.box0 || info;
- if (!box.btmPos) {
- if (box.sid == 'pano23-0') {
- console.log(3);
- addLine(box.pano.position, box.centerBtmDir);
- }
- if (!boundConfirmed) {
- return box.btmPosPredict;
- }
- var dirs = [box.centerBtmDir];
- dirs.push(box.leftBtmDir, box.rightBtmDir);
- var model = player$c.model.colliders.concat([skyboxTight]) ;
- var minY = Infinity;
- dirs.forEach(function (dir, i) {
- ray.set(box.pano.position, dir);
- var o = ray.intersectObjects(model); // //如果skybound有问题,位置就会错
- if (i == 0) {
- box.btmPosOri = o[0].point.clone();
- }
- minY = Math.min(o[0].point.y, minY); //类似vr校准地面,取最低就行。为了防止某个方向被家具遮挡
- });
- if (box.btmPosOri.y - minY > 0.01) {
- //如果中心线没有intersect到地板,而到其他家具上了
- var O = box.pano.position;
- var r = (O.y - minY) / (O.y - box.btmPosOri.y);
- var OA = new THREE.Vector3().subVectors(box.btmPosOri, O);
- var OP = OA.multiplyScalar(r); //延长到地板
- box.btmPosOri = new THREE.Vector3().addVectors(O, OP); //新终点
- }
- box.btmPosOri.y = minY; //边缘位置
- //如果三个点都不在地板怎么办?
- box.pose = getBoxPoseByPos(box, box.btmPosOri); //立即用边缘位置获取方向
- var depth = 0; //缩进 //let depth = Math.abs(o[0].face.normal.y) > 0.9 ? 0.4 : -0.4
- getBoxType(box);
- var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
- var shrinkVec;
- if (standards[box.boxType].thick && (box.pose.predict)) {
- //平贴于墙上,且厚度和宽度相差较大
- //注:air-hanging主要用的是posAtWall
- /* if(box.sid.includes('pano4-0') ){
- console.log(1)
- } */
- var _standards$box$boxTyp2 = standards[box.boxType].widthNormal,
- min = _standards$box$boxTyp2.min,
- max = _standards$box$boxTyp2.max;
- min = min * 0.24;
- max = max * 0.4;
- if (box.pose.predict && !box.xProp) {
- box.xProp = box.pose.predict.x >= box.pose.predict.y ? 'width' : 'thick';
- box.yProp = box.pose.predict.x < box.pose.predict.y ? 'width' : 'thick';
- } else {
- if (!box.xProp) ;
- }
- if (box.xProp) {
- if (box.xProp == 'width') {
- depth = math$2.linearClamp(Math.abs(dir2d.x), 0, 1, min, max);
- } else {
- depth = math$2.linearClamp(Math.abs(dir2d.y), 0, 1, min, max);
- }
- }
- } else {
- var w = standards[box.boxType].thick || standards[box.boxType].widthNormal;
- var w0 = (w.min + w.max) / 2;
- var _min = w0 * 0.5,
- _max = w0 * 0.8;
- var minA = Math.min(Math.abs(box.centerBtmDir.x), Math.abs(box.centerBtmDir.z));
- depth = math$2.linearClamp(minA, 0, 0.707, _min
- /* 0.3 */
- , _max
- /* 0.5 */
- ); //在45度时需要最长的距离。主要针对cabinet
- }
- /* if (Math.abs(o[0].face.normal.y) < 0.9) {
- if (standards[box.boxType].atWall || minY - groundY > 0.3) {
- //battery的识别框比较乱,有可能一个电池被识别出好几个,所以
- depth *= -1 //at wall
- }
- } */
- if (!shrinkVec) {
- shrinkVec = dir2d.clone().multiplyScalar(depth);
- }
- box.btmPos = box.btmPosOri.clone();
- box.btmPos.x += shrinkVec.x;
- box.btmPos.z += shrinkVec.y; //addLabel(box.btmPos,'b_'+box.sid,{bgcolor:'#ff4399'})
- }
- info.btmPos = box.btmPos;
- }
- return info.btmPos;
- };
- var getIntersect2 = function getIntersect2(pano0Pos, dir0, pano1Pos, dir1) {
- var pos0 = new THREE.Vector3().addVectors(pano0Pos, dir0);
- var pos1 = new THREE.Vector3().addVectors(pano1Pos, dir1);
- var o = math$2.getLineIntersect2({
- A: pano0Pos.clone(),
- B: pano1Pos.clone(),
- p1: pos0,
- p2: pos1,
- dir0,
- dir1
- }); //不用getLineIntersect,因为这个针对热点写的,当无交点时选用的点不是想要的
- if (!o.pos3d) {
- console.error('getIntersect2 no result? ?');
- }
- return o;
- };
- var getBoxPos = function getBoxPos(info) {
- var boxType = getBoxType(info);
- var pos = info.preDealRes && info.preDealRes.position || info.center;
- if (!pos && boxType) {
- info.category && getOtherPos(info);
- if (standards[boxType].atWall > 0.5 && standards[boxType].bottom) {
- pos = info.posAtWall;
- }
- if (!pos) {
- pos = info.btmPos || info.btmPosPredict || info.posAtWall;
- }
- }
- /* if(!pos) {
- console.log('getBoxPos failed ',info)
- } */
- return pos;
- };
- var isType = function isType(category, type) {
- return type == category || typeNames[type] instanceof Array ? typeNames[type].includes(category) : typeNames[type] == category;
- };
- var getBoxType = function getBoxType(info) {
- if (info.boxType) return info.boxType;
- var category = info.category || info.box0.category;
- if (category == 'rowBigBox') info.boxType = 'rowBigBox';else {
- var type;
- if (category == 'ac_switchboard') {
- console.log(1);
- }
- for (var i in typeNames) {
- /* if (i == category || typeNames[i] instanceof Array ? typeNames[i].includes(category) : typeNames[i] == category) {
- type = i
- break //type = typeNamesReverse[type]
- } */
- if (isType(category, i)) {
- type = i;
- break;
- }
- }
- /* if(type == 'ac' || type == 'dc'){
- type = 'electric' //合并
- } */
- info.boxType = type;
- }
- return info.boxType;
- };
- /* let getBoxType = info => {
- let type = info.category || info.box0.category
-
- if (type == 'air') {
- let btm = info.btmPos || info.btmPos //btmPosAtWall
- if (!btm) {
- btm = getBoxBtm(info)
- }
- if (!btm) return
- let center = info.posAtWall || (info.preDealRes && info.preDealRes.position) || info.center
- const s = standards['air-hanging']
- if (btm.y - groundY > s.bottom.min) {
- let h0 = btm.y - groundY
- let h1 = (modelBound.max.y - center.y) / (modelBound.max.y - modelBound.min.y)
- let h2 = center.y - btm.y
- let score = h0 * 2 - h1 * 3 - h2 * 3
- if (score > 0) {
- type = 'air-hanging'
- }
- //console.error( score, h0,h1,h2, info.sid||info.name)
- } //注意:如果air被遮住底部,露出的部分只有一点,还是有可能被识别成air-hanging。只能希望
- //console.error( type, info.sid||info.name)
- }
- if (info.box0) {
- info.boxType = type
- //info.box1 && (info.box1.type = type) //因为box0和box1不一定匹配,所以不能直接赋值
- } else {
- info.type = type
- }
- } */
- var getPanosDir = function getPanosDir(info, center) {
- center = center || getBoxPos(info);
- var dirs = {
- 'x+': 0,
- 'x-': 0,
- 'z+': 0,
- 'z-': 0,
- got: false
- };
- var getDirs = function getDirs() {
- //靠墙的在它到墙之间是不会有漫游点的
- if (dirs.got || !center) return;
- player$c.model.panos.list.forEach(function (pano) {
- var dir = new THREE.Vector3().subVectors(pano.position, center);
- if (dir.x > 0) {
- dirs['x+'] += dir.x;
- } else {
- dirs['x-'] += dir.x;
- }
- if (dir.z > 0) {
- dirs['z+'] += dir.z;
- } else {
- dirs['z-'] += dir.z;
- }
- });
- dirs.got = true;
- };
- getDirs();
- if (info.panosDir) {
- console.error('already has dir');
- }
- info.panosDir = dirs;
- return dirs;
- };
- var getBoxDirProp = function getBoxDirProp(info, force) {
- return;
- };
- var preDealBox = function preDealBox(matchInfo) {
- if (matchInfo.preDealRes || !matchInfo.center) return;
- matchInfo.preDealRes = {};
- matchInfo.boxType || getBoxType(matchInfo);
- var config = standards[matchInfo.boxType];
- config.widthNormal.min;
- var needGetPose;
- var dis = safeBound.distanceToPoint(matchInfo.center);
- if (matchInfo.name == 'pano2-5') {
- console.log(4);
- }
- if (dis > 0.3 && !config.tiny && !config.tinyXZ) {
- //Tmo1vLp9Q13: hlkcWindow超出才准确
- //tiny的位置优先级高于bound,因为他们可以确定bound
- /* matchInfo.str && matchInfo.str.includes('outsideBound') */
- //const shrink = minWidth * 0.85
- //addLabel(matchInfo.center, '原')
- var finalPos = matchInfo.center.clone().clamp(safeBound.min, safeBound.max);
- matchInfo.preDealRes.position = finalPos; //addLabel(finalPos, 'finalPos')
- getBoxType(matchInfo);
- needGetPose = true;
- }
- var center = getBoxPos(matchInfo);
- if (needGetPose || !matchInfo.boxposes) {
- matchInfo.boxposes = [];
- [matchInfo.box0, matchInfo.box1].forEach(function (box) {
- box && matchInfo.boxposes.push(getBoxPoseByPos(box, center));
- });
- } //-----------------
- };
- var getBoxPoseByPos = function getBoxPoseByPos(box, centerPos) {
- var addDis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- //当得知box的大概位置时,求box在这个角度上的宽度、朝向
- //在这个方向看的box的宽度
- var config = standards[box.boxType];
- var angle = getBbox2Diff(box.bbox2[2], box.bbox2[0]) * Math.PI; //角度的一半
- var dis = new THREE.Vector3().subVectors(box.pano.position, centerPos).setY(0).length() + addDis;
- var projectWidth = 2 * Math.tan(angle) * dis; //投影宽度 (准确的投影宽度无法求得,只能近似)
- var camDir =
- /* new THREE.Vector2(centerPos.x-box.pano.position.x, centerPos.z-box.pano.position.z).normalize() */
- box.centerDir.clone().setY(0).normalize();
- var camTangent = math$2.getNormal({
- points: [{
- x: 0,
- y: 0
- },
- /* camDir */
- {
- x: camDir.x,
- y: camDir.z
- }]
- }); //视线切线方向
- camTangent.x = Math.abs(camTangent.x);
- camTangent.y = Math.abs(camTangent.y);
- if (box.sid == 'pano27-0') {
- console.log(7);
- }
- var maxWidth = config.widthNormal.max;
- var minWidth = config.widthNormal.min;
- var minProjectWidth; //= (camTangent.x + camTangent.y) * minWidth
- var maxProjectWidth; //= (camTangent.x + camTangent.y) * maxWidth
- var maxX, maxY, minX, minY; //获取该类型standard在该角度的长宽可能范围
- var predict;
- if (!standards[box.boxType].thick) {
- minProjectWidth = (camTangent.x + camTangent.y) * minWidth;
- maxProjectWidth = (camTangent.x + camTangent.y) * maxWidth; //该角度下该类型允许的最大投影距离
- maxX = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最大值(假设y为最小值)
- maxY = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最大值(假设x为最小值)
- minX = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最小值(假设y为最大值)
- minY = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最小值(假设x为最大值)
- } else {
- var minThick_ = config.thick.min;
- var minWidth_ = config.width.min;
- var maxThick_ = config.thick.max;
- var maxWidth_ = config.width.max;
- var maxTangent = Math.max(camTangent.x, camTangent.y);
- Math.min(camTangent.x, camTangent.y);
- if (maxTangent > 0.8) {
- predict = {};
- var axiss = ['x', 'y'];
- var axis = camTangent.x > camTangent.y ? 0 : 1;
- var sideWidth = THREE.MathUtils.clamp(projectWidth, minThick_, maxWidth_); //若该边占据全部视野
- var r = (sideWidth - minThick_) / (maxWidth_ - minThick_); //占比
- //就当靠近一边,看不到另一边
- var anotherWidth = math$2.linearClamp(1 - r, 0, 1, minThick_, maxWidth_); //如果这边能确定是长还是宽,另一边也能确定(注意:长和宽的范围可能重叠)
- if (sideWidth < maxThick_ && sideWidth < minWidth_) anotherWidth = Math.max(minWidth_, anotherWidth); //确定另一边只能是长
- else if (sideWidth > minWidth_ && sideWidth > maxThick_) anotherWidth = Math.min(maxThick_, anotherWidth); //确定另一边只能是宽
- predict[axiss[axis]] = sideWidth;
- predict[axiss[(axis + 1) % 2]] = anotherWidth;
- }
- var maxProjectWidth1 = camTangent.x * maxWidth_ + camTangent.y * maxThick_;
- var maxProjectWidth2 = camTangent.x * maxThick_ + camTangent.y * maxWidth_;
- var minProjectWidth1 = camTangent.x * minWidth_ + camTangent.y * minThick_;
- var minProjectWidth2 = camTangent.x * minThick_ + camTangent.y * minWidth_;
- minProjectWidth = Math.min(minProjectWidth1, minProjectWidth2);
- maxProjectWidth = Math.max(maxProjectWidth1, maxProjectWidth2);
- (camTangent.x + camTangent.y) * maxWidth; //console.log('diffaaaaaa',maxProjectWidth,a, box.sid)
- maxX = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.y) / camTangent.x, minThick_, maxWidth_); //可得x的最大值(假设y为最小值)
- maxY = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.x) / camTangent.y, minThick_, maxWidth_); //可得y的最大值(假设x为最小值)
- minX = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.y) / camTangent.x, minThick_, maxWidth_);
- minY = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.x) / camTangent.y, minThick_, maxWidth_);
- }
- /*
- let maxX = projectWidth / camTangent.x //可得x的最大值(假设y为0)
- let maxY = projectWidth / camTangent.y //可得y的最大值(假设x为0)
- */
- //判断方向
- var o = {
- predict,
- box,
- projectWidth,
- camTangent,
- maxProjectWidth,
- minProjectWidth,
- dis,
- maxX,
- maxY,
- minX,
- minY
- };
- if (config.atWall > 0 && !fineModelLevel
- /* isType(box.category,battery) || isType(box.category,air) */
- ) {
- //为了获取朝向
- o.xWidthPossible = -Math.abs(projectWidth - camTangent.x * maxWidth - camTangent.y * minWidth);
- o.yWidthPossible = -Math.abs(projectWidth - camTangent.x * minWidth - camTangent.y * maxWidth); //在接近45度时容易不准。另外如果被遮住一部分更会错,因此尽量不让被遮住的匹配
- }
- return o;
- };
- var getPoseScore = function getPoseScore(boxposes, boxType) {
- var score = 0;
- var minDis = 1.5;
- /* if (boxposes[0].box.sid == 'pano12-13' && boxposes[1].box.sid == 'pano8-6') {
- console.log(4)
- } */
- if (boxposes.length == 2 && boxposes[0].predict && boxposes[1].predict) {
- score = Math.abs(boxposes[0].predict.x - boxposes[1].predict.x) + Math.abs(boxposes[0].predict.y - boxposes[1].predict.y);
- return -score * 100;
- }
- boxposes.forEach(function (pose) {
- //pose.lowR = pose.dis < minDis ? Math.pow(THREE.MathUtils.smoothstep(pose.dis / minDis, 0, 1),2) : 1 //太近的话误差大
- pose.lowR = pose.dis < minDis ? Math.pow(pose.dis / minDis, 1.4) : 1; //太近的话误差大
- if (pose.projectWidth > pose.maxProjectWidth) {
- score += Math.pow((pose.projectWidth / pose.maxProjectWidth - 1) * pose.lowR, 2) * 500; //超过的话数字较大所以乘的数小一些
- } else if (
- /* isSingle && */
- pose.projectWidth < pose.minProjectWidth) {
- score += Math.pow((pose.minProjectWidth / pose.projectWidth - 1) * pose.lowR, 2) * 500;
- }
- var _standards$boxType$wi = standards[boxType].widthNormal,
- min = _standards$boxType$wi.min;
- _standards$boxType$wi.max;
- if (standards[boxType].atWall == 1 && min < 0.3 || boxposes.length == 2 && boxType == 'battery') {
- var _standards$boxType$wi2 = standards[boxType].widthNormal,
- _min2 = _standards$boxType$wi2.min,
- _max2 = _standards$boxType$wi2.max; //let r = Math.max(0.001, (pose.projectWidth - min) / (max - min))
- var diff = _max2 - _min2;
- var r = math$2.linearClamp(pose.projectWidth, _min2, _min2 + diff * 0.5, 600, 0);
- score += r;
- }
- });
- score = Math.min(score, 1300); //压低一点,因为得的宽度可能不准
- if (boxposes.length == 2) {
- //每一个方向对应有四个方向(每个象限一个)看到的projectWidth应该接近。
- //先把camTangent转化为第一个象限的
- var camTangent0 = new THREE.Vector2(Math.abs(boxposes[0].camTangent.x), Math.abs(boxposes[0].camTangent.y));
- var camTangent1 = new THREE.Vector2(Math.abs(boxposes[1].camTangent.x), Math.abs(boxposes[1].camTangent.y));
- var a = camTangent0.dot(camTangent1);
- if (a > 0.8) {
- //WcLVXvmV9AU
- //0.9: 25度之内. 0.8: 36.8度之内
- var diff = Math.abs(boxposes[0].projectWidth - boxposes[1].projectWidth);
- boxposes.score2 = a * diff * 1300 * boxposes[0].lowR * boxposes[1].lowR;
- score += boxposes.score2; //console.warn('在同一个方向看到的projectWidth应该接近。 ', diff)
- }
- boxposes.camTangentCos = a;
- } //要不要加上minX等的差距?
- score = Math.min(score, 1200);
- return -score;
- };
- var getBoxSize = function getBoxSize(info) {
- if (info.size) return; //console.warn('开始算 ' + info.name)
- var exStr = '',
- warnStr = '';
- var x, y; //求对角线的向量 x>0,y>0
- //假设盒子的长宽为x,y (x>0,y>0),视线切线单位向量为(k,m),投影距离:x'k+y'm.(x'是正负x,y'是正负y)
- //由于盒子的对角线有四个可选方向,(类似四个象限) 则需要能使投影距离最长的一个对角线向量。
- //如,当k<0,m>0时,要使xk+ym 最大,必有x<0,y>0. 故 x = -x', y = y', 故 投影距离:x'k+y'm = x(-k)+ym 。
- //故无论km的符号如何,只要变为正数,再去联立方程即可得xy。(相当于切线转到第一象限)
- //注:但是因为无法获取准确的投影距离(角平分线左右两边的端点到角平分线的距离不相等,垂足也无法确定),所以所算的误差非常大。
- if (info.name == 'pano6-0&pano5-0') {
- console.log(6);
- }
- var center = getBoxPos(info);
- var oriX, oriY;
- if (info.predictSize) {
- x = oriX = info.predictSize.x, y = oriY = info.predictSize.y;
- } else {
- var getOneBoxSize = function getOneBoxSize(box) {
- var x, y;
- var widthValue = standards[info.boxType].width;
- var thickValue = standards[info.boxType].thick;
- var maxX, maxY, minX, minY;
- if (info.xProp == 'width') {
- /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max)
- y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max)
- */
- maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max); //AG0bi2fhb3 需要将得到的minX等这四项都clamp后再平均
- maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max);
- minX = THREE.MathUtils.clamp(info.boxposes[0].minX, widthValue.min, widthValue.max);
- minY = THREE.MathUtils.clamp(info.boxposes[0].minY, thickValue.min, thickValue.max);
- } else {
- /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max)
- y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max)
- */
- maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max);
- maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max);
- minX = THREE.MathUtils.clamp(info.boxposes[0].minX, thickValue.min, thickValue.max);
- minY = THREE.MathUtils.clamp(info.boxposes[0].minY, widthValue.min, widthValue.max);
- }
- x = oriX = (maxX + minX) / 2;
- y = oriY = (maxY + minY) / 2;
- return {
- x,
- y
- };
- };
- if (info.box1) {
- if (info.box0.xProp && info.box0.xProp == info.box1.xProp) {
- info.xProp = info.box0.xProp;
- info.yProp = info.box0.yProp;
- var size0 = getOneBoxSize(info.box0),
- size1 = getOneBoxSize(info.box1);
- x = (size0.x + size1.x) / 2;
- y = (size0.y + size1.y) / 2;
- } else {
- //这算的很不准,因为二维框的中心方向本就不一定指向三维的中心点
- var x1 = info.boxposes[0].camTangent.x,
- x2 = info.boxposes[1].camTangent.x,
- y1 = info.boxposes[0].camTangent.y,
- y2 = info.boxposes[1].camTangent.y,
- w1 =
- /* info.boxposes[0].projectWidth, */
- THREE.MathUtils.clamp(info.boxposes[0].projectWidth, info.boxposes[0].minProjectWidth, info.boxposes[0].maxProjectWidth * 1.1),
- //校准。如果projectwidth不准那算出来更不准. 但XswQxwmn2ZC的里侧电池是前者更准
- w2 =
- /* info.boxposes[1].projectWidth */
- THREE.MathUtils.clamp(info.boxposes[1].projectWidth, info.boxposes[1].minProjectWidth, info.boxposes[1].maxProjectWidth * 1.1); //如果识别到柜门上,(柜体被遮住了),整体中心就会在柜门上,且厚度小于真实值。
- if (x1 == 0) {
- y = w1;
- x = (w2 - y2 * y) / x2;
- } else {
- //联立方程得:
- y = (w2 - x2 / x1 * w1) / (y2 - x2 / x1 * y1);
- x = (w1 - y1 * y) / x1;
- } //console.log('xy', { x, y })
- (x < 0.3 || x > 1.4) && (exStr += ' x:' + math$2.toPrecision(x, 2));
- (y < 0.3 || y > 1.4) && (exStr += ' y:' + math$2.toPrecision(y, 2));
- if (y < 0 || x < 0) {
- //console.log('<0 ?????????')
- warnStr = x < 0 ? 'x<0!' : 'y<0!';
- }
- oriX = x, oriY = y;
- }
- } else {
- //single pano data
- //将maxX maxY 限定在标准范围内
- if (info.xProp) {
- var size = getOneBoxSize(info);
- x = size.x, y = size.y;
- } else if (info.boxposes[0].predict) {
- x = info.boxposes[0].predict.x;
- y = info.boxposes[0].predict.y;
- } else {
- //x = oriX = y = oriY = (min+max)/2
- var standard = standards[info.boxType].widthNormal;
- x = oriX = THREE.MathUtils.clamp((info.boxposes[0].maxX + info.boxposes[0].minX) / 2, standard.min, standard.max);
- y = oriY = THREE.MathUtils.clamp((info.boxposes[0].maxY + info.boxposes[0].minY) / 2, standard.min, standard.max);
- }
- } //按正常来说,得到的x,y都应>0,但是由于箱子会被遮挡,导致投影宽度比真实的小,算出的也不准,可能是负数
- //所以手动将过小的宽度矫正
- }
- /* if(info.name == "pano2-6"){
- console.log(7)
- } */
- var height;
- if (standards[info.boxType].bottom) {
- //悬挂的
- //挂式空调最好把长宽固定。 不过极少出错
- //center.y -= 0.1 //很可能过高
- height = standards[info.boxType].height.standard;
- getBoxBtm(info);
- if (height) {
- var d = center.y - info.btmPos.y;
- center.y -= THREE.MathUtils.clamp((d - height / 2) / 2, -0.1, 0.1); //如果中心点到底部的距离和height的一半不同,中心点移动差值的一半
- } else {
- var btmY = info.btmPos.y;
- height = (center.y - btmY) * 2;
- }
- } else {
- if (!info.topPos) getBoxTop(info);
- if (!info.btmPos) getBoxBtm(info);
- var groundY_ = info.btmPos.y ;
- height = info.topPos.y - groundY_;
- }
- var o = restrictSize(x, height, y, info);
- x = o.x, height = o.y, y = o.z;
- if (standards[info.boxType].widthSame) {
- x = y = (x + y) / 2;
- }
- info.size = new THREE.Vector3(x, height, y);
- info.sizeAdjust = Math.pow(Math.abs(x - oriX), 1.3) + Math.pow(Math.abs(y - oriY), 1.3); //计算得到的值和标准值之间的差距,可以反映该info的匹配分值
- if (info.sizeAdjust) info.score = (info.score || 0) - Math.min(info.sizeAdjust * 100, 400);
- info.size.oriX = oriX, info.size.oriY = oriY;
- info.exStr = exStr, info.warnStr = warnStr;
- };
- var restrictSize = function restrictSize(x, y, z, info) {
- var s;
- var xProp = info.xProp,
- yProp = info.yProp;
- if (xProp != void 0) {
- var _standards$info$boxTy = standards[info.boxType][xProp],
- min = _standards$info$boxTy.min,
- max = _standards$info$boxTy.max;
- x = THREE.MathUtils.clamp(x, min, max);
- var _standards$info$boxTy2 = standards[info.boxType][yProp],
- min = _standards$info$boxTy2.min,
- max = _standards$info$boxTy2.max;
- z = THREE.MathUtils.clamp(z, min, max);
- s = true;
- }
- if (!s) {
- var _standards$info$boxTy3 = standards[info.boxType].widthNormal,
- min = _standards$info$boxTy3.min,
- max = _standards$info$boxTy3.max;
- x = THREE.MathUtils.clamp(x, min, max);
- z = THREE.MathUtils.clamp(z, min, max);
- }
- var _standards$info$boxTy4 = standards[info.boxType].height,
- min = _standards$info$boxTy4.min,
- max = _standards$info$boxTy4.max;
- y = THREE.MathUtils.clamp(y, min, max);
- return {
- x,
- y,
- z
- };
- };
- var getMixBox = function getMixBox(box0, box1) {
- //重叠部分
- var box = new THREE.Box2();
- box.min.set(Math.max(box0.min.x, box1.min.x), Math.max(box0.min.y, box1.min.y));
- box.max.set(Math.min(box0.max.x, box1.max.x), Math.min(box0.max.y, box1.max.y));
- return box;
- };
- var getLeftRight = function getLeftRight(boxArr) {
- //获取pano的boxes中最左和最右的bbox.x
- var lefts = boxArr.map(function (e) {
- return e.bbox2[0];
- });
- var rights = boxArr.map(function (e) {
- return e.bbox2[2];
- });
- lefts.sort(function (a, b) {
- return getBbox2Diff(a, b);
- });
- rights.sort(function (a, b) {
- return getBbox2Diff(b, a);
- });
- var leftX = lefts[0]; //最左
- var rightX = rights[0]; //最右
- return {
- leftX,
- rightX
- };
- };
- global$1.searchCount1 = 0, global$1.escapeCount1 = 0;
- var searchPair = function searchPair(beginItem, group0_, group1_, parentPairs, resultPairs, evaluateFun, minScore) {
- //配对结果个数为n!,其中n是每组的元素个数。注意当n=10时,已经有40320个,非常恐怖。
- var pair = [],
- parentExit = !!parentPairs;
- var removeParent = function removeParent() {
- //元结点裂变出多个,来装新的pair
- if (parentExit) {
- var i = resultPairs.indexOf(parentPairs);
- resultPairs.splice(i, 1);
- parentExit = false;
- }
- };
- if (!parentPairs) {
- //首次
- if (group0_.length == 0 || group1_.length == 0) return; //保证第一个的个数<=第二个,否则第一组多出来的永远匹配不上
- if (group0_.length > group1_.length) {
- var t = group0_;
- group0_ = group1_;
- group1_ = t;
- }
- beginItem = group0_[0];
- var complex = Object.keys(global$1.aiBox.datas).length;
- if (complex < 10) evaluateFun = null;else minScore = math$2.linearClamp(complex, 10, 80, -4000, -500); //console.log('searchPair length',group0_.length,group1_.length)
- }
- searchCount1++;
- for (var j = 0; j < group1_.length; j++) {
- pair = [beginItem, group1_[j]]; //if(pair[0].sid == 'void' || pair[1].sid == 'void')continue
- var evaluate = void 0;
- if (evaluateFun
- /* && !(pair[0].sid == 'void' || pair[1].sid == 'void') */
- ) {
- evaluate = evaluateFun(pair[0], pair[1]);
- if (evaluate == void 0 || evaluate.score <= minScore) {
- //console.log('因为评估出匹配可能性低所以跳过',pair[0],pair[1],evaluate)
- escapeCount1++;
- continue;
- }
- }
- var newPairs = void 0; //用来存放该组pair
- if (parentPairs) {
- removeParent();
- newPairs = parentPairs.slice(0); //复制
- newPairs.push(pair);
- } else {
- newPairs = [pair]; //新的容器
- }
- resultPairs.push(newPairs);
- var newGroup0 = group0_.slice(0);
- var newGroup1 = group1_.slice(0);
- var index = newGroup0.indexOf(pair[0]);
- newGroup0.splice(index, 1);
- index = newGroup1.indexOf(pair[1]);
- newGroup1.splice(index, 1);
- if (newGroup0.length > 0 && newGroup1.length > 0) {
- searchPair(newGroup0[0], newGroup0, newGroup1, newPairs, resultPairs, evaluateFun, minScore);
- }
- }
- }; //如果第一个元素就和后面所有的都不匹配,就直接返回了怎么办?
- /*#__PURE__*/(function (_THREE$Group) {
- _inherits(PanoBoxFrame, _THREE$Group);
- var _super = _createSuper$E(PanoBoxFrame);
- function PanoBoxFrame(player_) {
- var _this4;
- var compute = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var showBox = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
- var dataList = arguments.length > 3 ? arguments[3] : undefined;
- _classCallCheck(this, PanoBoxFrame);
- _this4 = _super.call(this);
- _this4.clear();
- player$c = player_;
- player$c.model.add(_assertThisInitialized(_this4));
- if (browser$1.urlHasValue('ext')) {
- isExt = true;
- isDiwei = isExt && !browser$1.urlHasValue('ctrl');
- }
- _this4.ifAnalyze = true; //ifAnalyze
- _this4.wireframes = new THREE.Object3D();
- _this4.wireframes.name = 'wireframes';
- _this4.add(_this4.wireframes);
- _this4.matchScoreMap = {};
- _this4.bindEvents();
- meshGroup = new THREE.Object3D();
- meshGroup.name = 'testBox';
- _this4.add(meshGroup);
- _this4.visiInfos = {};
- compute && _this4.compute(dataList);
- global$1.aiBox = _assertThisInitialized(_this4);
- if (!showBox) {
- _this4.switchOnOff(false);
- }
- return _this4;
- }
- _createClass(PanoBoxFrame, [{
- key: "switchOnOff",
- value: function () {
- var _switchOnOff = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(display) {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- //开关
- console.log('switchOnOff', display);
- if (!(!this.startToCompute && display)) {
- _context.next = 4;
- break;
- }
- _context.next = 4;
- return this.compute();
- case 4:
- common$1.updateVisible(this, 'whole', display); //this.boxesSolid.forEach(e => e.updateVisible(display, 'whole'))
- case 5:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function switchOnOff(_x) {
- return _switchOnOff.apply(this, arguments);
- }
- return switchOnOff;
- }()
- /* setDisplay(visible, reason='whole', level=0){
- common.updateVisible(this, reason, visible, level)
- } */
- }, {
- key: "compute",
- value: function () {
- var _compute = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4(dataList) {
- var _this5 = this;
- var beginCompute, done, loadAll, _loadAll;
- return regenerator.wrap(function _callee4$(_context4) {
- while (1) {
- switch (_context4.prev = _context4.next) {
- case 0:
- _loadAll = function _loadAll3() {
- _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
- var _this7 = this;
- var data, aiBoxUrl, box4;
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- if (!(player$c.$app.config.deploy == 'local' && !player$c.$app.config.server)) {
- _context3.next = 7;
- break;
- }
- _context3.next = 3;
- return http.get(player$c.$app.resource.getViewResourceURL("images/ai.json?".concat(new Date().getTime())));
- case 3:
- data = _context3.sent;
- data = {
- data,
- success: true
- };
- _context3.next = 12;
- break;
- case 7:
- aiBoxUrl = '/service/shapes/sceneMarkShape/box4/getInfos';
- if (player$c.$app.config.deploy == 'local') {
- aiBoxUrl = '/service/scene/edit/ai/box4/getInfos';
- }
- _context3.next = 11;
- return http.post(aiBoxUrl, {
- num: player$c.$app.config.num,
- type: 1
- });
- case 11:
- data = _context3.sent;
- case 12:
- if (!(!data.data || !data.success)) {
- _context3.next = 14;
- break;
- }
- return _context3.abrupt("return");
- case 14:
- if (isExt) {
- (data.data.box8.dataSet.boxes || data.data.box8.dataSet).forEach(function (e) {
- // if (e.external && !e.external.show) {
- // return
- // }
- // e.external = {
- // eqpType: 'equipment_cabinet',
- // eqpName: '送变电机房BATS_1',
- // show: true,
- // eqpId: '150035210000000000125288',
- // url: 'http://120.194.14.251:40004/vr_3dWeb/deviceInfo?rackId=7a323f16-ac13-4434-bf97-c44d1783a217',
- // }
- var point1 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[0]));
- var point2 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[1]));
- var point3 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[2]));
- var point4 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[4]));
- var size = new THREE.Vector3(point1.distanceTo(point2), point1.y - point4.y, point3.distanceTo(point2));
- var center = new THREE.Vector3().addVectors(point3, point4).multiplyScalar(0.5); //对角线中点
- //可能需要考虑上rotation,现暂时不需要
- new Box({
- buildFromData: true,
- center,
- size,
- boxType: e.type,
- name: e.sid,
- external: e.external
- });
- });
- this.ifAnalyze = false; //common.updateVisible(this, '!isExt', false ) //这之前写的visible=false,忘了为啥,要的话就在开头show传false
- }
- if (!isExt || browser$1.urlHasValue('ctrl')) {
- box4 = Array.isArray(data.data) ? data.data : data.data.box4; // 兼容旧数据
- box4.forEach(function (e) {
- var panoId = e.imagePath.split('.jpg')[0];
- _this7.datas[panoId] = e;
- }); //common.updateVisible(this, '!isExt', true )
- }
- done();
- case 17:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- return _loadAll.apply(this, arguments);
- };
- loadAll = function _loadAll2() {
- return _loadAll.apply(this, arguments);
- };
- startTime = Date.now();
- this.startToCompute = true;
- this.datas = {};
- this.datasMixed = {};
- this.boxesSolid = boxesSolid;
- beginCompute = function beginCompute() {
- //获取匹配分数
- var getMatchScore = function getMatchScore(box0, box1) {
- var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- isSingle = _ref2.isSingle,
- center = _ref2.center,
- onlyGet = _ref2.onlyGet,
- dontCheckDis = _ref2.dontCheckDis;
- var name0 = box0.sid + '&' + box1.sid;
- var name1 = box1.sid + '&' + box0.sid;
- var boxType = getBoxType(box0);
- var matchInfo0 = _this5.matchScoreMap[boxType].get(name0);
- var matchInfo1 = _this5.matchScoreMap[boxType].get(name1);
- var matchInfo = matchInfo0 || matchInfo1;
- if (onlyGet) return matchInfo;
- var name;
- if (!matchInfo) {
- name = name0;
- matchInfo = {
- name,
- box0,
- box1,
- center
- };
- _this5.matchScoreMap[boxType].set(name, matchInfo);
- } else {
- return matchInfo;
- }
- if (name.includes('pano6-2&pano5-3')) {
- console.log(5);
- }
- getBoxBase(box0);
- getBoxBase(box1);
- var A = box0.pano.position.clone();
- var B = box1.pano.position.clone();
- var AB = new THREE.Vector3().subVectors(B, A);
- var AB2d = new THREE.Vector2(AB.x, AB.z).normalize();
- 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();
- 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();
- var angleA = Math.acos(AB2d.dot(AP12d));
- var angleB = Math.PI - Math.acos(AB2d.dot(BP22d));
- var score = 100,
- str = [];
- if (angleA + angleB > Math.PI + 0.2) {
- //无交点(比180大是因为中心角度有误差,所以给一定的容错)
- //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因角度大于180度 不匹配`)
- return Object.assign(matchInfo, {
- score: -5000,
- str: ['angle>180']
- });
- }
- if (box0.type != box1.type) {
- return Object.assign(matchInfo, {
- score: -5000,
- str: ['typeNotSame']
- });
- }
- if (matchInfo.dirAngleXZ == void 0) {
- matchInfo.dirAngleXZ = THREE.MathUtils.radToDeg(Math.acos(AP12d.dot(BP22d))); //需要尽量接近90度算出来的交点会比较准
- matchInfo.minAng = Math.min(180 - matchInfo.dirAngleXZ, matchInfo.dirAngleXZ); //角度小的getIntersect2容易算不准
- if (isSingle) {
- var bestDisSquared = 2; //单个匹配单个,而非多个匹配多个(没有固定到两个漫游点),所以可以直接寻找最优角度
- score += Math.sin(THREE.MathUtils.degToRad(matchInfo.dirAngleXZ)) * 300;
- score += matchInfo.dirAngleXZ; //另外角度越大越不容易偏向一边
- score -= Math.abs(getBoxPos(box0).distanceToSquared(box0.pano.position) - bestDisSquared) * 10;
- score -= Math.abs(getBoxPos(box1).distanceToSquared(box1.pano.position) - bestDisSquared) * 10;
- }
- }
- var shinkRatio = 1;
- var btmPos0 = box0.btmPos || box0.btmPosPredict; //fire类型先用btmPosPredict,测定groundY后才有btmPos
- var btmPos1 = box1.btmPos || box1.btmPosPredict;
- if (!dontCheckDis) {
- //let r = box0.boxType == 'air' ? 1 : box0.boxType == 'cabinet' ? 0.9 : 0.7 //随着宽度增加而降低
- var r = THREE.MathUtils.clamp(0.8 / standards[boxType].widthNormal.max, 0.6, 2); //随着宽度增加而降低 UWrshepp0G5的fire
- if (!standards[boxType].bottom && btmPos0 && btmPos1) {
- //注:挂空调不应使用btmPosPredict
- var d = btmPos0.distanceToSquared(btmPos1);
- matchInfo.btmPosPreDis = d;
- score -= d * 1300 * r * shinkRatio;
- if (box1.topPos) {
- var a = box0.topPos.distanceToSquared(box1.topPos);
- matchInfo.topPosPreDis = a;
- var u = a * 700 * r * shinkRatio;
- var AP0 = new THREE.Vector2(btmPos0.x - A.x, btmPos0.z - A.z).lengthSq();
- var AP1 = new THREE.Vector2(btmPos1.x - B.x, btmPos1.z - B.z).lengthSq();
- if (AP0 < 0.4 || AP1 < 0.4) u *= 0.3; //太近
- score -= u;
- }
- } else if (box0.posAtWall && box1.posAtWall) {
- //
- var _d = box0.posAtWall.distanceToSquared(box1.posAtWall);
- matchInfo.wallPosPreDis = _d;
- score -= _d * 200 * r; //墙面不准所以分低 ftMTQIrs79
- _d = box0.btmPosOri.distanceToSquared(box1.btmPosOri); //还是加一下
- matchInfo.btmPosPreDis = _d;
- score -= _d * 200 * r * shinkRatio;
- /* let h0 = box0.topPos.y - box0.btmPos.y
- let h1 = box1.topPos.y - box1.btmPos.y
- score -= Math.abs(h0-h1) * 3000 * r * shinkRatio //高度差 倾斜角度大的不准
- */
- }
- }
- if (!matchInfo.center) {
- var o = getIntersect2(A, box0.centerDir, B, box1.centerDir);
- matchInfo.center = o.pos3d.clone();
- /* let o2 = math.getLineIntersect({ A, B, p1: A.clone().add(box0.centerDir), p2:B.clone().add(box1.centerDir) })
- matchInfo.center2 = o2.pos3d.clone() */
- /* if (name == "pano16-4&pano18-5") {
- addLine(A, box0.centerBtmDir, 10), addLine(B, box1.centerBtmDir, 10)
- } */
- //验证是否漫游点到中心点的方向和centerDir一样
- var dir0 = new THREE.Vector3().subVectors(o.pos3d, A).normalize();
- var dir1 = new THREE.Vector3().subVectors(o.pos3d, B).normalize();
- var sum = dir0.dot(box0.centerDir) + dir1.dot(box1.centerDir);
- var wrongDir = sum < 1.95;
- score -= (2 - sum) * 10000;
- if (wrongDir) {
- str.push('wrongDir');
- return Object.assign(matchInfo, {
- score: score - 5000,
- str
- });
- }
- if (!dontCheckDis && !standards[boxType].bottom && box0.btmPos && box1.btmPos) {
- //墙壁位置不准所以不用 KK-ftMTQIrs79
- var p0 = new THREE.Vector2(box0.btmPos.x, box0.btmPos.z);
- var p1 = new THREE.Vector2(box1.btmPos.x, box1.btmPos.z);
- var p = new THREE.Vector2(matchInfo.center.x, matchInfo.center.z);
- var dis = p0.distanceToSquared(p) + p1.distanceToSquared(p);
- var s = math$2.linearClamp(matchInfo.minAng, 0, 20, 0, 1);
- score -= dis * 1500 * s; //如果距离较远就说明算的center误差大,不可信。可能有一个框不准确
- matchInfo.centerDrift = dis;
- }
- getBoxBtm(matchInfo);
- var cr; //getIntersect2结果的权重
- var atWall = standards[box0.boxType].atWall;
- if (atWall) {
- //fineModelLevel更多利用墙壁
- cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, Math.min(1, 0.1 / atWall));
- } else {
- if (atWall == 1) {
- cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, 1); //墙壁误差大,所以尽量完全依赖cIntersect。。。后期如果该墙壁校准了可以调整
- } else {
- cr = math$2.linearClamp(matchInfo.minAng, 2, 20, 0, 0.4);
- }
- }
- var predict0 = !standards[boxType].bottom && box0.btmPos || box0.posAtWall || matchInfo.topPos; //在墙上的除非角度小,否则不考虑cIntersect
- var predict1 = !standards[boxType].bottom && box1.btmPos || box1.posAtWall || matchInfo.topPos; //相对来说btmPos要比center准一点?因为center有在两个维度上的误差
- var btmRatio = 0.5;
- var cIntersect = new THREE.Vector3().addVectors(matchInfo.center.clone().multiplyScalar(1 - btmRatio), matchInfo.btmPos.clone().multiplyScalar(btmRatio)).setY(o.pos3d.y);
- if (predict0 && predict1) {
- matchInfo.center = new THREE.Vector3().addVectors(cIntersect.clone().multiplyScalar(cr), predict0.clone().add(predict1).multiplyScalar(1 / 2 * (1 - cr))).setY(o.pos3d.y);
- } else {
- matchInfo.center = cIntersect;
- }
- matchInfo.cIntersect = cIntersect; //addLabel(matchInfo.center, matchInfo.name + '-c')
- }
- getBoxType(matchInfo);
- /* if (matchInfo.boxType != box0.type || matchInfo.boxType != box1.type) {
- ;(score -= 1000), str.push('typeNotSame2')
- } */
- {
- var vec0 = new THREE.Vector3().subVectors(box0.pano.position, matchInfo.center);
- var vec1 = new THREE.Vector3().subVectors(box1.pano.position, matchInfo.center);
- if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0) {
- //同一个象限(center会偏向一侧)
- score -= 200;
- }
- }
- if (!safeBound.containsPoint(matchInfo.center)) {
- var _dis = safeBound.distanceToPoint(matchInfo.center) //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因中心点在bounding外不匹配`, center, 'dis: ' + dis)
- ;
- score -= 1000 * _dis * _dis, str.push('outsideBound');
- Object.assign(matchInfo, {
- score,
- str,
- center: matchInfo.center,
- disToBound: _dis
- });
- if (_dis > 0.5) return matchInfo;
- } //检查宽度
- var boxposes;
- var checkWidth = function checkWidth() {
- boxposes = [];
- [box0, box1].forEach(function (box) {
- var pose = getBoxPoseByPos(box, matchInfo.center);
- boxposes.push(pose); //如果超出标准,基本上这二者不匹配;但过小的话,有可能是被遮挡所以残缺,因此不予过滤
- });
- };
- checkWidth();
- score += getPoseScore(boxposes, boxType
- /* isSingle */
- ); //根据投影信息预测的长度再得匹配分数
- return Object.assign(matchInfo, {
- score: score,
- str,
- /* diffHalfHeight, */
- boxposes
- });
- };
- _this5.rows = {};
- /* let getchainNext = (left, end, chain, boxes) => {
- chain.push(left)
- if (left == end) return boxes.chains.push(chain)
- let nodes = boxes.relationships.filter(pair => pair.includes(left))
- let rights = nodes.map(pair => pair.find(e => e != left))
- rights = rights.filter(e => !chain.includes(e) && boxes.indexOf(e) > boxes.indexOf(left))
- rights.forEach(right => {
- getchainNext(right, end, chain.slice(), boxes)
- })
- } */
- var getPanoBigRowBox = function getPanoBigRowBox(panoBoxes) {
- var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- _ref3$reason = _ref3.reason,
- reason = _ref3$reason === void 0 ? 'row' : _ref3$reason;
- //将一个pano中的所有boxes分组,识别哪些是一排的。也可用于识别融合
- var pano = panoBoxes[0].pano;
- var category = panoBoxes[0].category;
- var type = category + '|' + reason;
- _this5.rows[type] || (_this5.rows[type] = {});
- if (_this5.rows[type][pano.id]) return _this5.rows[type][pano.id];
- var bigBoxes;
- var bigBox = {
- sid: 'pano' + pano.id + (reason == 'mix' ? '-mix' : '-row'),
- pano,
- category: reason == 'mix' ? category : 'rowBigBox',
- boxType: reason == 'mix' ? panoBoxes[0].boxType : 'rowBigBox'
- };
- var rows = [];
- for (var i = 0; i < panoBoxes.length; i++) {
- var box0 = panoBoxes[i];
- getBoxBase(box0);
- var _ref4 = [box0.bbox2[0], box0.bbox2[2]],
- left0 = _ref4[0],
- right0 = _ref4[1];
- for (var j = i + 1; j < panoBoxes.length; j++) {
- var box1 = panoBoxes[j];
- getBoxBase(box1);
- if (box0.boxType != box0.boxType) continue; //类型不同
- var _ref5 = [box1.bbox2[0], box1.bbox2[2]],
- left1 = _ref5[0],
- right1 = _ref5[1];
- var d1 = getBbox2Diff(left1, right0),
- d2 = getBbox2Diff(left1, left0),
- d3 = getBbox2Diff(left0, right1);
- if (box0.sid == 'pano2-4' && box1.sid == 'pano2-5') {
- console.log(9);
- }
- var min = reason == 'mix' ? 0.004 : 0.003; //mix代表寻找分裂的重新融合到一起
- if (d1 <= min && d2 >= min || d3 <= min && d2 <= min) {
- //边框交接
- var atEdgeMight = left1 < 0.002 && right0 > 0.998 ? [left1, right0] : left0 < 0.002 && right1 > 0.998 ? [left0, right1] : null; //有在全景图的边界的可能性
- //if (reason == 'mix' && box0.category == typeNames.cabinet && !atEdgeMight) continue //柜子容易并排,尽量不融合 //再看,啥意思,没懂
- if (reason == 'mix' && !atEdgeMight) continue; //不在边缘
- var max = standards[box0.boxType].widthNormal.max; //standards[box0.btmPos ? category : 'air-hanging'].widthNormal
- var tolerate = max * max * (reason == 'mix' ? 0.7 : 1.8); //yDCiaTQvRYn:row不能低于1.5
- var p0 = standards[box0.boxType].atWall == 1 ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri || box0.btmPosPredict : box0.btmPos;
- 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
- //let p1 = box1.type == 'air-hanging' ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri : box1.btmPos
- var dis = p0.distanceToSquared(p1);
- if (reason == 'mix') {
- var allY = box0.bbox2[3] - box0.bbox2[1] + (box1.bbox2[3] - box1.bbox2[1]); //各自高度和
- var wholeY = Math.max(box0.bbox2[3], box1.bbox2[3]) - Math.min(box0.bbox2[1], box1.bbox2[1]); //总跨越高度
- var coverY = allY - wholeY; //重合区域的y高度,可为负数
- var disY = (1 - coverY / wholeY + (wholeY - coverY) * 3) * 4 * tolerate; //既要考虑占比也要考虑差值
- dis += disY; //SGyhEzZNGP9案例:虽然是atEdge但并不应该融合,便通过disY来阻挡 ; MW6MEeCOy9Y:pano16-15
- //console.log('disY',disY, box0.sid, box1.sid )
- var atEdgePossib = atEdgeMight ? 0.002 / (atEdgeMight[0] + (1 - atEdgeMight[1])) : 0; // 两条线越接近越可能融合
- atEdgePossib = Math.min(6, atEdgePossib); //原本计算得 min:1, max:Infinity
- dis -= atEdgePossib * tolerate; //给点点优势
- }
- /* if(box0.sid == "pano2-0"){
- console.log('dis',dis,'tolerate',tolerate,[box0, box1],disY)
- }
- if (box0.sid == 'pano2-1' && box1.sid == 'pano2-4') {
- reason == 'mix' && console.log(dis, tolerate, box0.sid, box1.sid)
- }*/
- if (dis < tolerate) {
- //reason == 'mix' && console.log('-------------------')
- common$1.pushToGroupAuto([box0, box1], rows);
- }
- }
- }
- } //一排箱子的角度范围不可超过180度,因为不可能站在箱子上拍,所以超过的话肯定有边缘的不在这一排中。
- //可判断边缘箱子的是否角度偏大,一般中间的被遮挡所以偏小
- rows.forEach(function (boxes) {
- //从左到右排序
- boxes.sort(function (a, b) {
- //但因有的box跨越到别的box区域,所以这个顺序不准确
- return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
- });
- }); //去除不在一条直线上的连接. 当bound超出后就断开
- if (reason == 'row') {
- rows.slice(0).forEach(function (boxes) {
- if (boxes.length >= 2) {
- var removes = [],
- bound = new THREE.Box2(),
- size = new THREE.Vector2(),
- maxW = 0.6;
- for (var _i = 0, _j = boxes.length; _i < _j; _i++) {
- var box = boxes[_i];
- var pos2d = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
- bound.expandByPoint(pos2d);
- bound.getSize(size);
- var _min3 = Math.min(size.x, size.y);
- if (_min3 > maxW) {
- removes.push([boxes[_i], boxes[_i - 1]]);
- bound = new THREE.Box2();
- bound.expandByPoint(pos2d); //console.log('removes', size)
- } //console.log('removes',k, box1.sid)
- }
- if (removes.length) {
- /* console.log(
- '去除错误row连接',
- removes.map(e => e.map(a => a.sid))
- ) */
- var _common$disconnectGro = common$1.disconnectGroup(removes, rows);
- _common$disconnectGro.newGroups; //if(newGroups.length>1){//分裂成多组了,重新计算
- // console.log(newGroups)
- //}
- }
- }
- });
- rows.forEach(function (boxes) {
- //从左到右重新排序
- boxes.sort(function (a, b) {
- //但因有的box跨越到别的box区域,所以这个顺序不准确
- return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
- });
- });
- }
- rows.sort(function (a, b) {
- return b.length - a.length;
- }); //箱子数量从大到小排序
- bigBoxes = rows.map(function (boxes, i) {
- var _getLeftRight = getLeftRight(boxes),
- leftX = _getLeftRight.leftX,
- rightX = _getLeftRight.rightX; //最左
- var topY = boxes.slice().sort(function (a, b) {
- return a.bbox2[1] - b.bbox2[1];
- })[0].bbox2[1];
- var btmY = boxes.slice().sort(function (a, b) {
- return b.bbox2[3] - a.bbox2[3];
- })[0].bbox2[3];
- var rowBigBox = Object.assign({}, bigBox, {
- boxes,
- bbox2: [leftX, topY, rightX, btmY],
- //整排的bbox
- left: boxes.find(function (e) {
- return e.bbox2[0] == leftX;
- }),
- right: boxes.find(function (e) {
- return e.bbox2[2] == rightX;
- })
- });
- var p0 = getBoxPos(rowBigBox.left);
- var p1 = getBoxPos(rowBigBox.right);
- var vec = new THREE.Vector2(p0.x - p1.x, p0.z - p1.z);
- rowBigBox.k = Math.abs(vec.x / vec.y);
- rowBigBox.predictLen = (rowBigBox.k > 1 ? Math.abs(vec.x) : Math.abs(vec.y)) + 0.6; //加入一个宽度
- /* if(boxes.length <= boxes.relationships.length){//多条链(为了识别一个box嵌套多个的情况。不过后来在开头时处理了一部分)
- boxes.chains = []
- getchainNext(left,right,[], boxes )
-
- let aveAngle = (getBbox2Diff(left.bbox2[2], left.bbox2[0]) + getBbox2Diff(right.bbox2[2], right.bbox2[0]) ) / 2 -0.01 //首尾的angle平均数。但如果这两个不准那就导致整体出错了
- let middleAngle = getBbox2Diff(right.bbox2[0], left.bbox2[2])
- let counts = boxes.chains.map(e=>e.length)
- counts.sort((a,b)=>a-b)
- let min = counts[0],max = counts[counts.length-1]
- let r = [], cur = min;
- while(cur<=max){
- r.push({cur, diff:Math.abs((middleAngle / (cur-2) - aveAngle)}) //加 0.01是因为增加边缘
- cur++
- }
- r.sort((a,b)=>a.diff-b.diff)
- rowBigBox.predictBoxCount = r[0].cur
- //---------
-
- let goodCountChains = boxes.chains.filter(e=>e.length == rowBigBox.predictBoxCount)
- if(goodCountChains.length == 1) rowBigBox.bestChain = goodCountChains[0]
- else{
- goodCountChains = goodCountChains.map((chain,i)=>{
- let j = 1, diff=0 //中间的box的angle的方差
- while(j<rowBigBox.predictBoxCount){
- let angle = getBbox2Diff(chain[j].bbox2[2], chain[j].bbox2[0])
- diff += Math.pow(angle - aveAngle, 2)
- j++;
- }
- return {diff, chain}
- })
- goodCountChains.sort((a,b)=>a.diff-b.diff)
- rowBigBox.bestChain = goodCountChains[0].chain
- }
- console.log('getChains',boxes.chains, 'predictBoxCount',rowBigBox.predictBoxCount, r)
- } */
- return rowBigBox;
- });
- if (reason != 'mix') {
- panoBoxes.forEach(function (box) {
- //加入单个的
- if (!rows.some(function (row) {
- return row.includes(box);
- })) {
- var boxBig = Object.assign({}, bigBox, {
- bbox2: box.bbox2,
- boxes: [box],
- left: box,
- right: box
- });
- bigBoxes.push(boxBig);
- }
- });
- } //mix的之前的btm因pose错误而延伸了不对的depth所以不准
- bigBoxes.forEach(function (bigBox) {
- bigBox.sid += '-' + bigBox.boxes.map(function (e) {
- return e.index;
- }).join(',');
- /* if (bigBox.sid == 'pano0-rowBigBox-1,0,2,4') {
- console.log(3)
- } */
- if (reason == 'row') {
- //取平均值
- if (bigBox.boxes[0].btmPos) {
- bigBox.btmPos = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.btmPos);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length); //addLabel(bigBox.btmPos,'b_'+bigBox.sid, {bgcolor:'#f93',a:0.4})
- }
- if (bigBox.boxes[0].topPos) {
- bigBox.topPos = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.topPos);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
- }
- if (bigBox.boxes[0].posAtWall) {
- bigBox.posAtWall = bigBox.boxes.reduce(function (w, c) {
- return w.add(c.posAtWall);
- }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
- }
- } //mix的需要合并后计算才准确
- });
- _this5.rows[type][pano.id] = bigBoxes; //当前pano的所有row
- return bigBoxes;
- };
- /* let getPanoBoxAngleTrend = rowBox => {
- //顺时针方向该pano的box角度范围是越来越大还是越来越小
- let diffs = []
- let angles = rowBox.boxes.map(box => getBbox2Diff(box.bbox2[2], box.bbox2[0]))
- for (let i = 0, j = angles.length; i < j - 1; i++) {
- //得所有相邻之间的差
- let a0 = angles[i],
- a1 = angles[i + 1]
- diffs.push(a1 - a0)
- }
- diffs.sort((a, b) => a - b)
- return diffs[Math.floor(diffs.length / 2)] //中位数
- } */
- /* let getBoxCount = (rowBigBox)=>{
- return rowBigBox.predictBoxCount || rowBigBox.boxes.length
- } */
- var getReverseInfo = function getReverseInfo(rowBigBox0, rowBigBox1) {
- //两个row的方向对应
- var reversed = false;
- var lefts = [rowBigBox0.left, rowBigBox1.left];
- var rights = [rowBigBox0.right, rowBigBox1.right];
- var dis0 = lefts[0].btmPos.distanceToSquared(lefts[1].btmPos);
- var dis1 = rights[0].btmPos.distanceToSquared(rights[1].btmPos);
- var dis2 = lefts[0].btmPos.distanceToSquared(rights[1].btmPos);
- var dis3 = rights[0].btmPos.distanceToSquared(lefts[1].btmPos);
- var posLeft2, posRight2;
- if (dis0 + dis1 > dis2 + dis3) {
- //距离近的代表是同一端
- reversed = true;
- posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
- posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
- } else {
- posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
- posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
- }
- var vec = new THREE.Vector2(posLeft2.x - posRight2.x, posLeft2.z - posRight2.z);
- var k = Math.abs(vec.x / vec.y); //这个算斜率更准,但位置容易偏向一侧(可能用边缘的bbox算会好些?)
- return {
- reversed,
- k
- };
- };
- var searchByRow = function searchByRow(groups, datas) {
- //先查找row,匹配row,再slice row的方法
- _this5.matchScoreMap['rowBigBox'] = new Map();
- var rowInfos = new Map();
- var getRowMatchInfo = function getRowMatchInfo(rowBigBox0, rowBigBox1, ignoreCountMatch) {
- //获取row间的匹配信息
- //获取bigBox位置。由于一排的盒子比较长,中心方向误差大,所以采用先获取两边位置,再求中点的方法
- //if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return //太难了,不算不一样的情况了
- var name = rowBigBox0.sid + '&' + rowBigBox1.sid;
- var row = rowInfos.get(name);
- if (row) {
- return row;
- }
- if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return; //if (getBoxCount(rowBigBox0) != getBoxCount(rowBigBox1) && getBoxCount(rowBigBox0) != 1 && getBoxCount(rowBigBox1) != 1)return
- /* if (rowBigBox0.sid == 'pano0-row-1,2,6' && rowBigBox1.sid == 'pano2-row-0,2,6') {
- console.log(4)
- } */
- var rowInfo;
- if (rowBigBox0.boxes.length > 1 && rowBigBox1.boxes.length > 1) {
- //多对多,可以求两端的位置
- var lefts = [rowBigBox0.left, rowBigBox1.left];
- var rights = [rowBigBox0.right, rowBigBox1.right];
- var leftInfo;
- var rightInfo;
- var info2 = getReverseInfo(rowBigBox0, rowBigBox1);
- var len0 = rowBigBox0.predictLen,
- //长度应该接近
- len1 = rowBigBox1.predictLen;
- var overLen = Math.abs(len0 - len1);
- /* / (rowBigBox0.boxes.length + rowBigBox1.boxes.length) * 5 */
- if (overLen > 1) {
- //console.warn('overLen> 1', overLen, rowBigBox0.sid, '和', rowBigBox1.sid)
- return done();
- }
- if (info2.reversed) {
- leftInfo = getMatchScore(lefts[0], rights[1], {
- isSingle: true
- });
- rightInfo = getMatchScore(rights[0], lefts[1], {
- isSingle: true
- });
- } else {
- leftInfo = getMatchScore(lefts[0], lefts[1], {
- isSingle: true
- });
- rightInfo = getMatchScore(rights[0], rights[1], {
- isSingle: true
- });
- }
- var posLeft = getBoxPos(leftInfo);
- var posRight = getBoxPos(rightInfo);
- if (!posLeft || !posRight || leftInfo.score < -4000 || rightInfo.score < -4000) {
- return done(); //漫游点重合、>180度会导致此问题
- }
- preDealBox(leftInfo); //getBoxSize(leftInfo)
- preDealBox(rightInfo); //getBoxSize(rightInfo)
- posLeft = getBoxPos(leftInfo);
- posRight = getBoxPos(rightInfo); //验证是否是垂直或水平
- var vec = new THREE.Vector2(posLeft.x - posRight.x, posLeft.z - posRight.z);
- var k = Math.abs(vec.x / vec.y);
- if (info2.k > 1 && k < 1 || info2.k < 1 && k > 1) {
- console.error('请检查!info2.k > 1 && k < 1 || info2.k < 1 && k > 1', rowBigBox0.sid, '和', rowBigBox1.sid); //绘制的方向错误,尺寸错误
- return done();
- }
- var wrongK = 0;
- if (rowBigBox0.k > 1 && rowBigBox1.k < 1 || rowBigBox0.k < 1 && rowBigBox1.k > 1) {
- wrongK = rowBigBox0.k / rowBigBox1.k;
- if (wrongK < 1) wrongK = 1 / wrongK;
- }
- /*
- let trend0 = getPanoBoxAngleTrend(rowBigBox0)
- let trend1 = getPanoBoxAngleTrend(rowBigBox1)
- let judgeReverse = () => { //这个方法有时不准
- let disLeftSquared0 = new THREE.Vector2(posLeft.x - rowBigBox0.pano.position.x, posLeft.z - rowBigBox0.pano.position.z).lengthSq()
- let disRightSquared0 = new THREE.Vector2(posRight.x - rowBigBox0.pano.position.x, posRight.z - rowBigBox0.pano.position.z).lengthSq()
- let a = trend0 * (disLeftSquared0 - disRightSquared0)
- if (a < 0 && Math.abs(a) > 0.1) return true
- let posLeft2 = reversed ? posRight : posLeft, //反向过的对第二个漫游点来说左右是反的
- posRight2 = reversed ? posLeft : posRight
- let disLeftSquared1 = new THREE.Vector2(posLeft2.x - rowBigBox1.pano.position.x, posLeft2.z - rowBigBox1.pano.position.z).lengthSq()
- let disRightSquared1 = new THREE.Vector2(posRight2.x - rowBigBox1.pano.position.x, posRight2.z - rowBigBox1.pano.position.z).lengthSq()
- let b = trend1 * (disLeftSquared1 - disRightSquared1)
- if (b < 0 && Math.abs(b) > 0.1) return true
- }
- if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
- //反向试试
- leftInfo = getMatchScore(lefts[0], rights[1], { isSingle: true })
- rightInfo = getMatchScore(rights[0], lefts[1], { isSingle: true })
- posLeft = getBoxPos(leftInfo)
- posRight = getBoxPos(rightInfo)
- reversed = true //rowBigBox1 反向了
- }
- if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
- return console.log('getCenter ;两个方向都不符合', rowBigBox0.sid, rowBigBox1.sid)
- } */
- /*const maxK = Math.max(0.6 / Math.sqrt(rowBigBox0.boxes.length), 0.2) // 最大斜率
- if (k < maxK && k > 1 / maxK) {
- return //console.log('放弃,斜率', k)
- } */
- //横的话,按x从小到大,竖的按z从小到大
- if (k < 1 && posLeft.z > posRight.z || k > 1 && posLeft.x > posRight.x) {
- var temp = posRight;
- posRight = posLeft, posLeft = temp;
- } //addLabel(posLeft, 'left-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
- //addLabel(posRight, 'right-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
- /* if (rowBigBox0.pano.id + '&' + rowBigBox1.pano.id == '22&26') {
- console.log(777)
- } */
- /* var line1 = LineDraw.createLine([posLeft, posRight])
- meshGroup.add(line1) */
- //根据btmPos矫正一下中心位置, 否则容易偏漫游点这一侧
- var center = new THREE.Vector3().addVectors(posLeft, posRight).multiplyScalar(0.5);
- center.add(rowBigBox0.btmPos).add(rowBigBox1.btmPos).multiplyScalar(1 / 3);
- var _match = getMatchScore(rowBigBox0, rowBigBox1, {
- isSingle: true,
- center
- }); //是否预先传送center ?
- //rowInfo.minAngs = [leftInfo.minAng , rightInfo.minAng]
- /* if (match.name == 'pano4-row-6,4,1,3&pano0-row-0,1,4,5') {
- console.log(8)
- } */
- var sc = _match.score - overLen * 1000 - wrongK * 100 + leftInfo.score + rightInfo.score;
- if (sc < -4000) {
- //console.log('放弃,匹配分过低,可能不是一组', rowBigBox0.sid, '和', rowBigBox1.sid, sc)
- return done();
- } //console.log('getcenter', rowBigBox0.sid, '和', rowBigBox1.sid, overLen, match.score + overLen * 1000 + leftInfo.score + rightInfo.score)
- rowInfo = {
- rowBigBox0,
- rowBigBox1,
- match: _match,
- k,
- posLeft,
- posRight,
- score: sc / 3 + 500,
- //700 + match.score*0.7 + (leftInfo.score + rightInfo.score)*0.3 ,
- reversed: info2.reversed
- };
- } else {
- if (rowBigBox0.boxes.length == 1 && rowBigBox1.boxes.length == 1) {
- rowInfo = getMatchScore(rowBigBox0.boxes[0], rowBigBox1.boxes[0]); //直接匹配box
- } else {
- //一对多。getMatchScore计算误差大(长度越长中心误差越大、宽度计算也误差大)所以再写点限制。直接使用btm来预测长度和位置似乎更准
- var mulBoxRow = rowBigBox0.boxes.length > 1 ? rowBigBox0 : rowBigBox1;
- var singleBox = rowBigBox0.boxes.length == 1 ? rowBigBox0 : rowBigBox1;
- /* if(rowBigBox0.sid == "pano12-row-3" && rowBigBox1.sid == "pano0-row-3,1,0" ){
- console.log(5)
- } */
- rowInfo = getMatchScore(rowBigBox0, rowBigBox1, {
- dontCheckDis: true
- }); //一对多 也可以根据方向检查距离,如仅检查z
- rowInfo.k = mulBoxRow.k;
- if (rowInfo.center) {
- rowInfo.center.add(getBoxPos(mulBoxRow)).multiplyScalar(0.5);
- }
- if (rowInfo.name == 'pano0-row-14&pano4-row-8,11') {
- addLabel(rowInfo.center, 'c');
- }
- rowInfo.predictSize = rowInfo.k > 1 ? {
- x: mulBoxRow.predictLen,
- y: 0.6
- } : {
- y: mulBoxRow.predictLen,
- x: 0.6
- }; //单个的应该和多个的其中一端一样,且是离单个漫游点近的那端(也就是要走到箱子一端看不见其他箱子才行)
- var dis0 = getBoxPos(mulBoxRow.left).distanceToSquared(singleBox.pano.position);
- var dis1 = getBoxPos(mulBoxRow.right).distanceToSquared(singleBox.pano.position);
- var near = dis0 < dis1 ? mulBoxRow.left : mulBoxRow.right;
- var p0 = getBoxPos(singleBox);
- var dis = getBoxPos(near).distanceToSquared(p0);
- rowInfo.score -= dis * 1000;
- var p1 = getBoxPos(mulBoxRow);
- var vec1 = new THREE.Vector2(p1.x - singleBox.pano.position.x, p1.z - singleBox.pano.position.z).normalize(); //看向中心的方向
- var vec2 = new THREE.Vector2(singleBox.centerDir.x, singleBox.centerDir.z).normalize();
- rowInfo.score += (vec1.dot(vec2) - 1) * 1000; //同一个方向是最好
- }
- }
- function done(rowInfo) {
- //rowInfo && rowInfos.push(rowInfo)
- rowInfos.set(name, rowInfo);
- }
- done(rowInfo);
- return rowInfo;
- };
- var matchGroups = [];
- var getK = function getK(info) {
- var k;
- if (info.left) {
- var vec = new THREE.Vector2(info.left.x - info.right.x, info.left.z - info.right.z);
- k = Math.abs(vec.x / vec.y);
- } else {
- k = Math.abs(Math.max(info.size.x, 0.6) / Math.max(info.size.z, 0.6));
- }
- return k;
- };
- var ignoreCountMatch = groups.filter(function (e) {
- return e.length > 1;
- }).length == 1; //是否不同数量box的row也能匹配
- var minScore = boundConfirmed ? -2000 : -800;
- var match = function match(searchType) {
- if (searchType == 'second') ignoreCountMatch = true;
- for (var i = 0; i < groups.length - 1; i++) {
- var rowBigBoxes_0 = getPanoBigRowBox(groups[i]);
- var pano0 = groups[i][0].pano;
- if (searchType == 'second') rowBigBoxes_0 = rowBigBoxes_0.filter(function (e) {
- return !matchGroups.some(function (u) {
- return u.includes(e);
- });
- });
- var _loop = function _loop(j) {
- var rowBigBoxes_1 = getPanoBigRowBox(groups[j]);
- if (searchType == 'second') rowBigBoxes_1 = rowBigBoxes_1.filter(function (e) {
- return !matchGroups.some(function (u) {
- return u.includes(e);
- });
- });
- var pano1 = groups[j][0].pano;
- if (pano0.id == 54 && pano1.id == 56) {
- console.log(2);
- }
- var resultPairs = [];
- var evaluateFun = function evaluateFun(row0, row1) {
- return getRowMatchInfo(row0, row1, ignoreCountMatch);
- };
- searchPair(null
- /* bigBoxes_0[0] */
- , rowBigBoxes_0.slice(), rowBigBoxes_1.slice(), null, resultPairs, evaluateFun);
- resultPairs = resultPairs.map(function (pairs) {
- var infos = pairs.map(function (pair) {
- return pair.some(function (e) {
- return e.sid == 'void';
- }) ? null : getRowMatchInfo(pair[0], pair[1], ignoreCountMatch);
- }); //infos.sort((a,b)=>{return a.score-b.score});
- var score = infos.reduce(function (s, e) {
- return s + (e && e.score > minScore ? e.score : minScore / 2); //只考虑组成功的分数
- }, 0);
- return {
- pairs,
- infos,
- score,
- name: pairs.map(function (pair) {
- return pair.map(function (item) {
- return item.sid;
- }).join(' & ');
- })
- };
- });
- resultPairs.sort(function (a, b) {
- return b.score - a.score;
- });
- /* if (resultPairs[0].name[0].includes('pano8') && resultPairs[0].name[0].includes('pano0')) {
- console.log(111)
- } */
- resultPairs[0] && resultPairs[0].pairs.forEach(function (pair, i) {
- var info = resultPairs[0].infos[i];
- if (info && info.score > minScore) {
- var items = pair.filter(function (e) {
- return e.sid != 'void';
- });
- common$1.pushToGroupAuto(items, matchGroups, null, function (atGroup) {
- //需要朝向一致才行
- if (!info.k) return true; //(box识别的宽高识别不准所以不需要)
- var onePair = atGroup.relationships[0];
- var name = onePair[0].sid + '&' + onePair[1].sid;
- if (!rowInfos.get(name).k) return true; //不过不应该有这种情况,否则匹配不到一起才对
- if (rowInfos.get(name).k < 1 && info.k < 1 || rowInfos.get(name).k > 1 && info.k > 1) {
- return true;
- } else {
- console.log('k不一致无法匹配', info, atGroup);
- }
- }); //根据目前的规则应该是有端点的和有端点的匹配,box和box匹配
- }
- }); //console.log(resultPairs[0])
- };
- for (var j = i + 1; j < groups.length; j++) {
- _loop(j);
- }
- }
- };
- match();
- ignoreCountMatch || match('second'); //再次将剩余的匹配一下,这次允许个数不同的row匹配
- //console.log('matchGroups', matchGroups)
- //识别出来的多组,可能有重复的,因为box个数不同所以才没到一组
- //整理一下,每个组整理出一个info,同时重新检查一下,挑去每组中和其他成员非常不同的
- var groupInfo = [];
- var getGroupInfo = function getGroupInfo(group) {
- var left = new THREE.Vector3(),
- right = new THREE.Vector3(),
- pointsLen = 0;
- var bigBoxes = [];
- var info = {};
- group.relationships.forEach(function (pair) {
- var name = pair[0].sid + '&' + pair[1].sid;
- var matchInfo = rowInfos.get(name); //this.matchScoreMap["rowBigBox"][name] || this.matchScoreMap["cabinet"][name];
- if (matchInfo.posLeft) {
- left.add(matchInfo.posLeft), right.add(matchInfo.posRight), pointsLen++;
- } else {
- bigBoxes.push(matchInfo);
- preDealBox(matchInfo);
- getBoxSize(matchInfo);
- }
- });
- if (pointsLen > 0) {
- left.multiplyScalar(1 / pointsLen);
- right.multiplyScalar(1 / pointsLen); //addLabel(left, 'Left' + index, { bgcolor: '#F00', a: 0.2 })
- //addLabel(right, 'Right' + index, { bgcolor: '#F00', a: 0.2 })
- var center = new THREE.Vector3().addVectors(left, right).multiplyScalar(0.5) //addLabel(center, 'center' + index, { bgcolor: '#F00', a: 0.3 })
- ;
- info.left = left, info.right = right, info.center = center;
- info.pointsLen = pointsLen;
- }
- if (bigBoxes.length > 0) {
- var getAve = function getAve(bigBoxes) {
- var center1 = new THREE.Vector3(),
- size = new THREE.Vector3();
- bigBoxes.forEach(function (box) {
- var center0 = getBoxPos(box);
- center1.add(center0);
- size.add(box.size);
- });
- if (pointsLen > 0) {
- var size0 = new THREE.Vector3(Math.abs(left.x - right.x), size.y, Math.abs(left.z - right.z));
- size.add(size0.multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
- center1.add(info.center.clone().multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
- } else {
- size.multiplyScalar(1 / bigBoxes.length);
- center1.multiplyScalar(1 / bigBoxes.length);
- }
- return {
- center1,
- size
- };
- };
- var getScores = function getScores(center, size) {
- //获得相对于center,size的差别分数
- bigBoxes.forEach(function (box) {
- box.sc = -box.center.distanceToSquared(center1) - size.distanceToSquared(box.size) * 0.5;
- });
- };
- var _getAve = getAve(bigBoxes),
- center1 = _getAve.center1,
- size = _getAve.size; //console.log(center1, size)
- getScores(center1, size);
- bigBoxes.sort(function (a, b) {
- return b.sc - a.sc;
- });
- var midItem = bigBoxes[Math.floor(bigBoxes.length / 2)]; //中位数
- getScores(midItem.center, midItem.size);
- var _minScore = -8;
- var removes = bigBoxes.filter(function (e) {
- return e.sc < _minScore;
- });
- if (removes.length) {
- var _common$disconnectGro2 = common$1.disconnectGroup(removes.map(function (e) {
- return [e.box0, e.box1];
- }), matchGroups),
- newGroups = _common$disconnectGro2.newGroups;
- console.log('去除错误数据', removes);
- if (newGroups.length > 1) {
- //分裂成多组了,重新计算
- newGroups.forEach(function (e) {
- getGroupInfo(e);
- });
- return;
- }
- bigBoxes = bigBoxes.filter(function (e) {
- return e.sc >= _minScore;
- });
- }
- if (bigBoxes.length) {
- var o = getAve(bigBoxes) //again
- ;
- info.center = o.center1, info.size = o.size;
- }
- }
- info.k = getK(info);
- info.bigBoxes = bigBoxes;
- info.group = group;
- groupInfo.push(info);
- };
- matchGroups.slice(0).forEach(function (group) {
- getGroupInfo(group);
- });
- var getLength = function getLength(c) {
- //获取bigbox长度
- 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;
- };
- var getLeft = function getLeft(group, k) {
- var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
- return group.left ? group.left[dirAxis] - 0.3 : group.center[dirAxis] - group.size[dirAxis] / 2; //left和right加减半个宽度
- };
- var getRight = function getRight(group, k) {
- var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
- return group.right ? group.right[dirAxis] + 0.3 : group.center[dirAxis] + group.size[dirAxis] / 2;
- }; //识别是否group之间有一样的, 去重
- {
- var _ret = function () {
- var realGroups = [];
- var getAveWidth = function getAveWidth(infos, len) {
- //获取这些infos最合适的箱子平均宽度和个数
- var boxCounts = [];
- infos.forEach(function (e) {
- boxCounts.push.apply(boxCounts, _toConsumableArray(e.group.map(function (bigBox) {
- return bigBox.boxes.length;
- })));
- });
- boxCounts.sort(function (a, b) {
- return a - b;
- });
- var midCounts = [];
- var r0 = 0.3,
- r1 = 0.7; //取中间这部分的算最适合的个数,结果不一定是中位数
- boxCounts.slice(Math.floor(boxCounts.length * r0), Math.floor(boxCounts.length * r1) + 1).forEach(function (c) {
- if (!midCounts.includes(c)) midCounts.push(c);
- });
- var _standards$cabinet$wi = standards.cabinet.widthNormal,
- min = _standards$cabinet$wi.min,
- max = _standards$cabinet$wi.max;
- var standardW = (min + max) / 2;
- var aveWs = midCounts.map(function (e) {
- return {
- aveW: len / e,
- count: e
- };
- });
- aveWs.sort(function (a, b) {
- return Math.abs(a.aveW - standardW) - Math.abs(b.aveW - standardW);
- });
- var aveW = aveWs[0].aveW;
- var count = aveWs[0].count;
- if (aveW > max || aveW < min) {
- var w = THREE.MathUtils.clamp(aveW, min, max); //console.warn(`box aveW宽度不太对,从${aveW}修改到${w}`)
- aveW = w;
- }
- return {
- aveW,
- count
- };
- };
- var getBox2 = function getBox2(center, len, thick, k) {
- var box2 = new THREE.Box2();
- box2.expandByPoint(new THREE.Vector2(center.x, center.z));
- var sizeVec = k > 1 ? new THREE.Vector2(len / 2, thick / 2) : new THREE.Vector2(thick / 2, len / 2);
- box2.expandByVector(sizeVec);
- return box2;
- };
- var standardW = 0.6; //两排之间最小距离
- var _loop2 = function _loop2(m) {
- var group0 = groupInfo[m];
- var _loop3 = function _loop3(n) {
- var _group1$bigBoxes$, _group0$bigBoxes$;
- var group1 = groupInfo[n];
- 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') {
- console.log(4);
- }
- if ((group0.k > 1 && group1.k < 1 || group0.k < 1 && group1.k > 1) && getLength(group0) > 1.5 && getLength(group1) > 1.5) return "continue"; //如果是方块状的无视k
- //间距
- var spaceAxis = (group0.k + group1.k) / 2 > 1 ? 'z' : 'x';
- var spaceDis = Math.abs(group0.center[spaceAxis] - group1.center[spaceAxis]);
- if (spaceDis > standardW * 1.5) return "continue";
- var o0 = getAveWidth([group0], getLength(group0)); //因为有可能长度和箱子个数不匹配,所以需要得到限制后的宽度再比较
- var o1 = getAveWidth([group1], getLength(group1));
- var len0 = group0.predictLen = o0.aveW * o0.count;
- var len1 = group1.predictLen = o1.aveW * o1.count;
- // if( len0 / len1 < minR || len0 / len1 > 1/minR) continue
- var area0 = group0.area = len0 * o0.aveW;
- var area1 = group1.area = len1 * o1.aveW;
- var getBoxMixArea = function getBoxMixArea(expandRatio1, expandRatio2) {
- var box0 = getBox2(group0.center, len0 + expandRatio1, o0.aveW + expandRatio2, group0.k);
- var box1 = getBox2(group1.center, len1 + expandRatio1, o1.aveW + expandRatio2, group1.k);
- var mixBox = getMixBox(box0, box1); //重叠部分
- var s = mixBox.getSize(new THREE.Vector2());
- return {
- box0,
- box1,
- areaMix: Math.max(0, s.x) * Math.max(0, s.y)
- }; //可能是0
- };
- var areaMixExpand = getBoxMixArea(0.1, 0.3).areaMix;
- if (areaMixExpand / area0 < 0.65 && areaMixExpand / area1 < 0.65) return "continue"; //包含的可以通过
- /*let areaMix = getBoxMixArea(0, 0).areaMix //实际重合面积
- group0.contains = group0.contains || []
- group1.contains = group1.contains || []
- group0.contains.push({ group: group1, selfPercent: areaMix / area0, percent2: areaMix / area1, areaMix })
- group1.contains.push({ group: group0, selfPercent: areaMix / area1, percent2: areaMix / area0, areaMix })
- */
- //console.log('两个合并', group0, group1)
- common$1.pushToGroupAuto([group0, group1], realGroups); //包含的直接合并吧 - - ,这样会使结果偏移,不过没办法了,多个重叠面积太难算了
- };
- for (var n = m + 1; n < groupInfo.length; n++) {
- var _ret2 = _loop3(n);
- if (_ret2 === "continue") continue;
- }
- };
- for (var m = 0; m < groupInfo.length - 1; m++) {
- _loop2(m);
- } //但没合并前样本数量少,包含关系可能有错 - -
- /*for(let m=0; m<groupInfo.length;m++){
- let group = groupInfo[m]
- let contains = group.contains.filter(e=> e.percent2 > 0.8) //所有包含的
- contains.reduce
- } */
- groupInfo.forEach(function (info) {
- //加入单个的
- if (!realGroups.some(function (groups) {
- return groups.includes(info);
- })) {
- realGroups.push([info]);
- }
- }); //console.log('realGroups', realGroups)
- //get boxes
- realGroups.forEach(function (infos, i) {
- var sampleCount = infos.reduce(function (w, c) {
- return w += c.pointsLen || c.bigBoxes.length;
- }, 0);
- var k;
- /* {
- //const k = infos.reduce((w, c) => (w += c.k), 0) / infos.length
- let ks = infos.map(e => e.k)
- ks.sort((a, b) => a - b)
- let min = ks[0],
- max = ks[ks.length - 1]
- if (min < 1 && max > 1) {
- //比较最小和最大,选取更极端的那个
- let min_ = 1 / min
- if (min_ < max) k = max
- else k = min
- } else k = (min + max) / 2
- } */
- {
- //看>1的和<1的平均数哪个多用哪个
- var ks = {
- '<1': {
- count: 0,
- sum: 0
- },
- '>1': {
- count: 0,
- sum: 0
- }
- };
- infos.forEach(function (e) {
- if (e.k < 1) {
- ks['<1'].count++, ks['<1'].sum += 1 / e.k;
- } else {
- ks['>1'].count++, ks['>1'].sum += e.k;
- }
- });
- ks['<1'].count && (ks['<1'].ave = ks['<1'].sum / ks['<1'].count);
- ks['>1'].count && (ks['>1'].ave = ks['>1'].sum / ks['>1'].count);
- if (ks['<1'].ave > ks['>1'].ave) {
- k = 1 / ks['<1'].ave;
- } else {
- k = ks['>1'].ave;
- }
- }
- var centerPos = infos.reduce(function (w, c) {
- return w.add(c.center.clone().multiplyScalar(c.pointsLen || c.bigBoxes.length));
- }, new THREE.Vector3()).multiplyScalar(1 / sampleCount); //预得中心点
- //获取左右端点(需要排除可能的误差,所以采用最靠近端点的三个点。但无法排除前三个点中万一含有包含box的、或者误差大的端点)
- var lefts = infos.map(function (e) {
- return getLeft(e, k);
- }).sort(function (a, b) {
- return a - b;
- }).filter(function (a) {
- return a < centerPos[k > 1 ? 'x' : 'z'];
- }).slice(0, 3);
- var rights = infos.map(function (e) {
- return getRight(e, k);
- }).sort(function (a, b) {
- return b - a;
- }).filter(function (a) {
- return a > centerPos[k > 1 ? 'x' : 'z'];
- }).slice(0, 3);
- var left = 0,
- right = 0;
- var c0 = (lefts.length + 1) * lefts.length / 2;
- lefts.forEach(function (e, i) {
- //越靠近最外侧权重越高。
- left += e * ((lefts.length - i) / c0);
- });
- c0 = (rights.length + 1) * rights.length / 2;
- rights.forEach(function (e, i) {
- right += e * ((rights.length - i) / c0);
- });
- centerPos[k > 1 ? 'x' : 'z'] = (left + right) / 2;
- var len = right - left; //加一点值是因为之前计算长度,用的是最外box的中心点,会少box一半宽度
- var infos2 = infos.filter(function (e) {
- return !e.predictLen || e.predictLen / len > 0.7;
- });
- if (infos2.length == 0) {
- infos2 = infos.sort(function (a, b) {
- return b.predictLen - a.predictLen;
- }).slice(0, 1);
- }
- var _getAveWidth = getAveWidth(infos2, len),
- aveW = _getAveWidth.aveW,
- count = _getAveWidth.count; //长宽比中心点的误差更大,尤其是box类型的、或样本少的
- //获取高度
- var heights = [];
- {
- var heightss;
- /* infos.forEach(e => {
- pairs.push(...e.group.relationships.filter(pair => pair[0].boxes.length == count && pair[1].boxes.length == count))
- })
- if (pairs.length) {
- heightss = pairs.map(pair => {
- let boxes = pair.map(e => {
- return e.boxes.slice()
- })
- let match = rowInfos[pair[0].sid + '&' + pair[1].sid]
- let ifReverse = match.reversed
- if (match.reversed == void 0 && pair[0].boxes.length > 1 && pair[1].boxes.length > 1) {
- let { reversed } = getReverseInfo(pair[0], pair[1])
- ifReverse = reversed
- }
- if (ifReverse) {
- boxes[1].reverse()
- }
- let heights1 = []
- let topPoss = []
- for (let i = 0; i < count; i++) {
- let match1 = getMatchScore(boxes[0][i], boxes[1][i], { onlyGet: true })
- let topPos = match1 && match1.topPos
- if (!topPos) {
- topPos = getBoxTop({ box0: boxes[0][i], box1: boxes[1][i] })
- }
- heights1.push(topPos.y - groundY)
- if (topPos.y - groundY < 0) {
- console.log('?')
- }
- topPoss.push(topPos)
- }
- if ((k < 1 && topPoss[0].z > topPoss[count - 1].z) || (k > 1 && topPoss[0].x > topPoss[count - 1].x)) {
- heights1.reverse()
- }
- return heights1
- })
- } else { */
- var bigBoxes = [];
- infos.forEach(function (e) {
- bigBoxes.push.apply(bigBoxes, _toConsumableArray(e.group.filter(function (e) {
- return !bigBoxes.includes(e) && e.boxes.length == count;
- })));
- });
- heightss = bigBoxes.map(function (bigBox) {
- var topPoss = bigBox.boxes.map(function (box) {
- var a = {
- box0: box
- };
- getBoxTop(a);
- return a.topPos;
- });
- if (k < 1 && topPoss[0].z > topPoss[count - 1].z || k > 1 && topPoss[0].x > topPoss[count - 1].x) {
- topPoss.reverse();
- }
- var heights1 = topPoss.map(function (topPos) {
- return topPos.y - groundY;
- });
- return heights1;
- }); //}
- heightss.forEach(function (arr) {
- for (var _i2 = 0; _i2 < count; _i2++) {
- heights[_i2] = (heights[_i2] || 0) + arr[_i2];
- }
- });
- heights = heights.map(function (e) {
- var h = e / heightss.length;
- return h;
- }); //console.log('heightss',heightss, pairs, heights)
- } //拆分成小box
- var size = new THREE.Vector3(aveW, 2, aveW);
- var c = 0;
- infos.rowboxs = [];
- while (c < count) {
- var center = void 0;
- if (k > 1) {
- var startX = centerPos.x - (count - 1) / 2 * aveW;
- center = new THREE.Vector3(startX + c * aveW, centerPos.y, centerPos.z);
- } else {
- var startZ = centerPos.z - (count - 1) / 2 * aveW;
- center = new THREE.Vector3(centerPos.x, centerPos.y, startZ + c * aveW);
- }
- var size1 = heights[c] ? size.clone().setY(heights[c]) : size; //如1*3的是得不到height的
- var box = new Box({
- name: 'row' + i + '-' + c,
- center,
- size: size1,
- boxType: 'cabinet',
- infos
- });
- c++;
- infos.rowboxs.push(box);
- }
- });
- return {
- v: realGroups.length > 0
- };
- }();
- if (typeof _ret === "object") return _ret.v;
- }
- };
- var removeContain = function removeContain(arr) {
- //去除嵌套
- var len = arr.length;
- if (len < 2) return;
- for (var i = 0; i < len - 1; i++) {
- var box0 = arr[i];
- getBoxBase(box0);
- box0.contains = box0.contains || [];
- for (var j = i + 1; j < len; j++) {
- var box1 = arr[j];
- /* if (box0.sid == 'pano2-1' && box1.sid == 'pano2-7') {
- console.log(6)
- } */
- getBoxBase(box1);
- box1.contains = box1.contains || [];
- var d3 = Math.abs(box1.bbox2CenterX - box0.bbox2CenterX); //限制d3是因为在相差180度两端可能也符合
- //d4 = Math.abs(box1.bbox2[3] - box0.bbox2[3])
- if (d3 > 0.4
- /* || d4 > 0.01 */
- ) continue;
- var d0 = getBbox2Diff(box1.bbox2[0], box0.bbox2[0]),
- d1 = getBbox2Diff(box0.bbox2[2], box1.bbox2[2]),
- w0 = getBbox2Diff(box0.bbox2[2], box0.bbox2[0]),
- w1 = getBbox2Diff(box1.bbox2[2], box1.bbox2[0]);
- var min = Math.min(0.005, Math.min(w0, w1) * 0.2); //如果本身w0,w1宽度就小,差距更要小
- if (d1 >= 0 && Math.abs(d0) < min || d0 >= 0 && Math.abs(d1) < min || d1 >= 0 && d0 >= 0) {
- box0.contains.push(box1);
- } else if (d0 <= 0 && Math.abs(d1) < min || d1 <= 0 && Math.abs(d0) < min || d1 <= 0 && d0 <= 0) {
- box1.contains.push(box0);
- }
- }
- }
- var getWidthScore = function getWidthScore(box, type) {
- var addDis = 0.1; //因为用的是btm的pos,比中心点近了一些,所以加上一段距离
- var o = getBoxPoseByPos(box, getBoxPos(box), addDis);
- var boxPjW = o.projectWidth;
- var standardPjW = (o.maxProjectWidth + o.minProjectWidth) / 2;
- var s = type == 'out' ? boxPjW - standardPjW : standardPjW - boxPjW;
- return -Math.pow(s, 2) * 10;
- };
- var minChildCount = arr[0].boxType == 'battery' || arr[0].boxType == 'tv' ? 1 : 2;
- arr.slice().forEach(function (box) {
- if (box.contains.length >= minChildCount) {
- //假设不存在第二层嵌套, 假设每个只能被一个嵌套
- //决定留大还是留小
- //先只去掉包含两个以上的,且角度范围一致
- //尽量保留内层,除非内层太小
- var _getLeftRight2 = getLeftRight(box.contains),
- leftX = _getLeftRight2.leftX,
- rightX = _getLeftRight2.rightX;
- if (box.contains.length > 1 && (Math.abs(getBbox2Diff(box.bbox2[0], leftX)) > 0.005 || Math.abs(getBbox2Diff(box.bbox2[2], rightX)) > 0.005)) return; //范围不一致
- var remainChild = true;
- if (box.contains.length == 1) {
- //cdi6xzNiNdS 电池包含单个 感觉一般都是留大
- remainChild = false;
- } else {
- var outScore = getWidthScore(box, 'out');
- var childrenScores = box.contains.map(function (e) {
- return getWidthScore(e, 'in');
- });
- var childAve = childrenScores.reduce(function (w, c) {
- return w + c;
- }, 0) / childrenScores.length;
- if (childAve < -4) {
- //let outScore = getWidthScore(box, 'out')
- remainChild = childAve > outScore;
- }
- }
- if (!remainChild) {
- box.contains.forEach(function (e) {
- var _console;
- e.state = '因被嵌套被删除', e.containBy = box;
- arr.splice(arr.indexOf(e), 1);
- (_console = console).log.apply(_console, ['因被嵌套被删除'].concat(_toConsumableArray(box.contains)));
- });
- } else {
- box.state = '因嵌套其他被删除';
- console.log('因嵌套其他被删除', box);
- arr.splice(arr.indexOf(box), 1);
- }
- }
- });
- };
- var waitFindRest = [];
- var Search = function Search(type) {
- console.error('开始search', type);
- var matchScoreMap = _this5.matchScoreMap[type] = new Map();
- var datas = {};
- var panoIds = [];
- for (var id in _this5.datas) {
- if (!_this5.datas[id]) continue;
- datas[id] = _this5.datas[id].shapes.filter(function (e) {
- return isType(e.category, type);
- });
- datas[id].length && panoIds.push(id);
- }
- var _loop4 = function _loop4(_id) {
- //对data预处理
- //(之后如果还出现不同类型重叠在一起的,需要先识别摘除下。 )4GqaqNdyjGf
- if (!_this5.datas[_id]) return "continue";
- removeContain(datas[_id]); //去除线框中的嵌套,主要是一个嵌套两个的。案例:KK-1Zjm9Rbl47
- if (datas[_id].length) {
- //融合。很多box被一分为二了,基本都是在全景图左右边界处。
- var bigBoxes = getPanoBigRowBox(datas[_id], {
- reason: 'mix'
- });
- bigBoxes.forEach(function (bigBox) {
- if (bigBox.boxes.length > 1) {
- bigBox.boxes.forEach(function (box) {
- box.state = '被删除', box.mixTo = bigBox;
- var i = datas[_id].indexOf(box);
- datas[_id].splice(i, 1);
- {
- i = _this5.datasMixed[_id].shapes.findIndex(function (e) {
- return e.sid == box.sid;
- });
- _this5.datasMixed[_id].shapes.splice(i, 1);
- }
- });
- console.log('因融合而删除', bigBox.boxes);
- datas[_id].push(bigBox);
- {
- _this5.datasMixed[_id].shapes.push(bigBox);
- }
- var shapes = _this5.datas[_id].shapes;
- bigBox.index = shapes.length > 1 ? shapes[shapes.length - 1].index + 1 : 0;
- {
- var a = bigBox.sid.split('mix-');
- bigBox.sid = a[0] + bigBox.index + '(mix' + a[1] + ')'; //"pano20-mix-1,2"
- }
- }
- });
- }
- };
- for (var _id in _this5.datas) {
- var _ret3 = _loop4(_id);
- if (_ret3 === "continue") continue;
- }
- if (panoIds.length == 0) {
- if (standards[type].tinyXZ) {
- //fire 调试:nZrBdvRaDuC
- _this5.expandModelBound();
- }
- return;
- }
- panoIds.sort(function (a, b) {
- return datas[b].length - datas[a].length;
- });
- var groups = panoIds.map(function (e) {
- return datas[e];
- }); //console.log('按box个数排序:', groups.slice())
- var group0 = groups[0],
- len0 = group0.length;
- if (groups.length == 1) {
- //只有一个全景里有数据
- if (standards[type].tinyXZ) {
- //fire. 无法match以获取groundY, 就取消。 调试: eGhyf5QdVHA
- _this5.expandModelBound(type);
- }
- group0.forEach(function (e) {
- return createSinglePano(e);
- });
- return combines(type);
- }
- var finish = function finish(groups) {
- waitFindRest.push({
- type,
- args: [groups]
- }); //等待最后检查遗漏
- if (standards[type].tinyXZ) {
- //fire 调试:nZrBdvRaDuC
- _this5.confirmGroundY(type);
- }
- if (standards[type].tiny) {
- //monitor 调试:S9yepREK8Jl
- _this5.expandModelBound2(type);
- }
- };
- if (len0 == 1) {
- //最多的也只有一个box。此情况大部分是空调
- panoIds.forEach(function (e) {
- return getBoxBase(datas[e][0]);
- });
- for (var i = 0; i < panoIds.length; i++) {
- var box0 = datas[panoIds[i]][0];
- for (var j = i + 1; j < panoIds.length; j++) {
- var box1 = datas[panoIds[j]][0];
- getMatchScore(box0, box1, {
- isSingle: true
- });
- }
- }
- /* let list = Object.keys(matchScoreMap)
- list.sort((a, b) => {
- return matchScoreMap[b].score - matchScoreMap[a].score
- })
- let match = matchScoreMap[list[0]] */
- var list = Array.from(matchScoreMap).map(function (e) {
- return e[1];
- }).sort(function (a, b) {
- return b.score - a.score;
- });
- var match = list[0];
- preDealBox(match);
- if (match.score > -100) {
- getBoxSize(match);
- if (match.score > 0 && match.sizeAdjust < 0.1) {
- new Box(match); //waitFindRest.push({ type, args: [groups] }) //等待最后检查遗漏
- finish(groups);
- return;
- }
- } //根据分数重排序,前两个已匹配的pano放在第一第二(reMatchLowScores会跳过),获得groups2
- var panoIds2 = [];
- /* list.forEach(e => {
- let info = matchScoreMap[e]
- if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id)
- if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id)
- }) */
- list.forEach(function (info) {
- if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id);
- if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id);
- });
- var groups2 = panoIds2.map(function (e) {
- return datas[e];
- }); //继续match
- reMatchLowScores([match], groups2);
- finish(groups2);
- return;
- }
- {
- //重新根据距离排序,挑选离所有box距离最近的两个pano (远的可能看不到box,或者得到的线框计算的位置不准。不过其实太近也不准-,-)
- var counts = {};
- groups.forEach(function (e) {
- e.forEach(function (a) {
- return getBoxBase(a);
- });
- counts[e.length] || (counts[e.length] = []);
- counts[e.length].push(e);
- });
- groups = [];
- standards[type].atWall;
- var nums = Object.keys(counts);
- var bestDisSquared = 2;
- nums.reverse();
- nums.forEach(function (count) {
- var _groups;
- var groups_ = counts[count];
- if (groups_.length > 1) {
- groups_.forEach(function (e) {
- e.disSc = e.reduce(function (w, c) {
- var pos = getBoxPos(c); //let s = atWall ? Math.pow(Math.abs(c.centerDir.y), 3)*100 : 0 //在墙上的话尽量平视
- //console.log(c.sid,s)
- if (!pos) {
- getBoxPos(c);
- }
- return w + Math.abs(c.pano.position.distanceToSquared(pos) - bestDisSquared); //+ s
- }, 0);
- });
- groups_.sort(function (a, b) {
- return a.disSc - b.disSc;
- });
- }
- (_groups = groups).push.apply(_groups, _toConsumableArray(groups_));
- }); //console.log('按距离和个数排序:', groups)
- group0 = groups[0];
- len0 = group0.length;
- }
- if (type == 'cabinet') {
- //转化为分组
- if (searchByRow(groups)) {
- waitFindRest.push({
- type,
- args: [groups, 0]
- }); //等待最后检查遗漏
- return;
- }
- } //零散匹配。
- var match2Group = function match2Group(group0, group1) {
- var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- fake = _ref6.fake;
- group0.length;
- group1.length;
- /* for (let i = 0; i < len0; i++) {
- //复杂度:n的平方次
- for (let j = 0; j < len1; j++) {
- let box1 = group0[i]
- let box2 = group1[j]
- let result = getMatchScore(box1, box2)
- }
- } */
- //寻找最佳配对 n!种组合(是否要限制个数多的情况?) 超过8个就很恐怖
- //仅先查找选中的两个pano配对
- var resultPairs = [];
- var newGroup0 = group0.slice(0);
- var newGroup1 = group1.slice(0);
- /* while (newGroup1.length < newGroup0.length) {
- newGroup1.push({ sid: 'void' }) //为了使排列正确,补个空,使左右两边个数相等,过后和void匹配的不会计算box
- } */
- var evaluateFun = getMatchScore.bind(_this5);
- searchPair(
- /* group0[0] */
- null, newGroup0, newGroup1, null, resultPairs, evaluateFun);
- /* console.log(
- 'resultPairs',
- resultPairs.map(pairs => pairs.map(pair => pair.map(item => item.sid).join(' & ')))
- ) */
- resultPairs = resultPairs.map(function (pairs) {
- var infos = pairs.map(function (pair) {
- return getMatchScore(pair[0], pair[1]);
- }); //matchScoreMap[pair[0].sid + '&' + pair[1].sid])
- var score = infos.reduce(function (s, e) {
- return s + (e ? e.score : 0);
- }, 0);
- var o = {
- infos,
- score,
- pairs,
- name: pairs.map(function (pair) {
- return pair.map(function (item) {
- return item.sid;
- }).join(' & ');
- })
- };
- return o;
- }); //console.log('resultPairs', resultPairs.slice())
- console.log('resultPairs按分数高低', resultPairs.sort(function (a, b) {
- return b.score - a.score;
- })); //console.log('compu',compu)
- var minScore = boundConfirmed ? -2000 : -800;
- var noMatches = []; //和void匹配的,需要和其他pano的重新匹配
- var lowScores = [];
- if (resultPairs[0]) {
- resultPairs[0].infos.forEach(function (info, i) {
- if (!info) {
- noMatches.push(resultPairs[0].pairs[i].find(function (e) {
- return e.sid != 'void';
- }));
- return; //match with void
- }
- if (info.score < minScore || standards[info.boxType].bottom && info.minAng < 5) {
- lowScores.push(info);
- return;
- }
- preDealBox(info);
- getBoxSize(info);
- if (info.sizeAdjust && standards[info.boxType].tiny || info.sizeAdjust > 0.2) {
- //或者识别下悬挂的且线的角度较小
- lowScores.push(info);
- return;
- }
- if (info.box0.category == typeNames.battery && info.size.x < 1 && info.size.z < 1) {
- //宽度较小
- var vec0 = new THREE.Vector3().subVectors(info.box0.pano.position, getBoxPos(info));
- var vec1 = new THREE.Vector3().subVectors(info.box1.pano.position, getBoxPos(info));
- /* let k0 = Math.abs(vec0.x / vec0.z), k1 = Math.abs(vec1.x / vec1.z), maxR = 6
- if(info.name == '') */
- if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0
- /* || k0/k1 > maxR || k0/k1 < 1/maxR */
- ) {
- //同一个象限 或 偏向一侧
- lowScores.push(info);
- return;
- }
- }
- info.fake = fake;
- new Box(info);
- });
- }
- if (noMatches.length) {
- reMatchLowScores(noMatches.map(function (e) {
- return {
- box0: e
- };
- }), groups, {
- fake
- });
- }
- reMatchLowScores(lowScores, groups, {
- fake
- });
- };
- {
- if (!standards[type].tinyXZ
- /* && !browser.urlHasValue('many') */
- ) {
- var disScores = []; //KJ-iUrPonbhCQo 大的场景有很多柜子时,groups的前两个元素很可能相隔很远,导致匹配不到柜子。
- for (var _i3 = 0; _i3 < groups.length - 1; _i3++) {
- var disSqure = groups[_i3][0].pano.position.distanceToSquared(groups[_i3 + 1][0].pano.position);
- var disScore = math$2.linearClamp(disSqure, [0, 0.4, 2, 6, 100], [-10, 0, 10, 5, -100]);
- var score = disScore + (groups[_i3].length + groups[_i3 + 1].length);
- disScores.push({
- score,
- i: _i3,
- disSqure,
- length1: groups[_i3].length,
- length2: groups[_i3 + 1].length
- });
- }
- disScores.sort(function (a, b) {
- return b.score - a.score;
- });
- match2Group(groups[disScores[0].i], groups[disScores[0].i + 1]); //只匹配前两个
- } else {
- for (var _i4 = 0; _i4 < groups.length - 1; _i4++) {
- //fire 全部匹配
- match2Group(groups[_i4], groups[_i4 + 1], {
- fake: _i4 > 0
- });
- if (groups[_i4 + 1].length < 2) break;
- }
- }
- }
- finish(groups);
- };
- function blocked(box) {
- //该box是否被实体box遮挡
- //WcLVXvmV9AU:pano2-2 和 pano12-4 ; 5yhlMduTHL8:pano2-10
- /* if (box.sid == 'pano6-7') {
- console.log(1)
- addLine(box.pano.position, box.centerBtmDir, 20)
- } */
- if (!standards[box.boxType].bottom) {
- //当底部每个方向都有遮挡物时,其位置很可能不准。但若是部分遮住,还是有可能识别对的
- if (!box.blocked) {
- box.blocked = {
- centerBtmDir: null,
- leftBtmDir: null,
- rightBtmDir: null
- };
- }
- var _loop5 = function _loop5(dir) {
- if (!box.blocked[dir]) {
- var block = boxesSolid.find(function (boxSolid) {
- ray.set(box.pano.position, box[dir]); //这里不用判断距离吗?已经忘了当初怎么想的了。发现大多数block的都是自身
- var o = ray.ray.intersectsBox(boxSolid.bound);
- if (o) {
- // 遮挡
- return true;
- }
- });
- if (block) {
- //若不存在,即都遮挡了,就算真的遮挡
- box.blocked[dir] = block;
- } else {
- box.blocked[dir] = false;
- return {
- v: false
- }; //找到一个方向无遮挡则可返回
- }
- }
- };
- for (var dir in box.blocked) {
- var _ret4 = _loop5(dir);
- if (typeof _ret4 === "object") return _ret4.v;
- }
- return true; //暂定,若某个方向已得到遮挡了,就不计算。但若没有,就再搜一遍(如果会重复搜之后再增加一个stamp啥的,比如记录下当前所有solidBoxes的name,如果改变了就重新搜下)
- } else {
- //若中心方向已经有同类型的box,很可能它就是自身(因为挂墙的预测位置很不准,所以需要这一步。越tiny的越能通过此来筛选)
- var block = boxesSolid.find(function (boxSolid) {
- if (boxSolid.boxType != box.boxType) return;
- ray.set(box.pano.position, box.centerDir);
- var o = ray.ray.intersectsBox(boxSolid.bound);
- if (o) {
- // 遮挡
- return true;
- }
- });
- if (block) {
- box.blocked = block;
- return true;
- }
- }
- } //调试 O540aEVF3b7 jQUQlER160 n4z0yd5tQaF WcLVXvmV9AU 8czlwsbSe5 NlUM8yGve9
- function findRest(groups
- /* ,startIndex=2 */
- ) {
- //查找是否有遗漏。
- //1 可能有距离较远的box不在头两个pano的附近导致被漏掉。(概率很小)
- //2 被剩余的 (包括低分匹配中放弃的,这种需要的距离识别度高)
- var tolerateWidth = {
- min: 0.1,
- max: 0.5
- };
- var boxes = [],
- scores = new Map(),
- bestDisSquared = 2;
- groups.forEach(function (g) {
- var _boxes;
- (_boxes = boxes).push.apply(_boxes, _toConsumableArray(g));
- });
- boxes = boxes.filter(function (box) {
- return !used(box);
- });
- boxes.forEach(function (box) {
- if (box.sid == 'pano2-0') {
- console.log(4);
- }
- getBoxBase(box);
- var p1 = new THREE.Vector2(box.pano.position.x, box.pano.position.z);
- var p2 = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
- var dis = p1.distanceToSquared(p2);
- var s1 = -Math.abs(dis - bestDisSquared); //将距离最佳的排前面,距离远的得到的位置不准确,也容易被遮
- if (!box.pose) box.pose = getBoxPoseByPos(box, getBoxPos(box));
- var s2 = getPoseScore([box.pose], box.boxType) + THREE.MathUtils.clamp(box.pose.projectWidth, box.pose.minProjectWidth, box.pose.maxProjectWidth) * 7; //projectWidth长的更安全
- scores.set(box, {
- s1,
- s2,
- sum: s1 + s2
- });
- }); //console.log(boxes[0].boxType,scores)
- boxes = boxes.sort(function (a, b) {
- return scores.get(b).sum - scores.get(a).sum;
- }); //FXcq5PI9QGv
- //console.log(boxes)
- boxes.forEach(function (box) {
- if (box.sid == 'pano0-4') {
- console.log(3);
- }
- if (!used(box) && !blocked(box)) {
- //如果和现有的box的距离都很远,很可能是漏掉的
- var near = boxesSolid.find(function (solidBox) {
- if (solidBox.name == 'air-pano16-7&pano14-13') {
- console.log(3);
- }
- if (solidBox.boxType != box.boxType && (solidBox.boxType == 'air-hanging' || box.boxType == 'air-hanging')) return; //挂空调一般不会撞到地面上的
- var p1 = getBoxPos(solidBox);
- var p2 = getBoxPos(box);
- new THREE.Vector2(p1.x, p1.z);
- new THREE.Vector2(p2.x, p2.z);
- var maxWidth = standards[box.boxType].widthNormal.max / 2;
- maxWidth = THREE.MathUtils.clamp(maxWidth, tolerateWidth.min, tolerateWidth.max); //因为场景精度存在较大误差,所以maxWidth不能过小,否则像灭火器摄像头都容易findRest多个
- var dis = solidBox.bound.distanceToPoint(p2); //let r0 = solidBox.boxType == 'air' ? 2 : solidBox.boxType == 'battery' ? 1.1 : 1 //空调最不容易扎堆放置,所以范围设置广一些
- var r0 = standards[box.boxType].closeRatio;
- var r1 = math$2.linearClamp(box.pano.position.distanceTo(p2), 3, 20, 1, 5); //距离远的话识别、计算都会更不准确,给一定的容错. 远的尽量不findRest,即尽量>0
- var ra = (solidBox.boxType == box.boxType ? 1 : 0.5) * r0 * r1; //数字越小限制越大
- /* let a = maxWidth * maxWidth * ra - p1_.distanceToSquared(p2_)
- let b = -dis * dis * 0.7
- let c = a + b*/
- var c = maxWidth * ra - dis * 1.3;
- /* if (c > 0) {
- //太近 不创建
- console.log(1)
- } */
- return c > 0;
- });
- if (!near) {
- reMatchLowScores([{
- box0: box,
- log: 'findRest'
- }], groups, {
- startIndex: 0
- });
- }
- }
- });
- }
- function used(box) {
- //是否已经使用过
- var has = function has(e) {
- return e.box0 == box || e.box1 == box;
- };
- var traverse = function traverse(e) {
- return has(e) || e.list && e.list.some(function (a) {
- return traverse(a);
- }) || e.mixedFrom && e.mixedFrom.some(function (a) {
- return traverse(a);
- }) || e.infos && e.infos.some(function (u) {
- return u.group.some(function (r) {
- return r.boxes.some(function (b) {
- return b == box;
- });
- });
- }); //row
- };
- return boxesSolid.some(function (e) {
- return traverse(e);
- });
- }
- function reMatchLowScores(lowScores, groups) {
- var _ref7 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- _ref7$startIndex = _ref7.startIndex,
- startIndex = _ref7$startIndex === void 0 ? 2 : _ref7$startIndex,
- fake = _ref7.fake;
- var tooLows = [];
- var minScore = boundConfirmed ? -2000 : -800;
- var isSameMatch = function isSameMatch(match0, match1) {
- //是否对应同一个box实体(不一定准),通过两两box之间是否都match来判断
- //如果是相同pano但不同的box肯定不是对应同一个box实体
- var ifWrong = function ifWrong(box0, box1) {
- if (box0 == box1) return;
- if (box0.pano == box1.pano) return true;
- var match2 = getMatchScore(box0, box1, {
- isSingle: true,
- restMatch: true
- });
- if (match2.score < minScore) return true;
- };
- if (ifWrong(match0.box0, match1.box0) || ifWrong(match0.box1, match1.box1) || ifWrong(match0.box0, match1.box1) || ifWrong(match0.box1, match1.box0)) return;
- return true;
- };
- if (lowScores.length) {
- //console.warn(lowScores[0].log || (lowScores[0].box1 ? '低分重新匹配' : '剩余匹配'), lowScores[0].box0.boxType, ...lowScores)
- if (lowScores[0].box1) {
- lowScores.sort(function (a, b) {
- //低分优先
- return a.score - b.score;
- });
- }
- lowScores.forEach(function (info) {
- //info中的box0和box1分别向后寻找其他的配对。选择分数高的配对。 但box0和box1可能是错误配对,会导致找到了替代的也可能遗漏。
- /* if (info.name == 'pano0-3&pano2-3') {
- console.log(1)
- } */
- var box01 = info.box0;
- var box02 = info.box1;
- var bigGroup = [];
- box02 && bigGroup.push(info);
- var _loop6 = function _loop6(cur) {
- var thirdGroup = groups[cur];
- var scores0 = [],
- scores1 = [];
- thirdGroup.forEach(function (box1) {
- //if (matched.includes(box1.sid)) return
- if (used(box1)) return; //会不会太严格?
- if (box1.pano != box01.pano && box1 != box02) {
- var r1 = getMatchScore(box01, box1, {
- isSingle: true,
- restMatch: true
- });
- r1.score > minScore * 1.5 && scores0.push(r1);
- }
- if (box02 && box1.pano != box02.pano && box1 != box01) {
- var r2 = getMatchScore(box02, box1, {
- isSingle: true,
- restMatch: true
- });
- r2.score > minScore * 1.5 && scores1.push(r2);
- }
- });
- scores0.sort(function (a, b) {
- return b.score - a.score;
- });
- scores1.sort(function (a, b) {
- return b.score - a.score;
- });
- scores0[0] && bigGroup.push(scores0[0]);
- scores1[0] && bigGroup.push(scores1[0]);
- };
- for (var cur = startIndex; cur < groups.length; cur++) {
- _loop6(cur);
- }
- bigGroup.sort(function (a, b) {
- return b.score - a.score;
- });
- var goodList = bigGroup.slice(0, 10).map(function (e) {
- if (!getBoxPos(e)) return e;
- preDealBox(e);
- getBoxSize(e);
- return e;
- });
- var goodList2 = goodList.sort(function (a, b) {
- return b.score - a.score;
- }).slice(0, 3);
- if (goodList2.length == 0) {
- return fake || createSinglePano(box01, 0.6); //minScorePercent原因:剩余匹配时位置不太好的案例: AhMgXXjM15
- }
- if (goodList2[0].score > minScore * 0.65) {
- goodList2 = goodList2.filter(function (e) {
- return e.score > minScore * 0.65;
- });
- } else {
- /* goodList2 = [goodList2[0]] // 最高分已经过小
- if (goodList2[0].score < -1500) { */
- if (!box02) {
- if (info.log == 'findRest' || getBoxPos(box01).distanceTo(box01.pano.position) < 2.5) {
- //远距离不准,留到过后findRest
- fake || createSinglePano(box01);
- }
- return;
- } //console.warn('分数过低,是否有匹配错误?', goodList2[0])
- return tooLows.push(goodList2[0]); //}
- }
- if (goodList2.length) {
- //需要确认两两之间是配对的,也就是都对应同一个box
- var subGroups = [],
- boxes = [];
- var _loop7 = function _loop7(i, len) {
- //向后选择队友
- var match0 = goodList2[i];
- if (subGroups.some(function (e) {
- return e.includes(match0);
- })) return "continue"; //被挑选了的没有选择权
- var gr = [match0];
- for (var j = i + 1; j < len; j++) {
- var match1 = goodList2[j];
- if (isSameMatch(match0, match1)) {
- //可能不是同一个,所以需要检验
- gr.push(match1);
- }
- } //if(gr.length>1){
- subGroups.push(gr); //}
- };
- for (var i = 0, len = goodList2.length; i < len; i++) {
- var _ret5 = _loop7(i, len);
- if (_ret5 === "continue") continue;
- } //console.log('lowScores subGroups', subGroups)
- subGroups.forEach(function (pair) {
- boxes.push(mixMatchBox(pair, lowScores[0].log, fake));
- });
- fake || combineBoxes(boxes); //很可能其实还是同一个,需要检验是否要融合
- }
- }); //改为之后 findRest, 因为两者都single的可能性低
- /* let judge = box => {
- if (!used(box)) {
- matched.push(box)
- createSinglePano(box)
- }
- }
- tooLows.forEach(e => {
- judge(e.box0)
- judge(e.box1)
- }) */
- }
- }
- function mixMatchBox(list, log, fake) {
- var center = new THREE.Vector3(),
- size = new THREE.Vector3(),
- bound = new THREE.Box3();
- list.forEach(function (e) {
- var _bound = new THREE.Box3().setFromCenterAndSize(getBoxFinalPos(e), e.size);
- bound.union(_bound);
- }); //bound.getCenter(center) //这两种获得center的方法哪个准?
- bound.getSize(size);
- list.forEach(function (e) {
- return center.add(e.center
- /* getBoxPos(e) */
- );
- });
- center.multiplyScalar(1 / list.length);
- var _ref8 = list.find(function (e) {
- return e.xProp;
- }) || {},
- xProp = _ref8.xProp,
- yProp = _ref8.yProp;
- if (xProp && list.find(function (e) {
- return e.xProp && e.xProp != xProp;
- })) {
- //如果有不同的话
- xProp = yProp = null;
- }
- var prefix = log == 'findRest' ? 'rest:' : 'low:';
- var object = {
- name: prefix + list.map(function (e) {
- return e.name;
- }),
- boxType: list[0].boxType,
- center,
- size,
- list,
- xProp,
- yProp
- };
- var o = restrictSize(size.x, size.y, size.z, object);
- size.x = o.x;
- size.y = o.y;
- size.z = o.z;
- object.fake = fake;
- var box = new Box(object); //console.log('mixMatchBox', box)
- return box;
- }
- function combineBoxes(boxes, typeCount) {
- //调试 tY4ot33f8vT UWrshepp0G5的一高一低的电箱
- //判断这些实体boxes是否需要合并 主要用于重复识别(重叠面积较大)
- var group = [];
- if (boxes.length > 1) {
- var boxType = boxes[0].boxType;
- var _standards$boxType$wi3 = standards[boxType].widthNormal;
- _standards$boxType$wi3.min;
- var max = _standards$boxType$wi3.max; //let aveSize = ( min + max ) / 2
- var maxX = max,
- maxZ = max,
- maxY = standards[boxType].height.max;
- standards[boxType].height.min; //aveSizeY = (maxY + minY) / 2
- for (var i = 0, len = boxes.length; i < len - 1; i++) {
- var box0 = boxes[i];
- if (box0.fake) continue;
- for (var j = i + 1; j < len; j++) {
- var box1 = boxes[j];
- if (box1.fake) continue;
- var bound = box0.bound.clone().union(box1.bound);
- var size = bound.getSize(new THREE.Vector3());
- var intersect = box0.bound.intersectsBox(box1.bound);
- if (box0.name == 'desk-pano21-0' && box1.name == 'desk-pano20-0') {
- console.log(1);
- }
- var maxR = intersect ? 1.5 : 1.3,
- rX = size.x / maxX,
- rY = size.y / maxY,
- rZ = size.z / maxZ;
- if (rX < maxR && rY < maxR && rZ < maxR) {
- common$1.pushToGroupAuto([box0, box1], group);
- }
- /* if (box0.xProp && box1.xProp && box0.xProp == box1.xProp) {
- maxX = standards[boxType][box0.xProp].max
- maxZ = standards[boxType][box0.yProp].max
-
- if (box0.boxType != box1.boxType) {
- //air & airSmart
- maxX = Math.max(maxX, standards[box1.boxType][box1.xProp].max)
- maxZ = Math.max(maxZ, standards[box1.boxType][box1.yProp].max)
-
- }
- }
- maxX = Math.max(maxX, box0.size.x, box1.size.x) //必须大于各自的size,否则无法去除本身就oversize的box中包含的
- maxZ = Math.max(maxZ, box0.size.z, box1.size.z)
- maxY = Math.max(maxY, box0.size.y, box1.size.y)*/
- /*let r = intersect ? 1.5 : 1.3 /* //如果是没有交集,限制更大些
- //若需要更精确的结果,可以getMixBox算出重叠面积,重叠少,且各自都不太小,就不合并。但考虑到电池边界很模糊,合并了也无大碍。
- if (box0.boxType == 'battery') {
- r *= 1.3 //比较可能扎堆
- }
- let maxDiff = 0.4,
- maxDiffX = maxDiff,
- maxDiffZ = maxDiff,
- rx = r,
- rz = r
- if (standards[box0.boxType].atWall == 1) {
- //在墙面上不可能叠放,所以厚度限制可放宽
- let s = 4
- if (box0.yProp == 'width') {
- maxDiffX *= s
- rx *= s
- } else if (box0.xProp == 'width') {
- maxDiffZ *= s
- rz *= s
- }
- } */
- /* 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) {
- //总size不会太大
- common.pushToGroupAuto([box0, box1], group)
- } */
- //改为如果两者的mixbound 比最小的width大不了多少,尤其是重合率高的
- /* let maxDiff = intersect ? 0.5 : 0.3
- let maxR = intersect ? 1.5 : 1.3
- let diffX = size.x - minX,
- diffY = size.y - minY,
- diffZ = size.z - minZ,
- rX = size.x / minX,
- rY = size.y / minY,
- rZ = size.z / minZ
- if (diffX < maxDiff && diffY < maxDiff && diffZ < maxDiff && rX < maxR && rY < maxR && rZ < maxR) {
- common.pushToGroupAuto([box0, box1], group)
- } */
- }
- }
- if (group.length) {
- //虽然如果三个以上可能会超出maxWidth。 不过3个的概率很低,且可以限制宽度
- group.forEach(function (pair) {
- var boxTypes = [];
- var bound = new THREE.Box3();
- pair.forEach(function (e) {
- bound.union(e.bound);
- e.dispose();
- if (typeCount > 1) {
- //判断boxType: 寻找所使用的box总分最高的boxType
- var a = boxTypes.find(function (a) {
- return a.boxType == e.boxType;
- });
- var score = 0;
- var add = function add(box) {
- box && (score += box.score);
- };
- e.traversePair(function (e) {
- add(e.box0);
- add(e.box1);
- });
- if (a) {
- a.score += score;
- } else {
- boxTypes.push({
- score,
- boxType: e.boxType
- });
- }
- }
- });
- if (typeCount > 1) {
- boxTypes.sort(function (a, b) {
- return b.score - a.score;
- });
- boxType = boxTypes[0].boxType;
- }
- var size = bound.getSize(new THREE.Vector3());
- var center = bound.getCenter(new THREE.Vector3());
- var _ref9 = pair.find(function (e) {
- return e.xProp;
- }) || {},
- xProp = _ref9.xProp,
- yProp = _ref9.yProp;
- if (xProp && pair.find(function (e) {
- return e.xProp && e.xProp != xProp;
- })) {
- //如果有不同的话
- xProp = yProp = null;
- }
- var info = {
- name: 'mix:' + pair.map(function (e) {
- return ' ' + e.name;
- }),
- mixedFrom: pair,
- boxType,
- center,
- size,
- xProp,
- yProp
- };
- var o = restrictSize(size.x, size.y, size.z, info);
- size.x = o.x;
- size.y = o.y;
- size.z = o.z;
- var box = new Box(info);
- console.error('混合', boxType, pair, box);
- });
- }
- }
- }
- function combines(types) {
- //合并boxSolids . battery经常嵌套
- if (!(types instanceof Array)) types = [types];
- var boxes = boxesSolid.filter(function (e) {
- return types.includes(e.boxType);
- });
- combineBoxes(boxes, types.length);
- }
- var createSinglePano = function createSinglePano(box) {
- var minScorePercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- //仅用一个pano中的data来创建。 悬挂于墙上的准确性依赖于墙的准确性。
- /* if (box.score < MinBoxInitialScore) {
- //如Xszq2fv03b的电池pano8-0其实是纸箱、 WZQoMbNmNTu的pano14-0分数0.649
- return console.error('取消createSinglePano: 线框识别分数低,可能错误', box.sid, box)
- } */
- getBoxBase(box);
- var center = getBoxPos(box);
- if (safeBound.distanceToPoint(center) > 0) {
- return console.log('取消createSinglePano:超出safebound', box); //可能是错误的线框,如H7pg1tO9oeJ pano8-1
- }
- var info = {
- name: box.sid,
- box0: box,
- center,
- topPos: box.topPos,
- btmPos: box.btmPos,
- xProp: box.xProp,
- yProp: box.yProp
- };
- preDealBox(info);
- var minScore = -500 * minScorePercent; //调试 3MnIWabM6ne Tmo1vLp9Q13
- var a = getPoseScore(info.boxposes, box.boxType);
- /* if (!standards[box.boxType].bottom && box.btmPos) {
- a -= (box.btmPos.y - groundY) * 3000 //底部被遮住一部分(但是像vHC1GfkdKtD在户外,容易底部变高到bound外去怎么办)
- } */
- var failed = a < minScore;
- console.log('createSinglePano', failed ? '失败' : '成功', 'pose score:', a, box.sid, box);
- if (failed) return; //addLabel(center, 'center', { a: 0.3 })
- //info.topPos && addLabel(info.topPos, 'topPos', { a: 0.3 })
- info.score = a;
- if (box.sid == 'pano10-1') {
- console.log(7);
- }
- getBoxSize(info);
- new Box(info);
- }; //去除挨得很近的漫游点,因为两个接近的点match出的值误差很大
- {
- _this5.removedDatas = {};
- var panoIds = Object.keys(_this5.datas).filter(function (id) {
- if (!player$c.model.panos.index[id]) {
- //排除数据错误
- _this5.removedDatas[id] = _this5.datas[id];
- delete _this5.datas[id]; //console.log('???', id)
- return;
- }
- return true;
- });
- var len = panoIds.length;
- for (var i = 0; i < len; i++) {
- var pano0 = player$c.model.panos.index[panoIds[i]];
- for (var j = i + 1; j < len; j++) {
- var pano1 = player$c.model.panos.index[panoIds[j]];
- if (pano0.position.distanceToSquared(pano1.position) < 0.01) {
- //离的很近。保留shape多的那个data
- var remove = void 0;
- if (_this5.datas[panoIds[i]].shapes.length > _this5.datas[panoIds[j]].shapes.length) {
- remove = panoIds[j];
- } else {
- remove = panoIds[i];
- }
- console.log("\u5220\u9664pano".concat(remove, "\u7684data\uFF0C\u56E0pano").concat(panoIds[i], "\u548Cpano").concat(panoIds[j], "\u5F88\u8FD1"));
- _this5.removedDatas[remove] = _this5.datas[remove];
- delete _this5.datas[remove];
- }
- }
- }
- } //this.expandModelBound()
- // if (version == 'vision') this.datasMixed = common.CloneObject(this.datas, null, [player.model.panos.list[0].constructor])
- _this5.datasMixed = common$1.CloneObject(_this5.datas, null, undefined, function (data) {
- return data['category'];
- });
- /* Search('cabinet')
- Search('air')
- Search('battery') */
- for (var _i5 in typeNames) {
- Search(_i5);
- }
- console.log('----FindRest----');
- waitFindRest.forEach(function (e) {
- findRest.apply(void 0, _toConsumableArray(e.args));
- if (e.type != 'air' && e.type != 'airSmart' && e.type != 'cabinet') combines(e.type);
- });
- combines(['air', 'airSmart']); //这两种合在一起combine,因为太像了容易识别出多个 nZrBdvRaDuC
- console.log('cost:', Date.now() - startTime, 'ms, boxSolid:', _this5.boxesSolid, '共' + _this5.boxesSolid.length + '个');
- };
- done = function done() {
- var _loop8 = function _loop8(panoId) {
- if (!_this5.datas[panoId]) return "continue";
- _this5.datas[panoId].shapes = _this5.datas[panoId].shapes.map(function (shape, i) {
- return Object.assign({
- sid: 'pano' + panoId + '-' + i,
- category: shape.category,
- //提前 便于调试
- pano: player$c.model.panos.index[panoId],
- index: i
- }, shape);
- });
- };
- for (var panoId in _this5.datas) {
- var _ret6 = _loop8(panoId);
- if (_ret6 === "continue") continue;
- }
- _this5.findOutAllTypes();
- _this5.panoBound = new THREE.Box3();
- player$c.model.chunks.forEach(function (e) {
- modelBound.union(e.geometry.boundingBox); //注:不用model.boundingBox是 因为union了pano的position的
- }); //针对部分模型错误,只有底面的,union一下pano.position
- var minY = Infinity,
- minYs = [];
- var panos = player$c.model.panos.list.filter(function (e) {
- return e.isAligned();
- });
- panos.forEach(function (e) {
- var bound = new THREE.Box3().setFromCenterAndSize(e.position, new THREE.Vector3(0.1, 0.1, 0.1));
- modelBound.union(bound);
- _this5.panoBound.union(bound);
- minY = Math.min(e.floorPosition.y, minY); //avePanoFY += e.floorPosition.y
- minYs.push(e.floorPosition.y);
- });
- safeBound = _this5.safeBound = modelBound;
- {
- skyboxTight = new BoundingMesh(modelBound, new THREE.MeshBasicMaterial({
- side: THREE.DoubleSide,
- wireframe: true,
- transparent: true,
- opacity: 0.05,
- visible: false
- }), 0); //skyboxTight.visible = false
- skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
- meshGroup.add(skyboxTight);
- _this5.skyboxTight = skyboxTight;
- }
- groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
- if (_this5.ifAnalyze) {
- beginCompute();
- }
- {
- _this5.load(player$c.currentPano.id);
- _this5.boxesSolid.forEach(function (e) {
- return e.boxMesh.updateMatrixWorld();
- }); //for updateBoxVisiInPano raycaster
- _this5.updateBoxVisiInPano();
- }
- };
- if (!dataList) {
- /* player.model.panos.list.forEach(e => {
- if (!e.isAligned()) return
- panosCount++
- load.bind(this)(e.id)
- }) */
- loadAll.bind(this)(); //测试环境
- } else {
- //when version == 'output'
- dataList.forEach(function (e) {
- var panoId = e.imagePath.split('.jpg')[0];
- _this5.datas[panoId] = e;
- });
- done();
- }
- case 14:
- case "end":
- return _context4.stop();
- }
- }
- }, _callee4, this);
- }));
- function compute(_x2) {
- return _compute.apply(this, arguments);
- }
- return compute;
- }()
- }, {
- key: "expandModelBound",
- value: function expandModelBound() {
- var _this8 = this;
- //有的模型太窄,容易将一排的柜体当做墙壁。所以可以根据box位置扩展bound. (如果因为点位太少,导致内部的电池远超模型范围,就不管了。R7xZsmm9FsG)
- var maxDis0 = 1,
- //最终位置不会超过这个距离
- maxDis1 = 3; //搜寻范围。不可扩展太宽,否则不准确的框会飘很远,甚至多画多个box,如R7xZsmm9FsG
- var newBound = modelBound.clone();
- var list = [];
- var _loop9 = function _loop9(panoId) {
- if (!_this8.datas[panoId]) return "continue";
- var _this8$datas$panoId = _this8.datas[panoId],
- imageWidth = _this8$datas$panoId.imageWidth,
- imageHeight = _this8$datas$panoId.imageHeight;
- _this8.datas[panoId].shapes.forEach(function (box) {
- getBoxBase(box, imageWidth, imageHeight);
- if (box.sid == 'pano2-10') {
- console.log(4);
- }
- if (box.btmPosPredict) {
- var far = box.pano.position.distanceToSquared(box.btmPosPredict);
- if (far > 20) return; //太远不准
- var dis = modelBound.distanceToPoint(box.btmPosPredict);
- if (dis > 0 && dis < maxDis1) {
- //maxDis1用来防air-hanging和一些错误的框
- list.push({
- box,
- dis
- });
- }
- }
- });
- };
- for (var panoId in this.datas) {
- var _ret7 = _loop9(panoId);
- if (_ret7 === "continue") continue;
- }
- list.sort(function (a, b) {
- return a.dis - b.dis;
- }); //let mid = list[Math.floor(list.length/2)]
- var mid = list.length; // /2
- for (var i = 0; i < mid; i++) {
- var box = list[i].box;
- var pos = box.btmPosPredict;
- if (list[i].dis > maxDis0) {
- var p1 = pos.clone().clamp(modelBound.min, modelBound.max);
- var vec = new THREE.Vector3().subVectors(pos, p1).normalize().multiplyScalar(maxDis0);
- pos = new THREE.Vector3().addVectors(p1, vec);
- }
- var marginBound = new THREE.Box3().setFromCenterAndSize(pos, new THREE.Vector3(0.2, 0, 0.2));
- newBound.union(marginBound);
- }
- skyboxTight = new BoundingMesh(newBound, new THREE.MeshBasicMaterial({
- side: THREE.DoubleSide,
- wireframe: true,
- transparent: true,
- opacity: 0.05
- }), 0); //skyboxTight.visible = false
- skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
- meshGroup.add(skyboxTight);
- this.skyboxTight = skyboxTight;
- this.safeBound = this.safeBoundFirstVer = safeBound = newBound;
- boundConfirmed = true;
- console.log('bound1:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
- }
- }, {
- key: "expandModelBound2",
- value: function expandModelBound2(type) {
- var _this9 = this;
- var material = skyboxTight.material;
- skyboxTight.geometry.dispose();
- boxesSolid.forEach(function (e) {
- if (e.boxType != type) return;
- _this9.safeBound.union(e.bound);
- });
- skyboxTight = new BoundingMesh(this.safeBound, material, 0); //skyboxTight.visible = false
- skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
- meshGroup.add(skyboxTight);
- this.skyboxTight = skyboxTight;
- console.log('bound2:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
- }
- /* adjustModelBound(type){
- if(standards[type].atWall != 1)return //必须是挂墙的
-
- this.lastSafeBound = this.safeBound.clone()
- let list = []
- let add = e => {
- if (e.btmPos && e.box1 && e.minAng>10 ) {
- //有 box1才能确定是getIntersect得到的pos
- list.includes(e) || e.push(e)
- }
- }
- this.boxesSolid.forEach((solidBox)=>{
- if(solidBox.boxType != type)return
- solidBox.traversePair(add)
- })
- let wallSides = {'x+': 0, 'x-': 0, 'z+': 0, 'z-': 0}
- let getBoxSide = (e)=>{
- for(let i in e.panosDir){
- if(e.panosDir[i] != 0){
- wallSides[i] += 1
- }
- }
- }
-
- if(list.length){
- this.safeBound = this.panoBound.clone()
- list.forEach((e)=>{
- this.safeBound.union(e.bound)//还是说使用cIntersect来expand?
- getBoxSide()
- })
- }
-
-
- skyboxTight = new BoundingMesh(this.safeBound, material, 0)
- //skyboxTight.visible = false
- skyboxTight.updateMatrixWorld() //不update的话raycaster是错的
- meshGroup.add(skyboxTight)
- this.skyboxTight = skyboxTight
-
- //主要目的,针对那些模型比room大得多的情况,比如多了门外的部分,造成墙面不准。
- //monitor的可以完全决定位置。其他的只能收缩(但是不能收缩超过panos和第一次expand的那些btm的bound里)
- //太麻烦了,且考虑到即使墙面完全准确也可能反倒把它变的不准的风险。
-
- } */
- /* 最低点使用fire的吗
- MW6MEeCOy9Y 只有最近三个点和fire接近
- 3MnIWabM6ne fire combine了
- ov5NTEImzhW fire多个
- n4z0yd5tQaF fire多两个错位离谱的。。 位置和显示的不一样。。
- 5BaiXkK6Ag1 fire算的不太准 低了0.1 样本数仅两个
- */
- }, {
- key: "updateBoxVisiInPano",
- value: function updateBoxVisiInPano() {
- //if (!isDiwei) return
- if (player$c.mode != 'panorama' || !shelterFilterEnable) {
- this.boxesSolid.forEach(function (e) {
- return e.updateVisible(true, 'panoVisi');
- });
- return;
- } //粗略排除遮挡
- /* let data = this.datasMixed[player.currentPano.id] || this.datas[player.currentPano.id]
- if (!data) return
- let visiBoxes = this.visiInfos[player.currentPano.id]
- if (!visiBoxes) {
- visiBoxes = []
- this.boxesSolid.forEach(box => {
- let sizeXZ = new THREE.Vector2(box.size.x, box.size.z)
- let extLen = -sizeXZ.length() / 2 - 0.5
- let intersect = convertTool.ifIntersectChunks(player.position, box.position, player.model, { extLen })
- if (!intersect) {
- //是否和当前pano的box框位置接近
- let pos2d1 = new THREE.Vector2(box.position.x, box.position.z)
- //return visiBoxes.push(box)
- let shape = data.shapes.find(e => {
- //getBoxBtm(e)
- //return true
- if (isExt) {
- let { imageWidth, imageHeight } = data
- getBoxBase(e, imageWidth, imageHeight)
- getOtherPos(e)
- }
- let pos = getBoxPos(e)
- if (!pos) return
- let pos2d2 = new THREE.Vector2(pos.x, pos.z)
- if (pos2d1.distanceToSquared(pos2d2) < 3) return true //效果:有一些一排中2d框稀疏的可能会不显示
- })
- if (shape) {
- visiBoxes.push(box)
- } else {
- //console.log('ohhhh')
- }
- }
- })
- this.visiInfos[player.currentPano.id] = visiBoxes
- } */
- var visiBoxes = this.visiInfos[player$c.currentPano.id];
- if (!visiBoxes) {
- visiBoxes = this.boxesSolid.filter(function (box) {
- if (box.visiPanos) {
- //已经先从box端计算好了
- return box.visiPanos.includes(player$c.currentPano);
- }
- return box.cptVisiAtPano(player$c.currentPano);
- });
- this.visiInfos[player$c.currentPano.id] = visiBoxes; //此方法相比之前利用data中的数据,不同点是只要没有被其他box遮挡即可显示,所以可以穿墙显示。另外遮挡更精细
- }
- this.boxesSolid.forEach(function (e) {
- e.updateVisible(visiBoxes.includes(e), 'panoVisi');
- });
- }
- }, {
- key: "confirmGroundY",
- value: function confirmGroundY(type) {
- //利用fire来确定地面高度(会稍低于地板,但box框不打滑且xz更准,估计因box框比box大)。调试:3MnIWabM6ne up9PPZkx1px 4GqaqNdyjGfs GFbQi1LiSij
- if (boundConfirmed) return;
- var btmYs = [],
- pairs = [],
- needCount = 5,
- maxDis = 3,
- btmY = 0;
- var add = function add(e) {
- if (e.btmPos && e.box1
- /* && e.score >= minScore */
- ) {
- //有 box1才能确定是getIntersect得到的pos
- pairs.push(e);
- }
- };
- boxesSolid.forEach(function (e) {
- if (e.boxType != type) return;
- e.traversePair(add);
- });
- var usePairs = pairs;
- if (pairs.length > needCount) {
- //调试:Y8czF2Z3h9m
- var disMap = new Map();
- pairs.forEach(function (e) {
- disMap.set(e, Math.max(e.box0.pano.position.distanceTo(e.box0.btmPosPredict), e.box1.pano.position.distanceTo(e.box1.btmPosPredict)));
- });
- pairs.sort(function (a, b) {
- return disMap.get(a) - disMap.get(b);
- }); //距离从近到远 . 远处的高度可能偏离严重,就不管了,而且框也不一定准
- usePairs = pairs.slice(0, needCount);
- for (var i = needCount; i < pairs.length; i++) {
- if (disMap.get(pairs[i]) < maxDis) {
- usePairs.push(pairs[i]);
- }
- }
- }
- usePairs.forEach(function (e) {
- //有 box1才能确定是getIntersect得到的pos
- var btmY_ = e.btmPos.y;
- var width = e.size.x / 2;
- var h0 = width / Math.tan(Math.acos(-e.box0.centerBtmDir.y)); //|centerBtmDir.y| 即俯视角度的cos
- var h1 = width / Math.tan(Math.acos(-e.box1.centerBtmDir.y));
- var h = Math.min(h0, h1); //选个小的吧,因浅的会更快接触到中心,虽然交点是两条射线最近点 不一定在fire中心
- //如果毫无误差,且centerBtmDir.y相同,只要两条线centerBtmDir的xz相同,交点就是和地面的交点,而只要不同,交点就是和地面的交点,而只要不同,交点必然是在fire中心之下。随着minAng和centerBtmDir.y 交点在这中间变化
- var r = math$2.linearClamp(e.minAng, 0, 90, 0, 1);
- btmY_ += h * r;
- btmYs.push(btmY_);
- btmY += btmY_;
- });
- btmY /= btmYs.length;
- if (btmYs.length) {
- console.error('confirmGroundY', btmY,
- /* '样本数', btmYs.length, */
- btmYs, usePairs.map(function (e) {
- return e.name;
- }), pairs);
- /* if(btmYs.length == 1 && pairs[0].minAngle<12 && ){
-
- } */
- groundY = this.safeBound.min.y = this.panoBound.min.y = btmY; // = -1.1
- groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
- }
- var _standards$type$heigh = standards[type].height,
- min = _standards$type$heigh.min,
- max = _standards$type$heigh.max;
- boxesSolid.slice().forEach(function (e) {
- if (e.boxType != type) return;
- if (e.fake) {
- e.dispose();
- return;
- }
- var topY = e.topPos ? e.topPos.y : e.list.reduce(function (w, c) {
- return w + c.topPos.y;
- }, 0) / e.list.length;
- e.size.y = THREE.MathUtils.clamp(topY - groundY, min, max);
- e.setFromInfo(e);
- e.draw();
- });
- this.panoBound;
- this.expandModelBound();
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- var _this10 = this;
- player$c.on(PlayerEvents.FlyingStarted, function (e) {
- //if(e.mode == 'dollhouse')return
- // 点位跳转前清除已有线框
- _this10.traverse(function (obj) {
- if (obj.isMesh) {
- obj.geometry.dispose();
- obj.material.dispose();
- }
- });
- _this10.wireframes.clear();
- _this10.currentId = null;
- });
- player$c.on(PlayerEvents.FlyingEnded, function () {
- // 点位跳转后加载线框
- _this10.updateBoxVisiInPano();
- if (player$c.mode != Viewmode$1.PANORAMA) return; // 只有PANORAMA模式下需要加载
- _this10.load(player$c.currentPano.id);
- });
- var allBoxMesh = [];
- player$c.on('collectIntersectMesh', function (meshes, e) {
- if (!isDiwei) return;
- allBoxMesh = _this10.boxesSolid.filter(function (e) {
- return common$1.getObjVisiByReason(e.label, 'panoVisi');
- }).map(function (e) {
- return e.boxMesh;
- }); //过滤掉隐藏的
- });
- player$c.on('judgeIntersect', function (intersect_, e) {
- if (e.getConsumed() || !isDiwei) return;
- var intersect = player$c.getMouseIntersect(null, allBoxMesh, {});
- var hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null;
- if (hoveredBox != _this10.hoveredBox) {
- if (hoveredBox) {
- CursorDeal.add('hoverMonitor');
- } else {
- CursorDeal.remove('hoverMonitor');
- }
- _this10.hoveredBox = hoveredBox;
- }
- hoveredBox && e.consume();
- });
- player$c.on('click', function (e) {
- if (e.getConsumed() || !isDiwei) return;
- if (_this10.hoveredBox) {
- player$c.$app.Scene.emit('box-frame-click', _this10.hoveredBox);
- e.consume();
- }
- });
- setTimeout(function () {
- _this10.wireframes.visible = false;
- player$c.$app.Scene.on('ai-box.set-display', /*#__PURE__*/function () {
- var _ref10 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(display) {
- return regenerator.wrap(function _callee5$(_context5) {
- while (1) {
- switch (_context5.prev = _context5.next) {
- case 0:
- //开关
- _this10.switchOnOff(display);
- case 1:
- case "end":
- return _context5.stop();
- }
- }
- }, _callee5);
- }));
- return function (_x4) {
- return _ref10.apply(this, arguments);
- };
- }());
- if (_this10.ifAnalyze && !isDiwei) {
- player$c.$app.Scene.on('ai-box.fetch-list', function () {
- //列表
- var list = [];
- for (var i = 0; i < boxesSolid.length; i++) {
- var box = boxesSolid[i];
- var name = player$c.$app.config.lang == 'zh' ? getChName$1[box.boxType] : typeNames[box.boxType];
- if (name) {
- list.push({
- name: name + '-' + (i + 1),
- position: box.position,
- getClosetPano: box.getClosetPano.bind(box)
- });
- }
- }
- player$c.$app.Scene.emit('ai-box.list', list); //如果没有一条数据,编辑页面的AI选框就不会显示
- });
- player$c.$app.Scene.emit('ai-box.loaded');
- }
- }, 1000);
- }
- /**
- * 加载点位标记数据
- * @param {*} panoId
- */
- }, {
- key: "load",
- value: function load(panoId) {
- var _this11 = this;
- var data = this.datasMixed[panoId] || this.datas[panoId];
- if (!data) {
- if (!(panoId in this.datas)) setTimeout(function () {
- _this11.load(panoId);
- }, 100); //否则无数据
- return;
- }
- if (player$c.currentPano.id != panoId || player$c.flying || this.currentId == panoId) return; // 防止连续跳转点位时,clear后才load好上一点位的数据,导致出现之前的标记
- this.currentId = panoId;
- var shapes = data.shapes,
- imageHeight = data.imageHeight,
- imageWidth = data.imageWidth; //data.data
- var allShapes = shapes.slice();
- shapes.forEach(function (e) {
- if (e.boxes) allShapes.push.apply(allShapes, _toConsumableArray(e.boxes));
- });
- allShapes.forEach(function (shape) {
- // 填充色和线框色
- // let { fill_color, line_color } = shape
- getUVs$1(shape);
- getCenterDir$1(shape, player$c.currentPano);
- var fill_color = shape.fill_color,
- _shape$color = shape.color,
- color = _shape$color === void 0 ? [56, 56, 255] : _shape$color;
- var line_color = [].concat(_toConsumableArray(color), [255]);
- if (!fill_color) fill_color = [255, 255, 255, 0];
- if (!line_color) line_color = [255, 0, 0, 255];
- if (shape.boxes) {
- line_color = [20, 205, 255, 255];
- }
- var pos = getBoxPos(shape);
- var dis = pos ? shape.pano.position.distanceTo(getBoxPos(shape)) : 1;
- var labelShift = (shape.boxType == 'fire' ? 0 : -0.2) / dis;
- var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
- name = [name];
- shape.score && name.push('sc: ' + math$2.toPrecision(shape.score, 3)); //}
- _this11.showSignalFrom2d(name, shape.bbox2, imageWidth, imageHeight, {
- fill: {
- color:
- /* colors.yellow, // */
- new THREE.Color().setRGB(fill_color[0] / 255, fill_color[1] / 255, fill_color[2] / 255),
- opacity:
- /* 0.2, */
- fill_color[3] / 255
- },
- line: {
- color:
- /* colors.green,// */
- new THREE.Color().setRGB(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255),
- opacity: shape.category == 'cabling_rack' ? 0.4 : line_color[3] / 255 //走线架太绕,扰乱视线
- }
- }, shape.centerDir, labelShift, shape.state == '被删除', shape);
- }); // })
- // .catch(err => console.log(`点位${panoId}无标记数据或数据出错:`, err))
- }
- /**
- * 根据坐标标记全景图
- *
- * 存在的问题:如果要准确复现全景图上的线框,上下边框会变为弧形。而按顶点连直线的话,180度以上会出bug。
- * 解决方式:目前150度以下只画出4个顶点然后连直线,150度以上准确画出全景图线框。
- */
- }, {
- key: "showSignalFrom2d",
- value: function showSignalFrom2d(name, rect, w, h, options, centerDir, labelShift, removed, data) {
- // 目前rect给的是矩形对角的两个点坐标,将它扩展成四个顶点
- 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])]; // 根据四个顶点,填充中间点
- var pointArr = [];
- for (var i = 0; i < cornerArr.length; i++) {
- var corner1 = cornerArr[i];
- pointArr.push(corner1);
- /* // 横向角度超过150度时,3d中边框的弧线已经不太明显,准确画出全景图线框
- if ((rect[2] - rect[0]) / w < 5 / 12 && i % 2 == 0) continue
- const vec = [corner2[0] - corner1[0], corner2[1] - corner1[1]]
- let length = Math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
- let num = length / 150
- for (let j = 1; j <= num; j++) {
- pointArr.push([corner1[0] + (vec[0] / num) * j, corner1[1] + (vec[1] / num) * j])
- } */
- } //pointArr.push(cornerArr[0], cornerArr[2], cornerArr[1], cornerArr[3]) //对角线
- var points = [];
- pointArr.forEach(function (uv) {
- var dir = getDirByUV$1(uv, player$c.currentPano); // points.push(dir.sub(centerVec)) // 计算其他点相对于中点的坐标,方便旋转平移等
- points.push(dir);
- }); // 线框
- var lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
- var lineMaterial = new THREE.LineBasicMaterial({
- color: options.line.color,
- opacity: options.line.opacity,
- transparent: true,
- depthTest: false
- });
- var wireframe = new THREE.LineLoop(lineGeometry, lineMaterial); // wireframe.position.copy(centerVec) // 将中点作为线框坐标
- wireframe.renderOrder = 100; // 填充颜色
- var fillGeometry = lineGeometry.clone().setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 3, 2, 3, 1]), 1));
- var fillMaterial = new THREE.MeshBasicMaterial({
- color: options.fill.color,
- opacity: options.fill.opacity,
- transparent: true,
- side: THREE.DoubleSide,
- depthTest: false
- });
- var plane = new THREE.Mesh(fillGeometry, fillMaterial);
- plane.renderOrder = wireframe.renderOrder - 1;
- wireframe.add(plane);
- plane.visible = false; // 名称
- var textMesh = new TextSprite({
- text: name,
- backgroundColor: {
- r: options.line.color.r * 255,
- g: options.line.color.g * 255,
- b: options.line.color.b * 255,
- a: options.line.opacity * 0.5
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: options.line.opacity * 1.1
- },
- borderRadius: 2,
- renderOrder: wireframe.renderOrder + 1,
- player: player$c
- }); //const shift = new THREE.Vector3(0, labelShift , 0)
- textMesh.position.copy(centerDir
- /* .clone().add(shift).normalize() */
- );
- textMesh.lookAt(0, 0, 0); // 看向相机
- textMesh.scale.set(0.12, 0.12, 0.12);
- /* let line = addLine(centerDir, shift, null, options.line.color)
- line.material.opacity = options.line.opacity */
- var group = new THREE.Group();
- group.name = 'rectInPano';
- group.position.copy(player$c.currentPano.position);
- group.add(wireframe);
- group.add(textMesh); //group.add(line)
- this.wireframes.visible = false;
- this.wireframes.add(group);
- group.label = textMesh;
- group.wireframe = wireframe;
- group.plane = plane;
- if (removed) {
- textMesh.sprite.material.opacity = 0.4;
- lineMaterial.opacity *= 0.6;
- lineMaterial.color.set('#efe');
- }
- group.data = data;
- }
- }, {
- key: "findOutAllTypes",
- value: function findOutAllTypes() {
- var types = {};
- for (var i in this.datas) {
- this.datas[i].shapes.forEach(function (shape) {
- if (!types[shape.category]) {
- types[shape.category] = shape.name;
- }
- });
- }
- console.log('allTypes:', types);
- }
- }, {
- key: "clear",
- value: function clear() {
- skyboxTight = null, meshGroup = null, modelBound = new THREE.Box3(), groundY = null, safeBound = null, boxesSolid = [];
- }
- }]);
- return PanoBoxFrame;
- })(THREE.Group);
- var player$b;
- var getChName = {
- CombinationSofa: '组合沙发',
- Desk: '书桌',
- DoubleBed: '双人床',
- TV: '电视'
- };
- var Shape$1 = /*#__PURE__*/function () {
- function Shape(shape, i, panoId, imageWidth, imageHeight) {
- _classCallCheck(this, Shape);
- Object.assign(this, {
- sid: 'pano' + panoId + '-' + i,
- name: getChName[shape.category],
- category: shape.category,
- //提前 便于调试
- pano: player$b.model.panos.index[panoId],
- index: i
- }, shape);
- getUVs(this, imageWidth, imageHeight);
- this.drawData = turnToDraw(this);
- shape.centerPoint = this.drawData.labelPoint;
- }
- _createClass(Shape, [{
- key: "getClosetPano",
- value: function getClosetPano() {
- //点击列表后获取
- return this.pano;
- }
- }, {
- key: "position",
- get: function get() {
- return this.centerPoint;
- }
- }]);
- return Shape;
- }();
- var PanoBoxDrawAI = /*#__PURE__*/function () {
- function PanoBoxDrawAI(app, player_) {
- _classCallCheck(this, PanoBoxDrawAI);
- this.app = void 0;
- player$b = player_;
- this.datas = {};
- this.app = app;
- }
- _createClass(PanoBoxDrawAI, [{
- key: "loadAll",
- value: function () {
- var _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var _this = this;
- var data, box4, list, _loop, panoId, _ret;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _context.next = 2;
- return this.app.store.get('sceneDraw');
- case 2:
- _context.t0 = _context.sent;
- data = {
- data: _context.t0,
- success: true
- };
- // 只绘制ai数据
- console.log('--raw', data);
- data.data = data.data ? data.data.filter(function (item) {
- if (item.sourceType !== 'ai') return false;
- var panoId = item.imagePath.split('.jpg')[0];
- return !!player$b.model.panos.index[panoId];
- }) : [];
- console.log('--filter', data); // if (player.$app.config.deploy == 'local' && !player.$app.config.server) {
- // data = await http.get(player.$app.resource.getViewResourceURL(`images/ai.json?${new Date().getTime()}`))
- // data = {
- // data,
- // success: true,
- // }
- // } else {
- // let aiBoxUrl = '/service/shapes/sceneMarkShape/box4/getInfos'
- // if (player.$app.config.deploy == 'local') {
- // aiBoxUrl = '/service/scene/edit/ai/box4/getInfos'
- // }
- // data = await http.post(aiBoxUrl, { num: player.$app.config.num, type: 1 })
- // }
- // let data = await http.post('/service/shapes/sceneMarkShape/box4/getInfos', { num: player.$app.config.num, type: 1 })
- if (!(!data.data || !data.success)) {
- _context.next = 9;
- break;
- }
- return _context.abrupt("return");
- case 9:
- box4 = data.data; // 兼容旧数据
- box4.forEach(function (e) {
- var panoId = e.imagePath.split('.jpg')[0];
- if (panoId in _this.datas) {
- _this.datas[panoId].shapes.push(e);
- } else {
- _this.datas[panoId] = {
- shapes: [e]
- };
- }
- });
- list = [];
- _loop = function _loop(panoId) {
- if (!_this.datas[panoId]) return "continue";
- _this.datas[panoId].shapes = _this.datas[panoId].shapes.map(function (shape, i) {
- var _this$datas$panoId = _this.datas[panoId];
- _this$datas$panoId.imageWidth;
- _this$datas$panoId.imageHeight;
- var shape_ = new Shape$1(shape, i, panoId, 4096, 2048);
- list.push(shape_);
- return shape_;
- });
- };
- _context.t1 = regenerator.keys(this.datas);
- case 14:
- if ((_context.t2 = _context.t1()).done) {
- _context.next = 21;
- break;
- }
- panoId = _context.t2.value;
- _ret = _loop(panoId);
- if (!(_ret === "continue")) {
- _context.next = 19;
- break;
- }
- return _context.abrupt("continue", 14);
- case 19:
- _context.next = 14;
- break;
- case 21:
- player$b.$app.Scene.emit('ai-box.list', list); //如果没有一条数据,编辑页面的AI选框就不会显示
- player$b.$app.Scene.emit('ai-box.loaded'); //player.$app.Scene.emit('AIDrawGot', this.datas)
- return _context.abrupt("return", this.datas);
- case 24:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function loadAll() {
- return _loadAll.apply(this, arguments);
- }
- return loadAll;
- }()
- }]);
- return PanoBoxDrawAI;
- }();
- function getUVs(box, imageWidth, imageHeight) {
- if (box.bbox2) return;
- if (!imageWidth) {
- imageWidth = global.aiBox.datas[box.pano.id].imageWidth;
- imageHeight = global.aiBox.datas[box.pano.id].imageHeight;
- }
- box.bbox2 = box.bbox.map(function (e, i) {
- //(x1,y1,x2,y2)
- return i % 2 == 0 ? e / imageWidth
- /* + 0.25 */
- : e / imageHeight;
- });
- }
- function getBbox2center(x1, x2) {
- //找中间位置
- if (Math.abs(x1 - x2) > 0.5) {
- //永远找小于180度的那一边
- return (x1 + x2 + 1) / 2; //另外半边
- } else {
- return (x1 + x2) / 2;
- }
- }
- function getCenterDir(box) {
- //假设不存在在box中间拍摄的情况,所以y不会横跨两边
- var bbox = box.bbox2;
- var y = bbox.length >= 5 ? (bbox[1] + bbox[5]) / 2 : bbox[1];
- var center = {
- x: getBbox2center(bbox[0], bbox[2]),
- y
- };
- return getDirByUV(center, box.pano);
- } // 2d坐标转3d坐标
- function getDirByUV(uv, pano) {
- // 计算方向向量
- var yaw = -uv.x * (Math.PI * 2);
- var pitch = Math.PI / 2 - uv.y * Math.PI;
- try {
- var dir = new THREE.Vector3();
- dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
- return dir;
- } catch (e) {
- debugger;
- throw e;
- }
- }
- function turnToDraw(shape) {
- var _shape$editJson, _shape$editJson2;
- var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
- name = [name];
- shape.score && name.push('sc: ' + math$2.toPrecision(shape.score, 3));
- var points;
- var labelPoint;
- var color;
- if (!shape.editJson) {
- var centerDir = getCenterDir(shape);
- labelPoint = centerDir.add(shape.pano.position); //}
- var rect = shape.bbox2;
- var cornerArr = [];
- for (var i = 0; i < rect.length; i += 2) {
- cornerArr.push(new THREE.Vector2(rect[i], rect[i + 1]));
- } // 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])]
- points = cornerArr.map(function (uv) {
- var dir = getDirByUV(uv, shape.pano);
- return dir.add(shape.pano.position);
- });
- color = "#".concat(_construct(THREE.Color, _toConsumableArray(shape.color.map(function (t) {
- return t / 255;
- }))).getHexString());
- } else {
- labelPoint = shape.editJson.labelPoint;
- points = shape.editJson.list[0].points;
- color = shape.editJson.color;
- }
- var drawData = {
- color,
- panoId: shape.pano.id,
- labelPoint,
- name: ((_shape$editJson = shape.editJson) === null || _shape$editJson === void 0 ? void 0 : _shape$editJson.name) || shape.name,
- type: ((_shape$editJson2 = shape.editJson) === null || _shape$editJson2 === void 0 ? void 0 : _shape$editJson2.type) || '',
- list: [{
- /* "shapeIndexes": [ 4, 0, 1, ], */
- points: points
- }],
- sid: shape.sid,
- //‘pano0-’ ----以后修改后直接保存这个数据,加载的AI每个shape需要有一个sid,能和这个一一对应,否则修改一个就要保存全部画笔数据,下次不加载AI
- isLose: 0
- };
- return drawData;
- }
- 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); }; }
- 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; } }
- var Scene = /*#__PURE__*/function (_Emiter) {
- _inherits(Scene, _Emiter);
- var _super = _createSuper$D(Scene);
- function Scene(app) {
- var _this;
- _classCallCheck(this, Scene);
- _this = _super.call(this);
- _this.app = app;
- _this.ready = false;
- _this.loaded = false;
- _this.locked = null;
- _this.lastAiBoxState = [];
- _this.Decoration = new Decoration(_assertThisInitialized(_this));
- _this.on('ready', function () {
- return _this.ready = true;
- });
- _this.on('loaded', function () {
- _this.loaded = true;
- var videoRenderer = _this.app.core.get('PanoVideoRenderer');
- videoRenderer.on(PanoRendererEvents.CanPlayVideo, function () {
- return _this.emit(PanoRendererEvents.CanPlayVideo);
- });
- videoRenderer.on(PanoRendererEvents.StartPlay, function () {
- return _this.emit(PanoRendererEvents.StartPlay);
- });
- videoRenderer.on(PanoRendererEvents.SuspendRender, function () {
- return _this.emit(PanoRendererEvents.SuspendRender);
- });
- videoRenderer.on(PanoRendererEvents.ResumeRender, function () {
- return _this.emit(PanoRendererEvents.ResumeRender);
- });
- _this.app.store.getValue('metadata');
- if (browser$1.valueFromUrl('ai') == 'ids') {
- _this.aiBox = new PanoBoxFrame(_this.app.core.get('Player'));
- } else if (browser$1.valueFromUrl('ai') == 'sds') {
- _this.aiBox = new PanoBoxFrame(_this.app.core.get('Player'), true);
- } else if (browser$1.valueFromUrl('ai') == 'toDraw') {
- _this.aiBox = new PanoBoxDrawAI(_this.app, _this.app.core.get('Player'), true);
- } else {
- // const metadata = this.app.store.getValue('metadata')
- // let create = metadata.hasRecognition && (!this.app.config.view || metadata.controls.showAi)
- // if (create) {
- // //展示页要点击按钮才显示,编辑页面如果勾选了就显示
- // let show = !this.app.config.view && metadata.controls.showAi
- // this.aiBox = new PanoBoxFrameAI(this.app.core.get('Player'), true, show) //ai-box.set-display切换显示
- // }
- _this.aiBox = new PanoBoxDrawAI(_this.app, _this.app.core.get('Player'), true);
- }
- _this.lastAiBoxState.forEach(function (e) {
- var _this2;
- return (_this2 = _this).setAiBoxShow.apply(_this2, _toConsumableArray(e));
- }); //update
- _this.lastAiBoxState.length = 0;
- if (!_this.app.config.view) {
- var atVSetting = function atVSetting(e) {
- //进出设置-可视化设置
- app.TagManager.switchLabels({
- type: 'aiList',
- visible: !!e
- }, null, 'atVSetting');
- };
- _this.on('aiTagEvent', atVSetting);
- atVSetting(false);
- }
- });
- return _this;
- }
- _createClass(Scene, [{
- key: "setAiBoxShow",
- value: function setAiBoxShow(visible, reason, level) {
- //编辑页,只在设置页面展示AIBox. 比开关优先级高
- //console.log('setAiBoxShow',visible, reason, level,this.loaded)
- if (!this.loaded) {
- return this.lastAiBoxState.push([visible, reason, level]);
- }
- this.aiBox && common$1.updateVisible(this.aiBox, reason, visible, level);
- }
- /**
- * 获取所有点位信息
- */
- }, {
- key: "panos",
- get: function get() {
- return this.app.core.get('Player').model.panos;
- }
- /**
- * 获取当前点位id
- */
- }, {
- key: "panoId",
- get: function get() {
- return this.app.core.get('Player').currentPano.id;
- }
- }, {
- key: "floors",
- get: function get() {
- return this.app.core.get('Player').model.floors;
- }
- /**
- * 获取当前点位楼层id
- */
- }, {
- key: "floorId",
- get: function get() {
- return this.app.core.get('Player').currentPano.floorIndex;
- }
- /**
- * 获取当前楼层id
- */
- }, {
- key: "currentFloorId",
- get: function get() {
- return this.app.core.get('Player').model.currentFloor.floorIndex;
- }
- /**
- * 获取点位数量
- */
- }, {
- key: "panoCount",
- get: function get() {
- return this.app.core.get('Player').model.panos.list.length;
- }
- /**
- * 获取球幕视频数量
- */
- }, {
- key: "videoCount",
- get: function get() {
- var videos = this.app.store.getValue('metadata').videos;
- if (!videos || !videos.data || !videos.data.length) {
- return 0;
- }
- return videos.data.length;
- }
- /**
- * 获取球幕视频列表
- */
- }, {
- key: "videoList",
- get: function get() {
- var videos = this.app.store.getValue('metadata').videos;
- if (!videos || !videos.data || !videos.data.length) {
- return [];
- }
- return videos.data.map(function (item) {
- return item.id;
- });
- }
- /**
- * 判断当时点位是否有球幕视频
- */
- }, {
- key: "isCurrentPanoHasVideo",
- get: function get() {
- return this.app.core.get('Player').currentPano.hasVideo;
- }
- }, {
- key: "whenReady",
- value: function whenReady(callback) {
- var _this3 = this;
- var func = function func(resolve) {
- resolve();
- if (typeof callback === 'function') {
- callback();
- }
- };
- return new Promise(function (resolve) {
- if (_this3.ready) {
- func(resolve);
- } else {
- _this3.once('ready', function () {
- return func(resolve);
- });
- }
- });
- }
- }, {
- key: "whenLoaded",
- value: function whenLoaded(callback) {
- var _this4 = this;
- var func = function func(resolve) {
- resolve();
- if (typeof callback === 'function') {
- callback();
- }
- };
- return new Promise(function (resolve) {
- if (_this4.loaded) {
- func(resolve);
- } else {
- _this4.once('loaded', function () {
- return func(resolve);
- });
- }
- });
- }
- /**
- * 显示俯视图
- */
- }, {
- key: "showFloorCadImage",
- value: function showFloorCadImage() {
- this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(true);
- }
- /**
- * 隐藏俯视图
- */
- }, {
- key: "hideFloorCadImage",
- value: function hideFloorCadImage() {
- var _this5 = this;
- if (this.app.core.get('Player')) {
- this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(false);
- } else {
- setTimeout(function () {
- _this5.hideFloorCadImage();
- }, 100);
- }
- }
- /**
- * 设置地面logo大小
- */
- }, {
- key: "setFloorLogo",
- value: function setFloorLogo() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (!this.ready) {
- return;
- }
- this.app.core.get('Player').model.floorLogos.changeFloorLogo(options);
- }
- /**
- * 跳转楼层
- * @param {*} id 楼层Id
- *
- */
- }, {
- key: "gotoFloor",
- value: function gotoFloor(id) {
- if (id == 'all') {
- this.app.core.get('Player').model.toggleAllFloors(!0);
- } else {
- var t = parseInt(id) - this.app.core.get('Player').model.currentFloor.floorIndex;
- this.app.core.get('Player').changeFloor(t);
- }
- this.app.core.get('Player').model.currentFloorId = id;
- }
- /**
- * 暂停加载资源
- */
- }, {
- key: "lock",
- value: function lock() {
- this.locked = Deferred$1();
- }
- /**
- * 恢复加载资源
- */
- }, {
- key: "unlock",
- value: function unlock() {
- if (this.locked) {
- this.locked.resolve();
- this.locked = null;
- }
- }
- /**
- * 显示标尺
- */
- }, {
- key: "showRule",
- value: function showRule() {
- this.app.core.get('Player').model.wallManager.switchDisplay(true);
- }
- /**
- * 隐藏标尺
- */
- }, {
- key: "hideRule",
- value: function hideRule() {
- this.app.core.get('Player').model.wallManager.switchDisplay(false);
- }
- }]);
- return Scene;
- }(tinyEmitter);
- var MinMap = /*#__PURE__*/function () {
- function MinMap(app) {
- _classCallCheck(this, MinMap);
- this.app = app;
- this.plugin = null;
- this.display = null;
- this.hidden = false;
- this.deferred = Deferred$1();
- }
- _createClass(MinMap, [{
- key: "install",
- value: function install(plugin) {
- this.plugin = plugin;
- this.deferred.resolve(this.plugin);
- }
- }, {
- key: "use",
- value: function use() {
- if (this.plugin) {
- return Promise.resolve(this.plugin);
- } else {
- return this.deferred;
- }
- }
- }, {
- key: "show",
- value: function show(force) {
- var _this = this;
- this.display = true;
- if (force) {
- this.hidden = false;
- }
- if (this.hidden) {
- return Promise.resolve();
- }
- return this.use().then(function () {
- return _this.plugin.show();
- });
- }
- }, {
- key: "hide",
- value: function hide(force) {
- var _this2 = this;
- this.display = false;
- if (force) {
- this.hidden = true;
- }
- return this.use().then(function () {
- return _this2.plugin.hide();
- });
- }
- }, {
- key: "reload",
- value: function reload() {
- var _this3 = this;
- return this.use().then(function () {
- return _this3.plugin.data(true);
- });
- }
- }]);
- return MinMap;
- }();
- var DataSYNC = /*#__PURE__*/function () {
- function DataSYNC(app) {
- _classCallCheck(this, DataSYNC);
- this.app = app;
- }
- _createClass(DataSYNC, [{
- key: "use",
- value: function () {
- var _use = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(name, data) {
- var cad;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _context.next = 2;
- return this.app.CadManager.use();
- case 2:
- cad = _context.sent;
- cad.sync.use(name, data);
- case 4:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function use(_x, _x2) {
- return _use.apply(this, arguments);
- }
- return use;
- }()
- }]);
- return DataSYNC;
- }();
- 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); }; }
- 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; } }
- var _render = /*#__PURE__*/_classPrivateFieldKey("render");
- var ObjectManager = /*#__PURE__*/function (_Emiter) {
- _inherits(ObjectManager, _Emiter);
- var _super = _createSuper$C(ObjectManager);
- function ObjectManager(app) {
- var _this;
- _classCallCheck(this, ObjectManager);
- _this = _super.call(this);
- Object.defineProperty(_assertThisInitialized(_this), _render, {
- value: _render2
- });
- _this.app = app;
- _this.marks = [];
- _this.player = null;
- _this.enable = true;
- _this.app.Scene.on('ready', function () {
- _this.player = _this.app.core.get('Player');
- _this.player.on(PlayerEvents.ViewChanged, _classPrivateFieldBase(_assertThisInitialized(_this), _render)[_render].bind(_assertThisInitialized(_this)));
- });
- return _this;
- }
- _createClass(ObjectManager, [{
- key: "add",
- value: function add(mark) {
- if (!mark || !mark.position) {
- return;
- }
- mark.position = new THREE.Vector3(mark.position.x, mark.position.y, mark.position.z);
- mark.position.y = -1;
- this.marks.push(mark);
- }
- }, {
- key: "filter",
- value: function filter(func) {}
- }]);
- return ObjectManager;
- }(tinyEmitter);
- function _render2() {
- var _this2 = this;
- var marks = this.marks || [];
- if (marks.length) {
- var mode = this.player.mode;
- var floorId = this.player.model.currentFloor.floorIndex;
- marks.forEach(function (item) {
- if (!item.position) {
- return;
- }
- var result = convertTool.getPos2d(item.position, _this2.player);
- if (!result.trueSide) {
- item.visible = false;
- return;
- }
- if (convertTool.ifShelter(item.position, _this2.player, {
- x: result.vector.x,
- y: result.vector.y
- }, null, _this2.player.model.allFloorsVisible ? null : floorId)) {
- item.visible = false;
- return;
- }
- if (item.mode && item.mode != mode) {
- item.visible = false;
- return;
- }
- if (item.floorId != void 0 && item.floorId != floorId) {
- item.visible = false;
- return;
- } // let scale = (this.player.domElement.clientWidth * (1 / 50)) / Math.abs(this.player.cameraControls.activeControl.camera.left)
- // item.scale = THREE.MathUtils.clamp(scale, 0.4, 3)
- item.x = result.pos.x;
- item.y = result.pos.y;
- item.visible = true;
- });
- this.emit('render', {
- marks,
- mode,
- floorId
- });
- }
- }
- 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); }; }
- 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; } }
- var BoxVideo = /*#__PURE__*/function () {
- function BoxVideo(app) {
- var _this = this;
- _classCallCheck(this, BoxVideo);
- this.getOverlayBySid = function (sid) {
- var player = _this.app.core.get('Player');
- var overlay = player.OverlayManager.list.find(function (overlay) {
- return overlay.sid == sid;
- });
- if (!overlay) overlay = player.OverlayManager.list[0], console.warn('无效sid:', sid, overlay);
- return overlay;
- };
- this.app = app;
- this.edit = {};
- this.deferred = Deferred$1();
- var _player = null;
- this.app.Scene.on('loaded', function () {
- _player = _this.app.core.get('Player');
- _player.EditOverlay = new EditOverlay(_player);
- _player.OverlayManager = new OverlayManager(_player); // player.model.createTranControl(player)
- _this.deferred.resolve();
- _this.app.Scene.emit('BoxVideo.loaded');
- }); // 进入“添加视频”时执行
- this.edit.enter = function () {
- // 等到EditOverlay初始化才能enter
- _this.waitOverlayManager(function () {
- var init = function init() {
- if (!_player.EditOverlay.transformControls) {
- _player.EditOverlay.init();
- } else {
- _player.EditOverlay.enter();
- }
- setTimeout(function () {
- // 进入添加视频后,自动跳转向boxvideo(需要setTimeout一下,否则刷新后从floorplan切换过来会卡在checkAndWaitForPanoLoad)
- var overlay = _player.OverlayManager.decoratePlaneGroup.children.filter(function (overlay) {
- return overlay.overlayType == 'video';
- })[0];
- overlay && _player.OverlayManager.clickOverlay(overlay, {
- dontEmit: true
- });
- }, 0);
- };
- if (_player.model.mode == 'panorama') init();else _this.app.Camera.once('mode.afterChange', init);
- }, _this.edit.enter.bind(_this));
- }; // 离开“添加视频”时执行
- this.edit.exit = function () {
- _player && _player.EditOverlay.leave();
- }; // 保存数据(info:{data: VideoInfoJson, done(): 保存成功时执行,更新可撤销数据})
- this.edit.save = function (type, done) {
- var info;
- try {
- info = _player.EditOverlay.getOverlaySavingInfo();
- } catch (error) {
- console.error(error);
- }
- if (type === 'save') {
- _player.modelSideManager.recover();
- }
- return info;
- }; // 撤销未保存的数据
- this.edit.undoEdit = function () {
- _player.EditOverlay.undoEdit();
- _player.modelSideManager.recover();
- }; // 开始视频位置的选择
- this.edit.add = function () {
- _player.EditOverlay.beginToAddPlane();
- _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- _player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
- }; // 上传视频(file:VueComponent,media:HTMLVideoElement | HTMLImageElement)
- this.edit.upload = function (file, media) {
- if (media.videoWidth || media.width) {
- _player.EditOverlay.overlayUploaded(file, media);
- } else {
- media.onloadedmetadata = function () {
- _player.EditOverlay.overlayUploaded(file, media);
- };
- }
- }; // 删除视频(delFunc:删除成功时执行,从3d中删除视频)
- this.edit.delete = function (sid, delFunc) {
- var overlay = _this.getOverlayBySid(sid);
- _player.EditOverlay.DeleteOverlay(overlay, delFunc);
- }; // 看向3d视频
- this.edit.lookAt = function (sid) {
- var overlay = _this.getOverlayBySid(sid);
- _player.OverlayManager.clickOverlay(overlay, {
- dontEmit: true
- });
- }; // 看向并选中3d视频
- this.edit.select = function (sid) {
- var overlay = _this.getOverlayBySid(sid);
- _player.OverlayManager.clickOverlay(overlay);
- _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- _player.modelSideManager.tempAuto();
- }; // 取消选中(隐藏控制柄)
- this.edit.unselect = function () {
- var overlay = _player.EditOverlay.editPlane;
- if (overlay) {
- overlay.raycastToFindFloor();
- overlay.updateVisibleOnFloor();
- _player.EditOverlay.controlSelectOverlay(null);
- _player.EditOverlay.editPlane = null;
- }
- _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.showCadPlane(); // 显示户型图
- _player.emit('endEditOverlay');
- }; // 设置显隐(isShow:true / false)
- this.edit.setVisible = function (sid, isShow) {
- var overlay = _this.getOverlayBySid(sid);
- isShow ? overlay.show('forceHide') : overlay.hide('forceHide');
- if (!_player.EditOverlay.editPlane) return;
- _player.EditOverlay.controlSelectOverlay(overlay.visible ? overlay : null);
- }; // 左右翻转
- this.edit.reverse = function (isReverse) {
- var overlay = _player.EditOverlay.editPlane;
- overlay.scale.x = Math.abs(overlay.scale.x) * (isReverse ? -1 : 1); // 需要更新visible 虽然不知道为什么,但不更新的话可见按钮就失效
- //overlay.info.reverse = !overlay.info.reverse
- /* let infoCopy = JSON.parse(JSON.stringify(overlay.info))
- infoCopy.sid = overlay.sid
- infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide')
- this.app.VideoManager.emit('videos/panel/display', infoCopy) */
- }; // 切换控制柄的类型(index:0(平移) / 1(缩放) / 2(旋转))
- this.edit.transfrom = function (index) {
- if (!_player.EditOverlay.editing) return;
- var transformControls = _player.EditOverlay.transformControls;
- setTimeout(function () {
- transformControls.mode = index == 0 ? 'translate' : index == 1 ? 'scale' : 'rotate';
- var overlay = _player.EditOverlay.editPlane;
- overlay.visible && overlay.frame.switchTranformControls(transformControls);
- }, 0);
- }; // 设置视频的宽高(type:'W' / 'H')
- this.edit.setPlaneWH = function (type, newData) {
- var overlay = _player.EditOverlay.editPlane;
- newData.value = THREE.MathUtils.clamp(newData.value, newData.min, newData.max);
- if (type == 'W') {
- overlay.scale.x *= newData.value / overlay.width;
- overlay.width = newData.value;
- }
- if (type == 'H') {
- overlay.scale.y *= newData.value / overlay.height;
- overlay.height = newData.value;
- } // player.EditOverlay.useImgRatio() //自适应比例
- overlay.frame && overlay.frame.update({
- mode: 'scale'
- });
- return newData.value;
- }; // 设置视频的厚度(data:{value, min, max})
- this.edit.setThinkness = function (data) {
- var overlay = _player.EditOverlay.editPlane;
- data.value = THREE.MathUtils.clamp(data.value, data.min, data.max);
- if (overlay.frame) {
- overlay.depth = data.value / 100;
- overlay.frame.setFrameThickness(overlay.depth);
- } else {
- if (data.value == 0) {
- overlay.addBox(false);
- overlay.depth = 0.001;
- overlay.scale.z = 0.001;
- } else {
- overlay.addBox(true);
- overlay.depth = data.value / 100;
- overlay.scale.z = data.value / 100 / settings$3.overlay.depth;
- }
- return data.value;
- }
- }; // 仅恢复视频的原始宽高比例和厚度
- this.edit.resetRatio = function () {
- var overlay = _player.EditOverlay.editPlane;
- if (overlay.overlayType) {
- // this.edit.setThinkness({ value: overlay.info.depth, min: 0, max: overlay.info.depth })
- overlay.width /= overlay.scale.x;
- overlay.height /= overlay.scale.y;
- overlay.scale.setX(1);
- overlay.scale.setY(1);
- _player.EditOverlay.updateOverlayScaleDisplay(); // player.EditOverlay.VideoManager.emit('videos/panel/changeDepth', 0)
- _player.EditOverlay.useImgRatio();
- overlay.frame && overlay.frame.update({
- mode: 'scale'
- });
- }
- };
- this.edit.getCurentPanoVisi = function () {
- return _player.OverlayManager.list.filter(function (overlay) {
- return overlay.visiblePanos.find(function (pano) {
- return pano == _player.currentPano;
- });
- });
- }; // 设置空间视频边框
- this.edit.setOverlayFrame = function (frameData) {
- var overlay = _player.EditOverlay.editPlane;
- overlay.addFrame(frameData.type);
- if (overlay.visible) {
- // 更新transformControls
- var transformControls = _player.EditOverlay.transformControls;
- if (overlay.frame) overlay.frame.switchTranformControls(transformControls);else transformControls.attach(overlay);
- }
- /* // 需要更新visible、depth、frameType
- let infoCopy = JSON.parse(JSON.stringify(overlay.info))
- infoCopy.sid = overlay.sid
- infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide') //infoCopy.hide = !overlay.visible
- infoCopy.depth = overlay.depth
- infoCopy.frameType = overlay.frame.type
- this.app.VideoManager.emit('videos/panel/display', infoCopy) */
- }; // 限制仅当前pano可视
- this.edit.limitToCurrentPano = function (shouldLimit) {
- var overlay = _player.EditOverlay.editPlane;
- /*overlay.limitToOnlyPano = !!shouldLimit // 先标识为true,等保存时确定pano */
- overlay.limitToOnlyPano = shouldLimit ? _player.currentPano : false;
- overlay.show('limitToOnlyPano'); //无论开关,当前点都是可见的
- };
- }
- _createClass(BoxVideo, [{
- key: "showAll",
- value: function showAll() {
- var _this2 = this;
- this.waitOverlayManager(function () {
- var player = _this2.app.core.get('Player');
- player.OverlayManager.setGroupVisible(true);
- }, this.showAll.bind(this));
- }
- }, {
- key: "hideAll",
- value: function hideAll() {
- var _this3 = this;
- this.waitOverlayManager(function () {
- var player = _this3.app.core.get('Player');
- player.OverlayManager.setGroupVisible(false);
- }, this.hideAll.bind(this));
- }
- }, {
- key: "waitOverlayManager",
- value: function waitOverlayManager(func, waitFunc) {
- var player = this.app.core.get('Player');
- if (player && player.OverlayManager && player.EditOverlay) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- /**
- * 是否可操作
- * @param {boolean} enable 标识参数
- */
- }, {
- key: "operable",
- value: function operable(enable) {
- var player = this.app.core.get('Player');
- if (player.OverlayManager) {
- player.OverlayManager.list.forEach(function (overlay) {
- var layer = enable ? RenderLayers.DEFAULT : RenderLayers.RETICULE;
- overlay.layers.set(layer);
- overlay.children.forEach(function (mesh) {
- return mesh.layers.set(layer);
- });
- });
- }
- }
- }]);
- return BoxVideo;
- }();
- var VideoManager = /*#__PURE__*/function (_Emiter) {
- _inherits(VideoManager, _Emiter);
- var _super = _createSuper$B(VideoManager);
- function VideoManager(app) {
- var _this4;
- _classCallCheck(this, VideoManager);
- _this4 = _super.call(this);
- _this4.BoxVideo = new BoxVideo(app);
- return _this4;
- }
- return VideoManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var RepairManager = /*#__PURE__*/function (_Emiter) {
- _inherits(RepairManager, _Emiter);
- var _super = _createSuper$A(RepairManager);
- function RepairManager(app) {
- var _this;
- _classCallCheck(this, RepairManager);
- _this = _super.call(this);
- _this.app = app;
- _this.edit = {};
- _this.mosaic = Deferred$1();
- _this.mosaics = [];
- var player;
- var deferred = Deferred$1();
- _this.app.Scene.on('loaded', function () {
- _this.mosaics = _this.app.store.getValue('metadata').mosaicList || [];
- player = _this.app.core.get('Player');
- deferred.resolve();
- }); // 看向球幕视频
- _this.edit.focusVideo = function (panoId) {
- var pano = player.model.panos.index[panoId];
- if (player.flying) {
- //player.waitFlytoItemFuc = () => {}
- player.once('flying.ended', function () {
- _this.edit.focusVideo(panoId);
- });
- return;
- }
- player.flyToPano({
- pano
- }, function () {});
- };
- /**
- * 涂抹效果
- */
- // 开始涂抹
- _this.edit.startPaint = function () {
- player.flyToNewMode({
- mode: 'panorama',
- pano: player.currentPano,
- callback: function callback() {
- player.paintEditor.start();
- player.OverlayManager.hide('all'); //box视频
- player.viewLinkManager.hideAllViews(); //场景关联
- }
- });
- }; // 退出涂抹
- _this.edit.cancelPaint = function () {
- player.paintEditor.cancel();
- player.OverlayManager.show('all');
- player.viewLinkManager.showAllViews();
- }; // 选择笔刷 0:橡皮 1:马赛克 2:高斯模糊
- _this.edit.selectBrush = function (type) {
- player.paintEditor.changeBrush(type);
- }; // 设置笔刷大小
- _this.edit.setBrushSize = function (size) {
- player.paintEditor.setBrushSize(size);
- }; // 保存涂抹
- _this.edit.savePaint = function () {
- return player.paintEditor.save();
- }; // 删除涂抹
- _this.edit.deletePaint = function (panoId) {
- player.paintEditor.paintData = player.paintEditor.paintData.filter(function (data) {
- return data.panoId != panoId;
- });
- if (player.currentPano.id == panoId) {
- player.paintEditor.updatePanoPaint(panoId, panoId);
- }
- }; // 检查是否涂抹过
- _this.edit.checkPaintEdit = function () {
- return player.paintEditor.hasEdit;
- };
- return _this;
- }
- _createClass(RepairManager, [{
- key: "install",
- value: function install(name, plugin) {
- if (this[name]) {
- this[name].resolve(plugin);
- }
- }
- }]);
- return RepairManager;
- }(tinyEmitter);
- var MeshDraw = {
- getShape: function getShape(shapes, holes) {
- //不一定闭合 暂时所有shapes共享holes。如果要单独的话, shapes改为[{shape:[],holes:[]},{}]的形式
- if (shapes[0] && !(shapes[0] instanceof Array)) {
- //仅是一个shape的点
- shapes = [shapes];
- }
- var holesArr = [];
- if (holes) {
- //挖空
- holes.forEach(function (points) {
- var holePath = new THREE.Path();
- holePath.moveTo(points[0].x, points[0].y);
- for (var i = 1, len = points.length; i < len; i++) {
- holePath.lineTo(points[i].x, points[i].y);
- }
- holesArr.push(holePath);
- });
- }
- var shapesArr = shapes.map(function (points) {
- var _shape$holes;
- var shape = new THREE.Shape();
- shape.moveTo(points[0].x, points[0].y);
- for (var i = 1, len = points.length; i < len; i++) {
- shape.lineTo(points[i].x, points[i].y);
- }
- (_shape$holes = shape.holes).push.apply(_shape$holes, holesArr);
- shape.dontClose = points.dontClose; //add 有的shape不需要闭合
- return shape;
- });
- return shapesArr;
- },
- getShapeGeo: function getShapeGeo(shapes, holes) {
- //获取任意形状(多边形或弧形)的形状面 //quadraticCurveTo() 这是弧形的含函数
- var geometry = new THREE.ShapeBufferGeometry(this.getShape(shapes, holes)); //ShapeGeometry
- /* var matrix = new THREE.Matrix4();//将竖直的面变为水平
- matrix.set(//z = y
- 1, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 1
- )
- geometry.applyMatrix(matrix) */
- //geometry.computeVertexNormals();//对于光照需要的是点法线
- return geometry;
- },
- lessCurvePoints: function lessCurvePoints(points, oldCount) {
- var minRad = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;
- var UtoTMapArr = arguments.length > 3 ? arguments[3] : undefined;
- //减少点数(拐弯的部分紧凑些,直线部分宽松些):
- var count = points.length;
- var newUtoTMapArr = [];
- var newPoints = [];
- var lastVec;
- performance.now();
- /* if(UtoTMapArr){
- for(let n=1;n<oldCount-1;n++){
- pointIndexs.push( UtoTMapArr.findIndex(e=>e>= n / (oldCount-1) ) )
- }
- } */
- //console.log('cost dur:', performance.now() - startTime )
- var nextUtoTIndex = 1;
- for (var i = 0; i < count; i++) {
- var point = points[i];
- points[i - 1];
- var next = points[i + 1];
- if (i == 0 || i == count - 1) {
- newPoints.push(point); //直接加入
- UtoTMapArr && newUtoTMapArr.push(i == 0 ? 0 : 1);
- } else {
- var curVec = new THREE.Vector3().subVectors(next, point);
- if (!lastVec) lastVec = curVec;
- if (i > 1) {
- // 和上一个加入点的vec之间的夹角如果过大就加入
- var reachNextUToT = void 0; //找出新点中对应原先控制点的index,这些点必须加入拐点,否则会出现控制点偏移path(当它所在部分接近直线时)
- if (UtoTMapArr) {
- while (UtoTMapArr[i] > nextUtoTIndex / (oldCount - 1)) {
- //可能多个控制点对应一个点,当控制点很近时
- reachNextUToT = true;
- nextUtoTIndex++;
- }
- }
- if (
- /* pointIndexs.includes(i) || */
- reachNextUToT || curVec.angleTo(lastVec) > minRad) {
- //最小角度 (注意原始点不能太稀疏)
- newPoints.push(point);
- UtoTMapArr && newUtoTMapArr.push(UtoTMapArr[i]);
- lastVec = curVec;
- }
- }
- }
- }
- return {
- newUtoTMapArr,
- newPoints
- };
- },
- getExtrudeGeo: function getExtrudeGeo(shapes, holes) {
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
- openEnded: false,
- shapeDontClose: false
- };
- //获得挤出棱柱,可以选择传递height,或者extrudePath
- var shape = this.getShape(shapes, holes); //points是横截面 [vector2,...]
- if (options.extrudePath) {
- // 路径 :[vector3,...]
- var length = options.extrudePath.reduce(function (total, currentValue, currentIndex, arr) {
- if (currentIndex == 0) return 0;
- return total + currentValue.distanceTo(arr[currentIndex - 1]);
- }, 0); //options.extrudePath = new THREE.CatmullRomCurve3(options.extrudePath)
- if (options.extrudePath.length == 2) {
- options.tension = 0; //否则一端扭曲
- options.steps = 1;
- }
- {
- //去掉重复的点
- var path = [];
- var minDis = options.dontSmooth ? 0 : 0.2; //CatmullRomCurve3 经常扭曲,如果两个点靠得很近可能会扭曲,这里去除靠的太近的点。但去除后依旧会出现一定扭曲.
- options.extrudePath.forEach(function (p, i) {
- if (i == 0 || i == options.extrudePath.length - 1) return path.push(p); //首尾直接加入
- var last = path[path.length - 1]; //和上一个比
- var dis = last.distanceTo(p);
- if (dis <= minDis) {
- 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"));
- } else if (i == options.extrudePath.length - 2) {
- //因为最后一个必定加入,所以倒数第二个还也不能太靠近最后一个
- last = options.extrudePath[options.extrudePath.length - 1]; //和下一个(最后一个比)
- if (dis <= minDis) {
- 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"));
- } else {
- path.push(p);
- }
- } else {
- path.push(p);
- }
- });
- options.extrudePath = path;
- }
- if (!options.dontSmooth) {
- //平滑连续的曲线(但经常会有扭曲的问题,tension:0能缓解, 另外shape和path都最好在原点附近,也就是点需减去bound.min )
- options.extrudePath = new THREE.CatmullRomCurve3(options.extrudePath, options.closed, 'catmullrom'
- /* 'centripetal' */
- , options.tension); //tension:张力, 越大弯曲越大。 随着长度增长,该值需要减小,否则会扭曲
- if (options.lessPoints !== false) {
- //曲线但压缩直线部分点数量
- options.extrudePath.UtoTMapArr = []; //用于存储 getSpacedPoints得到的点对应points的百分比对应
- var count = Math.max(2, Math.round(length * (options.lessSpace || 200))); //为了防止有大拐弯才设置这么高
- var points = options.extrudePath.getSpacedPoints(count - 1); //拆分为更密集的点
- var result = this.lessCurvePoints(points, options.extrudePath.points.length, options.minRad, options.extrudePath.UtoTMapArr); //传UtoTMapArr的话点太多了卡住了
- //options.extrudePath = points
- options.extrudePath = result.newPoints;
- options.dontSmooth = true;
- }
- }
- if (options.dontSmooth) {
- var curvePath = new THREE.CurvePath(); //通用的曲线路径对象,它可以包含直线段和曲线段。在这里只做折线
- curvePath.points = options.extrudePath; //add
- for (var i = 0; i < options.extrudePath.length - 1; i++) {
- var curve3 = new THREE.LineCurve3(options.extrudePath[i], options.extrudePath[i + 1]); //添加线段
- curvePath.add(curve3);
- }
- options.steps = options.extrudePath.length - 1;
- options.extrudePath = curvePath;
- options.tension = 0; //已修改过three,原本会平分细分,现在dontSmooth时会直接按照控制点来分段
- }
- }
- var extrudeSettings = $.extend(options, {
- steps: options.steps != void 0 ? options.steps : options.extrudePath ? Math.round(length / (options.spaceDis || 0.2)) : 1,
- //分成几段 spaceDis每段长度
- bevelEnabled: false //不加的话,height为0时会有圆弧高度
- //openEnded默认false
- });
- var geometry = new THREE.ExtrudeBufferGeometry(shape, extrudeSettings); //修改了three.js文件, buildLidFaces处,创建顶底面加了选项,可以选择开口。
- return geometry;
- /* tension = 0:曲线会变成一条直线,没有弯曲。
- tension = 0.5:曲线会经过所有控制点,并保持自然的弯曲。
- tension > 0.5:曲线会更平滑,远离控制点之间的路径。
- tension < 0.5:曲线会更贴近控制点之间的路径,弯曲更明显。 */
- },
- getUnPosPlaneGeo: function () {
- //获取还没有赋值位置的plane geometry
- var e = new Uint16Array([0, 1, 2, 0, 2, 3]),
- // , t = new Float32Array([-.5, -.5, 0, .5, -.5, 0, .5, .5, 0, -.5, .5, 0])
- i = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),
- g = new THREE.BufferGeometry();
- g.setIndex(new THREE.BufferAttribute(e, 1)), //g.addAttribute("position", new n.BufferAttribute(t, 3)),
- g.setAttribute('uv', new THREE.BufferAttribute(i, 2));
- return function () {
- return g;
- };
- }(),
- getPlaneGeo: function getPlaneGeo(A, B, C, D) {
- var geo = this.getUnPosPlaneGeo().clone();
- 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))
- geo.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3));
- geo.computeVertexNormals();
- geo.computeBoundingSphere(); //for raycaster
- return geo;
- },
- drawPlane: function drawPlane(A, B, C, D, material) {
- var wall = new THREE.Mesh(this.getPlaneGeo(A, B, C, D), material);
- return wall;
- },
- movePlane: function movePlane(mesh, A, B, C, D) {
- 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]);
- mesh.geometry.addAttribute('position', new THREE.BufferAttribute(pos, 3));
- mesh.geometry.computeBoundingSphere(); //for checkIntersect
- },
- createGeometry: function createGeometry(posArr, faceArr, uvArr, normalArr) {
- //创建复杂mesh. faceArr:[[0,1,2],[0,2,3]]
- var geo = new THREE.BufferGeometry();
- var positions = [];
- posArr.forEach(function (p) {
- return positions.push(p.x, p.y, p.z);
- });
- geo.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
- if (faceArr) {
- var indice = [];
- faceArr.forEach(function (f) {
- return indice.push.apply(indice, _toConsumableArray(f));
- });
- geo.setIndex(indice); // auto set Uint16BufferAttribute or Uint32BufferAttribute
- }
- if (uvArr) {
- var uvs = [];
- uvArr.forEach(function (uv) {
- return uvs.push(uv.x, uv.y);
- });
- geo.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
- }
- if (normalArr) {
- var normals = [];
- normalArr.forEach(function (n) {
- return normals.push(n.x, n.y, n.z);
- });
- geo.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
- }
- /*
- geo.computeVertexNormals()
- geo.computeBoundingSphere() //for raycaster
- */
- return geo;
- },
- updateGeometry: function updateGeometry(geo, posArr, faceArr, uvArr, normalArr) {
- //创建复杂mesh. faceArr:[[0,1,2],[0,2,3]]
- var positions = [];
- posArr.forEach(function (p) {
- return positions.push(p.x, p.y, p.z);
- });
- geo.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
- geo.attributes.position.needsUpdate = true;
- if (faceArr) {
- var indice = [];
- faceArr.forEach(function (f) {
- return indice.push.apply(indice, _toConsumableArray(f));
- });
- geo.setIndex(indice); // auto set Uint16BufferAttribute or Uint32BufferAttribute
- }
- if (uvArr) {
- var uvs = [];
- uvArr.forEach(function (uv) {
- return uvs.push(uv.x, uv.y);
- });
- geo.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
- }
- if (normalArr) {
- var normals = [];
- normalArr.forEach(function (n) {
- return normals.push(n.x, n.y, n.z);
- });
- geo.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
- }
- /*
- geo.computeVertexNormals()
- */
- geo.computeBoundingSphere(); //for raycaster and visi
- return geo;
- }
- };
- 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); }; }
- 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; } }
- var getMeshQuaInPath = function getMeshQuaInPath(lineDir) {
- /* const quaBase = new THREE.Quaternion().setFromEuler(new THREE.Euler(-Math.PI/2, 0, 0 ))
- return convertTool.getQuaByAim(lineDir, new THREE.Vector3, new THREE.Vector3(1,0,0)).multiply(quaBase) */
- //怎么改都会有时不贴合
- var pitch = math$2.getPitchByDir(lineDir);
- var yaw = math$2.getYawByDir(lineDir);
- var rotation = new THREE.Euler();
- rotation.order = 'YXZ';
- rotation.z = pitch;
- rotation.y = yaw; // + Math.PI / 2
- return new THREE.Quaternion().setFromEuler(rotation);
- };
- var textureLoader = new THREE.TextureLoader();
- var getEndCaps = function () {
- var endCap, map;
- return function (path) {
- if (!endCap) {
- map = textureLoader.load(texture.getImageURL('images/whiteCircle.png'));
- map.anisotropy = 3;
- map.repeat.set(0.5, 1);
- var mesh = new THREE.Mesh(planeGeo$1);
- mesh.scale.x = 0.5;
- mesh.position.x = -0.25;
- mesh.rotation.set(-Math.PI / 2, 0, 0);
- endCap = new THREE.Object3D();
- endCap.add(mesh);
- mesh.renderOrder = RenderOrder.ribbon + 1;
- }
- var endCaps = [];
- var material = new THREE.MeshBasicMaterial({
- transparent: true,
- /* depthTest: false, */
- color: path.edgeColor,
- opacity: path.opacity,
- side: 0
- });
- material.map = map;
- material.wireframe = false;
- for (var i = 0; i < 2; i++) {
- var cap = endCap.clone();
- cap.children[0].material = material;
- path.add(cap);
- endCaps.push(cap);
- }
- return endCaps;
- };
- }();
- var planeGeo$1 = new THREE.PlaneBufferGeometry(1, 1);
- var voidGeometry = new THREE.BufferGeometry();
- var Path = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Path, _THREE$Object3D);
- var _super = _createSuper$z(Path);
- function Path() {
- var _this;
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- arrowColor = _ref.arrowColor,
- edgeColor = _ref.edgeColor,
- _ref$opacity = _ref.opacity,
- opacity = _ref$opacity === void 0 ? 0.5 : _ref$opacity;
- _classCallCheck(this, Path);
- _this = _super.call(this);
- _this.edgeColor = edgeColor, _this.opacity = opacity;
- var arrow_map = common$1.loadTextureFromCache(texture.getImageURL('images/arrow.png'));
- arrow_map.anisotropy = 2;
- arrow_map.wrapS = THREE.RepeatWrapping;
- arrow_map.repeat.set(10, 1.3);
- arrow_map.offset.set(0, -0.15);
- _this.edge = new THREE.Mesh(voidGeometry, new THREE.ShaderMaterial({
- uniforms: {
- map: {
- type: 't',
- value: arrow_map
- },
- opacity: {
- type: 'float',
- value: opacity
- },
- baseColor: {
- type: 'v3',
- value: edgeColor
- },
- mapColor: {
- type: 'v3',
- value: arrowColor
- }
- },
- defines: {
- UV_Transform: '',
- mapOverlay: ''
- },
- vertexShader: shaders.basicTextured.vertexShader,
- fragmentShader: shaders.basicTextured.fragmentShader,
- //depthWrite: !1,
- //depthTest: !1,
- transparent: true //side: THREE.DoubleSide,
- }));
- _this.add(_this.edge);
- _this.edge.renderOrder = RenderOrder.ribbon;
- _this.edge.name = 'pathEdge';
- _this.panos = [];
- _this.halfPathWidth = 0.15;
- _this.visible = false;
- return _this;
- }
- _createClass(Path, [{
- key: "setPanos",
- value: function setPanos(panos) {
- console.log('setPanos', panos.map(function (e) {
- return e.id;
- }));
- if (common$1.ifSame(this.panos, panos, [Panorama])) return;
- var geo;
- this.panos = panos;
- var points = panos.map(function (e) {
- return e.floorPosition.clone().add(new THREE.Vector3(0, 0.29 + 0.01 * Math.random(), 0));
- } //避免被地板遮住, 高度随机避免重叠
- );
- points = this.getDifferentPoint(points);
- var count = points.length;
- this.edge.geometry.dispose();
- this.points = points;
- if (count <= 1) {
- geo = voidGeometry;
- this.geoPoints = [];
- this.curve = null;
- this.visible = false;
- } else {
- this.visible = true;
- var curve = this.curve = new THREE.CatmullRomCurve3(points, false); //curve.UtoTMapArr = [] //用于存储 getSpacedPoints得到的点对应points的百分比对应
- var oldCount = count;
- count = Math.max(2, Math.round(this.getTotalDistance(points) * 200)), points = curve.getSpacedPoints(count - 1); //拆分为更密集的点
- var result = MeshDraw.lessCurvePoints(points, oldCount, 0.05
- /* , curve.UtoTMapArr */
- ); //this.UtoTMapArr = result.newUtoTMapArr
- points = result.newPoints;
- count = points.length;
- var posArr = [],
- faceArr = [],
- uvArr = [];
- var gatherLen = 0; //累加长度
- this.geoPoints = points; //根据点序列计算geometry
- for (var i = 0; i < count; i++) {
- var O = points[i]; //该点
- var A = points[i - 1]; //上一个点
- var B = points[i + 1]; //下一个点
- var O_ = new THREE.Vector2(O.x, O.z);
- var A_ = A && new THREE.Vector2(A.x, A.z);
- var B_ = B && new THREE.Vector2(B.x, B.z);
- var sideVec = void 0; //该点两边对应的向量
- var uvX = void 0;
- if (i == 0 || i == count - 1) {
- var nor = math$2.getNormal({
- points: [i == 0 ? B_ : O_, i == 0 ? O_ : A_]
- }) || new THREE.Vector3(1, 0, 0);
- sideVec = new THREE.Vector3(nor.x, 0, nor.y).multiplyScalar(this.halfPathWidth); //垂线
- uvX = i == 0 ? 0 : 1; //percent of length
- } else {
- var OA = new THREE.Vector3().subVectors(A, O).setY(0).normalize(); //只保证俯视角度正确。(如果两点有高度差,该段四个点不会在同一平面,看起来有扭转,有的地方会肥大,但从俯视角度看是正确的。)
- var OB = new THREE.Vector3().subVectors(B, O).setY(0).normalize();
- var angle = math$2.getAngle(OA, OB, 'y');
- if (math$2.closeTo(angle, 0, 1e-4) || math$2.closeTo(angle, Math.PI, 1e-4) || math$2.closeTo(angle, -Math.PI, 1e-4)) {
- //这时候直接加两个向量算出的平分线不准,故直接找垂线
- var _nor = math$2.getNormal({
- points: [O_, A_]
- }) || new THREE.Vector3(1, 0, 0);
- sideVec = new THREE.Vector3(_nor.x, 0, _nor.y).multiplyScalar(this.halfPathWidth); //垂线
- //console.log('接近0或180',angle, sideVec)
- } else {
- var midVecLength = this.halfPathWidth / Math.sin(angle / 2);
- sideVec = new THREE.Vector3().addVectors(OA, OB).normalize().multiplyScalar(midVecLength); //角平分线 ( 和上一个方向保持在同一侧,故而顺时针和逆时针方向不同 )
- }
- gatherLen += O.distanceTo(A);
- uvX = gatherLen / this.totalLength; //目前为止的长度占比
- }
- var P1 = new THREE.Vector3().addVectors(O, sideVec);
- var P2 = new THREE.Vector3().subVectors(O, sideVec);
- posArr.push(P1, P2);
- uvArr.push({
- x: uvX,
- y: 0
- }, {
- x: uvX,
- y: 1
- });
- if (i < count - 1) {
- faceArr.push([i * 2, i * 2 + 3, i * 2 + 1], [i * 2, i * 2 + 2, i * 2 + 3]); //每一段两个三角形 013 032
- }
- }
- geo = MeshDraw.createGeometry(posArr, faceArr, uvArr);
- this.updateArrowRepeat();
- this.updateEndCaps();
- }
- this.edge.geometry = geo; //this.lastHalfPathWidth = this.halfPathWidth
- //this.lastUpdatePoints_ = this.points.map(e=>e.clone())
- }
- }, {
- key: "getDifferentPoint",
- value: function getDifferentPoint(points) {
- //把连续一样的点去除
- var result = [];
- for (var i = 0; i < points.length; i++) {
- var _result;
- var p = points[i];
- if ((_result = result[result.length - 1]) !== null && _result !== void 0 && _result.equals(p)) continue;else result.push(p);
- }
- return result;
- }
- }, {
- key: "updateEndCaps",
- value: function updateEndCaps() {
- var _this2 = this;
- var len = this.points.length;
- var pts = this.geoPoints.length > 0 ? this.geoPoints : this.points;
- var len2 = pts.length;
- this.endCaps || (this.endCaps = getEndCaps(this)); //端点处的半圆
- this.endCaps.forEach(function (e, i) {
- //common.updateVisible(e, 'hasPoints', len>0)
- if (len) {
- if (len > 1) {
- var dir = i == 0 ? new THREE.Vector3().subVectors(pts[1], pts[0]) : new THREE.Vector3().subVectors(pts[len2 - 2], pts[len2 - 1]);
- e.quaternion.copy(getMeshQuaInPath(dir));
- } else {
- i == 0 ? e.quaternion.set(0, 0, 0, 1) : e.quaternion.set(0, 0, 1, 0); //两个半圆拼成一个圆点
- }
- e.position.copy(_this2.points[i == 0 ? 0 : len - 1]);
- var s = _this2.halfPathWidth * 2.15;
- e.scale.set(s, s, s);
- }
- });
- }
- }, {
- key: "updateArrowRepeat",
- value: function updateArrowRepeat() {
- var map = this.edge.material.uniforms.map.value;
- map.repeat.x = Math.round(this.totalLength / this.halfPathWidth * 0.5) * (this.reverse ? -1 : 1);
- map.needsUpdate = true; //this.edge.material.setUV():
- map.updateMatrix();
- this.edge.material.uniforms.uvTransform = {
- value: map.matrix.clone()
- };
- }
- }, {
- key: "getTotalDistance",
- value: function getTotalDistance(points) {
- if (this.panos.length === 0) {
- return 0;
- }
- var distance = 0;
- for (var i = 1; i < points.length; i++) {
- var prev = points[i - 1];
- var curr = points[i];
- var d = prev.distanceTo(curr);
- distance += d;
- }
- this.totalLength = distance;
- return distance;
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.parent.remove(this);
- this.edge.geometry.dispose();
- this.edge.material.dispose();
- this.dispatchEvent('disposed');
- }
- }]);
- return Path;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- var UA = window.navigator.userAgent;
- var AudioPlayer = /*#__PURE__*/function () {
- function AudioPlayer(app) {
- _classCallCheck(this, AudioPlayer);
- this.app = app;
- }
- _createClass(AudioPlayer, [{
- key: "add",
- value: function add(part, screencap) {
- if (part.audio) {
- this.remove(part);
- }
- var url = part.music;
- if (!part.music) {
- if (!screencap) {
- return;
- } else {
- //录制屏幕的时候即使没有音乐也要创建
- url = '';
- }
- }
- part.audio = new Howl({
- preload: true,
- src: [this.app.resource.getUserResourceURL(url, true)],
- loop: false,
- html5: screencap ? false : UA.indexOf('VivoBrowser') != -1 ? false : true,
- //兼容vivo原生浏览器导览音乐不能播放
- format: ['mp3'],
- onloaderror(id, err) {
- console.log(id, err);
- },
- onplayerror: function onplayerror(e) {
- console.log(e);
- },
- onload() {}
- });
- part.audio.on('play', function () {});
- part.audio.on('end', function () {
- if (screencap) {
- part.audio.play();
- part.audio.pause();
- }
- });
- }
- }, {
- key: "remove",
- value: function remove(part) {
- if (part.audio) {
- part.audio.unload();
- part.audio = null;
- delete part.audio;
- }
- }
- }, {
- key: "play",
- value: function play() {}
- }]);
- return AudioPlayer;
- }();
- var TourManager = /*#__PURE__*/function (_Emiter) {
- _inherits(TourManager, _Emiter);
- var _super = _createSuper$y(TourManager);
- function TourManager(app) {
- var _this;
- _classCallCheck(this, TourManager);
- _this = _super.call(this);
- _this.app = app;
- _this.partId = 0;
- _this.frameId = 0;
- _this.playing = false;
- _this.tours = [];
- _this.paths = [];
- _this.player = Deferred$1();
- _this.recorder = Deferred$1();
- _this.audioPlayer = new AudioPlayer(app);
- _this.app.store.on('tours', function (tours) {
- // 过滤掉无效点位对应的导览数据
- //test:
- //tours[0].showPanoRoute = 1
- tours.forEach(function (frag) {
- frag.list = frag.list.filter(function (frame) {
- return frame.enter.mode !== 'panorama' || _this.app.core.get('Player').model.panos.get(frame.enter.panoId);
- }); //frag.list.forEach(frame => (frame.showPath = frag.showPanoRoute)) //xzw add
- });
- console.log('tours', tours);
- for (var i = tours.length; i--; i >= 0) {
- if (tours[i].list.length == 0) {
- tours.splice(i, 1);
- }
- }
- _this.tours = tours;
- _this.load();
- _this.emit('loaded', _this.tours);
- _this.needsUpdatePath = true;
- });
- _this.edit = {};
- _this.edit.enterModule = function () {
- _this.editing = true;
- };
- _this.edit.leaveModule = function () {
- _this.editing = false;
- };
- _this.edit.setShowPath = function (sid, show) {
- //点击保存时生效
- console.log('setShowPath');
- var frag = _this.tours.find(function (e) {
- return e.sid == sid;
- });
- frag.showPanoRoute = show; //frag.list.forEach(frame => (frame.showPath = frag.showPanoRoute))
- _this.needsUpdatePath = true;
- };
- _this.recorder.then(function (recorder) {
- ////修改了
- recorder.on('change', function (e) {
- console.log('change', e);
- if (e.action == 'delete' || e.action == 'add' || e.type == 'clear') {
- _this.needsUpdatePath = true;
- }
- });
- });
- _this.player.then(function (player) {
- app.core.get('SceneRenderer').on('render', function () {
- if (_this.needsUpdatePath) {
- _this.updatePathMesh();
- _this.needsUpdatePath = false;
- }
- });
- });
- return _this;
- }
- _createClass(TourManager, [{
- key: "updatePathMesh",
- value: function updatePathMesh() {
- var _this2 = this;
- //要显示的路径,全都展示出来
- console.log('updatePathMesh');
- var player = this.app.core.get('Player');
- this.paths.forEach(function (e) {
- return e.dispose();
- });
- this.paths.length = 0;
- var collect = [];
- var makePath = function makePath() {
- //遇到不显示的片段和飞出的就截断
- var panos = collect.slice();
- collect.length = 0;
- if (panos.length <= 1) return; //如果飞入又飞出再飞入,飞入的两个pano不连,即必须大于两个点才画线
- console.log('origin panos', panos.map(function (e) {
- return e.id;
- })); //pano之间插入自动寻路的漫游点
- var panoIds = [panos[0].id];
- for (var i = 0, len = panos.length; i < len - 1; i++) {
- var pano1 = panos[i];
- var pano2 = panos[i + 1];
- if (pano1 == pano2) continue; //重复
- var panoIds_ = aStart.searchRoad(player.model.panos.index, pano1.id, pano2.id); // 应该不会和走导览时不一样吧
- panoIds.push.apply(panoIds, _toConsumableArray(panoIds_));
- }
- var pathPanos = panoIds.map(function (e) {
- return player.model.panos.get(e);
- });
- if (pathPanos.length <= 1) return;
- var path = new Path({
- arrowColor: new THREE.Color('#fffdb2'),
- edgeColor: new THREE.Color('#fff')
- }); //add
- path.setPanos(pathPanos);
- player.model.paths.add(path);
- _this2.paths.push(path);
- };
- this.tours.forEach(function (frag) {
- if (frag.showPanoRoute) {
- frag.list.forEach(function (frame) {
- if (frame.enter.mode !== 'panorama') {
- makePath();
- } else {
- collect.push(player.model.panos.get(frame.enter.panoId));
- }
- });
- } else {
- makePath(); //截断
- }
- });
- makePath(); //余下的
- }
- }, {
- key: "uuid",
- value: function uuid() {
- return common$1.getRandomSid();
- }
- }, {
- key: "load",
- value: function load(data, screencap) {
- var _this3 = this;
- var prev = null;
- if (data) {
- this.tours = data;
- }
- this.tours.forEach(function (item) {
- _this3.audioPlayer.add(item, screencap);
- item.list.forEach(function (frame) {
- delete frame._trans; // if (frame.enter.cover && frame.enter.cover.indexOf('.jpg') != -1) {
- // frame.enter.cover = this.app.resource.getUserResourceURL(frame.enter.cover)
- // }
- if (prev == null) {
- prev = frame;
- } else {
- if (prev.enter.mode != 'panorama' || frame.enter.mode != 'panorama' || prev.enter.panoId == frame.enter.panoId) {
- prev._notrans = true;
- }
- prev = frame;
- }
- });
- });
- }
- /**
- * @returns {Promise<void>}
- */
- }, {
- key: "reload",
- value: function () {
- var _reload = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- //退出编辑时
- console.log('reload');
- this.partId = 0;
- this.frameId = 0;
- this.playing = false;
- _context.next = 6;
- return this.app.store.get('tours', true);
- case 6:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function reload() {
- return _reload.apply(this, arguments);
- }
- return reload;
- }()
- }, {
- key: "install",
- value: function install(name, plugin) {
- if (this[name]) {
- this[name].resolve(plugin);
- }
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- var files = [];
- var tours = JSON.parse(JSON.stringify(this.tours, function (key, val) {
- if (key === 'audio') {
- return null;
- } else {
- return val;
- }
- }));
- for (var i = tours.length - 1; i >= 0; i--) {
- var part = tours[i];
- if (!part.list || !part.list.length) {
- tours.splice(i, 1);
- } else {
- delete part.audio;
- delete part._uploaded;
- if (part.music && part.music.indexOf('blob:') === 0) {
- part.music = part.musicName.replace(/(.+)\.(.+)/, "tour-audio-".concat(part.sid, ".$2"));
- }
- part.list.forEach(function (frame, j) {
- delete frame._notrans;
- delete frame.enter._uploaded;
- delete frame.exit._uploaded;
- if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
- frame.enter.cover = "tour-enter-".concat(frame.sid, ".jpg");
- }
- if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
- frame.exit.cover = "tour-exit-".concat(frame.sid, ".jpg");
- }
- });
- }
- }
- this.tours.forEach(function (part, i) {
- part.list.forEach(function (frame, j) {
- if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
- files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-enter-".concat(frame.sid, ".jpg")));
- }
- if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
- files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-exit-".concat(frame.sid, ".jpg")));
- }
- });
- });
- return {
- tours,
- files
- };
- }
- }]);
- return TourManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var player$a;
- var range = {
- min: 0.7,
- max: 3
- }; //缩放滑动条范围
- var whPercent = 1.78; //固定输出的图长宽比
- var Screenshot = /*#__PURE__*/function (_Emiter) {
- _inherits(Screenshot, _Emiter);
- var _super = _createSuper$x(Screenshot);
- //场景修复中的截图功能
- function Screenshot(app) {
- var _this;
- _classCallCheck(this, Screenshot);
- _this = _super.call(this);
- _this.app = app;
- _this.editing = false;
- _this.temp = {
- onRangeChange: 0
- };
- return _this;
- }
- _createClass(Screenshot, [{
- key: "enter",
- value: function enter(listenZoomFun) {
- var _this2 = this;
- //console.log('activated')
- if (this.editing) return;
- this.editing = true;
- player$a = this.app.core.get('Player');
- if (!player$a) {
- return this.app.Scene.on('loaded', function () {
- if (_this2.editing) _this2.enter(listenZoomFun);
- });
- }
- this.setPlayerSize(true);
- this.oldStates = {
- zoomMax: settings$3.zoom.max,
- zoomMin: settings$3.zoom.min,
- zoomEnabled: settings$3.zoom.enabled,
- zoomToDefaultWhenToPano: settings$3.zoom.zoomToDefaultWhenToPano
- };
- settings$3.zoom.max = 3;
- settings$3.zoom.min = 0.7;
- settings$3.zoom.enabled = true;
- settings$3.zoom.zoomToDefaultWhenToPano = false; //window.addEventListener('resize', this.resizeFun, true);
- this.eventList = {
- zoomTo: function zoomTo(e) {
- listenZoomFun(e.zoomLevel == void 0 ? e : e.zoomLevel);
- },
- //,listenZoomFun.bind(this),
- setSize: this.setPlayerSize.bind(this),
- update: function update() {
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- _ref$hasChanged = _ref.hasChanged,
- hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
- var force = arguments.length > 1 ? arguments[1] : undefined;
- //监听outside模式下的zoom
- if (!player$a.lastFrameChanged && !force) return;
- var control = player$a.cameraControls.activeControl;
- if (player$a.mode == 'dollhouse') {
- var dis = control.camera.position.distanceTo(control.target);
- var zoomlevel = math$2.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), range.max, range.min);
- listenZoomFun(zoomlevel);
- } else if (player$a.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
- var absoluteScale = control.getDefaultAbsoluteScale(player$a.model.size); //改
- var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
- var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
- var _zoomlevel = math$2.linearClamp(control.absoluteScale, minS, maxS, range.max, range.min);
- listenZoomFun(_zoomlevel);
- }
- }
- }; //player.on('zoomTo', this.eventList.zoomTo)
- player$a.on(PlayerEvents.Zoom, this.eventList.zoomTo);
- player$a.on('setSize', this.eventList.setSize);
- player$a.on('update', this.eventList.update);
- this.eventList.zoomTo(player$a.zoomLevel);
- this.eventList.update(0, true); //加载最高清晰度
- settings$3.highestQualityTile = true; // this.app.TagManager.switchAllDisplay(false, 'screenshot', { links: true })
- this.app.TagManager.switchAllDisplay(false, 'screenshot', {}); //this.cameras = {'dollhouse':{}, 'floorplan':{}}
- }
- /* highRes(s){
- settings.highestQualityTile = s
- player.updateZoomPano()
- } */
- }, {
- key: "leave",
- value: function leave() {
- //退出,恢复
- this.editing = false;
- console.log('退出,恢复');
- if (!player$a) return;
- player$a.zoomTo(1);
- settings$3.zoom.enabled = this.oldStates.zoomEnabled;
- settings$3.zoom.max = this.oldStates.zoomMax;
- settings$3.zoom.min = this.oldStates.zoomMin;
- settings$3.zoom.zoomToDefaultWhenToPano = this.oldStates.zoomToDefaultWhenToPano;
- player$a.off(PlayerEvents.Zoom, this.eventList.zoomTo);
- player$a.off('setSize', this.eventList.setSize);
- player$a.off('update', this.eventList.update);
- settings$3.highestQualityTile = false; //canvas高度恢复
- this.setPlayerSize(false);
- this.app.TagManager.switchAllDisplay(true, 'screenshot');
- } //canvas去掉页眉部分,为了适应框
- }, {
- key: "setPlayerSize",
- value: function setPlayerSize(state) {
- if (state) {
- var offsetHeight = document.querySelector('.ui-editor-head').offsetHeight;
- var winHeight = window.innerHeight - offsetHeight;
- var winWidth = window.innerWidth;
- if (winWidth / winHeight < whPercent) {
- //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
- var height = winWidth / whPercent;
- player$a.domElement.style.height = "".concat(height, "px");
- player$a.domElement.style.top = (winHeight - height) / 2 + offsetHeight + 'px';
- } else {
- player$a.domElement.style.top = "".concat(offsetHeight, "px");
- player$a.domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
- }
- } else {
- //exit
- player$a.domElement.style.top = 0;
- player$a.domElement.style.height = '100%';
- }
- }
- }, {
- key: "waitTexLoaded",
- value: function waitTexLoaded(waitDeferred) {
- var _this3 = this;
- if (player$a.mode == 'panorama') {
- if (!player$a.currentPano || player$a.flying) {
- //刚打开时没有currentPano, 就加一个promise, 完成时记得这个promise也resolve
- console.log('延迟');
- if (!waitDeferred) {
- waitDeferred = Deferred$1();
- }
- setTimeout(function () {
- _this3.waitTexLoaded(waitDeferred);
- }, 100);
- return waitDeferred.promise();
- }
- var tileSize = this.getTileSize();
- var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(player$a.quaternion);
- var camera = player$a.cameraControls.activeControl.camera;
- var vFov = camera.fov;
- var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
- var promise = player$a.currentPano.loadTiledPano(tileSize, vec, {
- hFov,
- vFov
- }, !1, !1, !0);
- promise.done(function () {
- console.log('加载完成');
- waitDeferred && waitDeferred.resolve();
- });
- return promise;
- } else {
- var d = Deferred$1();
- return d.resolve().promise();
- }
- }
- }, {
- key: "getMaxHeight",
- value: function getMaxHeight() {
- //全景图高度
- return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
- }
- }, {
- key: "getTileSize",
- value: function getTileSize() {
- // 获取单个面的大小
- return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
- }
- }, {
- key: "getPicSize",
- value: function getPicSize() {
- if (player$a.mode != 'panorama') {
- return {
- width: 1780,
- height: 1000
- };
- }
- var maxHeight = this.getMaxHeight();
- var height = player$a.cameraControls.activeControl.camera.fov / 180 * maxHeight;
- var width = height * whPercent;
- var size = {
- width: Math.round(width),
- height: Math.round(height)
- };
- return size; // matterport: 4dkk: (4k)
- //0.7: 8101*4551 3.35M
- //1 : 6068*3413 h 8778.29218106 不是 8192?? 5671*3186
- //3: 2023*1138 1890*1062
- //(2k减半) 如1890*1062 --> 945*531
- } //需要渲染最高清晰度的图片
- }, {
- key: "listenZoomLevel",
- value: function listenZoomLevel(zoomLevel) {//console.log('listenZoomLevel',zoomLevel)
- //this.range.value = zoomLevel * 100;
- }
- }, {
- key: "onResetCamera",
- value: function onResetCamera() {
- //console.log('使相机水平');
- if (player$a.mode == 'panorama') {
- player$a.cameraControls.activeControl.lat = 0;
- }
- }
- }, {
- key: "onResumeSize",
- value: function onResumeSize() {
- var _this4 = this;
- //1:1按钮
- //this.range.value = 100;
- if (!player$a) return;
- var control = player$a.cameraControls.activeControl;
- if (player$a.mode == 'transitioning') {
- return player$a.once('mode.changed', function (fromMode, toMode) {
- if (!_this4.editing) return;
- _this4.onResumeSize();
- });
- } else if (player$a.mode == 'panorama') {
- player$a.zoomTo(1);
- } else if (player$a.mode == 'dollhouse') {
- //自己定一个target
- control.target.copy(player$a.model.center);
- this.onRangeChange({
- value: 100
- });
- } else if (player$a.mode == 'floorplan') {
- //自己定一个target
- control.target.setX(player$a.model.center.x);
- control.target.setZ(player$a.model.center.z);
- control.camera.position.setX(player$a.model.center.x); //使角度归零
- control.camera.position.setZ(player$a.model.center.z);
- control.rotateToView(player$a.model.size, player$a.getDirection()); //再旋转
- control.zoomToContain(player$a.model.size);
- }
- }
- }, {
- key: "onRangeChange",
- value: function onRangeChange(res) {
- var _this5 = this;
- //响应滑动条
- //setFovRatio
- this.temp.onRangeChange = res;
- var control = player$a.cameraControls.activeControl;
- var zoomLevel = Math.round(res.value) / 100;
- if (zoomLevel < range.min) {
- zoomLevel = range.min;
- this.eventList.zoomTo(zoomLevel);
- } else if (zoomLevel > range.max) {
- zoomLevel = range.max;
- this.eventList.zoomTo(zoomLevel);
- }
- if (player$a.mode == 'transitioning') {
- return player$a.once('mode.changed', function (fromMode, toMode) {
- if (!_this5.editing) return;
- _this5.onRangeChange(_this5.temp.onRangeChange);
- });
- } else if (player$a.mode == 'panorama') {
- settings$3.zoom.enabled = true;
- player$a.zoomTo(zoomLevel);
- } else if (player$a.mode == 'dollhouse') {
- 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
- control.camera.position.copy(control.target).add(player$a.getDirection().multiplyScalar(-disWanted));
- } else if (player$a.mode == 'floorplan') {
- var absoluteScale = control.getDefaultAbsoluteScale(player$a.model.size); //改
- var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
- var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
- control.absoluteScale = math$2.linearClamp(zoomLevel, range.min, range.max, maxS, minS); // 不按照这个,因范围太大
- //zoomNearLimit: 0.1,
- //zoomFarLimit: 10,
- }
- }
- }, {
- key: "imgAddLabel",
- value: function () {
- var _imgAddLabel = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(imgsrc, labelImgSrc, labelInfo, lonlatInfo) {
- var img, labelImg, loaded, waitCount, needAddLabel;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- //水印
- img = new Image();
- img.setAttribute('crossOrigin', 'Anonymous');
- img.src = imgsrc;
- loaded = 0;
- waitCount = labelImgSrc ? 2 : 1;
- needAddLabel = !!labelImgSrc;
- return _context2.abrupt("return", new Promise(function (resolve, reject) {
- var onload = /*#__PURE__*/function () {
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var src, predictWidth, scale, result;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- loaded++;
- if (!(loaded >= waitCount)) {
- _context.next = 27;
- break;
- }
- if (!needAddLabel) {
- _context.next = 13;
- break;
- }
- console.log('labelInfo', labelInfo);
- labelInfo.opacity /= 100;
- src = common$1.imgAddLabel(img, labelImg, labelInfo); //先加个水印
- if (!lonlatInfo) {
- _context.next = 12;
- break;
- }
- img.src = src;
- needAddLabel = false;
- return _context.abrupt("return");
- case 12:
- resolve(src);
- case 13:
- if (!lonlatInfo) {
- _context.next = 27;
- break;
- }
- lonlatInfo.player = player$a;
- console.log('lonlatInfo', lonlatInfo); //delete lonlatInfo.widthRatioToImg // 只按照原来的大小
- //不变比例的话
- //delete lonlatInfo.widthRatioToImg // 只按照原来的大小
- //不变比例的话
- predictWidth = 201; //不放大的话当前label的宽度大概是
- //不放大的话当前label的宽度大概是
- scale = img.width * lonlatInfo.widthRatioToImg / predictWidth;
- lonlatInfo.textAlign = 'left';
- lonlatInfo.fontsize && (lonlatInfo.fontsize *= scale);
- lonlatInfo.margin && (lonlatInfo.margin.x *= scale, lonlatInfo.margin.y *= scale);
- lonlatInfo.borderRadius && (lonlatInfo.borderRadius *= scale);
- lonlatInfo.lineSpace = 7 * scale; //add
- //let text = ['经度:' + lonlatInfo.location.lon, '纬度:' + lonlatInfo.location.lat]
- _context.next = 25;
- return common$1.imgAddText(img, lonlatInfo.location.text, lonlatInfo);
- case 25:
- result = _context.sent;
- resolve(result);
- case 27:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- }));
- return function onload() {
- return _ref2.apply(this, arguments);
- };
- }();
- if (labelImgSrc) {
- labelImg = new Image();
- labelImg.src = labelImgSrc;
- labelImg.setAttribute('crossOrigin', 'Anonymous');
- labelImg.onload = onload;
- }
- img.onload = onload;
- }));
- case 7:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2);
- }));
- function imgAddLabel(_x, _x2, _x3, _x4) {
- return _imgAddLabel.apply(this, arguments);
- }
- return imgAddLabel;
- }()
- }, {
- key: "getOrientation",
- value: function getOrientation() {
- //"cameraOrientation": "01-东;02-南;03-西;04-北;05-东北;06-东南;07-西北;08-西南" // 拍摄镜头朝向代码 FXLBDM,方位照片和概貌照片需要传;01-东;02-南;03-西;04-北;05-东北;06-东南;07-西北;08-西南
- var compassAngle = THREE.MathUtils.degToRad(this.app.core.get('Player').compass.angle || 0);
- var yaw = this.app.core.get('Player').yaw || 0;
- var angle = -yaw + 5 * Math.PI / 2 - compassAngle + Math.PI / 8;
- var text = ['北', '东北', '东', '东南', '南', '西南', '西', '西北'];
- var num = ['04', '05', '01', '06', '02', '08', '03', '07'];
- var index = Math.floor(angle % (2 * Math.PI) / (Math.PI / 4));
- console.log(text[index]);
- var r = num[index];
- return r;
- }
- }]);
- return Screenshot;
- }(tinyEmitter);
- var Editor = /*#__PURE__*/function () {
- function Editor(app) {
- _classCallCheck(this, Editor);
- this.app = app;
- this.num = this.app.config.num;
- }
- /**
- * 设置当面画面为初始画面
- */
- _createClass(Editor, [{
- key: "setEntry",
- value: function () {
- var _setEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var payload;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- payload = {}; // 初始画面截图
- payload.entry = this.app.Camera.getScreenshotInfo();
- _context.next = 4;
- return this.app.Camera.screenshot();
- case 4:
- payload.thumbs = _context.sent;
- // 更新初始点
- this.app.core.get('Scene').firstView.updateByEntry(payload.entry, this.app.core.get('Player').model.panos);
- return _context.abrupt("return", payload);
- case 7:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function setEntry() {
- return _setEntry.apply(this, arguments);
- }
- return setEntry;
- }()
- /**
- * 保存初始画面
- */
- }, {
- key: "saveEntry",
- value: function () {
- var _saveEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
- var thumbFilename,
- data,
- thumbs,
- response,
- _args2 = arguments;
- return regenerator.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- thumbFilename = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : 'thumb-1k.jpg';
- _context2.next = 3;
- return this.setEntry();
- case 3:
- data = _context2.sent;
- thumbs = {
- num: this.num,
- bizType: 'settings-thumb',
- files: data.thumbs.map(function (item) {
- return convertBlob2File(item.data, "thumb-".concat(item.name, ".jpg"));
- })
- };
- response = null;
- _context2.prev = 6;
- _context2.next = 9;
- return this.app.remote_editor.upload_files(thumbs);
- case 9:
- response = _context2.sent;
- _context2.next = 15;
- break;
- case 12:
- _context2.prev = 12;
- _context2.t0 = _context2["catch"](6);
- return _context2.abrupt("return", Promise.reject(_context2.t0));
- case 15:
- if (response.success) {
- _context2.next = 17;
- break;
- }
- return _context2.abrupt("return", Promise.reject(response));
- case 17:
- _context2.prev = 17;
- _context2.next = 20;
- return this.app.remote_editor.saveInitialPage({
- num: this.num,
- fileName: thumbFilename,
- data: JSON.stringify(data.entry)
- });
- case 20:
- response = _context2.sent;
- return _context2.abrupt("return", response);
- case 24:
- _context2.prev = 24;
- _context2.t1 = _context2["catch"](17);
- return _context2.abrupt("return", Promise.reject(_context2.t1));
- case 27:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, this, [[6, 12], [17, 24]]);
- }));
- function saveEntry() {
- return _saveEntry.apply(this, arguments);
- }
- return saveEntry;
- }()
- /**
- * 发布
- * @returns
- */
- }, {
- key: "publish",
- value: function () {
- var _publish = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
- return regenerator.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- _context3.next = 2;
- return this.app.remote_editor.publicScene({
- num: this.num
- });
- case 2:
- return _context3.abrupt("return", _context3.sent);
- case 3:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, this);
- }));
- function publish() {
- return _publish.apply(this, arguments);
- }
- return publish;
- }()
- }]);
- return Editor;
- }();
- 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); }; }
- 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; } }
- var Paint = /*#__PURE__*/function (_Emiter) {
- _inherits(Paint, _Emiter);
- var _super = _createSuper$w(Paint);
- function Paint(app) {
- var _this;
- _classCallCheck(this, Paint);
- _this = _super.call(this);
- _this.app = app;
- _this.records = [];
- _this.paints = [];
- _this.isPaint = true;
- _this.isPainting = false;
- _this.isUndo = false;
- _this.role = 'leader';
- _this.colors = {
- leader: '#00c8af',
- follow: '#3A78E7'
- };
- return _this;
- }
- _createClass(Paint, [{
- key: "show",
- value: function show() {
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- role = _ref.role,
- colors = _ref.colors,
- paint = _ref.paint,
- ele = _ref.ele;
- this.player = this.app.core.get('Player');
- this.$paint = this.elem(ele);
- this.$paint.style.display = '';
- this.isPainting = true;
- this.role = role == 'leader' ? 'leader' : 'follow';
- if (colors) {
- Object.assign(this.colors, colors);
- }
- this.isPaint = paint !== false;
- this.onStart();
- }
- }, {
- key: "hide",
- value: function hide() {
- this.isPainting = false;
- this.isUndo = false;
- this.paints = [];
- this.records = [];
- if (this.$paint) {
- this.$paint.style.display = 'none';
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
- }
- var currentPano = this.app.core.get('Player').currentPano;
- if (currentPano && currentPano.hasVideo) {
- this.app.core.get('PanoVideoRenderer').activatePanorama(currentPano);
- }
- }
- }, {
- key: "elem",
- value: function elem(ele) {
- var $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
- if ($paint == null) {
- 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 ";
- if (ele) {
- // 存在ele,则自定义插入到该元素的第一个子节点
- // console.log(document.querySelector(ele))
- document.querySelector(ele).insertAdjacentHTML('afterbegin', html);
- $paint = document.querySelector(ele).querySelector('[xui_sync_paint]');
- } else {
- this.app.$plugins.insertAdjacentHTML('beforeend', html);
- $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
- }
- this.bind($paint);
- }
- return $paint;
- }
- }, {
- key: "bind",
- value: function bind($paint) {
- var _this2 = this;
- var touch;
- this.mouse = new THREE.Vector2();
- this.canvas = $paint.querySelector('canvas');
- this.context = this.canvas.getContext('2d');
- this.canvas.onmousedown = function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- _this2.beginStroke({
- x: e.clientX,
- y: e.clientY
- });
- };
- this.canvas.onmouseup = function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- _this2.endStroke();
- };
- this.canvas.onmousemove = function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- if (_this2._mouseDown) {
- _this2.moveStroke({
- x: e.clientX,
- y: e.clientY
- });
- }
- }; // 移动端触控
- this.canvas.addEventListener('touchstart', function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- touch = e.touches[0];
- _this2.beginStroke({
- x: touch.pageX,
- y: touch.pageY
- });
- });
- this.canvas.addEventListener('touchmove', function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- if (_this2._mouseDown) {
- touch = e.touches[0];
- _this2.moveStroke({
- x: touch.pageX,
- y: touch.pageY
- });
- }
- });
- this.canvas.addEventListener('touchend', function (e) {
- if (!_this2.isPaint) {
- return;
- }
- e.preventDefault();
- _this2.endStroke();
- });
- }
- }, {
- key: "onStart",
- value: function onStart() {
- var dpr = window.devicePixelRatio || 1;
- var rect = this.canvas.getBoundingClientRect();
- this.ratio = 1; // window.innerWidth / 375;
- this.canvas.width = rect.width * dpr;
- this.canvas.height = rect.height * dpr;
- this.context.scale(dpr, dpr);
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
- this._endTime = 0;
- this._mouseDown = false;
- this._lastTimestamp = 0;
- this._lastLineWidth = -1;
- this._lastPosition = {
- x: 0,
- y: 0
- };
- math$2.convertScreenPositionToNDC(0, 0, this.mouse, this.app.dom); //取屏幕中点
- var intersect = convertTool.getMouseIntersect(this.player.camera, [this.player.model.skybox], this.mouse);
- this.placeIntersectPlane(intersect && intersect.point);
- }
- }, {
- key: "onRecord",
- value: function onRecord(data) {
- this.transformTo3d(data);
- this.records.push(data);
- this.emit('data', {
- type: 'paint',
- data
- });
- }
- }, {
- key: "beginStroke",
- value: function beginStroke(point) {
- this._mouseDown = true;
- this._lastTimestamp = Date.now();
- this._lastPosition = this.windowToCanvas(point.x, point.y);
- this.paints.push({
- width: 0,
- x: this._lastPosition.x,
- y: this._lastPosition.y,
- t: 5 //this._lastTimestamp - this._endTime
- });
- }
- }, {
- key: "moveStroke",
- value: function moveStroke(point) {
- var timestamp = Date.now();
- var position = this.windowToCanvas(point.x, point.y);
- var s = this.calcDistance(position, this._lastPosition);
- var t = timestamp - this._lastTimestamp;
- var lineWidth = this.calcLineWidth(t, s); //draw
- this.context.beginPath();
- this.context.moveTo(this._lastPosition.x, this._lastPosition.y);
- this.context.lineTo(position.x, position.y);
- this.paints.push({
- color: this.colors[this.role] || '#00c8af',
- width: lineWidth,
- x: position.x,
- y: position.y,
- t: 5 //t
- });
- this.context.strokeStyle = this.colors[this.role] || '#00c8af';
- this.context.lineWidth = lineWidth;
- this.context.lineCap = 'round';
- this.context.linJoin = 'round';
- this.context.stroke(); //每次过程结束时,将结束值赋给初始值,一直延续
- this._lastPosition = position;
- this._lastTimestamp = timestamp;
- this._lastLineWidth = lineWidth;
- }
- }, {
- key: "endStroke",
- value: function endStroke() {
- this.paints.push({
- width: 0,
- x: this._lastPosition.x,
- y: this._lastPosition.y,
- t: 0
- });
- this.onRecord(this.paints);
- this.paints = [];
- this.isUndo = true;
- this._mouseDown = false;
- this._lastTimestamp = 0;
- this._endTime = Date.now();
- }
- }, {
- key: "calcDistance",
- value: function calcDistance(pos1, pos2) {
- return Math.sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x) + (pos1.y - pos2.y) * (pos1.y - pos2.y)); //通过起始结束坐标x,y值计算路程长度
- }
- }, {
- key: "calcLineWidth",
- value: function calcLineWidth(t, s) {
- var v = s / t;
- var resultLineWidth;
- if (v <= 0.1) {
- resultLineWidth = 6;
- } else if (v >= 3) {
- resultLineWidth = 2;
- } else {
- resultLineWidth = 6 - (v - 0.1) / (3 - 0.1) * (6 - 4);
- }
- if (this._lastLineWidth == -1) {
- return resultLineWidth;
- }
- return this._lastLineWidth * 2 / 3 + resultLineWidth * 1 / 3;
- }
- }, {
- key: "windowToCanvas",
- value: function windowToCanvas(x, y) {
- var bbox = this.canvas.getBoundingClientRect(); //获取canvas的位置信息
- return {
- x: Math.round(x - bbox.left),
- y: Math.round(y - bbox.top)
- }; //返回当前鼠标相对于canvas的位置
- }
- }, {
- key: "placeIntersectPlane",
- value: function placeIntersectPlane(pos) {
- //用于判断mesh拖拽移动距离的平面 需要和视线垂直,以保证遮住视野范围
- if (!this.intersectPlane) {
- var geo = new THREE.PlaneGeometry(8000, 80000, 1, 1); //var geo = new THREE.PlaneGeometry(3,3,1,1);
- this.intersectPlane = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({
- transparent: true,
- wireframe: false,
- opacity: 0,
- side: THREE.DoubleSide,
- depthTest: false
- }));
- this.intersectPlane.lookAt(new THREE.Vector3(0, 1, 0));
- this.intersectPlane.name = 'intersectPlane';
- this.player.model.add(this.intersectPlane);
- }
- if (pos) {
- this.intersectPlane.position.copy(pos);
- var cameraDir = this.player.getDirection(null, this.player.camera); //向里
- this.intersectPlane.lookAt(pos.clone().add(cameraDir)); //看向相机
- }
- }
- /**
- * 2d数据转3d数据
- */
- }, {
- key: "transformTo3d",
- value: function transformTo3d(paints) {
- var _this3 = this;
- if (paints.length == 0) {
- return;
- }
- paints.forEach(function (item) {
- math$2.convertScreenPositionToNDC(item.x, item.y, _this3.mouse, _this3.app.dom);
- var intersect = convertTool.getMouseIntersect(_this3.player.camera, [_this3.intersectPlane], _this3.mouse);
- if (!intersect) {
- console.error('no intersect ??');
- } else {
- item.pos3d = intersect.point;
- }
- });
- }
- /**
- * 3d数据转2d数据
- */
- }, {
- key: "transformTo2d",
- value: function transformTo2d(paints) {
- var _this4 = this;
- paints.forEach(function (item) {
- var pos3d = new THREE.Vector3(item.pos3d.x, item.pos3d.y, item.pos3d.z);
- var pos2d = convertTool.getPos2d(pos3d, _this4.player, _this4.player.camera);
- item.x = pos2d.pos.x;
- item.y = pos2d.pos.y;
- });
- }
- }, {
- key: "undo",
- value: function undo() {
- this.records.pop();
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
- for (var i = 0; i < this.records.length; i++) {
- this.paint(this.records[i], 0);
- }
- this.emit('data', {
- type: 'undo'
- });
- }
- }, {
- key: "paint",
- value: function paint(data) {
- var _this5 = this;
- var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
- var _loop = function _loop(i) {
- if (delay) {
- if (data[i].t) {
- setTimeout(function () {
- _this5.context.beginPath();
- _this5.context.strokeStyle = data[i].color;
- _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
- _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
- _this5.context.lineWidth = data[i].width * _this5.ratio;
- _this5.context.lineCap = 'round';
- _this5.context.linJoin = 'round';
- _this5.context.stroke();
- }, delay);
- }
- } else {
- if (data[i].t) {
- _this5.context.beginPath();
- _this5.context.strokeStyle = data[i].color;
- _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
- _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
- _this5.context.lineWidth = data[i].width * _this5.ratio;
- _this5.context.lineCap = 'round';
- _this5.context.linJoin = 'round';
- _this5.context.stroke();
- }
- }
- };
- for (var i = 0; i < data.length - 1; i++) {
- _loop(i);
- }
- }
- }, {
- key: "receive",
- value: function receive(data) {
- if (data.type == 'undo') {
- this.records.pop();
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
- for (var i = 0; i < this.records.length; i++) {
- this.paint(this.records[i], 0);
- }
- } else {
- this.transformTo2d(data.data);
- this.paint(data.data);
- this.records.push(data.data);
- }
- }
- }]);
- return Paint;
- }(tinyEmitter);
- 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; }
- 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; }
- 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); }; }
- 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; } }
- var ScreenEvents = {
- Move: 'move',
- Rotate: 'rotate',
- Zoom: 'zoom',
- EndRotation: 'endRotation',
- MoveModel: 'moveModel',
- MoveComplete: 'move.complete',
- ModeChanged: 'mode.changed',
- ModeChanging: 'mode.changing',
- PanoChosen: 'pano.chosen',
- ClosestPanoChanging: 'closest.pano.changing',
- WarpStarted: 'warp.started',
- WarpInterrupted: 'warp.interrupted',
- WarpEnded: 'warp.ended',
- FlyinFinished: 'flyin.finished',
- FlyingStarted: 'flying.started',
- FlyingInterrupted: 'flying.interrupted',
- FlyingEnded: 'flying.ended',
- Ready: 'ready',
- StartInside: 'start.inside',
- StartOutside: 'start.outside',
- ViewChanged: 'view.changed',
- WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
- InputStart: 'input.start'
- };
- var index = 0;
- var Screen = /*#__PURE__*/function (_Emiter) {
- _inherits(Screen, _Emiter);
- var _super = _createSuper$v(Screen);
- function Screen(app) {
- var _this;
- _classCallCheck(this, Screen);
- _this = _super.call(this);
- _this.index = index++;
- _this.app = app;
- _this.inited = false;
- _this.started = false;
- return _this;
- }
- /**
- * 初始化,这里是否需要这么写,还是直接在业务使用Camera事件
- */
- _createClass(Screen, [{
- key: "init",
- value: function init() {
- var _this2 = this;
- this.inited = true;
- var player = this.app.core.get('Player');
- if (this.role == 'leader' || !this.role) {
- this.app.Camera.on(ScreenEvents.FlyingStarted, function (params) {
- return _this2.emitData(params);
- });
- this.app.Camera.on(ScreenEvents.Zoom, function (params) {
- return _this2.emitData(params);
- });
- this.app.Camera.on(ScreenEvents.MoveModel, function (params) {
- return _this2.emitData(params);
- });
- player.viewLinkManager.addEventListener('loaded', function () {
- if (_this2.started) {
- //this.app.core.get('Player').viewLinkManager.setViewsVisible('url', false)
- player.viewLinkManager.hideAllViews();
- }
- });
- var _interval;
- this.app.Camera.on(ScreenEvents.Rotate, function (params) {
- _this2.emitData(params);
- clearTimeout(_interval);
- _interval = null;
- });
- this.app.Camera.on(ScreenEvents.EndRotation, function (params) {
- _this2.emitData(params);
- if (_this2.role == 'leader') {
- //xzw add 旋转完后,每隔一段时间发送一下当前朝向
- var count = 0,
- deltaTime = 20;
- _interval = function interval() {
- _this2.emitData({
- type: 'syncRotContinue',
- quaternion: player.quaternion
- });
- if (count++ < 10 && _interval && player.mode == 'panorama') {
- setTimeout(_interval, deltaTime += 20);
- }
- };
- setTimeout(_interval, deltaTime);
- }
- });
- }
- if (this.role == 'follow') {
- //被带看
- this.app.Camera.on(ScreenEvents.FlyingEnded, this.requestSync.bind(this)); //player.on('flytopano.rotateEnd', requestSync)
- }
- }
- /**
- * 开始同步
- */
- }, {
- key: "start",
- value: function start() {
- this.started = true;
- if (this.inited) {
- return;
- }
- this.init();
- this.app.core.get('Player').setPanoTaskEnable(false); //this.app.core.get('Player').cameraControls.controls.panorama.speed = 0.1
- if (this.app.configSync) ; else {
- this.app.VRScreenSYNC = true;
- settings$3.zoom.enabled = false;
- } // 隐藏全景关联
- if (this.app.core.get('Player').viewLinkManager.loaded) {
- this.app.core.get('Player').viewLinkManager.hideAllViews();
- }
- }
- /**
- * 退出
- */
- }, {
- key: "exit",
- value: function exit() {
- this.started = false;
- this.app.core.get('Player').setPanoTaskEnable(true);
- this.app.core.get('Player').locked = false; //this.app.core.get('Player').cameraControls.controls.panorama.speed = 1
- this.app.VRScreenSYNC = false;
- settings$3.zoom.enabled = true; // 显示全景关联
- if (this.app.core.get('Player').viewLinkManager.loaded) {
- this.app.core.get('Player').viewLinkManager.showAllViews();
- }
- }
- /**
- * 同步视角
- */
- }, {
- key: "sync",
- value: function sync() {
- var player = this.app.core.get('Player');
- var mode = player.modeTran.split('-')[1]; //console.log('同步画面',mode)
- if (mode === Viewmode$1.PANORAMA) {
- var panoId = null;
- if (player.mode == Viewmode$1.PANORAMA && player.nextPano != void 0) {
- //正在flytoPano
- panoId = player.nextPano.id;
- } else if (player.currentPano) {
- panoId = player.currentPano.id;
- } //console.log('panoId', panoId)
- this.emitData({
- panoId: panoId,
- //leader
- quaternion: player.quaternion,
- mode,
- type: 'flyToPano'
- });
- } else {
- var data = {
- quaternion: player.quaternion,
- position: player.position,
- currentScale: player.cameraControls.controls.floorplan.currentScale,
- mode,
- type: 'flyToNewMode'
- };
- if (player.cameraControls.activeControl) {
- data.target = {
- x: player.cameraControls.activeControl.target.x,
- y: player.cameraControls.activeControl.target.y,
- z: player.cameraControls.activeControl.target.z
- };
- }
- this.emitData(data);
- }
- }
- }, {
- key: "requestSync",
- value: function requestSync(params) {
- var _this3 = this;
- setTimeout(function () {
- //console.log('requestSync')
- _this3.emitData({
- //飞完后请求同步一下,因为可能在飞期间leader又改变了
- type: 'requestSync'
- });
- }, 1); //可能panosTaskList还没清空所以延迟
- }
- }, {
- key: "emitData",
- value: function emitData(params) {
- // 防止无限循环
- var player = this.app.core.get('Player'); //console.warn(this.index, params, player.syncType)
- if (player.syncType == 'receive') {
- player.syncType = null;
- return;
- }
- if (!this.started
- /* || this.role == 'follow' */
- ) {
- return;
- }
- if (params) {
- for (var key in params) {
- var value = params[key];
- if (value instanceof THREE.Vector2) {
- params[key] = new THREE.Vector2(value.x, value.y);
- } else if (value instanceof THREE.Vector3) {
- params[key] = new THREE.Vector3(value.x, value.y, value.z);
- }
- }
- }
- this.emit('data', _objectSpread$2({}, params));
- }
- /**
- * 数据转换
- * @param {Object} data
- */
- }, {
- key: "transform",
- value: function transform(data) {
- if (data.target && data.target instanceof THREE.Vector3 === false) {
- data.target = new THREE.Vector3(data.target.x, data.target.y, data.target.z);
- }
- if (data.position && data.position instanceof THREE.Vector3 === false) {
- data.position = new THREE.Vector3(data.position.x, data.position.y, data.position.z);
- }
- if (data.quaternion && data.quaternion instanceof THREE.Quaternion === false) {
- if (data.quaternion.hasOwnProperty('_x')) {
- data.quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
- } else {
- data.quaternion = new THREE.Quaternion(data.quaternion.x, data.quaternion.y, data.quaternion.z, data.quaternion.w);
- }
- }
- if (data.rotationSpeed && data.rotationSpeed instanceof THREE.Vector2 === false) {
- data.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
- }
- if (data.info) {
- this.transform(data.info);
- }
- if (data.modelInfo) {
- this.transform(data.modelInfo);
- }
- }
- }]);
- return Screen;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- /**
- * 同屏带看
- */
- var SyncScreen = /*#__PURE__*/function (_Screen) {
- _inherits(SyncScreen, _Screen);
- var _super = _createSuper$u(SyncScreen);
- function SyncScreen(app) {
- var _this;
- _classCallCheck(this, SyncScreen);
- _this = _super.call(this, app);
- _this.toSame = function (data, player, func) {
- if (data.mode == player.mode) {
- //漫游模式情况下,还需要考虑当前漫游点是否对的上
- if (data.mode == Viewmode$1.PANORAMA) {
- if (data.currentPanoId == player.currentPano.id) {
- return true;
- } else {
- var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
- player.flyToPano({
- pano: targetPano
- }, func);
- return false;
- }
- } else {
- return true;
- }
- } else {
- // console.log('mode:' + player.mode)
- if (player.mode == Viewmode$1.TRANSITIONING) {
- return null;
- }
- if (data.mode == Viewmode$1.FLOORPLAN) {
- player.flyToNewMode({
- mode: Viewmode$1.FLOORPLAN,
- callback: func
- });
- return false;
- } else if (data.mode == Viewmode$1.DOLLHOUSE) {
- player.flyToNewMode({
- mode: Viewmode$1.DOLLHOUSE,
- target: data.info.target,
- position: data.info.position,
- 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,
- panoId: null,
- callback: func
- });
- return false;
- }
- return true;
- }
- };
- _this.syncRotate = function (data, player) {
- //漫游模式下的旋转同步
- //player.cameraControls.activeControl.lockedForce = true
- var quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
- player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
- };
- _this.copyCameraProp = function (player, info) {
- //复制录屏的数据给camera或control
- //options = options || {}
- var ctrl = player.cameraControls.activeControl;
- var camera = ctrl.camera;
- if (info.position) {
- camera.position.copy(info.position);
- } // else{
- // camera.position.copy(this.currentPano.position);//fly in时需要赋值
- // }
- if (info.quaternion) {
- /*
- if(options.transitionQua){//需要渐变quaternion
-
- var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
- this.setQuaternionTransition(_qua)
- }else{
- camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
-
- this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
-
- }
- //camera.quaternion.copy(item.qua);
- */
- camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
- } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
- info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
- //俯视图情况
- if (info.scale) {
- ctrl.absoluteScale = info.scale;
- ctrl.updateZoom();
- } // if(item.zoom){//floorplan
- // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
- // ctrl.absoluteScale = ctrl.currentScale;
- // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
- // ctrl.updateZoom()
- // }
- //console.log("copyCameraProp")
- };
- return _this;
- }
- /**
- * 接收同步数据
- * @param {*} data
- */
- _createClass(SyncScreen, [{
- key: "receive",
- value: function receive(data) {
- // console.log('接受')
- var player = this.app.core.get('Player');
- var flag = true;
- this.transform(data);
- switch (data.type) {
- case 'flyToPano':
- // console.log('漫游')
- player.syncType = 'receive';
- var targetPano = player.model.panos.index[parseInt(data.panoId)];
- var target = {};
- target.pano = targetPano;
- if (data.quaternion) {
- target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
- }
- player.flyToPano(target);
- break;
- case 'flyToNewMode':
- // console.log('飞入飞出')
- player.syncType = 'receive';
- if (data && data.panoId) {
- data.pano = player.model.panos.index[parseInt(data.panoId)];
- }
- if (player.model.mode == 'panorama' && this.app.configSync) {
- // 变为单屏
- this.app.dom.parentElement.style.width = '100%';
- this.app.configSync.dom.style.width = '0';
- this.app.dom.parentElement.style.height = '100%';
- this.app.configSync.dom.style.height = '0';
- }
- setTimeout(function () {
- return player.flyToNewMode(data);
- }, 50);
- break;
- case 'rotate':
- //console.log('旋转')
- if (player.model.mode == Viewmode$1.PANORAMA) {
- flag = this.toSame(data, player, function () {
- this.syncRotate(data, player);
- }.bind(this));
- if (flag) {
- this.syncRotate(data, player);
- }
- }
- break;
- case 'endRotation':
- //console.log('停止旋转')
- if (player.cameraControls && player.cameraControls.activeControl) {
- player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed))
- player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2();
- }
- break;
- case 'zoom':
- // console.log('缩放')
- /*player.syncType = 'receive'
- flag = this.toSame(
- data,
- player,
- function () {
- player.handleControlScroll(data.zoom,true)
- }.bind(this)
- )
- if (flag == null) {
- //正在过渡
- } else if (flag) {
- player.handleControlScroll(data.zoom,true)
- }*/
- player.zoomTo(data.zoomLevel);
- break;
- case 'moveModel':
- // console.log('移动模型')
- flag = this.toSame(data, player, function () {
- this.copyCameraProp(player, data.info);
- }.bind(this));
- if (flag == null) ; else if (flag) {
- this.copyCameraProp(player, data.info);
- }
- break;
- }
- } //初始情况,可能两者状态不一致,这时候需要调整一致
- //通过data里的元素与player进行比较来判断
- }]);
- return SyncScreen;
- }(Screen);
- 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); }; }
- 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; } }
- /**
- * 一起逛
- */
- var FollowScreen = /*#__PURE__*/function (_Screen) {
- _inherits(FollowScreen, _Screen);
- var _super = _createSuper$t(FollowScreen);
- function FollowScreen(app) {
- var _this;
- _classCallCheck(this, FollowScreen);
- _this = _super.call(this, app);
- _this.toSame = function (data, player, func) {
- if (data.mode == player.mode) {
- //漫游模式情况下,还需要考虑当前漫游点是否对的上
- if (data.mode == Viewmode$1.PANORAMA) {
- if (data.currentPanoId == player.currentPano.id) {
- return true;
- } else {
- var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
- var oldLock = player.locked;
- player.locked = false;
- player.flyToPano({
- pano: targetPano
- }, func);
- player.locked = oldLock;
- return false;
- }
- } else {
- return true;
- }
- } else {
- //console.log('mode:' + player.mode)
- if (player.mode == Viewmode$1.TRANSITIONING) {
- return null;
- }
- if (data.mode == Viewmode$1.FLOORPLAN) {
- player.flyToNewMode({
- mode: Viewmode$1.FLOORPLAN,
- callback: func
- });
- return false;
- } else if (data.mode == Viewmode$1.DOLLHOUSE) {
- player.flyToNewMode({
- mode: Viewmode$1.DOLLHOUSE,
- target: data.info.target,
- position: data.info.position,
- 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,
- panoId: null,
- callback: func
- });
- return false;
- }
- return true;
- }
- };
- _this.syncRotate = function (data, player) {
- //漫游模式下的旋转同步
- this.stopLerpQua(player);
- this.pauseSyncRot = false;
- var quaternion = player.cameraControls.activeControl.camera.quaternion.clone();
- var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
- this.endQuaternion = endQuaternion; //目标朝向
- var time = Date.now();
- if (time - this.lastUpdateTime > 100) {
- //主控端开始拖拽,客户端和主控端位置有偏差(操作过快导致syncRotate2没有校对完),为了防止旋转突变,采用渐变。
- this.lerpRatio = 0.1;
- } else {
- this.lerpRatio += 0.15;
- this.lerpRatio = Math.min(1, this.lerpRatio);
- } //console.log('this.lerpRatio',this.lerpRatio)
- lerp.quaternion(quaternion, endQuaternion)(this.lerpRatio);
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
- player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
- ;
- player.cameraControls.activeControl.locked = false, player.cameraControls.activeControl.update(0);
- player.cameraControls.activeControl.lockedForce = true; //禁止移动
- this.lastUpdateTime = time;
- };
- _this.copyCameraProp = function (player, info) {
- //复制录屏的数据给camera或control
- //options = options || {}
- var ctrl = player.cameraControls.activeControl;
- var camera = ctrl.camera;
- if (info.position) {
- camera.position.copy(info.position);
- } // else{
- // camera.position.copy(this.currentPano.position);//fly in时需要赋值
- // }
- if (info.quaternion) {
- /*
- if(options.transitionQua){//需要渐变quaternion
-
- var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
- this.setQuaternionTransition(_qua)
- }else{
- camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
-
- this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
-
- }
- //camera.quaternion.copy(item.qua);
- */
- camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
- } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
- info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
- //console.log('同屏数据', info)
- //俯视图情况
- if (info.scale) {
- ctrl.absoluteScale = info.scale;
- ctrl.updateZoom();
- } // if(item.zoom){//floorplan
- // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
- // ctrl.absoluteScale = ctrl.currentScale;
- // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
- // ctrl.updateZoom()
- // }
- //console.log("copyCameraProp")
- };
- _this.role = 'leader';
- _this.lastUpdateTime = 0;
- _this.lerpRatio = 1;
- return _this;
- }
- _createClass(FollowScreen, [{
- key: "start",
- value: function start() {
- var _this2 = this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- this.role = options.follow ? 'follow' : 'leader';
- _get(_getPrototypeOf(FollowScreen.prototype), "start", this).call(this);
- if (options.follow) {
- var player = this.app.core.get('Player');
- player.locked = true;
- if (!this.inited) {
- player.on(PlayerEvents.Rotate, function (params) {
- //客户端滑动屏幕,暂停被保持同步,直到主控端又对屏幕进行操作
- _this2.pauseSyncRot = true;
- _this2.stopLerpQua(player);
- });
- this.inited = true;
- }
- }
- }
- }, {
- key: "exit",
- value: function exit() {
- _get(_getPrototypeOf(FollowScreen.prototype), "exit", this).call(this);
- this.role = 'leader';
- var player = this.app.core.get('Player');
- if (player.locked) {
- player.locked = false;
- }
- }
- /**
- * 接收同步数据
- * @param {*} data
- */
- }, {
- key: "receive",
- value: function receive(data) {
- var _this3 = this;
- var player = this.app.core.get('Player');
- var flag = true;
- this.transform(data);
- if (this.role == 'leader') {
- switch (data.type) {
- case 'requestSync':
- this.sync();
- }
- } else {
- switch (data.type) {
- case 'flyToPano':
- if (player.panosTaskList.length > 0) {
- //console.log('因panosTaskList延迟')
- return setTimeout(function () {
- //之后不一定会触发 flying.ended 故用setTimeout
- _this3.requestSync(); //直接请求同步,因为可能有变动所以不能直接使用旧消息
- }, 500);
- } //console.log('flyToPano ', data.panoId )
- var targetPano = player.model.panos.index[parseInt(data.panoId)];
- player.locked = false;
- var target = {
- pano: targetPano
- };
- if (data.quaternion) {
- target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
- }
- if (player.mode == 'panorama' && player.currentPano.id == data.panoId) {
- //如果在当前点位,迅速转向,否则容易使panosTaskList.length非0而无法飞向下一点
- target.aimDuration = 0;
- }
- player.flyToPano(target, function () {
- player.locked = true;
- });
- break;
- case 'flyToNewMode':
- console.log('flyToNewMode', data.mode); //飞出的两种模式
- if (data.mode == player.mode) {
- //如果mode相同,转为moveModel使角度相同
- data.type = 'moveModel';
- data.info = {
- scale: data.currentScale,
- target: data.target,
- position: data.position,
- quaternion: data.quaternion
- };
- return this.receive(data);
- } else {
- if (data.panoId) {
- data.pano = player.model.panos.index[parseInt(data.panoId)];
- }
- player.locked = false;
- data.callback = function () {
- player.locked = true;
- };
- player.flyToNewMode(data); // if (data.modelInfo) {
- // if (data.modelInfo.panoId) {
- // data.modelInfo.pano = player.model.panos.index[parseInt(data.modelInfo.panoId)]
- // }
- // player.locked = false
- // data.modelInfo.callback = function () {
- // player.locked = true
- // }
- // } else {
- // if (data.panoId) {
- // data.pano = player.model.panos.index[parseInt(data.panoId)]
- // }
- // player.locked = false
- // data.callback = function () {
- // player.locked = true
- // }
- // }
- // player.flyToNewMode(data.modelInfo || data)
- break;
- }
- case 'rotate':
- // console.log('旋转', data)
- if (player.model.mode == Viewmode$1.PANORAMA) {
- flag = this.toSame(data, player, function () {
- this.syncRotate(data, player);
- }.bind(this));
- if (flag) {
- this.syncRotate(data, player);
- }
- }
- break;
- case 'endRotation':
- if (player.cameraControls && player.cameraControls.activeControl) {
- //console.log('停止旋转')
- player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed)) //旋转速度之后和主控端难以一致,所以不用
- //player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2()
- /*
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position)
- player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
- */
- }
- break;
- case 'syncRotContinue':
- if (player.cameraControls && player.cameraControls.activeControl) {
- this.syncRotate2(data, player);
- }
- break;
- case 'zoom':
- //console.log('缩放')
- flag = this.toSame(data, player, function () {
- player.handleControlScroll(data.zoom);
- }.bind(this));
- if (flag == null) ; else if (flag) {
- player.handleControlScroll(data.zoom);
- }
- break;
- case 'moveModel':
- //console.log('移动模型')
- flag = this.toSame(data, player, function () {
- this.copyCameraProp(player, data.info);
- }.bind(this));
- if (flag == null) ; else if (flag) {
- player.cameraControls.activeControl.lockedForce = true;
- player.locked = true;
- this.copyCameraProp(player, data.info);
- player.cameraControls.activeControl.locked = false;
- if (player.mode == Viewmode$1.PANORAMA) {
- player.locked = false;
- }
- }
- break;
- }
- }
- } //初始情况,可能两者状态不一致,这时候需要调整一致
- //通过data里的元素与player进行比较来判断
- }, {
- key: "syncRotate2",
- value: function syncRotate2(data, player) {
- var _this4 = this;
- //主控端停止滑动屏幕后,进行后续的旋转校对
- if (this.pauseSyncRot || player.mode != 'panorama') return; //客户端滑动了屏幕
- var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
- var maxTime = 500;
- var startTime = Date.now(); //console.error('endQuaternion', endQuaternion)
- if (this.lerpQuaFun) {
- this.stopLerpQua(player);
- }
- this.lerpQuaFun = function () {
- if (!player.cameraControls.activeControl) return _this4.stopLerpQua(player);
- var quaternion = player.quaternion.clone();
- lerp.quaternion(quaternion, endQuaternion)(0.1); //console.log('quaternion',quaternion)
- var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
- player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
- if (Date.now() - startTime > maxTime) {
- //一段时间后停止同步
- _this4.stopLerpQua(player);
- }
- };
- player.on('update', this.lerpQuaFun);
- }
- }, {
- key: "stopLerpQua",
- value: function stopLerpQua(player) {
- player.off('update', this.lerpQuaFun), this.lerpQuaFun = null; //, console.log('pause syncRot2')
- }
- /* syncRotate = function (data, player) {
- //漫游模式下的旋转同步--另一个版本,使quaternion完全一样,但拖拽完毕后手机客户端会回到限制的lat,有个画面跳跃。好处是客户端在主控端移动画面时无法改变旋转
- player.cameraControls.activeControl.lockedForce = true
- let quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w) //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
-
- player.cameraControls.activeControl.camera.quaternion.copy(quaternion)
- } */
- }]);
- return FollowScreen;
- }(Screen);
- var Broadcast = function Broadcast(app) {
- _classCallCheck(this, Broadcast);
- this.sync = new SyncScreen(app);
- this.follow = new FollowScreen(app);
- this.paint = new Paint(app);
- };
- 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); }; }
- 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; } }
- var player$9, sceneRenderer$1;
- var viewHeights = {}; //balloon统一高度
- var posMaxRadius; //限制balloon到center的距离
- var ViewLinkEdit = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(ViewLinkEdit, _THREE$EventDispatche);
- var _super = _createSuper$s(ViewLinkEdit);
- function ViewLinkEdit(app) {
- var _this;
- _classCallCheck(this, ViewLinkEdit);
- _this = _super.call(this);
- _this.app = app; //let deferred = Deferred()
- _this.app.Scene.on('loaded', function () {
- //if(app.config.isRouteSnap)return
- player$9 = _this.app.core.get('Player');
- sceneRenderer$1 = _this.app.core.get('SceneRenderer');
- _this.init();
- if (_this.editing) {
- _this.enter();
- } //deferred.resolve()
- });
- window.editView = _assertThisInitialized(_this);
- return _this;
- }
- _createClass(ViewLinkEdit, [{
- key: "init",
- value: function init() {
- var _this2 = this;
- //根据模型大小来确定balloon距心最大距离
- 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);
- player$9.model.floors.list.forEach(function (floor) {
- var height = 0;
- floor.panos.forEach(function (pano) {
- height += pano.position.y;
- });
- height /= floor.panos.length;
- viewHeights[floor.floorIndex] = height;
- }); //用来获取鼠标的三维位置的intersectPlane
- this.ground = new THREE.Mesh(new THREE.PlaneGeometry(80000, 80000, 1, 1), new THREE.MeshBasicMaterial({
- transparent: true,
- wireframe: true,
- opacity: 0,
- side: THREE.DoubleSide,
- depthTest: false
- }));
- this.ground.lookAt(new THREE.Vector3(0, 1, 0));
- this.ground.name = 'editviewLink-ground'; //player.model.add(this.ground) //调试时再加
- this.ground.position.setY(player$9.model.center.y); //balloon和circle之间的虚线
- var points = [{
- x: 0,
- y: 0,
- z: 0
- }, {
- x: 10,
- y: 0,
- z: 0
- }]; //虚线分段似乎一开始就根据长度算好了,如果不重算则分段数不变。
- this.linkLine = LineDraw.createFatLine(points, {
- material: LineDraw.createFatLineMat({
- lineWidth: 3,
- color: Colors.mainColor,
- dashed: true,
- gapSize: 0.2,
- dashSize: 0.3
- })
- });
- player$9.model.add(this.linkLine); //balloon或circle到pano之间的连线
- this.linkLine2 = LineDraw.createFatLine(points, {
- material: LineDraw.createFatLineMat({
- lineWidth: 3,
- opacity: 0.2,
- color: Colors.mainColor
- })
- });
- player$9.model.add(this.linkLine2);
- this.linkLine.visible = this.linkLine2.visible = false;
- this.events = {
- changeFloor: function changeFloor(toFloor, mode) {
- if (_this2.settingPos) {
- //正在设置可视
- _this2.fadeMarkerByFloor(true);
- }
- },
- movePos: function movePos() {
- _this2.movePos();
- },
- confirmPos: function confirmPos(e) {
- e.consume();
- _this2.confirmPos();
- },
- dragStart: function dragStart() {
- if (_this2.markView && !player$9.enteringView) {
- if (player$9.viewLinkManager.hoverBalloon && _this2.markView.balloon == player$9.viewLinkManager.hoverBalloon) _this2.dragBalloonStart();
- if (player$9.viewLinkManager.hoverExit) _this2.dragExitStart();else if (player$9.viewLinkManager.hoverCircle) _this2.dragViewStart(player$9.viewLinkManager.hoverCircle.mesh);
- }
- },
- dragEnd: function dragEnd(e) {
- _this2.handelDragEnd(e);
- },
- lookAim: function lookAim() {
- //转向circle
- player$9.on('ifFocusPoint', function (askAim) {
- if (_this2.editing && _this2.markView) {
- var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
- if (askAim.importance < importance) {
- askAim.importance = importance;
- askAim.aim = _this2.markView.circle.mesh.position.clone();
- }
- }
- });
- }
- };
- player$9.viewLinkManager.dispatchEvent({
- type: 'getViewLinkEdit',
- v: this
- });
- player$9.viewLinkManager.addEventListener('changeIntersect', function (e) {
- _this2.dispatchEvent({
- type: 'changeIntersect',
- hovered: e.hovered
- });
- });
- this.inited = true;
- }
- }, {
- key: "enter",
- value: function enter() {
- this.editing = true;
- if (!sceneRenderer$1) return; //sceneRenderer.addComponent(this)
- player$9.model.on('floor.changed', this.events.changeFloor);
- player$9.on('pointerStart', this.events.dragStart); //this.setSize(sceneRenderer.renderer.domElement.width, sceneRenderer.renderer.domElement.height)
- player$9.on('pointerMove', this.events.movePos);
- player$9.on('pointerUp', this.events.dragEnd);
- player$9.on('ifFocusPoint', this.events.lookAim);
- }
- }, {
- key: "leave",
- value: function leave() {
- this.editing = false;
- if (!sceneRenderer$1) return;
- sceneRenderer$1.removeComponent(this);
- player$9.model.off('floor.changed', this.events.changeFloor);
- player$9.off('pointerStart', this.events.dragStart);
- player$9.off('pointerUp', this.events.dragEnd);
- player$9.off('pointerMove', this.events.movePos);
- player$9.off('ifFocusPoint', this.events.lookAim);
- }
- }, {
- key: "setSize",
- value: function setSize(x, y) {
- //更新屏幕大小后
- if (!this.inited) return;
- /* this.linkLine.material.resolution.set(x, y)
- this.linkLine2.material.resolution.set(x, y) */
- }
- }, {
- key: "checkCanAddView",
- value: function checkCanAddView() {
- return this.inited && !player$9.flying && player$9.viewLinkManager.inited;
- }
- }, {
- key: "addView",
- value: function addView() {
- var _this3 = this;
- // zeg 如果此时正在观看监控,应该要先退出来
- if (this.app.Camera.monitor.control && this.app.Camera.monitor.control.watchingCamera) {
- this.app.Camera.monitor.control.stopWatch();
- var control = player$9.cameraControls.controls.dollhouse;
- control.target.set(0, 0, 0);
- control.camera.position.setY(50);
- control.resetRanges();
- } //添加
- if (!this.checkCanAddView()) {
- //$waiting.show()
- var timer = setInterval(function () {
- if (_this3.checkCanAddView()) {
- _this3.addView();
- clearInterval(timer);
- }
- }, 50);
- return;
- } // zeg markView作为开始编辑的标识被我从begin()里提出来了
- this.markView = new ViewLink({
- sid: 'view360_' + common$1.getRandomSid()
- }, this.app);
- player$9.viewLinkManager.addView(this.markView);
- var begin = function begin() {
- _this3.markView.balloon.showOrHide(true, 0);
- player$9.updateFromControls(); //刚飞到floorplan先更新下camera
- _this3.beginSetPos();
- _this3.setEditState(true);
- CursorDeal.add('viewChoosePos');
- };
- if (!player$9.isOutsideMode()) {
- player$9.flyToMode('floorplan', begin);
- } else begin();
- player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- player$9.modelSideManager.tempAuto();
- }
- }, {
- key: "reEditView",
- value: function reEditView(sid) {
- //点击列表编辑view
- this.markView = player$9.viewLinkManager.views[sid];
- this.oldData = this.getData();
- this.reEdit = true;
- this.setEditState(true);
- this.markView.circle.mesh.visible = true;
- player$9.viewLinkManager.focusOn(this.markView);
- if (player$9.mode == 'dollhouse' || player$9.mode == 'floorplan') {
- this.markView.balloon.showOrHide(true, 0);
- }
- player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
- player$9.modelSideManager.tempAuto();
- }
- }, {
- key: "setEditState",
- value: function setEditState(state) {
- state = !!state;
- /* this.markView.balloon.setSelect(state)
- this.markView.circle.setSelect(state) */
- this.markView.setSelect(state);
- this.markView.balloon.setStrictScale(state);
- if (!state) {
- this.reEdit = false;
- this.markView = null; //这个是是否在编辑的标志
- }
- this.app.TagManager.switchAllDisplay(!state, 'editView', {
- links: true
- });
- player$9.model.setModelDisplay(state, 'editView', 2, state ? 'add' : 'cancel');
- common$1.updateVisible(player$9.viewLinkManager.group, 'edit', state, 10, state ? 'add' : 'cancel');
- player$9.viewLinkManager.enabled = state;
- player$9.emit('editViewStateChange', state);
- } //退出某个view的编辑
- }, {
- key: "exit",
- value: function exit() {
- if (!this.markView) return;
- this.stopSetPos();
- this.cancelSetExit();
- this.cancelSetEntry();
- this.markView.circle.setSelect(false);
- if (player$9.modeTran.split('-')[1] != 'panorama') this.markView.circle.mesh.visible = false;
- this.markView.balloon.showOrHide(null, 50, 'auto');
- this.setEditState(false);
- player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.showCadPlane(); // 显示户型图
- player$9.modelSideManager.recover();
- }
- /*
- 点击退出(取消)
- */
- }, {
- key: "cancelEdit",
- value: function cancelEdit() {
- if (!this.markView) return;
- if (!this.reEdit) {
- player$9.viewLinkManager.removeView(this.markView);
- this.markView.dispose();
- } else {
- this.markView.titleLabel.setText(this.oldData.title);
- this.markView.circle.mesh.scale.set(this.oldData.circle.scale, this.oldData.circle.scale, this.oldData.circle.scale);
- this.markView.balloon.mesh.position.copy(this.oldData.balloon.pos);
- this.markView.circle.updatePos('normal', {
- position: this.oldData.circle.pos,
- quaternion: this.oldData.circle.qua
- });
- this.markView.nearestPano = this.oldData.nearestPano;
- this.markView.linkType = this.oldData.linkType;
- this.markView.url = this.oldData.url;
- this.changeType(this.markView.linkType); //全景图还原
- this.markView.panoImgVersion = this.oldData.panoImgVersion;
- this.markView.setPano({
- thumbPanoTex: this.markView.thumbPanoTex != this.oldData.thumbPanoTex && this.oldData.thumbPanoTex
- });
- this.markView.circle.setMapOut(this.oldData.circle.mapOut);
- this.markView.exitDoor.setMapOut(this.oldData.exit.mapOut);
- if (!this.markView.enterQuaternion.equals(this.oldData.enterQuaternion)) {
- this.markView.enterQuaternion = this.oldData.enterQuaternion.clone();
- this.markView.linkType == 'pano' && this.markView.mapChangeRot();
- }
- this.markView.exitDirection = this.oldData.exitDirection.clone();
- this.cancelSetExit(); //应用到mesh
- }
- this.exit();
- }
- /*
-
- 点击保存(确定)
- */
- }, {
- key: "confirmEdit",
- value: function confirmEdit() {
- console.log('confirmEdit');
- if (this.markView.floor != this.markView.nearestPano.floor) {
- if (this.markView.pano) {
- this.markView.pano.floorIndex = this.markView.nearestPano.floorIndex;
- this.markView.pano.floor.removePano(this.markView.pano);
- this.markView.pano.floor = this.markView.nearestPano.floor;
- this.markView.pano.floor.addPano(this.markView.pano);
- }
- this.markView.floor && this.markView.floor.removeView(this.markView);
- this.markView.floor = this.markView.nearestPano.floor;
- this.markView.floor.addView(this.markView);
- }
- this.exit();
- }
- }, {
- key: "fadeMarkerByFloor",
- value: function fadeMarkerByFloor(state) {
- player$9.model.panos.forEach(function (pano) {
- if (!pano.isAligned()) return;
- var visi = state && (player$9.model.allFloorsVisible || !pano.floor.hidden);
- /* if(visi){
- pano.marker.updateStyle(null,'normal')//去掉videoTag
- }else{
- pano.updateMakerStyle() //恢复
- } */
- pano.marker.material.opacity = visi ? 1 : 0;
- });
- }
- }, {
- key: "beginSetPos",
- value: function beginSetPos(type) {
- this.settingPos = true;
- this.markView.circle.state = 'sprite';
- this.fadeMarkerByFloor(true); //this.markView.circle.mesh.material.depthTest = false
- this.markView.circle.mesh.visible = true;
- this.markView.update(player$9.camera, true);
- this.markView.circle.mesh.visible = false; //因为位置还没计算好
- this.placeGround();
- if (type != 'reset') {
- this.movePos('init'); //为了防止 直接confirmPos导致缺少数据 nearestPano
- }
- player$9.on('click', this.events.confirmPos);
- }
- }, {
- key: "stopSetPos",
- value: function stopSetPos() {
- if (this.settingPos) {
- this.settingPos = false;
- this.linkLine.visible = false;
- this.linkLine2.visible = false; //this.markView.circle.mesh.visible = false;
- this.markView.circle.state = '3D';
- this.markView.circle.quaternion && this.markView.circle.mesh.quaternion.copy(this.markView.circle.quaternion); //this.markView.circle.mesh.material.depthTest = true
- this.fadeMarkerByFloor(false);
- player$9.off('click', this.events.confirmPos);
- CursorDeal.remove('viewChoosePos');
- }
- }
- }, {
- key: "confirmPos",
- value: function confirmPos() {
- this.stopSetPos();
- this.dispatchEvent({
- type: 'confirm',
- info: {
- sid: this.markView.sid,
- balloon: {
- pos: this.markView.balloon.mesh.position.toArray()
- },
- circle: {
- pos: this.markView.circle.position.toArray(),
- qua: this.markView.circle.quaternion.toArray(),
- scale: Math.round(this.markView.circle.mesh.scale.x * 100)
- },
- nearestPano: this.markView.nearestPano.id,
- enterQuaternion: this.markView.enterQuaternion.toArray(),
- exitDirection: this.markView.exitDirection.toArray()
- }
- });
- }
- }, {
- key: "cancelPos",
- value: function cancelPos() {
- this.dispatchEvent({
- type: 'cancelPos'
- });
- }
- }, {
- key: "reSetPos",
- value: function reSetPos() {
- //修改关联点位置
- this.markView.balloon.setSelect(true);
- player$9.viewLinkManager.focusOn(this.markView);
- }
- }, {
- key: "focusView",
- value: function focusView(sid) {
- var view = player$9.viewLinkManager.views[sid];
- player$9.viewLinkManager.focusOn(view);
- }
- }, {
- key: "changeScale",
- value: function changeScale(s) {
- //大小
- console.log('changeScale', s);
- this.markView.circle.mesh.scale.set(s, s, s);
- this.markView.titleLabel.updatePos(); //this.confirmPos()
- }
- /*
- 设置位置时计算位置
- 设置balloon位置:
- 类同编辑户型时的拖拽点的方法,找到balloon在地面上的位置。 但是如果鼠标朝上,只能在天空找到交点,(在编辑页面是不做处理不会响应,在此希望能随着鼠标方向改变balloon,所以)将天空上的balloon投射到地面即可。
- circle的位置确定方法: 先找到和balloon最近的漫游点pano,然后过pano向balloon作一条射线, 结果有两种情况:1是和模型有交点,则位置就是交点位置(贴墙); 2是无交点,则位置定为线上到pano一定距离的一点(面朝pano)。
- 其中1也分为两种情况:circle在pano和balloon之间、以及balloon在circle和交点之间。这影响到linkLine的表现。
- */
- }, {
- key: "movePos",
- value: function movePos(type) {
- if (this.settingPos) {
- var center = player$9.model.center.clone();
- var intersect = player$9.getMouseIntersect(null, [this.ground]);
- if (!intersect) {
- console.error('no intersect'); //console.log(player.mode)
- return;
- }
- if (player$9.model.allFloorsVisible) {
- if (type != 'init') center.setY(this.markView.balloon.mesh.position.y); //不改变原先的高度
- } else {
- if (player$9.model.currentFloor.panos.length == 0) {
- console.warn('该层无漫游点!');
- this.stopSetPos();
- return;
- }
- center.setY(viewHeights[player$9.model.currentFloor.floorIndex]);
- }
- var pos = convertTool.getPosAtPlane(intersect.point, player$9, {
- y: center.y
- });
- if (!pos) {
- //交点在center所在高度的地平线以上,向上再求一次交点,然后把y值改为相机无法达到的高度100,然后再降下来
- pos = convertTool.getPosAtPlane(intersect.point, player$9, {
- y: 100
- });
- pos.y = center.y;
- }
- if (pos && pos.distanceTo(center) > posMaxRadius) {
- //限制到center的距离
- pos = center.clone().add(pos.clone().sub(center).normalize().multiplyScalar(posMaxRadius));
- } //-------circle pos-------------------
- var pos2;
- var _qua = this.markView.circle.mesh.quaternion.clone();
- var nearestPanos = common$1.sortByScore(player$9.model.panos.list, [Panorama.filters.isPanoAligned(), function (pano) {
- return player$9.model.allFloorsVisible || pano.floor == player$9.model.currentFloor;
- }], [function (pano) {
- return -pos.distanceTo(pano.position);
- }]).map(function (e) {
- return e.item;
- }); //不要在视频区域的
- var nearestPano = nearestPanos.find(function (pano) {
- var panoVideoFilter = pano.getVideoFilter();
- var pos_ = new THREE.Vector3().copy(pos).setY(pano.position.y);
- return !panoVideoFilter || !panoVideoFilter(pos_);
- });
- if (!nearestPano) nearestPano = nearestPanos[0];
- var panoPos = nearestPano.position.clone(); //.setY(pos.y);
- this.markView.nearestPano = nearestPano;
- pos.setY(panoPos.y);
- this.markView.balloon.mesh.position.copy(pos);
- this.markView.balloon.update();
- var intersect = convertTool.ifIntersectChunks(panoPos, pos, player$9.model, {
- InfinityLen: true
- });
- if (!intersect) {
- //没有可以贴边的mesh就限制到pano的距离
- var dir = pos.clone().sub(nearestPano.position).setY(0).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
- pos2 = panoPos.clone().add(dir);
- this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
- } else {
- var normal = intersect[0].face.normal.applyQuaternion(intersect[0].object.quaternion);
- /* var point = this.position.clone().sub(object3d.point);
- if (point.dot(object3d.normal) < 0) {
- //x,y,z全部反向
- object3d.normal.negate();
- } */
- pos2 = intersect[0].point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
- this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
- }
- this.markView.circle.mesh.visible = true;
- this.markView.circle.updatePos('normal', {
- position: pos2,
- quaternion: this.markView.circle.mesh.quaternion.clone()
- });
- this.markView.circle.mesh.quaternion.copy(_qua); //-------link line ------------
- //为了让线不穿过balloon显示在白色圈内
- var vec = pos.clone().sub(pos2);
- var len = vec.length();
- var pos3 = pos2.clone().add(vec.multiplyScalar(Math.max(0, (len - 0.4) / len))); //multiplyScalar是为了线不遮挡到balloon中心区域
- pos3.y -= 0.01; //for floorplan
- var points = [pos3, pos2];
- LineDraw.moveFatLine(this.linkLine, points); //lineGeometry.computeLineDistances()
- if (panoPos.distanceTo(pos2) < panoPos.distanceTo(pos3)) {
- var points = [panoPos, pos2];
- } else {
- var points = [panoPos, pos3];
- }
- LineDraw.moveFatLine(this.linkLine2, points);
- this.linkLine.visible = true;
- this.linkLine2.visible = true;
- } else if (this.draggingExit) {
- var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
- this.markView.exitDoor.mesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
- } else if (this.draggingCircleAtView) {
- if (this.settingVisibles) {
- var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
- this.draggingMesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
- this.saveVisibleViews();
- } else {
- //拖拽circle修改位置
- var pos2;
- var panoPos = player$9.position.clone();
- var intersect = convertTool.getMouseIntersect(player$9.camera, player$9.model.colliders.concat(player$9.model.skybox), player$9.mouse);
- if (intersect.object == player$9.model.skybox) {
- //没有可以贴边的mesh就限制到pano的距离
- var dir = intersect.point.clone().sub(panoPos).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
- pos2 = panoPos.clone().add(dir);
- this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
- } else {
- var normal = intersect.face.normal.applyQuaternion(intersect.object.quaternion);
- if (player$9.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
- normal = normal.negate();
- }
- pos2 = intersect.point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
- this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
- } //this.markView.circle.mesh.visible = true
- this.markView.circle.updatePos('normal', {
- position: pos2,
- quaternion: this.markView.circle.mesh.quaternion.clone()
- });
- this.markView.nearestPano = player$9.currentPano;
- }
- }
- } //同编辑户型中的placeIntersectPlane
- }, {
- key: "placeGround",
- value: function placeGround() {
- this.ground.position.copy(this.markView.balloon.mesh.position);
- this.ground.lookAt(this.ground.position.clone().add(player$9.getDirection(null, player$9.camera)));
- }
- }, {
- key: "changeType",
- value: function changeType(type) {
- //切换类型 'url' || 'pano'
- console.log('changeType', type);
- this.markView.linkType = type;
- this.markView.setPano();
- }
- }, {
- key: "changeTitle",
- value: function changeTitle(text) {
- this.markView.titleLabel.setText(text);
- }
- }, {
- key: "uploadedPanoMap",
- value: function uploadedPanoMap(data) {
- //添加全景图片后
- console.log('uploadedPanoMap ', data);
- data.mapSrc = data.thumb;
- this.changeType('pano');
- this.markView.pano;
- this.markView.setPano({
- reloadTex: true,
- mapSrc: data.mapSrc,
- thumb: data.thumb
- /* version: Date.now() */
- }); //mapSrc临时的全景blob src , thumb:小张的封面src
- }
- /* deletePanoMap(){
-
- } */
- }, {
- key: "setLinkUrl",
- value: function setLinkUrl(url) {
- //修改跳转链接
- this.markView.url = url;
- }
- }, {
- key: "setCircleMap",
- value: function setCircleMap(sid, src) {
- //设置关联点样式(circle的map)
- console.log('setCircleMap', sid, src);
- if (typeof src == 'object') {
- src = {
- style: {
- enter: src
- }
- };
- }
- player$9.viewLinkManager.views[sid].circle.setMapOut(src);
- }
- }, {
- key: "setExitMap",
- value: function setExitMap(sid, src) {
- //设置跳出点样式
- console.log('setExitMap', sid, src);
- if (typeof src == 'object') {
- src = {
- style: {
- exit: src
- }
- };
- }
- player$9.viewLinkManager.views[sid].exitDoor.setMapOut(src);
- }
- }, {
- key: "deleteView",
- value: function deleteView(sid) {
- //点击删除
- try {
- player$9.viewLinkManager.views[sid].dispose();
- player$9.viewLinkManager.removeView(player$9.viewLinkManager.views[sid]);
- } catch (e) {
- console.log(e);
- }
- }
- }, {
- key: "enterView",
- value: function enterView(fun) {
- var _this4 = this;
- var done = function done() {
- //$waiting.hide()
- fun && fun();
- }; //$waiting.show()
- if (player$9.flying) {
- //player.waitFlytoItemFuc = enterView.bind(this, fun);
- player$9.once('flying.ended', function () {
- _this4.enterView(fun);
- });
- return;
- }
- if (player$9.currentPano == this.markView.pano && player$9.mode == 'panorama') {
- done();
- } else {
- this.markView.enter360Pano(done);
- }
- }
- }, {
- key: "exitView",
- value: function exitView() {
- return new Promise(function (resolve, reject) {
- player$9.viewLinkManager.exitView().then(function () {
- resolve('success');
- });
- });
- } //-----------------------
- }, {
- key: "beginSetEntry",
- value: function beginSetEntry() {
- var _this5 = this;
- //开始设置进入画面(进入的朝向)
- var deferred = new Deferred$1();
- console.log('beginSetEntry');
- this.settingEntry = true;
- this.enterView(function () {
- /* var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(this.markView.enterQuaternion).add(player.cameraControls.activeControl.camera.position)
- player.flyToPano({pano:player.currentPano, lookAtPoint, rotSpeed:2 }) */
- deferred.resolve();
- player$9.flyToPano({
- pano: player$9.currentPano,
- quaternion: _this5.markView.enterQuaternion,
- rotSpeed: 2
- });
- });
- return deferred.promise();
- }
- }, {
- key: "confirmEntry",
- value: function confirmEntry() {
- //确定进入画面
- if (player$9.currentPano != this.markView.pano) return;
- this.markView.pano.quaternion.copy(player$9.quaternion);
- this.markView.enterQuaternion.copy(player$9.quaternion);
- this.markView.mapChangeRot();
- this.dispatchEvent({
- type: 'confirmEntry',
- sid: this.markView.sid,
- enterQuaternion: player$9.quaternion.toArray()
- });
- this.cancelSetEntry();
- }
- }, {
- key: "cancelSetEntry",
- value: function cancelSetEntry() {
- //取消进入画面
- if (!this.settingEntry) return;
- this.settingEntry = false;
- this.markView.backToPanorama();
- } //-----------------------
- }, {
- key: "beginSetExit",
- value: function beginSetExit() {
- var _this6 = this;
- //开始设置跳出点位置
- console.log('beginSetExit');
- var deferred = new Deferred$1();
- this.settingExit = true;
- this.enterView(function () {
- deferred.resolve();
- player$9.flyToPano({
- pano: player$9.currentPano,
- lookAtPoint: _this6.markView.exitDoor.mesh.position,
- rotSpeed: 2
- });
- }); //this.tempExitPos = this.markView.exitDirection.clone();
- return deferred.promise();
- }
- }, {
- key: "confirmExit",
- value: function confirmExit() {
- //确定跳出点位置
- this.markView.exitDirection = this.markView.exitDoor.mesh.position.clone();
- this.dispatchEvent({
- type: 'confirmExit',
- sid: this.markView.sid,
- exitDirection: this.markView.exitDirection.toArray()
- });
- if (this.markView.linkType != 'pano') {
- //清空
- this.markView.thumbPanoTex && this.markView.thumbPanoTex.dispose();
- this.markView.thumbPanoTex = null;
- }
- this.cancelSetExit(true);
- }
- }, {
- key: "cancelSetExit",
- value: function cancelSetExit(makeit) {
- //取消跳出点位置
- if (!this.settingExit) return;
- this.settingExit = false;
- makeit || this.markView.exitDoor.mesh.position.copy(this.markView.exitDirection);
- this.markView.backToPanorama();
- } //-----------------------
- }, {
- key: "beginSetVisibleViews",
- value: function beginSetVisibleViews(sid) {
- //开始设置可见的view
- this.markView = player$9.viewLinkManager.views[sid];
- enterView(function () {});
- this.settingVisibles = true;
- this.oldVisibleData = JSON.parse(JSON.stringify(this.markView.visibleViews));
- }
- }, {
- key: "addVisibleView",
- value: function addVisibleView(sid, event) {
- console.log('addVisibleView ' + sid);
- var view = player$9.viewLinkManager.views[sid]; //this.markView.visibleViews[sid] = {}
- view.circle.mesh.visible = true;
- player$9.handleInputStart(event.offsetX, event.offsetY, true, true); //更新mouse
- var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
- view.circle.updatePos('at360View', {
- viewDir: intersect.point.clone()
- }); // sub(center)
- view.circle.update(player$9.camera); //player.mouseDown = false; //移动端这个不会归零 所以手动
- //view.circle.updatePos("at360View",{viewDir: view.circle.position.clone().sub(this.markView.circle.position)})
- //player.lookAtPos(view.circle.mesh.position, null, {speed:0.2})
- this.saveVisibleViews();
- }
- }, {
- key: "delVisibleView",
- value: function delVisibleView(sid) {
- delete this.markView.visibleViews[sid];
- var view = player$9.viewLinkManager.views[sid];
- view.circle.mesh.visible = false;
- this.saveVisibleViews();
- }
- }, {
- key: "saveVisibleViews",
- value: function saveVisibleViews() {
- var data = {};
- for (var i in player$9.viewLinkManager.views) {
- if (player$9.viewLinkManager.views[i].circle.mesh.visible) {
- data[i] = player$9.viewLinkManager.views[i].circle.mesh.position.toArray();
- }
- }
- this.markView.visibleViews = data; //this.finishVisibleViews()//???
- }
- }, {
- key: "cancelVisibleViews",
- value: function cancelVisibleViews(sid) {
- //取消
- this.markView.visibleViews = this.oldVisibleData;
- this.markView.backToPanorama(); //直接退出全景
- bus.emit('link/tag/links', {
- sid: this.markView.sid,
- visibleViews: this.markView.visibleViews
- });
- this.finishVisibleViews();
- }
- }, {
- key: "finishVisibleViews",
- value: function finishVisibleViews() {
- this.settingVisibles = false;
- this.markView = null;
- } //----------事件--------
- }, {
- key: "handelClickView",
- value: function handelClickView() {
- if (this.settingPos) {
- this.confirmPos();
- return true;
- }
- }
- }, {
- key: "dragBalloonStart",
- value: function dragBalloonStart() {
- if (this.settingPos) return;
- this.beginSetPos('reset'); //console.log("draggingBall")
- this.draggingBall = true;
- player$9.cameraControls.activeControl.enabled = false;
- }
- }, {
- key: "dragExitStart",
- value: function dragExitStart() {
- //拖动Exit
- if (!this.settingExit) return;
- this.draggingExit = true;
- player$9.cameraControls.activeControl.enabled = false;
- }
- }, {
- key: "dragViewStart",
- value: function dragViewStart(mesh) {
- //拖动
- //if(!this.settingVisibles)return;
- if (this.settingVisibles || this.markView && mesh == this.markView.circle.mesh) {
- this.draggingCircleAtView = true;
- this.draggingMesh = mesh;
- player$9.cameraControls.activeControl.enabled = false;
- }
- }
- }, {
- key: "handelDragEnd",
- value: function handelDragEnd() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (player$9.flying) return;
- if (!this.draggingBall && !this.draggingExit && !this.draggingCircleAtView) return; // zeg 做个限制,防止设置activeControl影响到其它模块
- if (this.draggingBall) {
- this.draggingBall = false; //handelClickView()
- if (this.settingPos) {
- e.cancel || this.confirmPos();
- }
- e.consume && e.consume();
- } else if (this.draggingExit) {
- this.draggingExit = false;
- player$9.cameraControls.activeControl.pointerDragOn = false;
- e.consume && e.consume();
- } else if (this.draggingCircleAtView) {
- this.draggingCircleAtView = false;
- player$9.cameraControls.activeControl.pointerDragOn = false;
- e.cancel || this.confirmPos();
- e.consume && e.consume();
- }
- this.draggingMesh = null; //console.log("handelDragEnd")
- player$9.cameraControls.activeControl.enabled = true;
- }
- }, {
- key: "getData",
- value: function getData(type) {
- return {
- sid: this.markView.sid,
- title: this.markView.titleLabel.text,
- balloon: {
- pos: this.markView.balloon.mesh.position.clone()
- },
- circle: {
- pos: this.markView.circle.position.clone(),
- qua: this.markView.circle.quaternion.clone(),
- mapOut: this.markView.circle.mesh.material.uniforms.mapOut.value,
- scale: this.markView.circle.mesh.scale.x
- },
- exit: {
- mapOut: this.markView.exitDoor.mesh.material.uniforms.mapOut.value
- },
- exitDirection: this.markView.exitDirection.clone(),
- enterQuaternion: this.markView.enterQuaternion.clone(),
- //quaternion : this.markView.quaternion,
- panoImgVersion: this.markView.panoImgVersion,
- url: this.markView.url,
- thumbPanoTex: this.markView.thumbPanoTex,
- linkType: this.markView.linkType,
- nearestPano: this.markView.nearestPano
- };
- }
- }, {
- key: "showAll",
- value: function showAll() {
- var _this7 = this;
- if (!this.inited) {
- setTimeout(function () {
- _this7.showAll();
- }, 200);
- return;
- }
- player$9.viewLinkManager.showAllViews();
- }
- }, {
- key: "hideAll",
- value: function hideAll() {
- var _this8 = this;
- if (!this.inited) {
- setTimeout(function () {
- _this8.hideAll();
- }, 200);
- return;
- }
- player$9.viewLinkManager.hideAllViews();
- }
- }, {
- key: "highlight",
- value: function highlight(sid) {
- var views = player$9.viewLinkManager.views;
- var view = views[sid];
- if (this.markView && !view) return; //持续高亮,不允许修改
- if (view) view.setSelect(true);else {
- for (var i in views) {
- views[i].setSelect(false);
- }
- }
- }
- }]);
- return ViewLinkEdit;
- }(THREE.EventDispatcher);
- 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); }; }
- 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; } }
- var FilterManager = /*#__PURE__*/function (_Emiter) {
- _inherits(FilterManager, _Emiter);
- var _super = _createSuper$r(FilterManager);
- function FilterManager(app) {
- var _this;
- _classCallCheck(this, FilterManager);
- _this = _super.call(this);
- _this.app = app;
- _this.edit = {};
- var player;
- var deferred = Deferred$1();
- _this.filterTemp = {}; // 用于暂存多个点位的调节数据
- _this.app.Scene.on('loaded', function () {
- player = _this.app.core.get('Player');
- player.on(PlayerEvents.PanoChosen, function (pano0, pano1) {
- // 点位跳转时,传给UI调节数据
- _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(_this.filterTemp[pano1.id] || pano1.filterEffect)));
- });
- deferred.resolve();
- });
- _this.edit.enter = function () {
- if (player) {
- // 初始化时,传给UI调节数据
- _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
- } else {
- deferred.then(function () {
- return _this.edit.enter();
- });
- }
- }; // 开始设置调节
- _this.edit.startFilter = function () {
- // 调节仅限于panorama模式下修改
- player.flyToNewMode({
- mode: 'panorama',
- pano: player.currentPano
- });
- }; // 亮度 [-1 ~ 1]
- _this.edit.brightness = function (num) {
- _this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterBase0'].value.setX(num);
- material.uniforms['filterBase1'].value.setX(num);
- material.defines['hasFilter'] = true; // 必须设置hasFilter,否则调节相关shader将失效
- material.needsUpdate = true;
- });
- _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
- _this.filterTemp[player.currentPano.id].brightness = num;
- }; // 对比度 [-1 ~ 1]
- _this.edit.contrast = function (num) {
- _this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterBase0'].value.setY(num);
- material.uniforms['filterBase1'].value.setY(num);
- material.defines['hasFilter'] = true;
- material.needsUpdate = true;
- });
- _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
- _this.filterTemp[player.currentPano.id].contrast = num;
- }; // 饱和度 [-1 ~ 1]
- _this.edit.saturation = function (num) {
- _this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterBase0'].value.setZ(num);
- material.uniforms['filterBase1'].value.setZ(num);
- material.defines['hasFilter'] = true;
- material.needsUpdate = true;
- });
- _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
- _this.filterTemp[player.currentPano.id].saturation = num;
- }; // 色温 [-1 ~ 1]
- _this.edit.temperature = function (num) {
- _this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterTemperature0'].value = num;
- material.uniforms['filterTemperature1'].value = num;
- material.defines['hasFilter'] = true;
- material.needsUpdate = true;
- });
- _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
- _this.filterTemp[player.currentPano.id].temperature = num;
- }; // 清除当前调节效果
- _this.edit.clearCurrent = function () {
- _this.edit.brightness(0);
- _this.edit.contrast(0);
- _this.edit.saturation(0);
- _this.edit.temperature(0);
- }; // 应用当前调节效果至所有点位
- _this.edit.applyCurrent2All = function () {
- var currentFilterEffect = _this.filterTemp[player.currentPano.id] || player.currentPano.filterEffect;
- player.model.panos.list.forEach(function (pano) {
- if (pano.panoType) return;
- _this.filterTemp[pano.id] = JSON.parse(JSON.stringify(currentFilterEffect));
- });
- }; // 保存调解数据
- _this.edit.save = function () {
- var saveInfo = [];
- player.model.panos.list.forEach(function (pano) {
- // 当temp有数据的话,保存temp里的数据
- if (_this.filterTemp[pano.id]) {
- saveInfo.push(Object.assign({
- id: pano.id
- }, _this.filterTemp[pano.id]));
- } // 当temp没有数据的话,保存原有的值
- else if (pano.filterEffect.brightness != 0 || pano.filterEffect.contrast != 0 || pano.filterEffect.saturation != 0 || pano.filterEffect.temperature != 0) {
- saveInfo.push(Object.assign({
- id: pano.id
- }, pano.filterEffect));
- }
- });
- var self = _assertThisInitialized(_this);
- return {
- data: saveInfo,
- successCallBack: function successCallBack() {
- Object.keys(self.filterTemp).forEach(function (panoId) {
- // 将temp里的数据保存在pano.filterEffect里面
- player.model.panos.index[panoId].filterEffect = self.filterTemp[panoId];
- });
- _this.getPanoMaterials().forEach(function (material) {
- // 更新hasFilter
- player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
- material.needsUpdate = true;
- });
- self.filterTemp = {};
- }
- };
- }; // 撤销已有修改
- _this.edit.undoEdit = function () {
- _this.filterTemp = {};
- var filterEffect = player.currentPano.filterEffect;
- _this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterBase0'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
- material.uniforms['filterBase1'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
- material.uniforms['filterTemperature0'].value = filterEffect.temperature;
- material.uniforms['filterTemperature1'].value = filterEffect.temperature; // 更新hasFilter
- player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
- material.needsUpdate = true;
- }); // 撤销时,传给UI调节数据
- _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(filterEffect)));
- };
- return _this;
- }
- _createClass(FilterManager, [{
- key: "initFilters",
- value: function initFilters() {
- var _this2 = this;
- // 初始数据
- var initData = function initData(filterList) {
- filterList.forEach(function (data) {
- var panoId = data.id;
- var pano = _this2.app.core.get('Player').model.panos.index[panoId];
- if (pano) {
- // 判断一下pano是否仍然存在
- delete data.id;
- pano.filterEffect = data;
- }
- });
- };
- var filterList = this.app.store.getValue('filters');
- if (filterList) initData(filterList);else this.app.store.on('filters', function (data) {
- initData(data);
- var player = _this2.app.core.get('Player');
- _this2.updatePanoFilters(player.currentPano, player.currentPano);
- });
- } // 根据pano更新调节效果
- }, {
- key: "updatePanoFilters",
- value: function updatePanoFilters(pano0, pano1) {
- var filterEffect0 = this.filterTemp[pano0.id] || pano0.filterEffect;
- var filterEffect1 = this.filterTemp[pano1.id] || pano1.filterEffect;
- this.getPanoMaterials().forEach(function (material) {
- material.uniforms['filterBase0'].value.set(filterEffect0.brightness, filterEffect0.contrast, filterEffect0.saturation);
- material.uniforms['filterTemperature0'].value = filterEffect0.temperature;
- material.uniforms['filterBase1'].value.set(filterEffect1.brightness, filterEffect1.contrast, filterEffect1.saturation);
- material.uniforms['filterTemperature1'].value = filterEffect1.temperature; // 更新hasFilter 考虑到过渡效果,pano1和pano0都要判断
- pano0.hasFilter || pano1.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
- material.needsUpdate = true;
- });
- } // 获得与全景贴图有关的所有material
- }, {
- key: "getPanoMaterials",
- value: function getPanoMaterials() {
- var player = this.app.core.get('Player');
- var mats = [this.app.core.get('QuickstartManager').skybox.material].concat(_toConsumableArray(player.model.chunks.map(function (chunk) {
- return chunk.materialInside;
- })));
- player.model.skybox && mats.push(player.model.skybox.material);
- player.model.highMapCube && mats.push.apply(mats, _toConsumableArray(player.model.highMapCube.tiles.map(function (e) {
- return e.material;
- })));
- return mats;
- }
- }]);
- return FilterManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var ConvertViews = /*#__PURE__*/function (_Emiter) {
- _inherits(ConvertViews, _Emiter);
- var _super = _createSuper$q(ConvertViews);
- function ConvertViews() {
- var _this;
- _classCallCheck(this, ConvertViews);
- _this = _super.call(this);
- _this.sourceApp = null;
- _this.targetApp = null;
- _this.player1 = null;
- _this.player2 = null;
- return _this;
- }
- _createClass(ConvertViews, [{
- key: "bind",
- value: function bind() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
- sourceApp: null,
- targetApp: null
- };
- if (options.sourceApp) {
- this.sourceApp = options.sourceApp;
- this.player1 = this.sourceApp.core.get('Player'); //this.player1.model.addEventListener('gotPanos', this.init.bind(this))
- } else if (options.targetApp) {
- this.targetApp = options.targetApp;
- this.player2 = this.targetApp.core.get('Player'); //this.player2.model.addEventListener('gotPanos', this.init.bind(this))
- }
- if (this.sourceApp && this.targetApp) {
- // 两个实例都加载完了,可以进行特性处理
- this.init();
- }
- }
- }, {
- key: "init",
- value: function init() {
- if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return;
- this.diffLon = this.computeAveDiffLon();
- this.diffQuaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), this.diffLon);
- this.diffQuaternionInvert = this.diffQuaternion.clone().invert();
- }
- }, {
- key: "computeAveDiffLon",
- value: function computeAveDiffLon() {
- var _this2 = this;
- //获取两个场景的lon偏差值
- //需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
- var diffLonAve = 0,
- diffLons = [];
- /* let panoPos1 = this.player1.model.panos.list.map(e => e.position)
- let panoPos2 = this.player2.model.panos.list.map(e => e.position)
- let length = panoPos1.length */
- var keys = Object.keys(this.panoMapping.mapping);
- var panoPos1 = keys.map(function (id) {
- var pano = _this2.player1.model.panos.index[id];
- return pano.position;
- });
- var panoPos2 = keys.map(function (id) {
- var matchId = _this2.panoMapping.mapping[id];
- var pano = _this2.player2.model.panos.index[matchId];
- return pano.position;
- });
- var length = keys.length; //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
- var index = 0;
- while (index < length) {
- var pos11 = new THREE.Vector3().copy([index]);
- var pos12 = new THREE.Vector3().copy(panoPos1[(index + 1) % length]);
- var pos21 = new THREE.Vector3().copy(panoPos2[index]);
- var pos22 = new THREE.Vector3().copy(panoPos2[(index + 1) % length]);
- var vec1 = new THREE.Vector3().subVectors(pos11, pos12).setY(0);
- var vec2 = new THREE.Vector3().subVectors(pos21, pos22).setY(0);
- var diffLon = math$2.getAngle(vec1, vec2, 'z');
- diffLons.push(diffLon);
- diffLonAve += diffLon;
- index++;
- }
- console.log('diffLons', diffLons);
- diffLonAve /= length;
- console.log('diffLonAve', diffLonAve);
- return (
- /* THREE.MathUtils.radToDeg( */
- diffLonAve
- );
- /* ) */
- }
- }, {
- key: "applyDiff",
- value: function applyDiff(app) {
- //sourcePlayer -> targetPlayer
- if (!this.player1 || !this.player2 || this.targetApp.config.num == this.sourceApp.config.num) return; //场景码相同的话返回
- if (this.player1.mode != this.player2.mode) return;
- var player1, player2, quaternion; //player1为要改变的, player2是参照
- if (app == this.sourceApp) {
- player1 = this.player1;
- player2 = this.player2;
- quaternion = this.diffQuaternion;
- } else {
- player1 = this.player2;
- player2 = this.player1;
- quaternion = this.diffQuaternionInvert;
- }
- var control1 = player1.cameraControls.activeControl;
- var control2 = player2.cameraControls.activeControl; //if(!control1 || !control2)return
- player1.quaternion.copy(player2.quaternion).premultiply(quaternion);
- if (player1.mode == 'panorama') {
- //平移
- var dir = new THREE.Vector3().subVectors(control2.target, player2.position);
- dir.applyQuaternion(quaternion);
- var target1 = new THREE.Vector3().addVectors(player1.position, dir);
- control1.lookAt(target1);
- control1.target.copy(target1);
- } else if (control2) {
- //修改target,保证target在panos之间的相对位置一样
- //console.log('target', control2.target.clone())
- //console.log('position', control2.target.clone())
- var vec = new THREE.Vector3().subVectors(control2.target,
- /* this.getPanoPos(2, 0) */
- player2.model.panos.list[0].position);
- vec.applyQuaternion(quaternion);
- control1.target.addVectors(
- /* this.getPanoPos(1, 0) */
- player1.model.panos.list[0].position, vec);
- player1.target.copy(control1.target); //修改position,保证方向一样
- var _dir = new THREE.Vector3().subVectors(control2.camera.position, control2.target);
- _dir.applyQuaternion(quaternion);
- player1.position = new THREE.Vector3().addVectors(control1.target, _dir);
- control1.camera.position.copy(player1.position);
- }
- control1.camera.quaternion.copy(player1.quaternion);
- }
- /* applyDiff(app) {
- //sourcePlayer -> targetPlayer
- let player1, player2, quaternion
- if (app == this.targetApp) {
- player1 = this.player1
- player2 = this.player2
- quaternion = this.diffQuaternion
- } else {
- player1 = this.player2
- player2 = this.player1
- quaternion = this.diffQuaternionInvert
- }
- this.player1.quaternion.premultiply(quaternion)
- let control = player1.cameraControls.activeControl
- if (player1.mode == 'panorama') {
- //平移
- let dir = new THREE.Vector3().subVectors(control.target, player1.position)
- dir.applyQuaternion(quaternion)
- let target = new THREE.Vector3().addVectors(player1.position, dir)
- control.lookAt(target)
- } else if (control) {
- let dir = new THREE.Vector3().subVectors(player1.position, control.target)
- dir.applyQuaternion(quaternion)
- player1.position = new THREE.Vector3().addVectors(control.target, dir)
- }
- //先不管飞出后的位置平移
- //位置参照第一个漫游点。保持相机相对第一个漫游点的位移和
- } */
- }]);
- return ConvertViews;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var player$8;
- var lastIntersect;
- var BillboardManager = /*#__PURE__*/function (_EventEmitter) {
- _inherits(BillboardManager, _EventEmitter);
- var _super = _createSuper$p(BillboardManager);
- function BillboardManager(ctx) {
- var _this;
- _classCallCheck(this, BillboardManager);
- _this = _super.call(this);
- _this.ctx = ctx;
- _this.app = ctx.app;
- _this.player = null;
- _this.events = {
- movePos: function movePos(_ref) {
- var reCompute = _ref.reCompute;
- if (reCompute) {
- //重新再算一遍,为了获取当前朝向的镜头
- var intersect = lastIntersect;
- } else {
- if (!_this.dragging) return;
- var intersect = player$8.getMouseIntersect(null, player$8.getColliders({
- noSkybox: true,
- checkChunk: true
- }));
- if (!intersect) {
- return;
- }
- }
- var _this$getPoseByInters = _this.getPoseByIntersect(intersect),
- position = _this$getPoseByInters.position,
- quaternion = _this$getPoseByInters.quaternion,
- faceAngle2 = _this$getPoseByInters.faceAngle2,
- subgroup = _this$getPoseByInters.subgroup;
- _this.editPlane.position.copy(position);
- _this.editPlane.quaternion.copy(quaternion);
- _this.editPlane.faceAngle2 = faceAngle2; //this.editPlane.setRotation(/* quaternion, */this.editPlane.rotAngle)
- _this.editPlane.getIsLieDown() && _this.editPlane.updateLabelPose(); //console.log('movePos', position, quaternion )
- _this.editPlane.homePanoId = player$8.currentPano.id;
- _this.editPlane.subgroup = subgroup;
- /* reCompute || */
- _this.emit('dragPos', {
- panoId: player$8.currentPano.id
- });
- },
- confirmPos: function confirmPos(e) {
- e.consume();
- _this.confirmPos();
- },
- dragStart: function dragStart(e) {
- if (_this.editPlane && player$8.OverlayManager.hoveringPlane == _this.editPlane) {
- player$8.cameraControls.activeControl.enabled = false;
- player$8.cameraControls.activeControl.pointerDragOn = false;
- _this.dragging = true;
- e.consume(); //console.log('dragStart')
- }
- },
- dragEnd: function dragEnd(e) {
- if (!_this.dragging) return;
- _this.dragging = false;
- e.consume();
- player$8.cameraControls.activeControl.enabled = true; //console.log('dragEnd')
- }
- };
- return _this;
- }
- _createClass(BillboardManager, [{
- key: "waitReady",
- value: function waitReady(fuc) {
- if (player$8) {
- fuc();
- } else {
- this.once('ready', fuc);
- }
- }
- }, {
- key: "enter",
- value: function enter(fun) {
- var _this2 = this;
- if (this.entered) return;
- this.entered = true;
- this.waitReady(function () {
- fun && fun();
- if (!_this2.entered) return;
- player$8.$app.TagManager.switchAllDisplay(false, 'editBillboards', {
- billboards: true
- });
- player$8.on('pointerStart', _this2.events.dragStart);
- player$8.on('pointerMove', _this2.events.movePos);
- player$8.on('pointerUp', _this2.events.dragEnd);
- });
- }
- }, {
- key: "leave",
- value: function leave() {
- //console.log('leave')
- this.endAddPlane();
- this.undoEdit();
- this.editPlane && (this.editPlane.isEditing = false, player$8.OverlayManager.highlight(null));
- this.editPlane = null;
- this.entered = false;
- player$8.$app.TagManager.switchAllDisplay(true, 'editBillboards', {
- billboards: true
- });
- player$8.off('pointerStart', this.events.dragStart);
- player$8.off('pointerUp', this.events.dragEnd);
- player$8.off('pointerMove', this.events.movePos);
- }
- }, {
- key: "reEdit",
- value: function reEdit(sid) {
- var _this3 = this;
- this.enter(function () {
- var bill = _this3.ctx.get(sid);
- _this3.updateEditPlane(bill);
- player$8.OverlayManager.clickOverlay(bill, {
- dontEmit: true,
- forceFlyToPlane: true
- }); //自动点击
- player$8.modelSideManager.tempAuto();
- });
- }
- }, {
- key: "undoEdit",
- value: function undoEdit() {
- // 恢复
- if (!this.editPlane) return;
- var bill = this.editPlane;
- if (bill.info.modified == 'new') {
- // 未保存过的video直接删除
- this.dispose(bill.sid);
- } else {
- bill.setFromInfo(bill.info);
- }
- player$8.modelSideManager.recover();
- }
- }, {
- key: "save",
- value: function save() {
- var _this4 = this;
- console.log('save');
- var bill = this.editPlane;
- return {
- done: function done() {
- bill.info.modified = 'old';
- bill.info.width = bill.width;
- bill.info.height = bill.height;
- bill.info.pos = bill.position.clone();
- bill.info.qua = bill.quaternion.clone(); //baseQuaternion.clone()
- bill.info.faceAngle = bill.faceAngle;
- bill.info.scaleRatio = bill.scaleRatio;
- bill.info.title = bill.titleLabel.text;
- bill.info.media = bill.plane.material.map.image;
- bill.info.targetPano = bill.targetPano;
- bill.info.icon = bill.getMapName();
- bill.info.panoId = bill.homePanoId;
- bill.info.subgroup = bill.subgroup; //--暂时同overlay一样 在hidden的楼层要隐藏----
- bill.raycastToFindFloor();
- bill.updateVisibleOnFloor(); //------------------------------ ---- ----
- _this4.leave();
- },
- info: {
- width: math$2.toPrecision(bill.width, 4),
- height: math$2.toPrecision(bill.height, 4),
- pos: math$2.toPrecision(bill.position.toArray(), 4),
- qua: math$2.toPrecision(bill.quaternion.toArray()
- /* bill.baseQuaternion.toArray() */
- , 4),
- subgroup: bill.subgroup == void 0 ? null : bill.subgroup //楼层
- }
- };
- }
- /**
- * 添加指示牌
- * @param {*} billboardItem
- * @returns
- */
- }, {
- key: "add",
- value: function add(billboardItem) {
- if (!billboardItem || !billboardItem.sid) {
- return;
- }
- this.ctx.list.push(billboardItem);
- common$1.updateVisible(billboardItem.titleLabel, 'onShow', !!this.showTitles);
- }
- /**
- * 清除所有
- */
- }, {
- key: "clear",
- value: function clear() {
- this.ctx.list = [];
- }
- /**
- * 删除
- * @param {*} sid
- */
- }, {
- key: "dispose",
- value: function dispose(sid) {
- var plane = this.ctx.get(sid);
- if (plane) {
- plane.titleLabel.dispose();
- plane.dispose();
- var index = this.ctx.list.indexOf(plane);
- this.ctx.list.splice(index, 1);
- }
- }
- /**
- * ui控制整体titles是否显示
- * @param {*} state
- */
- }, {
- key: "changeTitlesShow",
- value: function changeTitlesShow(state) {
- this.showTitles = !!state;
- this.ctx.list.forEach(function (e) {
- common$1.updateVisible(e.titleLabel, 'onShow', state);
- });
- }
- }, {
- key: "highlight",
- value: function highlight(sid) {
- var bill = this.ctx.get(sid);
- player$8.OverlayManager.highlight(bill);
- }
- }, {
- key: "beginToAddPlane",
- value: function beginToAddPlane() {
- var _this5 = this;
- //开始添加
- this.enter(function () {
- player$8.viewLinkManager.exitView();
- player$8.reticule.visible = false;
- _this5.isAdding = true;
- player$8.modelSideManager.tempAuto();
- CursorDeal.add('addOverlay');
- });
- }
- }, {
- key: "endAddPlane",
- value: function endAddPlane() {
- //结束添加状态
- this.isAdding = false; //this.player.domElement.style.cursor = ''
- CursorDeal.remove('addOverlay');
- player$8.reticule.visible = true;
- }
- }, {
- key: "updateEditPlane",
- value: function updateEditPlane(editPlane) {
- this.editPlane = editPlane;
- editPlane.isEditing = true;
- player$8.OverlayManager.highlight(editPlane);
- }
- }, {
- key: "getPoseByIntersect",
- value: function getPoseByIntersect(intersect) {
- var normal = intersect.face.normal.clone();
- if (player$8.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
- normal.negate();
- } //console.log('normal',normal)
- var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
- var position = intersect.point.clone().add(normal.multiplyScalar(0.02)); //在墙上刚好是上下方向,但在地面却会各种朝向
- var faceAngle2;
- if (isLieDown(quaternion)) {
- //在地面上时调整方向,使固定朝向镜头前方或某个方向。否则会因为法线不规则而朝向不固定
- var normalDir = intersect.face.normal.clone().setY(0);
- var camDir = new THREE.Vector3().subVectors(position, player$8.position).setY(0).normalize(); //箭头对准相机 //player.getDirection().setY(0)
- if (normalDir.x == 0 && normalDir.z == 0) {
- //若为0,0,0,改为默认的方向
- normalDir.z = 1;
- }
- faceAngle2 = math$2.getAngle(normalDir, camDir, 'y') - Math.PI / 2;
- var faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), faceAngle2); //console.log('faceAngle2', faceAngle2, normal, faceRot /* , camDir */)
- quaternion.multiply(faceRot); //右乘子级,子级是自身,绕着面片的中心轴z轴转
- }
- var subgroup = intersect.object.parent.floor.floorIndex;
- return {
- position,
- quaternion,
- faceAngle2,
- subgroup
- };
- }
- }, {
- key: "startInsertion",
- value: function startInsertion(_ref2) {
- var _this6 = this;
- var intersect = _ref2.intersect;
- //调整旋转值,使贴合墙壁,且不重叠。
- var _this$getPoseByInters2 = this.getPoseByIntersect(intersect),
- position = _this$getPoseByInters2.position,
- quaternion = _this$getPoseByInters2.quaternion,
- faceAngle2 = _this$getPoseByInters2.faceAngle2,
- subgroup = _this$getPoseByInters2.subgroup; //添加
- var bill = new BillboardItem(player$8, {
- sid: common$1.getRandomSid(),
- pos: position,
- qua: quaternion,
- modified: 'new',
- subgroup
- }); //bill.info.baseQuaternion = bill.quaternion.clone()
- //bill.baseQuaternion = bill.quaternion.clone()
- bill.faceAngle = 0;
- bill.faceAngle2 = faceAngle2;
- bill.updateMatrixWorld();
- this.emit('createBill', {
- sid: bill.sid,
- panoId: player$8.currentPano.id
- });
- player$8.OverlayManager.clickOverlay(bill, {
- dontEmit: true,
- forceFlyToPlane: true,
- afterFly: function afterFly(makeit) {
- //重新调整下箭头角度 且保存pano
- setTimeout(function () {
- _this6.events.movePos({
- reCompute: true
- });
- }, 1); //延迟是为了防止 afterFly立即执行
- }
- }); //bill.focus() //自动点击
- lastIntersect = intersect;
- this.updateEditPlane(bill);
- this.add(bill);
- this.endAddPlane(); //自动结束添加
- } //假设默认大小为图片像素 / 100 ?
- }, {
- key: "setScale",
- value: function setScale(s) {
- //大小
- //console.log('setScale', s)
- this.editPlane.setScale(s);
- }
- }, {
- key: "setRotation",
- value: function setRotation(r) {
- //console.log('setRotation', r)
- this.editPlane.setRotation(
- /* this.editPlane.baseQuaternion, */
- r);
- }
- }, {
- key: "setJumpPano",
- value: function setJumpPano(id) {
- console.log('setJumpPano', id);
- this.editPlane.targetPano = id;
- }
- }, {
- key: "setMap",
- value: function setMap(src, sid) {
- //console.log('setMap', src, sid)
- var bill = sid ? this.ctx.get(sid) : this.editPlane;
- bill.setMap(src);
- if (!this.editPlane || this.editPlane != bill) {
- //非编辑状态的话,直接保存到info里
- bill.info.icon = bill.getMapName();
- }
- }
- }, {
- key: "setTitle",
- value: function setTitle(title) {
- this.editPlane.setTitle(title);
- }
- }, {
- key: "cancel",
- value: function cancel() {
- //console.log('cancel')
- this.leave();
- }
- }, {
- key: "flyToBillBoard",
- value: function flyToBillBoard(sid) {
- var bill = sid ? this.ctx.get(sid) : this.editPlane;
- player$8.OverlayManager.clickOverlay(bill, {
- dontEmit: true,
- forceFlyToPlane: true
- });
- }
- }]);
- return BillboardManager;
- }(EventEmitter);
- var mapNames = ['style-1', 'style-2', 'style-3']; //贴图默认名称
- var BillboardItem = /*#__PURE__*/function (_Overlay) {
- _inherits(BillboardItem, _Overlay);
- var _super2 = _createSuper$p(BillboardItem);
- function BillboardItem(player) {
- var _this7;
- var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- _classCallCheck(this, BillboardItem);
- //转化一下属性
- info.media = ['photo']; //info.poster: "tCledf2544111.png"
- info.isBillboard = true;
- info.faceAngle = info.faceAngle || 0; //表面旋转度数 (0-360)。所以info.qua不是最终旋转值
- info.scaleRatio = info.scaleRatio || 100;
- _this7 = _super2.call(this, player, info);
- _this7.plane.material.side = THREE.DoubleSide;
- _this7.titleLabel = new TextSprite({
- text: info.title,
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0
- },
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1
- },
- /* textBorderColor: { r: 150, g: 150, b: 150, a: 0.5 },
- textBorderThick: 1, */
- textshadowColor: '#888',
- borderRadius: 2,
- fontsize: 34,
- renderOrder: RenderOrder.overlay - 1,
- //为了不被别的billboard的透明区域覆盖
- margin: {
- x: 12,
- y: 10
- },
- player,
- fixOrient: true
- });
- _this7.titleLabel.sprite.material.depthTest = true; //需要和plane一起被遮挡
- var s = 0.3;
- _this7.titleLabel.scale.set(s, s, s);
- _this7.add(_this7.titleLabel);
- common$1.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', false);
- _this7.addEventListener('mapLoaded', function () {
- //console.log('img.onloaded')
- var map = _this7.plane.material.map;
- map.needsUpdate = true;
- _this7.setScale();
- common$1.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', true);
- /* player.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, () => {
- this.plane.material.map.anisotropy = 4 //等下一次渲染后才能变回anisotropy
- this.plane.material.map.needsUpdate = true
- console.log('anisotropy 4', this.plane.material.map.uuid, this.sid)
- }) */
- map.dispose();
- var recover = function recover() {
- if (map._listeners && map._listeners.dispose && map._listeners.dispose.length) {
- //已经渲染了。(必须出现在视野中才会渲染)
- map.anisotropy = 4; //等下一次渲染后才能变回anisotropy
- map.needsUpdate = true;
- player.$app.core.get('SceneRenderer').off(SceneRendererEvents.AfterRender, recover);
- }
- };
- player.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, recover);
- });
- _this7.addEventListener('lieDownChanged', function () {
- _this7.updateLabelPose();
- });
- return _this7;
- }
- _createClass(BillboardItem, [{
- key: "setFromInfo",
- value: function setFromInfo(info) {
- _get(_getPrototypeOf(BillboardItem.prototype), "setFromInfo", this).call(this, info);
- this.plane.scale.copy(this.scale);
- this.scale.set(1, 1, 1); //把加载整体的scale换成加载plane上
- this.setTitle(info.title);
- this.targetPano = info.targetPano; //跳转到的点
- this.homePanoId = info.panoId; //回到指示牌的点位,为设置指示牌的位置时所在点位。
- this.scaleRatio = info.scaleRatio;
- this.setRotation(
- /* this.quaternion, */
- info.faceAngle);
- this.setMap(info.icon);
- this.subgroup = info.subgroup;
- }
- }, {
- key: "setRotation",
- value: function setRotation() {
- var faceAngle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- //this.baseQuaternion = quaternion.clone()
- this.faceAngle = faceAngle;
- /* let faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(faceAngle))
- this.quaternion.copy(faceRot) //子级是自身,绕着面片的中心轴z轴转
- this.quaternion.premultiply(this.baseQuaternion) //左乘父级 */
- this.plane.quaternion.setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(-faceAngle));
- this.updateLabelPose();
- }
- }, {
- key: "setScale",
- value: function setScale(s) {
- if (s == void 0) s = this.scaleRatio;
- this.scaleRatio = s;
- if (this.plane.material.map.image.width) {
- var _this$plane$material$ = this.plane.material.map.image,
- width = _this$plane$material$.width,
- height = _this$plane$material$.height; //图尺寸越大,对应在三维中的尺寸也越大
- this.width = width / 512 * s / 100;
- this.height = height / 512 * s / 100;
- this.plane.scale.set(this.width / settings$3.overlay.width, this.height / settings$3.overlay.height);
- this.updateLabelPose();
- }
- }
- }, {
- key: "getFaceAngle2",
- value: function getFaceAngle2(normal) {
- if (this.faceAngle2 != void 0) return this.faceAngle2;
- if (!normal) normal = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //还原出normal
- var quaternionOri = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP)); //最初根据normal获得的quaterinion
- var faceRotQua = this.quaternion.clone().premultiply(quaternionOri.invert()); //反向求出 当初为了使朝向相机方向时先旋转的角度
- //let dir2 = new THREE.Vector3(0, 0, 1).applyQuaternion(faceRotQua) //为什么这样得到的都是0?
- //this.faceAngle2 = Math.atan2(dir2.x, dir2.z)
- this.faceAngle2 = new THREE.Euler().setFromQuaternion(faceRotQua).z; //只好用rotation了 希望不会有x y不为0的时候出现
- }
- }, {
- key: "updateLabelPose",
- value: function updateLabelPose() {
- if (!this.titleLabel) return;
- var marginTop = 0.1; //label到图顶部的空隙
- this.titleLabel.rotation.z = 0; // 恢复
- if (this.getIsLieDown()) {
- //当牌子在地板时需要根据视线转动,保持文字在bill的下方正中。
- var angle = THREE.MathUtils.degToRad(-this.faceAngle); //this.plane的旋转角度
- var eyeDir = player$8.getDirection().negate(); // new THREE.Vector3().subVectors(player.position, this.position)
- var eyeAngle = Math.atan2(eyeDir.x, eyeDir.z); //视线夹角
- //视线夹角还要扣除最外层的this.quaternion造成的旋转(因为是整体的所以扣在整体世界的视线夹角里)
- var planeDir = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //normal
- var faceAngle2 = this.getFaceAngle2(planeDir); //创建时为了转向镜头方向而自身先转动的角度
- var planeAngle = Math.atan2(planeDir.x, planeDir.z) + faceAngle2; //console.log('planeAngle',planeAngle, planeDir, 'faceAngle2', faceAngle2)
- eyeAngle -= planeAngle;
- angle -= eyeAngle; //把视线的角度叠加到bill上。可以假设将画布旋转到视线方向
- var height = (this.height * Math.abs(Math.cos(angle)) + this.width * Math.abs(Math.sin(angle))) / 2 + marginTop; //计算bill中心到文字底部的距离(类同当视线角度为0时,仅转动bill时,也就是把视线的角度叠加到bill上)
- //转回正常画布方向后求xy
- var x = -height * Math.sin(-eyeAngle);
- var y = -height * Math.cos(-eyeAngle);
- this.titleLabel.position.set(x, y, 0);
- this.titleLabel.rotation.z = eyeAngle; //计算见笔记
- //console.log('updatePose', x, y, angle)
- } else {
- var _angle = THREE.MathUtils.degToRad(-this.faceAngle);
- var _height = (this.height * Math.abs(Math.cos(_angle)) + this.width * Math.abs(Math.sin(_angle))) / 2 + marginTop; //整个bill在垂直方向的高度的一半加上marginTop就是label的高度
- this.titleLabel.position.set(0, -_height, 0);
- }
- }
- }, {
- key: "setTitle",
- value: function setTitle(title) {
- this.titleLabel && this.titleLabel.setText(title);
- }
- }, {
- key: "setMap",
- value: function setMap(src) {
- //this.plane.material.map.image = new Image
- this.plane.material.map.image.src = this.getMapSrc(src); //为什么有时候会警告Parameter outside of bounds.
- this.plane.material.map.anisotropy = 0; //需要先设置为0,否则新的小图会叠加在原先的大图上,很奇怪。即使是new一个image也是。
- //console.log('anisotropy 0', this.plane.material.map.uuid, this.sid)
- }
- }, {
- key: "getMapSrc",
- value: function getMapSrc(icon) {
- if (icon && icon.slice(0, 5) == 'blob:') {
- return icon;
- }
- var name = icon || this.info.icon || mapNames[0]; //this.player.$app.resource.getUserResourceURL(info.poster)
- if (
- /* mapNames.includes(name) */
- name.slice(0, 6) == 'style-' && name.slice(6) < 20) {
- return player$8.$app.resource.getAppURL("images/billboard/".concat(name, ".png"));
- } else {
- if (name.split('.').length == 1) name += '.png';
- return player$8.$app.resource.getUserResourceURL(name);
- }
- }
- }, {
- key: "getMapName",
- value: function getMapName() {
- var src = this.plane.material.map.image.src;
- if (src.slice(0, 5) == 'blob:') {
- return src;
- }
- var a = src.split('/').pop();
- return a.split('.')[0];
- }
- }, {
- key: "getIsLieDown",
- value: function getIsLieDown() {
- var isLie = this.lieDown;
- this.lieDown = isLieDown(this.quaternion);
- if (this.lieDown != isLie) {
- this.dispatchEvent({
- type: 'lieDownChanged'
- });
- }
- return this.lieDown;
- }
- /* get info(){
- return this._info
- }
- set info(i){
- this._info = i
- } */
- }]);
- return BillboardItem;
- }(Overlay);
- var _list = /*#__PURE__*/_classPrivateFieldKey("list");
- var Billboard = /*#__PURE__*/function () {
- function Billboard(app) {
- var _this8 = this;
- _classCallCheck(this, Billboard);
- Object.defineProperty(this, _list, {
- writable: true,
- value: []
- });
- this.app = app;
- this.app.store.on('billboards', function (data) {
- (data.tags || data).forEach(function (info) {
- if (!(info.panoId in player$8.model.panos.index)) {
- return; //点被删除,失效
- }
- info = common$1.CloneJson(info);
- _this8.manager.add(new BillboardItem(player$8, info));
- });
- });
- this.manager = new BillboardManager(this);
- this.app.Scene.on('loaded', function () {
- player$8 = _this8.app.core.get('Player');
- player$8.billboardManager = _this8.manager;
- _this8.manager.emit('ready');
- if (_this8.app.store.getValue('metadata').controls.showBillboardTitle) {
- _this8.manager.changeTitlesShow(true);
- }
- player$8.on('view.changed', function (e) {
- if ((player$8.mode == 'panorama' || player$8.mode == 'floorplan') &&
- /* e.moved */
- e.cameraWorldMatrixChanged) {
- _this8.list.forEach(function (e) {
- e.lieDown && e.updateLabelPose();
- });
- }
- });
- });
- }
- /**
- * 指示牌数据列表
- * @returns
- */
- _createClass(Billboard, [{
- key: "list",
- get: function get() {
- return _classPrivateFieldBase(this, _list)[_list];
- }
- /**
- * 获取指定指示牌数据
- * @param {*} sid
- * @returns
- */
- }, {
- key: "get",
- value: function get(sid) {
- return _classPrivateFieldBase(this, _list)[_list].find(function (c) {
- return c.sid == sid;
- });
- }
- }]);
- return Billboard;
- }();
- function isLieDown(quaternion) {
- var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion);
- return Math.abs(direction.y) > 0.9;
- }
- 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); }; }
- 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; } }
- var outLineMaterial0 = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: 0xffc23b,
- transparent: false,
- depthWrite: true,
- depthTest: true
- });
- var outLineMaterial1 = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: Colors.mainColor
- /* 0x2ee4ce */
- ,
- transparent: false,
- depthWrite: true,
- depthTest: true
- });
- var lineMat0 = new THREE.LineBasicMaterial({
- color: 0xffc23b
- });
- var lineMat1 = new THREE.LineBasicMaterial({
- color: Colors.mainColor
- });
- var geometry = new THREE.BoxGeometry(1, 1, 1);
- var ClipBox = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(ClipBox, _THREE$Mesh);
- var _super = _createSuper$o(ClipBox);
- function ClipBox(type
- /* , boxSize */
- ) {
- var _this;
- _classCallCheck(this, ClipBox);
- // const geometry = new THREE.BoxGeometry(boxSize, boxSize, boxSize)
- // geometry.translate(boxSize/2, boxSize/2, boxSize/2)// 将geometry中心点移动至(0,0,0)
- var material0 = new THREE.MeshBasicMaterial({
- color: 0xb47e2c,
- transparent: true,
- depthWrite: false,
- opacity: 0.1,
- side: THREE.DoubleSide
- });
- var material1 = new THREE.MeshBasicMaterial({
- color: Colors.mainColor,
- transparent: true,
- depthWrite: false,
- opacity: 0.1,
- side: THREE.DoubleSide
- });
- if (type === 0) {
- _this = _super.call(this, geometry, material0);
- _this.lowLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = false;
- _this.line.visible = true;
- _this.material.opacity = 0;
- };
- _this.midLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = false;
- _this.line.visible = true;
- _this.material.opacity = 0.1;
- };
- _this.highLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = true;
- _this.line.visible = true;
- _this.material.opacity = 0.3;
- _this.status = 1;
- };
- _this.switchBoxType = function () {
- _this.clipType = Number(!_this.clipType);
- console.log(!_this.clipType);
- var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
- var templeLineMat = _this.clipType === 0 ? lineMat0 : lineMat1;
- var templeFatLineMat = _this.clipType === 0 ? outLineMaterial0 : outLineMaterial1;
- _this.material = templeMat;
- _this.line.material = templeLineMat;
- _this.outLines.material = templeFatLineMat;
- console.log(_this.clipType);
- };
- } else {
- _this = _super.call(this, geometry, material1);
- _this.lowLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = false;
- _this.line.visible = true;
- _this.material.opacity = 0;
- };
- _this.midLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = false;
- _this.line.visible = true;
- _this.material.opacity = 0.1;
- };
- _this.highLight = function () {
- if (_this.status === 1) return;
- _this.outLines.visible = true;
- _this.line.visible = true;
- _this.material.opacity = 0.3;
- _this.status = 1;
- };
- _this.switchBoxType = function () {
- _this.clipType = Number(!_this.clipType);
- console.log(!_this.clipType);
- var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
- var templeLineMat = _this.clipType === 0 ? lineMat0 : lineMat1;
- var templeFatLineMat = _this.clipType === 0 ? outLineMaterial0 : outLineMaterial1;
- _this.material = templeMat;
- _this.line.material = templeLineMat;
- _this.outLines.material = templeFatLineMat;
- console.log(_this.clipType);
- };
- } //line
- var edges = new THREE.EdgesGeometry(geometry);
- var _templeLineMat, _templeFatLineMat;
- if (type === 0) {
- _templeLineMat = lineMat0;
- _templeFatLineMat = outLineMaterial0;
- } else {
- _templeLineMat = lineMat1;
- _templeFatLineMat = outLineMaterial1;
- }
- _this.line = new THREE.LineSegments(edges, _templeLineMat); //outLines
- var p = [];
- p.push(new THREE.Vector3(-0.5, 0.5, -0.5));
- p.push(new THREE.Vector3(-0.5, 0.5, 0.5));
- p.push(new THREE.Vector3(0.5, 0.5, 0.5));
- p.push(new THREE.Vector3(0.5, 0.5, -0.5));
- p.push(new THREE.Vector3(-0.5, 0.5, -0.5));
- p.push(new THREE.Vector3(-0.5, -0.5, -0.5));
- p.push(new THREE.Vector3(-0.5, -0.5, 0.5));
- p.push(new THREE.Vector3(0.5, -0.5, 0.5));
- p.push(new THREE.Vector3(0.5, -0.5, -0.5));
- p.push(new THREE.Vector3(-0.5, -0.5, -0.5));
- p.push(new THREE.Vector3(0.5, -0.5, -0.5));
- p.push(new THREE.Vector3(0.5, 0.5, -0.5));
- p.push(new THREE.Vector3(0.5, 0.5, 0.5));
- p.push(new THREE.Vector3(0.5, -0.5, 0.5));
- p.push(new THREE.Vector3(-0.5, -0.5, 0.5));
- p.push(new THREE.Vector3(-0.5, 0.5, 0.5));
- _this.outLines = LineDraw.createFatLine(p, {
- material: _templeFatLineMat
- });
- _this.outLines.visible = false;
- _this.add(_this.line);
- _this.add(_this.outLines);
- /* this.scale.set(boxSize, boxSize, boxSize)
- this.boxSize = boxSize */
- _this.name = 'clipBox';
- _this.status = 0;
- _this.clipType = type;
- _this.isClipBox = true;
- _this.renderOrder = RenderOrder.entryArrow;
- _this.material0 = material0;
- _this.material1 = material1;
- _this.boundingBox = new THREE.Box3(new THREE.Vector3(-0.5, -0.5, -0.5), new THREE.Vector3(0.5, 0.5, 0.5));
- return _possibleConstructorReturn(_this);
- }
- return ClipBox;
- }(THREE.Mesh);
- 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); }; }
- 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; } }
- // 求vPosition是否在裁剪盒子内
- //
- // G
- // |
- // O —— C
- // /
- // A
- //
- // 需要clipBox的CGOA点和vPosition用于求点是否在clipBox内,决定是否discard
- var ClipBoxManager = /*#__PURE__*/function (_Emiter) {
- _inherits(ClipBoxManager, _Emiter);
- var _super = _createSuper$n(ClipBoxManager);
- function ClipBoxManager(app) {
- var _this;
- _classCallCheck(this, ClipBoxManager);
- _this = _super.call(this);
- _this.updateMaterials = function () {
- if (_this.player.model._3dTilesRuntime || _this.materials.length === 0) {
- _this.materials.length = 0;
- _this.player.model.chunks.forEach(function (chunk) {
- return _this.materials.push(chunk.materialOutside);
- });
- _this.player.model.chunks.forEach(function (chunk) {
- return _this.materials.push(chunk.materialInside);
- });
- }
- _this.materials.forEach(function (mat) {
- mat.uniforms.clipBoxType.value = _this.clipBoxType;
- mat.uniforms.clipBoxPoints.value = _this.clipBoxPoints;
- });
- _this.boxCountChanged();
- };
- _this.bindEvents = function () {
- _this.player.on('pointerMove', _this.onMouseMove);
- _this.player.on('pointerUp', _this.onMouseUp);
- _this.player.on('moveModel', _this.onZoom);
- _this.player.model.transformTool.addEventListener('transformed', _this.updateClipBox);
- _this.player.model.transformTool.addEventListener('stopDrag', _this.finishUpdateClipBox);
- _this.player.model.transformTool.addEventListener('changeByHistory', _this.changeByHistory);
- };
- _this.unBindEvents = function () {
- _this.player.off('pointerMove', _this.onMouseMove);
- _this.player.off('pointerUp', _this.onMouseUp);
- _this.player.off('moveModel', _this.onZoom);
- _this.player.model.transformTool.removeEventListener('transformed', _this.updateClipBox);
- _this.player.model.transformTool.removeEventListener('stopDrag', _this.finishUpdateClipBox);
- _this.player.model.transformTool.removeEventListener('changeByHistory', _this.changeByHistory);
- };
- _this.changeByHistory = function (e) {
- var index = _this.clipBoxs.indexOf(e.data.object);
- e.data.object.updateMatrixWorld();
- _this.updateClipBox({
- activeBoxIndex: index
- });
- _this.updateMaterials();
- _this.emit('clipBoxManager.update', {
- list: _this.clipBoxs
- });
- };
- _this.onMouseUp = function (e) {
- if (!_this.player.mouseCouldBeClickToMove) return;
- if (_this.adding) {
- // 确认摆放位置
- _this.adding = false;
- if (_this.activeBox) {
- _this.activeBox.status = 0;
- _this.activeBox.lowLight();
- }
- _this.activeBoxIndex = _this.clipBoxs.length - 1;
- _this.activeBox = _this.clipBoxs[_this.activeBoxIndex];
- _this.activeBox.highLight();
- _this.player.model.transformTool.attach(_this.activeBox);
- _this.emit('clipBoxManager.active', {
- status: true,
- list: _this.clipBoxs
- });
- _this.emit('clipBoxManager.update', {
- list: _this.clipBoxs
- });
- _this.clipBoxType[_this.clipBoxs.length - 1] = _this.activeBox.clipType; //记录裁剪盒子类型
- _this.updateClipBox(); // this.defineHasClip(true)
- if (_this.clipBoxs.length === 1) {
- //isBind3dTile
- _this.clipInit();
- }
- } else {
- // 选中box (直接点击)
- if (_this.activeBox) {
- _this.activeBox.status = 0;
- _this.activeBox.lowLight();
- }
- var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
- if (intersect) {
- _this.player.model.transformTool.attach(intersect.object);
- _this.emit('clipBoxManager.active', {
- status: true,
- list: _this.clipBoxs
- }); //激活删除按钮
- _this.activeBox = intersect.object;
- for (var i = 0; i < _this.clipBoxs.length; i++) {
- if (_this.activeBox === _this.clipBoxs[i]) {
- _this.activeBoxIndex = i;
- break;
- }
- }
- _this.activeBox.highLight();
- } else {
- //点击空白取消选择
- _this.cancelActive();
- }
- }
- };
- _this.onMouseMove = function () {
- if (_this.adding) {
- //box随鼠标移动
- _this.clipBoxs[_this.clipBoxs.length - 1].position.copy(_this.player.reticule.position);
- } else {
- //触碰到的box高亮
- var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
- if (intersect) {
- if (_this.touchBox === null) {
- //首次touch
- _this.touchBox = intersect.object;
- _this.touchBox.midLight();
- } else if (intersect.object !== _this.touchBox) {
- //touch到新box
- _this.touchBox.lowLight();
- _this.touchBox = intersect.object;
- _this.touchBox.midLight();
- }
- } else {
- if (_this.touchBox) {
- //去除高亮
- _this.touchBox.lowLight();
- _this.touchBox = null;
- }
- }
- }
- };
- _this.onZoom = function () {
- if (_this.adding) {
- //根据相机距离原点的距离缩放box
- var box = _this.clipBoxs[_this.clipBoxs.length - 1];
- var scale = _this.player.camera.position.distanceTo(box.position) / 5;
- _this.clipBoxs[_this.clipBoxs.length - 1].scale.set(scale, scale, scale);
- }
- };
- _this.app = app;
- _this.player = null; //this.boxSize = 1
- _this.deferred = Deferred$1();
- _this.clipBoxs = []; //裁剪盒子数组用于raycaster
- _this.clipBoxGroup = new THREE.Group(); //裁剪盒子组
- _this.clipBoxType = []; //new Array(10).fill(-1) //裁剪盒子类型 0=内切/1=外切/-1=空。 length必须和shader里定义的个数一样
- _this.clipBoxPoints = []; //记录每个裁剪盒子数据(用于shader)
- _this.oriObj = {
- clipBoxType: [],
- clipMatrixs: []
- }; //用于不保存退出的数据恢复
- _this.activeBoxIndex = null;
- _this.activeBox = null;
- _this.touchBox = null;
- _this.adding = false; //true=未放置
- _this.materials = []; //裁剪材质数组
- _this.mousedown = new THREE.Vector3();
- _this.mouseup = new THREE.Vector3();
- _this.isBind3dTile = false;
- _this.initFinish = false;
- _this.init = function (metadata) {
- var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- //根据场景大小初始化boxSize
- new THREE.Vector3();
- if (metadata) {
- metadata[0] && (metadata = metadata[0].modelData);
- _this.clipBoxType = metadata.clipBoxType;
- var clipMatrixs = metadata.clipMatrixs;
- for (var i = 0; i < clipMatrixs.length; i++) {
- var clipBox = new ClipBox(_this.clipBoxType[i], 1);
- var mat4 = new THREE.Matrix4();
- mat4.fromArray(clipMatrixs[i]);
- clipBox.applyMatrix4(mat4);
- _this.clipBoxPoints[i * 4] = new THREE.Vector3(1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[i * 4 + 1] = new THREE.Vector3(-1 / 2, 1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[i * 4 + 2] = new THREE.Vector3(-1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[i * 4 + 3] = new THREE.Vector3(-1 / 2, -1 / 2, 1 / 2).applyMatrix4(mat4);
- _this.clipBoxs.push(clipBox);
- _this.clipBoxGroup.add(clipBox);
- }
- _this.oriObj = {
- clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
- clipMatrixs
- };
- }
- if (!reload) {
- //初次加载
- _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
- _this.player.model.add(_this.clipBoxGroup); // this.clipInit()
- }
- _this.clipInit();
- /* if (this.clipBoxs.length === 0) {
- this.defineHasClip(false)
- } */
- _this.deferred.resolve();
- };
- _this.app.Scene.on('loaded', function () {
- setTimeout(function () {
- _this.player = _this.app.core.get('Player'); //获取metadata
- var metadata = _this.app.store.getValue('cutModel'); // console.log(metadata)
- // if (metadata) this.init(metadata)
- // else this.app.store.on('metadata', this.init)
- _this.init(metadata);
- }, 50); //setTimeout为了在transformControls初始化完成后再初始化ClipBoxManager
- }); // 进入裁剪模块
- _this.enterModule = function () {
- _this.waitInit(function () {
- if (_this.app.Camera.monitor.control.watchingCamera) {
- _this.app.Camera.monitor.control.stopWatch();
- _this.player.dollhouseMode();
- }
- var deal = function deal() {
- _this.player.model.panos.forEach(function (pano) {
- return pano.hasVideo && common$1.updateVisible(pano.marker, 'clipBox', false, 10);
- }); //this.player.OverlayManager.list.forEach(child => child.hide('clipBox'))
- //this.app.Camera.monitor.control.hideAll(undefined, 'clipBox', 10, undefined)
- //this.app.Scene.Decoration.hideAll()
- _this.player.labelManager.hide();
- _this.player.linkEditor.hideFootIcons();
- _this.player.linkEditor.delVisibleLines();
- _this.emit('clipBoxManager.enter');
- _this.player.model.floors.show(); //this.app.TagManager.switchLabels({ type: 'traces', visible: false }, null, 'clipModel')
- _this.app.TagManager.switchAllDisplay(false, 'clipModel');
- };
- _this.player.flyToMode(Viewmode$1.DOLLHOUSE, deal);
- _this.setAllClipBoxVisible(true); //显示所有裁剪盒子
- //绑定事件
- _this.bindEvents();
- _this.player.locked = true;
- _this.player.model.transformTool.frame.material.visible = false;
- }, _this.enterModule.bind(_assertThisInitialized(_this)));
- }; //离开裁剪模块
- _this.leaveModule = function () {
- _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
- _this.player.model.transformTool.frame.material.visible = true;
- _this.player.model.transformTool.history.clear();
- _this.player.model.transformTool.detach(); //this.player.model.transformControls.detach()
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- });
- if (_this.adding) _this.cancelAddClipBox(); //解绑事件
- _this.unBindEvents();
- _this.player.locked = false; //恢复显示
- _this.player.model.panos.forEach(function (pano) {
- return pano.hasVideo && common$1.updateVisible(pano.marker, 'clipBox', true, 10);
- }); //this.player.OverlayManager.group.children.forEach(child => child.show('clipBox'))
- //this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined)
- //this.app.Scene.Decoration.showAll()
- _this.player.labelManager.show(); //this.app.TagManager.switchLabels({ type: 'traces', visible: true }, null, 'clipModel')
- _this.app.TagManager.switchAllDisplay(true, 'clipModel'); //this.player.model.transformControls.visible = false
- }; //添加裁剪盒子
- _this.addClipBox = function (type) {
- _this.waitInit(function () {
- console.log('add');
- if (_this.adding && type === _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
- //连点
- return;
- } else if (_this.adding && type !== _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
- //切换新增类型
- _this.changeClipBoxType();
- return;
- } //if (this.clipBoxs.length < 10) {
- //数量到达10 禁止新建
- var clipBox = new ClipBox(type
- /* , this.boxSize */
- );
- _this.clipBoxs.push(clipBox);
- _this.clipBoxGroup.add(clipBox);
- _this.adding = true;
- _this.onZoom(); //this.player.model.transformControls.visible = false
- //}
- }, _this.addClipBox.bind(_assertThisInitialized(_this), type));
- }; //取消添加裁剪盒子
- _this.cancelAddClipBox = function () {
- if (_this.adding) {
- console.log(_this.clipBoxs[_this.clipBoxs.length - 1]);
- _this.clipBoxGroup.remove(_this.clipBoxs[_this.clipBoxs.length - 1]);
- _this.clipBoxs.pop();
- _this.adding = false;
- _this.boxCountChanged(); //this.player.model.transformControls.visible = true
- if (_this.activeBoxIndex !== null) {
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- }); //发送选中事件
- }
- }
- }; //删除裁剪盒子
- _this.deleteClipBox = function (index) {
- if (index === undefined && _this.activeBoxIndex === null) {
- return;
- } else if (index === undefined) {
- index = _this.activeBoxIndex;
- }
- if (index === _this.activeBoxIndex) {
- _this.activeBox = null;
- _this.activeBoxIndex = null;
- }
- _this.player.model.transformTool.detach();
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- }); //发送选中事件
- _this.emit('clipBoxManager.update', {
- list: _this.clipBoxs
- }); //发送选中事件
- _this.clipBoxGroup.remove(_this.clipBoxGroup.children[index]);
- _this.clipBoxs.splice(index, 1);
- _this.clipBoxType.splice(index, 1);
- _this.clipBoxPoints.splice(index * 4, 4);
- _this.boxCountChanged();
- }; //清空裁剪盒子
- _this.clearClipBoxs = function () {
- var length = _this.clipBoxs.length;
- for (var i = 0; i < length; i++) {
- _this.deleteClipBox(0);
- }
- _this.clipBoxGroup.children = [];
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- }); //发送选中事件
- _this.emit('clipBoxManager.update', {
- list: _this.clipBoxs
- }); //发送选中事件
- _this.boxCountChanged(); //this.defineHasClip(false)
- _this.cancelAddClipBox();
- }; //修改盒子类型
- _this.changeClipBoxType = function (index) {
- index === void 0 && (index = _this.clipBoxs.length - 1);
- if (_this.adding) {
- _this.clipBoxs[index].switchBoxType();
- } else {
- _this.clipBoxs[index].switchBoxType();
- _this.clipBoxType[index] = _this.clipBoxs[index].clipType;
- }
- }; //选中裁剪盒子 (列表选择)
- _this.focusClipBox = function (index) {
- _this.activeBoxIndex = index;
- _this.activeBox = _this.clipBoxs[index];
- _this.player.model.transformTool.attach(_this.activeBox);
- _this.emit('clipBoxManager.active', {
- status: true,
- list: _this.clipBoxs
- }); //发送选中事件
- }; //取消选中
- _this.cancelActive = function () {
- _this.player.model.transformTool.detach();
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- }); //发送选中事件
- if (_this.activeBox) {
- _this.activeBox.status = 0;
- _this.activeBox.lowLight();
- }
- _this.activeBox = null;
- _this.activeBoxIndex = null;
- };
- _this.finishUpdateClipBox = function () {
- //mouseup时调用,确保裁剪准确
- _this.updateClipBox();
- _this.emit('clipBoxManager.update', {
- list: _this.clipBoxs
- }); //发送选中事件
- }; //更新裁剪盒子变化
- _this.updateClipBox = function () {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var index = e.activeBoxIndex != void 0 ? e.activeBoxIndex : _this.activeBoxIndex;
- if (index != void 0) {
- var mat4 = _this.clipBoxs[index].matrix; //获取所选box的四维矩阵
- _this.clipBoxPoints[index * 4] = new THREE.Vector3(1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[index * 4 + 1] = new THREE.Vector3(-1 / 2, 1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[index * 4 + 2] = new THREE.Vector3(-1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
- _this.clipBoxPoints[index * 4 + 3] = new THREE.Vector3(-1 / 2, -1 / 2, 1 / 2).applyMatrix4(mat4);
- _this.boxCountChanged();
- }
- }; //保存编辑
- _this.saveEdit = function () {
- //保存clipBoxType 和 clipBoxs内每个box的matrix到服务器
- var clipMatrixs = [];
- for (var i = 0; i < _this.clipBoxs.length; i++) {
- clipMatrixs.push(_this.clipBoxs[i].matrix.toArray());
- }
- var obj = {
- clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
- clipMatrixs
- };
- _this.oriObj = obj;
- console.log('save', obj);
- _this.player.model.transformTool.history.clear();
- _this.cancelActive();
- return obj;
- }; //退出编辑
- _this.cancelEdit = function () {
- if (_this.adding) _this.cancelAddClipBox();
- _this.clipBoxs = [];
- _this.clipBoxGroup.children = [];
- _this.clipBoxPoints = [];
- _this.clipBoxType = [];
- _this.player.model.transformTool.detach();
- _this.player.model.transformTool.history.clear();
- _this.activeBox = null;
- _this.emit('clipBoxManager.active', {
- status: false,
- list: _this.clipBoxs
- });
- _this.init(_this.oriObj, true); //重新加载数据
- }; //设置所有裁剪盒子显隐
- _this.setAllClipBoxVisible = function (visi) {
- _this.clipBoxGroup.visible = visi;
- }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
- _this.switchTransformControlsMode = function (mode) {
- if (parseInt(mode) == 0) mode = 'translation';
- if (parseInt(mode) == 1) mode = 'rotation';
- if (parseInt(mode) == 2) mode = 'scale';
- _this.player.model.transformTool.setModeEnable([mode]);
- };
- return _this;
- }
- /* defineHasClip(isDefine) {
- this.waitInit(() => {
- if (isDefine) {
- this.materials.forEach(mat => ((mat.defines['HasClip'] = true), (mat.needsUpdate = true)))
- } else {
- this.materials.forEach(mat => (delete mat.defines['HasClip'], (mat.needsUpdate = true)))
- }
- }, this.defineHasClip.bind(this, isDefine))
- } */
- _createClass(ClipBoxManager, [{
- key: "enableClip",
- value: function enableClip(state) {
- //外部调用 临时控制
- var enable = !state;
- if (this.unableClip != enable) {
- this.unableClip = enable;
- this.player && this.updateMaterials();
- }
- }
- }, {
- key: "boxCountChanged",
- value: function boxCountChanged() {
- var activeBoxCount = this.clipBoxPoints.length / 4; //console.log('boxCountChanged', this.clipBoxPoints.length, this.clipBoxs.length )
- var shouldClip = this.clipBoxs.length > 0 && !this.unableClip;
- this.materials.forEach(function (mat) {
- var oldHasClip = ('HasClip' in mat.defines);
- if (shouldClip) {
- mat.defines['HasClip'] = true;
- } else {
- delete mat.defines['HasClip'];
- }
- if (oldHasClip != shouldClip || mat.defines.clipBoxCount != activeBoxCount) mat.needsUpdate = true;
- mat.defines.clipBoxCount = activeBoxCount;
- });
- } //事件绑定
- }, {
- key: "clipInit",
- value: function clipInit() {
- if (this.player.model._3dTilesRuntime && !this.isBind3dTile && this.clipBoxs.length !== 0) {
- this.player.model._3dTilesRuntime.getTileset().on('endTileLoading', this.updateMaterials); //监测3dtiles更新
- this.isBind3dTile = true;
- }
- this.updateMaterials();
- this.initFinish = true;
- console.log('clipBox init finish');
- }
- }, {
- key: "waitInit",
- value: function waitInit(func, waitFunc) {
- if (this.initFinish) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- }]);
- return ClipBoxManager;
- }(tinyEmitter);
- 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; } }
- /**
- * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs
- */
- var _position = new THREE$1.Vector3();
- var _quaternion = new THREE$1.Quaternion();
- var _scale = new THREE$1.Vector3();
- var CSS3DObject = /*#__PURE__*/function (_Object3D) {
- _inherits(CSS3DObject, _Object3D);
- var _super = _createSuper$m(CSS3DObject);
- function CSS3DObject() {
- var _this2;
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');
- _classCallCheck(this, CSS3DObject);
- _this2 = _super.call(this);
- _this2.isCSS3DObject = true;
- _this2.element = element;
- _this2.element.style.position = 'absolute';
- _this2.element.style.pointerEvents = 'auto';
- _this2.element.style.userSelect = 'none';
- _this2.element.setAttribute('draggable', false);
- _this2.addEventListener('removed', function () {
- this.traverse(function (object) {
- if (object.element instanceof Element && object.element.parentNode !== null) {
- object.element.parentNode.removeChild(object.element);
- }
- });
- });
- return _this2;
- }
- _createClass(CSS3DObject, [{
- key: "copy",
- value: function copy(source, recursive) {
- _get(_getPrototypeOf(CSS3DObject.prototype), "copy", this).call(this, source, recursive);
- this.element = source.element.cloneNode(true);
- return this;
- }
- }]);
- return CSS3DObject;
- }(THREE$1.Object3D);
- var _matrix = new THREE$1.Matrix4();
- var _matrix2 = new THREE$1.Matrix4();
- var CSS3DRenderer = function CSS3DRenderer() {
- var parameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- _classCallCheck(this, CSS3DRenderer);
- var _this = this;
- var _width, _height;
- var _widthHalf, _heightHalf;
- var cache = {
- camera: {
- style: ''
- },
- objects: new WeakMap()
- };
- var domElement = parameters.element !== undefined ? parameters.element : document.createElement('div');
- domElement.style.overflow = 'hidden';
- this.domElement = domElement;
- var viewElement = document.createElement('div');
- viewElement.style.transformOrigin = '0 0';
- viewElement.style.pointerEvents = 'none';
- domElement.appendChild(viewElement);
- var cameraElement = document.createElement('div');
- cameraElement.style.transformStyle = 'preserve-3d';
- viewElement.appendChild(cameraElement);
- this.getSize = function () {
- return {
- width: _width,
- height: _height
- };
- };
- this.render = function (scene, camera) {
- var fov = camera.projectionMatrix.elements[5] * _heightHalf;
- if (camera.view && camera.view.enabled) {
- // view offset
- 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
- viewElement.style.transform += "scale( ".concat(camera.view.fullWidth / camera.view.width, ", ").concat(camera.view.fullHeight / camera.view.height, " )");
- } else {
- viewElement.style.transform = '';
- }
- if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld();
- if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld();
- var tx, ty;
- if (camera.isOrthographicCamera) {
- tx = -(camera.right + camera.left) / 2;
- ty = (camera.top + camera.bottom) / 2;
- }
- var scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;
- 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);
- var perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : '';
- var style = perspective + cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)';
- if (cache.camera.style !== style) {
- cameraElement.style.transform = style;
- cache.camera.style = style;
- }
- renderObject(scene, scene, camera);
- };
- this.setSize = function (width, height) {
- _width = width;
- _height = height;
- _widthHalf = _width / 2;
- _heightHalf = _height / 2;
- domElement.style.width = width + 'px';
- domElement.style.height = height + 'px';
- viewElement.style.width = width + 'px';
- viewElement.style.height = height + 'px';
- cameraElement.style.width = width + 'px';
- cameraElement.style.height = height + 'px';
- };
- function epsilon(value) {
- return Math.abs(value) < 1e-10 ? 0 : value;
- }
- function getCameraCSSMatrix(matrix) {
- var elements = matrix.elements;
- 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]) + ')';
- }
- function getObjectCSSMatrix(matrix) {
- var elements = matrix.elements;
- 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]) + ')';
- return 'translate(-50%,-50%)' + matrix3d;
- }
- function renderObject(object, scene, camera, cameraCSSMatrix) {
- if (object.isCSS3DObject) {
- var visible = object.visible === true && object.layers.test(camera.layers) === true;
- object.element.style.display = visible === true ? '' : 'none';
- if (visible === true) {
- object.onBeforeRender(_this, scene, camera);
- var style;
- if (object.isCSS3DSprite) {
- // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/
- _matrix.copy(camera.matrixWorldInverse);
- _matrix.transpose();
- if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D));
- object.matrixWorld.decompose(_position, _quaternion, _scale);
- _matrix.setPosition(_position);
- _matrix.scale(_scale);
- _matrix.elements[3] = 0;
- _matrix.elements[7] = 0;
- _matrix.elements[11] = 0;
- _matrix.elements[15] = 1;
- style = getObjectCSSMatrix(_matrix);
- } else {
- style = getObjectCSSMatrix(object.matrixWorld);
- }
- var element = object.element;
- var cachedObject = cache.objects.get(object);
- if (cachedObject === undefined || cachedObject.style !== style) {
- element.style.transform = style;
- var objectData = {
- style: style
- };
- cache.objects.set(object, objectData);
- }
- if (element.parentNode !== cameraElement) {
- cameraElement.appendChild(element);
- }
- object.onAfterRender(_this, scene, camera);
- }
- }
- for (var i = 0, l = object.children.length; i < l; i++) {
- renderObject(object.children[i], scene, camera);
- }
- }
- };
- 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); }; }
- 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; } }
- var CSS3DEleObj = /*#__PURE__*/function (_CSS3DObject) {
- _inherits(CSS3DEleObj, _CSS3DObject);
- var _super = _createSuper$l(CSS3DEleObj);
- function CSS3DEleObj(elem, option) {
- var _this;
- _classCallCheck(this, CSS3DEleObj);
- _this = _super.call(this, elem);
- _this.player = option.player;
- _this.manager = option.manager; // this.sid = option.sid !== undefined ? option.sid : common.getRandomSid()
- // this.sid = option.sid !== undefined ? option.sid : '123123123'
- _this.sid = option.sid;
- _this.text = option.text !== undefined ? option.text : '';
- _this.widthHeight = option.widthHeight;
- _this.renderRes = option.renderRes !== undefined ? option.renderRes : 1;
- _this.panoId = option.panoId;
- elem.children[0].style.zoom = _this.renderRes;
- _this.scaleRes = option.scaleRes !== undefined ? option.scaleRes / _this.renderRes : 1 / _this.renderRes;
- _this.scale.set(_this.scaleRes, _this.scaleRes, _this.scaleRes);
- _this.enabled = option.visible !== undefined ? option.visible : true;
- _this.visible = option.visible !== undefined ? option.visible : true;
- _this.plane = new THREE.Mesh(new THREE.PlaneGeometry(0.25, 0.25), new THREE.MeshBasicMaterial({
- wireframe: true,
- side: 2
- })); // console.log()
- if (_this.widthHeight) _this.plane.scale.set(_this.widthHeight.x / 100, _this.widthHeight.y / 100, 1);
- option.position !== undefined && _this.plane.position.copy(option.position);
- option.rotation !== undefined && _this.plane.rotation.copy(option.rotation);
- _this.plane.css3dObj = _assertThisInitialized(_this); // this.player.domElement.addEventListener('pointerdown', e => {
- // console.log('player down')
- // })
- elem.addEventListener('pointerdown', function (e) {
- e.stopPropagation();
- });
- elem.addEventListener('pointermove', function (e) {
- e.stopPropagation();
- });
- elem.addEventListener('pointerup', function (e) {
- e.stopPropagation();
- _this.manager.flyAndLookAt(_assertThisInitialized(_this));
- });
- elem.addEventListener('mousewheel', function (e) {
- e.stopPropagation();
- });
- elem.addEventListener('mousedown', function (e) {
- e.stopPropagation();
- });
- elem.addEventListener('mousemove', function (e) {
- e.stopPropagation();
- });
- elem.addEventListener('mouseup', function (e) {
- e.stopPropagation();
- });
- _this.visible = false;
- _this.tempHide = false;
- _this.plane.visible = false;
- return _this;
- }
- _createClass(CSS3DEleObj, [{
- key: "update",
- value: function update() {
- this.position.copy(this.plane.position);
- this.rotation.copy(this.plane.rotation);
- if (!this.widthHeight || this.widthHeight.x === 0 || this.widthHeight.y === 0) {
- this.widthHeight = {
- x: 0,
- y: 0
- };
- this.widthHeight.x = this.element.firstChild.offsetWidth;
- this.widthHeight.y = this.element.firstChild.offsetHeight;
- this.plane.scale.set(this.widthHeight.x / 100, this.widthHeight.y / 100, 1);
- } else {
- var w = Math.floor(this.plane.scale.x * 100);
- var h = Math.floor(this.plane.scale.y * 100);
- this.element.firstChild.style.width = w + 'px';
- this.element.firstChild.style.height = h + 'px';
- this.widthHeight.x = w;
- this.widthHeight.y = h;
- } // if (this.manager.isEdit) {
- // } else if (!this.enabled || (this.player.mode === 'panorama' && this.player.currentPano.id !== this.panoId)) {
- // this.visible = false
- // return
- // }
- //三维模式不显示
- if (this.manager.isEdit) ; else if (!this.enabled || this.player.mode !== 'panorama' || this.player.currentPano.id !== this.panoId) {
- this.visible = false;
- return;
- } // 墙体遮挡
- // var p = convertTool.getPos2d(this.position, this.player)
- // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, null)) {
- // console.log('hide')
- // this.visible = false
- // return
- // } else if (this.enabled && !this.tempHide) {
- // this.visible = true
- // }
- if (this.enabled && !this.tempHide) {
- this.visible = true;
- }
- }
- }, {
- key: "updatePlane",
- value: function updatePlane() {
- this.plane.position.copy(this.position);
- this.plane.rotation.copy(this.rotation);
- var w = this.widthHeight.x / 100;
- var h = this.widthHeight.y / 100;
- this.plane.scale.set(w, h, 1);
- }
- }]);
- return CSS3DEleObj;
- }(CSS3DObject);
- 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/* } */";
- n$4(css$1,{});
- 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); }; }
- 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; } }
- var settings = {
- maxWidth: 500,
- maxHeight: 500,
- scale: 0.0025,
- renderRes: 2
- };
- function degToRad(degrees) {
- return degrees * (Math.PI / 180);
- }
- function RadTodeg(radians) {
- return Math.floor(radians * (180 / Math.PI));
- }
- function roundToDecimalPlace(number, decimalPlaces) {
- var factor = Math.pow(10, decimalPlaces);
- return Math.round(number * factor) / factor;
- }
- var CSS3DManager = /*#__PURE__*/function (_Emiter) {
- _inherits(CSS3DManager, _Emiter);
- var _super = _createSuper$k(CSS3DManager);
- function CSS3DManager(app) {
- var _this;
- _classCallCheck(this, CSS3DManager);
- _this = _super.call(this);
- _this.bindEvents = function () {
- // this.player.on('pointerStart', this.onMouseDown)
- // this.player.on('pointerMove', this.onMouseMove)
- // this.player.on('pointerUp', this.onMouseUp)
- if (_this.isBind) return;
- _this.player.on(PlayerEvents.ViewChanged, _this.update);
- _this.player.on('flying.start', _this.onFlyStart.bind(_assertThisInitialized(_this)));
- _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this))); // this.player.model.transformControls.addEventListener('mouseUp', this.finishUpdateClipBox)
- _this.isBind = true;
- };
- _this.unBindEvents = function () {
- // this.player.off('pointerStart', this.onMouseDown)
- // this.player.off('pointerMove', this.onMouseMove)
- // this.player.off('pointerUp', this.onMouseUp)
- if (!_this.isBind) return;
- _this.player.off(PlayerEvents.ViewChanged, _this.update);
- _this.isBind = false;
- };
- _this.onFlyStart = function () {
- _this.update();
- };
- _this.onFlyEnd = function () {
- if (_this.isEdit) {
- if (_this.player.mode === Viewmode$1.PANORAMA) {
- _this.player.locked = true;
- } else {
- _this.player.locked = false;
- }
- }
- _this.update();
- };
- _this.switchTransformControlsMode = function (mode) {
- if (parseInt(mode) == 0) mode = 'translate';
- if (parseInt(mode) == 1) mode = 'rotate';
- if (parseInt(mode) == 2) mode = 'scale';
- _this.player.model.transformControls.mode = mode;
- };
- _this.update = function () {
- // console.log('update')
- _this.list.forEach(function (i) {
- i.update();
- });
- };
- _this.show = function (sid) {
- _this.waitInit(function () {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- obj.enabled = true;
- obj.visible = true;
- if (_this.isEdit) {
- _this.player.model.transformControls.visible = true;
- }
- }, _this.show.bind(_assertThisInitialized(_this), sid));
- };
- _this.hide = function (sid) {
- _this.waitInit(function () {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- obj.enabled = false;
- obj.visible = false;
- if (_this.isEdit) {
- // this.player.model.transformControls.enabled = false
- _this.player.model.transformControls.visible = false;
- }
- }, _this.hide.bind(_assertThisInitialized(_this), sid));
- };
- _this.showAll = function (current) {
- var currentPano;
- if (current) currentPano = _this.player.currentPano;
- _this.list.forEach(function (i) {
- if (current && currentPano) {
- i.panoId === currentPano.id && (i.visible = true);
- } else {
- i.tempHide = false;
- i.visible = true;
- }
- });
- _this.update();
- };
- _this.hideAll = function () {
- // this.group.visible = false //无效
- _this.list.forEach(function (i) {
- i.tempHide = true;
- i.visible = false;
- });
- console.log('hideAll');
- _this.update();
- };
- _this.sendData = function () {
- if (!_this.isEdit) return;
- var plane = _this.player.model.transformControls.object;
- var obj = plane.css3dObj;
- plane.scale.x = Math.min(settings.maxWidth / 100, plane.scale.x);
- plane.scale.y = Math.min(settings.maxHeight / 100, plane.scale.y);
- plane.scale.x = Math.max(40 / 100, plane.scale.x);
- plane.scale.y = Math.max(40 / 100, plane.scale.y);
- var data = {
- sid: obj.sid,
- position: {
- x: roundToDecimalPlace(obj.position.x, 2),
- y: roundToDecimalPlace(obj.position.y, 2),
- z: roundToDecimalPlace(obj.position.z, 2)
- },
- scale: {
- x: obj.widthHeight.x,
- y: obj.widthHeight.y
- },
- rotation: {
- x: RadTodeg(obj.rotation.x),
- y: RadTodeg(obj.rotation.y),
- z: RadTodeg(obj.rotation.z)
- },
- panoId: obj.panoId,
- visible: obj.enabled,
- text: obj.text
- };
- _this.emit('css3dmanager_sendData', data);
- };
- _this.setEditStyle = function (obj, isEnter) {
- if (isEnter) {
- _this.player.model.transformControls.attach(obj.plane);
- if (!obj.enabled) {
- _this.player.model.transformControls.visible = false;
- }
- obj.element.style.opacity = 0.5;
- obj.element.style.pointerEvents = 'none';
- obj.element.firstChild.style.pointerEvents = 'none';
- } else {
- _this.player.model.transformControls.detach();
- obj.element.style.opacity = 1;
- obj.element.style.pointerEvents = 'auto';
- obj.element.firstChild.style.pointerEvents = 'auto';
- }
- };
- _this.app = app;
- _this.player = null;
- _this.deferred = Deferred$1();
- _this.renderer = new CSS3DRenderer();
- _this.group = new THREE.Group();
- _this.group.name = 'css3D_Object_Group';
- _this.list = [];
- _this.intrArr = [];
- _this.mouse = new THREE.Vector3();
- _this.mousedown = new THREE.Vector3();
- _this.mouseup = new THREE.Vector3();
- _this.inited = false;
- _this.isBind = false;
- _this.isEdit = false;
- _this.renderInited = false;
- _this.recoverStack = null; // 初始化
- _this.init = function (metadata) {
- if (metadata) {
- metadata.forEach(function (i) {
- _this.build(i);
- });
- }
- _this.inited = true;
- _this.deferred.resolve(); // this.enterModule()
- };
- _this.addRenderer = function () {
- _this.player.model.add(_this.group);
- var sceneRenderer = _this.app.core.get('SceneRenderer');
- sceneRenderer.css3dRenderer = _this.renderer;
- _this.renderer.domElement.style.position = 'absolute';
- _this.renderer.domElement.style.top = 0;
- _this.renderer.domElement.style.zIndex = 10000;
- _this.renderer.domElement.style.pointerEvents = 'none';
- _this.renderer.setSize(sceneRenderer.renderWidth, sceneRenderer.renderHeight);
- var domElement = _this.app.dom.querySelector('.player'); // let domElement = this.app.dom
- domElement.appendChild(_this.renderer.domElement); // console.log(this.renderer.domElement)
- _this.bindEvents();
- _this.renderInited = true;
- };
- _this.removeRenderer = function () {
- _this.recoverStack.obj.removeFromParent();
- _this.recoverStack.obj.plane.removeFromParent();
- var index = _this.list.indexOf(_this.recoverStack.obj);
- _this.list.splice(index, 1);
- index = _this.intrArr.indexOf(_this.recoverStack.obj.plane);
- _this.intrArr.splice(index, 1);
- };
- _this.app.Scene.on('loaded', function () {
- setTimeout(function () {
- _this.player = _this.app.core.get('Player'); //获取metadata
- var metadata = null; // let metadata = [
- // {
- // sid: '123123123',
- // position: { x: -16, y: 0, z: 5 },
- // rotation: { x: 0, y: -90, z: 0 },
- // scale: { x: 233, y: 233 },
- // text: '你好',
- // },
- // ]
- _this.init(metadata);
- console.log('css3dManager init finish');
- }, 50);
- }); // 进入编辑
- _this.enterEdit = function (sid) {
- var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- _this.waitInit(function () {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- _this.setEditStyle(obj, true); //transformControls
- _this.player.model.transformControls.switchEditState('css3dpanel');
- _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
- _this.isEdit = true;
- _this.flyAndLookAt(obj, true);
- if (sid.isCSS3DObject) sid = sid.sid;
- var data = {
- sid,
- position: {
- x: obj.position.x,
- y: obj.position.y,
- z: obj.position.z
- },
- scale: {
- x: obj.widthHeight.x,
- y: obj.widthHeight.y
- },
- rotation: {
- x: RadTodeg(obj.rotation.x),
- y: RadTodeg(obj.rotation.y),
- z: RadTodeg(obj.rotation.z)
- },
- visible: obj.enabled,
- text: obj.text,
- panoId: obj.panoId
- };
- _this.emit('css3dmanager_sendData', data);
- _this.recoverStack = {
- obj,
- isNew,
- position: {
- x: obj.position.x,
- y: obj.position.y,
- z: obj.position.z
- },
- scale: {
- x: obj.widthHeight.x,
- y: obj.widthHeight.y
- },
- rotation: {
- x: RadTodeg(obj.rotation.x),
- y: RadTodeg(obj.rotation.y),
- z: RadTodeg(obj.rotation.z)
- },
- enabled: obj.enabled,
- panoId: obj.panoId
- };
- console.log('recoverStack =>', _this.recoverStack);
- }, _this.enterEdit.bind(_assertThisInitialized(_this), sid));
- }; // //离开模块
- _this.leaveEdit = function (obj) {
- _this.setEditStyle(obj, false);
- _this.player.model.transformControls.removeEventListener('mousing', _this.sendData);
- };
- _this.build = function (data, isNew) {
- if (data.panoId === undefined || data.panoId === null) return;
- _this.waitInit(function () {
- console.log('--------------build----------------');
- console.log(data);
- if (!_this.renderInited) _this.addRenderer();
- var position = data.position.isVector3 ? data.position : new THREE.Vector3(data.position.x, data.position.y, data.position.z);
- var scale = data.scale;
- var rotation = data.position.isEuler ? data.rotation : new THREE.Euler(degToRad(data.rotation.x), degToRad(data.rotation.y), degToRad(data.rotation.z));
- var text = data.text;
- var domEle = document.createElement('div');
- var domBox = document.createElement('div');
- domBox.classList.add('domBox');
- domBox.innerText = text;
- domEle.append(domBox);
- var domEleObj = new CSS3DEleObj(domEle, {
- player: _this.player,
- manager: _assertThisInitialized(_this),
- sid: data.sid,
- text: text,
- position: position,
- rotation: rotation,
- renderRes: settings.renderRes,
- scaleRes: settings.scale,
- widthHeight: scale,
- visible: data.visible,
- panoId: data.panoId
- });
- _this.group.add(domEleObj);
- _this.group.add(domEleObj.plane);
- _this.list.push(domEleObj);
- _this.intrArr.push(domEleObj.plane);
- if (data.cameraPos) {
- domEleObj.plane.lookAt(data.cameraPos);
- }
- domEleObj.update();
- if (isNew) {
- _this.waitCSS3DObjInit(domEleObj);
- } // setTimeout(() => {
- // if (scale) {
- // domBox.style.width = scale.x + 'px'
- // domBox.style.height = scale.y + 'px'
- // } else {
- // let x = domBox.offsetWidth
- // let y = domBox.offsetHeight
- // x = x === settings.maxWidth ? x : x - 40
- // y = y === settings.maxHeight ? y : y - 40
- // scale = { x, y }
- // }
- // domEleObj.widthHeight = scale
- // }, 100)
- }, _this.build.bind(_assertThisInitialized(_this), data));
- };
- _this.add = function (data) {
- var camera = _this.player.cameraControls.cameras['panorama'];
- var cameraPos = camera.position;
- var lookAt = new THREE.Vector3();
- camera.getWorldDirection(lookAt);
- var position = cameraPos.clone().add(lookAt);
- position.x = roundToDecimalPlace(position.x, 2);
- position.y = roundToDecimalPlace(position.y, 2);
- position.z = roundToDecimalPlace(position.z, 2);
- var rotation = new THREE.Euler(0, -Math.PI / 2, 0);
- _this.build({
- sid: data.sid,
- position,
- rotation,
- text: data.text,
- visible: true,
- cameraPos,
- panoId: _this.player.currentPano.id
- }, true);
- };
- _this.resetOption = function (sid) {
- _this.waitInit(function () {
- var func = function func() {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- _this.recoverStack = {
- obj,
- isNew: false,
- position: {
- x: obj.position.x,
- y: obj.position.y,
- z: obj.position.z
- },
- scale: {
- x: obj.widthHeight.x,
- y: obj.widthHeight.y
- },
- rotation: {
- x: RadTodeg(obj.rotation.x),
- y: RadTodeg(obj.rotation.y),
- z: RadTodeg(obj.rotation.z)
- },
- panoId: obj.panoId,
- enabled: obj.enabled
- };
- _this.isEdit = true;
- _this.setEditStyle(obj, true);
- _this.player.model.transformControls.switchEditState('css3dpanel');
- _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
- _this.player.locked = true;
- var camera = _this.player.cameraControls.cameras['panorama'];
- var cameraPos = camera.position;
- var lookAt = new THREE.Vector3();
- camera.getWorldDirection(lookAt);
- var position = cameraPos.clone().add(lookAt);
- position.x = roundToDecimalPlace(position.x, 2);
- position.y = roundToDecimalPlace(position.y, 2);
- position.z = roundToDecimalPlace(position.z, 2);
- var panoId = _this.player.currentPano.id;
- obj.position.copy(position);
- obj.panoId = panoId;
- obj.lookAt(camera.position);
- obj.updatePlane();
- obj.update();
- var data = {
- sid,
- position: {
- x: obj.position.x,
- y: obj.position.y,
- z: obj.position.z
- },
- scale: {
- x: obj.widthHeight.x,
- y: obj.widthHeight.y
- },
- rotation: {
- x: RadTodeg(obj.rotation.x),
- y: RadTodeg(obj.rotation.y),
- z: RadTodeg(obj.rotation.z)
- },
- panoId: obj.panoId,
- visible: obj.enabled,
- text: obj.text
- };
- _this.emit('css3dmanager_sendData', data);
- };
- if (_this.player.mode !== Viewmode$1.PANORAMA) {
- _this.player.insideMode();
- _this.player.once('flying.ended', func.bind(_assertThisInitialized(_this)));
- } else {
- func();
- }
- }, _this.resetOption.bind(_assertThisInitialized(_this), sid));
- };
- _this.updateList = function (list) {
- _this.waitInit(function () {
- if (_this.isEdit) return;
- if (!list || list.length <= 0) return;
- list.forEach(function (data) {
- var obj = _this.getObjBySid(data.sid);
- if (!obj) {
- _this.build(data);
- } else {
- if (obj.text !== data.text) {
- console.log(obj.sid + '=> text udpate');
- _this.setText(obj, data.text);
- }
- if (obj.position.x !== data.position.x || obj.position.y !== data.position.y || obj.position.z !== data.position.z) {
- console.log(obj.sid + '=> position udpate');
- _this.setPosition(obj, data.position);
- }
- 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) {
- console.log(obj.sid + '=> rotation udpate');
- _this.setRotation(obj, data.rotation);
- }
- if (obj.widthHeight.x !== data.scale.x || obj.widthHeight.y !== data.scale.y) {
- console.log(obj.sid + '=> scale udpate');
- _this.setScale(obj, data.scale);
- }
- if (obj.enabled !== data.visible) {
- console.log(obj, obj.enabled, data.visible);
- console.log(obj.sid + '=> visible udpate');
- obj.enabled = data.visible; // obj.visible = data.visible
- }
- }
- });
- }, _this.updateList.bind(_assertThisInitialized(_this), list));
- };
- _this.setText = function (sid, text) {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- obj.element.children[0].innerText = text;
- obj.text = text;
- };
- _this.setPosition = function (sid, position) {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- var p = new THREE.Vector3(position.x, position.y, position.z);
- obj.position.copy(p);
- obj.updatePlane();
- };
- _this.setRotation = function (sid, rotation) {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- var r = new THREE.Euler(degToRad(rotation.x), degToRad(rotation.y), degToRad(rotation.z));
- obj.rotation.copy(r);
- obj.updatePlane();
- };
- _this.setScale = function (sid, scale) {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- var elem = obj.element.children[0];
- elem.style.width = scale.x + 'px';
- elem.style.height = scale.y + 'px';
- obj.widthHeight = {
- x: scale.x,
- y: scale.y
- };
- if (scale.x > settings.maxWidth) {
- elem.style.maxWidth = 'none';
- } else {
- elem.style.maxWidth = settings.maxWidth + 'px';
- }
- if (scale.y > settings.maxHeight) {
- elem.style.maxHeight = 'none';
- } else {
- elem.style.maxHeight = settings.maxHeight + 'px';
- }
- obj.updatePlane();
- };
- _this.getObjBySid = function (sid) {
- var obj = null;
- if (sid.isCSS3DObject) {
- obj = sid;
- } else {
- for (var i = 0; i < _this.list.length; i++) {
- if (_this.list[i].sid === sid) {
- obj = _this.list[i];
- break;
- }
- }
- }
- return obj;
- };
- _this.flyAndLookAt = function (sid, enterEdit) {
- var obj = _this.getObjBySid(sid);
- if (!obj) {
- console.error('cssObject no found sid=' + sid);
- return;
- }
- if (obj.panoId === undefined) {
- console.error('cssObject.panoId no found sid=' + sid);
- return;
- }
- var currentPanoId = _this.player.currentPano.id;
- _this.player.flyToPano({
- pano: _this.app.Scene.panos.index[obj.panoId],
- lookAtPoint: obj.position,
- checkAlone: true
- });
- if (enterEdit && currentPanoId === obj.panoId) {
- _this.player.locked = true;
- }
- }; // //删除
- // this.delete = () => {}
- // //清空
- // this.clear = () => {}
- //保存编辑
- _this.saveEdit = function () {
- if (!_this.isEdit) return;
- _this.leaveEdit(_this.recoverStack.obj);
- _this.recoverStack = null;
- _this.isEdit = false;
- _this.player.locked = false;
- _this.update();
- }; //退出编辑
- _this.cancelEdit = function () {
- if (!_this.isEdit) return;
- console.log(_this.recoverStack);
- _this.leaveEdit(_this.recoverStack.obj);
- if (_this.recoverStack.isNew) {
- _this.removeRenderer();
- return;
- }
- _this.setPosition(_this.recoverStack.obj, _this.recoverStack.position);
- _this.setRotation(_this.recoverStack.obj, _this.recoverStack.rotation);
- _this.setScale(_this.recoverStack.obj, _this.recoverStack.scale);
- _this.recoverStack.obj.enabled = _this.recoverStack.enabled;
- _this.recoverStack.obj.panoId = _this.recoverStack.panoId; // this.recoverStack.obj.visible = this.recoverStack.visible
- _this.recoverStack = null;
- _this.isEdit = false;
- _this.player.locked = false;
- _this.update();
- };
- return _this;
- } //事件绑定
- _createClass(CSS3DManager, [{
- key: "waitInit",
- value: //等待初始化
- function waitInit(func, waitFunc) {
- if (this.inited) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- }, {
- key: "waitCSS3DObjInit",
- value: function waitCSS3DObjInit(obj) {
- var _this2 = this;
- if (obj.widthHeight.x !== 0 && obj.widthHeight.y !== 0) {
- this.enterEdit(obj, true);
- } else {
- setTimeout(function () {
- obj.update();
- _this2.waitCSS3DObjInit(obj);
- }, 50);
- }
- }
- }]);
- return CSS3DManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var ScaleZoom$1 = 1;
- var size$1 = 0.012;
- var Point = /*#__PURE__*/function (_THREE$Sprite) {
- _inherits(Point, _THREE$Sprite);
- var _super = _createSuper$j(Point);
- function Point(color, adding) {
- var _this;
- _classCallCheck(this, Point);
- var data = new Uint8Array([255, 255, 255, 255]);
- var map = new THREE.DataTexture(data, 1, 1);
- map.needsUpdate = true;
- var material = new THREE.SpriteMaterial({
- transparent: true,
- sizeAttenuation: false,
- color: color,
- map: map
- });
- var customUniforms = {
- state: {
- value: adding ? 2 : 0
- }
- };
- material.onBeforeCompile = function (shader) {
- shader.uniforms.state = customUniforms.state;
- shader.fragmentShader = shader.fragmentShader.replace('#include <uv_pars_fragment>', "\n #include <uv_pars_fragment>\n \n uniform int state;\n ");
- 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 ");
- };
- material.depthFunc = THREE.AlwaysDepth;
- _this = _super.call(this, material);
- _this.uniforms = customUniforms;
- _this.color = color;
- _this.scale.set(size$1, size$1, 1);
- _this.renderOrder = RenderOrder.monitorPlane;
- _this.setScale(null, false);
- _this.isPolygonMarkElement = true;
- _this.isPolygonMarkPoint = true;
- return _this;
- }
- _createClass(Point, [{
- key: "setPosition",
- value: function setPosition(pos) {
- this.position.copy(pos);
- }
- }, {
- key: "setScale",
- value: function setScale(zoom) {
- var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var t;
- if (zoom) {
- t = 0.012 * (1 / zoom);
- if (fromZoom) ScaleZoom$1 = zoom;
- } else {
- t = 0.012 * (1 / ScaleZoom$1);
- }
- this.scale.set(t, t, t);
- }
- }, {
- key: "setColor",
- value: function setColor(color) {
- var cover = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- this.material.color.set(color);
- cover && (this.color = color);
- }
- }, {
- key: "highLight",
- value: function highLight() {
- this.uniforms.state.value = 1;
- this.visible = true;
- }
- }, {
- key: "midLight",
- value: function midLight() {
- this.uniforms.state.value = 0;
- this.visible = true;
- }
- }, {
- key: "lowLight",
- value: function lowLight() {
- this.uniforms.state.value = 0;
- this.visible = false;
- }
- }]);
- return Point;
- }(THREE.Sprite);
- 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); }; }
- 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; } }
- var activeColor = Colors.mainColor; //0x007BFF //0x00c8af
- var dashedMat = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: activeColor,
- dashSize: 0.03,
- gapSize: 0.03,
- dashed: true
- /*, alwaysShow: true*/
- });
- var activeMat = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: activeColor
- /*, alwaysShow: true*/
- });
- var Line = /*#__PURE__*/function (_THREE$Group) {
- _inherits(Line, _THREE$Group);
- var _super = _createSuper$i(Line);
- function Line(points, lineMat) {
- var _this;
- _classCallCheck(this, Line);
- // let normalMaterial = new THREE.LineBasicMaterial({ //默认 normal
- // color: color,
- // depthFunc: THREE.AlwaysDepth
- // })
- // let activeMaterial = new THREE.LineBasicMaterial({ //激活 active
- // color: 0x00C8AF,
- // depthFunc: THREE.AlwaysDepth
- // })
- // let dashedMaterial = new THREE.LineDashedMaterial({ //虚线 dashed
- // color: 0x00C8AF,
- // dashSize: 0.01,
- // gapSize: 0.01,
- // scale: 1,
- // depthFunc: THREE.AlwaysDepth
- // })
- // const geometry = new THREE.BufferGeometry().setFromPoints(points)
- // super(geometry, dashedMaterial)
- // this.normalMaterial = normalMaterial
- // this.activeMaterial = activeMaterial
- // this.dashedMaterial = dashedMaterial
- // this.frustumCulled = false
- // this.renderOrder = RenderOrder.entryArrow
- // this.isPolygonMarkElement = true
- // this.startPoint = points[0]
- // this.line = LineDraw.createFatLine(points, { material: lineMat })
- // this.line.renderOrder = RenderOrder.entryArrow
- // console.log(this.line)
- // this.add(this.line)
- _this = _super.call(this);
- _this.line = LineDraw.createFatLine(points, {
- material: lineMat
- });
- _this.line.renderOrder = RenderOrder.entryArrow;
- _this.normalMaterial = lineMat;
- _this.startPoint = points[0];
- _this.add(_this.line);
- return _this;
- }
- _createClass(Line, [{
- key: "setMaterial",
- value: function setMaterial(type) {
- switch (type) {
- case 'normal':
- this.line.material = this.normalMaterial;
- break;
- case 'active':
- this.line.material = activeMat;
- break;
- case 'dashed':
- this.line.material = dashedMat;
- break;
- }
- }
- }, {
- key: "update",
- value: function update(pos) {
- LineDraw.moveFatLine(this.line, [this.startPoint, pos]);
- }
- }]);
- return Line;
- }(THREE.Group);
- 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); }; }
- 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; } }
- /* var activeColor = 0x00c8af
- var activeMat = LineDraw.createFatLineMat({ lineWidth: 2, color: activeColor })
- */
- var LineLoop = /*#__PURE__*/function (_THREE$Group) {
- _inherits(LineLoop, _THREE$Group);
- var _super = _createSuper$h(LineLoop);
- function LineLoop(points, lineMat, activeLineMat) {
- var _this;
- _classCallCheck(this, LineLoop);
- _this = _super.call(this);
- var p = points[0].clone();
- p = points.concat([p]);
- var material = new THREE.LineBasicMaterial({
- color: 0xffffff // opacity: 0,
- // transparent: true
- });
- for (var i = 0; i < p.length - 1; i++) {
- var temp = [p[i], p[i + 1]];
- var geometry = new THREE.BufferGeometry().setFromPoints(temp);
- var line = new THREE.Line(geometry, material);
- line.isPolygonMarkElement = true;
- line.isPolygonMarkLine = true;
- line.startPoint = i; // line.endPoint = i+1
- _this.add(line);
- }
- _this.fatLine = LineDraw.createFatLine(p, {
- material: lineMat
- });
- _this.fatLine.renderOrder = RenderOrder.entryArrow;
- _this.normalMaterial = lineMat;
- _this.activeMatarial = activeLineMat;
- _this.isPolygonMarkElement = true;
- _this.isPolygonMarkLineLoop = true;
- _this.add(_this.fatLine);
- return _this;
- }
- _createClass(LineLoop, [{
- key: "setColor",
- value: function setColor(color) {
- this.normalMaterial.color.set(color);
- }
- }, {
- key: "highLight",
- value: function highLight() {
- this.fatLine.material = this.activeMatarial;
- }
- }, {
- key: "midLight",
- value: function midLight() {
- this.fatLine.material = this.normalMaterial;
- }
- }, {
- key: "lowLight",
- value: function lowLight() {
- this.fatLine.material = this.normalMaterial;
- }
- }]);
- return LineLoop;
- }(THREE.Group);
- 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); }; }
- 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; } }
- var opa = 0.3;
- var Shape = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(Shape, _THREE$Mesh);
- var _super = _createSuper$g(Shape);
- //多边形面
- function Shape(v) {
- var _this;
- var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 1, 2];
- var color = arguments.length > 2 ? arguments[2] : undefined;
- _classCallCheck(this, Shape);
- var material = new THREE.MeshBasicMaterial({
- color: color,
- transparent: true,
- // wireframe: true,
- opacity: opa,
- side: THREE.DoubleSide
- });
- material.depthFunc = THREE.AlwaysDepth;
- var geometry = new THREE.BufferGeometry();
- var vertices = new Float32Array(v);
- var indexes = i;
- geometry.setIndex(indexes);
- geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
- _this = _super.call(this, geometry, material);
- _this.frustumCulled = false;
- _this.renderOrder = RenderOrder.entryArrow;
- _this.visible = false;
- _this.isPolygonMarkElement = true;
- _this.active = 0;
- return _this;
- }
- _createClass(Shape, [{
- key: "highLight",
- value: function highLight() {
- this.selected = true;
- 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)
- }
- }, {
- key: "midLight",
- value: function midLight() {
- common$1.updateVisible(this, 'highlight', false);
- }
- }, {
- key: "lowLight",
- value: function lowLight() {
- this.selected = false;
- common$1.updateVisible(this, 'highlight', false); //if(!this.flashing) this.material.opacity = this.opacity2 == void 0 ? opa : this.opacity2
- }
- }, {
- key: "setColor",
- value: function setColor(color) {
- //xzw add
- this.material.color.set(color);
- }
- }, {
- key: "setDisplay",
- value: function setDisplay(color, opacity, flashing) {
- //新功能 闪烁 xzw
- common$1.updateVisible(this, 'display', flashing, 1, flashing ? 'add' : 'cancel');
- this.flashing = flashing;
- if (!flashing) {
- this.selected ? this.highLight() : this.lowLight();
- }
- color != void 0 && this.setColor(color);
- opacity != void 0 && (this.opacity2 = this.material.opacity = opacity);
- }
- }]);
- return Shape;
- }(THREE.Mesh);
- /**
- * Port from https://github.com/mapbox/earcut (v2.2.4)
- */
- var Earcut = {
- triangulate: function triangulate(data, holeIndices) {
- var dim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
- var hasHoles = holeIndices && holeIndices.length;
- var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
- var outerNode = linkedList(data, 0, outerLen, dim, true);
- var triangles = [];
- if (!outerNode || outerNode.next === outerNode.prev) return triangles;
- var minX, minY, maxX, maxY, x, y, invSize;
- 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
- if (data.length > 80 * dim) {
- minX = maxX = data[0];
- minY = maxY = data[1];
- for (var i = dim; i < outerLen; i += dim) {
- x = data[i];
- y = data[i + 1];
- if (x < minX) minX = x;
- if (y < minY) minY = y;
- if (x > maxX) maxX = x;
- if (y > maxY) maxY = y;
- } // minX, minY and invSize are later used to transform coords into integers for z-order calculation
- invSize = Math.max(maxX - minX, maxY - minY);
- invSize = invSize !== 0 ? 32767 / invSize : 0;
- }
- earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);
- return triangles;
- }
- }; // create a circular doubly linked list from polygon points in the specified winding order
- function linkedList(data, start, end, dim, clockwise) {
- var i, last;
- if (clockwise === signedArea(data, start, end, dim) > 0) {
- for (i = start; i < end; i += dim) {
- last = insertNode(i, data[i], data[i + 1], last);
- }
- } else {
- for (i = end - dim; i >= start; i -= dim) {
- last = insertNode(i, data[i], data[i + 1], last);
- }
- }
- if (last && equals(last, last.next)) {
- removeNode(last);
- last = last.next;
- }
- return last;
- } // eliminate colinear or duplicate points
- function filterPoints(start, end) {
- if (!start) return start;
- if (!end) end = start;
- var p = start,
- again;
- do {
- again = false;
- if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
- removeNode(p);
- p = end = p.prev;
- if (p === p.next) break;
- again = true;
- } else {
- p = p.next;
- }
- } while (again || p !== end);
- return end;
- } // main ear slicing loop which triangulates a polygon (given as a linked list)
- function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
- if (!ear) return; // interlink polygon nodes in z-order
- if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
- var stop = ear,
- prev,
- next; // iterate through ears, slicing them one by one
- while (ear.prev !== ear.next) {
- prev = ear.prev;
- next = ear.next;
- if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
- // cut off the triangle
- triangles.push(prev.i / dim | 0);
- triangles.push(ear.i / dim | 0);
- triangles.push(next.i / dim | 0);
- removeNode(ear); // skipping the next vertex leads to less sliver triangles
- ear = next.next;
- stop = next.next;
- continue;
- }
- ear = next; // if we looped through the whole remaining polygon and can't find any more ears
- if (ear === stop) {
- // try filtering points and slicing again
- if (!pass) {
- earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally
- } else if (pass === 1) {
- ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
- earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two
- } else if (pass === 2) {
- splitEarcut(ear, triangles, dim, minX, minY, invSize);
- }
- break;
- }
- }
- } // check whether a polygon node forms a valid ear with adjacent nodes
- function isEar(ear) {
- var a = ear.prev,
- b = ear,
- c = ear.next;
- if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
- // now make sure we don't have other points inside the potential ear
- var ax = a.x,
- bx = b.x,
- cx = c.x,
- ay = a.y,
- by = b.y,
- cy = c.y; // triangle bbox; min & max are calculated like this for speed
- var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
- y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
- x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
- y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;
- var p = c.next;
- while (p !== a) {
- 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;
- p = p.next;
- }
- return true;
- }
- function isEarHashed(ear, minX, minY, invSize) {
- var a = ear.prev,
- b = ear,
- c = ear.next;
- if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
- var ax = a.x,
- bx = b.x,
- cx = c.x,
- ay = a.y,
- by = b.y,
- cy = c.y; // triangle bbox; min & max are calculated like this for speed
- var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
- y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
- x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
- y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; // z-order range for the current triangle bbox;
- var minZ = zOrder(x0, y0, minX, minY, invSize),
- maxZ = zOrder(x1, y1, minX, minY, invSize);
- var p = ear.prevZ,
- n = ear.nextZ; // look for points inside the triangle in both directions
- while (p && p.z >= minZ && n && n.z <= maxZ) {
- 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;
- p = p.prevZ;
- 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;
- n = n.nextZ;
- } // look for remaining points in decreasing z-order
- while (p && p.z >= minZ) {
- 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;
- p = p.prevZ;
- } // look for remaining points in increasing z-order
- while (n && n.z <= maxZ) {
- 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;
- n = n.nextZ;
- }
- return true;
- } // go through all polygon nodes and cure small local self-intersections
- function cureLocalIntersections(start, triangles, dim) {
- var p = start;
- do {
- var a = p.prev,
- b = p.next.next;
- if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
- triangles.push(a.i / dim | 0);
- triangles.push(p.i / dim | 0);
- triangles.push(b.i / dim | 0); // remove two nodes involved
- removeNode(p);
- removeNode(p.next);
- p = start = b;
- }
- p = p.next;
- } while (p !== start);
- return filterPoints(p);
- } // try splitting polygon into two and triangulate them independently
- function splitEarcut(start, triangles, dim, minX, minY, invSize) {
- // look for a valid diagonal that divides the polygon into two
- var a = start;
- do {
- var b = a.next.next;
- while (b !== a.prev) {
- if (a.i !== b.i && isValidDiagonal(a, b)) {
- // split the polygon in two by the diagonal
- var c = splitPolygon(a, b); // filter colinear points around the cuts
- a = filterPoints(a, a.next);
- c = filterPoints(c, c.next); // run earcut on each half
- earcutLinked(a, triangles, dim, minX, minY, invSize, 0);
- earcutLinked(c, triangles, dim, minX, minY, invSize, 0);
- return;
- }
- b = b.next;
- }
- a = a.next;
- } while (a !== start);
- } // link every hole into the outer loop, producing a single-ring polygon without holes
- function eliminateHoles(data, holeIndices, outerNode, dim) {
- var queue = [];
- var i, len, start, end, list;
- for (i = 0, len = holeIndices.length; i < len; i++) {
- start = holeIndices[i] * dim;
- end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
- list = linkedList(data, start, end, dim, false);
- if (list === list.next) list.steiner = true;
- queue.push(getLeftmost(list));
- }
- queue.sort(compareX); // process holes from left to right
- for (i = 0; i < queue.length; i++) {
- outerNode = eliminateHole(queue[i], outerNode);
- }
- return outerNode;
- }
- function compareX(a, b) {
- return a.x - b.x;
- } // find a bridge between vertices that connects hole with an outer ring and link it
- function eliminateHole(hole, outerNode) {
- var bridge = findHoleBridge(hole, outerNode);
- if (!bridge) {
- return outerNode;
- }
- var bridgeReverse = splitPolygon(bridge, hole); // filter collinear points around the cuts
- filterPoints(bridgeReverse, bridgeReverse.next);
- return filterPoints(bridge, bridge.next);
- } // David Eberly's algorithm for finding a bridge between hole and outer polygon
- function findHoleBridge(hole, outerNode) {
- var p = outerNode,
- qx = -Infinity,
- m;
- var hx = hole.x,
- hy = hole.y; // find a segment intersected by a ray from the hole's leftmost point to the left;
- // segment's endpoint with lesser x will be potential connection point
- do {
- if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
- var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
- if (x <= hx && x > qx) {
- qx = x;
- m = p.x < p.next.x ? p : p.next;
- if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint
- }
- }
- p = p.next;
- } while (p !== outerNode);
- if (!m) return null; // look for points inside the triangle of hole point, segment intersection and endpoint;
- // if there are no points found, we have a valid connection;
- // otherwise choose the point of the minimum angle with the ray as connection point
- var stop = m,
- mx = m.x,
- my = m.y;
- var tanMin = Infinity,
- tan;
- p = m;
- do {
- 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)) {
- tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
- if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
- m = p;
- tanMin = tan;
- }
- }
- p = p.next;
- } while (p !== stop);
- return m;
- } // whether sector in vertex m contains sector in vertex p in the same coordinates
- function sectorContainsSector(m, p) {
- return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
- } // interlink polygon nodes in z-order
- function indexCurve(start, minX, minY, invSize) {
- var p = start;
- do {
- if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);
- p.prevZ = p.prev;
- p.nextZ = p.next;
- p = p.next;
- } while (p !== start);
- p.prevZ.nextZ = null;
- p.prevZ = null;
- sortLinked(p);
- } // Simon Tatham's linked list merge sort algorithm
- // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
- function sortLinked(list) {
- var i,
- p,
- q,
- e,
- tail,
- numMerges,
- pSize,
- qSize,
- inSize = 1;
- do {
- p = list;
- list = null;
- tail = null;
- numMerges = 0;
- while (p) {
- numMerges++;
- q = p;
- pSize = 0;
- for (i = 0; i < inSize; i++) {
- pSize++;
- q = q.nextZ;
- if (!q) break;
- }
- qSize = inSize;
- while (pSize > 0 || qSize > 0 && q) {
- if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
- e = p;
- p = p.nextZ;
- pSize--;
- } else {
- e = q;
- q = q.nextZ;
- qSize--;
- }
- if (tail) tail.nextZ = e;else list = e;
- e.prevZ = tail;
- tail = e;
- }
- p = q;
- }
- tail.nextZ = null;
- inSize *= 2;
- } while (numMerges > 1);
- return list;
- } // z-order of a point given coords and inverse of the longer side of data bbox
- function zOrder(x, y, minX, minY, invSize) {
- // coords are transformed into non-negative 15-bit integer range
- x = (x - minX) * invSize | 0;
- y = (y - minY) * invSize | 0;
- x = (x | x << 8) & 0x00ff00ff;
- x = (x | x << 4) & 0x0f0f0f0f;
- x = (x | x << 2) & 0x33333333;
- x = (x | x << 1) & 0x55555555;
- y = (y | y << 8) & 0x00ff00ff;
- y = (y | y << 4) & 0x0f0f0f0f;
- y = (y | y << 2) & 0x33333333;
- y = (y | y << 1) & 0x55555555;
- return x | y << 1;
- } // find the leftmost node of a polygon ring
- function getLeftmost(start) {
- var p = start,
- leftmost = start;
- do {
- if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;
- p = p.next;
- } while (p !== start);
- return leftmost;
- } // check if a point lies within a convex triangle
- function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
- 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);
- } // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
- function isValidDiagonal(a, b) {
- 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
- } // signed area of a triangle
- function area(p, q, r) {
- return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
- } // check if two points are equal
- function equals(p1, p2) {
- return p1.x === p2.x && p1.y === p2.y;
- } // check if two segments intersect
- function intersects(p1, q1, p2, q2) {
- var o1 = sign(area(p1, q1, p2));
- var o2 = sign(area(p1, q1, q2));
- var o3 = sign(area(p2, q2, p1));
- var o4 = sign(area(p2, q2, q1));
- if (o1 !== o2 && o3 !== o4) return true; // general case
- if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
- if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
- if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
- if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
- return false;
- } // for collinear points p, q, r, check if point q lies on segment pr
- function onSegment(p, q, r) {
- 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);
- }
- function sign(num) {
- return num > 0 ? 1 : num < 0 ? -1 : 0;
- } // check if a polygon diagonal intersects any polygon segments
- function intersectsPolygon(a, b) {
- var p = a;
- do {
- 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;
- p = p.next;
- } while (p !== a);
- return false;
- } // check if a polygon diagonal is locally inside the polygon
- function locallyInside(a, b) {
- 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;
- } // check if the middle point of a polygon diagonal is inside the polygon
- function middleInside(a, b) {
- var p = a,
- inside = false;
- var px = (a.x + b.x) / 2,
- py = (a.y + b.y) / 2;
- do {
- 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;
- p = p.next;
- } while (p !== a);
- return inside;
- } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
- // if one belongs to the outer ring and another to a hole, it merges it into a single ring
- function splitPolygon(a, b) {
- var a2 = new Node(a.i, a.x, a.y),
- b2 = new Node(b.i, b.x, b.y),
- an = a.next,
- bp = b.prev;
- a.next = b;
- b.prev = a;
- a2.next = an;
- an.prev = a2;
- b2.next = a2;
- a2.prev = b2;
- bp.next = b2;
- b2.prev = bp;
- return b2;
- } // create a node and optionally link it with previous one (in a circular doubly linked list)
- function insertNode(i, x, y, last) {
- var p = new Node(i, x, y);
- if (!last) {
- p.prev = p;
- p.next = p;
- } else {
- p.next = last.next;
- p.prev = last;
- last.next.prev = p;
- last.next = p;
- }
- return p;
- }
- function removeNode(p) {
- p.next.prev = p.prev;
- p.prev.next = p.next;
- if (p.prevZ) p.prevZ.nextZ = p.nextZ;
- if (p.nextZ) p.nextZ.prevZ = p.prevZ;
- }
- function Node(i, x, y) {
- // vertex index in coordinates array
- this.i = i; // vertex coordinates
- this.x = x;
- this.y = y; // previous and next vertex nodes in a polygon ring
- this.prev = null;
- this.next = null; // z-order curve value
- this.z = 0; // previous and next nodes in z-order
- this.prevZ = null;
- this.nextZ = null; // indicates whether this is a steiner point
- this.steiner = false;
- }
- function signedArea(data, start, end, dim) {
- var sum = 0;
- for (var i = start, j = end - dim; i < end; i += dim) {
- sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
- j = i;
- }
- return sum;
- }
- var PolyGonMark = /*#__PURE__*/function () {
- function PolyGonMark(manager, parent, option) {
- var _this = this;
- _classCallCheck(this, PolyGonMark);
- this.manager = manager;
- this.parent = parent; // this.sid = common.getRandomSid()
- // this.name = 'Mark_' + this.sid
- this.group = new THREE.Group();
- this.group.parentObj = this;
- this.pointGroup = new THREE.Group();
- this.lineGroup = new THREE.Group();
- this.shapeGroup = new THREE.Group();
- this.group.add(this.pointGroup);
- this.group.add(this.lineGroup);
- this.group.add(this.shapeGroup);
- this.points = [];
- this.lines = [];
- this.shape = null;
- this.shapeIndexes = [];
- this.color = option.color; //this.activeColor = 0x00c8af
- this.lineMat = option.lineMat;
- this.activeLineMat = option.activeLineMat;
- this.tempPoint;
- this.tempLine;
- this.active = false;
- this.draw = {};
- this.edit = {};
- this.draw.add = function (pos) {
- //绘制中加点
- if (_this.points.length > 3 && _this.tempPoint && _this.tempPoint.position.distanceTo(_this.points[0].position) < 0.025) {
- //触发闭合事件
- _this.draw.finish();
- return;
- } //add
- var p = new Point(_this.color, true);
- _this.tempPoint = p;
- p.setPosition(pos); //p.highLight()
- _this.pointGroup.add(p);
- _this.points.push(p); //第一个点
- // if(this.points.length === 4) {
- // this.manager.showFinishManager(this.points[0].position)
- // }
- if (_this.points.length === 1) {
- _this.draw.add(pos);
- } else {
- var p1 = _this.points[_this.points.length - 2].position.clone();
- var p2 = _this.points[_this.points.length - 1].position.clone();
- var pArr = [p1, p2];
- var l = new Line(pArr, _this.lineMat);
- _this.tempLine && _this.tempLine.setMaterial('active');
- _this.tempLine = l;
- _this.tempLine.setMaterial('dashed');
- _this.lineGroup.add(l);
- _this.lines.push(l);
- }
- };
- this.draw.delete = function () {
- if (_this.tempPoint) {
- var pos = _this.tempPoint.position.clone();
- _this.points.pop();
- _this.lines.pop();
- _this.pointGroup.remove(_this.tempPoint);
- _this.lineGroup.remove(_this.tempLine);
- var p = _this.points[_this.points.length - 1].position.clone();
- if (_this.points.length > 1) {
- _this.tempPoint = _this.points[_this.points.length - 1];
- _this.tempLine = _this.lines[_this.lines.length - 1];
- _this.tempLine.setMaterial('dashed');
- _this.draw.update(pos);
- } else {
- _this.deleteAll();
- }
- return p;
- }
- };
- this.draw.recover = function (pos) {
- var p = new Point(_this.color);
- p.setPosition(pos);
- p.highLight();
- _this.pointGroup.add(p);
- _this.points.splice(_this.points.length - 1, 0, p);
- _this.lines.pop();
- _this.lineGroup.remove(_this.tempLine);
- var p1 = _this.points[_this.points.length - 3].position.clone();
- var p2 = _this.points[_this.points.length - 2].position.clone();
- var pArr = [p1, p2];
- var l = new Line(pArr, _this.lineMat);
- l.setMaterial('active');
- _this.lineGroup.add(l);
- _this.lines.push(l);
- var p3 = _this.points[_this.points.length - 2].position.clone();
- var p4 = _this.points[_this.points.length - 1].position.clone();
- var pArr2 = [p3, p4];
- var l2 = new Line(pArr2, _this.lineMat);
- _this.tempLine = l2;
- _this.tempLine.setMaterial('dashed');
- _this.lineGroup.add(l2);
- _this.lines.push(l2);
- _this.draw.update(_this.tempPoint.position);
- };
- this.draw.finish = function (immediate) {
- // if (immediate) {
- // if (this.points.length >= 4) {
- // this.draw.delete()
- // this.draw.finish()
- // console.log('immediate finish')
- // }
- // return
- // }
- if (_this.points.length < 4) return;
- console.log('finish');
- var index = _this.points.indexOf(_this.tempPoint);
- index !== -1 && _this.points.splice(index, 1);
- _this.pointGroup.remove(_this.tempPoint);
- _this.createLoopLine();
- _this.createShape();
- _this.midLight(); //emit
- _this.manager.emit('polygonmarkManager.finish');
- _this.manager.emit('polygonmarkManager.update');
- if (!_this.parent.label) {
- _this.parent.createLabel(_this.computePointsCenter());
- } else {
- _this.parent.updateIntersectArr();
- }
- };
- this.draw.update = function (pos) {
- _this.tempPoint && _this.tempPoint.setPosition(pos);
- _this.tempLine && _this.tempLine.update(pos);
- };
- this.draw.increase = function (pos, pointIndex) {
- var p = new Point(_this.color);
- p.midLight();
- p.setPosition(pos);
- _this.points.splice(pointIndex + 1, 0, p);
- _this.pointGroup.add(p);
- _this.createLoopLine();
- _this.createShape();
- _this.parent.updateIntersectArr();
- _this.manager.emit('polygonmarkManager.update');
- setTimeout(function () {
- _this.manager.onMouseMove();
- }, 100);
- };
- this.draw.subtract = function (elem) {
- var index = _this.points.indexOf(elem); // console.log(index)
- index > -1 && _this.points.splice(index, 1);
- _this.pointGroup.remove(elem);
- _this.createLoopLine();
- _this.createShape();
- _this.parent.updateIntersectArr();
- if (_this.points.length <= 2) _this.deleteAll();
- _this.manager.emit('polygonmarkManager.update');
- };
- this.edit.update = function (elem, pos) {
- elem.setPosition(pos);
- _this.createLoopLine();
- _this.createShape();
- _this.parent.updateIntersectArr();
- if (_this.active) _this.highLight();
- };
- }
- _createClass(PolyGonMark, [{
- key: "build",
- value: function build(points, shapeIndexes) {
- var _this2 = this;
- points.forEach(function (i) {
- var p = new Point(_this2.color);
- p.setPosition(i);
- _this2.points.push(p);
- _this2.pointGroup.add(p);
- });
- this.createLoopLine();
- this.createShape(shapeIndexes);
- this.lowLight();
- }
- }, {
- key: "createShape",
- value: function createShape(shapeIndexes) {
- if (shapeIndexes) {
- var vertices_xyz = [];
- this.points.forEach(function (p) {
- vertices_xyz.push(p.position.x);
- vertices_xyz.push(p.position.y);
- vertices_xyz.push(p.position.z);
- });
- this.shapeIndexes = shapeIndexes; //完成记录indexes
- var shape = new Shape(vertices_xyz, shapeIndexes, this.color
- /* activeColor */
- );
- this.shapeGroup.clear();
- this.shapeGroup.add(shape);
- this.shape = shape;
- return;
- }
- var vertices = [];
- if (this.points.length < 3) {
- return;
- } else if (this.points.length === 3) {
- this.points.forEach(function (p) {
- vertices.push(p.position.x);
- vertices.push(p.position.y);
- vertices.push(p.position.z);
- });
- this.shapeIndexes = [0, 1, 2]; //完成记录indexes
- var _shape = new Shape(vertices, null, this.color
- /* this.activeColor */
- );
- this.shapeGroup.clear();
- this.shapeGroup.add(_shape);
- this.shape = _shape;
- } else {
- var dir = new THREE.Vector3();
- var camera = this.manager.player.cameraControls.cameras['panorama'];
- camera.getWorldDirection(dir); // console.log(dir)
- var plane = new THREE.Plane(dir, 0);
- var targets = [];
- this.points.forEach(function (p) {
- var target = new THREE.Vector3();
- plane.projectPoint(p.position, target);
- target.applyMatrix4(camera.matrixWorldInverse);
- targets.push(target.x);
- targets.push(target.y);
- vertices.push(p.position.x);
- vertices.push(p.position.y);
- vertices.push(p.position.z);
- });
- var res = Earcut.triangulate(targets);
- this.shapeIndexes = res; //完成记录indexes
- var _shape2 = new Shape(vertices, res, this.color
- /* this.activeColor */
- );
- this.shapeGroup.clear();
- this.shapeGroup.add(_shape2);
- this.shape = _shape2;
- }
- }
- }, {
- key: "createLoopLine",
- value: function createLoopLine() {
- var p = [];
- this.points.forEach(function (i) {
- p.push(i.position);
- });
- var lineloop = new LineLoop(p, this.lineMat, this.activeLineMat);
- this.lines.length = [];
- this.lines.push(lineloop); //!!! 结构不能变
- this.group.remove(this.lineGroup);
- this.lineGroup.clear();
- this.lineGroup = lineloop;
- this.group.add(this.lineGroup);
- } //隐藏
- }, {
- key: "hide",
- value: function hide() {
- this.group.visible = false;
- } //显示
- }, {
- key: "show",
- value: function show() {
- this.group.visible = true;
- } //删除全部
- }, {
- key: "deleteAll",
- value: function deleteAll() {
- // this.dispose()
- this.parent.deleteMark(this);
- this.manager.updateActivePoint(null, null, false);
- this.manager.emit('polygonmarkManager.finish');
- this.parent.updateIntersectArr();
- }
- }, {
- key: "setColor",
- value: function setColor(color) {
- var _this$shape;
- // this.lines[0].setColor(color)
- this.points.forEach(function (i) {
- i.setColor(color);
- });
- (_this$shape = this.shape) === null || _this$shape === void 0 ? void 0 : _this$shape.setColor(color); //add
- this.color = color;
- }
- }, {
- key: "setLight",
- value: function setLight(bool) {
- var line = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var shape = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
- if (bool) {
- line && this.lines[0].highLight();
- shape && this.shape.highLight();
- } else {
- line && this.lines[0].lowLight();
- shape && this.shape.lowLight();
- }
- }
- }, {
- key: "highLight",
- value: function highLight() {
- this.points.forEach(function (i) {
- i.highLight && i.highLight();
- });
- this.lines.forEach(function (i) {
- i.highLight && i.highLight();
- });
- this.shape && this.shape.highLight && this.shape.highLight();
- }
- }, {
- key: "midLight",
- value: function midLight() {
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- if (this.active && !force) return;
- this.points.forEach(function (i) {
- i.midLight && i.midLight();
- });
- this.lines.forEach(function (i) {
- i.midLight && i.midLight();
- });
- this.shape && this.shape.midLight && this.shape.midLight();
- }
- }, {
- key: "lowLight",
- value: function lowLight() {
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- if (this.active && !force) return;
- this.points.forEach(function (i) {
- i.lowLight && i.lowLight();
- });
- this.lines.forEach(function (i) {
- i.lowLight && i.lowLight();
- });
- this.shape && this.shape.lowLight && this.shape.lowLight();
- }
- }, {
- key: "computePointsCenter",
- value: function computePointsCenter() {
- var _x = 0,
- _y = 0,
- _z = 0,
- n = this.points.length;
- this.points.forEach(function (p) {
- _x += p.position.x;
- _y += p.position.y;
- _z += p.position.z;
- });
- _x /= n;
- _y /= n;
- _z /= n;
- return new THREE.Vector3(_x, _y, _z);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.group.clear();
- this.pointGroup.clear();
- this.lineGroup.clear();
- this.shapeGroup.clear();
- this.points.length = 0;
- this.lines.length = 0;
- this.shape = null;
- this.shapeIndexes.length = 0;
- this.tempPoint = null;
- this.tempLine = null;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- var points = [];
- this.points.forEach(function (i) {
- var p = {
- x: i.position.x,
- y: i.position.y,
- z: i.position.z
- };
- points.push(p);
- });
- return {
- points: points,
- shapeIndexes: this.shapeIndexes
- };
- }
- }]);
- return PolyGonMark;
- }();
- 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); }; }
- 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; } }
- //var activeColor = '#00c8af'
- new THREE.Vector2();
- var PolygonMarkLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(PolygonMarkLabel, _THREE$EventDispatche);
- var _super = _createSuper$f(PolygonMarkLabel);
- function PolygonMarkLabel(player, manager, parentObj, o) {
- var _this;
- _classCallCheck(this, PolygonMarkLabel);
- _this = _super.call(this);
- _this.player = player;
- _this.manager = manager;
- _this.parentObj = parentObj; // this.position = o.pos
- _this.sid = o.sid;
- _this.name = o.name || '';
- _this.type = o.type || '';
- _this.panoId = o.panoId;
- _this.color = o.color;
- _this.labelPoint = o.labelPoint; // this.toPano = o.toPano
- _this.clickFun = o.clickFun; // this.noLine = o.noLine
- // this.driftDir = o.driftDir
- // this.floorIndex = o.floorIndex
- //create--------------------------------------
- _this.elem = document.createElement('div');
- _this.elem.className = 'polygonMark-label';
- _this.elem.style.display = 'block';
- _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>");
- _this.labelPointDomElement = _this.elem.querySelector('.point');
- _this.setColor(_this.color);
- _this.mousedownPos = [Infinity, Infinity]; //xzw add
- _this.elem.style.width = 'auto';
- _this.elem.style.height = 'auto';
- setTimeout(function () {
- var w = _this.elem.offsetWidth;
- var h = _this.elem.offsetHeight;
- _this.elem.style.width = w + 5 + 'px';
- _this.elem.style.height = h + 'px';
- }, 0);
- _this.elem.addEventListener('pointerdown', _this.onPointerDown.bind(_assertThisInitialized(_this)));
- _this.player.domElement.addEventListener('pointermove', _this.onPointerMove.bind(_assertThisInitialized(_this)));
- _this.elem.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)));
- _this.elem.addEventListener('mouseenter', _this.onMouseEnter.bind(_assertThisInitialized(_this)));
- _this.elem.addEventListener('mouseleave', _this.onMouseLeave.bind(_assertThisInitialized(_this)));
- _this.elem.addEventListener('mousedown', _this.onMouseDown.bind(_assertThisInitialized(_this)));
- _this.elem.addEventListener('mouseup', _this.onMouseUp.bind(_assertThisInitialized(_this))); // o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doll-labels').append(this.elem)
- _this.player.domElement.querySelector('.polygonmark-labels').append(_this.elem);
- _this.player.polygonmarkLabels.push(_assertThisInitialized(_this)); //create--------------------------------------
- _this.enable = true;
- _this.pos2d = new THREE.Vector2();
- _this.pointer = new THREE.Vector4();
- _this.dragging = false;
- _this.visible = true; //2023.6新增 用于控制多原因隐藏
- _this.isPolygonMarkLabel = true;
- return _this;
- }
- _createClass(PolygonMarkLabel, [{
- key: "setElementWidthAndHeight",
- value: function setElementWidthAndHeight() {
- var _this2 = this;
- this.elem.style.width = 'auto';
- this.elem.style.height = 'auto';
- setTimeout(function () {
- var w = _this2.elem.offsetWidth;
- var h = _this2.elem.offsetHeight;
- _this2.elem.style.width = w + 5 + 'px';
- _this2.elem.style.height = h + 'px';
- }, 0);
- }
- }, {
- key: "setNameType",
- value: function setNameType(name, type) {
- this.elem.getElementsByClassName('name')[0].innerHTML = this.name = name;
- this.elem.getElementsByClassName('type')[0].innerHTML = this.type = type;
- this.setElementWidthAndHeight();
- this.update();
- }
- }, {
- key: "setColor",
- value: function setColor(color, activeColor) {
- this.labelPointDomElement.style.backgroundColor = color;
- if (activeColor) {
- this.activeColor = activeColor;
- this.color = color;
- }
- }
- }, {
- key: "highLight",
- value: function highLight() {
- this.setColor(this.activeColor);
- }
- }, {
- key: "midLight",
- value: function midLight() {
- this.setColor(this.color);
- }
- }, {
- key: "update",
- value: function update() {
- //enable只和是否有cad图相关
- if (this.player.mode !== 'panorama' || !this.manager.labelVisible || !this.manager.labelEnabled || !this.enable || !this.visible || !this.name // ||
- // (this.player.model.currentFloor.floorIndex != this.floorIndex && !this.player.model.allFloorsVisible) ||
- // (config.isEdit && (
- // (objects.mainDesign && objects.mainDesign.editing) ||
- // (this.player.EditOverlay && this.player.EditOverlay.editing) ||
- // (this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible))
- // ))
- ) {
- this.elem.style.display = 'none';
- return;
- }
- var p = convertTool.getPos2d(this.labelPoint, this.player);
- if (!p.trueSide) {
- // this.elem.style.display = 'none'
- return;
- } //判断label是否被模型遮挡,遮挡则消失
- // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
- // this.elem.style.display = 'none'
- // return
- // }
- this.elem.style.display = ''; //先显示,driftDir才能计算位置
- var w = this.elem.offsetWidth;
- var h = this.elem.offsetHeight;
- var h1 = this.elem.querySelector('.name').offsetHeight;
- var h2 = this.elem.querySelector('.type').offsetHeight;
- if (h1 > 30 && w < 340 || h2 > 30 && w < 340 || w === 0 || h === 0) {
- this.setElementWidthAndHeight();
- }
- if (!this.dragging) {
- var height = this.elem.children[0].offsetHeight + 0.5;
- this.pos2d.x = p.pos.x + 2.5;
- this.pos2d.y = p.pos.y - height;
- this.elem.style.left = this.pos2d.x + 'px';
- this.elem.style.top = this.pos2d.y + 'px';
- }
- if (this.manager.isEdit) {
- this.elem.style.cursor = 'move';
- } else {
- this.elem.style.cursor = 'pointer';
- } // }
- }
- }, {
- key: "remove",
- value: function remove() {
- var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
- parentElem && parentElem.removeChild(this.elem);
- var a = this.player.polygonmarkLabels.indexOf(this);
- if (a > -1) this.player.polygonmarkLabels.splice(a, 1);
- this.labelPoint = null;
- this.parentObj = null;
- }
- }, {
- key: "show",
- value: function show() {
- this.elem.style.display = 'block';
- this.visible = true;
- }
- }, {
- key: "hide",
- value: function hide() {
- this.elem.style.display = 'none';
- this.visible = false;
- }
- }, {
- key: "onPointerDown",
- value: function onPointerDown(e) {
- e.stopPropagation();
- this.mousedownPos = [e.clientX, e.clientY];
- if (this.manager.isEdit) {
- this.dragging = true;
- this.pointer.x = e.clientX;
- this.pointer.y = e.clientY;
- this.pointer.z = this.pos2d.x;
- this.pointer.w = this.pos2d.y;
- }
- }
- }, {
- key: "onPointerMove",
- value: function onPointerMove(e) {
- if (this.manager.isEdit && this.dragging) {
- var offsetX = e.clientX - this.pointer.x;
- var offsetY = e.clientY - this.pointer.y;
- this.pos2d.x = this.pointer.z + offsetX;
- this.pos2d.y = this.pointer.w + offsetY;
- this.elem.style.left = this.pos2d.x + 'px';
- this.elem.style.top = this.pos2d.y + 'px';
- }
- }
- }, {
- key: "onPointerUp",
- value: function onPointerUp(e) {
- e.stopPropagation();
- var isClick = Math.abs(e.clientX - this.mousedownPos[0]) <= 1 && Math.abs(e.clientY - this.mousedownPos[1]) <= 1;
- if (this.manager.isEdit) {
- var labelPos2d = new THREE.Vector2();
- var height = this.elem.children[0].offsetHeight + 0.5;
- labelPos2d.x = this.pos2d.x - 2.5;
- labelPos2d.y = this.pos2d.y + height;
- labelPos2d.x = labelPos2d.x / this.player.domElement.clientWidth * 2 - 1;
- labelPos2d.y = -(labelPos2d.y / this.player.domElement.clientHeight) * 2 + 1;
- var intersect = this.player.getMouseIntersect(labelPos2d, [this.manager.intersectBox], {
- recursive: false
- });
- intersect && this.labelPoint.copy(intersect.point);
- this.dragging = false;
- } else if (isClick) {
- this.manager.emit('polygonmarkManager.clickLabel', this.sid); //取消选中的话需要再发送个leaveLabel,见下句
- this.manager.setFocusGroup(this.sid, e);
- }
- }
- }, {
- key: "onMouseDown",
- value: function onMouseDown(e) {
- e.stopPropagation();
- }
- }, {
- key: "onMouseUp",
- value: function onMouseUp(e) {
- e.stopPropagation();
- }
- }, {
- key: "onMouseEnter",
- value: function onMouseEnter() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (this.manager.isEdit) return;
- if (!this.parentObj.focus) this.parentObj.midLight();
- if (this.manager.focusGroup) return;
- this.manager.emit('polygonmarkManager.enterLabel', this.sid);
- e.data = {
- sid: this.sid,
- title: this.name,
- panoId: this.panoId
- };
- this.manager.app.Scene.emit("hotspot.enter", {
- type: 'draw',
- event: e
- });
- }
- }, {
- key: "onMouseLeave",
- value: function onMouseLeave() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (this.manager.isEdit) {
- return;
- }
- if (!this.parentObj.focus) this.parentObj.lowLight();
- if (this.manager.focusGroup) return; //选中的话
- this.manager.emit('polygonmarkManager.leaveLabel', this.sid);
- e.data = {
- sid: this.sid,
- title: this.name,
- panoId: this.panoId
- };
- this.manager.app.Scene.emit("hotspot.leave", {
- type: 'draw',
- event: e
- });
- }
- }]);
- return PolygonMarkLabel;
- }(THREE.EventDispatcher);
- var PolygonMarkGroup = /*#__PURE__*/function () {
- // option = {name, type, color}
- function PolygonMarkGroup(player, manager, option) {
- _classCallCheck(this, PolygonMarkGroup);
- this.player = player;
- this.manager = manager;
- this.sid = option.sid !== undefined ? option.sid : common$1.getRandomSid();
- this.name = option.name !== undefined ? option.name : '标题';
- this.type = option.type !== undefined ? option.type : '类型';
- this.color = option.color !== undefined ? option.color : 0xffffff;
- this.panoId = option.panoId;
- this.list = [];
- this.label = null;
- this.labelPoint = null;
- this.group = new THREE.Group();
- this.intersectArr = [];
- this.active = false;
- this.focus = false;
- this.lineMat = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: this.color
- /*, alwaysShow: true*/
- });
- this.activeLineMat = LineDraw.createFatLineMat({
- lineWidth: 2,
- color: this.color
- /*, alwaysShow: true*/
- });
- this.lineMat.resolution = this.activeLineMat.resolution = new THREE.Vector2(this.manager.app.core.get('SceneRenderer').renderWidth, this.manager.app.core.get('SceneRenderer').renderHeight);
- this.activeMark = null;
- this.setColor(this.color);
- }
- _createClass(PolygonMarkGroup, [{
- key: "build",
- value: function build(data, labelPos) {
- var _this = this;
- var reload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- if (reload) {
- this.list.length = [];
- this.group.clear();
- this.removeLabel();
- }
- data.forEach(function (i) {
- var pm = new PolyGonMark(_this.manager, _this, {
- color: _this.color,
- lineMat: _this.lineMat,
- activeLineMat: _this.activeLineMat
- });
- var p = [];
- i.points.forEach(function (j) {
- var pos = new THREE.Vector3(j.x, j.y, j.z);
- p.push(pos);
- });
- pm.build(p, i.shapeIndexes);
- _this.list.push(pm);
- _this.group.add(pm.group);
- });
- labelPos && this.createLabel(new THREE.Vector3(labelPos.x, labelPos.y, labelPos.z));
- this.updateIntersectArr();
- }
- }, {
- key: "addChild",
- value: function addChild() {
- var pm = new PolyGonMark(this.manager, this, {
- color: this.color,
- lineMat: this.lineMat,
- activeLineMat: this.activeLineMat
- });
- this.list.push(pm);
- this.group.add(pm.group);
- this.activeMark = pm;
- }
- }, {
- key: "updateIntersectArr",
- value: function updateIntersectArr() {
- var _this2 = this;
- this.intersectArr.length = 0;
- this.list.forEach(function (mark) {
- var markIntersectArr = mark.points.concat(mark.lines);
- _this2.intersectArr = _this2.intersectArr.concat(markIntersectArr);
- });
- }
- }, {
- key: "createLabel",
- value: function createLabel(pos) {
- if (!pos) return;
- this.labelPoint = new THREE.Vector3();
- this.labelPoint.copy(pos);
- this.label = new PolygonMarkLabel(this.player, this.manager, this, {
- sid: this.sid,
- // pos: pos,
- labelPoint: this.labelPoint,
- name: this.name,
- type: this.type,
- panoId: this.panoId,
- color: this.color,
- floorIndex: 0
- });
- this.label.update();
- this.updateIntersectArr();
- }
- }, {
- key: "removeLabel",
- value: function removeLabel() {
- if (this.label) {
- this.label.remove();
- this.label = null;
- }
- if (this.labelPoint) {
- this.labelPoint = null;
- }
- }
- }, {
- key: "setColor",
- value: function setColor(color) {
- var _this$list;
- this.color = color;
- var c = new THREE.Color().set(color).getHSL({
- h: 0,
- s: 0,
- l: 0
- });
- 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 )
- this.activeLineMat.color.set(this.activeColor);
- this.lineMat.color.set(color);
- this.label && this.label.setColor(color, '#' + this.activeColor.getHexString());
- (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.forEach(function (i) {
- i.setColor(color);
- });
- }
- }, {
- key: "setShapeStyle",
- value: function setShapeStyle(_ref) {
- var bgColor = _ref.bgColor,
- bgOpacity = _ref.bgOpacity,
- flashInterval = _ref.flashInterval;
- //2025新增属性 填充色闪烁
- this.list.forEach(function (polygon) {
- polygon.shape.setDisplay(bgColor, bgOpacity, flashInterval != void 0);
- });
- if (this.flashInterval != flashInterval) {
- var id = 'polygon_shine_' + this.sid;
- transitions$1.cancelById(id);
- if (flashInterval > 0) {
- var min = 0.3,
- max = 0.8;
- transitions$1.trigger({
- func: function (e) {
- //if (this.focus) return //选中了
- var progress = e < 0.5 ? 2 * e : 2 - 2 * e;
- var opacity = easing.easeOutQuad(progress, 0, 1, 1);
- opacity = math$2.linearClamp(opacity, [0, 1], [min, max]);
- this.list.forEach(function (polygon) {
- polygon.shape.material.opacity = opacity;
- });
- }.bind(this),
- cycling: !0,
- duration: flashInterval * 2,
- id
- });
- }
- this.flashInterval = flashInterval;
- }
- }
- }, {
- key: "setNameType",
- value: function setNameType(name, type) {
- this.name = name;
- this.type = type;
- this.label && this.label.setNameType(name, type);
- }
- }, {
- key: "hide",
- value: function hide() {
- this.group.visible = false;
- if (this.label) {
- this.label.visible = false;
- this.label.update();
- }
- }
- }, {
- key: "show",
- value: function show() {
- this.group.visible = true;
- if (this.label) {
- this.label.visible = true;
- this.label.update();
- }
- }
- }, {
- key: "deleteMark",
- value: function deleteMark(mark) {
- if (!mark) {
- mark = this.activeMark;
- }
- if (!mark) return;
- var index = this.list.indexOf(mark);
- index > -1 && this.list.splice(index, 1);
- this.group.remove(mark.group);
- mark.active = false;
- this.activeMark = null;
- mark.dispose();
- if (this.list.length <= 0) this.removeLabel();
- }
- }, {
- key: "setActive",
- value: function setActive(bool) {
- if (bool) {
- this.list.forEach(function (i) {
- i.setLight(bool);
- });
- this.label && this.label.highLight();
- } else {
- this.list.forEach(function (i) {
- i.setLight(bool);
- });
- this.label && this.label.midLight();
- }
- this.focus = bool;
- }
- }, {
- key: "highLight",
- value: function highLight() {
- this.list.forEach(function (i) {
- i.setLight(true);
- });
- this.label && this.label.highLight();
- }
- }, {
- key: "midLight",
- value: function midLight() {
- this.list.forEach(function (i) {
- i.setLight(true, true, false);
- });
- this.label && this.label.highLight();
- }
- }, {
- key: "lowLight",
- value: function lowLight() {
- this.list.forEach(function (i) {
- i.lowLight(true);
- });
- this.label && this.label.midLight();
- }
- }, {
- key: "reload",
- value: function reload(data) {
- if (!data) {
- this.manager.deleteMarkGroup(this.sid);
- return;
- }
- this.build(data.list, data.labelPoint, true);
- this.setNameType(data.name, data.type);
- this.setColor(data.color);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- this.list.forEach(function (i) {
- i.dispose();
- });
- this.sid = null;
- this.panoId = null;
- this.list.length = 0;
- this.removeLabel();
- this.group.clear();
- this.intersectArr.length = 0;
- this.lineMat.dispose();
- this.activeMark = null;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- var list = [];
- this.list.forEach(function (i) {
- list.push(i.toJSON());
- });
- var labelPos = null;
- if (this.labelPoint) {
- labelPos = {
- x: this.labelPoint.x,
- y: this.labelPoint.y,
- z: this.labelPoint.z
- };
- }
- return {
- sid: this.sid,
- name: this.name,
- type: this.type,
- labelPoint: labelPos,
- color: this.color,
- panoId: this.panoId,
- list: list
- };
- }
- }]);
- return PolygonMarkGroup;
- }();
- function _createSuper$e(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$e(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
- function _isNativeReflectConstruct$e() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
- var ScaleZoom = 1;
- var size = 4;
- var defaultColor = 0x00c8af;
- var FinishReticule = /*#__PURE__*/function (_THREE$Sprite) {
- _inherits(FinishReticule, _THREE$Sprite);
- var _super = _createSuper$e(FinishReticule);
- function FinishReticule() {
- var _this;
- _classCallCheck(this, FinishReticule);
- // const data = new Uint8Array([255, 255, 255, 255])
- // const map = new THREE.DataTexture(data, 1, 1)
- // map.needsUpdate = true
- var map = new THREE.Texture();
- var material = new THREE.SpriteMaterial({
- sizeAttenuation: false,
- color: defaultColor,
- map: map
- });
- material.onBeforeCompile = function (shader) {
- 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 ");
- };
- material.depthFunc = THREE.AlwaysDepth;
- _this = _super.call(this, material);
- _this.renderOrder = RenderOrder.monitorPlane;
- _this.setScale(null, false);
- return _this;
- }
- _createClass(FinishReticule, [{
- key: "setPosition",
- value: function setPosition(pos) {
- this.position.copy(pos);
- }
- }, {
- key: "setScale",
- value: function setScale(zoom) {
- var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var t;
- if (zoom) {
- t = 0.012 * (1 / zoom);
- if (fromZoom) ScaleZoom = zoom;
- } else {
- t = 0.012 * (1 / ScaleZoom);
- }
- this.scale.set(t * size, t * size, t);
- }
- }]);
- return FinishReticule;
- }(THREE.Sprite);
- 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); }; }
- 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; } }
- /*
- 默认状态 钢笔未选中状态(state => 0)
- 鼠标悬浮多边形 => 中亮 √
- 鼠标点击多边形 => 高亮 √
- 可删除选中多边形 √
- 可拖拽label √
- 可拖拽锚点 √
- 绘制状态 钢笔选中状态(state => 1)
- 点击空白处:
- 新建多边形 √
- 单击左键画点 √
- 点击右键减点 √
- 双击左键闭合 √
- 点击边加点 √
- 点击点减点 √
- */
- var PolygonMarkManager = /*#__PURE__*/function (_Emiter) {
- _inherits(PolygonMarkManager, _Emiter);
- var _super = _createSuper$d(PolygonMarkManager);
- function PolygonMarkManager(app) {
- var _this;
- _classCallCheck(this, PolygonMarkManager);
- _this = _super.call(this);
- _this.saveEdit = function () {
- var g = _this.activeGroup;
- var data = g.toJSON();
- if (!data.name) {
- return {
- code: 401
- };
- } else if (data.list.length <= 0) {
- return {
- code: 402
- };
- } else if (data.list[data.list.length - 1].shapeIndexes.length <= 0) {
- return {
- code: 403
- };
- } //succeed
- g.lowLight();
- _this.activeGroup = null;
- _this.leaveEdit();
- _this.setState(0);
- return {
- code: 400,
- data
- };
- };
- _this.cancelEdit = function () {
- _this.leaveEdit();
- _this.setState(0);
- _this.activeGroup.reload(_this.activeGroupHistoryData);
- };
- _this.Listener = {
- onKeydownFun: _this.onKeydown.bind(_assertThisInitialized(_this)),
- cancelEdit: _this.cancelEdit.bind(_assertThisInitialized(_this))
- };
- _this.bindEvents = function () {
- var domElement = _this.app.dom.querySelector('.player');
- domElement.addEventListener('pointerdown', _this.onMouseDown);
- domElement.addEventListener('pointerup', _this.onMouseUp);
- domElement.addEventListener('keydown', _this.Listener.onKeydownFun);
- window.addEventListener('hashchange', _this.Listener.cancelEdit);
- _this.on('polygonmarkManager.finish', _this.onFinishDraw.bind(_assertThisInitialized(_this)));
- _this.player.on('pointerMove', _this.onMouseMove);
- };
- _this.unBindEvents = function () {
- var domElement = _this.app.dom.querySelector('.player');
- domElement.removeEventListener('pointerdown', _this.onMouseDown);
- domElement.removeEventListener('pointerup', _this.onMouseUp);
- domElement.removeEventListener('keydown', _this.Listener.onKeydownFun);
- window.removeEventListener('hashchange', _this.Listener.cancelEdit);
- _this.player.off('pointerMove', _this.onMouseMove);
- };
- _this.updateTouchElement = function () {
- var touch = _this.player.getMouseIntersect(null, _this.activeGroup.intersectArr, {
- recursive: true,
- type: 'getAll'
- });
- if (touch) {
- touch = touch.filter(function (i) {
- return i.object.visible && (i.object.isPolygonMarkElement || i.object.isPolygonLabelElement) && i.object.parent;
- });
- if (touch.length <= 0) touch = null;
- }
- if (touch) {
- //get到
- var temp = touch.filter(function (i) {
- return i.object.isSprite === true;
- });
- touch = temp.length >= 1 ? temp[0] : touch[0];
- if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
- var touchMark = _this.touchElement.parent.parent.parentObj;
- touchMark.lowLight();
- _this.updateActivePoint(null, null, false);
- }
- _this.touchElement = touch.object;
- _this.touchElement.isPolygonMarkElement && _this.touchElement.parent.parent.parentObj.midLight();
- } else {
- if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
- var _touchMark = _this.touchElement.parent.parent.parentObj;
- _touchMark.lowLight();
- _this.updateActivePoint(null, null, false);
- }
- _this.touchElement = null;
- }
- return touch;
- };
- _this.setGroupLight = function (sid) {
- if (!sid) {
- _this.touchGroup && _this.touchGroup.label && _this.touchGroup.label.onMouseLeave();
- _this.touchGroup = null;
- } else {
- for (var i = 0; i < _this.list.length; i++) {
- if (sid === _this.list[i].sid) {
- _this.touchGroup = _this.list[i];
- _this.touchGroup.label.onMouseEnter();
- break;
- }
- }
- }
- };
- _this.onMouseDown = function () {
- _this.mousedown.copy(_this.player.mouse);
- switch (_this.state) {
- case 0:
- //默认
- if (_this.touchElement && _this.touchElement.isSprite) {
- _this.onDragStart(_this.touchElement);
- }
- break;
- }
- };
- _this.onMouseMove = function () {
- //hover操作---------------------------------------------------------------------
- var intersect = _this.player.getMouseIntersect(null, [_this.intersectBox], {
- recursive: false
- });
- intersect && _this.mouse.copy(intersect.point);
- if (_this.dragging) {
- //拖拽label中
- _this.onDragging(_this.mouse);
- return;
- }
- var touch = null;
- if (_this.activeGroup) {
- touch = _this.updateTouchElement();
- } // this.touchElement && console.log(this.touchElement)
- // handle----------------------------------------------------------------------
- switch (_this.state) {
- //默认---------------------------------------------------------------------
- case 0:
- if (_this.touchElement) {
- if (_this.touchElement.isSprite) {
- CursorDeal.add('polygonMark_move');
- } else if (_this.touchElement.isPolygonMarkLine) {
- CursorDeal.remove('polygonMark_move');
- CursorDeal.add('polygonMark_hover');
- }
- } else {
- CursorDeal.remove('polygonMark_move');
- CursorDeal.remove('polygonMark_hover');
- }
- break;
- //绘制---------------------------------------------------------------------
- case 1:
- if (_this.drawing) {
- _this.activeGroup.activeMark.draw.update(_this.mouse);
- } else {
- if (_this.touchElement) {
- var touchMark = _this.touchElement.parent.parent.parentObj;
- if (_this.touchElement.isPolygonMarkPoint) {
- //光标切换为减点
- CursorDeal.remove('polygonMark_addPen');
- CursorDeal.add('polygonMark_subPen');
- _this.updateActivePoint(_this.touchElement.position, touchMark, true);
- } else if (_this.touchElement.isPolygonMarkLine) {
- //光标切换为加点
- CursorDeal.remove('polygonMark_subPen');
- CursorDeal.add('polygonMark_addPen');
- _this.updateActivePoint(touch.point, touchMark, true);
- }
- } else {
- CursorDeal.remove('polygonMark_addPen');
- CursorDeal.remove('polygonMark_subPen');
- }
- }
- break;
- }
- };
- _this.onMouseUp = function (event) {
- _this.mouseup.copy(_this.player.mouse);
- switch (_this.state) {
- case 0:
- //默认
- if (_this.dragging) {
- _this.onDragEnd();
- } else {
- if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
- if (_this.touchElement && _this.touchElement.isPolygonMarkLine) {
- //选中多边形
- if (_this.activeGroup.activeMark !== null) {
- _this.activeGroup.activeMark.active = false;
- _this.activeGroup.activeMark.lowLight(true);
- }
- _this.activeGroup.activeMark = _this.touchElement.parent.parent.parentObj;
- _this.activeGroup.activeMark.active = true;
- _this.activeGroup.activeMark.highLight(); //emit 选中
- _this.emit('polygonmarkManager.activeMark');
- } else if (!_this.touchElement) {
- if (_this.activeGroup.activeMark !== null) {
- _this.activeGroup.activeMark.active = false;
- _this.activeGroup.activeMark.lowLight(true);
- }
- _this.activeGroup.activeMark = null;
- _this.emit('polygonmarkManager.unactiveMark');
- }
- }
- break;
- case 1:
- //绘制
- if (_this.drawing) {
- if (event.button === 2) {
- // 右键
- // console.log('右键')
- _this.activeGroup.activeMark.draw.add(_this.mouse);
- _this.activeGroup.activeMark.draw.finish(true);
- } else {
- //add 加点
- if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
- _this.activeGroup.activeMark.draw.add(_this.mouse);
- _this.recoverStack.length = 0;
- }
- } else {
- if (event.button === 2) return;
- if (!_this.touchElement) {
- if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
- _this.activeGroup.addChild();
- _this.activeGroup.activeMark.draw.add(_this.mouse);
- _this.drawing = true;
- } else if (_this.touchElement.isPolygonMarkPoint) {
- //减点
- // console.log('减点')
- var touchMark = _this.touchElement.parent.parent.parentObj;
- touchMark.draw.subtract(_this.touchElement);
- _this.updateActivePoint(null, null, false);
- touchMark && touchMark.lowLight();
- } else if (_this.touchElement.isPolygonMarkLine) {
- //加点
- // console.log('加点')
- var _touchMark2 = _this.touchElement.parent.parent.parentObj;
- _touchMark2.draw.increase(_this.activePoint.position, _this.touchElement.startPoint);
- }
- }
- break;
- }
- _this.onMouseMove();
- };
- _this.onDblClick = function () {
- if (_this.drawing) {
- console.log('onDblClick');
- _this.activeGroup.activeMark.draw.finish(true);
- }
- };
- _this.onDragStart = function (elem) {
- // console.log('dragstart')
- _this.player.cameraControls.activeControl.enabled = false;
- _this.dragging = true;
- _this.dragElement = elem;
- _this.emit('polygonmarkManager.update');
- };
- _this.onDragging = function (pos) {
- if (_this.dragging && _this.dragElement) {
- var touchMark = _this.dragElement.parent.parent.parentObj;
- touchMark.edit.update(_this.dragElement, pos);
- }
- };
- _this.onDragEnd = function () {
- // console.log('ondragend')
- _this.player.cameraControls.activeControl.pointerDragOn = false;
- _this.player.cameraControls.activeControl.enabled = true;
- _this.dragging = false;
- _this.dragElement = null;
- };
- _this.onZoom = function (e, fromZoom) {
- if (!_this.isEdit) return;
- _this.mainGroup.traverse(function (j) {
- j.isSprite && j.setScale(e.zoomLevel, fromZoom);
- });
- };
- _this.setActiveGroupNameType = function (name, type) {
- if (!_this.activeGroup) return;
- _this.activeGroup.setNameType(name, type);
- };
- _this.setActiveGroupColor = function (color) {
- if (!_this.activeGroup) return;
- _this.activeGroup.setColor(color);
- };
- _this.setLabelVisible = function (bool) {
- _this.labelVisible = bool;
- };
- _this.setLabelEnabled = function (bool) {
- _this.labelEnabled = bool;
- _this.list.forEach(function (i) {
- i.label && i.label.update();
- });
- };
- _this.app = app;
- _this.player = null;
- _this.deferred = Deferred$1();
- _this.list = [];
- _this.mainGroup = new THREE.Group();
- _this.reloadData = null;
- _this.labelVisible = true; //标签显隐
- _this.labelEnabled = true; //标签可视
- _this.intersectBox = null;
- _this.mouse = new THREE.Vector3();
- _this.mousedown = new THREE.Vector3();
- _this.mouseup = new THREE.Vector3();
- _this.state = 0; //0 => 默认 1 => 绘制
- _this.drawing = false; //是否绘制中
- _this.dragging = false; //点是否拖拽中
- _this.inited = false;
- _this.isEdit = false;
- _this.readyToEdit = false; //进入编辑前跳转点位中
- _this.touchElement = null;
- _this.dragElement = null;
- _this.activeGroup = null; //在编辑的
- _this.touchGroup = null;
- _this.activeGroupHistoryData = null;
- _this.focusGroup = null; //点击的
- _this.activePoint = new Point(0xffffff);
- _this.activePoint.midLight();
- _this.activePoint.visible = false;
- _this.mainGroup.add(_this.activePoint);
- _this.finishReticule = new FinishReticule();
- _this.finishReticule.visible = false;
- _this.mainGroup.add(_this.finishReticule);
- _this.activeMarkStartPoint = new THREE.Vector3();
- _this.recoverStack = []; // 初始化
- _this.init = function (metadata) {
- // const geometry = new THREE.CapsuleGeometry( 10, 10, 3, 20 );
- // const geometry = new THREE.SphereGeometry(5, 32, 16)
- var geometry = new THREE.CylinderGeometry(5, 5, 25, 3, 1); // const geometry = new THREE.BoxGeometry(10,10,10)
- var material = new THREE.MeshBasicMaterial({
- side: 1,
- wireframe: true
- });
- material.depthFunc = THREE.AlwaysDepth;
- _this.intersectBox = new THREE.Mesh(geometry, material);
- _this.intersectBox.renderOrder = 20;
- _this.intersectBox.name = 'polygonmark_intersect';
- _this.intersectBox.visible = false;
- _this.mainGroup.add(_this.intersectBox);
- _this.mainGroup.layers.set(17);
- var currentPano = _this.player.currentPano;
- _this.intersectBox.position.copy(currentPano.position);
- var LabelElem = document.createElement('div');
- LabelElem.className = 'polygonmark-labels';
- _this.player.domElement.append(LabelElem);
- if (metadata) {
- // this.reloadData = JSON.parse(JSON.stringify(metadata))
- metadata.data.forEach(function (i) {
- if (_this.player.model.panos.index[i.panoId]) {
- var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
- sid: i.sid,
- name: i.name,
- type: i.type,
- color: i.color,
- panoId: i.panoId
- });
- polygonMarkGroup.build(i.list, i.labelPoint);
- _this.list.push(polygonMarkGroup);
- _this.mainGroup.add(polygonMarkGroup.group);
- if (i.panoId !== currentPano.id) polygonMarkGroup.hide();
- }
- });
- _this.setLabelEnabled(metadata.labelEnabled);
- }
- _this.player.model.add(_this.mainGroup);
- _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this)));
- _this.player.on('flying.started', _this.onFlyStart.bind(_assertThisInitialized(_this)));
- _this.player.on('zoom', _this.onZoom.bind(_assertThisInitialized(_this)));
- _this.inited = true;
- if (_this.player.mode !== Viewmode$1.PANORAMA) {
- _this.hideAll();
- }
- _this.bindEventsNotEdit();
- _this.deferred.resolve();
- };
- _this.app.Scene.on('loadeddata', function () {
- setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var data, metadata, AIDraws, panoId;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _this.player = _this.app.core.get('Player'); //获取metadata
- // let metadata = this.app.store.getValue('metadata').sceneDraw
- data = _this.app.store.getValue('sceneDraw');
- data = data && data.filter(function (item) {
- return item.sourceType === 'draw';
- });
- metadata = {
- data: data || [],
- labelEnabled: _this.app.store.getValue('metadata').controls.showDrawTitle
- }; //增加AI的框
- _context.next = 6;
- return _this.app.Scene.aiBox.loadAll();
- case 6:
- AIDraws = _context.sent;
- for (panoId in AIDraws) {
- AIDraws[panoId].shapes.forEach(function (shape) {
- metadata.data.push(shape.drawData);
- });
- } // console.log(metadata)
- _this.init(metadata);
- console.log('polygonmanager init finish');
- case 10:
- case "end":
- return _context.stop();
- }
- }
- }, _callee);
- })), 50);
- });
- /* this.app.Scene.on('AIDrawGot', (datas) => {//xzw add
-
- for(let panoId in datas){
- datas[panoId].shapes.forEach(shape=>{
- let polygonMarkGroup = new PolygonMarkGroup(this.player, this, {
- sid: shape.drawData.sid,
- name: shape.drawData.name,
- type: shape.drawData.type,
- color: shape.drawData.color,
- panoId: shape.drawData.panoId
- })
- polygonMarkGroup.build(shape.drawData.list, shape.drawData.labelPoint)
- this.list.push(polygonMarkGroup)
- this.mainGroup.add(polygonMarkGroup.group)
- if (shape.drawData.panoId !== currentPano.id) polygonMarkGroup.hide()
- })
- }
-
- }) */
- // 进入模块
- _this.enterEdit = function () {
- _this.waitInit(function () {
- if (_this.isEdit) return; //进入全景模式
- if (_this.player.mode !== Viewmode$1.PANORAMA) _this.player.insideMode(); //绑定事件
- _this.bindEvents();
- _this.player.locked = true;
- _this.isEdit = true;
- _this.app.TagManager.switchAllDisplay(false, 'editPolygon', {
- sceneDraws: true
- });
- }, _this.enterEdit.bind(_assertThisInitialized(_this)));
- }; //离开模块
- _this.leaveEdit = function () {
- //解绑事件
- if (!_this.isEdit) return;
- _this.unBindEvents();
- _this.player.locked = false;
- _this.emit('polygonmarkManager.unactiveMark'); //恢复显示
- _this.showAll(true, true);
- _this.app.TagManager.switchAllDisplay(true, 'editPolygon', {
- sceneDraws: true
- });
- _this.isEdit = false;
- };
- _this.setState = function (state) {
- _this.state = state;
- switch (_this.state) {
- case 0:
- _this.drawing && _this.activeGroup.activeMark.deleteAll();
- CursorDeal.remove('polygonMark_pen');
- break;
- case 1:
- CursorDeal.add('polygonMark_pen');
- break;
- }
- }; //添加一个新的多边形组
- _this.addMarkGroup = function (name, type, color) {
- _this.waitInit(function () {
- var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
- name,
- type,
- color,
- panoId: _this.player.currentPano.id
- });
- _this.list.push(polygonMarkGroup);
- _this.mainGroup.add(polygonMarkGroup.group);
- _this.setActiveGroup(polygonMarkGroup.sid, true);
- _this.setState(1);
- }, _this.addMarkGroup.bind(_assertThisInitialized(_this), name, type, color));
- }; //删除多边形组
- _this.deleteMarkGroup = function (sid) {
- for (var i = 0; i < _this.list.length; i++) {
- if (_this.list[i].sid === sid) {
- var g = _this.list.splice(i, 1)[0];
- g.dispose();
- _this.mainGroup.remove(g);
- break;
- }
- }
- };
- _this.deleteMark = function () {
- _this.activeGroup && _this.activeGroup.deleteMark();
- _this.emit('polygonmarkManager.unactiveMark');
- };
- _this.setFocusGroup = function (sid) {
- var e = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var g;
- var cancel = function cancel() {
- _this.focusGroup.setActive(false);
- _this.emit('polygonmarkManager.leaveLabel', _this.focusGroup.sid);
- _this.focusGroup = null;
- };
- if (sid == void 0) {
- return cancel();
- }
- for (var i = 0; i < _this.list.length; i++) {
- if (_this.list[i].sid === sid) {
- g = _this.list[i];
- if (_this.focusGroup && _this.focusGroup === g) {
- _this.setFocusGroup(null);
- } else {
- g.setActive(true);
- _this.focusGroup = g;
- _this.emit('polygonmarkManager.clickLabel', g.sid);
- }
- if (!e) {
- e = {};
- }
- e.data = {
- sid: g.sid,
- title: g.name,
- panoId: g.panoId
- };
- _this.app.Scene.emit("hotspot.click", {
- type: 'draw',
- event: e
- });
- } else {
- _this.list[i].setActive(false);
- }
- }
- if (_this.focusGroup) {
- _this.focusGroup.labelPoint && _this.flyAndLookAt(_this.focusGroup.panoId, _this.focusGroup.labelPoint, true);
- } else {
- console.error('group not found, sid = ' + sid);
- }
- };
- _this.flyAndLookAt = function (panoId, pos, checkAlone) {
- _this.player.flyToPano({
- pano: _this.app.Scene.panos.index[panoId],
- lookAtPoint: pos,
- checkAlone: checkAlone,
- zoomLevel: _this.player.zoomLevel
- });
- };
- _this.setActiveGroup = function (sid) {
- var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- _this.list.forEach(function (i) {
- if (i.sid === sid) {
- _this.activeGroup = i;
- console.log('getActiveGroup', sid);
- i.setActive(false);
- if (isNew) {
- _this.activeGroupHistoryData = null; //不保存退出时直接删除该组
- _this.enterEdit();
- } else {
- _this.activeGroupHistoryData = i.toJSON(); //用于不保存退出时数据恢复
- var currentPanoId = _this.player.currentPano.id;
- _this.flyAndLookAt(i.panoId, i.labelPoint, true);
- if (currentPanoId !== i.panoId) {
- _this.readyToEdit = true;
- _this.player.once('flying.ended', function () {
- i.show();
- _this.enterEdit();
- _this.readyToEdit = false;
- });
- } else {
- i.show();
- _this.enterEdit();
- }
- }
- } else {
- i.hide();
- }
- });
- }; //清空
- _this.clear = function () {
- _this.list.forEach(function (i) {
- i.dispose();
- });
- _this.list.length = 0;
- _this.activeGroup = null;
- _this.mainGroup.clear();
- };
- /* //隐藏
- this.hideAll = recursive => {
- this.mainGroup.visible = false
- this.setLabelVisible(false)
- if (recursive) {
- this.list.forEach(i => {
- i.hide()
- })
- }
- this.updateLabels()
- }
- //显示
- this.showAll = (recursive, onlyCurrent) => {
- if (this.player && this.player.mode !== Viewmode.PANORAMA) return //目前除全景模式外均不显示
- this.mainGroup.visible = true
- this.setLabelVisible(true)
- if (recursive) {
- this.list.forEach(i => {
- if (onlyCurrent) {
- let currentPanoId = this.player.currentPano.id
- if (i.panoId === currentPanoId) {
- i.show()
- } else {
- i.hide()
- }
- } else {
- i.show()
- }
- })
- }
- this.updateLabels()
- }
- */
- _this.hideAll = function (recursive, reason, level) {
- common$1.updateVisible(_this.mainGroup, reason || 'hideAll', false, level);
- if (!_this.mainGroup.visible) {
- _this.setLabelVisible(false);
- if (recursive) {
- _this.list.forEach(function (i) {
- i.hide();
- });
- }
- _this.updateLabels();
- }
- }; //显示
- _this.showAll = function (recursive, onlyCurrent, reason) {
- //xzw add reason and level
- common$1.updateVisible(_this.mainGroup, reason || 'hideAll', true);
- if (_this.player && _this.player.mode !== Viewmode$1.PANORAMA) return; //目前除全景模式外均不显示
- if (_this.mainGroup.visible) {
- _this.setLabelVisible(true);
- if (recursive) {
- _this.list.forEach(function (i) {
- if (onlyCurrent) {
- var currentPanoId = _this.player.currentPano.id;
- if (i.panoId === currentPanoId) {
- i.show();
- } else {
- i.hide();
- }
- } else {
- i.show();
- }
- });
- }
- _this.updateLabels();
- }
- };
- return _this;
- } //保存编辑
- _createClass(PolygonMarkManager, [{
- key: "bindEventsNotEdit",
- value: function bindEventsNotEdit() {
- var _this2 = this;
- //非编辑状态 xzw add 多边形内可点击
- var lastHover;
- var onMove = function onMove() {
- var intersect;
- if (!_this2.isEdit) {
- var allMeshes = [];
- _this2.list.forEach(function (group) {
- group.list.forEach(function (polygon) {
- if (!polygon.group.realVisible()) return;
- allMeshes.push(polygon.shape);
- });
- });
- intersect = _this2.player.getMouseIntersect(null, allMeshes);
- }
- var mark;
- if (intersect) {
- mark = _this2.list.find(function (group) {
- return group.list.some(function (e) {
- return e.shape == intersect.object;
- });
- });
- mark != lastHover && mark.label.onMouseEnter(); //highlight & emit
- } else {
- lastHover && lastHover.label.onMouseLeave();
- }
- lastHover = mark;
- CursorDeal[intersect ? 'add' : 'remove']('polygonMark_hover');
- };
- this.player.on('pointerMove', onMove);
- this.player.on('click', function (_ref2) {
- var consume = _ref2.consume,
- getConsumed = _ref2.getConsumed;
- if (_this2.isEdit || getConsumed()) return;
- onMove(); //for mobile
- if (lastHover) {
- var sid = lastHover.sid;
- _this2.setFocusGroup(sid);
- consume();
- } else if (_this2.focusGroup) {
- _this2.setFocusGroup(null);
- consume();
- }
- });
- }
- }, {
- key: "onFlyStart",
- value: function onFlyStart() {
- this.hideAll();
- }
- }, {
- key: "onFlyEnd",
- value: function onFlyEnd() {
- if (this.player.mode !== Viewmode$1.PANORAMA) {
- this.onZoom({
- zoomLevel: 1
- }, false);
- } else {
- var currentPano = this.player.currentPano;
- this.intersectBox.position.copy(currentPano.position);
- this.onZoom({
- zoomLevel: null
- }, false);
- if (this.isEdit || this.readyToEdit) {
- this.showAll();
- } else {
- this.showAll(true, true);
- }
- }
- }
- }, {
- key: "onExit",
- value: function onExit() {
- this.cancelEdit();
- }
- }, {
- key: "onKeydown",
- value: function onKeydown(e) {
- if (!this.drawing) return;
- if (e.ctrlKey && !e.shiftKey && e.code == 'KeyZ') {
- // console.log('ctrl+z')
- // this.activeGroup.activeMark.draw.delete()
- var p = this.activeGroup.activeMark.draw.delete();
- this.drawing && this.recoverStack.push(p); // console.log(this.recoverStack)
- } else if (e.ctrlKey && e.code == 'KeyY' || e.ctrlKey && e.shiftKey && e.code == 'KeyZ') {
- // console.log('ctrl+y')
- if (this.recoverStack.length <= 0) return;
- var pos = this.recoverStack.pop();
- this.activeGroup.activeMark.draw.recover(pos);
- } else if (e.code == 'Escape') {
- // console.log('Esc')
- this.activeGroup.activeMark.deleteAll();
- this.setState(0);
- this.emit('polygonmarkManager.setState', 0);
- }
- }
- }, {
- key: "updateActivePoint",
- value: function updateActivePoint(pos, mark, isVisible) {
- pos && this.activePoint.setPosition(pos);
- mark && this.activePoint.setColor(mark.color);
- this.activePoint.visible = isVisible;
- }
- }, {
- key: "updateLabels",
- value: function updateLabels() {
- if (this.player && this.player.polygonmarkLabels) {
- this.player.polygonmarkLabels.forEach(function (i) {
- i.update();
- });
- }
- }
- }, {
- key: "showFinishManager",
- value: function showFinishManager(pos) {
- this.activeMarkStartPoint.copy(pos);
- this.finishReticule.setPosition(pos);
- this.finishReticule.visible = true;
- }
- }, {
- key: "onFinishDraw",
- value: function onFinishDraw() {
- this.drawing = false;
- this.recoverStack.length = 0;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- return this.activeGroup.toJSON();
- } //等待初始化
- }, {
- key: "waitInit",
- value: function waitInit(func, waitFunc) {
- if (this.inited) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- /* //新增属性: 填充色、闪烁
- setAttributes(sid, { bgColor, bgOpacity, flashInterval }) {
- let group = this.list.find(e => e.sid == sid)
- if (group) {
- group.setShapeStyle({ bgColor, bgOpacity, flashInterval })
- }
- }
- flyToDraw(sid) {
- this.focusGroup = null
- this.setFocusGroup(sid)
- } */
- }]);
- return PolygonMarkManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var PanoVideoSkySphere = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(PanoVideoSkySphere, _THREE$Mesh);
- var _super = _createSuper$c(PanoVideoSkySphere);
- function PanoVideoSkySphere(url) {
- var _this;
- _classCallCheck(this, PanoVideoSkySphere);
- var geometry = new THREE.SphereGeometry(5, 60, 40);
- geometry.scale(-1, 1, 1);
- _this = _super.call(this, geometry);
- _this.videoElement = _this.creatVides(url);
- var material = _this.getMaterial(_this.videoElement);
- _this.material = material;
- _this.renderOrder = RenderOrder.entryArrow;
- return _this;
- }
- _createClass(PanoVideoSkySphere, [{
- key: "getMaterial",
- value: function getMaterial(video) {
- var texture = new THREE.VideoTexture(video);
- texture.minFilter = THREE.LinearFilter; // texture.uploaded = false
- var material = new THREE.MeshBasicMaterial({
- map: texture,
- // depthWrite: false
- opacity: 0,
- transparent: true
- });
- material.depthFunc = THREE.AlwaysDepth;
- return material;
- }
- }, {
- key: "creatVides",
- value: function creatVides(url) {
- var _VersionControl$getEn = VersionControl.getEnvironment(),
- os = _VersionControl$getEn.os,
- environment = _VersionControl$getEn.environment;
- var videoPlayer = null;
- var video = null;
- if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
- // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
- videoPlayer = new FlvVideoPlayer$2();
- video = videoPlayer._createVideo(url).videoElement; //console.log('use FlvVideoPlayer')
- } else {
- //console.log('use H5VideoPlayer')
- videoPlayer = new H5VideoPlayer$2();
- video = videoPlayer._createVideoElement(url);
- } // console.log(videoPlayer)
- // video.play()
- return video;
- }
- }]);
- return PanoVideoSkySphere;
- }(THREE.Mesh);
- 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); }; }
- 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; } }
- var PanoVideoManager = /*#__PURE__*/function (_Emiter) {
- _inherits(PanoVideoManager, _Emiter);
- var _super = _createSuper$b(PanoVideoManager);
- function PanoVideoManager(app) {
- var _this;
- _classCallCheck(this, PanoVideoManager);
- _this = _super.call(this);
- _this.bindEvents = function () {
- // this.player.on('pointerStart', this.onMouseDown)
- // this.player.on('pointerMove', this.onMouseMove)
- // this.player.on('pointerUp', this.onMouseUp)
- _this.player.on(PlayerEvents.PanoChosen, _this.getPano);
- _this.player.on('updataProgress', _this.updateOpacity);
- _this.player.on(PlayerEvents.ModeChanging, _this.switchMode);
- if (_this.player.model._3dTilesRuntime) ;
- };
- _this.getPano = function (currentPano, nextPano) {
- // console.log('PlayerEvents.PanoChosen --------------------------------') //点位跳转
- _this.currentPano = currentPano;
- _this.nextPano = nextPano; // console.log(this.currentPano, this.nextPano)
- };
- _this.updateOpacity = function (val) {
- // console.log(val)
- if (_this.currentPano && _this.currentPano._360videos) {
- _this.currentPano._360videos.material.opacity = 1.0 - val;
- }
- if (_this.nextPano && _this.nextPano._360videos) {
- _this.nextPano._360videos.material.opacity = val;
- }
- if (val === 1) {
- //into next done
- if (_this.nextPano && _this.nextPano._360videos) {
- _this.videoReInit(_this.nextPano._360videos.videoElement, true);
- }
- if (_this.currentPano && _this.currentPano._360videos) {
- _this.videoReInit(_this.currentPano._360videos.videoElement, false);
- }
- }
- if (val === 0) {
- //into next begin
- if (_this.nextPano && _this.nextPano._360videos) {
- _this.videoReInit(_this.nextPano._360videos.videoElement, false);
- }
- if (_this.currentPano && _this.currentPano._360videos) {
- _this.videoReInit(_this.currentPano._360videos.videoElement, true);
- }
- }
- };
- _this.switchMode = function (currentMode, mode, pano, transitionTime) {
- // console.log('PlayerEvents.ModeChanging --------------------------------')
- // console.log(currentMode, mode, pano, transitionTime)
- if (mode === Viewmode$1.PANORAMA) {
- _this.panoVideoGroup.visible = true;
- _this.player.once('flying.ended', function () {
- if (pano && pano._360videos) {
- pano._360videos.material.opacity = 1;
- _this.videoReInit(pano._360videos.videoElement, true);
- }
- });
- } else {
- _this.panoVideoGroup.visible = false;
- _this.panoVideoGroup.children.forEach(function (child) {
- child.material.opacity = 0;
- _this.videoReInit(child.videoElement, false);
- });
- }
- };
- _this.videoReInit = function (videoElement, isplay) {
- //videoElement.currentTime = 0
- videoElement.muted = false;
- if (isplay) {
- // videoElement.muted = false
- // console.log(videoElement.muted)
- videoElement.play();
- } else {
- // videoElement.muted = true
- // console.log(videoElement.muted)
- videoElement.pause();
- }
- };
- _this.app = app;
- _this.player = null;
- _this.deferred = Deferred$1();
- _this.panoVideoGroup = new THREE.Group();
- _this.panoVideos = [];
- _this.opacity = 0;
- _this.currentPano = null;
- _this.nextPano = null;
- _this.mouse = new THREE.Vector3();
- _this.mousedown = new THREE.Vector3();
- _this.mouseup = new THREE.Vector3(); // 初始化
- _this.init = function (metadata) {
- var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- if (metadata) {
- console.log('PanoVideoManager init');
- console.log(_this.app.Scene.panos);
- _this.bindEvents();
- _this.currentPano = _this.player.currentPano;
- metadata.forEach(function (i) {
- var pano = _this.app.Scene.panos.index[i.id];
- if (!pano) {
- console.error('pano360VideoManager: pano' + i.id + ' not find');
- return;
- }
- var panoSphere = new PanoVideoSkySphere(i.url);
- panoSphere.position.copy(pano.position); // panoSphere.position.y += 1
- _this.panoVideoGroup.add(panoSphere);
- pano._360videos = panoSphere; // console.log(pano)
- });
- _this.player.model.add(_this.panoVideoGroup);
- _this.updateOpacity(0);
- }
- if (!reload) {
- _this.deferred.resolve();
- }
- };
- _this.load = function (metadata, baseURL) {
- _this.app.Scene.whenLoaded(function () {
- var _VersionControl$getEn = VersionControl.getEnvironment(),
- os = _VersionControl$getEn.os,
- environment = _VersionControl$getEn.environment;
- var str = null;
- _this.player = _this.app.core.get('Player');
- if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
- // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
- str = '.flv'; //console.log('use FlvVideoPlayer')
- } else {
- //console.log('use H5VideoPlayer')
- str = '.mp4';
- } // let path = window.__sdk_video || 'https://4dkk.4dage.com/v4/example/360'
- // let url = texture.getImageURL(path + str)
- // let metadata = [
- // // { id: 0, url: url },
- // { id: 4, url: url },
- // ]
- if (metadata) {
- metadata.forEach(function (item) {
- item.url = baseURL + item.file + str;
- delete item.file;
- });
- _this.init(metadata, true);
- console.log('init finish');
- }
- });
- }; //// 进入模块
- // this.enterModule = () => {
- // this.waitInit(() => {
- // if (this.player.mode !== Viewmode.DOLLHOUSE) {
- // //进入迷你模式
- // this.player.flyToNewMode({ mode: Viewmode.DOLLHOUSE })
- // //隐藏
- // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
- // this.player.once('flying.ended', () => {
- // this.player.OverlayManager.hide('all')
- // this.app.Scene.Decoration.hideAll()
- // this.app.Camera.monitor.control.hideAll(undefined, 'force', 10, undefined)
- // this.player.labelManager.hide()
- // this.player.linkEditor.hideFootIcons()
- // this.player.linkEditor.delVisibleLines()
- // // this.player.model.floors.show()
- // })
- // } else {
- // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
- // this.player.OverlayManager.hide('all')
- // this.app.Scene.Decoration.hideAll()
- // this.app.Camera.monitor.control.hideAll()
- // this.player.labelManager.hide()
- // this.player.linkEditor.hideFootIcons()
- // this.player.linkEditor.delVisibleLines()
- // // this.player.model.floors.show()
- // }
- // //绑定事件
- // this.bindEvents()
- // this.player.locked = true
- // }, this.enterModule.bind(this))
- // }
- // //离开模块
- // this.leaveModule = () => {
- // //解绑事件
- // this.unBindEvents()
- // this.player.locked = false
- // //恢复显示
- // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', true, 10))
- // this.player.OverlayManager.show('all')
- // this.app.Scene.Decoration.showAll()
- // this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined)
- // this.player.labelManager.show()
- // }
- // //添加
- // this.add = () => {
- // this.waitInit(() => {
- // console.log('add')
- // }, this.add.bind(this))
- // }
- // //删除
- // this.delete = () => {
- // }
- // //清空
- // this.clear = () => {
- // }
- // //保存编辑
- // this.saveEdit = () => {
- // }
- // //退出编辑
- // this.cancelEdit = () => {
- // }
- return _this;
- } //事件绑定
- _createClass(PanoVideoManager, [{
- key: "waitInit",
- value: //等待初始化
- function waitInit(func, waitFunc) {
- if (this.player) {
- func && func();
- } else {
- this.deferred.then(function () {
- return waitFunc();
- });
- }
- }
- }]);
- return PanoVideoManager;
- }(tinyEmitter);
- /**
- * 上传人体抠图
- * @param {object} data 传入的对象参数
- * @param {file} data.file 原始图片
- * @returns {Promise}
- **/
- var uploadBodySegment = function uploadBodySegment(data) {
- return http.postFile('/service/scene/uploadBodySegment', data);
- };
- /**
- * 动态面板/查询是否有动态面板数据
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var checkDynamicPanel = function checkDynamicPanel(data) {
- return http.get('/service/scene/checkDynamicPanel', data);
- };
- /**
- * 场景同步数据包下载
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var downLoadZSData = function downLoadZSData(data) {
- return http.postFile('/service/scene/downLoadZSData', data);
- };
- /**
- * 查询人体抠图结果
- * @param {object} data 传入的对象参数
- * @param {text} data.serialNum 操作序列号
- * @returns {Promise}
- **/
- var getBodySegmentStatus = function getBodySegmentStatus(data) {
- return http.postFile('/service/scene/getBodySegmentStatus', data);
- };
- /**
- * 校验场景密码
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.password 场景密码
- * @returns {Promise}
- **/
- var check_key = function check_key(data) {
- return http.post('/service/scene/check/key', data);
- };
- /**
- * 获取场景详情-查看页面
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
- * @returns {Promise}
- **/
- var getInfo$1 = function getInfo(data) {
- return http.get('/service/scene/getInfo', data);
- };
- var viewApis = /*#__PURE__*/Object.freeze({
- __proto__: null,
- uploadBodySegment: uploadBodySegment,
- checkDynamicPanel: checkDynamicPanel,
- downLoadZSData: downLoadZSData,
- getBodySegmentStatus: getBodySegmentStatus,
- check_key: check_key,
- getInfo: getInfo$1
- });
- /**
- * 根据sid修改标注
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {object} data.shape
- * @returns {Promise}
- **/
- var sceneMarkShape_updateBySid = function sceneMarkShape_updateBySid(data) {
- return http.post('/shapes/sceneMarkShape/updateBySid', data);
- };
- /**
- * 批量删除标注
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sids [sid,sid]
- * @returns {Promise}
- **/
- var sceneMarkShape_delete = function sceneMarkShape_delete(data) {
- return http.post('/service/shapes/sceneMarkShape/delete', data);
- }; // /**
- // * 获取标注列表
- // * @param {object} data 传入的对象参数
- // * @param {string} data.num 场景码
- // * @returns {Promise}
- // **/
- // export const sceneMarkShape_getInfo = data => {
- // return http.post('/service/shapes/sceneMarkShape/getInfo', data)
- // }
- /**
- * AI识别
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var ai_box4_getInfos = function ai_box4_getInfos(data) {
- return http.post('/service/scene/edit/ai/box4/getInfos', data);
- };
- /**
- * TOUR/上传导览视频
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {file} data.file 导览视频MP4
- * @returns {Promise}
- **/
- var tour_video_upload = function tour_video_upload(data) {
- return http.postFile('/service/scene/edit/tour/video/upload', data);
- };
- /**
- * TOUR/下载导览视频
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var tour_video_download = function tour_video_download(data) {
- return http.postFile('/service/scene/edit/tour/video/download', data);
- };
- /**
- * TOUR/保存导览
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 导览数据
- * @returns {Promise}
- **/
- var tour_save = function tour_save(data) {
- return http.post('/service/scene/edit/tour/save', data);
- };
- /**
- * TOUR/删除导览
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var tour_delete = function tour_delete(data) {
- return http.post('/service/scene/edit/tour/delete', data);
- };
- /**
- * 上传下载/获取点位经纬度
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var point_getLatAndLon = function point_getLatAndLon(data) {
- return http.get('/service/scene/edit/point/getLatAndLon', data);
- };
- /**
- * 公共/上传国际化文件
- * @param {object} data 传入的对象参数
- * @param {string} data.file 文件名称
- * @param {object} data.data json格式对象
- * @returns {Promise}
- **/
- var locales = function locales(data) {
- return http.post('/service/scene/edit/locales', data);
- };
- /**
- * 公共/自定义文件上传
- * @param {object} data 传入的对象参数
- * @param {string} data.content 文件内容
- * @param {string} data.ossPath oss文件地址
- * @returns {Promise}
- **/
- var upload_content = function upload_content(data) {
- return http.post('/service/scene/edit/upload/content', data);
- };
- /**
- * 公共/获取场景编辑权限
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var getAuth = function getAuth(data) {
- return http.postFile('/service/scene/edit/getAuth', data);
- };
- /**
- * 公共/获取异步操作记录
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.operType 操作(upload-上传,download-下载)
- * @param {string} data.module 模块(upload_download-上传下载)
- * @param {string} data.function 功能(panorama-全景图,model-模型)
- * @returns {Promise}
- **/
- var getAsynOperLog = function getAsynOperLog(data) {
- return http.post('/service/scene/edit/getAsynOperLog', data);
- };
- /**
- * 公共/获取编辑器版本信息
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var getServiceUpTip = function getServiceUpTip(data) {
- return http.get('/service/scene/edit/getServiceUpTip', data);
- };
- /**
- * 初始画面/保存初始画面
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名
- * @param {string} data.data 初始点信息
- * @returns {Promise}
- **/
- var saveInitialPage = function saveInitialPage(data) {
- return http.post('/service/scene/edit/saveInitialPage', data);
- };
- /**
- * 动态面板/修改
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {object} data.data
- * @param {string} data.data.text undefined
- * @param {string} data.data.sid undefined
- * @returns {Promise}
- **/
- var dynamicPanel_update = function dynamicPanel_update(data) {
- return http.post('/service/scene/edit/dynamicPanel/update', data);
- };
- /**
- * 动态面板/列表
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var dynamicPanel_list = function dynamicPanel_list(data) {
- return http.get('/service/scene/edit/dynamicPanel/list', data);
- };
- /**
- * 场景信息/上传logo
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.floorLogo 地面logo名称
- * @param {number} data.floorLogoSize 地面logo大小
- * @param {string} data.music 背景音乐名称
- * @param {string} data.scenePassword 加密浏览密码
- * @param {string} data.title 场景标题
- * @param {string} data.description 场景描述
- * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
- * @param {object} data.controls
- * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
- * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
- * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
- * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
- * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
- * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
- * @returns {Promise}
- **/
- var uploadShareLogo = function uploadShareLogo(data) {
- return http.postFile('/service/scene/edit/uploadShareLogo', data);
- };
- /**
- * 场景修复/保存水印
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名
- * @returns {Promise}
- **/
- var waterMark_add = function waterMark_add(data) {
- return http.post('/service/scene/edit/waterMark/add', data);
- };
- /**
- * 场景修复/删除水印
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名
- * @returns {Promise}
- **/
- var waterMark_delete = function waterMark_delete(data) {
- return http.post('/service/scene/edit/waterMark/delete', data);
- };
- /**
- * 场景关联/上传场景关联全景图
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.styles 图标json数组
- * @param {array} data.linkPans 场景关联json数组
- * @returns {Promise}
- **/
- var linkPan_upload = function linkPan_upload(data) {
- return http.postFile('/service/scene/edit/linkPan/upload', data);
- };
- /**
- * 场景关联/保存场景关联
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.styles 图标json数组
- * @param {array} data.linkPans 场景关联json数组
- * @returns {Promise}
- **/
- var linkPan_save = function linkPan_save(data) {
- return http.post('/service/scene/edit/linkPan/save', data);
- };
- /**
- * 场景关联/删除关联场景
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sidList sid数组
- * @returns {Promise}
- **/
- var linkPan_delete = function linkPan_delete(data) {
- return http.post('/service/scene/edit/linkPan/delete', data);
- };
- /**
- * 场景关联/删除场景关联图标
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sidList id数组
- * @returns {Promise}
- **/
- var styles_delete = function styles_delete(data) {
- return http.post('/service/scene/edit/styles/delete', data);
- };
- /**
- * 场景关联/获取场景关联列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.styles 图标json数组
- * @param {array} data.linkPans 场景关联json数组
- * @returns {Promise}
- **/
- var linkPan_list = function linkPan_list(data) {
- return http.postFile('/service/scene/edit/linkPan/list', data);
- };
- /**
- * 基础设置/保存场景信息
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.floorLogo 地面logo名称
- * @param {number} data.floorLogoSize 地面logo大小
- * @param {string} data.music 背景音乐名称
- * @param {string} data.scenePassword 加密浏览密码
- * @param {string} data.title 场景标题
- * @param {string} data.description 场景描述
- * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
- * @param {object} data.controls
- * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
- * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
- * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
- * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
- * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
- * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
- * @param {object} data.sns 分享配置信息(json格式)
- * @returns {Promise}
- **/
- var base_save = function base_save(data) {
- return http.post('/service/scene/edit/base/save', data);
- };
- /**
- * 平面图/上传dxf
- * @param {object} data 传入的对象参数
- * @param {file} data.file
- * @param {text} data.num
- * @param {text} data.subgroup
- * @returns {Promise}
- **/
- var cad_dxf_upload = function cad_dxf_upload(data) {
- return http.postFile('/service/scene/edit/cad/dxf/upload', data);
- };
- /**
- * 平面图/下载dxf
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var cad_dxf_download = function cad_dxf_download(data) {
- return http.get('/service/scene/edit/cad/dxf/download', data);
- };
- /**
- * 平面图/户型图重命名
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.floors 楼层数组
- * @returns {Promise}
- **/
- var cad_rename = function cad_rename(data) {
- return http.post('/service/scene/edit/cad/rename', data);
- };
- /**
- * 模型裁剪/保存
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.data 指示牌数据
- * @returns {Promise}
- **/
- var cutModel_save = function cutModel_save(data) {
- return http.post('/service/scene/edit/cutModel/save', data);
- };
- /**
- * 模型裁剪/列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var cutModel_list = function cutModel_list(data) {
- return http.post('/service/scene/edit/cutModel/list', data);
- };
- /**
- * 模型裁剪/删除
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sidList sid集合
- * @returns {Promise}
- **/
- var cutModel_delete = function cutModel_delete(data) {
- return http.post('/service/scene/edit/cutModel/delete', data);
- };
- /**
- * 添加热点/删除icons
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.fileNameList 文件名集合
- * @returns {Promise}
- **/
- var icons_delete = function icons_delete(data) {
- return http.post('/service/scene/edit/icons/delete', data);
- };
- /**
- * 添加热点/单独删除热点图片v4.14.0
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景吗
- * @param {array} data.sidList sid素族
- * @returns {Promise}
- **/
- var tag_img_delete = function tag_img_delete(data) {
- return http.post('/service/scene/edit/tag/img/delete', data);
- };
- /**
- * 添加热点/图片上传
- * @param {object} data 传入的对象参数
- * @param {file} data.file
- * @param {text} data.num
- * @param {text} data.sid
- * @param {text} data.size 大小 ,默认320
- * @returns {Promise}
- **/
- var tag_img_upload = function tag_img_upload(data) {
- return http.postFile('/service/scene/edit/tag/img/upload', data);
- };
- /**
- * 滤镜/保存滤镜
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 滤镜数据
- * @param {number} data.reset 是否恢复默认(0-否,1-是,null-否)
- * @returns {Promise}
- **/
- var filter_save = function filter_save(data) {
- return http.post('/service/scene/edit/filter/save', data);
- };
- /**
- * 滤镜/保存风格滤镜
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {string} data.data
- * @returns {Promise}
- **/
- var uploadROIFilter = function uploadROIFilter(data) {
- return http.post('/service/scene/edit/uploadROIFilter', data);
- };
- /**
- * 滤镜/滤镜列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var filter_list = function filter_list(data) {
- return http.post('/service/scene/edit/filter/list', data);
- };
- /**
- * 热点/指示牌/保存
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.data 指示牌数据
- * @param {array} data.styles 自定义图标数据
- * @returns {Promise}
- **/
- var billboards_save = function billboards_save(data) {
- return http.post('/service/scene/edit/billboards/save', data);
- };
- /**
- * 热点/指示牌/列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var billboards_list = function billboards_list(data) {
- return http.post('/service/scene/edit/billboards/list', data);
- };
- /**
- * 热点/指示牌/删除
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sidList sid集合
- * @returns {Promise}
- **/
- var billboards_delete = function billboards_delete(data) {
- return http.post('/service/scene/edit/billboards/delete', data);
- };
- /**
- * 热点/指示牌/删除自定义图标
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.sidList sid集合
- * @returns {Promise}
- **/
- var billboards_styles_delete = function billboards_styles_delete(data) {
- return http.post('/service/scene/edit/billboards/styles/delete', data);
- };
- /**
- * 监控/保存监控
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {object} data.data 监控设置,json对象
- * @param {string} data.name 监控名称
- * @param {string} data.playUrl 监控地址
- * @param {string} data.sid 监控sid
- * @param {string} data.panoId panoId
- * @returns {Promise}
- **/
- var surveillance_save = function surveillance_save(data) {
- return http.post('/service/scene/edit/surveillance/save', data);
- };
- /**
- * 监控/删除监控
- * @param {object} data 传入的对象参数
- * @param {number} data.sid 监控sid
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var surveillance_delete = function surveillance_delete(data) {
- return http.post('/service/scene/edit/surveillance/delete', data);
- };
- /**
- * 监控/监控列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var surveillance_list = function surveillance_list(data) {
- return http.post('/service/scene/edit/surveillance/list', data);
- };
- /**
- * 空间绘制/保存
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.data
- * @returns {Promise}
- **/
- var sceneDraw_save = function sceneDraw_save(data) {
- return http.post('/service/scene/edit/sceneDraw/save', data);
- };
- /**
- * 空间绘制/删除
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.sidList
- * @returns {Promise}
- **/
- var sceneDraw_delete = function sceneDraw_delete(data) {
- return http.post('/service/scene/edit/sceneDraw/delete', data);
- };
- /**
- * 空间绘制/查询空间绘制列表
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var sceneDraw_list = function sceneDraw_list(data) {
- return http.get('/service/scene/edit/sceneDraw/list', data);
- };
- /**
- * 空间装饰/上传空间模型
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {text} data.sid sid
- * @param {file} data.file 模型压缩包,仅支持zip
- * @returns {Promise}
- **/
- var model_box_upload = function model_box_upload(data) {
- return http.postFile('/service/scene/edit/model/box/upload', data);
- };
- /**
- * 空间装饰/保存空间模型
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {object} data.data json数据
- * @param {string} data.data.sid undefined
- * @returns {Promise}
- **/
- var model_box_save = function model_box_save(data) {
- return http.post('/service/scene/edit/model/box/save', data);
- };
- /**
- * 空间装饰/保存空间贴图
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 空间贴图数据
- * @returns {Promise}
- **/
- var photo_box_save = function photo_box_save(data) {
- return http.post('/service/scene/edit/photo/box/save', data);
- };
- /**
- * 空间装饰/删除空间模型
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.sid sid
- * @returns {Promise}
- **/
- var model_box_delete = function model_box_delete(data) {
- return http.post('/service/scene/edit/model/box/delete', data);
- };
- /**
- * 空间装饰/删除空间贴图
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.sid sid
- * @returns {Promise}
- **/
- var photo_box_delete = function photo_box_delete(data) {
- return http.post('/service/scene/edit/photo/box/delete', data);
- };
- /**
- * 马赛克/删除马赛克
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.panoIdList 集合
- * @returns {Promise}
- **/
- var mosaics_delete = function mosaics_delete(data) {
- return http.post('/service/scene/edit/mosaics/delete', data);
- };
- /**
- * 马赛克/添加马赛克
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 马赛克数据
- * @returns {Promise}
- **/
- var mosaics_add = function mosaics_add(data) {
- return http.post('/service/scene/edit/mosaics/add', data);
- };
- /**
- * 马赛克/马赛克列表
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var mosaics_list = function mosaics_list(data) {
- return http.post('/service/scene/edit/mosaics/list', data);
- };
- /**
- * 公共/场景发布
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @returns {Promise}
- **/
- var publicScene = function publicScene(data) {
- return http.post('/service/scene/edit/publicScene', data);
- };
- /**
- * 公共/文件上传
- * @param {object} data 传入的对象参数
- * @param {text} data.base64 图片base64
- * @param {text} data.num 场景码
- * @param {text} data.type 0添加,1替换,默认为1
- * @param {file} data.files 文件数组
- * @param {text} data.fileName 文件名称
- * @param {text} data.bizType 业务类型
- * @param {text} data.uploadPath 上传oss路径
- * @returns {Promise}
- **/
- var upload_files = function upload_files(data) {
- return http.postFile('/service/scene/edit/upload/files', data);
- };
- /**
- * 公共/删除文件
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {string} data.bizType 业务类型
- * @param {array} data.fileNames 文件名称集合
- * @returns {Promise}
- **/
- var delete_file = function delete_file(data) {
- return http.post('/service/scene/edit/delete/file', data);
- };
- /**
- * 公共/文件上传后保存
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.bizType 文件业务类型
- * @param {string} data.fileInfo 文件信息,json格式字符串
- * @returns {Promise}
- **/
- var saveUpload = function saveUpload(data) {
- return http.post('/service/scene/edit/saveUpload', data);
- };
- /**
- * 公共/获取场景详情-编辑页面
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
- * @returns {Promise}
- **/
- var getInfo = function getInfo(data) {
- return http.get('/service/scene/edit/getInfo', data);
- };
- /**
- * 漫游可行/保存漫游可行
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 漫游详情数据
- * @returns {Promise}
- **/
- var saveRoam = function saveRoam(data) {
- return http.post('/service/scene/edit/saveRoam', data);
- };
- /**
- * 添加热点/保存热点可视
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.data 热点可视详情
- * @returns {Promise}
- **/
- var saveTagsVisible = function saveTagsVisible(data) {
- return http.post('/service/scene/edit/saveTagsVisible', data);
- };
- /**
- * 平面图/保存户型图
- * @param {object} data 传入的对象参数
- * @returns {Promise}
- **/
- var cad_save = function cad_save(data) {
- return http.post('/service/scene/edit/cad/save', data);
- };
- /**
- * 添加热点/添加或修改热点
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {array} data.hotDataList 热点数据集合
- * @param {array} data.icons icons集合
- * @returns {Promise}
- **/
- var tag_save = function tag_save(data) {
- return http.post('/service/scene/edit/tag/save', data);
- };
- /**
- * 添加热点/删除热点
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.sidList 删除热点sid集合
- * @returns {Promise}
- **/
- var tag_delete = function tag_delete(data) {
- return http.post('/service/scene/edit/tag/delete', data);
- };
- /**
- * 场景修复/全景照片上传
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.sidList 删除热点sid集合
- * @returns {Promise}
- **/
- var uploadPanorama = function uploadPanorama(data) {
- return http.postFile('/service/scene/edit/uploadPanorama', data);
- };
- /**
- * 场景修复/模型上传
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {file} data.file 模型压缩包
- * @returns {Promise}
- **/
- var uploadModel = function uploadModel(data) {
- return http.postFile('/service/scene/edit/uploadModel', data);
- };
- /**
- * 场景修复/模型下载
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var downloadModel = function downloadModel(data) {
- return http.postFile('/service/scene/edit/downloadModel', data);
- };
- /**
- * 添加热点/获取热点详情
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.sidList 删除热点sid集合
- * @returns {Promise}
- **/
- var tag_list = function tag_list(data) {
- return http.postFile('/service/scene/edit/tag/list', data);
- };
- /**
- * 平面图/户型图重置
- * @param {object} data 传入的对象参数
- * @param {string} data.num
- * @param {array} data.sidList 删除热点sid集合
- * @returns {Promise}
- **/
- var cad_reset = function cad_reset(data) {
- return http.postFile('/service/scene/edit/cad/reset', data);
- };
- /**
- * 场景修复/全景照片下载
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名,不为空时,单个文件下载
- * @returns {Promise}
- **/
- var downloadPanorama = function downloadPanorama(data) {
- return http.post('/service/scene/edit/downloadPanorama', data);
- };
- /**
- * 空间装饰/保存空间视频
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名
- * @param {string} data.data 数据
- * @returns {Promise}
- **/
- var video_box_save = function video_box_save(data) {
- return http.post('/service/scene/edit/video/box/save', data);
- };
- /**
- * 空间装饰/删除空间视频
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.sid sid
- * @returns {Promise}
- **/
- var video_box_delete = function video_box_delete(data) {
- return http.post('/service/scene/edit/video/box/delete', data);
- };
- /**
- * 场景修复/上传球幕视频
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {text} data.fileName 文件名称
- * @param {file} data.file 文件
- * @returns {Promise}
- **/
- var uploadBallScreenVideo = function uploadBallScreenVideo(data) {
- return http.postFile('/service/scene/edit/uploadBallScreenVideo', data);
- };
- /**
- * 场景修复/下载球幕视频
- * @param {object} data 传入的对象参数
- * @param {string} data.num 场景码
- * @param {string} data.fileName 文件名
- * @returns {Promise}
- **/
- var downloadBallScreenVideo = function downloadBallScreenVideo(data) {
- return http.post('/service/scene/edit/downloadBallScreenVideo', data);
- };
- /**
- * 数据对接/场景同步
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {text} data.type 同步目标类型,默认安居客(ajk)
- * @param {text} data.floorPlanJson
- * @param {text} data.ajkJson
- * @param {text} data.cameraJson
- * @param {file} data.files 文件
- * @returns {Promise}
- **/
- var sceneSync = function sceneSync(data) {
- return http.postFile('/service/scene/edit/sceneSync', data);
- };
- /**
- * 痕迹物证/保存
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {text} data.dataList
- * @param {text} data.icons
- * @returns {Promise}
- **/
- var evidence_save = function evidence_save(data) {
- return http.post('/service/scene/edit/evidence/save', data);
- };
- /**
- * 痕迹物证/删除
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {array} data.sidList 痕迹物证sid列表
- * @returns {Promise}
- **/
- var evidence_delete = function evidence_delete(data) {
- return http.post('/service/scene/edit/evidence/delete', data);
- };
- /**
- * 痕迹物证/删除图标
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {array} data.fileNameList 痕迹物证Iconsid列表
- * @returns {Promise}
- **/
- var evidence_icon_delete = function evidence_icon_delete(data) {
- return http.post('/service/scene/edit/evidence/icons/delete', data);
- };
- /**
- * 痕迹物证/列表
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_list = function evidence_list(data) {
- return http.postFile('/service/scene/edit/evidence/list', data);
- };
- /**
- * 痕迹物证/列表
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_traceEvidenceInfoList = function evidence_traceEvidenceInfoList(data) {
- return http.post('/service/scene/edit/evidence/traceEvidenceInfoList', data);
- };
- /**
- * 痕迹物证/刷新
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_refreshTraceEvidenceInfoList = function evidence_refreshTraceEvidenceInfoList(data) {
- return http.post('/service/scene/edit/evidence/refreshTraceEvidenceInfoList', data);
- };
- /**
- * 痕迹物证/同步
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_syncTraceEvidence = function evidence_syncTraceEvidence(data) {
- return http.post('/service/scene/edit/evidence/syncTraceEvidence', data);
- };
- /**
- * 痕迹物证/媒体库分组列表
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @param {text} data.name 类型名称
- * @returns {Promise}
- **/
- var evidence_traceEvidenceList = function evidence_traceEvidenceList(data) {
- return http.post('/service/scene/edit/evidence/traceEvidenceList', data);
- };
- /**
- * 截图/推送
- * @param {object} data 传入的对象参数
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_addMediaLibrarys = function evidence_addMediaLibrarys(data, json) {
- return http.postFile('/service/scene/edit/evidence/addMediaLibrarys', data, json);
- };
- /**
- * 获取场景所属案件信息
- * @param {text} data.num 场景码
- * @returns {Promise}
- **/
- var evidence_getCaseByNum = function evidence_getCaseByNum(num) {
- return http.get('/service/scene/edit/evidence/getCaseByNum', num);
- };
- var editApis = /*#__PURE__*/Object.freeze({
- __proto__: null,
- sceneMarkShape_updateBySid: sceneMarkShape_updateBySid,
- sceneMarkShape_delete: sceneMarkShape_delete,
- ai_box4_getInfos: ai_box4_getInfos,
- tour_video_upload: tour_video_upload,
- tour_video_download: tour_video_download,
- tour_save: tour_save,
- tour_delete: tour_delete,
- point_getLatAndLon: point_getLatAndLon,
- locales: locales,
- upload_content: upload_content,
- getAuth: getAuth,
- getAsynOperLog: getAsynOperLog,
- getServiceUpTip: getServiceUpTip,
- saveInitialPage: saveInitialPage,
- dynamicPanel_update: dynamicPanel_update,
- dynamicPanel_list: dynamicPanel_list,
- uploadShareLogo: uploadShareLogo,
- waterMark_add: waterMark_add,
- waterMark_delete: waterMark_delete,
- linkPan_upload: linkPan_upload,
- linkPan_save: linkPan_save,
- linkPan_delete: linkPan_delete,
- styles_delete: styles_delete,
- linkPan_list: linkPan_list,
- base_save: base_save,
- cad_dxf_upload: cad_dxf_upload,
- cad_dxf_download: cad_dxf_download,
- cad_rename: cad_rename,
- cutModel_save: cutModel_save,
- cutModel_list: cutModel_list,
- cutModel_delete: cutModel_delete,
- icons_delete: icons_delete,
- tag_img_delete: tag_img_delete,
- tag_img_upload: tag_img_upload,
- filter_save: filter_save,
- uploadROIFilter: uploadROIFilter,
- filter_list: filter_list,
- billboards_save: billboards_save,
- billboards_list: billboards_list,
- billboards_delete: billboards_delete,
- billboards_styles_delete: billboards_styles_delete,
- surveillance_save: surveillance_save,
- surveillance_delete: surveillance_delete,
- surveillance_list: surveillance_list,
- sceneDraw_save: sceneDraw_save,
- sceneDraw_delete: sceneDraw_delete,
- sceneDraw_list: sceneDraw_list,
- model_box_upload: model_box_upload,
- model_box_save: model_box_save,
- photo_box_save: photo_box_save,
- model_box_delete: model_box_delete,
- photo_box_delete: photo_box_delete,
- mosaics_delete: mosaics_delete,
- mosaics_add: mosaics_add,
- mosaics_list: mosaics_list,
- publicScene: publicScene,
- upload_files: upload_files,
- delete_file: delete_file,
- saveUpload: saveUpload,
- getInfo: getInfo,
- saveRoam: saveRoam,
- saveTagsVisible: saveTagsVisible,
- cad_save: cad_save,
- tag_save: tag_save,
- tag_delete: tag_delete,
- uploadPanorama: uploadPanorama,
- uploadModel: uploadModel,
- downloadModel: downloadModel,
- tag_list: tag_list,
- cad_reset: cad_reset,
- downloadPanorama: downloadPanorama,
- video_box_save: video_box_save,
- video_box_delete: video_box_delete,
- uploadBallScreenVideo: uploadBallScreenVideo,
- downloadBallScreenVideo: downloadBallScreenVideo,
- sceneSync: sceneSync,
- evidence_save: evidence_save,
- evidence_delete: evidence_delete,
- evidence_icon_delete: evidence_icon_delete,
- evidence_list: evidence_list,
- evidence_traceEvidenceInfoList: evidence_traceEvidenceInfoList,
- evidence_refreshTraceEvidenceInfoList: evidence_refreshTraceEvidenceInfoList,
- evidence_syncTraceEvidence: evidence_syncTraceEvidence,
- evidence_traceEvidenceList: evidence_traceEvidenceList,
- evidence_addMediaLibrarys: evidence_addMediaLibrarys,
- evidence_getCaseByNum: evidence_getCaseByNum
- });
- 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; }
- 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; }
- var viewer$1 = function viewer(data) {
- return {
- info: function info() {
- return getInfo$1(data);
- }
- };
- };
- var editor = function editor(data) {
- return {
- uploads: function uploads(params) {
- return upload_files(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- publish: function publish() {
- return publicScene(data);
- },
- info: function info() {
- return getInfo(data);
- },
- save: function save() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return base_save(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- get_pano_video: function get_pano_video() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return downloadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- upload_pano_video: function upload_pano_video() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return uploadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- cad_save: function cad_save$1() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return cad_save(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- cad_reset: function cad_reset$1() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return cad_reset(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- cad_rename: function cad_rename$1() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return cad_rename(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- walk_save: function walk_save() {
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return saveRoam(_objectSpread$1(_objectSpread$1({}, data), params));
- },
- /**
- * 保存初始画面
- * @param {object} params 参数对象
- * @param {Array<File>} params.files 初始画面图片文件数组
- * @param {object} params.entry 初始画面三维数据
- */
- setting_save_initial: function () {
- var _setting_save_initial = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
- var params,
- response,
- _args = arguments;
- return regenerator.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- params = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
- response = null;
- if (!(!params.files || !params.files.length || !params.entry)) {
- _context.next = 4;
- break;
- }
- return _context.abrupt("return", Promise.resolve({
- code: 0,
- success: true
- }));
- case 4:
- if (!(params.files && params.files.length)) {
- _context.next = 10;
- break;
- }
- _context.next = 7;
- return this.uploads({
- bizType: 'settings-thumb',
- files: params.files
- });
- case 7:
- response = _context.sent;
- if (response.success) {
- _context.next = 10;
- break;
- }
- return _context.abrupt("return", Promise.reject(response));
- case 10:
- _context.next = 12;
- return saveInitialPage(_objectSpread$1(_objectSpread$1({}, data), {}, {
- data: JSON.stringify(params.entry),
- fileName: 'thumb-1k.jpg'
- }));
- case 12:
- response = _context.sent;
- if (response.success) {
- _context.next = 15;
- break;
- }
- return _context.abrupt("return", Promise.reject(response));
- case 15:
- return _context.abrupt("return", Promise.resolve(response));
- case 16:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, this);
- }));
- function setting_save_initial() {
- return _setting_save_initial.apply(this, arguments);
- }
- return setting_save_initial;
- }()
- };
- };
- var APIs = (function (app) {
- var data = {
- num: app.config.num,
- get rnd() {
- return Date.now();
- }
- };
- return {
- viewer: viewer$1(data),
- editor: editor(data)
- };
- });
- 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";
- n$4(css,{});
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var player$7;
- var verticalLine = new THREE.Line3();
- /*let getIntersect = (e, when) => {
- if (e.intersect && e.intersect.object.name == 'collider') return e.intersect
- if (when == 'drag') {
- //拖拽时player没getIntersect这里获取下
- let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
- return chunkPick
- }
- let chunkPick = player.allIntersects.find(e => e.object.name == 'collider') //在chunk上的intersect
- return chunkPick
- }*/
- //控制点和边的合集。具有可以拖拽修改的功能,拖拽时能防止线相交。
- var ctrlPolygon = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(ctrlPolygon, _THREE$Object3D);
- var _super = _createSuper$a(ctrlPolygon);
- function ctrlPolygon(type, prop, player_) {
- var _this;
- _classCallCheck(this, ctrlPolygon);
- _this = _super.call(this);
- _this.Type = type;
- player$7 = player_;
- _this.maxMarkers = Number.MAX_SAFE_INTEGER;
- _this.transformData(prop);
- for (var i in prop) {
- _this[i] = prop[i];
- }
- _this.color = _this.color || '#fff';
- if ((_this.atPlane || _this.showArea) && _this.closed) {
- _this.areaPlane = _this.createAreaPlane();
- _this.add(_this.areaPlane);
- } //数据--刚开始一定是空的
- _this.points = []; //mesh 不一定有
- _this.markers = [];
- _this.edges = [];
- _this.center;
- _this.setEditEnable(true);
- return _this;
- }
- _createClass(ctrlPolygon, [{
- key: "initData",
- value: function initData(prop) {
- //开始加数据
- //prop.points && (this.points = prop.points)
- if (prop.points) {
- var _iterator = _createForOfIteratorHelper$2(prop.points),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var p = _step.value;
- var pos = new THREE.Vector3().copy(p);
- this.addMarker({
- point: pos
- });
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- this.facePlane = this.getFacePlane();
- this.getPoint2dInfo(this.points);
- this.update({
- ifUpdateMarkers: true
- });
- this.setSelected(false);
- this.markers.forEach(function (marker) {
- marker.dispatchEvent({
- type: 'addHoverEvent'
- });
- });
- return true;
- }
- }
- }, {
- key: "setEditEnable",
- value: function setEditEnable(state) {
- this.editEnable = state;
- if (state) {
- this.markers.forEach(function (m) {
- return m.dispatchEvent({
- type: 'addHoverEvent'
- });
- });
- }
- }
- }, {
- key: "addMarker",
- value: function addMarker() {
- var _this2 = this;
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var index = o.index == void 0 ? this.points.length : o.index; //要当第几个
- this.points = [].concat(_toConsumableArray(this.points.slice(0, index)), [o.point.clone()], _toConsumableArray(this.points.slice(index, this.points.length)));
- if (o.marker) {
- this.add(o.marker);
- this.markers = [].concat(_toConsumableArray(this.markers.slice(0, index)), [o.marker], _toConsumableArray(this.markers.slice(index, this.markers.length)));
- this.updateMarker(o.marker, o.point);
- o.marker.addEventListener('drag', this.dragMarker.bind(this), {
- importance: 2
- });
- o.marker.addEventListener('drop', this.dropMarker.bind(this), {
- importance: 2
- });
- o.marker.createTime = Date.now();
- var addHoverEvent = function addHoverEvent(e) {
- var _o$marker$_listeners;
- if ((_o$marker$_listeners = o.marker._listeners) !== null && _o$marker$_listeners !== void 0 && _o$marker$_listeners.startDragging || !_this2.editEnable) return; //already has
- var mouseover = function mouseover(e) {
- if (!_this2.editEnable) return;
- _this2.setMarkerSelected(o.marker, 'hover', 'single');
- CursorDeal.add('markerMove');
- };
- var mouseleave = function mouseleave(e) {
- _this2.setMarkerSelected(o.marker, 'unhover', 'single');
- CursorDeal.remove('markerMove');
- };
- o.marker.addEventListener('mouseover', mouseover);
- o.marker.addEventListener('mouseleave', mouseleave);
- o.marker.addEventListener('startDragging', function (e) {
- //for mobile
- _this2.setMarkerSelected(o.marker, 'hover', 'single');
- _this2.dispatchEvent({
- type: 'startDragging'
- });
- });
- o.marker.addEventListener('drop', function (e) {
- //for mobile
- _this2.setMarkerSelected(o.marker, 'unhover', 'single');
- });
- o.marker.removeEventListener('addHoverEvent', addHoverEvent);
- };
- o.marker.addEventListener('addHoverEvent', addHoverEvent); //当非isNew时才添加事件
- if (!this.isNew) {
- o.marker.dispatchEvent({
- type: 'addHoverEvent'
- });
- }
- }
- if (o.edge) {
- this.add(o.edge);
- this.edges = [].concat(_toConsumableArray(this.edges.slice(0, index)), [o.edge], _toConsumableArray(this.edges.slice(index, this.edges.length)));
- }
- }
- }, {
- key: "dragMarker",
- value: function dragMarker(e) {
- var _player$getIntersectA;
- if (!this.editEnable) return;
- var I,
- marker = e.target;
- /* if(e.hoverViewport != e.drag.dragViewport){//不能使用e.dragViewport,要使用drag中的,因为drag中存储的要一直继承下来,不因mouseup了而改变。
- CursorDeal.add('polygon_AtWrongPlace')
- return
- } */
- /* if(e.drag.pointerDelta.length() == 0 && !this.isNew){ //部分设备(华为matePad11)在touchstart后立即执行了touchmove,导致marker立即移动,需要屏蔽..(刚创建时也会是0)
- return
- } */
- CursorDeal.remove('polygon_AtWrongPlace');
- marker.isDragging = true; //e.drag.object.isDragging = true
- 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))
- if (!I) {
- if (this.zPlaneWhenNoIntersect != void 0) {
- var _Potree$Utils$getPoin = Potree.Utils.getPointerPosAtHeight(this.zPlaneWhenNoIntersect, e.pointer),
- x = _Potree$Utils$getPoin.x,
- y = _Potree$Utils$getPoin.y;
- I = new THREE.Vector3(x, y, this.zPlaneWhenNoIntersect);
- }
- }
- if (I) {
- var i = this.markers.indexOf(marker);
- if (i !== -1) {
- this.dragChange(I.clone(), i
- /* , atMap */
- );
- }
- this.editStateChange(true);
- return true;
- }
- }
- }, {
- key: "dragChange",
- value: function dragChange(intersectPos, i, atMap) {
- var _this3 = this;
- var len = this.markers.length;
- var oldPoint = this.points[i];
- if (atMap) {
- intersectPos.setY(oldPoint.y); //在地图上拖拽,不改变其高度。
- }
- var location = intersectPos.clone();
- if (this.faceDirection && this.maxMarkers == 2 && len == 2) {
- //add 固定方向的点不直接拖拽
- var p1 = this.markers[0].position;
- if (this.faceDirection == 'horizontal') {
- var projectPos = location.clone().setY(p1.y);
- } else {
- var projectPos = p1.clone().setY(location.y);
- }
- LineDraw.updateLine(this.guideLine, [location, projectPos]);
- location = projectPos;
- this.guideLine.visible = true;
- } else if (len > 1) {
- var points = this.points.map(function (e) {
- return e.clone();
- });
- points[i].copy(location); //算normal需要提前确认point
- //若为定义了面朝向的矩形
- if (this.faceDirection == 'horizontal') {
- if (len == 2) {
- location.setY(points[0].y);
- }
- if (!this.facePlane) {
- //一个点就能确定面
- this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), this.points[0]);
- }
- } else if (this.faceDirection == 'vertical') {
- //当有两个点时, 有两个方向的可能
- if (len == 2) {
- if (this.isRect) {
- var _vec = points[0].clone().sub(location);
- if (Math.sqrt(_vec.x * _vec.x + _vec.z * _vec.z) > Math.abs(_vec.y)) {
- //水平(高度差小于水平距离时)
- location.setY(points[0].z);
- } else {
- //垂直 (当两点一样时也属于这种)
- location.setX(points[0].x);
- location.setZ(points[0].z);
- }
- }
- } else {
- {
- //判断cannotConfirmNormal. 如果前几段都在竖直线上,就不能固定出面方向。
- this.cannotConfirmNormal = true;
- var max = this.isRect ? 1 : len - 2;
- for (var _i = 0; _i < max; _i++) {
- var _p = points[_i].clone();
- var _p2 = points[_i + 1].clone();
- var _vec2 = _p.sub(_p2);
- if (_vec2.x != 0 || _vec2.y != 0) {
- this.cannotConfirmNormal = false;
- break;
- }
- }
- }
- if (!this.facePlane || this.cannotConfirmNormal) {
- //三个点且为垂直方向时,计算面
- var points_ = points.map(function (e) {
- return new THREE.Vector2(e.x, e.z);
- });
- var points2 = this.getDifferentPoint(points_, 2);
- if (points2) {
- var normal = math$2.getNormal({
- points: points2
- });
- normal = new THREE.Vector3(normal.x, 0, normal.y);
- this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, this.points[0]);
- }
- }
- }
- }
- if (len > 2) {
- if (!this.faceDirection && this.atPlane) {
- if (len == 3 || this.isRect) this.cannotConfirmNormal = true; //当第三个点固定后(有四个点时)才能固定面
- if (!this.facePlane || this.cannotConfirmNormal) {
- var points3 = this.getDifferentPoint(points, 3); //只有找到三个不同的点算拥有面和area
- if (points3) {
- var _THREE$Plane;
- this.facePlane = (_THREE$Plane = new THREE.Plane()).setFromCoplanarPoints.apply(_THREE$Plane, _toConsumableArray(points3));
- }
- }
- }
- if (this.atPlane && this.facePlane && !this.cannotConfirmNormal) {
- //之后加的点一定要在面上
- if (atMap) {
- //地图上用垂直线,得到和面的交点。
- verticalLine.set(location.clone().setY(100000), location.clone().setY(-100000)); //确保长度范围覆盖所有测量面
- location = this.facePlane.intersectLine(verticalLine, new THREE.Vector3());
- if (!location) return;
- } else {
- location = this.facePlane.projectPoint(intersectPos, new THREE.Vector3());
- }
- }
- points[i].copy(location); //再copy确认一次
- if (len == 3 && this.faceDirection == 'horizontal' && this.closed) {
- var _THREE$Plane2;
- //normal方向还不确定 会影响label在里侧还是外侧
- var facePlane = (_THREE$Plane2 = new THREE.Plane()).setFromCoplanarPoints.apply(_THREE$Plane2, _toConsumableArray(points));
- if (facePlane.normal.y && facePlane.normal.y * this.facePlane.normal.y < 0) {
- this.facePlane.normal.y *= -1, this.facePlane.constant *= -1; //console.log(this.facePlane.normal, this.facePlane.constant)
- }
- }
- if (this.isRect) {
- //是矩形 (即使没有faceDirection也能执行)
- //根据前两个点计算当前和下一个点
- var p1 = points[(i - 2 + len) % len];
- var p2 = points[(i - 1 + len) % len];
- if (p1.equals(p2)) {
- //意外情况:重复点两次 ( bug点,改了好多遍)
- if (this.faceDirection == 'vertical') {
- p2.add(new THREE.Vector3(0, 0.0001, 0));
- } else {
- p2.add(new THREE.Vector3(0, 0, 0.0001));
- }
- } //p3 : location
- var foot = math$2.getFootPoint(location, p1, p2); //p2 修改p2到垂足的位置
- var vec = foot.clone().sub(location);
- var p4 = p1.clone().sub(vec);
- points[(i - 1 + len) % len].copy(foot);
- points[(i + 1) % len].copy(p4);
- this.setPosition((i - 1 + len) % len, foot); //p2
- this.setPosition((i + 1) % len, p4);
- }
- this.getPoint2dInfo(points);
- var isIntersectSelf = this.atPlane
- /* && this.closed */
- && !this.isRect && this.point2dInfo && this.intersectSelf(this.point2dInfo.points2d); //检测相交
- this.isIntersectSelf = isIntersectSelf;
- if (isIntersectSelf) {
- //not-allowed
- if (!this.isNew && isIntersectSelf == 'lastLine') this.isIntersectSelf = 'all'; //已经画好了就不用特别对待最后一条线
- if (this.isIntersectSelf == 'lastLine') {
- this.areaPlane && common$1.updateVisible(this.areaPlane, 'intersectLastLine', false);
- this.areaLabel && common$1.updateVisible(this.areaLabel, 'intersectLastLine', false);
- } else {
- CursorDeal.add('polygon_isIntersectSelf');
- return;
- }
- }
- if (!this.isIntersectSelf) {
- this.areaPlane && common$1.updateVisible(this.areaPlane, 'intersectLastLine', true);
- this.areaLabel && common$1.updateVisible(this.areaLabel, 'intersectLastLine', true);
- }
- if (!this.isIntersectSelf || this.isIntersectSelf == 'lastLine') {
- CursorDeal.remove('polygon_isIntersectSelf');
- }
- }
- var showGuideLine = len > 1 && (this.faceDirection || len > 3);
- if (showGuideLine && this.guideLine) {
- LineDraw.updateLine(this.guideLine, [intersectPos, location]);
- this.guideLine.visible = true;
- } //console.log(this.points.map(e=>e.toArray()))
- }
- if (this.restrictArea) {
- var holes = this.restrictArea.holes.concat(this.restrictArea.parentHoles);
- var holesPoints = holes.filter(function (e) {
- return e != _this3 && e.points.length > 2;
- }).map(function (e) {
- return e.points;
- });
- if (!math$2.isPointInArea(this.restrictArea.points, holesPoints, location)) {
- CursorDeal.add('polygon_AtWrongPlace');
- this.isAtWrongPlace = true;
- return;
- } //就不处理相交线了。 有个缺点:floor上的hole可以限制room,但hole不受room限制,会导致room的marker被框在hole里而动不了。只能去调整hole了
- }
- CursorDeal.remove('polygon_AtWrongPlace');
- this.isAtWrongPlace = false;
- this.setPosition(i, location);
- this.update({
- index: this.isRect ? null : i
- });
- this.dispatchEvent({
- type: 'dragChange',
- index: i
- });
- }
- }, {
- key: "dropMarker",
- value: function dropMarker(e) {
- var _e$drag;
- //console.log('dropMarker')
- /* if (this.isNew && e.pressDistance>Potree.config.clickMaxDragDis){//拖拽的话返回
- return this.continueDrag(null,e)
- } */
- /* if(e.hoverViewport != e.drag.dragViewport){//copy from dragMarker, for sitemodel, only mapViewport can be dropped
- return this.continueDrag(null,e)
- } */
- var marker = e.target;
- if (e.touches) {
- /* if(e.hoverViewport != viewer.mainViewport && this.unableDragAtMap){
- viewer.dispatchEvent({type:'reticule_forbit', v:true})
- return this.continueDrag(null,e)
- }else{
- viewer.dispatchEvent({type:'reticule_forbit', v:false})
- } */
- this.isNew && this.dragMarker(e); //isNew触屏点击时必须先更新下点,因为指尖不在屏幕上时没更新。但对已经创建的marker点击时不应该更新
- }
- 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)) //不允许和之前的点相同, 但这句在点云稀疏时会导致难结束
- ) {
- return this.continueDrag(marker, e); //(null, e)
- }
- var i = this.markers.indexOf(marker);
- if (i !== -1) {
- this.dispatchEvent({
- type: 'marker_dropped',
- index: i
- });
- if (this.markers.length > 2 && this.facePlane) this.cannotConfirmNormal = false;
- this.guideLine && (this.guideLine.visible = false);
- }
- this.setMarkerSelected(marker, 'unhover', 'single');
- this.editStateChange(false);
- (_e$drag = e.drag) === null || _e$drag === void 0 ? void 0 : _e$drag.endDragFun(e); // && e.endDragFun(e) // addmarker
- return true;
- }
- }, {
- key: "getFacePlane",
- value: function getFacePlane(force) {
- //最普通一种get方法,根据顶点。且假设所有点已经共面,且不重合
- if (this.points.length < 3) return;
- var facePlane = this.facePlane;
- if (force || !this.atPlane || !facePlane) {
- //多折线 没有实时更新facePlane所以重新算
- var normal = new THREE.Vector3(),
- len = this.points.length - 2;
- for (var i = 0; i < len; i++) {
- //获取normal的顺序方法必须和setFromCoplanarPoints一致
- var vec0 = new THREE.Vector3().subVectors(this.points[i + 2], this.points[i + 1]);
- var vec1 = new THREE.Vector3().subVectors(this.points[i], this.points[i + 1]);
- var nor = vec0.cross(vec1).normalize();
- normal.add(nor);
- }
- normal.normalize();
- facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, this.points[0]);
- }
- return facePlane;
- }
- }, {
- key: "getPoint2dInfo",
- value: function getPoint2dInfo() {
- var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.points;
- //在更新areaplane之前必须更新过point2dInfo (针对所有点在同一平面上的)
- if (this.facePlane && (this.atPlane || Potree.settings.areaAtNotPlane)) {
- var facePlane = this.getFacePlane();
- if (!facePlane) return this.point2dInfo = null;
- var originPoint0 = points[0].clone();
- var qua = math$2.getQuaBetween2Vector(facePlane.normal, new THREE.Vector3(0, 0, 1), new THREE.Vector3(0, 0, 1));
- var points2d = points.map(function (e) {
- return e.clone().applyQuaternion(qua);
- });
- this.point2dInfo = {
- originPoint0,
- points2d,
- quaInverse: qua.clone().invert()
- };
- }
- }
- }, {
- key: "setPosition",
- value: function setPosition(index, position) {
- //拖拽后设置位置
- var point = this.points[index];
- point.copy(position);
- var marker = this.markers[index];
- this.updateMarker(marker, point);
- }
- }, {
- key: "updateMarker",
- value: function updateMarker(marker, pos) {
- marker.position.copy(pos);
- marker.waitUpdate();
- }
- }, {
- key: "intersectSelf",
- value: function intersectSelf(points2d) {
- //add
- var len = points2d.length;
- for (var i = 0; i < len; i++) {
- for (var j = i + 2; j < len; j++) {
- if (Math.abs(j - len - i) < 2) continue; //不和邻边比
- var p1 = points2d[i];
- var p2 = points2d[i + 1];
- var p3 = points2d[j];
- var p4 = points2d[(j + 1) % len];
- if (p1.equals(p2) || p3.equals(p4) || p1.equals(p3) || p2.equals(p3) || p1.equals(p4) || p2.equals(p4)) continue;
- var line1 = [p1, p2];
- var line2 = [p3, p4];
- var intersect = math$2.isLineIntersect(line1, line2, false, 0.001);
- if (intersect) {
- if (i == len - 1 || j == len - 1) {
- //最后一条线。如果还没绘制完,最后的线还没定下,可被允许继续绘制,但无法显示面积。
- return 'lastLine';
- } else {
- return 'all';
- }
- }
- }
- }
- }
- }, {
- key: "removeMarker",
- value: function removeMarker(index) {
- var _this$point2dInfo;
- this.points.splice(index, 1);
- var marker = this.markers[index];
- this.markers.splice(index, 1);
- marker.dispose ? marker.dispose() : marker.parent.remove(marker);
- var edgeIndex = index;
- var edge = this.edges[edgeIndex];
- if (edge) {
- this.remove(edge);
- this.edges.splice(edgeIndex, 1);
- edge.geometry.dispose();
- }
- index == 0 ? this.getPoint2dInfo() : (_this$point2dInfo = this.point2dInfo) === null || _this$point2dInfo === void 0 ? void 0 : _this$point2dInfo.points2d.splice(index, 1); //add
- this.dispatchEvent({
- type: 'removeMarker',
- index,
- marker
- });
- }
- }, {
- key: "createAreaPlane",
- value: function createAreaPlane(mat) {
- var geometry = new THREE.BufferGeometry();
- var mesh = new THREE.Mesh(geometry, mat);
- return mesh;
- }
- }, {
- key: "updateAreaPlane",
- value: function updateAreaPlane() {
- this.areaPlane.geometry.dispose();
- if (this.points.length > 2) {
- if (this.isPrism) {
- var z = this.horizonZ || 0;
- var points2d = this.points.map(function (e) {
- return e.clone().setZ(z);
- });
- this.areaPlane.geometry = MeshDraw.getShapeGeo(points2d); //z=0
- var center = math$2.getCenterOfGravityPoint(points2d); //重心
- this.areaPlaneCenter = new THREE.Vector3(center.x, center.y, z);
- this.areaPlane.position.z = z;
- } else if (this.point2dInfo) {
- this.areaPlane.geometry = MeshDraw.getShapeGeo(this.point2dInfo.points2d);
- var _center = math$2.getCenterOfGravityPoint(this.point2dInfo.points2d); //重心
- var firstPos = this.point2dInfo.points2d[0].clone();
- firstPos.z = 0; //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
- firstPos.applyQuaternion(this.point2dInfo.quaInverse);
- var vec = this.point2dInfo.originPoint0.clone().sub(firstPos);
- _center = new THREE.Vector3(_center.x, _center.y, 0);
- _center.applyQuaternion(this.point2dInfo.quaInverse);
- this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse);
- this.areaPlane.position.copy(vec);
- _center.add(vec);
- this.center = _center;
- }
- } else {
- this.areaPlane.geometry = new THREE.BufferGeometry();
- }
- }
- }, {
- key: "getCenter",
- value: function getCenter(type) {
- if (this.center) {
- return this.center.clone();
- } else {
- var center = this.points.reduce(function (total, currentValue) {
- return total.add(currentValue);
- }, new THREE.Vector3());
- this.points.length && center.multiplyScalar(1 / this.points.length);
- return center; //求不出重心呜呜
- }
- }
- }, {
- key: "getIndex",
- value: function getIndex(index, add) {
- var lastIndex = this.points.length - 1;
- 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;
- }
- }, {
- key: "getPoint",
- value: function getPoint(index, add) {
- var index_ = this.getIndex(index, add);
- return index_ == null ? null : this.points[index_];
- }
- }, {
- key: "updateEdge",
- value: function updateEdge(index, p1, p2) {
- this.edges[index] && LineDraw.updateLine(this.edges[index], p1, p2);
- }
- }, {
- key: "update",
- value: function update() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (this.points.length === 0) {
- return;
- }
- var lastIndex = this.points.length - 1;
- if (options.index != void 0) {
- //更新第几个点
- this.updateMarker(this.markers[options.index], this.points[options.index]);
- var previousIndex = this.getIndex(options.index, -1);
- var nextIndex = this.getIndex(options.index, +1);
- if (nextIndex != null) this.updateEdge(options.index, [this.points[options.index], this.points[nextIndex]]);
- 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]])
- } else {
- for (var index = 0; index <= lastIndex; index++) {
- var _nextIndex = this.getIndex(index, +1);
- var _previousIndex = this.getIndex(index, -1);
- var point = this.points[index];
- var nextPoint = this.points[_nextIndex];
- this.points[_previousIndex];
- if (options.ifUpdateMarkers) {
- this.updateMarker(this.markers[index], point);
- }
- if (!nextPoint) break; //add
- {
- this.updateEdge(index, [point, nextPoint]);
- }
- }
- }
- if (this.areaPlane) {
- this.updateAreaPlane();
- }
- }
- }, {
- key: "createPrismLines",
- value: function createPrismLines(color) {
- this.lineMesh = LineDraw.createLine([], {
- color
- });
- this.lineMesh.name = 'PrismLines';
- this.add(this.lineMesh);
- }
- }, {
- key: "updatePrismLines",
- value: function updatePrismLines() {
- var _this4 = this;
- if (!this.lineMesh) return;
- var positions = [];
- var length = this.points.length;
- this.points.forEach(function (point, index) {
- //竖线:
- positions.push(point.clone().setZ(_this4.zMin), point.clone().setZ(_this4.zMax)); //横线
- var nextPoint = _this4.points[(index + 1) % length];
- if (!nextPoint) return; //when length==1
- positions.push(point.clone().setZ(_this4.zMax), nextPoint.clone().setZ(_this4.zMax)); //上横线
- positions.push(point.clone().setZ(_this4.zMin), nextPoint.clone().setZ(_this4.zMin)); //下横线
- });
- LineDraw.moveLine(this.lineMesh, positions);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- //add
- this.parent.remove(this);
- this.markers.forEach(function (e) {
- return e.dispose && e.dispose();
- });
- this.edges.forEach(function (e) {
- return e.geometry.dispose();
- });
- }
- }, {
- key: "reDraw",
- value: function reDraw() {
- var restMarkerCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- //重新开始画
- var pointCount = this.points.length - restMarkerCount; // restMarkerCount为需要留下的marker数量
- while (pointCount > 0) {
- this.removeMarker(--pointCount);
- }
- this.point2dInfo = null;
- this.facePlane = null;
- }
- }, {
- key: "setSelected",
- value: function setSelected() {}
- }, {
- key: "setMarkerSelected",
- value: function setMarkerSelected() {}
- }, {
- key: "editStateChange",
- value: function editStateChange(state) {
- if (!state) {
- CursorDeal.remove('polygon_isIntersectSelf');
- CursorDeal.remove('polygon_AtWrongPlace'); //viewer.dispatchEvent({type:'reticule_forbit', v:false})
- this.markers.forEach(function (e) {
- return e.isDragging = false;
- });
- }
- }
- }, {
- key: "transformData",
- value: function transformData(prop) {
- var pick = function pick(defaul, alternative) {
- if (defaul != null) {
- return defaul;
- } else {
- return alternative;
- }
- };
- prop.showDistances = prop.showDistances === null ? true : prop.showDistances;
- prop.showArea = pick(prop.showArea, false);
- prop.showAngles = pick(prop.showAngles, false);
- prop.showCoordinates = pick(prop.showCoordinates, false);
- prop.showHeight = pick(prop.showHeight, false);
- prop.showCircle = pick(prop.showCircle, false);
- prop.showAzimuth = pick(prop.showAzimuth, false);
- prop.showEdges = pick(prop.showEdges, true);
- prop.closed = pick(prop.closed, false);
- prop.maxMarkers = pick(prop.maxMarkers, Infinity);
- prop.direction = prop.direction; //add
- prop.type = prop.type;
- prop.showGuideLine = pick(prop.showGuideLine, false);
- prop.isRect = pick(prop.isRect, false);
- }
- }, {
- key: "continueDrag",
- value: function continueDrag(marker, e) {
- var _this5 = this;
- var object = marker || e.drag.object;
- object.isDragging = true;
- this.editStateChange(true);
- var timer = setTimeout(function () {
- //等 drag=null之后 //右键拖拽结束后需要重新得到drag
- if (_this5.parent && object.parent && object.isDragging) {
- //console.log('continueDrag')
- e.drag.object = object;
- player$7.emit('forceToDrag', {
- drag: e.drag
- });
- }
- }, 1);
- return timer;
- }
- }, {
- key: "getDifferentPoint",
- value: function getDifferentPoint(points, count) {
- //for facePlane
- var result = [];
- for (var i = 0; i < points.length; i++) {
- var p = points[i];
- if (result.find(function (e) {
- return e.equals(p);
- })) continue;else result.push(p);
- if (result.length == count) break;
- }
- if (result.length == count || count == void 0) return result;
- }
- }, {
- key: "getTotalDistance",
- value: function getTotalDistance() {
- if (this.points.length === 0) {
- return 0;
- }
- var distance = 0;
- for (var i = 1; i < this.points.length; i++) {
- var prev = this.points[i - 1];
- var curr = this.points[i];
- var d = prev.distanceTo(curr);
- distance += d;
- }
- if (this.closed && this.points.length > 1) {
- var first = this.points[0];
- var last = this.points[this.points.length - 1];
- var _d = last.distanceTo(first);
- distance += _d;
- }
- this.totalLength = distance;
- return distance;
- }
- }]);
- return ctrlPolygon;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- var config$1 = {
- precision: 2,
- color: Colors.mainColor,
- default: {
- color: Colors.mainColor,
- //"#00c7b2",
- opacity: 0.7
- },
- highlight: {
- color: Colors.mainColor,
- //'#00C8AF',
- opacity: 1,
- labelOpacity: 0.7 //1会挡住线和端点
- },
- guide: {
- color: '#FFFFFF',
- opacity: 0.8
- },
- backColor: '#333333',
- lineWidth: 3,
- textColor: '#000000',
- adsorptMinDis: 30,
- //最小吸附距离(像素)
- showName: true
- };
- var texLoader = new THREE.TextureLoader();
- new THREE.Color(config$1.default.color);
- new THREE.Color(config$1.highlight.color);
- new THREE.Color(config$1.color);
- var textColor = new THREE.Color(config$1.textColor); //遮挡规则参考如视 https://www.realsee.com/cn/history-museum-of-peking-university
- //漫游模式存储visiblePanos, 只要有一个点可见就可见。飞出后穿透可见
- var markerMaps;
- var textSizeRatio = math$2.linearClamp(window.outerWidth * window.outerHeight, [360 * 720, 1920 * 1080], [0.7, 1]); //pc字显示大一些 用
- var markerMapShrink = browser$1.isMobile() ? 0.4 : 0.8; //触屏需要更大的热区
- var markerSizeInfo = {
- width2d: 18 / markerMapShrink // nearBound : 1.5, farBound : 15,
- };
- var labelSizeInfo = {
- width2d: 200
- };
- var angle = THREE.MathUtils.degToRad(5); //显示水平垂直辅助线的最小角度
- var guideShowMinAngle = {
- min: angle,
- max: Math.PI / 2 - angle
- };
- var mainLabelProp = {
- //backgroundColor: {r: defaultColor.r*255, g: defaultColor.g*255, b: defaultColor.b*255, a:config.measure.default.opacity},
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0
- },
- textColor: {
- r: textColor.r * 255,
- g: textColor.g * 255,
- b: textColor.b * 255,
- a: 1.0
- },
- textBorderColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1.0
- },
- textBorderThick: 3,
- fontsize: 15 * textSizeRatio,
- borderRadius: 12,
- margin: {
- x: 20,
- y: 4
- },
- renderOrder: RenderOrder.measure.label,
- pickOrder: RenderOrder.measure.label,
- transform2D: {
- x: 0,
- y: -0.15
- },
- useDepth: true,
- // 2023.10 尽量不让数字被挡住
- clipDistance: 10,
- //消失距离
- occlusionDistance: 10,
- //变为backColor距离
- maxOcclusionFactor: 0.3,
- maxClipFactor: 0.8
- };
- var subLabelProp = {
- backgroundColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 0
- },
- textColor: {
- r: textColor.r * 255,
- g: textColor.g * 255,
- b: textColor.b * 255,
- a: 1.0
- },
- textBorderColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1.0
- },
- textBorderThick: 3,
- fontsize: 14 * textSizeRatio,
- renderOrder: RenderOrder.measure.subLabel,
- pickOrder: RenderOrder.measure.subLabel,
- transform2D: {
- x: 0,
- y: -0.13
- }
- };
- var player$6,
- measuringTool$1,
- count = 0;
- var Measure = /*#__PURE__*/function (_CtrlPolygon) {
- _inherits(Measure, _CtrlPolygon);
- var _super = _createSuper$9(Measure);
- function Measure(prop, player_, measuringTool_) {
- var _this;
- _classCallCheck(this, Measure);
- _this = _super.call(this, 'measure', prop, player_);
- player$6 = player_, measuringTool$1 = measuringTool_;
- _this.name = _this.name || _this.measureType + count++;
- _this.selectStates = {};
- _this.edgeLabels = [];
- _this.coordinateLabels = [];
- _this.area = {
- value: 0,
- string: ''
- };
- if (_this.showArea) {
- _this.areaLabel = _this.createAreaLabel();
- _this.add(_this.areaLabel);
- } //add:
- if (_this.atPlane || _this.faceDirection) {
- //是一个平面上的话
- _this.createGuideLine();
- }
- if (_this.measureType == 'Distance') {
- _this.createHorVerGuideLine();
- }
- _this.setUnitSystem(prop.unit || player$6.unitConvert.UnitService.defaultSystem);
- if (_this.measureType == 'MulDistance' || _this.measureType == 'Hor MulDistance' || _this.measureType == 'Ver MulDistance') {
- //this.showTotalDis = true
- _this.totalDisLabel = _this.createTotalDisLabel();
- _this.add(_this.totalDisLabel);
- } //addMarkers:
- _this.boundInfo = {};
- _this.initData(prop); //this.pointsPos2d = new Map //屏幕上的二维坐标
- _this.lastDropTime = 0;
- return _this;
- }
- _createClass(Measure, [{
- key: "initData",
- value: function initData(prop) {
- var makeIt = _get(_getPrototypeOf(Measure.prototype), "initData", this).call(this, prop);
- if (makeIt) {
- this.edges.forEach(function (edge) {
- edge.dispatchEvent('addHoverEvent');
- });
- this.measureType.includes('MulDistance') && this.edgeLabels.forEach(function (label) {
- label.dispatchEvent('addHoverEvent');
- });
- } else {
- this.failBuilded = true;
- }
- }
- }, {
- key: "update",
- value: function update() {
- var _this2 = this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (options.index == -1) return;
- _get(_getPrototypeOf(Measure.prototype), "update", this).call(this, options);
- var setEdgeLabel = function setEdgeLabel(label, p1, p2, distance, type) {
- //设置label位置和字
- _this2.setEdgeLabelPos(label, p1, p2);
- distance = distance == void 0 ? p1.distanceTo(p2) : distance;
- var text = _this2.getConvertString(distance, 'distance');
- _this2.showArea || type == 'addTitle' && (text = _this2.labelAddName(text));
- label.setText(text);
- return distance;
- };
- var lastIndex = this.points.length - 1;
- var setLabel = function setLabel(index) {
- if (index == null) return;
- var previousIndex = _this2.getIndex(index, -1);
- var nextIndex = _this2.getIndex(index, +1);
- _this2.points[previousIndex];
- var point = _this2.points[index];
- var nextPoint = _this2.points[nextIndex];
- if (_this2.showDistances) {
- // edge labels
- var edgeLabel = _this2.edgeLabels[index];
- var distance = nextPoint && point.distanceTo(nextPoint);
- _this2.edges[index].distance_ = distance;
- edgeLabel.shouldVisi = nextPoint && (index < lastIndex || _this2.isRect || _this2.closed && !_this2.isNew) && distance > 0; //this.closed || edgeLabel.setVisible(edgeLabel.shouldVisi) //closed的在setEdgesDisplay中设置
- common$1.updateVisible(edgeLabel, 'shouldVisi', edgeLabel.shouldVisi, 2);
- if (edgeLabel.shouldVisi) {
- edgeLabel.lineDir = new THREE.Vector3().subVectors(point, nextPoint).normalize(); //[point,nextPoint]
- setEdgeLabel(edgeLabel, point, nextPoint, distance, _this2.measureType != 'MulDistance' && 'addTitle');
- }
- }
- };
- if (options.index != void 0) {
- //更新第几个点
- setLabel(options.index);
- var previousIndex = this.getIndex(options.index, -1);
- setLabel(previousIndex);
- } else {
- for (var index = 0; index <= lastIndex; index++) {
- setLabel(index);
- }
- }
- if (this.measureType == 'Distance' && this.points.length > 1) {
- //设置水平垂直辅助线
- var pTop, pBtm;
- if (this.points[0].z > this.points[1].z) {
- pTop = this.points[0];
- pBtm = this.points[1];
- } else {
- pTop = this.points[1];
- pBtm = this.points[0];
- }
- var projectPos = new THREE.Vector3(pTop.x, pTop.y, pBtm.z); //两条guideline的交点
- {
- //倾斜角度太小的时候不显示
- var tan = pTop.distanceTo(projectPos) / pBtm.distanceTo(projectPos);
- var _angle = Math.atan(tan);
- this.shouldShowHorVerGuide = _angle > guideShowMinAngle.min && _angle < guideShowMinAngle.max;
- }
- LineDraw.updateLine(this.verGuideEdge, [pTop, projectPos]);
- LineDraw.updateLine(this.horGuideEdge, [pBtm, projectPos]);
- setEdgeLabel(this.verEdgeLabel, pTop, projectPos);
- setEdgeLabel(this.horEdgeLabel, pBtm, projectPos);
- this.verGuideEdge.visible = this.horGuideEdge.visible = this.shouldShowHorVerGuide;
- this.verEdgeLabel.visible = this.horEdgeLabel.visible = this.shouldShowHorVerGuide;
- }
- if (this.showArea && this.points.length > 2) {
- // update area
- var msg = this.getArea().string;
- msg = this.labelAddName(msg);
- this.areaLabel.setPos(this.getCenter('areaPlaneCenter'));
- this.areaLabel.setText(msg);
- common$1.updateVisible(this.areaLabel, 'setVisible', true); //this.areaLabel.setVisible(true)
- }
- if (this.totalDisLabel) {
- this.ifShowTotalDis();
- common$1.updateVisible(this.totalDisLabel, 'setVisible', this.showTotalDis);
- this.edgeLabels.forEach(function (e) {
- return common$1.updateVisible(e, 'showTotalDis', !_this2.showTotalDis);
- });
- if (this.showTotalDis) {
- var dis = this.getTotalDistance();
- var _msg = this.getConvertString(dis, 'distance');
- _msg = this.labelAddName(_msg);
- this.center = null;
- this.center = this.getCenter();
- this.totalDisLabel.setPos(this.center);
- this.totalDisLabel.setText(_msg);
- }
- }
- {
- var bound = new THREE.Box3();
- this.points.forEach(function (e) {
- return bound.expandByPoint(e);
- });
- var boundSize = new THREE.Vector3();
- bound.getSize(boundSize);
- var boundCenter = new THREE.Vector3();
- bound.getCenter(boundCenter);
- /* let disMap = new Map
- this.points.forEach(e=>disMap.set(e, e.distanceToSquared(boundCenter)))
- let centerPoint = this.points.slice().sort((a,b)=>{return disMap.get(a) - disMap.get(b)})[0] */
- this.boundInfo = {
- bound,
- boundCenter,
- boundSize //centerPoint
- };
- } //如果需要飞向measure的话,就飞到centerPoint的点,并且单独记录一下该点的visiblePanos?
- }
- }, {
- key: "labelAddName",
- value: function labelAddName(msg) {
- var _this$title;
- if ((_this$title = this.title) !== null && _this$title !== void 0 && _this$title.trim()) {
- msg = [this.title, msg];
- }
- return msg;
- }
- }, {
- key: "getArea",
- value: function getArea() {
- var area;
- if (this._area != void 0) {
- area = this._area;
- } else if (this.point2dInfo) {
- area = Math.abs(math$2.getArea(this.point2dInfo.points2d)); //this.getArea();
- } else {
- //mulDistance Ring 2d面
- area = Math.abs(math$2.getArea(this.points));
- }
- var msg = this.getConvertString(area, 'area');
- this.area = {
- value: area,
- string: msg
- };
- return this.area;
- }
- }, {
- key: "getConvertString",
- value: function getConvertString(num, type) {
- var player_ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : player$6;
- return player_.unitConvert.convert(num, type, config$1.precision, this.unitSystem, true, {
- imperial: {
- minFactor: 0.01
- },
- metric: {
- minFactor: 0.01
- }
- });
- }
- }, {
- key: "ifShowTotalDis",
- value: function ifShowTotalDis() {
- var show = this.points.length > 2;
- if (show) {
- var maxDis = 0.15;
- var lastIndex = this.points.length - 1;
- for (var i = 0; i < lastIndex; i++) {
- var len = this.edges[i].distance_;
- if (len > maxDis) {
- show = false;
- break;
- }
- }
- }
- this.showTotalDis = show;
- /* 连续测量:
- 1. ≥2次测量,单个距离<15cm时,居中显示总长, hover、选中时显示每段长度
- 2. 若连续测量的线段中,大于等于1段超出15cm,所有线段均显示长度
- -------------------
- */
- }
- }, {
- key: "setEdgeLabelPos",
- value: function setEdgeLabelPos(label, p1, p2) {
- var center = new THREE.Vector3().addVectors(p1, p2).multiplyScalar(0.5);
- return label.setPos(center);
- }
- }, {
- key: "cloneMarker",
- value: function cloneMarker(cloneIndex, index) {
- return this.addMarker({
- index,
- point: this.points[cloneIndex]
- });
- }
- }, {
- key: "addMarker",
- value: function addMarker() {
- var _this3 = this;
- var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var index = o.index == void 0 ? this.points.length : o.index; //要当第几个
- var marker = o.marker || new Sprite({
- material: this.getMat('markerDefault'),
- sizeInfo: markerSizeInfo,
- name: 'measure_point',
- player: player$6
- }); //common.setObjectLayers(marker, 'measure' )
- marker.pickOrder = marker.renderOrder = RenderOrder.measure.marker;
- marker.markerSelectStates = {};
- marker.addEventListener('drop', function (e) {
- if (e.button != THREE.MOUSE.LEFT) return;
- _this3.lastDropTime = Date.now();
- }); //marker.measure = this
- var edge;
- {
- // edges
- edge = o.edge || LineDraw.createFatLine([], {
- material: this.getMat('edgeDefault')
- });
- edge.pickOrder = RenderOrder.measure.ruler; //能穿墙
- //common.setObjectLayers(edge, 'measure' )
- var addHoverEvent = function addHoverEvent() {
- //当非isNew时才添加事件
- var mouseover = function mouseover(e) {
- _this3.setSelected(true, 'edge');
- };
- var mouseleave = function mouseleave(e) {
- _this3.setSelected(false, 'edge');
- };
- edge.addEventListener('mouseover', mouseover);
- edge.addEventListener('mouseleave', mouseleave);
- edge.removeEventListener('addHoverEvent', addHoverEvent);
- edge.addEventListener('click', function (e) {
- var now = Date.now();
- if (now - _this3.lastDropTime < 100) return; //防止拖拽marker时误触导致focus, 以及点到marker不focus
- _this3.showOptionLabel(true, e.point); //viewer.focusOnObject(this, 'measure') //正在添加测量线时不要focus其他线(容易误触)
- });
- };
- edge.addEventListener('addHoverEvent', addHoverEvent);
- if (!this.isNew) {
- edge.dispatchEvent('addHoverEvent');
- }
- }
- _get(_getPrototypeOf(Measure.prototype), "addMarker", this).call(this, Object.assign(o, {
- index,
- marker,
- edge
- }));
- if (this.showEdges) {
- // edge labels
- var edgeLabel = this.createEdgeLabel('edgeLabel'
- /* , !this.closed */
- );
- this.edgeLabels = [].concat(_toConsumableArray(this.edgeLabels.slice(0, index)), [edgeLabel], _toConsumableArray(this.edgeLabels.slice(index, this.edgeLabels.length)));
- }
- var event = {
- type: 'marker_added',
- measurement: this,
- marker: marker
- };
- this.dispatchEvent(event); //this.setMarker(this.points.length - 1, point);
- this.update({
- index
- }); //更新一下倒数第二条线
- return marker; //add
- }
- }, {
- key: "editStateChange",
- value: function editStateChange(state) {
- var _this4 = this;
- //主要针对edgeLabels显示切换,编辑时显示
- _get(_getPrototypeOf(Measure.prototype), "editStateChange", this).call(this, state);
- if (!state) {
- this.editStateTimer = setTimeout(function () {
- if (!_this4.isEditing) {
- _this4.dispatchEvent({
- type: 'editStateChange',
- state: false
- });
- _this4.setEdgesDisplay(false);
- _this4.areaPlane && common$1.updateVisible(_this4.areaPlane, 'intersectLastLine', true);
- _this4.areaLabel && common$1.updateVisible(_this4.areaLabel, 'intersectLastLine', true);
- }
- }, 100);
- } else {
- if (!this.isEditing) {
- this.dispatchEvent({
- type: 'editStateChange',
- state: true
- });
- this.setEdgesDisplay(true);
- clearTimeout(this.editStateTimer);
- }
- }
- this.isEditing = state;
- }
- }, {
- key: "setMarkerSelected",
- value: function setMarkerSelected(marker, state, hoverObject) {
- //console.warn(marker.id , state, hoverObject)
- marker.markerSelectStates[hoverObject] = state;
- var absoluteState = false;
- for (var i in marker.markerSelectStates) {
- if (marker.markerSelectStates[i] == 'hover') {
- absoluteState = true;
- break;
- }
- }
- if (absoluteState) {
- marker.material = this.getMat('markerSelect');
- marker.renderOrder = marker.pickOrder = RenderOrder.measure.marker + 1;
- } else {
- marker.material = this.getMat('markerDefault');
- marker.renderOrder = marker.pickOrder = RenderOrder.measure.marker;
- }
- marker.selected = absoluteState;
- }
- }, {
- key: "setEdgesDisplay",
- value: function setEdgesDisplay(state, ignoreGuideLine) {
- this.closed && this.edgeLabels.forEach(function (e) {
- return common$1.updateVisible(e, 'hover', state);
- });
- if (this.measureType.includes('MulDistance')
- /* this.totalDisLabel && !viewer.screenshoting */
- ) {
- this.edgeLabels.forEach(function (e) {
- return common$1.updateVisible(e, 'hover', state, 1, state ? 'add' : 'cancel');
- });
- common$1.updateVisible(this.totalDisLabel, 'hover', !state);
- }
- if (!this.horVerShowAlways && !ignoreGuideLine && this.measureType == 'Distance') {
- this.horEdgeLabel.visible = this.verEdgeLabel.visible = this.horGuideEdge.visible = this.verGuideEdge.visible = !!(state && this.shouldShowHorVerGuide);
- }
- }
- }, {
- key: "setSelected",
- value: function setSelected(state, hoverObject) {
- var _this5 = this;
- //add
- //console.log('setSelected',state, hoverObject)
- var absoluteState = !!state;
- if (hoverObject) {
- //如果没有hoverObject且state为false 就强制取消选中态
- this.selectStates[hoverObject] = state;
- for (var i in this.selectStates) {
- if (this.selectStates[i]) {
- absoluteState = true;
- break;
- }
- }
- }
- if (absoluteState) {
- this.markers.forEach(function (e) {
- return _this5.setMarkerSelected(e, 'hover', 'selectAll');
- });
- this.edges.forEach(function (e) {
- e.renderOrder = RenderOrder.measure.marker - 1;
- e.material = _this5.getMat('edgeSelect');
- });
- this.areaPlane && (this.areaPlane.material = this.getMat('planeSelected')); //this.areaLabel && this.areaLabel.elem.addClass('highLight')
- //this.closed || this.edgeLabels.forEach(e=>e.elem.addClass('highLight') )
- this.setEdgesDisplay(true, hoverObject == 'screenshot');
- this.areaLabel && setLabelHightState(this.areaLabel, true);
- this.closed || this.edgeLabels.forEach(function (e) {
- return setLabelHightState(e, true);
- });
- } else {
- this.markers.forEach(function (e) {
- return _this5.setMarkerSelected(e, 'unhover', 'selectAll');
- });
- this.edges.forEach(function (e) {
- return e.material = _this5.getMat('edgeDefault');
- });
- this.areaPlane && (this.areaPlane.material = this.getMat('planeDefault'));
- this.setEdgesDisplay(false, hoverObject == 'screenshot'); //this.areaLabel && this.areaLabel.elem.removeClass('highLight')
- //this.closed || this.edgeLabels.forEach(e=>e.elem.removeClass('highLight') )
- this.areaLabel && setLabelHightState(this.areaLabel, false);
- this.closed || this.edgeLabels.forEach(function (e) {
- return setLabelHightState(e, false);
- });
- }
- this.selected = absoluteState;
- if (hoverObject != 'byList') {
- this.dispatchEvent({
- type: 'highlight',
- state: this.selected
- }); //列表高亮
- }
- }
- }, {
- key: "removeMarker",
- value: function removeMarker(index) {
- _get(_getPrototypeOf(Measure.prototype), "removeMarker", this).call(this, index);
- var edgeIndex = index; //(index === 0) ? 0 : (index - 1);
- if (this.edgeLabels[edgeIndex]) {
- this.edgeLabels[edgeIndex].dispose();
- this.edgeLabels.splice(edgeIndex, 1);
- }
- this.closed || this.points.length && (this.edges[this.points.length - 1].visible = false);
- this.update({
- index: this.getIndex(index, -1)
- });
- this.dispatchEvent({
- type: 'marker_removed',
- measurement: this
- });
- }
- }, {
- key: "setPosition",
- value: function setPosition(index, position) {
- _get(_getPrototypeOf(Measure.prototype), "setPosition", this).call(this, index, position);
- var event = {
- type: 'marker_moved',
- measure: this,
- index: index,
- position: position.clone()
- };
- this.dispatchEvent(event);
- }
- }, {
- key: "dispose",
- value: function dispose() {
- //add
- var labels = this.edgeLabels.concat(this.coordinateLabels);
- this.areaLabel && labels.push(this.areaLabel);
- labels.forEach(function (e) {
- return e.dispose();
- });
- _get(_getPrototypeOf(Measure.prototype), "dispose", this).call(this);
- this.dispatchEvent('disposed');
- }
- }, {
- key: "getAngleBetweenLines",
- value: function getAngleBetweenLines(cornerPoint, point1, point2) {
- var v1 = new THREE.Vector3().subVectors(point1, cornerPoint);
- var v2 = new THREE.Vector3().subVectors(point2, cornerPoint); // avoid the error printed by threejs if denominator is 0
- var denominator = Math.sqrt(v1.lengthSq() * v2.lengthSq());
- if (denominator === 0) {
- return 0;
- } else {
- return v1.angleTo(v2);
- }
- }
- }, {
- key: "getAngle",
- value: function getAngle(index) {
- if (this.points.length < 3 || index >= this.points.length) {
- return 0;
- }
- var previous = index === 0 ? this.points[this.points.length - 1] : this.points[index - 1];
- var point = this.points[index];
- var next = this.points[(index + 1) % this.points.length];
- return this.getAngleBetweenLines(point, previous, next);
- }
- }, {
- key: "createGuideLine",
- value: function createGuideLine() {
- //add 辅助线
- var guideLine = LineDraw.createFatLine([], {
- material: this.getMat('edgeGuide')
- });
- guideLine.visible = false;
- this.guideLine = guideLine;
- this.add(guideLine);
- }
- }, {
- key: "createHorVerGuideLine",
- value: function createHorVerGuideLine() {
- //创建水平与垂直辅助线,仅距离测量有。
- var verGuideEdge = LineDraw.createFatLine([], {
- material: this.getMat('edgeGuide')
- });
- verGuideEdge.visible = false;
- this.verGuideEdge = verGuideEdge;
- verGuideEdge.name = 'verGuideEdge';
- var horGuideEdge = LineDraw.createFatLine([], {
- material: this.getMat('edgeGuide')
- });
- horGuideEdge.visible = false;
- horGuideEdge.name = 'horGuideEdge';
- this.horGuideEdge = horGuideEdge;
- this.add(this.verGuideEdge);
- this.add(this.horGuideEdge); //label:
- this.verEdgeLabel = this.createEdgeLabel('verGuideEdge');
- this.horEdgeLabel = this.createEdgeLabel('horGuideEdge');
- }
- }, {
- key: "createEdgeLabel",
- value: function createEdgeLabel(name
- /* , hasHoverEvent */
- ) {
- var _this6 = this;
- var inf = {
- sizeInfo: labelSizeInfo,
- name: name || 'edgeLabel',
- player: player$6
- };
- if (name && name.includes('Guide')) {
- inf.fontsize = 12;
- }
- var edgeLabel = new TextSprite(Object.assign({}, subLabelProp,
- /* hasHoverEvent ? mainLabelProp : subLabelProp, */
- inf));
- var addHoverEvent = function addHoverEvent() {
- edgeLabel.addEventListener('mouseover', function () {
- _this6.setSelected(true, 'edgeLabel');
- });
- edgeLabel.addEventListener('mouseleave', function () {
- _this6.setSelected(false, 'edgeLabel');
- });
- edgeLabel.addEventListener('click', function (e) {
- /* e.button == THREE.MOUSE.LEFT && */
- _this6.showOptionLabel(true, e.point);
- });
- };
- edgeLabel.addEventListener('addHoverEvent', addHoverEvent);
- edgeLabel.visible = false;
- edgeLabel.measure = this; //common.setObjectLayers(edgeLabel, 'measure' )
- this.add(edgeLabel);
- return edgeLabel;
- }
- }, {
- key: "createAreaLabel",
- value: function createAreaLabel() {
- var areaLabel = this.createCenterLabel('areaLabel');
- return areaLabel;
- }
- }, {
- key: "createTotalDisLabel",
- value: function createTotalDisLabel() {
- var totalDisLabel = this.createCenterLabel('totalDisLabel');
- return totalDisLabel;
- }
- }, {
- key: "createCenterLabel",
- value: function createCenterLabel(name) {
- var _this7 = this;
- var centerLabel = new TextSprite(Object.assign({}, mainLabelProp, {
- sizeInfo: labelSizeInfo,
- name,
- transform2D: null,
- fontsize: 16 * textSizeRatio
- }));
- centerLabel.addEventListener('mouseover', function () {
- _this7.isNew || _this7.setSelected(true, 'centerLabel');
- });
- centerLabel.addEventListener('mouseleave', function () {
- _this7.isNew || _this7.setSelected(false, 'centerLabel');
- });
- centerLabel.addEventListener('click', function () {
- _this7.isNew || viewer.measuringTool.isAdding || viewer.focusOnObject(_this7, 'measure');
- }); //common.setObjectLayers(centerLabel, 'measure' )
- common$1.updateVisible(centerLabel, 'setVisible', false);
- return centerLabel;
- }
- }, {
- key: "getMat",
- value: function getMat(name) {
- if (!Measure.Mats) {
- //不变色的部分
- {
- markerMaps = [texLoader.load(texture.getImageURL('images/whiteCircle.png')), //pic_point_s32
- texLoader.load(texture.getImageURL('images/pic_point32.png'))];
- markerMaps.forEach(function (map) {
- map.repeat.set(1 / markerMapShrink, 1 / markerMapShrink);
- map.offset.set((markerMapShrink - 1) / 2 / markerMapShrink, (markerMapShrink - 1) / 2 / markerMapShrink);
- });
- markerMaps[0].minFilter = 1006; //禁黑边
- markerMaps[1].minFilter = 1006;
- }
- Measure.Mats = {
- edgeGuide: LineDraw.createFatLineMat({
- color: config$1.guide.color,
- dashSize: 0.1,
- gapSize: 0.02,
- dashed: true,
- lineWidth: config$1.lineWidth / 2
- }),
- edgeDefault: LineDraw.createFatLineMat({
- color: config$1.default.color,
- lineWidth: config$1.lineWidth,
- /* dashed :true,
- dashSize : 0.04,
- gapSize: 0.04, */
- transparent: true,
- opacity: config$1.default.opacity
- }),
- edgeSelect: LineDraw.createFatLineMat({
- color: config$1.highlight.color,
- //'#f0ff00',
- dashSize: 0.5,
- gapSize: 0.2,
- lineWidth: config$1.lineWidth,
- transparent: true,
- opacity: config$1.highlight.opacity
- }),
- guide: LineDraw.createFatLineMat({
- color: config$1.guide.color,
- dashSize: 0.1,
- gapSize: 0.02,
- dashed: true,
- lineWidth: config$1.lineWidth / 2
- }),
- markerDefault: new THREE.MeshBasicMaterial({
- transparent: !0,
- opacity: 1,
- map: markerMaps[0],
- color: config$1.default.color,
- depthTest: false //mapScale: markerMapShrink
- }),
- markerSelect: new THREE.MeshBasicMaterial({
- //BasicMaterial
- transparent: !0,
- opacity: 1,
- depthTest: false,
- map: markerMaps[1],
- depthTest: false
- }),
- planeDefault: new THREE.MeshBasicMaterial({
- color: config$1.default.color,
- side: THREE.DoubleSide,
- opacity: 0.2,
- transparent: true,
- depthTest: false
- }),
- planeSelected: new THREE.MeshBasicMaterial({
- color: config$1.default.color,
- side: THREE.DoubleSide,
- opacity: 0.3,
- transparent: true,
- depthTest: false
- })
- };
- }
- var mat = Measure.Mats[name];
- return mat;
- }
- }, {
- key: "createAreaPlane",
- value: function createAreaPlane() {
- return _get(_getPrototypeOf(Measure.prototype), "createAreaPlane", this).call(this, this.getMat('planeDefault'));
- }
- }, {
- key: "raycast",
- value: function raycast(raycaster, intersects) {
- for (var i = 0; i < this.points.length; i++) {
- var marker = this.markers[i];
- marker.raycast(raycaster, intersects);
- } // recalculate distances because they are not necessarely correct
- // for scaled objects.
- // see https://github.com/mrdoob/three.js/issues/5827
- // TODO: remove this once the bug has been fixed
- for (var _i = 0; _i < intersects.length; _i++) {
- var I = intersects[_i];
- I.distance = raycaster.ray.origin.distanceTo(I.point);
- }
- intersects.sort(function (a, b) {
- return a.distance - b.distance;
- });
- }
- }, {
- key: "transformData",
- value: function transformData(prop) {
- if (prop.measureType == 'Point') {
- prop.showCoordinates = true, prop.closed = true, prop.maxMarkers = 1, prop.minMarkers = 1;
- } else if (prop.measureType == 'Distance') {
- prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2;
- } else if (prop.measureType == 'MulDistance') {
- prop.showDistances = true, prop.showEdges = true, prop.minMarkers = 2, prop.atPlane = true; //因为在点击最后一个点后要变成闭合面积,所以必须在同一平面
- } else if (prop.measureType == 'MulDistance Ring') {
- prop.showDistances = true, prop.showEdges = true, prop.showArea = true, prop.closed = true, prop.minMarkers = 3;
- } else if (prop.measureType == 'Ver MulDistance') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.minMarkers = 2;
- prop.faceDirection = 'vertical';
- prop.unableDragAtMap = true;
- } else if (prop.measureType == 'Hor MulDistance') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.minMarkers = 2;
- prop.faceDirection = 'horizontal';
- } else if (prop.measureType == 'Ver Distance') {
- prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2, prop.faceDirection = 'vertical';
- prop.unableDragAtMap = true;
- } else if (prop.measureType == 'Hor Distance') {
- prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2, prop.faceDirection = 'horizontal';
- } else if (prop.measureType == 'Area') {
- prop.showDistances = true, prop.atPlane = true;
- prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
- } else if (prop.measureType == 'Hor Area') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
- prop.faceDirection = 'horizontal';
- } else if (prop.measureType == 'Ver Area') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
- prop.faceDirection = 'vertical';
- prop.unableDragAtMap = true;
- } else if (prop.measureType == 'Rect Area') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
- prop.maxMarkers = 4;
- } else if (prop.measureType == 'Hor Rect Area') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
- prop.maxMarkers = 4;
- prop.isRect = true;
- prop.faceDirection = 'horizontal';
- } else if (prop.measureType == 'Ver Rect Area') {
- prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
- prop.maxMarkers = 4;
- prop.isRect = true;
- prop.faceDirection = 'vertical';
- prop.unableDragAtMap = true;
- }
- if (prop.atPlane && prop.closed) {
- //atPlane在同一平面上
- prop.showArea = true;
- }
- _get(_getPrototypeOf(Measure.prototype), "transformData", this).call(this, prop);
- }
- }, {
- key: "setUnitSystem",
- value: function setUnitSystem(unitSystem) {
- //console.log(this.name +':' +this.unitSystem)
- if (unitSystem != this.unitSystem) {
- this.unitSystem = unitSystem;
- this.update();
- }
- }
- }, {
- key: "reDraw",
- value: function reDraw() {
- var restMarkerCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- //重新开始画
- _get(_getPrototypeOf(Measure.prototype), "reDraw", this).call(this, restMarkerCount);
- if (this.measureType == 'Distance') {
- this.shouldShowHorVerGuide = false;
- this.setEdgesDisplay(false);
- }
- if (this.showArea) {
- this.area = {
- value: 0
- };
- this.areaLabel && common$1.updateVisible(this.areaLabel, 'setVisible', false);
- }
- if (this.totalDisLabel && this.showTotalDis) {
- common$1.updateVisible(this.totalDisLabel, 'setVisible', false);
- }
- }
- }, {
- key: "changeToArea",
- value: function changeToArea() {
- this.setEdgesDisplay(false); //hide label
- this.closed = true;
- this.measureType = 'Area';
- this.showArea = true;
- this.areaLabel = this.createAreaLabel();
- this.add(this.areaLabel);
- this.areaPlane = this.createAreaPlane();
- this.add(this.areaPlane);
- }
- }]);
- return Measure;
- }(ctrlPolygon);
- Measure.prototype.showOptionLabel = function () {
- var _MeasureRuler$prototy;
- this.player = player$6;
- if (this.isNew || measuringTool$1.isAdding) return;
- (_MeasureRuler$prototy = MeasureRuler.prototype.showOptionLabel).call.apply(_MeasureRuler$prototy, [this].concat(Array.prototype.slice.call(arguments), [false]));
- };
- Measure.prototype.updateOptionPos = function () {
- MeasureRuler.prototype.updateOptionPos.call(this);
- };
- function setLabelHightState(label, state) {
- if (state) {
- new THREE.Color(config$1.highlight.color);
- label.sprite.material.useDepth = false;
- } else {
- label.sprite.material.useDepth = true;
- }
- label.updateTexture();
- }
- 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); }; }
- 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; } }
- /*
- 测量线。
- 线段是三维的、但长度文字是二维的。由于文字label显示在线段可见部分的中心,所以仍需要找到线段的二维端点。
- */
- var _color = Colors.mainColor;
- var ball = new THREE.Mesh(new THREE.SphereBufferGeometry(0.01, 10, 10), new THREE.MeshBasicMaterial({
- color: _color,
- depthTest: false,
- transparent: true
- }));
- var lineMat = LineDraw.createFatLineMat({
- linewidth: 3,
- color: _color
- /*, alwaysShow: true*/
- });
- var MeasureRuler = /*#__PURE__*/function (_THREE$Mesh) {
- _inherits(MeasureRuler, _THREE$Mesh);
- var _super = _createSuper$8(MeasureRuler);
- function MeasureRuler(o, player) {
- var _this;
- _classCallCheck(this, MeasureRuler);
- _this = _super.call(this);
- _this.setPoints = function (p) {
- this.points = p;
- };
- _this.player = player; //this.sid = o.sid;
- _this.setPoints(o.points);
- _this.visiblePanos = o.visiblePanos;
- _this.initVisiblePanos();
- _this.elem = document.createElement('div');
- _this.elem.className = 'ruler measure';
- _this.elem.setAttribute('data-name', '');
- _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>')
- document.querySelector('.widgets-rulers').append(_this.elem);
- _this.setUnitSystem(o.unit || player.unitConvert.UnitService.defaultSystem); //this.text = o.text || ''
- _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')
- _this.text = _this.getConvertString(_this.length, 'distance', player);
- _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 ");
- _this.name = 'measureRuler';
- _this.balls = [ball.clone(), ball.clone()];
- _this.balls[0].position.copy(_this.points[0]);
- _this.balls[1].position.copy(_this.points[1]);
- _this.balls[0].renderOrder = _this.balls[1].renderOrder = RenderOrder.measure.ruler; //在videoSkybox、videoOverlay之上
- _this.add(_this.balls[0]);
- _this.add(_this.balls[1]);
- _this.line = LineDraw.createFatLine([_this.points[0], _this.points[1]], {
- material: lineMat
- });
- _this.line.renderOrder = RenderOrder.measure.ruler;
- _this.add(_this.line);
- _this.boldLine = LineDraw.createBoldLine(_this.points, {
- mat: new THREE.MeshBasicMaterial({
- wireframe: true,
- opacity: 0,
- transparent: true,
- depthTest: false,
- color: _color
- }),
- type: 'init'
- }, _this.player);
- _this.boldLine.parentRuler = _assertThisInitialized(_this);
- _this.add(_this.boldLine);
- _this.player.model.measureRulers.add(_assertThisInitialized(_this));
- _this.player.$app.config.vrFishTemp && (_this.getPosAtSphere(_this.player.currentPano.position), _this.updateBoldLine());
- {
- var vrSplitScreen;
- _this.events = {
- updatePano: function updatePano() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- _this.updateVisible(e.targetPano);
- if (_this.state == 'active') {
- _this.updateBoldLine();
- }
- },
- updateVR: function updateVR(e) {
- var vrSplitScreen0 = settings$3.vrEnabled && settings$3.vrSplitScreen;
- if (vrSplitScreen0 != vrSplitScreen) {
- //vr 横屏要隐藏
- if (vrSplitScreen0) {
- _this.state = 'vrSplitScreen'; //console.log('横屏要隐藏')
- _this.update();
- } else {
- //console.log('恢复')
- _this.events.updatePano();
- }
- vrSplitScreen = vrSplitScreen0;
- }
- }
- };
- _this.player.on('flying.ended', _this.events.updatePano);
- _this.player.on('vrStateChanged', _this.events.updateVR);
- }
- return _this;
- }
- return MeasureRuler;
- }(THREE.Mesh);
- MeasureRuler.prototype.initVisiblePanos = function () {
- var _this2 = this;
- //设置一下可见的panos。 规则:1线所穿越的所有房间都可见。2如果可以的话,其他能透过门看到线的地方最好也可见。
- var roomInfo = this.player.model.wallManager.roomInfo;
- if (!roomInfo) return;
- if (this.player.model.wallManager.version == 2) {
- var A = this.points[0].clone().setY(0),
- B = this.points[1].clone().setY(0); //为了防止点在地板以下或者屋顶以上,所以高度置0
- var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, A.distanceTo(B));
- var o = ray.intersectObjects(this.player.model.chunks); //因为新版没有房间(虽然有新的hole或柱子,但是太复杂了。所以就直接求这条线和模型的交点,所有看得到交点的位置都可见。
- for (var i = 0; i < o.length; i++) {
- var pos = o[i].point.clone();
- var panos = convertTool.getVisiblePano(pos, this.player.model);
- this.visiblePanos = this.visiblePanos.concat(panos.filter(function (pano) {
- return _this2.visiblePanos.indexOf(pano) == -1;
- }));
- }
- } else {
- var p1 = new THREE.Vector2(this.points[0].x, this.points[0].z);
- var p2 = new THREE.Vector2(this.points[1].x, this.points[1].z);
- var p1p2 = [p1, p2];
- /* for(let i=0;i<roomInfo.length;i++){
- if(!point1Room && math.isPointInArea(roomInfo[i].points, p1)){
- point1Room = i; console.log("端点房间 "+i)
- }
- if(!point2Room && math.isPointInArea(roomInfo[i].points, p2)){
- point2Room = i; console.log("端点房间 "+i)
- }
- } */
- for (var _i = 0; _i < roomInfo.length; _i++) {
- //if(i == point1Room || i == point2Room)continue; //由于两个端点的可见panos是通过tag有无遮挡mesh求出来的, 所以会少一些该房间的点,但同时也会多一些其他房间透过门看到的点。所以需要tag求出的也需要将其所在房间点加入。
- for (var j = 0, len = roomInfo[_i].points.length; j < len; j++) {
- var p3p4 = [{
- x: roomInfo[_i].points[j].x,
- y: roomInfo[_i].points[j].y
- }, {
- x: roomInfo[_i].points[(j + 1) % len].x,
- y: roomInfo[_i].points[(j + 1) % len].y
- }];
- if (math$2.isLineIntersect(p1p2, p3p4)) {
- roomInfo[_i].panos.forEach(function (p) {
- if (_this2.visiblePanos.indexOf(p) == -1) _this2.visiblePanos.push(p);
- });
- console.log('加入房间 ' + _i);
- break;
- }
- }
- }
- }
- };
- MeasureRuler.prototype.dispose = function () {
- this.parent.remove(this);
- this.elem.remove();
- this.player.off('flying.ended', this.events.updatePano);
- this.player.off('vrStateChanged', this.events.updateVR);
- };
- MeasureRuler.prototype.updateBoldLine = function () {
- if (this.player.$app.config.vrFishTemp) {
- LineDraw.updateBoldLine(this.boldLine, this.fishPoints, 'moveAndRotate');
- } else {
- LineDraw.updateBoldLine(this.boldLine, this.points, 'update');
- }
- };
- MeasureRuler.prototype.showOptionLabel = function (show, pos) {
- var atLine = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
- if (show) {
- this.player.chosenMeasureRuler = this;
- atLine && (pos = math$2.getFootPoint(pos, this.points[0], this.points[1])); //将点做垂线映射到线
- this.optionLabelPos = pos; //三维位置
- document.querySelector('.widgets-design-option').style.display = '';
- this.updateOptionPos();
- } else {
- this.player.chosenMeasureRuler = null;
- document.querySelector('.widgets-design-option').style.display = 'none';
- this.optionLabelPos = null;
- }
- };
- MeasureRuler.prototype.updateOptionPos = function () {
- //更新optionLabel的位置
- if (!this.optionLabelPos) return;
- var pos2d = convertTool.getPos2d(this.optionLabelPos, this.player, this.player.camera);
- var widgetsDesignOption = document.querySelector('.widgets-design-option');
- var delRulerBtn = document.querySelector('.widgets-design-option div');
- if (pos2d.trueSide) {
- delRulerBtn.className.replace('hide', '');
- delRulerBtn.style.left = pos2d.pos.x + 'px';
- delRulerBtn.style.top = pos2d.pos.y + 'px';
- if (pos2d.vector.x > 0) {
- widgetsDesignOption.className.replace('right', '');
- } else {
- widgetsDesignOption.className.indexOf('right') < 0 && (widgetsDesignOption.className += ' right');
- }
- } else {
- delRulerBtn.className.indexOf('hide') < 0 && (delRulerBtn.className += ' hide');
- }
- };
- MeasureRuler.prototype.getCrossPoint = function (posIn, posOut) {
- //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
- var W = this.player.domElement.clientWidth;
- var H = this.player.domElement.clientHeight;
- var x, y, border;
- var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
- var getX = function getX(y) {
- return r * (y - posIn.y) + posIn.x;
- };
- var getY = function getY(x) {
- return 1 / r * (x - posIn.x) + posIn.y;
- };
- if (posOut.x > W || posOut.x < 0) {
- //x超出的情况
- if (posOut.x > W) border = W;else border = 0;
- if (posOut.y < 0 || posOut.y > H) {
- //y也超出
- if (posOut.y < 0) y = 0;else y = H;
- x = getX(y);
- if (x > W || x < 0) {
- x = border;
- y = getY(x);
- }
- } else {
- x = border;
- y = getY(x);
- }
- } else {
- //只有y超出,x没有超出
- if (posOut.y < 0) y = 0;else y = H;
- x = getX(y);
- }
- return new THREE.Vector2(x, y);
- };
- MeasureRuler.prototype.getPosInCrossPoint = function (p1, aim) {
- //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
- var W = this.player.domElement.clientWidth;
- var H = this.player.domElement.clientHeight;
- return math$2.getCrossPointAtRect(p1, aim, W, H, 0, 0);
- };
- MeasureRuler.prototype.getPosAtSphere = function (toPos, useDistance) {
- //fish
- this.fishPoints = [];
- var points = [];
- this.points.forEach(function (p, index) {
- var pos = convertTool.getPosAtSphere(p.clone(), toPos);
- this.fishPoints.push(pos);
- points.push(pos.x, pos.y, pos.z);
- this.balls[index].position.copy(pos);
- var s = Constants.skyRadius / toPos.distanceTo(p);
- this.balls[index].scale.set(s, s, s);
- }.bind(this));
- LineDraw.moveFatLine(this.line, points);
- };
- var reTryCount = 1;
- MeasureRuler.prototype.getPosInScreen = function (p1, p2, count) {
- // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
- var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
- var pos2d = convertTool.getPos2d(center, this.player);
- if (pos2d.trueSide) {
- var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
- if (pos2d.inSight) {
- pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
- pos2d.vector = null;
- /* console.log("pos2d.inSight") */
- } //要求它在边界上的点才行,否则范围被缩小
- return {
- result: 'p1p2',
- p1: visi,
- p2: pos2d
- };
- } else {
- if (count + 1 > reTryCount) return; //最多重复次数
- var trueSide = p1.pos2d.trueSide ? p1 : p2;
- return this.getPosInScreen(trueSide, {
- point: center,
- pos2d: pos2d
- }, ++count);
- }
- };
- MeasureRuler.prototype.updateVisible = function () {
- var currentPano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.player.currentPano;
- if (this.player.mode == 'panorama' ? this.visiblePanos.indexOf(currentPano) > -1 : this.player.mode != 'floorplan') {
- common$1.updateVisible(this, 'atVisiPano', true); //this.state = 'active'
- } else {
- common$1.updateVisible(this, 'atVisiPano', false); //this.state = 'unable'
- }
- };
- MeasureRuler.prototype.update = function () {
- /* if (this.player.mode != 'panorama' || this.state != 'active') {
- this.elem.style.display = 'none'
- this.group.visible = false
- return
- } */
- if (!this.realVisible()) {
- this.elem.style.display = 'none';
- return;
- } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
- var p1 = convertTool.getPos2d(this.points[0], this.player);
- var p2 = convertTool.getPos2d(this.points[1], this.player);
- var centerX, centerY;
- var W = this.player.domElement.clientWidth,
- H = this.player.domElement.clientHeight;
- if (!p1.trueSide || !p2.trueSide) {
- //只要有一个是背面点,就不让线段可见。
- if (!p1.trueSide && !p2.trueSide) {
- //这种情况一般都是线段背离相机了,基本不用考虑
- this.elem.style.display = 'none';
- return;
- }
- var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
- {
- point: this.points[0],
- pos2d: p1
- }, {
- point: this.points[1],
- pos2d: p2
- }, 0);
- if (!retry) {
- this.elem.style.display = 'none';
- return;
- }
- p1 = retry.p1;
- p2 = retry.p2;
- }
- var pos1 = p1.pos,
- pos2 = p2.pos;
- var len = pos1.distanceTo(pos2);
- if (len == 0) {
- console.warn('ruler间距为0!');
- return;
- } //更新label箭头的中心位置
- if (!p1.inSight || !p2.inSight) {
- var pos1inSight, pos2inSight; //屏幕可见线段端点。
- if (!p1.inSight) {
- //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
- pos1inSight = this.getCrossPoint(pos2, pos1);
- } else {
- pos1inSight = pos1.clone();
- }
- if (!p2.inSight) {
- pos2inSight = this.getCrossPoint(pos1, pos2);
- } else {
- pos2inSight = pos2.clone();
- }
- var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
- centerX = center.x;
- centerY = center.y;
- if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
- //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
- this.elem.style.display = 'none'; //this.group.visible = false
- return;
- } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
- var ratio;
- if (pos2.x == pos1.x) {
- if (pos2.y == pos1.y) {
- console.warn('pos1和2一样???');
- return;
- } else {
- if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
- }
- } else {
- if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
- else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
- }
- if (ratio < 0 || ratio > 1) {
- this.elem.style.display = 'none';
- return;
- } //如果ratio超出范围,说明可见中心脱离线段
- } else {
- centerX = (pos1.x + pos2.x) / 2;
- centerY = (pos1.y + pos2.y) / 2;
- } //更新label的方向是左侧还是右侧
- this.elem.style.display = '';
- var ruler = this.elem.querySelector('.ruler-label');
- if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
- if (ruler.className.indexOf('reverse') < 0) ruler.className += ' reverse';
- } else {
- if (ruler.className.indexOf('reverse') >= 0) ruler.className = ruler.className.replace('reverse', '');
- }
- ruler.style.left = centerX + 'px';
- ruler.style.top = centerY + 'px';
- };
- MeasureRuler.prototype.getConvertString = Measure.prototype.getConvertString;
- MeasureRuler.prototype.setUnitSystem = Measure.prototype.setUnitSystem;
- 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); }; }
- 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; } }
- new THREE.TextureLoader();
- var circleGeo = new THREE.CircleGeometry(1, 100);
- var sphereGeo = new THREE.SphereBufferGeometry(0.01, 6, 6);
- /* const radius_ = 0.2; //当相机离目标位置的距离>magDistance_时,希望看到的视野的半径
- const maxFov = THREE.Math.radToDeg(Math.atan(radius_ / magDisMin )) * 2//提前计算出当相机离目标位置的距离<magDisMin时的fov,均使用=magDisMin时的fov。只要保证该fov大于主相机的fov就会有放大效果
- */
- var w = 230 / 1.43;
- var maxPX = 1366 * 1024; //ipad pro. 大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
- var width2dPX = Math.round(window.devicePixelRatio >= 2 ? (window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio / 1.2 : window.devicePixelRatio / 1.5) * w : w); //触屏或高分辨率的可能要放大些。但在手机上不能太大
- //console.log('width2dPX', width2dPX)
- var player$5, sceneRenderer;
- var Magnifier = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Magnifier, _THREE$Object3D);
- var _super = _createSuper$7(Magnifier);
- //放大镜or望远镜
- function Magnifier(player_, sceneRenderer_) {
- var _this;
- _classCallCheck(this, Magnifier);
- player$5 = player_, sceneRenderer = sceneRenderer_;
- _this = _super.call(this);
- _this.width = _this.height = width2dPX;
- /* * window.devicePixelRatio */
- _this.camera = new THREE.PerspectiveCamera(50, 1, 0.01, 10000); //fov aspect near far
- _this.lastZ = 0;
- common$1.setCameraLayers(_this.camera, [
- /* 'DEFAULT', 'PANOMARKERS' , */
- 'SKYBOX', 'MODEL', 'magnifierContent']); //暂时加上DEFAULT //this.raycaster.layers.enable(RenderLayers.PANOMARKERS)
- _this.renderTarget = new THREE.WebGLRenderTarget(_this.width, _this.height, {
- minFilter: THREE.LinearFilter,
- magFilter: THREE.LinearFilter,
- format: THREE.RGBAFormat
- });
- _this.mesh = new THREE.Mesh(circleGeo, new THREE.MeshBasicMaterial({
- side: THREE.DoubleSide,
- map: _this.renderTarget.texture,
- transparent: true,
- depthTest: !1,
- depthWrite: !1
- }));
- _this.overlayMesh = new THREE.Mesh(circleGeo, new THREE.MeshBasicMaterial({
- side: THREE.DoubleSide,
- map: common$1.loadTextureFromCache(texture.getImageURL('images/crosshair.png')),
- transparent: true,
- depthTest: !1,
- depthWrite: !1
- }));
- _this.targetPoint = new THREE.Object3D();
- _this.targetPoint.add(new THREE.Mesh(sphereGeo, new THREE.MeshBasicMaterial({
- color: '#ff0000',
- transparent: true,
- opacity: 0.6
- })));
- _this.targetPoint.add(new THREE.Mesh(sphereGeo, new THREE.MeshBasicMaterial({
- color: '#ff0000',
- transparent: true,
- opacity: 0.2,
- depthTest: false //被遮挡层
- })));
- _this.targetPoint.name = 'magnifierPointTarget';
- sceneRenderer.scene.add(_this.targetPoint);
- common$1.setObjectLayers(_this.targetPoint, 'magnifierContent');
- _this.add(_this.mesh);
- _this.add(_this.overlayMesh);
- _this.position.set(-1000, -1000, -100000); //令它看不见
- _this.mesh.renderOrder = RenderOrder.magnifier;
- _this.overlayMesh.renderOrder = RenderOrder.magnifier + 1;
- /* this.mesh.layers.set(Potree.config.renderLayers.magnifier);
- this.overlayMesh.layers.set(Potree.config.renderLayers.magnifier); */
- /* player.on('update', e => {
- if (e.lastFrameChanged) this.update()
- }) */
- sceneRenderer.scene.add(_assertThisInitialized(_this));
- return _this;
- }
- _createClass(Magnifier, [{
- key: "setDisplay",
- value: function setDisplay(show) {
- common$1.updateVisible(this, 'display', show); //界面开关
- /* if(show){
- sceneRenderer.addComponent(this)
- }else{
- sceneRenderer.removeComponent(this)
- } */
- } //注意:在鼠标没有移动的时候,无法获取到最新的intersect, 放大镜内的内容可能是错误的。全景模式下更奇怪,原因未知
- }, {
- key: "update",
- value: function update(aimPos, mouse) {
- var _player$cameraControl;
- //相机靠近 navvis的做法
- /* var dontRender = this.dontRender || (!(aimPos instanceof THREE.Vector3) && player.flying)
- aimPos = aimPos instanceof THREE.Vector3 ? aimPos : this.aimPos */
- var dontRender = this.dontRender || player$5.flying || !mouse && !(aimPos instanceof THREE.Vector3);
- var playerCamera = (_player$cameraControl = player$5.cameraControls.activeControl) === null || _player$cameraControl === void 0 ? void 0 : _player$cameraControl.camera;
- if (!playerCamera) return;
- if (mouse && !(aimPos instanceof THREE.Vector3)) {
- aimPos = new THREE.Vector3(mouse.x, mouse.y, this.lastZ).unproject(playerCamera);
- }
- if (!aimPos || !this.visible) return;
- var playerPos = playerCamera.position; //viewer.scene.view.getPivot()
- playerPos.distanceTo(aimPos);
- var dirToCamera = new THREE.Vector3().subVectors(playerPos, aimPos).normalize();
- var finalDisToAim = 0.4; //dis>magDisMin ? dis > fareast ? magDisMax : (dis-magDisMin) / (fareast-magDisMin) * (magDisMax-magDisMin) + magDisMin : dis / 2; //dis>magDistance_ ? magDistance_ : dis / 2;
- this.camera.fov = Math.max(25, playerCamera.fov * 0.5);
- this.camera.updateProjectionMatrix();
- this.camera.position.copy(aimPos).add(dirToCamera.multiplyScalar(finalDisToAim));
- this.camera.lookAt(aimPos); //自身位置
- var pos2d_ = convertTool.getPos2d(aimPos, player$5); //更新目标点的实时二维位置
- var pos2d = pos2d_.vector;
- var margin = width2dPX * 1.1 / (player$5.domElement.clientHeight * window.devicePixelRatio) * 2; //确保到鼠标的间距占放大镜的比例不变(检查mobile、上下分屏后的变化)
- var screenPos = pos2d.clone().setY(pos2d.y + (pos2d.y > 0 ? -margin : margin));
- var newPos = new THREE.Vector3(screenPos.x, screenPos.y, 0.8).unproject(playerCamera); //z:-1朝外
- var dir = newPos.clone().sub(playerPos).normalize().multiplyScalar(10); //这个数值要大于playerCamera.near
- this.position.copy(playerPos.clone().add(dir));
- this.quaternion.copy(playerCamera.quaternion);
- var s = finalDisToAim * this.camera.fov / 30;
- this.targetPoint.position.copy(aimPos);
- this.targetPoint.scale.set(s, s, s);
- this.aimPos = aimPos;
- var scale = math$2.getScaleForConstantSize({
- width2d: width2dPX,
- position: this.getWorldPosition(new THREE.Vector3()),
- player: player$5
- }) / window.devicePixelRatio;
- this.scale.set(scale, scale, scale);
- if (!dontRender) {
- //this.waitRender = true
- this.render();
- }
- this.lastZ = pos2d.z;
- }
- }, {
- key: "render",
- value: function render() {
- if (!this.visible
- /*|| !this.waitRender && !viewer.needRender */
- ) return;
- this.beforeRender && this.beforeRender();
- var oldTarget = sceneRenderer.renderer.getRenderTarget();
- sceneRenderer.renderer.setRenderTarget(this.renderTarget);
- common$1.updateVisible(this, 'renderScene', false); //render content, hide self
- sceneRenderer.renderer.clear();
- sceneRenderer.renderer.render(sceneRenderer.scene, this.camera);
- common$1.updateVisible(this, 'renderScene', true);
- sceneRenderer.renderer.setRenderTarget(oldTarget);
- this.afterRender && this.afterRender(); //this.waitRender = false
- }
- }]);
- return Magnifier;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- var planeGeo = new THREE.PlaneBufferGeometry(1, 1);
- var dragPointMat;
- var defaultLineLength = 1;
- var defaultSpotScale = 0.35;
- var titleHeight = {
- uponSpot: 0.1
- }; //title底部和spot顶端间隔
- var minLineHeight = 0.5,
- maxLineHeight = 5;
- /* const Vectors = {
- UP : new THREE.Vector3(0,1,0),
- ZERO: new THREE.Vector3()
- }
- */
- var player$4;
- var sizeInfo = {
- width2d: 220
- };
- var Tag = /*#__PURE__*/function (_THREE$Object3D) {
- _inherits(Tag, _THREE$Object3D);
- var _super = _createSuper$6(Tag);
- function Tag(o, player_) {
- var _this;
- _classCallCheck(this, Tag);
- _this = _super.call(this); //this.root = root //目前假设只能加在chunk上,不能加载导入的模型
- player$4 = player_;
- console.log('create', o);
- _this.sid = o.sid;
- _this.title = o.title;
- _this.fontsize = o.fontsize;
- _this.position.copy(o.position);
- _this.normal = o.normal ? new THREE.Vector3().copy(o.normal) : new THREE.Vector3(0, 1, 0);
- _this.noLine = o.noLine;
- _this.lineLength = o.noLine ? 0 : o.lineLength != void 0 ? o.lineLength : defaultLineLength;
- _this.build(o);
- _this.bindEvent();
- _this.dragEnable = false;
- return _this;
- }
- _createClass(Tag, [{
- key: "dragEnable",
- get: function get() {
- return this.dragEnable_;
- },
- set: function set(state) {
- this.noLine || (this.lineDragPoint.visible = state);
- this.dragEnable_ = state;
- }
- }, {
- key: "build",
- value: function build(o) {
- var group = new THREE.Object3D();
- this.spot = new THREE.Mesh(planeGeo, new THREE.MeshBasicMaterial({
- transparent: true
- }));
- this.spot.name = 'spot';
- this.spot.scale.set(defaultSpotScale, defaultSpotScale, defaultSpotScale);
- this.spot.renderOrder = this.spot.pickOrder = RenderOrder.tag.spot; //this.changeMap(texture.getImageURL('images/pic_location128_blue.png')) //tag_icon_default
- if (!this.noLine) {
- this.line = LineDraw.createLine([], {
- color: '#fff',
- transparent: true,
- depthWrite: false
- }); //为了不遮挡spot设置透明和不写深度
- this.line.name = 'tagLine';
- this.line.renderOrder = this.line.pickOrder = RenderOrder.tag.line;
- this.add(this.line);
- if (!dragPointMat) {
- var map = common$1.loadTextureFromCache(texture.getImageURL('images/whiteCircle.png'));
- dragPointMat = {
- default: new THREE.MeshBasicMaterial({
- map,
- transparent: true,
- color: Colors.mainColor,
- //'#0af',
- opacity: 0,
- depthTest: false
- }),
- hover: new THREE.MeshBasicMaterial({
- map,
- transparent: true,
- color: Colors.mainColor,
- //'#0af',
- opacity: 0.4,
- depthTest: false
- })
- };
- }
- this.lineDragPoint = new THREE.Mesh(planeGeo, dragPointMat.default); //修改线高度时出现的小圆点
- this.lineDragPoint.scale.set(0.12, 0.12, 0.12);
- this.lineDragPoint.name = 'lineDragPoint';
- this.lineDragPoint.renderOrder = this.lineDragPoint.pickOrder = RenderOrder.tag.spot + 3;
- group.add(this.lineDragPoint);
- this.line.tag = this.lineDragPoint.tag = this;
- }
- this.titleLabel = new TextSprite({
- root: group,
- text: '',
- sizeInfo,
- textColor: {
- r: 255,
- g: 255,
- b: 255,
- a: 1.0
- },
- backgroundColor: {
- r: 0,
- g: 0,
- b: 0,
- a: 0.7
- },
- borderRadius: 6,
- fontsize: this.fontsize || 14,
- fontWeight: '',
- //thick
- renderOrder: RenderOrder.tag.label,
- pickOrder: RenderOrder.tag.label,
- maxLineWidth: 300,
- transform2Dpercent: {
- x: 0,
- y: 0.5
- },
- //向上移动一半
- textAlign: 'left',
- player: player$4
- }); //更新sprite时,实际更新的是root: spot的矩阵
- this.titleLabel.sprite.material.depthTest = true;
- this.setTitle(this.title);
- this.updateTitlePos();
- group.add(this.titleLabel);
- group.add(this.spot);
- this.add(group);
- player$4.model.tags.add(this);
- this.spot.tag = this.titleLabel.tag = this;
- this.updatePose();
- common$1.setObjectLayers(this, 'Tag3d');
- }
- }, {
- key: "bindEvent",
- value: function bindEvent() {
- var _this2 = this,
- _this$lineDragPoint,
- _this$lineDragPoint2;
- var hoverState = {},
- grabbingObject;
- var setDragPointState = function setDragPointState(state) {
- if (_this2.noLine) return;
- _this2.lineDragPoint.material = state ? dragPointMat.hover : dragPointMat.default;
- _this2.spot.material.opacity = state ? 0.5 : 1;
- _this2.titleLabel.sprite.material.opacity = state ? 0.3 : 1;
- };
- {
- //因为只有有intersect时才能拖拽,所以写得比较麻烦
- var cursor = {
- hoverGrab: 0,
- grabbing: 0,
- hoverTag3d: 0
- };
- var setCursor = function setCursor(name, action) {
- var state = action == 'add' ? 1 : 0;
- if (state != cursor[name]) {
- cursor[name] = state;
- CursorDeal[action](name);
- }
- }
- /* let getIntersect = when => {
- if (when == 'drag') {
- //拖拽时player没getIntersect这里获取下
- let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
- return chunkPick
- }
- let chunkPick = player.allIntersects.find(e => e.object.name == 'collider' )// && e.normal //在chunk上的intersect
- return chunkPick
- }
- */
- ;
- [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('mousemove', function (e) {
- if (_this2.pointerUnable) return;
- hoverState[e.target.name] = 1;
- if (_this2.dragEnable && (player$4.getIntersectAtChunk() || hoverState['lineDragPoint'])) {
- //能拖拽时
- setCursor('hoverGrab', 'add');
- } else {
- setCursor('hoverGrab', 'remove');
- }
- });
- });
- [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('mouseleave', function (e) {
- hoverState[e.target.name] = 0;
- if (!Object.values(hoverState).some(function (e) {
- return e;
- })) {
- //都没hover才取消
- setCursor('hoverGrab', 'remove');
- }
- });
- });
- [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('drag', function (e) {
- //hover dragPoint不准所以把spot去掉
- if (_this2.dragEnable && cursor.grabbing) {
- if (e.target.name == 'lineDragPoint') {
- _this2.dragLineLen(e);
- } else {
- var info = player$4.getIntersectAtChunk(null, 'drag', true);
- info && _this2.changePos(info);
- }
- }
- });
- });
- [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('startDragging', function (e) {
- //this.dragEnable && (getIntersect() || e.target.name == 'lineDragPoint') && setCursor('grabbing', 'add')
- _this2.dragEnable && (player$4.getIntersectAtChunk() || e.target.name == 'lineDragPoint') && setCursor('grabbing', 'add');
- grabbingObject = e.target.name;
- grabbingObject == 'lineDragPoint' && setDragPointState(true);
- });
- });
- [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('drop', function (e) {
- _this2.dragEnable && setCursor('grabbing', 'remove');
- grabbingObject = null;
- hoverState['lineDragPoint'] || setDragPointState(false);
- });
- }); //拖拽线来移动。虽然理想方式是拟真,拖拽时不改变在线上的位置,使之平移,但仔细想想似乎办不到。因为墙面normal是不固定的,尤其在交界处难以确定。不知鼠标在空中的位置,即使是平行镜头移动也无法满足所有情况。matterport是加了底座,移动也是改变底座中心。
- }
- {
- /* let mouseover = (e)=>{
- this.dispatchEvent({type:'mouseover'})
-
- }
- let mouseleave = (e)=>{
- //if(!hoverState.line && !hoverState.spot && !hoverState.label){
- this.dispatchEvent({type:'mouseleave'})
-
- //}
- } */
- var click = function click(e) {
- if (_this2.pointerUnable) return;
- _this2.dispatchEvent('clicked');
- };
- /* this.spot.addEventListener('mouseover',mouseover)
- this.spot.addEventListener('mouseleave',mouseleave)
- this.titleLabel.addEventListener('mouseover',mouseover)
- this.titleLabel.addEventListener('mouseleave',mouseleave) */
- this.spot.addEventListener('click', click);
- this.titleLabel.addEventListener('click', click);
- } //-----------set line length
- // CursorDeal
- (_this$lineDragPoint = this.lineDragPoint) === null || _this$lineDragPoint === void 0 ? void 0 : _this$lineDragPoint.addEventListener('mouseover', function (e) {
- grabbingObject || setDragPointState(true);
- });
- (_this$lineDragPoint2 = this.lineDragPoint) === null || _this$lineDragPoint2 === void 0 ? void 0 : _this$lineDragPoint2.addEventListener('mouseleave', function (e) {
- grabbingObject != 'lineDragPoint' && setDragPointState(false);
- });
- [this.titleLabel, this.spot].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('mouseover', function (e) {
- if (_this2.pointerUnable) return;
- if (!_this2.dragEnable) {
- CursorDeal.add('hoverTag3d'); //setCursor('hoverTag3d', 'add')
- }
- _this2.dispatchEvent({
- type: 'hover'
- });
- });
- });
- [this.titleLabel, this.spot].forEach(function (e) {
- return e === null || e === void 0 ? void 0 : e.addEventListener('mouseleave', function (e) {
- if (!_this2.dragEnable) {
- CursorDeal.remove('hoverTag3d'); //setCursor('hoverTag3d', 'remove')
- }
- _this2.dispatchEvent({
- type: 'unhover'
- });
- });
- });
- player$4.on('mode.beforeChange', function () {
- _this2.autoSizeIfOn2d();
- });
- player$4.on('mode.changed', function () {
- _this2.autoSizeIfOn2d();
- });
- }
- }, {
- key: "autoSizeIfOn2d",
- value: function autoSizeIfOn2d() {
- var _player$modeTran,
- _this3 = this;
- //产品要求在floorplan模式时悬浮的要像贴地一样用真实大小,否则太大。注:floorplan时标签不显示的
- 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'));
- if (!this.onMesh && player$4.mode == 'floorplan') {
- this.titleLabel.sprite.sizeInfo = null;
- this.titleLabel.sprite.root.scale.set(1, 1, 1);
- } else {
- this.titleLabel.sprite.sizeInfo = sizeInfo;
- }
- this.titleLabel.sprite.afterUpdate = this.sizeTransition ? function () {
- //大小过渡
- var o = transitions$1.getById(settings$3.freeze.FlyToNewMode);
- if (o && o[0]) {
- var _player$modeTran2;
- var percent = o[0].current / o[0].duration;
- var s = _this3.titleLabel.sprite.root.scale.x;
- 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);
- _this3.titleLabel.sprite.root.scale.set(s_, s_, s_); //console.log('percent ', percent, 's_', s_)
- }
- } : null; //console.log('autoSizeIfOn2d ','sizeTransition', this.sizeTransition, 'sizeInfo', this.titleLabel.sprite.sizeInfo)
- }
- }, {
- key: "updatePose",
- value: function updatePose() {
- var endPos = this.normal.clone().multiplyScalar(this.lineLength);
- this.line && LineDraw.moveLine(this.line, [new THREE.Vector3(0, 0, 0), endPos]);
- this.titleLabel.parent.position.copy(endPos);
- this.titleLabel.updatePose();
- }
- }, {
- key: "changeLineLen",
- value: function changeLineLen(len) {
- if (len == this.lineLength) return;
- this.lineLength = parseFloat(len);
- this.updatePose();
- }
- }, {
- key: "dragLineLen",
- value: function dragLineLen(e) {
- //拖拽线的顶端修改线长度
- var camera = player$4.cameraControls.activeControl.camera;
- var endPos = this.normal.clone().multiplyScalar(this.lineLength).applyMatrix4(this.matrixWorld);
- var normal = this.normal.clone().applyQuaternion(this.getWorldQuaternion(new THREE.Quaternion()));
- var projected = endPos.clone().project(camera);
- projected.x = player$4.mouse.x;
- projected.y = player$4.mouse.y;
- var unprojected = projected.clone().unproject(camera);
- var moveVec = new THREE.Vector3().subVectors(unprojected, endPos);
- moveVec = moveVec.projectOnVector(normal);
- var newLength = Math.max(0, this.lineLength + moveVec.dot(normal));
- newLength = THREE.MathUtils.clamp(newLength, minLineHeight, maxLineHeight); //console.log(moveVec,newLength)
- this.changeLineLen(newLength);
- this.dispatchEvent({
- type: 'dragLineLen'
- });
- }
- }, {
- key: "changePos",
- value: function changePos(info) {
- //注:onMesh时在非平地上拖拽,热点旋转会一直变
- this.position.copy(info.point);
- this.normal.copy(info.normal);
- if (info.object) {
- this.floorIndex = info.object.parent.floor.floorIndex; // console.log('floorUpdate')
- this.dispatchEvent('floorUpdate', info.object.parent.floor);
- }
- this.setNorQua();
- this.updatePose();
- this.dispatchEvent({
- type: 'posChanged'
- });
- }
- }, {
- key: "changeOnMesh",
- value: function changeOnMesh(onMesh) {
- //是否贴在mesh上
- if (onMesh == this.onMesh) return;
- this.onMesh = onMesh;
- if (onMesh) {
- //贴mesh上时不是sprite,且可设置旋转值
- this.add(this.spot);
- this.titleLabel.position.y = 0;
- this.setNorQua();
- this.spot.renderOrder = RenderOrder.tag.onMesh.spot; // 防止遮住线
- this.line && (this.line.renderOrder = RenderOrder.tag.onMesh.line);
- } else {
- this.titleLabel.parent.add(this.spot);
- this.updateTitlePos();
- this.spot.position.set(0, 0, 0);
- this.spot.quaternion.set(0, 0, 0, 1); //this.titleLabel.waitUpdate()
- this.realFaceAngle = 0;
- this.spot.renderOrder = RenderOrder.tag.spot; //还原
- this.line && (this.line.renderOrder = RenderOrder.tag.line);
- }
- this.line && common$1.updateVisible(this.line, 'hideTitle', !this.titleLabel.visible && onMesh ? false : true);
- this.autoSizeIfOn2d();
- }
- }, {
- key: "setFaceAngle",
- value: function setFaceAngle() {
- var faceAngle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- //if(this.title == 'single2') debugger
- this.faceAngle = faceAngle; //先记录,但非onMesh时不会用
- if (!this.onMesh) return;
- var delta = faceAngle - (this.realFaceAngle || 0);
- this.spot.rotateOnAxis(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(delta));
- this.realFaceAngle = faceAngle;
- }
- }, {
- key: "setNorQua",
- value: function setNorQua() {
- if (!this.onMesh) return;
- this.spot.quaternion.setFromRotationMatrix(new THREE.Matrix4().lookAt(this.normal, Vectors$1.ZERO, Vectors$1.UP)); //重算quaternion
- this.realFaceAngle = 0; //quaternion被重置了,所以再设置一下faceAngle
- this.setFaceAngle(this.faceAngle);
- this.spot.position.copy(this.normal).multiplyScalar(0.022); //在mesh之上偏移一点
- }
- /*
- 如果要像四维看看那样,在地面上时保持初始转向镜头的话,需要矫正且保存quaternion。且要根据世界normal判断是否在地面, 会随着模型改变, 所以也没法仅保存normal去矫正。
- 要不然就要直接改变faceAngle
- */
- }, {
- key: "setTitle",
- value: function setTitle() {
- var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- if (title == '') title = '无标题';
- this.titleLabel.setText(title); //this.setTitleVisi(title instanceof Array || title.trim() != '', 'noText')//一定有标题
- }
- }, {
- key: "setTitleVisi",
- value: function setTitleVisi(v) {
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- common$1.updateVisible(this.titleLabel, 'hideTitle-' + reason, v); //tag.onMesh && common.updateVisible(tag.line, 'hideTitle-'+reason, v)
- //line的可见性比较复杂,所以干脆跟随title的,reason不记录那么多
- this.line && this.onMesh && common$1.updateVisible(this.line, 'hideTitle', this.titleLabel.visible);
- }
- }, {
- key: "setFontSize",
- value: function setFontSize(fontsize) {
- this.titleLabel.fontsize = this.fontsize = fontsize;
- this.titleLabel.updateTexture();
- }
- }, {
- key: "changeSpotScale",
- value: function changeSpotScale(s) {
- s *= defaultSpotScale;
- this.spot.scale.set(s, s, s);
- this.updateTitlePos();
- }
- }, {
- key: "updateTitlePos",
- value: function updateTitlePos() {
- this.onMesh || (this.titleLabel.position.y = titleHeight.uponSpot + this.spot.scale.x / 2);
- }
- }, {
- key: "changeMap",
- value: function changeMap(url) {
- var _this4 = this;
- url = common$1.getDealedUrl(url, player$4.$app);
- if (url.slice(-4) == '.svg') {
- url = url.slice(0, -4) + '.png'; //也可能传过来一个文件名,到时候再看看
- } //console.log('urlurl', url, old)
- var map = common$1.loadTextureFromCache(url, function () {
- _this4.spot.material.needsUpdate = true; //不知为何material也要更新,否则可能变白
- });
- this.spot.material.map = map;
- }
- }, {
- key: "getLabel2dPos",
- value: function getLabel2dPos() {
- var dir = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'center';
- //因为标签实际位置往上偏移了点,scale也在变,所以不同角度得到的不一样
- this.updateMatrixWorld();
- if (dir == 'left') {
- var leftPoint = new THREE.Vector3(-0.5, 0, 0); //title左边缘中点
- return leftPoint.applyMatrix4(this.titleLabel.sprite.matrixWorld);
- } else {
- return this.titleLabel.sprite.getWorldPosition(new THREE.Vector3());
- }
- }
- /* updateMatrixWorld(force) {
- //重写,只为了将root当做parent
- this.scale.set(1 / this.root.scale.x, 1 / this.root.scale.y, 1 / this.root.scale.z)
- //中和模型缩放。无论模型缩放如何都不能改tag大小
- this.updateMatrix()
- this.matrixWorld.multiplyMatrices(this.root.matrixWorld, this.matrix);
- const children = this.children;
- for (let i = 0, l = children.length; i < l; i++) {
- children[i].updateMatrixWorld(force);
- }
- }
- updateWorldMatrix(updateParents, updateChildren) {
- //重写,只为了将root当做parent
- if (updateParents === true && this.root !== null) {
- this.root.updateWorldMatrix(true, false);
- }
- if (this.matrixAutoUpdate)
- this.updateMatrix();
- this.matrixWorld.multiplyMatrices(this.root.matrixWorld, this.matrix);
- if (updateChildren === true) {
- const children = this.children;
- for (let i = 0, l = children.length; i < l; i++) {
- children[i].updateWorldMatrix(false, true);
- }
- }
- }*/
- }, {
- key: "setDepthTest",
- value: function setDepthTest(state) {
- this.traverse(function (e) {
- if (e.material) e.material.depthTest = state;
- });
- }
- }, {
- key: "dispose",
- value: function dispose() {
- var _this$titleLabel;
- this.parent.remove(this);
- (_this$titleLabel = this.titleLabel) === null || _this$titleLabel === void 0 ? void 0 : _this$titleLabel.dispose();
- }
- }]);
- return Tag;
- }(THREE.Object3D);
- 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); }; }
- 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; } }
- var player$3;
- /*let getIntersect = (e, when) => {
- if (e.intersect && e.intersect.object.name == 'collider') return e.intersect
- if (when == 'drag') {
- //拖拽时player没getIntersect这里获取下
- let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
- return chunkPick
- }
- let chunkPick = player.allIntersects.find(e => e.object.name == 'collider') //在chunk上的intersect
- return chunkPick
- }*/
- var MeasuringTool = /*#__PURE__*/function (_THREE$EventDispatche) {
- _inherits(MeasuringTool, _THREE$EventDispatche);
- var _super = _createSuper$5(MeasuringTool);
- function MeasuringTool(player_) {
- var _this;
- _classCallCheck(this, MeasuringTool);
- _this = _super.call(this);
- player$3 = player_;
- /* this.viewer.addEventListener('start_inserting_measurement', e => {
- this.viewer.dispatchEvent({
- type: 'cancel_insertions'
- });
- });
- */
- /* this.history = new History({
- applyData: (data)=>{
- if(data.measure.parent && data.measure.visible){
- if(viewer.scene.measurements.indexOf(data.measure) != viewer.scene.measurements.length-1){//非最新加的
- if( data.isNew) return //不允许减少点数至minMarkers以下, 也不允许
- }
- data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
- data.measure.reDraw()
- data.measure.initData(data)
- data.measure.isNew = data.isNew
- data.measure.dispatchEvent('changeByHistory')
- data.measure.facePlane = data.facePlane && data.facePlane.clone()
- data.measure.cannotConfirmNormal = data.cannotConfirmNormal
- return true
- }
- },
- getData:(measure)=>{
- if(measure.points.length == 0)return//没有点的话changeByHistory报错, 得有点可以移动
- let data = {
- measure,
- points: measure.points.map(e=>e.clone()),
- dataset_points: measure.dataset_points ? measure.dataset_points.map(e=>e&&e.clone()) : null,
- points_datasets: measure.points_datasets.slice(),
- datasetId: measure.datasetId,
- isNew: measure.isNew,
- facePlane: measure.facePlane && measure.facePlane.clone(),
- cannotConfirmNormal: measure.cannotConfirmNormal
- }
-
- return data
- }
- }) */
- return _this;
- }
- _createClass(MeasuringTool, [{
- key: "createMeasureFromData",
- value: function createMeasureFromData(data) {
- //add
- var measure = new Measure(data, player$3, this);
- if (measure.failBuilded) {
- return;
- }
- player$3.model.measurements.add(measure);
- if (measure.guideLine) measure.guideLine.visible = false;
- return measure;
- }
- }, {
- key: "editStateChange",
- value: function editStateChange(e) {
- //console.log("editStateChange" , e.state)
- var state = e.state;
- if (!state) {
- state = player$3.model.measurements.children.some(function (e) {
- return e.isEditing;
- });
- }
- }
- }, {
- key: "startInsertion",
- value: function startInsertion() {
- var _this2 = this;
- var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var cancelFun = arguments.length > 2 ? arguments[2] : undefined;
- var measure;
- if (args.resume) {
- measure = args.measure;
- args.minMarkers = measure.minMarkers;
- } else {
- measure = new Measure(args, player$3, this);
- }
- measure.isNew = true;
- this.dispatchEvent({
- type: 'cancel_insertions'
- });
- measure.addEventListener('editStateChange', this.editStateChange.bind(this));
- measure.editStateChange(true);
- var timer;
- this.isAdding = true;
- var endDragFun = function endDragFun(e) {
- var length = measure.points.length;
- if (e.button == THREE.MOUSE.LEFT || e.isTouch) {
- if (length >= measure.maxMarkers) {
- end({
- finish: true
- });
- } else {
- //this.history.beforeChange(measure)
- var marker = measure.cloneMarker(length - 1, length);
- if (args.isRect && measure.markers.length == 3) {
- //marker全可见
- measure.cloneMarker(0, 3);
- } else {
- common$1.updateVisible(measure.markers[length], 'adding', false);
- measure.edges[length].visible = false;
- }
- measure.edges[length - 1].visible = true;
- common$1.updateVisible(measure.markers[length - 1], 'adding', true);
- marker.isDragging = true; //this.history.afterChange(measure)
- measure.continueDrag(marker, e);
- if (measure.markers.length == 4) {
- measure.markers[0].addEventListener('mouseover', mouseover);
- measure.markers[0].addEventListener('mouseleave', mouseleave);
- } else if (measure.markers.length == 5) {
- //在点击的那一刻增加监听然后直接触发
- //如果点击了第一个点就要变成closed, 并结束
- measure.markers[0].addEventListener('click', Exit);
- }
- }
- } else if (e.button === THREE.MOUSE.RIGHT) {
- //触屏怎么取消?
- if (player$3.mouseCouldBeClickToMove
- /* e.pressDistance < Potree.config.clickMaxDragDis */
- ) {
- //非拖拽的话
- var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0, measure.point2dInfo.points2d.length - 1)); //检测除了最后一个点的相交情况
- if (!isIntersectSelf) end(e);else measure.continueDrag(null, e);
- } else {
- console.log('222');
- measure.continueDrag(null, e);
- }
- }
- };
- var end = function end() {
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- //确定、结束
- if (!measure.isNew) return;
- if (args.minMarkers != void 0) {
- if (!e.finish && measure.markers.length <= args.minMarkers) {
- //右键 当个数不够时取消
- //重新开始画
- if (measure.markers.length > 0) {
- measure.markers[0].removeEventListener('click', Exit);
- measure.reDraw();
- player$3.on('click', click, {
- importance: 10
- });
- player$3.on('pointerMove', pointerMove);
- measure.editStateChange(true);
- }
- return;
- }
- }
- var lastMarker = measure.markers[measure.markers.length - 1];
- if (
- /* !e.finish&& */
- measure.markers.length > args.minMarkers) {
- measure.removeMarker(measure.points.length - 1);
- measure.markers[0].removeEventListener('mouseover', mouseover);
- measure.markers[0].removeEventListener('mouseleave', mouseleave);
- measure.markers[0].removeEventListener('click', Exit);
- if (e.byClickMarker && measure.markers.length > args.minMarkers) {
- //通过点击第一个marker而结束的话,会多一个marker。但点击marker后可能会因为和它坐标一致而没有添加成功,就不删,根据添加的时间来判断。
- var delta = Date.now() - lastMarker.createTime; //console.log('delta',delta)
- if (delta < 10) {
- //刚生成的,说明点击后新增了一个marker
- measure.removeMarker(measure.points.length - 1);
- }
- measure.changeToArea();
- }
- }
- measure.isNew = false;
- measure.editStateChange(false);
- var length = measure.points.length;
- if (length) {
- common$1.updateVisible(measure.markers[length - 1], 'adding', true);
- measure.edges[length - 1].visible = !!measure.closed;
- measure.edges.forEach(function (edge) {
- edge.dispatchEvent({
- type: 'addHoverEvent'
- });
- });
- measure.markers.forEach(function (marker) {
- marker.dispatchEvent({
- type: 'addHoverEvent'
- });
- });
- measure.measureType.includes('MulDistance') && measure.edgeLabels.forEach(function (label) {
- label.dispatchEvent({
- type: 'addHoverEvent'
- });
- });
- measure.update(); //update last edgeLabel
- }
- clearTimeout(timer);
- _this2.removeEventListener('cancel_insertions', Exit); //pressExit && this.viewer.inputHandler.removeEventListener('keydown', pressExit);
- player$3.off('click', click);
- player$3.off('pointerMove', pointerMove); //player.off('pointerMove', ifAtWrongPlace )
- CursorDeal.remove('polygon_AtWrongPlace'); //viewer.inputHandler.dispatchEvent({type:'measuring', v:false, cause:'stopInsertion', situation:'adding', object:measure} )
- var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d);
- if (isIntersectSelf) return cancelFun && cancelFun(); //请求删除,不重建
- //e.remove || (callback && callback())
- _this2.isAdding = false;
- if (e.type_ == 'cancel_insertions') measure.dispose(); //add
- CursorDeal.remove('hoverFirstMarker');
- measure.dispatchEvent({
- type: 'createDone',
- type_: e.type_
- });
- };
- measure.addEventListener('finish', end); //完成
- var Exit = function Exit(e) {
- //强制退出
- if (e.measure && e.measure != measure || !player$3.model.measurements.children.includes(measure) || !measure.isNew) {
- return; //若指定了退出的measure但和该measure不一致,就返回
- }
- measure.cannotConfirmNormal = false; //一些dropMarker中的句子
- measure.guideLine && (measure.guideLine.visible = false);
- end({
- finish: true,
- remove: e.remove,
- byClickMarker: e.type == 'click',
- type_: e.type
- });
- player$3.emit('forceToDrag', {}); //this.viewer.inputHandler.drag && (this.viewer.inputHandler.drag.object = null)
- };
- this.addEventListener('cancel_insertions', Exit);
- var mouseover = function mouseover(e) {
- measure.setMarkerSelected(e.target, 'hover', 'single');
- CursorDeal.add('hoverFirstMarker');
- };
- var mouseleave = function mouseleave(e) {
- measure.setMarkerSelected(e.target, 'unhover', 'single');
- CursorDeal.remove('hoverFirstMarker');
- };
- var pointerMove = function pointerMove(e) {
- var _player$getIntersectA;
- var I = (_player$getIntersectA = player$3.getIntersectAtChunk(e.intersect, 'drag')) === null || _player$getIntersectA === void 0 ? void 0 : _player$getIntersectA.point; //getIntersect(e, 'drag')?.point
- if (I) {
- CursorDeal.remove('polygon_AtWrongPlace');
- } else {
- CursorDeal.add('polygon_AtWrongPlace');
- }
- };
- var click = function click(e) {
- var _player$getIntersectA2;
- //一旦点击就立刻增加两marker
- //if(ifAtWrongPlace(e))return
- if (e.getConsumed()) return; //如点击label时focusOnObject
- if (e.button === THREE.MOUSE.RIGHT) return; //console.log('measure clicked33', !!e.intersectPoint)
- 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
- if (!I) {
- if (measure.zPlaneWhenNoIntersect != void 0) {
- //on ground
- var _Potree$Utils$getPoin = Potree.Utils.getPointerPosAtHeight(measure.zPlaneWhenNoIntersect, e.pointer),
- x = _Potree$Utils$getPoin.x,
- y = _Potree$Utils$getPoin.y;
- I = new THREE.Vector3(x, y, measure.zPlaneWhenNoIntersect);
- } else {
- return measure.dispatchEvent({
- type: 'intersectNoPointcloud'
- });
- }
- }
- var marker = measure.addMarker({
- point: I
- });
- marker.isDragging = true;
- /* this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
- e.drag = this.viewer.inputHandler.drag
- */
- /* player.emit('forceToDrag', { object: marker , drag:{ endDragFun, notPressMouse: true }})
- let evt = Object.assign({}, e, {target: marker, drag:{ endDragFun, notPressMouse: true } } ) //{ intersect: e.intersect, target: marker, endDragFun, notPressMouse: true }
- measure.dragMarker(evt)
- measure.dropMarker(evt) */
- player$3.emit('forceToDrag', Object.assign({}, e, {
- drag: {
- object: marker,
- endDragFun,
- notPressMouse: true
- }
- }));
- player$3.emit('forceToDrag', e); //drop
- if (measure.maxMarkers > 1) {
- common$1.updateVisible(measure.markers[1], 'adding', false);
- measure.edges[1].visible = false;
- }
- player$3.off('click', click);
- player$3.off('pointerMove', pointerMove); //console.log('measure clicked')
- e.consume && e.consume();
- return {
- stopContinue: true
- }; //防止继续执行别的侦听,如flytopano
- }; //点击第n下拥有n+1个marker, n>0
- player$3.on('click', click, {
- importance: 10
- }); //this.viewer.addEventListener('global_click', click, {importance:10})//add importance
- player$3.on('pointerMove', pointerMove);
- args.resume || player$3.model.measurements.add(measure);
- return measure;
- }
- }]);
- return MeasuringTool;
- }(THREE.EventDispatcher);
- //照片制卷 已知热点位置和
- var player$2;
- 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]
- /* [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] */
- ];
- for (var i = 0, len = sideBoundPoints.length; i < len; i++) {
- sideBoundPoints.push([-sideBoundPoints[i][0], -sideBoundPoints[i][1]]);
- }
- var canvasRes = new THREE.Vector2(1024, 512); //const snapResolution = new THREE.Vector2(1.78*500, 500) //5671*3186
- var snapAspect = 1.78; //和截图页面实际会有一点偏差
- var imgResolution = new THREE.Vector2(4096, 2048); // (8192,4096)
- var TestRouteSnap = {
- init(tagManager, app) {
- if (this.inited) return;
- this.tagManager = tagManager;
- this.app = app;
- player$2 = app.core.get('Player');
- console.log(tagManager.tag3ds);
- this.inited = true;
- this.camera = player$2.camera.clone();
- this.camera.aspect = snapAspect;
- this.camera.updateProjectionMatrix();
- this.generate(tagManager.tag3ds[0], new THREE.Vector3(-6.341202318462933, -0.24444786181942013, -0.388378329219438));
- window.testSnap = this;
- this.showPanoRenderArea();
- },
- generate(tag, doorPos) {
- var panoStart = this.tagManager.findBestPanoForWatching(tag);
- var panoEnd = player$2.model.panos.closestPanoTowardPoint({
- point: doorPos
- });
- var route = this.findRoute(panoStart, panoEnd);
- var list = this.findTurnPanos(route);
- console.log('拐点', list); //let tagSnap = this.getSnapCorners(panoStart, tag.position)
- //let cornerList = [tagSnap]
- var cornerList = [];
- for (var _i = 0, _len = list.length; _i < _len; _i++) {
- cornerList.push(this.getSnapCorners(list[_i], _i == 0 ? tag.position : list[_i - 1].position));
- cornerList.push(this.getSnapCorners(list[_i], _i == _len - 1 ? doorPos : list[_i + 1].position));
- }
- console.error('cornerList', cornerList);
- return cornerList;
- },
- findRoute(panoStart, panoEnd) {
- var panos = aStart.searchRoad(player$2.model.panos.index, panoStart.id, panoEnd.id) || [];
- return [panoStart.id].concat(panos);
- },
- findTurnPanos(panos) {
- var turnPanos = [panos[0]];
- for (var _i2 = 0, _len2 = panos.length; _i2 < _len2; _i2++) {
- var last = player$2.model.panos.index[turnPanos[turnPanos.length - 1]]; //上次的拐点
- if (!last.neighbourPanos[panos[_i2]]) {
- turnPanos.push(panos[_i2 - 1]); //前一个是拐点
- }
- }
- if (turnPanos[turnPanos.length - 1] != panos[panos.length - 1]) {
- //加入最后一个点
- turnPanos.push(panos[panos.length - 1]);
- }
- return turnPanos.map(function (e) {
- return player$2.model.panos.get(e);
- });
- /* let list = [], vec1 = new THREE.Vector3, vec2 = new THREE.Vector3
- for(let i=0,len=turnPanos.length; i<len;i++){
- let last = turnPanos[i-1]
- let next = turnPanos[i+1]
- vec1.quaternion
- }
-
- return list */
- },
- getSnapCorners(pano, target) {
- var _this = this;
- //得到四个角在全景图的像素坐标
- //假定相机的aspect刚好等于snapAspect
- //该方法需要先让相机在对应位置,然后得到屏幕所显示的完整截图
- player$2.cameraControls.activeControl.camera;
- this.camera.position.copy(pano.position);
- this.camera.lookAt(target);
- this.camera.updateMatrixWorld();
- var corners_ = [[-1, 1], [1, 1], [1, -1], [-1, -1]]; //从左上开始顺时针的四个角
- var corners = corners_.map(function (mouse) {
- var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(_this.camera);
- var dir = new THREE.Vector3().subVectors(point, pano.position);
- var dirInPano = math$1.getNormalDir(dir, pano);
- return math$1.getUVfromDir(dirInPano).multiply(imgResolution);
- });
- return {
- id: pano.id,
- corners
- };
- },
- initPanoVisible() {},
- getImgUrl(id) {
- return "http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3";
- },
- showPanoRenderArea() {
- var _this2 = this;
- var pano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : player$2.currentPano;
- //勾勒出当前视口在全景图上的范围
- if (!this.imgReview) {
- var panoImgReview = document.createElement('div');
- panoImgReview.id = 'panoImgReview';
- document.querySelector('body').appendChild(panoImgReview);
- 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 "; //< >
- var style = document.createElement('style');
- style.type = 'text/css';
- 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 ";
- document.head.appendChild(style);
- this.imgReview = panoImgReview;
- var btn = this.imgReview.querySelector('button');
- btn.addEventListener('click', function () {
- _this2.showPanoRenderArea();
- });
- var canvas = this.imgReview.querySelector('canvas');
- canvas.width = canvasRes.x;
- canvas.height = canvasRes.y;
- this.ctx = canvas.getContext('2d');
- this.ctx.strokeStyle = 'rgb(255,50,200)';
- this.ctx.fillStyle = 'rgb(255,255,200)';
- var r = imgResolution.x / canvasRes.x;
- this.showCoordPoint = function (coord) {
- //输入给算法的坐标
- ctx.fillRect(coord.x / r, y / r, 1, 1); // 画一个点(1x1 的矩形)
- };
- }
- this.imgReview.querySelector('img').src = pano.getCubemapUrls('high');
- var cameraReal = player$2.cameraControls.activeControl.camera; //创建屏幕四边若干序列点
- var coords = sideBoundPoints.map(function (mouse) {
- var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(cameraReal);
- var dir = new THREE.Vector3().subVectors(point, pano.position);
- var dirInPano = math$1.getNormalDir(dir, pano);
- return math$1.getUVfromDir(dirInPano).multiply(canvasRes);
- });
- var ctx = this.ctx;
- ctx.clearRect(0, 0, canvasRes.x, canvasRes.y);
- ctx.lineWidth = 5;
- ctx.beginPath();
- ctx.moveTo(coords[0].x, coords[0].y);
- for (var _i3 = 1, _len3 = coords.length; _i3 < _len3; _i3++) {
- ctx.lineTo(coords[_i3].x, coords[_i3].y);
- }
- ctx.closePath(); // 闭合路径,回到起点
- //ctx.fill();
- ctx.stroke();
- }
- };
- var math$1 = {
- getUVfromDir(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone();
- dir.x *= -1; //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5; //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI;
- return new THREE.Vector2(tx, ty); //理想状态下tx相同
- },
- crossRight(vec3, matrix) {
- //似乎是只取旋转。当年不知道怎么想到这函数的- -
- var e = matrix.elements;
- var v = new THREE.Vector3();
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3];
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7];
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11];
- return v;
- },
- getNormalDir(dir, currentPano) {
- if (currentPano.tiled) {
- var matrixWorld = currentPano.rot90Matrix.clone();
- } else {
- var matrixWorld = currentPano.matrixWorld.clone();
- }
- dir = this.crossRight(dir, matrixWorld); //右乘matrixWorld 得matrix转化的向量
- dir.normalize();
- return dir;
- },
- getQuaByAim(aim) {
- var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE.Vector3();
- //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
- var _ = new THREE.Matrix4().lookAt(center, aim, new THREE.Vector3(0, 1, 0));
- var aimQua = new THREE.Quaternion().setFromRotationMatrix(_);
- return aimQua;
- }
- }; //还要对tag截一张图 所以需要我这加载tag,初始化tag, 然后focus
- //入户门可能还要算点位
- /*
- 视图的mouse 左下角是(-1,-1)
- */
- /* 全景图 http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3
- see getCubemapUrls
- */
- /*
- 在console界面输出当前点位屏幕四个角在全景图上的像素坐标
- let getUVfromDir = function(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone()
- dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI
- return new THREE.Vector2( tx, ty )
- //理想状态下tx相同
- }
- let crossRight = function(vec3, matrix) {
- var e = matrix.elements
- var v = new THREE.Vector3()
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
-
- return v
- }
- let getNormalDir = function(point, currentPano) {
-
- var dir = point.clone().sub(currentPano.position) //OA
- if (supportsTiles) {
- var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- } else {
- var matrixWorld = currentPano.matrixWorld.clone()
- }
- dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
- dir.normalize()
-
- return dir
- }
- let player = __sdk.core.get('Player')
- // let dir = player.getDirection()
- //let quaInv = new THREE.Quaternion().copy(player.currentPano.quaternion).invert()
- // dir.applyQuaternion(quaInv)
- //console.log(getUVfromDir(dir))
- let camera = player.camera
- let imgResolution = new THREE.Vector2(8192,4096)
- let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
- console.log(corners.map(mouse=>{
-
- var point = new THREE.Vector3(mouse[0],mouse[1],-1).unproject( camera)
- let dir = getNormalDir(point, player.currentPano)
- return getUVfromDir(dir).multiply(imgResolution)
-
- }))
- //当全景图不旋转时,得到的框 y一样,x不一样
- =====ver2=====
- 根据给定的fov:
- 得到的结果不对! 舍弃
- let getQuaByAim = function(aim, center = new THREE.Vector3() ) {
- //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
- var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
- aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
- return aimQua
- }
- let getUVfromDir = function(dir) {
- //获取UV 同shader里的计算
- var dir = dir.clone()
- dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
- var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
- var ty = Math.acos(dir.y) / Math.PI
- return new THREE.Vector2( tx, ty )
- //理想状态下tx相同
- }
- let crossRight = function(vec3, matrix) {
- var e = matrix.elements
- var v = new THREE.Vector3()
- v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
- v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
- v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
- return v
- }
- let getNormalDir = function(dir, currentPano) {
- if (currentPano.tiled) {
- var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
- } else {
- var matrixWorld = currentPano.matrixWorld.clone()
- }
- dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
- dir.normalize()
-
- return dir
- }
- let player = __sdk.core.get('Player')
- let camera = player.camera
- let cameraReal = player.cameraControls.activeControl.camera
- let imgResolution = new THREE.Vector2(8192,4096)
- let vfov = THREE.MathUtils.degToRad(cameraReal.fov)
- const vFovHalf = vfov / 2
- const hFovHalf = Math.atan(Math.tan(vFovHalf) * cameraReal.aspect)
- let viewQua = getQuaByAim(player.getDirection() )
- console.log('viewQua', viewQua, camera.quaternion)
- let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
- console.log(corners.map(c=>{
-
- let dir = new THREE.Vector3(0, 0, -1);
- dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), vFovHalf * c[1]);
- dir.applyAxisAngle(new THREE.Vector3(0, 1, 0), hFovHalf * -c[0]);//得到相机不旋转时该偏移角度的方向
- dir.applyQuaternion(viewQua)
- let dirInPano = getNormalDir(dir, player.currentPano )
- return getUVfromDir(dirInPano).multiply(imgResolution)
- }))
- ========
- 问题:入户门如何指定? 算法是否能给出完全遮挡的漫游点信息,甚至给出了后续还是可能要模型
- 现在加载不了那些包
- */
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var measuringTool, measuring, isEditing3Dtag, isRePos, player$1, intersectSpot3d, tagEditing_;
- var tag3dsLabelVisi = {
- visible: true
- };
- var getStyle = function getStyle(e, styleName) {
- if (!e) {
- return 0;
- }
- var styleValue = '';
- if (document.defaultView && document.defaultView.getComputedStyle) {
- styleValue = document.defaultView.getComputedStyle(e, '').getPropertyValue(styleName);
- } else if (e.currentStyle) {
- styleName = styleName.replace(/\-(\w)/g, function (strMatch, p1) {
- return p1.toUpperCase();
- });
- styleValue = e.currentStyle[styleName];
- }
- return styleValue || 0;
- };
- var updateTag3dVisi = function updateTag3dVisi(tag) {
- var pano = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : player$1.currentPano;
- var tag3d = getTag3d(tag);
- if (tag3d) {
- tag3d.setDepthTest(player$1.mode != 'panorama'); //common.updateVisible(tag3d, 'atVisiPano', player.mode != 'panorama' || !tag.visiblePanos || tag.visiblePanos.some(e => e.id == pano.id))
- var v;
- if (player$1.mode == 'panorama') {
- v = !tag.visiblePanos || tag.visiblePanos.some(function (e) {
- return e.id == pano.id;
- });
- } else {
- v = player$1.model.allFloorsVisible || tag.floorIndex == void 0 || tag.floorIndex == player$1.model.currentFloor.floorIndex;
- }
- common$1.updateVisible(tag3d, 'atVisiPanoOrFloor', v);
- }
- };
- var updateMeasureVisi = function updateMeasureVisi(measure) {
- var pano = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : player$1.currentPano;
- //2d不显示
- common$1.updateVisible(measure, 'atVisiPano', player$1.mode == 'floorplan' ? false : player$1.mode != 'panorama' || !measure.visiblePanos || measure.visiblePanos.some(function (e) {
- return e.id == pano.id;
- }));
- };
- var getTag3d = function getTag3d(tag) {
- var sid = typeof tag == 'string' ? tag : tag === null || tag === void 0 ? void 0 : tag.sid;
- return player$1.model.tags.children.find(function (e) {
- return e.sid == sid;
- });
- };
- var descMap = new Map();
- var getDesc = function getDesc(tag) {
- //记录一些字段,不写到tag里
- var sid = typeof tag == 'string' ? tag : tag === null || tag === void 0 ? void 0 : tag.sid;
- var desc = descMap.get(sid);
- if (!desc) {
- desc = {};
- descMap.set(sid, desc);
- }
- return desc;
- };
- var updateTag3dStyle = function updateTag3dStyle(tag) {
- //新建没图标,隐藏spot,而spot不显示就一定onMesh, 自身也可以选择onMesh,很乱
- //iconType 0不显示图标 1悬浮 2贴地
- console.log('updateTag3dStyle', tag.icon, tag.iconType);
- var tag3d = getTag3d(tag);
- tag3d.spot.visible = tag.icon != void 0 && tag.iconType != 0;
- tag3d.changeOnMesh(!tag3d.spot.visible || tag.iconType == 2);
- };
- var tag3dPanelPointerEnable = function tag3dPanelPointerEnable(state) {
- var panel = document.querySelector('.trace-info');
- panel && (panel.style['pointer-events'] = state ? '' : 'none');
- };
- var TagManager$1 = /*#__PURE__*/function (_Emiter) {
- _inherits(TagManager, _Emiter);
- var _super = _createSuper$4(TagManager);
- function TagManager(app) {
- var _this;
- _classCallCheck(this, TagManager);
- _this = _super.call(this);
- _this.focusBeforeModify = function (sid) {
- var player = _this.app.core.get('Player');
- _this.tagEditing = _this.tags.find(function (t) {
- return t.sid == sid;
- });
- _this.tempTag = {
- position: new THREE.Vector3(_this.tagEditing.position.x, _this.tagEditing.position.y, _this.tagEditing.position.z)
- };
- var pano = _this.findBestPanoForWatching(_this.tagEditing, true);
- player.flyToPano({
- pano: pano,
- lookAtPoint: _this.tagEditing.position,
- aimDuration: 0,
- duration: 1,
- checkAlone: true
- }, function () {
- _this.edit.enter(_this.tagEditing, function () {
- _this.editHandle.markTagPos = _this.tagEditing.position;
- _this.editHandle.markSpotA.elem.style.display = 'block';
- _this.editHandle.markSpotB.elem.style.display = 'block';
- });
- }); // this.app.Camera.flyToPoint(pano.position, {
- // aimDur: 0, // 同点位镜头旋转时间
- // dur: 1, // 点位跳转时间(不能为0)
- // done: () => {
- // this.edit.enter(() => {
- // this.editHandle.markTagPos = this.tagEditing.position
- // this.editHandle.markSpotA.elem.style.display = 'block'
- // this.editHandle.markSpotB.elem.style.display = 'block'
- // })
- // },
- // })
- };
- _this.focus = function (data, target, boardDirc, isHover) {
- console.log('focus', data, target, boardDirc);
- try {
- var _player = _this.app.core.get('Player');
- var tag3ds = _this.tag3ds; //player.model.tags.children.map(e => e.tag)
- var tag = _this.tags.concat(tag3ds).find(function (t) {
- return t.sid == data.sid;
- }) || data.tag;
- var tag3d = getTag3d(data.sid);
- if (!tag.position) return; //导入的未有坐标
- var pano = _this.findBestPanoForWatching(tag, true);
- var center = new THREE.Vector3();
- var tagPos = _this.getFocusPos(tag); //tag3d的会变,重校准要重新获取
- tag3d && (tag3d.boardDirc_ = boardDirc);
- if (isHover) return; //hover时执行的,只为了获取boardDirc,不用focus
- var sendMove = function sendMove() {
- if (_player.mode === Viewmode$1.PANORAMA) {
- _this.app.Camera.emit(PlayerEvents.Rotate, {
- panoId: _player.currentPano ? _player.currentPano.id : null,
- quaternion: _player.cameraControls.activeControl.camera.quaternion,
- mode: Viewmode$1.PANORAMA,
- type: 'flyToPano'
- });
- }
- };
- var centerX = tag.x,
- centerY = tag.y;
- var unprojectCenter = function unprojectCenter() {
- // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
- tag.x = _this.convertPositionTo2D(tagPos).pos.x;
- tag.y = _this.convertPositionTo2D(tagPos).pos.y;
- center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
- centerX = tag.x - (boardDirc == 'left' ? data.arrowBox.width + data.tagBox.width / 2 : 0);
- centerY = tag.y - (boardDirc == 'top' ? data.arrowBox.height + data.tagBox.height / 2 : 0); // 2d坐标映射到3d
- math$2.convertScreenPositionToNDC(centerX, centerY, center, _this.app.dom);
- center.unproject(_player.camera);
- };
- if (target == 'board') {
- if (!_this.app.config.mobile) {
- var $tag = document.querySelector("[tag-sid=\"".concat(tag.sid, "\"]"));
- if ($tag) {
- var $layer = $tag.querySelector('.move-layer');
- if ($layer) {
- $layer.style.transform = "translateY(0)";
- setTimeout(function () {
- var rect = $layer.getBoundingClientRect();
- var calc = rect.top + rect.height;
- if (calc > window.innerHeight) {
- $layer.style.transform = "translateY(".concat(window.innerHeight - calc, "px)");
- } else if (rect.height / 2 > tag.y) {
- $layer.style.transform = "translateY(175px)";
- }
- }, 1500);
- }
- }
- } // 面板中心
- if (pano.id == _player.currentPano.id && _player.mode == 'panorama') {
- if (boardDirc != 'center') {
- unprojectCenter();
- var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(_player.camera.quaternion).normalize();
- var targetDirec = _player.camera.position.clone().sub(tagPos).normalize();
- var reverse = cameraDirec.dot(targetDirec);
- if (reverse < 0) {
- var distanceVec = _player.camera.position.clone().sub(center).multiplyScalar(-1);
- center = _player.camera.position.clone().sub(distanceVec);
- } // this.app.Camera.flyToPoint(center, {
- // done: () => {
- // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) return
- // unprojectCenter()
- // this.app.Camera.flyToPoint(center, {
- // aimDur: 400,
- // })
- // },
- // })
- } else {
- center = tagPos;
- }
- _player.flyToPano({
- pano: pano,
- lookAtPoint: center,
- checkAlone: true,
- isTagFlying: true
- }, function () {
- if (centerX > window.innerWidth / 4 && centerX < window.innerWidth / 4 * 3) {
- //本就比较中间,不需要重校准
- sendMove();
- } else {
- //重校准
- tagPos = _this.getFocusPos(tag);
- unprojectCenter();
- _player.flyToPano({
- pano: pano,
- aimDuration: 600,
- lookAtPoint: center
- }, function () {
- sendMove();
- });
- }
- });
- } else {
- // this.app.Camera.flyToPoint(tag.position, {
- // done: () =>
- // setTimeout(() => {
- // unprojectCenter()
- // this.app.Camera.flyToPoint(center)
- // }, 10),
- // })
- _player.flyToPano({
- pano: pano,
- lookAtPoint: tagPos,
- duration: 1000,
- checkAlone: true,
- isTagFlying: true
- }, function () {
- return setTimeout(function () {
- tagPos = _this.getFocusPos(tag);
- unprojectCenter();
- _player.flyToPano({
- pano: pano,
- aimDuration: 600,
- lookAtPoint: center
- });
- }, 10);
- });
- }
- } else {
- // 热点
- _player.flyToPano({
- pano: pano,
- lookAtPoint: _this.getFocusPos(tag),
- // duration: 700,
- checkAlone: true,
- isTagFlying: true
- });
- }
- } catch (e) {
- console.error(e);
- }
- };
- _this.startMeasure = function (type) {
- var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- console.log('startMeasure', type);
- var player = _this.app.core.get('Player');
- if (player.mode != 'panorama') {
- _this.app.Camera.panorama().then(function () {
- return _this.startMeasure(type, prop);
- });
- return;
- }
- measuring = true;
- document.querySelector('.widgets-design-option').style.display = 'none';
- _this.switchAllDisplay(false, 'addMeasure', {
- measures: _this.isSingleView
- });
- if (_this.isSingleView) {
- var types = {
- horizon: 'Hor MulDistance',
- vertical: 'Ver MulDistance',
- 'vertical-oneLine': 'Ver Distance',
- free: 'MulDistance'
- };
- var args = {
- showDistances: true,
- minMarkers: 2,
- measureType: types[type],
- sid: common$1.getRandomSid(),
- visiblePanos: []
- };
- var measure = _this.measureAdding = measuringTool.startInsertion(args);
- _this.magnifier.setDisplay(true); //prop.continueDraw || this.openMagnifier(true) //每次进入测量界面都默认打开
- prop.magifier != void 0 && _this.openMagnifier(prop.magifier);
- CursorDeal.add('crosshair');
- measure.addEventListener('dragChange', function (e) {
- var measure = e.target;
- common$1.intervalTool.isWaiting('getMeasureVisi_' + measure.sid, function () {
- /* let boundSize = measure.boundInfo.boundSize
- let maxDis = Math.max(6, boundSize.length()) */
- var maxDis = Infinity; //因为添加时必须显示,所以还是不设置距离了
- var visiblePanos = [];
- measure.points.forEach(function (point) {
- visiblePanos = common$1.getUnionSet(visiblePanos, _this.getVisiblePano(point, maxDis));
- });
- visiblePanos.length == 0 && visiblePanos.push(player.currentPano);
- measure.visiblePanos = visiblePanos;
- updateMeasureVisi(measure);
- }, 510);
- });
- var pointAddCb = function pointAddCb() {
- if (_this.measureAdding.markers.length == 3) _this.emit('showMeasureDoneBtn'); //添加两个点后显示确定按钮
- };
- measure.addEventListener('createDone', function (e) {
- //完成或取消
- CursorDeal.remove('crosshair'); //this.emit('measureCreateDone')
- measure.removeEventListener('marker_added', pointAddCb);
- setTimeout(function () {
- /* e.type_ != 'cancel_insertions' */
- measuring && (!_this.measureAdding || _this.measureAdding == measure) && _this.startMeasure(type, {
- continueDraw: 1
- }); //继续新测量
- }, 1);
- if (measure.points.length == 2 && measure.maxMarkers == 2) _this.emit('showMeasureDoneBtn');
- });
- measure.addEventListener('marker_added', pointAddCb);
- player.model.measurements.children.forEach(function (e) {
- return e.setEditEnable(true);
- });
- } else {
- _this.edit.enter();
- }
- player.chosenMeasureRuler && player.chosenMeasureRuler.showOptionLabel(false);
- };
- _this.confirmMeasure = function (step) {
- console.log('confirmMeasure', step);
- var player = _this.app.core.get('Player');
- if (_this.isSingleView) {
- //新版 同potree的测量
- _this.measureAdding.dispatchEvent({
- type: 'finish'
- });
- _this.measureAdding = null;
- }
- var pano1;
- if (step == 1) {
- var position;
- if (_this.isSingleView) {
- //旧版
- position = _this.spot3d.position.clone();
- _this.draggingSpot3d = true;
- _this.spot3d.visible = false; // 移动端 没有mousemove的话就隐藏spot3d
- _this.shouldCheckSpot3d = false;
- } else {
- position = _this.editHandle.confirmPos().position;
- _this.editHandle.enter(); //清除点击状态,取消看向第一个tag
- player.locked = false; //可以移动
- // this.editHandle.splitView.enter()
- }
- _this.lastPosition = position;
- _this.measureStep = 1;
- var groundPoint = position.clone().setY(player.model.currentFloor.boundingBox.min.y); //垂线和地面交点
- /* let intersect = convertTool.ifIntersectChunks(position, groundPoint, player.model, {InfinityLen:true})
- if(intersect){//修正
- groundPoint.copy(intersect[0].point)//不一定在地面上
- } */
- //修正
- var sorts = common$1.sortByScore(player.model.panos.list, [Panorama.filters.isPanoAligned()], [Panorama.scoreFunctions.distanceSquared(_this.currentPano, -0.6)]);
- if (sorts[0]) {
- groundPoint.setY(sorts[0].item.floorPosition.y);
- }
- var stemLine = LineDraw.createLine([position, groundPoint], {
- width: 2,
- color: Colors.mainColor,
- depthTest: false,
- transparent: true
- });
- player.model.add(stemLine);
- var shadow = new THREE.Mesh(new THREE.CircleGeometry(0.08, 32), new THREE.MeshBasicMaterial({
- color: 0xffffff,
- transparent: true,
- opacity: 0.6,
- depthTest: false
- }));
- shadow.position.copy(groundPoint);
- shadow.position.y += 0.002; // 防止和地面重叠
- shadow.lookAt(groundPoint.clone().add(new THREE.Vector3(0, 1, 0)));
- player.model.add(shadow);
- pano1 = player.currentPano;
- var measureTag = document.createElement('div');
- measureTag.className = 'visible';
- measureTag.id = 'measureTag';
- measureTag.innerHTML = "<span class=\"point zoom\" style=\"background-image: url(".concat(texture.getImageURL('images/tag_icon_default.png'), ");\"></span>");
- var pos2d = _this.convertPositionTo2D(position).pos;
- measureTag.style.left = pos2d.x + 'px';
- measureTag.style.top = pos2d.y + 'px';
- measureTag.style.setProperty('display', 'block', 'important');
- document.querySelector('div[xui_tags]').appendChild(measureTag);
- _this.measurePointTemp = {
- measureTag,
- stemLine,
- shadow
- };
- } else if (step == 2) {
- //完成测距 得到尺子 退出编辑
- var _position;
- if (_this.isSingleView) {
- _position = _this.spot3d.position.clone();
- } else {
- _position = _this.editHandle.confirmPos().position;
- } //visiblePanos为两个端点的visiblePanos的并集
- var length = _position.distanceTo(_this.lastPosition);
- var maxDis = Math.max(5, length * 6); //可见距离
- var tolerance = 0.3;
- var visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
- var visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
- var visiblePanos = common$1.getUnionSet(visiblePanos1, visiblePanos2);
- if (visiblePanos.length == 0) {
- //add on 2023.11.7
- tolerance = 1;
- visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
- visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
- visiblePanos = common$1.getUnionSet(visiblePanos1, visiblePanos2);
- }
- var ruler = new MeasureRuler({
- points: [_this.lastPosition, _position],
- visiblePanos
- }, player);
- player.chosenMeasureRuler = ruler; //将当前点加入visiblePanos
- if (!ruler.visiblePanos.includes(player.currentPano)) {
- ruler.visiblePanos.push(player.currentPano);
- }
- if (!ruler.visiblePanos.includes(pano1)) {
- ruler.visiblePanos.push(pano1);
- }
- /* player.model.measureRulers.children.forEach(r => {
- common.updateVisible(r, 'measuring', true)
- }) */
- }
- };
- _this.cancelMeasure = function () {
- //结束测量。完成后也会调用这个
- var player = _this.app.core.get('Player');
- console.log('cancelMeasure');
- measuring = false;
- if (_this.isSingleView) {
- //新版 同potree的测量
- measuringTool.dispatchEvent('cancel_insertions');
- _this.measureAdding = null;
- _this.magnifier.setDisplay(false);
- player.model.measurements.children.forEach(function (e) {
- return e.setEditEnable(false);
- });
- } else {
- if (_this.measurePointTemp) {
- var _this$measurePointTem = _this.measurePointTemp,
- measureTag = _this$measurePointTem.measureTag,
- stemLine = _this$measurePointTem.stemLine,
- shadow = _this$measurePointTem.shadow;
- document.querySelector('div[xui_tags]').removeChild(measureTag);
- stemLine.geometry.dispose();
- stemLine.material.dispose();
- player.model.remove(stemLine);
- shadow.geometry.dispose();
- shadow.material.dispose();
- player.model.remove(shadow);
- _this.measurePointTemp = null;
- }
- /* player.measureRulers.forEach(r => {
- r.updateVisible()
- if (r.state == 'active') {
- r.updateBoldLine()
- }
- }) */
- _this.edit.exit();
- }
- _this.switchAllDisplay(true, 'addMeasure', {
- measures: _this.isSingleView
- });
- };
- _this.app = app;
- _this.root = '[xui_tags_view]';
- _this.view = Deferred$1();
- _this.editor = Deferred$1();
- _this.plugin = Deferred$1();
- _this.loaded = false;
- _this.tagEditing = null;
- _this.tags = []; //可见二维热点
- _this.tag3ds = []; //所有三维点
- _this.labels = [];
- _this.showTags = true;
- _this.showTagsVisible = false;
- _this.openedTag3d_ = null;
- _this.app.Scene.on('loaded', function () {
- player$1 = app.core.get('Player');
- measuringTool = _this.measuringTool = new MeasuringTool(player$1);
- _this.bindEvents();
- try {
- _this.app.store.on('traces', function (tags) {
- //console.log('gettag3d', tags)
- _this.tag3ds = tags === null || tags === void 0 ? void 0 : tags.traces.filter(function (e) {
- return e.position;
- }); //临时的,不是监听的实例
- _this.tag3ds.forEach(function (e) {
- _this.buildTag3dFromData(e, 'fake');
- });
- browser$1.urlHasValue('routeSnap') && TestRouteSnap.init(_assertThisInitialized(_this), _this.app); //RouteSnap.init(this, this.app)
- _this.tag3dInited = true;
- _this.emit('tag3dInited');
- }); //tag3d在漫游时容易被墙挡住,所以这时改为不遮挡且根据visiblePanos设置可见性。飞出后就按正常的显示。
- player$1.on(PlayerEvents.FlyingEnded, function () {
- _this.tag3ds.forEach(function (e) {
- return updateTag3dVisi(e);
- });
- player$1.model.measurements.children.forEach(function (m) {
- return updateMeasureVisi(m);
- });
- });
- player$1.model.on('floor.changed', function () {
- console.log('floor.changed');
- _this.tag3ds.forEach(function (e) {
- return updateTag3dVisi(e);
- });
- });
- } catch (e) {
- console.error(e);
- }
- });
- _this.app.store.on('tags', function (tags) {
- _this.tags = _this.tagsInitial = tags.tags || []; // 由于热点新增了floorIndex属性,需要兼容旧数据
- var rayDir = new THREE.Vector3(0, -1, 0);
- var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), rayDir, 0.001, 9999);
- _this.tags.forEach(function (tag) {
- if (tag.floorIndex == void 0) {
- // 旧数据没有floorIndex
- // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
- ray.set(tag.position, rayDir);
- var rayInfo = ray.intersectObjects(player$1.model.chunks);
- if (!rayInfo.length) {
- // 如果射线检测不到模型,则根据floor的boundingBox判断
- var tagFloor = player$1.model.floors.list.find(function (floor) {
- return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
- });
- tag.floorIndex = tagFloor && tagFloor.floorIndex;
- } else {
- tag.floorIndex = rayInfo[0].object.parent.floorIndex;
- }
- }
- });
- _this.view.then(function (view) {
- return view.render();
- });
- _this.loaded = true;
- _this.emit('loaded', _this.tags);
- });
- var this_ = _assertThisInitialized(_this);
- _this.edit = {};
- _this.edit.enter = function (tagEditing, callback, is3DTag) {
- console.log('enter', tagEditing, is3DTag);
- _this.tagPosChosing = true;
- isEditing3Dtag = is3DTag;
- _this.tagEditing = tagEditing; //add
- isRePos = !!(tagEditing !== null && tagEditing !== void 0 && tagEditing.position);
- _this.useSingleView = _this.isSingleView;
- {
- var tag3ds = _this.tag3ds.slice();
- if (tagEditing && !tag3ds.some(function (e) {
- return e.sid == tagEditing.sid;
- })) {
- //导入的新建时可能不在tag3ds里
- tag3ds.push(tagEditing);
- }
- _this.copyTag3dProp = tag3ds.map(function (e) {
- return common$1.CloneObject(e, false, [Tag, Panorama]);
- }); //因为可以应用到全部,所以每个都要备份副本来回退
- }
- if (!is3DTag) {
- app.TagManager.switchLabels({
- type: 'traces',
- visible: false
- }, null, 'editOther');
- }
- if (isRePos && is3DTag) {
- getTag3d(tagEditing).dragEnable = true;
- _this.useSingleView = true; //分屏的在编辑位置时直接拖拽,不分屏
- }
- if (is3DTag) {
- var _this$tag3ds;
- (_this$tag3ds = _this.tag3ds) === null || _this$tag3ds === void 0 ? void 0 : _this$tag3ds.forEach(function (tag) {
- if (tag != tagEditing) {
- var tag3d = getTag3d(tag);
- tag3d && (tag3d.pointerUnable = true); //前端点击其他的痕迹图标会错乱,故不让点击
- }
- });
- }
- if (_this.useSingleView) {
- _this.hideAll();
- var _player2 = app.core.get('Player');
- if (!(is3DTag && isRePos)) {
- _player2.locked = true;
- _player2.reticule.visible = false;
- _this.spot3d.visible = true;
- measuring && _this.magnifier.setDisplay(true);
- _this.shouldCheckSpot3d = true;
- }
- if (isRePos) {
- // 修改
- _this.draggingSpot3d = false;
- if (!is3DTag) {
- _this.spot3d.position.set(tagEditing.position.x, tagEditing.position.y, tagEditing.position.z);
- setTimeout(function () {
- var tagScreenPos = new THREE.Vector3(0, 0, 0);
- var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
- math$2.projectPositionToCanvas(tagEditing.position, _player2.camera, tagScreenPos, _player2.domElement);
- math$2.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, _player2.domElement);
- var intersect = _player2.getMouseIntersect(tagNDCPos, _player2.OverlayManager.list.concat(_player2.model.colliders));
- intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(_player2.camera.position));
- }, 10);
- }
- } else {
- // 新增
- _this.shouldCheckSpot3d = true;
- _this.draggingSpot3d = true;
- _this.spot3d.position.set(0, 1000, 0);
- }
- } else {
- app.core.get('Scene').getSplit('TAG').then(function (view) {
- if (_this.editHandle == void 0) {
- _this.editHandle = app.withNewComponent('TagEditManager', view, {
- spotA: app.dom.querySelector('.player[name="main"] .player-mark'),
- spotB: app.dom.querySelector('.player[name="copy"] .player-mark')
- });
- }
- if (tagEditing !== null && tagEditing !== void 0 && tagEditing.position) {
- // 修改
- _this.editHandle.reSetPos(tagEditing.position);
- } else {
- // 新增
- _this.editHandle.enter();
- }
- _this.switchLabels({
- type: 'traces',
- visible: false
- }, null, 'splitView');
- callback && callback();
- });
- }
- };
- _this.edit.exit = function (save) {
- //退出定位
- var player = _this.app.core.get('Player');
- player.cameraControls.activeControl.enabled = true; //在没有触发mousedown方法时触发了exit方法可能会导致视角锁死,所以在这里补上
- if (_this.tempTag && !save) {
- _this.tagEditing.position = _this.tempTag.position;
- }
- if (!save) {
- app.TagManager.switchLabels({
- type: 'traces',
- visible: true
- }, null, 'editOther');
- }
- if (_this.isSingleView) {
- _this.showAll();
- CursorDeal.remove('moving');
- player.locked = false;
- player.reticule.visible = true;
- _this.spot3d.visible = false;
- _this.draggingSpot3d = false;
- _this.shouldCheckSpot3d = false;
- measuring && _this.magnifier.setDisplay(false);
- } else {
- if (!_this.editHandle) {
- return;
- }
- app.core.get('Scene').restore('TAG');
- _this.editHandle.exit({
- cancel: true
- });
- _this.switchLabels({
- type: 'traces',
- visible: true
- }, null, 'splitView');
- }
- /* if (isEditing3Dtag && this.copyTag3dProp && !save) {
- //在定位时取消的tag3d一定是导入的,要还原, 因为之后不会执行exitTag3DEdit
- this.recoverTag3dsData()
- } */
- if (!isEditing3Dtag || !getTag3d(_this.tagEditing)) {
- //如果只是tag3d初步定位结束,不null, 此时已create tag3d
- _this.tagEditing = null;
- }
- _this.tempTag = null;
- _this.tagPosChosing = false;
- setTimeout(function () {
- player.cameraControls.activeControl.camera.fov = 70;
- player.camera.fov = player.baseFov * (1 / player.zoomLevel);
- }, 50);
- };
- var findTagFloorRay = new THREE.Raycaster(new THREE.Vector3(), new THREE.Vector3(), 0.001, 9999);
- var addFloor = function addFloor(tag) {
- // 在确认坐标后,计算热点所在楼层
- var camera = player$1.cameraControls.activeControl.camera; // 从相机向热点发出一条射线
- var rayDirec = new THREE.Vector3().subVectors(tag.position, camera.position).normalize();
- findTagFloorRay.set(camera.position, rayDirec);
- var rayInfo = findTagFloorRay.intersectObjects(player$1.model.chunks);
- if (rayInfo.length) {
- tag.floorIndex = rayInfo[0].object.parent.floorIndex;
- } else {
- // 如果没有检测到chunk,大概率是在skybox上,这时直接取currentPano所在楼层就行
- tag.floorIndex = player$1.currentPano.floorIndex;
- }
- };
- _this.edit.confirm = function (onlyExitWithPosition) {
- var player = _this.app.core.get('Player');
- var tag = _this.tagEditing;
- if (_this.useSingleView) _this.showAll();
- var labelPos;
- if (isEditing3Dtag) {
- if (!_this.useSingleView) {
- var o = _this.editHandle.confirmPos();
- if (o) {
- if (tag) {
- tag.position = o.position;
- } else {
- tag = _this.tagEditing = o; //二维的标签tag没办法这样赋值tagEditing,会有bug就不改了
- }
- }
- }
- var tag3d = getTag3d(tag);
- if (!tag3d) {
- var _tag3d$normal, _tag3d$position;
- //新增
- tag3d = new Tag({
- sid: tag.sid,
- normal: _this.isSingleView && _this.spot3d.normal_.clone(),
- position: _this.isSingleView ? _this.spot3d.position.clone() : tag.position.clone(),
- noLine: !_this.isSingleView //分屏的tag3d没有线
- }, player);
- tag.normal = (_tag3d$normal = tag3d.normal) === null || _tag3d$normal === void 0 ? void 0 : _tag3d$normal.clone();
- tag.position = (_tag3d$position = tag3d.position) === null || _tag3d$position === void 0 ? void 0 : _tag3d$position.clone();
- _this.isSingleView && (tag.floorIndex = _this.spot3d.floorIndex);
- _this.initTag3d(tag3d, tag);
- if (!_this.isSingleView) {
- setTimeout(function () {
- _this.emit('tag3dLineLen', 0); //修改为0
- }, 1);
- }
- if (tag.icon != void 0) {
- //导入的
- tag3d.changeMap(tag.icon);
- }
- updateTag3dStyle(tag);
- } else {
- //修改
- if (_this.useSingleView) {
- tag.position = tag3d.position.clone();
- tag.normal = tag3d.normal.clone();
- }
- }
- tag3d.dragEnable = true;
- if (_this.useSingleView) ; else {
- addFloor(tag);
- }
- labelPos = tag3d.getLabel2dPos();
- } else {
- if (_this.useSingleView) {
- if (!tag) return; // if (!this.spot3d.visible) {
- // this.edit.exit()
- // return null
- // }
- _this.spot3d.visible = true; //当鼠标将spot3d移动到不可见位置时触发confirm方法将spot3d恢复可见(position貌似是最后的有效position所以暂时不做修改)
- _this.shouldCheckSpot3d = true;
- tag.position = labelPos = _this.spot3d.topMesh.getWorldPosition(new THREE.Vector3()); // this.spot3d.position.clone()
- tag.floorIndex = _this.spot3d.floorIndex;
- } else {
- if (!_this.editHandle) {
- return;
- }
- var _this$editHandle$conf = _this.editHandle.confirmPos(),
- position = _this$editHandle$conf.position,
- sid = _this$editHandle$conf.sid,
- panoId = _this$editHandle$conf.panoId;
- if (!position) {
- onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
- return null;
- }
- if (tag == null) {
- tag = {
- position,
- sid,
- panoId,
- icon: app.resource.base('images/tag_icon_default.png')
- };
- } else {
- tag.position = position;
- }
- labelPos = position;
- addFloor(tag);
- }
- } //if (!tag.visiblePanos) {
- tag.visiblePanos = _this.getVisiblePano(labelPos);
- if (tag.visiblePanos.length == 0) {
- var _panoId = player.currentPano.id;
- tag.visiblePanos.push(player.model.panos.index[_panoId]);
- } //}
- _this.edit.exit(true);
- return tag;
- };
- _this.edit.editTag = function () {
- //编辑2d的tag的信息
- _this.tagInfoEditing = true;
- console.log('editTag');
- app.TagManager.switchLabels({
- type: 'traces',
- visible: false
- }, null, 'editOther');
- };
- _this.edit.cancelTagEdit = function () {
- //2d的tag结束编辑
- console.log('cancelTagEdit');
- _this.tagInfoEditing = false;
- app.TagManager.switchLabels({
- type: 'traces',
- visible: true
- }, null, 'editOther');
- };
- _this.edit.changeTag3DProp = function (options, sid) {
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
- dontGetVisiPanos = _ref.dontGetVisiPanos;
- //除了当前编辑的,其他也可能通过“应用到全部”而改变
- //console.log('changeTag3DProp', options)
- var tag3d = sid ? getTag3d(sid) : getTag3d(_this.tagEditing); //this.tag3dEditing
- if (!tag3d) return;
- var tag = this_.tag3ds.find(function (e) {
- return e.sid == tag3d.sid;
- }) || _this.tagEditing; //找到前端监听的那个实例
- var texSrc = options.texSrc,
- lineLen = options.lineLen,
- scale = options.scale,
- angle = options.angle,
- fontSize = options.fontSize,
- iconType = options.iconType,
- title = options.title,
- position = options.position,
- normal = options.normal;
- lineLen != void 0 && tag3d.changeLineLen(lineLen);
- scale != void 0 && tag3d.changeSpotScale(scale);
- angle != void 0 && tag3d.setFaceAngle(angle);
- fontSize != void 0 && tag3d.setFontSize(fontSize);
- title != void 0 && tag3d.setTitle(title);
- if (iconType != void 0 || texSrc != void 0) {
- texSrc != void 0 && tag3d.changeMap(texSrc);
- setTimeout(function () {
- updateTag3dStyle(tag);
- }, 1); //延迟是因为tag本身的那些属性还没变
- }
- if (position) {
- normal = normal || tag.normal;
- tag3d.changePos({
- position,
- normal
- });
- }
- if (!dontGetVisiPanos) {
- getDesc(tag).needGetVisiPanos = true;
- }
- setTimeout(function () {
- getDesc(tag).needUpdate2d = true; //tag
- }, 1);
- };
- _this.edit.saveTag3D = function () {
- try {
- var _tag3d$normal2;
- _this.edit.confirm();
- if (_this.openedTag3d) {
- _this.openedTag3d.visible = false;
- _this.openedTag3d = null;
- }
- var tag3d = getTag3d(_this.tagEditing);
- var data = {
- pos: tag3d.position.clone(),
- normal: (_tag3d$normal2 = tag3d.normal) === null || _tag3d$normal2 === void 0 ? void 0 : _tag3d$normal2.clone(),
- visiblePanos: _this.tagEditing.visiblePanos
- };
- return data; //这些是我直接改却保存不了的值(很奇怪),只好在这返回下
- } catch (e) {
- console.error(e);
- }
- };
- _this.edit.cancelAddTag3D = function () {
- //取消添加痕迹
- _this.edit.exitTag3DEdit('cancelAdd');
- };
- _this.edit.exitTag3DEdit = function (type) {
- //三种状态: 保存后,添加取消,修改取消
- if (!_this.tagEditing) return;
- var tag3d = getTag3d(_this.tagEditing);
- tag3d.dragEnable = false;
- if (type != 'save') {
- tag3d.dispose();
- if (!isRePos) {
- type = 'cancelAdd';
- } //导入的,编辑就是新建
- _this.recoverTag3dsData();
- if (type != 'cancelAdd') {
- //重建
- _this.buildTag3dFromData(_this.tagEditing); //重建
- }
- _this.useSingleView || _this.edit.exit(); //退出双屏
- }
- console.log('exitTag3DEdit', _this.tagEditing);
- _this.tagEditing && updateTag3dVisi(_this.tagEditing);
- _this.tagEditing = null;
- _this.tag3ds.forEach(function (tag) {
- var tag3d = getTag3d(tag);
- tag3d && (tag3d.pointerUnable = false);
- });
- _this.showAll();
- };
- _this.recoverTag3dsData = function () {
- /* Object.assign(this.tagEditing, this.copyTag3dProp)
- if (!this.copyTag3dProp.position) delete this.tagEditing.position //导入的 */
- console.error('recoverTag3dsData', _this.copyTag3dProp.map(function (e) {
- return e.sid;
- }), _this.tag3ds.map(function (e) {
- return e.sid;
- }));
- _this.copyTag3dProp.forEach(function (data) {
- var tag = _this.tag3ds.concat([_this.tagEditing]).find(function (e) {
- return e.sid == data.sid;
- });
- if (!tag) {
- return;
- }
- Object.assign(tag, data);
- if (!data.position) delete tag.position; //导入的 */
- else if (tag != _this.tagEditing) {
- //其他痕迹中可以‘应用到全部’的属性
- _this.edit.changeTag3DProp(data.visiSetting, data.sid, {
- dontGetVisiPanos: true
- });
- }
- });
- };
- _this.edit.deleteTag3d = function (sid) {
- var _getTag3d;
- (_getTag3d = getTag3d(sid)) === null || _getTag3d === void 0 ? void 0 : _getTag3d.dispose();
- _this.tag3ds = _this.tag3ds.filter(function (e) {
- return e.sid != sid;
- });
- }; // -------------------------------------------------
- // 设置热点可视相关方法
- // -------------------------------------------------
- _this.edit.beginTagVisiSetting = function () {
- _this.showTagsVisible = true;
- var player = _this.app.core.get('Player');
- if (player && player.linkEditor) {
- player.linkEditor.enterSet('tagVisible');
- player.linkEditor.beginSetTagVisible();
- }
- player.model.floorplanCadImg.hideCadPlane();
- player.emit('beginTagVisiSetting');
- };
- _this.edit.setTagVisi = function (sid) {
- var tag = _this.tags.find(function (t) {
- return t.sid == sid;
- });
- _this.app.core.get('Player').linkEditor.SetOneTagVisible(tag);
- };
- _this.edit.resetTagVisi = function () {
- var linkEditor = _this.app.core.get('Player').linkEditor;
- var tag = linkEditor.tagVsetting;
- linkEditor.tagVsetting = null;
- linkEditor.SetOneTagVisible(tag);
- };
- _this.edit.checkNeedSaveTagVisi = function () {
- var linkEditor = _this.app.core.get('Player').linkEditor;
- return linkEditor.checkTagVisiChange();
- };
- _this.edit.saveTagVisi = function () {
- var player = _this.app.core.get('Player');
- var data = player.linkEditor.saveTagVisibles();
- var storeTags = _this.app.store.getValue('tags');
- data.forEach(function (tagData) {
- var tag = _this.tags.find(function (tag) {
- return tag.sid == tagData.sid;
- });
- tag.visiblePanos = tagData.value.map(function (id) {
- return player.model.panos.index[id];
- });
- });
- storeTags.tags = _this.tags;
- _this.app.store.set('tags', storeTags);
- return {
- data,
- func: player.linkEditor.afterSaveTagVisibles.bind(player.linkEditor)
- };
- };
- _this.edit.cancelTagVisiSetting = function () {
- var player = _this.app.core.get('Player');
- _this.showTagsVisible = false;
- _this.app.core.get('Player').linkEditor.finishSetTagVisible();
- _this.app.core.get('Player').model.floorplanCadImg.showCadPlane();
- player.emit('exitTagVisiSetting');
- };
- _this.edit.hideAllTagVisi = function () {
- var linkEditor = _this.app.core.get('Player').linkEditor;
- var currentTag = linkEditor.tagVsetting;
- linkEditor.setTagHideAll(currentTag);
- };
- _this.edit.showAllTagVisi = function () {
- var linkEditor = _this.app.core.get('Player').linkEditor;
- var currentTag = linkEditor.tagVsetting;
- linkEditor.setTagShowAll(currentTag);
- }; // -------------------------------------------------
- var setVisi = function setVisi(item, v) {
- common$1.updateVisible(item, 'update2d', v, 0);
- };
- _this.setTagLabel2dPos = function (item, emit) {
- //弹窗位置
- //isLose表示失效,重算的时候需要
- //showTags表示是否全部可见
- if (!getTag3d(item)) {
- var showIn = _this.app.config.tag.showIn;
- if (item.isLose || _this.showTags === false) {
- return setVisi(item, false);
- } //没有进入热点可视设置(大部分情况)
- if (_this.showTagsVisible == false) {
- if (showIn) {
- if (showIn === 'all') {
- if (_this.tagEditing || player$1.paintEditor && player$1.paintEditor.painting || player$1.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player$1.currentPano)) {
- return setVisi(item, false);
- }
- } else if (showIn.indexOf(player$1.mode) == -1) {
- return setVisi(item, false);
- }
- }
- if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
- return setVisi(item, false);
- } // 默认情况
- if (!showIn || showIn != 'all' && showIn.indexOf(Viewmode$1.PANORAMA) != -1 && player$1.mode == Viewmode$1.PANORAMA) {
- if (_this.tagEditing || player$1.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player$1.currentPano) || player$1.paintEditor && player$1.paintEditor.painting) {
- return setVisi(item, false);
- }
- }
- } //热点可视设置
- if (player$1.linkEditor.setTagVisible) {
- // 只所在楼层可视热点
- if (item.floorIndex != player$1.model.currentFloor.floorIndex) {
- if (player$1.linkEditor.tagVsetting != item) {
- //tagVsetting的要一直显示
- return setVisi(item, false);
- }
- }
- /* if (!item.visiblePanos.some(p => p.floorIndex == player.model.currentFloor.floorIndex)) {
- return (item.visible = false)
- } */
- }
- }
- var labelPos = _this.getFocusPos(item, 1);
- var pos = app.TagManager.convertPositionTo2D(labelPos);
- if (!pos.trueSide || !pos.inSight) {
- //trueSide是否在背面
- //inSight是否在当前屏幕可视区域
- //console.log(item.sid, false)
- return setVisi(item, false);
- }
- /* if (item.visible && this.app.config.mobile) {
- //若原本是非visible,必须重算一下位置,即使lastFrameChanged为false,所以直接更新
- item.__x = pos.pos.x
- item.__y = pos.pos.y
- waitForUpdate2d.push(item)
- } else { */
- item.x = pos.pos.x;
- item.y = pos.pos.y;
- setVisi(item, true);
- emit && _this.emit('update'); //}
- };
- _this.app.Scene.on('loaded', function () {
- var rulersDiv = document.createElement('div');
- rulersDiv.className = 'widgets-rulers';
- player$1.domElement.append(rulersDiv); // 用于测量
- var delRulerBtn = document.querySelector('.widgets-design-option div');
- delRulerBtn && delRulerBtn.addEventListener('pointerup', function (e) {
- //删除测量线
- e.stopPropagation();
- player$1.chosenMeasureRuler.dispose();
- player$1.chosenMeasureRuler.showOptionLabel(false);
- }); // 判断,激光场景在单屏内添加热点
- var isSingleView_ = function isSingleView_(metadata) {
- _this.isSingleView = metadata.sceneFrom == 'laser' || metadata.threeCamType == 'yzl';
- };
- var metadata = _this.app.store.getValue('metadata');
- if (metadata) isSingleView_(metadata);else _this.app.store.on('metadata', function (data) {
- return isSingleView_(data);
- });
- if (_this.isSingleView) {
- // spot3d,用于单屏
- _this.spot3d = new TagSpot(player$1);
- if (_this.app.config.view) {
- _this.magnifier = new Magnifier(player$1, app.core.get('SceneRenderer'));
- var oldS;
- _this.magnifier.beforeRender = function () {
- var s = 0.5;
- _this.spot3d.scale.set(s, s, s);
- oldS = _this.spot3d.topMesh.scale.x;
- _this.spot3d.topMesh.scale.set(0.6, 0.6, 0.6);
- };
- _this.magnifier.afterRender = function () {
- _this.spot3d.scale.set(1, 1, 1);
- _this.spot3d.topMesh.scale.set(oldS, oldS, oldS);
- };
- }
- } // 热点在哪些模式下显示
- var lastTags = '';
- app.core.get('Player').on('update', function (e) {
- var _tags;
- //app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, (e) => {
- if (!_this.app.config.view) {
- var _this$tag3ds2;
- (_this$tag3ds2 = _this.tag3ds) === null || _this$tag3ds2 === void 0 ? void 0 : _this$tag3ds2.forEach(function (tag) {
- var desc = getDesc(tag);
- if (desc.needGetVisiPanos) {
- setTimeout(function () {
- var tag3d = getTag3d(tag);
- if (!tag3d) return;
- tag.visiblePanos = _this.getVisiblePano(tag3d.getLabel2dPos());
- if (tag.visiblePanos.length == 0) {
- tag.visiblePanos.push(player$1.currentPano);
- }
- desc.needGetVisiPanos = false;
- updateTag3dVisi(tag);
- }, 2);
- }
- });
- } // 更新测量tag
- if (_this.measurePointTemp) {
- var pos = _this.convertPositionTo2D(_this.lastPosition);
- var measureTag = _this.measurePointTemp.measureTag;
- measureTag.style.left = pos.pos.x + 'px';
- measureTag.style.top = pos.pos.y + 'px';
- measureTag.className = !pos.trueSide || !pos.inSight ? '' : 'visible';
- }
- if (_this.labels.length) {
- // 显示标签
- _this.labels.forEach(function (item) {
- if (player$1.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player$1.currentPano)) {
- return item.visible = false;
- } // 只所在楼层可视热点
- if (item.floorIndex != player$1.model.currentFloor.floorIndex) {
- return item.visible = false;
- }
- var pos = app.TagManager.convertPositionTo2D(item.position);
- if (!pos.trueSide || !pos.inSight) {
- //trueSide是否在背面
- //inSight是否在当前屏幕可视区域
- return item.visible = false;
- }
- item.x = pos.pos.x;
- item.y = pos.pos.y;
- item.visible = true;
- });
- }
- var tags = (_this.tags || []).slice();
- if (_this.openedTag3d) tags.push(_this.openedTag3d);
- var tagStr = tags.map(function (e) {
- return e.sid;
- }).join('|');
- if (!((_tags = tags) !== null && _tags !== void 0 && _tags.length) || !e.hasChanged.cameraChanged && lastTags == tagStr) {
- tags = tags.filter(function (e) {
- return getDesc(e).needUpdate2d;
- });
- tags.forEach(function (item) {
- _this.setTagLabel2dPos(item);
- });
- return;
- }
- lastTags = tagStr;
- tags.forEach(function (item) {
- getDesc(e).needUpdate2d = false, _this.setTagLabel2dPos(item);
- });
- e.lastFrameChanged = player$1.lastFrameChanged;
- _this.emit('update', e);
- });
- if (_this.isSingleView) {
- /**
- * 单屏下spot3d的一些事件
- */
- player$1.on('pointerStart', function (e) {
- if (!_this.tagEditing) return;
- if (isEditing3Dtag && getTag3d(_this.tagEditing)) return; // 移动端 pointerStart时先计算一次intersectSpot3d
- intersectSpot3d = player$1.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
- if (intersectSpot3d) {
- _this.draggingSpot3d = true;
- player$1.cameraControls.activeControl.enabled = false;
- }
- });
- player$1.on('pointerMove', function (e) {
- //console.log('pointerMove', this.tagEditing, this.draggingSpot3d)
- //if (!this.tagEditing && !this.draggingSpot3d ) return
- if (!_this.shouldCheckSpot3d && !measuring) return; //不intersectSpot3d
- var intersect = player$1.getIntersectAtChunk(null, e.buttons == 1 && 'drag'); //this.getIntersectAtChunk(e.buttons == 1 && 'drag')
- if (measuring) {
- //this.magnifier.setDisplay(!!intersect)
- _this.magnifier.update(intersect === null || intersect === void 0 ? void 0 : intersect.point, player$1.mouse);
- } // 检测鼠标是否在spot3d上
- intersectSpot3d = player$1.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
- if (intersectSpot3d) {
- CursorDeal.add('moving');
- } else if (_this.tagEditing && !_this.draggingSpot3d) {
- CursorDeal.remove('moving');
- }
- if (_this.draggingSpot3d) {
- // 拖动spot3d
- _this.updateSpot3d(intersect);
- }
- });
- player$1.on('pointerUp', function (e) {
- if (_this.spot3d && _this.draggingSpot3d) {
- var _this$tagEditing;
- // 移动端 pointerUp时最后再计算一次spot3d坐标
- if (!_this.updateSpot3d(null, 'drag')) return;
- player$1.cameraControls.activeControl.enabled = true;
- player$1.cameraControls.activeControl.pointerDragOn = false;
- _this.draggingSpot3d = false;
- if ((_this$tagEditing = _this.tagEditing) !== null && _this$tagEditing !== void 0 && _this$tagEditing.position) {
- // 修改位置
- _this.tagEditing.position = _this.spot3d.position;
- } else {
- // 新增
- if (!_this.tagEditing) {
- _this.tagEditing = {
- position: _this.spot3d.position,
- sid: common$1.getRandomSid(),
- icon: isEditing3Dtag ? null : _this.app.resource.base('images/tag_icon_default.png')
- };
- }
- }
- _this.emit('tagManager.markTagPos', e);
- }
- });
- }
- });
- return _this;
- }
- _createClass(TagManager, [{
- key: "updateSpot3d",
- value: function updateSpot3d(intersect, when) {
- //intersect = intersect || this.getIntersectAtChunk(when) //player.getMouseIntersect(null, player.OverlayManager.group.children.concat(player.model.colliders))
- intersect = player$1.getIntersectAtChunk(intersect, when, true);
- if (intersect) {
- this.spot3d.visible = true;
- this.spot3d.position.copy(intersect.point);
- this.spot3d.lookAt(new THREE.Vector3().addVectors(intersect.point, intersect.normal));
- this.spot3d.topMesh.lookAt(player$1.camera.position);
- this.spot3d.normal_ = intersect.normal;
- this.spot3d.floorIndex = intersect.object.parent.floor.floorIndex;
- }
- return intersect;
- }
- }, {
- key: "tag",
- value: function tag() {
- if (this.ready) {
- return Promise.resolve(this);
- }
- return this.plugin.promise();
- }
- }, {
- key: "load",
- value: function load(tags) {
- var _this2 = this;
- if (!this.app.Scene.loaded) {
- return setTimeout(function () {
- _this2.load(tags);
- }, 100);
- }
- if (!tags) {
- return;
- }
- tags.forEach(function (tag) {
- if (tag.position && tag.position instanceof THREE.Vector3 == false) {
- tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
- if (tag.visiblePanos && tag.visiblePanos.length) {
- tag.visiblePanos = tag.visiblePanos.map(function (id) {
- return _this2.app.core.get('Player').model.panos.index[id];
- });
- } else {
- tag.visiblePanos = _this2.getVisiblePano(tag.position);
- }
- }
- });
- this.tags = tags;
- }
- }, {
- key: "install",
- value: function install(name, plugin) {
- this.ready = true;
- this.plugin.resolve(this);
- if (this[name]) {
- this[name].resolve(plugin);
- if (this.loaded && typeof plugin.render === 'function') {
- plugin.render();
- }
- }
- }
- /**
- * 3d坐标转2d屏幕坐标
- * @param {Object} position3d {x,y,z}
- * @returns {Object} {x,y}
- */
- }, {
- key: "convertPositionTo2D",
- value: function convertPositionTo2D(position3d) {
- return convertTool.getPos2d(position3d, this.app.core.get('Player'));
- }
- }, {
- key: "ifShelter",
- value: function ifShelter(position3d, pos2d) {
- var player = this.app.core.get('Player');
- var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
- return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
- }
- }, {
- key: "getVisiblePano",
- value: function getVisiblePano(position) {
- var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
- var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
- var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
- maxDis,
- tolerance
- }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
- return visiblePanos;
- }
- }, {
- key: "draggingSpot3d",
- get: function get() {
- return this.d__;
- },
- set: function set(state) {
- this.d__ = state;
- }
- }, {
- key: "add",
- value: function add(tags) {
- var _this3 = this;
- if (!tags || !tags.length) {
- return Promise.resolve();
- }
- tags.forEach(function (tag) {
- if (tag.position && tag.position instanceof THREE.Vector3 == false) {
- tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
- if (tag.visiblePanos && tag.visiblePanos.length) {
- tag.visiblePanos = tag.visiblePanos.map(function (id) {
- return _this3.app.core.get('Player').model.panos.index[id];
- });
- } else {
- tag.visiblePanos = _this3.getVisiblePano(tag.position);
- } //tag.visiblePanos ? (tag.visiblePanos = tag.visiblePanos.map(id => this.app.core.get('Player').model.panos.index[id])) : (tag.visiblePanos = this.getVisiblePano(tag.position))
- }
- _this3.tags.push(tag);
- }); //this.tags = [].concat(this.tags, tags)
- return this.view.then(function (view) {
- return view.refresh();
- });
- }
- }, {
- key: "remove",
- value: function remove(sid) {
- var index = this.tags.findIndex(function (t) {
- return t.sid == sid;
- });
- if (index != -1) {
- this.tags.splice(index, 1);
- return this.view.then(function (view) {
- return view.remove(sid);
- });
- }
- return Promise.resolve();
- }
- }, {
- key: "removeAll",
- value: function removeAll() {
- this.tags = [];
- return this.view.then(function (view) {
- return view.removeAll();
- });
- }
- }, {
- key: "removeTag3D",
- value: function removeTag3D(sid) {
- var player = this.app.core.get('Player');
- var tag = getTag3d(sid);
- tag && player.model.tags.remove(tag);
- }
- }, {
- key: "update",
- value: function update(tags) {
- if (!tags || !tags.length) {
- return;
- }
- this.tags = tags;
- }
- }, {
- key: "openedTag3d",
- get: function get() {
- return this.openedTag3d_;
- },
- set: function set(tag) {
- if (this.openedTag3d_) {
- var tag3d_ = getTag3d(this.openedTag3d_);
- tag3d_ && common$1.updateVisible(tag3d_, 'opened', false, 1, 'cancel');
- }
- this.openedTag3d_ = tag;
- if (tag) {
- //面板展开就强制显示
- var tag3d = getTag3d(tag);
- common$1.updateVisible(tag3d, 'opened', true, 1, 'add');
- }
- }
- }, {
- key: "setTag3dOpen",
- value: function setTag3dOpen(openedTag3d) {
- var _this4 = this;
- console.warn('setTag3dOpen', openedTag3d === null || openedTag3d === void 0 ? void 0 : openedTag3d.sid);
- setTimeout(function () {
- _this4.openedTag3d = openedTag3d; //tag3d只有展开的要更新xy
- }, 1); //等focus先执行
- }
- }, {
- key: "updatePosition",
- value: function updatePosition(tags, tag3ds) {
- var _this5 = this;
- //openedTag3d待删除!!!!!!!
- //设置当前要更新2d位置的列表
- //console.warn('updatePosition', tags, tag3ds)
- tags && (this.tags = tags === null || tags === void 0 ? void 0 : tags.slice()); //this.openedTag3d = openedTag3d
- if (tag3ds) {
- //proxy版tag3ds
- //只有新建和编辑时才能拿到orz,所以要自己加载数据时创建一个临时的
- this.tag3ds = tag3ds;
- tag3ds.forEach(function (e) {
- _this5.buildTag3dFromData(e);
- });
- }
- }
- }, {
- key: "buildTag3dFromData",
- value: function buildTag3dFromData(tag, type) {
- var _this6 = this;
- if (!tag.position) return; //导入的
- var tag3d = getTag3d(tag);
- if (!tag3d) {
- tag3d = new Tag({
- title: tag.title,
- sid: tag.sid,
- position: tag.position,
- normal: tag.normal,
- lineLength: tag.visiSetting.lineLen,
- fontsize: tag.visiSetting.fontSize,
- noLine: !this.isSingleView //分屏的tag3d没有线
- }, player$1);
- tag3d.titleLabel.visible = tag3dsLabelVisi.visible;
- tag3d.titleLabel.visibleReasons = tag3dsLabelVisi.visibleReasons;
- tag3d.titleLabel.unvisibleReasons = tag3dsLabelVisi.unvisibleReasons;
- setTimeout(function () {
- _this6.edit.changeTag3DProp({
- iconType: tag.iconType,
- angle: tag.visiSetting.angle,
- scale: tag.visiSetting.scale,
- texSrc: tag.icon
- }, tag.sid, {
- dontGetVisiPanos: true
- });
- }, 1);
- this.initTag3d(tag3d, tag);
- }
- /* tag3d.tag = tag
- tag.tag3d = tag3d */
- }
- /**
- * 点击修改后瞬间跳到最佳点位
- * @param {*} sid
- */
- }, {
- key: "initTag3d",
- value: function initTag3d(tag3d, item) {
- var _this7 = this;
- tag3d.addEventListener('clicked', function () {
- //注意:连续触发两次将不能focus
- _this7.emit('tag3dClicked', item); //这可以是数据里的不必是proxy
- }); //item不是真正在用的,莫名会变. 得从tag3ds里找,或者openedTag3d
- var update2d = function update2d() {
- var desc = getDesc(_this7.openedTag3d);
- desc.needUpdate2d = true;
- desc.needGetVisiPanos = true;
- };
- tag3d.addEventListener('dragLineLen', function () {
- _this7.emit('tag3dLineLen', math$2.toPrecision(tag3d.lineLength, 2)); //to slider
- update2d();
- });
- tag3d.addEventListener('posChanged', update2d);
- tag3d.addEventListener('floorUpdate', function (e) {
- var tag = _this7.tag3ds.find(function (e) {
- return e.sid == item.sid;
- });
- console.log('floorUpdate', tag.floorIndex, e.target.floorIndex);
- tag.floorIndex = e.target.floorIndex;
- });
- tag3d.addEventListener('hover', function () {
- _this7.emit('hoverTag3d', item);
- });
- tag3d.addEventListener('unhover', function () {
- _this7.emit('unhoverTag3d', item);
- });
- updateTag3dVisi(item);
- }
- }, {
- key: "focusTag",
- value: function focusTag(sid) {
- var _this8 = this;
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
- direction: '',
- checkSameTag: false,
- attrs: null
- };
- return new Promise(function (resolve) {
- if (typeof options !== 'object') {
- options = {};
- }
- var tag = _this8.tags.find(function (t) {
- return t.sid == sid;
- });
- if (!tag) {
- return resolve();
- } // let $tag = document.querySelector(this.root).querySelector(`[data-tag-id="${sid}"]`)
- // if (!$tag) {
- // return resolve()
- // }
- _this8.emit('focus', sid, _this8.focusId);
- if (sid == _this8.focusId && options.checkSameTag) {
- _this8.focusId = '';
- return resolve();
- }
- _this8.focusId = sid;
- var player = _this8.player || _this8.app.core.get('Player'); // 根据热点可视和距离限制查询最近pano
- var minDistance = 1.5;
- var visiPanos = player.model.panos.closestPanoTowardPoint({
- point: tag.position,
- getAll: true
- }).map(function (p) {
- return p.item;
- }).filter(function (p) {
- return tag.visiblePanos.indexOf(p) > -1 && p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance;
- });
- var pano = visiPanos[0]; // 优先查找当前floor
- var currentFloorVisiPanos = visiPanos.filter(function (p) {
- return p.floorIndex == player.model.currentFloor.floorIndex;
- });
- if (currentFloorVisiPanos.length > 0) {
- pano = currentFloorVisiPanos[0];
- }
- if (!pano) {
- console.warn('该热点无可视点位');
- pano = player.currentPano;
- } // 标识开始对准
- _this8.__is_aimat = true;
- if (options.direction) {
- var attrs;
- if (options.attrs) {
- attrs = options.attrs;
- } else {
- var $tag = document.querySelector(_this8.root).querySelector("[data-tag-id=\"".concat(sid, "\"]"));
- var $body = $tag.querySelector('.tag-body');
- if (!$body) {
- return resolve();
- }
- attrs = {
- width: ($body.clientWidth || 0) + parseInt(getStyle($body, 'margin-left')) + parseInt(getStyle($body, 'margin-right')),
- height: ($body.clientHeight || 0) + parseInt(getStyle($body, 'margin-top')) + parseInt(getStyle($body, 'margin-bottom'))
- };
- }
- var center = new THREE.Vector3();
- var unprojectCenter = function unprojectCenter() {
- // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
- tag.x = _this8.app.TagManager.convertPositionTo2D(tag.position).pos.x;
- tag.y = _this8.app.TagManager.convertPositionTo2D(tag.position).pos.y;
- center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
- var centerX = tag.x - (options.direction == 'left' ? attrs.width / 2 : 0);
- var centerY = tag.y - (options.direction == 'top' ? attrs.height / 2 : 0); // 2d坐标映射到3d
- _this8.app.TagManager.convertScreenPositionToNDC(centerX, centerY, center, _this8.app.dom);
- center.unproject(player.camera);
- }; // 面板中心
- if (pano.id == player.currentPano.id && player.mode == 'panorama') {
- unprojectCenter();
- var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
- var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
- var reverse = cameraDirec.dot(targetDirec);
- if (reverse < 0) {
- var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
- center = player.camera.position.clone().sub(distanceVec);
- }
- tag.x;
- player.flyToPano({
- pano: pano,
- lookAtPoint: center,
- duration: 1000,
- isTagFlying: true
- }, function () {
- // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) {
- // resolve()
- // this.__is_aimat = false
- // } else {
- // unprojectCenter()
- // this.app.Camera.flyToPoint(center, {
- // aimDur: 400,
- // })
- // resolve()
- // this.__is_aimat = false
- // }
- setTimeout(function () {
- unprojectCenter();
- player.flyToPano({
- pano: pano,
- aimDuration: 500,
- lookAtPoint: center
- });
- resolve();
- _this8.__is_aimat = false;
- }, 10);
- });
- } else {
- player.flyToPano({
- pano: pano,
- lookAtPoint: tag.position,
- duration: 1000,
- isTagFlying: true
- }, function () {
- return setTimeout(function () {
- unprojectCenter();
- player.flyToPano({
- pano: pano,
- aimDuration: 400,
- lookAtPoint: center
- });
- resolve();
- _this8.__is_aimat = false;
- }, 10);
- });
- }
- } else {
- player.flyToPano({
- pano: pano,
- lookAtPoint: tag.position,
- isTagFlying: true // duration: 700,
- }, function () {
- resolve();
- _this8.__is_aimat = false;
- });
- }
- });
- }
- }, {
- key: "unfocusTag",
- value: function unfocusTag() {
- this.focusId = '';
- }
- }, {
- key: "closeTag",
- value: function closeTag(sid) {
- this.unfocusTag();
- this.emit('close');
- }
- }, {
- key: "openTag",
- value: function openTag(sid) {
- this.emit('open', sid);
- }
- /**
- * 使相机转至热点或面板中心
- * @param {*} data 包含有tag或sid,以及board相关数据
- * @param {"board" | "tag"} target 聚焦于热点还是面板中心
- * @param {"top" | "left"} boardDirc 面板位于热点上面还是左面
- */
- }, {
- key: "getFocusPos",
- value: function getFocusPos(tag, useDir) {
- var tag3d = getTag3d(tag);
- return (tag3d === null || tag3d === void 0 ? void 0 : tag3d.getLabel2dPos(useDir && (tag3d.boardDirc_ || 'left'))) || tag.position;
- }
- }, {
- key: "open",
- value: function open(sid, retry) {
- var _this9 = this;
- var tag = this.tags.find(function (t) {
- return t.sid == sid;
- });
- if (!tag.visible) {
- if (retry) {
- return;
- }
- return setTimeout(function () {
- _this9.open(sid, true);
- }, 500);
- }
- var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
- if ($tag) {
- var $point = $tag.querySelector(".point");
- var evt = document.createEvent('HTMLEvents');
- if (this.app.config.mobile) {
- evt.initEvent('click', true, true);
- } else {
- evt.initEvent('mouseenter', true, true);
- }
- evt.fixed = true;
- $point.dispatchEvent(evt);
- } // this.emit('openTag', sid)
- }
- }, {
- key: "close",
- value: function close(sid) {
- var tag = this.tags.find(function (t) {
- return t.sid == sid;
- });
- if (!tag.visible) {
- return;
- }
- var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
- if ($tag) {
- var evt = document.createEvent('HTMLEvents');
- if (this.app.config.mobile) {
- $tag = $tag.querySelector('.arrow i');
- evt.initEvent('click', true, true);
- } else {
- evt.initEvent('mouseleave', true, true);
- }
- evt.relatedTarget = true;
- evt.unfixed = true;
- if ($tag) {
- $tag.dispatchEvent(evt);
- }
- }
- }
- /**
- * 查看热点的最佳点位
- * @param {*} tag
- * @returns
- */
- }, {
- key: "findBestPanoForWatching",
- value: function findBestPanoForWatching(tag, a) {
- var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
- var visiPanos = player.model.panos.closestPanoTowardPoint({
- point: this.getFocusPos(tag),
- getAll: true,
- require: [function (p) {
- return tag.visiblePanos.indexOf(p) > -1;
- }]
- }).map(function (p) {
- return p.item;
- }); // 查找非孤立点位
- var notAloneVisiPanos = visiPanos.filter(function (p) {
- return p.neighbourUUIDs.filter(function (id) {
- return id != p.id;
- }).length > 0;
- });
- if (notAloneVisiPanos.length > 0) {
- visiPanos = notAloneVisiPanos;
- } // // 查找符合距离限制的(要能完全展示UI)
- // let minDistance = 1.5
- // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
- // if (minDistanceVisiPanos.length > 0) {
- // visiPanos = minDistanceVisiPanos
- // }
- // 查找当前floor
- var currentFloorVisiPanos = visiPanos.filter(function (p) {
- return p.floorIndex == player.model.currentFloor.floorIndex;
- });
- if (currentFloorVisiPanos.length > 0) {
- visiPanos = currentFloorVisiPanos;
- }
- var pano = visiPanos[0];
- if (a && player.mode === Viewmode$1.PANORAMA) {
- visiPanos = visiPanos.filter(function (pano) {
- var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
- 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);
- var angle = p1.angleTo(p2);
- return angle < Math.PI / 4;
- });
- }
- if (visiPanos.length > 0) {
- pano = visiPanos[0];
- }
- if (!pano) {
- console.warn('该热点无可视点位');
- pano = player.currentPano;
- }
- return pano;
- }
- /**
- * 显示所有热点
- * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
- */
- }, {
- key: "showAll",
- value: function showAll() {
- var _this$tags;
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- this.showTags = true;
- if (force) {
- this.showTagsVisible = true;
- }
- (_this$tags = this.tags) === null || _this$tags === void 0 ? void 0 : _this$tags.forEach(function (e) {
- getDesc(e).needUpdate2d = true;
- });
- }
- /**'
- * 隐藏所有热点
- * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
- */
- }, {
- key: "hideAll",
- value: function hideAll() {
- var _this$tags2;
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- this.showTags = false;
- if (force) {
- this.showTagsVisible = false;
- }
- (_this$tags2 = this.tags) === null || _this$tags2 === void 0 ? void 0 : _this$tags2.forEach(function (e) {
- getDesc(e).needUpdate2d = true;
- });
- }
- /**
- * type 类型|| tags (热点);traces(痕迹物证);links(场景关联);cameras(监控)sceneDraws(空间绘制);aiList(ai列表),billboards(指示牌)
- * sid 可选 || 当type是痕迹物证的时候,如果传了dictId ,则需要控制该dictId所在的分类。
- */
- }, {
- key: "switchAllDisplay",
- value: function switchAllDisplay(visible) {
- var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'clearAll';
- var ignore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- //多次调用要追加reason避免混乱
- //清屏
- console.log('switchAllDisplay', visible, reason, ignore);
- ignore.traces || this.switchLabels({
- type: 'traces',
- visible
- }, null, reason);
- ignore.links || this.switchLabels({
- type: 'links',
- visible
- }, null, reason);
- ignore.cameras || this.switchLabels({
- type: 'cameras',
- visible
- }, null, reason);
- ignore.sceneDraws || this.switchLabels({
- type: 'sceneDraws',
- visible
- }, null, reason);
- ignore.aiList || this.switchLabels({
- type: 'aiList',
- visible
- }, null, reason);
- ignore.overlays || this.switchLabels({
- type: 'overlays',
- visible
- }, null, reason);
- ignore.billboards || this.switchLabels({
- type: 'billboards',
- visible
- }, null, reason);
- ignore.models || this.switchLabels({
- type: 'models',
- visible
- }, null, reason); //this.hideAll //热点
- ignore.tag2ds || this.switchLabels({
- type: 'tag2ds',
- visible
- }, null, reason);
- ignore.measures || this.switchLabels({
- type: 'measures',
- visible
- }, null, reason);
- ignore.paths || this.switchLabels({
- type: 'paths',
- visible
- }, null, reason);
- ignore.miniView || player$1.setMiniViewVisi(visible, reason, 5);
- }
- }, {
- key: "switchLabels",
- value: function switchLabels(_ref2, dictId) {
- var type = _ref2.type,
- visible = _ref2.visible;
- var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'switchDisplayType';
- //展示页筛选可见的类型
- //console.log('switchLabels', type, visible, dictId)
- var level = 5;
- if (type == 'traces') {
- if (!dictId) {
- //能整体就整体咯, 这样后续添加的子集不会显示
- common$1.updateVisible(player$1.model.tags, reason, visible, level);
- } else {
- this.tag3ds.forEach(function (tag) {
- if (dictId != void 0 && tag.dictId != dictId) return;
- common$1.updateVisible(getTag3d(tag), reason, visible, level);
- });
- }
- if (!visible) {
- var tag3d = getTag3d(this.openedTag3d);
- tag3d && !tag3d.realVisible() && this.emit('closeTag3d');
- }
- } else if (type == 'links') {
- visible ? player$1.viewLinkManager.showAllViews(reason) : player$1.viewLinkManager.hideAllViews(reason, level);
- } else if (type == 'cameras') {
- visible ? player$1.$app.Camera.monitor.control.showAll(null, reason, level) : player$1.$app.Camera.monitor.control.hideAll(null, reason);
- } else if (type == 'sceneDraws') {
- visible ? player$1.$app.PolygonMarkManager.showAll(true, true, reason) : player$1.$app.PolygonMarkManager.hideAll(true, reason, level);
- } else if (type == 'aiList') {
- this.app.Scene.setAiBoxShow(visible, reason, level);
- } else if (type == 'billboards') {
- /* player.billboardManager.ctx.list.forEach(bill => {
- common.updateVisible(bill, reason, visible, level)
- }) */
- common$1.updateVisible(player$1.OverlayManager.billGroup, reason, visible, level);
- } else if (type == 'overlays') {
- // 包括 视频、图片
- common$1.updateVisible(player$1.OverlayManager.decorateGroup, reason, visible, level);
- /* player.OverlayManager.group.children.forEach(e => {
- if (!e.info.isBillboard) {
- common.updateVisible(e, reason, visible, level)
- }
- })
- common.updateVisible(player.OverlayManager.frameGroup, reason, visible, level) */
- //common.updateVisible(player.OverlayManager.groupRoot, reason, visible, level)
- } else if (type == 'models') {
- common$1.updateVisible(player$1.GLTFEditor.group, reason, visible, level);
- } else if (type == 'tag2ds') {
- this.tags.forEach(function (e) {
- common$1.updateVisible(e, reason, visible, level);
- });
- } else if (type == 'measures') {
- common$1.updateVisible(player$1.model.measurements, reason, visible, level);
- common$1.updateVisible(player$1.model.measureRulers, reason, visible, level);
- } else if (type == 'paths') {
- common$1.updateVisible(player$1.model.paths, reason, visible, level);
- } else if (type == 'traces-label') {
- //测试说到cad编辑时隐藏label
- common$1.updateVisible(tag3dsLabelVisi, reason, visible); //可能没创建好所以先记录值
- this.tag3ds.forEach(function (tag) {
- var _getTag3d2;
- common$1.updateVisible((_getTag3d2 = getTag3d(tag)) === null || _getTag3d2 === void 0 ? void 0 : _getTag3d2.titleLabel, reason, visible);
- });
- }
- /* if (visible) {
- this.lastMiniViewType == void 0 || player.setMiniViewType(this.lastMiniViewType, 'notFrom2d')
- this.lastMiniViewType = null
-
- setTimeout(() => {
- //fix: 前端那边恢复时会显示,这里延时隐藏下
- if (player.mode != 'panorama') {
- document.querySelector('div[xui_min_map]').style.display = 'none'
- }
- },1)
-
- } else if(!this.lastMiniViewType && player.miniViewType){//已经关了就不要再关
- this.lastMiniViewType = player.miniViewType
- player.setMiniViewType(0 )
- } */
- }
- }, {
- key: "convertScreenPositionToNDC",
- value: function convertScreenPositionToNDC(centerX, centerY, center) {
- return math$2.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
- }
- }, {
- key: "removeAllMeasure",
- value: function removeAllMeasure() {
- measuringTool.dispatchEvent('cancel_insertions'); //如果在测量中,取消当前,重新测量
- player$1.model.measurements.children.slice().forEach(function (e) {
- return e.dispose();
- });
- }
- }, {
- key: "openMagnifier",
- value: function openMagnifier(state) {
- common$1.updateVisible(this.magnifier, 'enable', state, 1);
- }
- }, {
- key: "tagEditing",
- get: function get() {
- return tagEditing_;
- },
- set: function set(tag) {
- tagEditing_ = tag;
- }
- }, {
- key: "toJSON",
- value: function toJSON(tags) {
- var data = JSON.stringify(tags || this.tags, function (key, value) {
- if (key === 'visiblePanos' && value) {
- return value.map(function (v) {
- return v.id;
- });
- }
- return value;
- });
- return JSON.parse(data);
- }
- }, {
- key: "bindEvents",
- value: function bindEvents() {
- var _this10 = this;
- THREE.shim = {};
- var player = this.app.core.get('Player');
- var interactables = [],
- intersectMesh,
- dragMesh,
- dragInfo,
- lastHoverMesh;
- var interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
- var checkObjects = [player.model.tags, player.model.measurements];
- player.on('collectIntersectMesh', function (meshes, e) {
- interactables = [];
- var _iterator = _createForOfIteratorHelper$1(checkObjects),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var objects = _step.value;
- objects.traverseVisible(function (node) {
- //检测加了侦听的object
- if (node._listeners && node.visible) {
- var hasInteractableListener = interactableListeners.filter(function (e) {
- return node._listeners[e] !== undefined;
- }).length > 0;
- if (hasInteractableListener) {
- interactables.push(node);
- }
- }
- });
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- meshes.push.apply(meshes, _toConsumableArray(interactables));
- });
- player.on('judgeIntersect', function (intersect, e) {
- //判断是否intersect了overlay
- /* let a = player.getMouseIntersect(null, interactables, { recursive: true, type: 'getAll' })
- a && console.log(a) */
- if (e.getConsumed()) return intersectMesh = null; //console.log('intersect.object', intersect?.object.name, intersect?.object.type)
- if (intersect && (intersectMesh = interactables.find(function (e) {
- return intersect.object.isChildOf(e);
- }))) {
- e.consume();
- } else {
- intersectMesh = null; //this.updateByIntersect(intersect)
- }
- });
- player.on('pointerStart', function (_ref3) {
- var consume = _ref3.consume,
- getConsumed = _ref3.getConsumed;
- if (getConsumed() || !intersectMesh || dragMesh) return; //(dragMesh = null) //因potree在pointerStart时没改变dragMesh这也不改,否则forceDrag的会null,希望没问题
- intersectMesh.dispatchEvent({
- type: 'startDragging'
- }); //intersectMesh?.object && console.log('pointerStart', intersectMesh?.object.name)
- dragMesh = intersectMesh;
- player.cameraControls.activeControl.enabled = false;
- consume();
- tag3dPanelPointerEnable(false);
- });
- player.on('pointerMove', function (_ref4) {
- var _dragInfo, _dragInfo2;
- var consume = _ref4.consume,
- getConsumed = _ref4.getConsumed,
- buttons = _ref4.buttons;
- //console.log('pointerMove', intersectMesh?.name)
- if (getConsumed()) return;
- if (dragMesh && (buttons == 0 || !((_dragInfo = dragInfo) !== null && _dragInfo !== void 0 && _dragInfo.notPressMouse))) {
- dragMesh.dispatchEvent({
- type: 'drag',
- drag: dragInfo
- });
- }
- if (!dragMesh || (_dragInfo2 = dragInfo) !== null && _dragInfo2 !== void 0 && _dragInfo2.notPressMouse) {
- try {
- var _intersectMesh;
- (_intersectMesh = intersectMesh) === null || _intersectMesh === void 0 ? void 0 : _intersectMesh.dispatchEvent({
- type: 'mousemove'
- });
- if (intersectMesh != lastHoverMesh) {
- var _intersectMesh2, _lastHoverMesh;
- //console.log('intersectMesh',intersectMesh?.name)
- (_intersectMesh2 = intersectMesh) === null || _intersectMesh2 === void 0 ? void 0 : _intersectMesh2.dispatchEvent({
- type: 'mouseover'
- });
- (_lastHoverMesh = lastHoverMesh) === null || _lastHoverMesh === void 0 ? void 0 : _lastHoverMesh.dispatchEvent({
- type: 'mouseleave'
- });
- }
- lastHoverMesh = intersectMesh;
- } catch (e) {
- console.error(e);
- }
- }
- (dragMesh || intersectMesh) && consume();
- });
- player.on('pointerUp', function () {
- var _dragInfo3;
- var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- if (e.getConsumed()) return;
- if (!player.mouseCouldBeClickToMove && (_dragInfo3 = dragInfo) !== null && _dragInfo3 !== void 0 && _dragInfo3.notPressMouse) return; //drag了
- //intersectMesh?.dispatchEvent({ type: 'startDragging' }) //???
- //console.log('pointerUp')
- if (dragMesh) {
- dragMesh.dispatchEvent(Object.assign({}, e, {
- type: 'drop',
- drag: dragInfo
- }));
- dragInfo = null;
- dragMesh = null;
- e.consume(); //还要触发后续的click不能consume
- player.cameraControls.activeControl.enabled = true;
- player.cameraControls.activeControl.reset();
- }
- tag3dPanelPointerEnable(true);
- });
- player.on('forceToDrag', function (e) {
- var _e$drag;
- if (dragMesh != ((_e$drag = e.drag) === null || _e$drag === void 0 ? void 0 : _e$drag.object)) {
- var _e$drag2, _dragMesh;
- if (dragMesh) {
- dragMesh.dispatchEvent(Object.assign({}, e, {
- type: 'drop',
- drag: dragInfo
- }));
- }
- dragMesh = (_e$drag2 = e.drag) === null || _e$drag2 === void 0 ? void 0 : _e$drag2.object;
- (_dragMesh = dragMesh) === null || _dragMesh === void 0 ? void 0 : _dragMesh.dispatchEvent(Object.assign({}, e, {
- type: 'startDragging'
- }));
- dragInfo = e.drag;
- /* if(dragMesh){
- player.mouseAtMouseDown.copy(player.mouse) //for set mouseCouldBeClickToMove false
- } */
- }
- });
- player.on('click', function (e) {
- var _intersectMesh$_liste, _intersectMesh$_liste2;
- if (e.getConsumed() || !e.isAtDomElement) return; //console.log('player.on( click ', intersectMesh?.name)
- if (intersectMesh && (_intersectMesh$_liste = intersectMesh._listeners) !== null && _intersectMesh$_liste !== void 0 && (_intersectMesh$_liste2 = _intersectMesh$_liste.click) !== null && _intersectMesh$_liste2 !== void 0 && _intersectMesh$_liste2.length
- /* && !intersectMesh.tag.dragEnable */
- ) {
- intersectMesh.dispatchEvent({
- type: 'click',
- point: player.intersect.point
- });
- e.consume();
- } else if (_this10.openedTag3d) {
- delete _this10.openedTag3d.x;
- delete _this10.openedTag3d.y;
- _this10.openedTag3d.visible = false;
- _this10.openedTag3d = null;
- _this10.emit('closeTag3d');
- e.consume();
- }
- });
- }
- }]);
- return TagManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var _visibleEnter = /*#__PURE__*/_classPrivateFieldKey("visibleEnter");
- var _visibleLeave = /*#__PURE__*/_classPrivateFieldKey("visibleLeave");
- var Manager = /*#__PURE__*/function () {
- function Manager(app) {
- _classCallCheck(this, Manager);
- Object.defineProperty(this, _visibleLeave, {
- value: _visibleLeave2
- });
- Object.defineProperty(this, _visibleEnter, {
- value: _visibleEnter2
- });
- this.app = app;
- this.player = null;
- this.symbol = null;
- this.visible = false;
- }
- _createClass(Manager, [{
- key: "enter",
- value: function enter(symbol) {
- var _this = this;
- if (this.symbol) {
- return;
- }
- this.player = this.app.core.get('Player');
- if (this.player == void 0) {
- setTimeout(function () {
- return _this.enter(symbol);
- }, 500);
- return;
- }
- this.symbol = symbol;
- if (symbol == 'visible') {
- _classPrivateFieldBase(this, _visibleEnter)[_visibleEnter]();
- }
- }
- }, {
- key: "leave",
- value: function leave() {
- if (this.symbol == 'visible') {
- _classPrivateFieldBase(this, _visibleLeave)[_visibleLeave]();
- }
- this.symbol = null;
- }
- }, {
- key: "setVisibleState",
- value: function setVisibleState(sid) {
- var tag = this.app.TagManager.tags.find(function (t) {
- return t.sid == sid;
- });
- if (tag) {
- this.player.linkEditor.SetOneTagVisible(tag);
- }
- }
- }]);
- return Manager;
- }();
- function _visibleEnter2() {
- this.visible = true;
- if (this.player.linkEditor) {
- this.player.linkEditor.enterSet('tagVisible');
- this.player.linkEditor.beginSetTagVisible();
- }
- this.player.model.floorplanCadImg.hideCadPlane();
- }
- function _visibleLeave2() {
- this.visible = false;
- this.player.linkEditor.finishSetTagVisible();
- this.player.model.floorplanCadImg.showCadPlane();
- }
- var TagManager = /*#__PURE__*/function (_Emiter) {
- _inherits(TagManager, _Emiter);
- var _super = _createSuper$3(TagManager);
- function TagManager(app) {
- var _this2;
- _classCallCheck(this, TagManager);
- _this2 = _super.call(this);
- _this2.focusBeforeModify = function (sid) {
- var player = _this2.app.core.get('Player');
- _this2.editTag = _this2.tags.find(function (t) {
- return t.sid == sid;
- });
- var pano = _this2.findBestPanoForWatching(_this2.editTag);
- player.flyToPano({
- pano: pano,
- lookAtPoint: _this2.editTag.position,
- aimDuration: 0,
- duration: 1,
- checkAlone: true
- }, function () {
- _this2.edit.enter(_this2.editTag, function () {
- _this2.editHandle.markTagPos = _this2.editTag.position;
- _this2.editHandle.markSpotA.elem.style.display = 'block';
- _this2.editHandle.markSpotB.elem.style.display = 'block';
- });
- }); // this.app.Camera.flyToPoint(pano.position, {
- // aimDur: 0, // 同点位镜头旋转时间
- // dur: 1, // 点位跳转时间(不能为0)
- // done: () => {
- // this.edit.enter(() => {
- // this.editHandle.markTagPos = this.editTag.position
- // this.editHandle.markSpotA.elem.style.display = 'block'
- // this.editHandle.markSpotB.elem.style.display = 'block'
- // })
- // },
- // })
- };
- _this2.focusing = function (data) {
- var player = _this2.app.core.get('Player');
- var center = new THREE.Vector3();
- var tag = _this2.tags.find(function (t) {
- return t.sid == data.sid;
- }) || data.tag;
- var pano = _this2.findBestPanoForWatching(tag);
- /**
- * 同步带看热点方向
- */
- var syncTagRotate = function syncTagRotate() {
- if (player.mode === Viewmode$1.PANORAMA) {
- _this2.app.Camera.emit(PlayerEvents.Rotate, {
- panoId: player.currentPano ? player.currentPano.id : null,
- quaternion: player.cameraControls.activeControl.camera.quaternion,
- mode: Viewmode$1.PANORAMA,
- type: 'flyToPano'
- });
- }
- };
- var unprojectCenter = function unprojectCenter() {
- // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
- tag.x = _this2.convertPositionTo2D(tag.position).pos.x;
- tag.y = _this2.convertPositionTo2D(tag.position).pos.y;
- center.set(0, 0, 0);
- var centerX = tag.x;
- var centerY = tag.y; // 根据boardDirc向左或向上偏移
- if (data.board) {
- if (data.board.width) {
- centerX = tag.x - data.board.width / 2;
- }
- if (data.board.height) {
- centerY = tag.y - data.board.height / 2;
- }
- } else {
- centerX = tag.x;
- centerY = tag.y;
- } // 2d坐标映射到3d
- math$2.convertScreenPositionToNDC(centerX, centerY, center, _this2.app.dom);
- center.unproject(player.camera);
- }; // 默认中心点目标
- data.target = data.target || 'board';
- if (data.target == 'board') {
- // 面板中心
- if (pano.id == player.currentPano.id && player.mode == 'panorama') {
- _this2.emit('focus.rotating');
- unprojectCenter();
- var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
- var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
- var reverse = cameraDirec.dot(targetDirec);
- if (reverse < 0) {
- var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
- center = player.camera.position.clone().sub(distanceVec);
- }
- player.flyToPano({
- pano: pano,
- lookAtPoint: center,
- checkAlone: true,
- isTagFlying: true
- }, function () {
- if (tag.x > window.innerWidth / 4 && tag.x < window.innerWidth / 4 * 3) {
- syncTagRotate();
- _this2.emit('focus.rotated', tag);
- } else {
- unprojectCenter();
- player.flyToPano({
- pano: pano,
- aimDuration: 600,
- lookAtPoint: center
- }, function () {
- syncTagRotate();
- _this2.emit('focus.rotated', tag);
- });
- }
- });
- } else {
- player.flyToPano({
- pano: pano,
- lookAtPoint: tag.position,
- duration: 1000,
- checkAlone: true,
- isTagFlying: true
- }, function () {
- return setTimeout(function () {
- unprojectCenter();
- player.flyToPano({
- pano: pano,
- aimDuration: 600,
- lookAtPoint: center
- }, function () {
- _this2.emit('focus.rotated', tag);
- });
- }, 10);
- });
- }
- } else if (data.target == 'tag') {
- // 热点
- player.flyToPano({
- pano: pano,
- lookAtPoint: tag.position,
- // duration: 700,
- checkAlone: true,
- isTagFlying: true
- }, function () {
- _this2.emit('focus.rotated', tag);
- });
- }
- };
- console.info('TagManagerV2');
- _this2.app = app;
- _this2.tags = [];
- _this2.icons = [];
- _this2.manager = new Manager(_this2.app);
- _this2.app.store.on('tags', function (data) {
- if (data.icons) {
- _this2.icons = data.icons;
- }
- if (data.tags) {
- data.tags.forEach(function (tag) {
- _this2.tags.push(tag);
- });
- } // 由于热点新增了floorIndex属性,需要兼容旧数据
- var player = app.core.get('Player');
- var dir = new THREE.Vector3(0, -1, 0);
- var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), dir, 0.001, 9999);
- _this2.tags.forEach(function (tag) {
- if (tag.floorIndex == void 0) {
- // 旧数据没有floorIndex
- // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
- ray.set(tag.position, dir);
- var intersection = ray.intersectObjects(player.model.chunks);
- if (!intersection.length) {
- // 如果射线检测不到模型,则根据floor的boundingBox判断
- var tagFloor = player.model.floors.list.find(function (floor) {
- return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
- });
- tag.floorIndex = tagFloor && tagFloor.floorIndex;
- } else {
- tag.floorIndex = intersection[0].object.parent.floorIndex;
- }
- }
- });
- _this2.loaded = true;
- _this2.emit('loaded', _this2.tags);
- });
- _this2.app.Camera.on('flying.started', function (pano) {
- if (!pano.isTagFlying) {
- _this2.emit('close');
- }
- });
- _this2.app.Scene.on('loaded', function () {
- var player = app.core.get('Player'); // 热点在哪些模式下显示
- var showIn = _this2.app.config.tag.showIn;
- var event = {
- tags: _this2.tags
- };
- app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function () {
- if (!_this2.tags || !_this2.tags.length) return;
- var setTagVisible = function setTagVisible(tag, visible) {
- if (tag.visible == visible) {
- return;
- }
- tag.visible = visible;
- };
- _this2.tags.forEach(function (item) {
- // isLose表示失效,重算的时候需要
- //s howTags表示是否全部可见
- if (item.isLose || _this2.showTags === false) {
- return setTagVisible(item, false);
- }
- if (_this2.manager.visible) {
- // 热点可视
- if (player.linkEditor.setTagVisible) {
- // 只所在楼层可视热点
- if (item.floorIndex != player.model.currentFloor.floorIndex) {
- if (player.linkEditor.tagVsetting != item) {
- //tagVsetting的要一直显示
- return setTagVisible(item, false);
- }
- }
- }
- } else {
- if (showIn) {
- if (showIn === 'all') {
- if (player.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player.currentPano)) {
- return setTagVisible(item, false);
- }
- } else if (showIn.indexOf(player.mode) == -1) {
- return setTagVisible(item, false);
- }
- }
- if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
- return setTagVisible(item, false);
- } // 默认情况
- if (!showIn || showIn != 'all' && showIn == Viewmode$1.PANORAMA) {
- if (player.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player.currentPano)) {
- return setTagVisible(item, false);
- }
- }
- }
- var pos = _this2.convertPositionTo2D(item.position);
- if (!pos.trueSide || !pos.inSight) {
- //trueSide是否在背面
- //inSight是否在当前屏幕可视区域
- //console.log(item.sid, false)
- return setTagVisible(item, false);
- }
- item.x = pos.pos.x;
- item.y = pos.pos.y;
- setTagVisible(item, true);
- });
- event.lastFrameChanged = player.lastFrameChanged;
- _this2.emit('update', event);
- });
- });
- return _this2;
- }
- _createClass(TagManager, [{
- key: "load",
- value: function load(tags) {
- var _this3 = this;
- if (!tags || !tags instanceof Array) {
- return;
- }
- var player = this.app.core.get('Player');
- tags.forEach(function (tag) {
- if (tag.position && tag.position instanceof THREE.Vector3 == false) {
- tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
- if (tag.visiblePanos && tag.visiblePanos.length) {
- tag.visiblePanos = tag.visiblePanos.map(function (id) {
- return player.model.panos.index[id];
- });
- } else {
- tag.visiblePanos = _this3.getVisiblePano(tag.position);
- }
- }
- });
- this.tags = tags;
- }
- /**
- * 3d坐标转2d屏幕坐标
- * @param {Object} position3d {x,y,z}
- * @returns {Object} {x,y}
- */
- }, {
- key: "convertPositionTo2D",
- value: function convertPositionTo2D(position3d) {
- return convertTool.getPos2d(position3d, this.app.core.get('Player'));
- }
- }, {
- key: "ifShelter",
- value: function ifShelter(position3d, pos2d) {
- var player = this.app.core.get('Player');
- var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
- return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
- }
- }, {
- key: "getVisiblePano",
- value: function getVisiblePano(position) {
- var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
- var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
- var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
- maxDis,
- tolerance
- }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
- return visiblePanos;
- }
- /**
- * 点击修改后瞬间跳到最佳点位
- * @param {*} sid
- */
- }, {
- key: "open",
- value: function open(sid) {
- var _this4 = this;
- var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var tag = this.tags.find(function (t) {
- return t.sid == sid;
- });
- if (tag) {
- if (!tag.visible) {
- console.log(retry);
- if (retry > 5) {
- return;
- }
- return setTimeout(function () {
- return _this4.open(sid, ++retry);
- }, 300);
- }
- this.emit('open', tag);
- }
- }
- }, {
- key: "focus",
- value: function focus(sid) {
- var tag = this.tags.find(function (t) {
- return t.sid == sid;
- });
- if (tag) {
- this.emit('focus', tag);
- }
- }
- }, {
- key: "close",
- value: function close() {
- this.emit('close');
- }
- /**
- * 查看热点的最佳点位
- * @param {*} tag
- * @returns
- */
- }, {
- key: "findBestPanoForWatching",
- value: function findBestPanoForWatching(tag) {
- var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
- var visiPanos = player.model.panos.closestPanoTowardPoint({
- point: tag.position,
- getAll: true,
- require: [function (p) {
- return tag.visiblePanos.indexOf(p) > -1;
- }]
- }).map(function (p) {
- return p.item;
- }); // 查找非孤立点位
- var notAloneVisiPanos = visiPanos.filter(function (p) {
- return p.neighbourUUIDs.filter(function (id) {
- return id != p.id;
- }).length > 0;
- });
- if (notAloneVisiPanos.length > 0) {
- visiPanos = notAloneVisiPanos;
- } // // 查找符合距离限制的(要能完全展示UI)
- // let minDistance = 1.5
- // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
- // if (minDistanceVisiPanos.length > 0) {
- // visiPanos = minDistanceVisiPanos
- // }
- // 查找当前floor
- var currentFloorVisiPanos = visiPanos.filter(function (p) {
- return p.floorIndex == player.model.currentFloor.floorIndex;
- });
- if (currentFloorVisiPanos.length > 0) {
- visiPanos = currentFloorVisiPanos;
- }
- var pano = visiPanos[0];
- if (player.mode === Viewmode$1.PANORAMA) {
- visiPanos = visiPanos.filter(function (pano) {
- var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
- 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);
- var angle = p1.angleTo(p2);
- return angle < Math.PI / 4;
- });
- }
- if (visiPanos.length > 0) {
- pano = visiPanos[0];
- }
- if (!pano) {
- console.warn('该热点无可视点位');
- pano = player.currentPano;
- }
- return pano;
- }
- /**
- * 显示所有热点
- * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
- */
- }, {
- key: "showAll",
- value: function showAll() {
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- this.showTags = true;
- if (force) {
- this.showTagsVisible = true;
- }
- }
- /**'
- * 隐藏所有热点
- * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
- */
- }, {
- key: "hideAll",
- value: function hideAll() {
- var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- this.showTags = false;
- if (force) {
- this.showTagsVisible = false;
- }
- }
- }, {
- key: "convertScreenPositionToNDC",
- value: function convertScreenPositionToNDC(centerX, centerY, center) {
- return math$2.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
- }
- }, {
- key: "toJSON",
- value: function toJSON(tags) {
- var data = JSON.stringify(tags || this.tags, function (key, value) {
- if (key === 'visiblePanos' && value) {
- return value.map(function (v) {
- return v.id;
- });
- }
- return value;
- });
- return JSON.parse(data);
- }
- }]);
- return TagManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var WalkManager$1 = /*#__PURE__*/function (_Emiter) {
- _inherits(WalkManager, _Emiter);
- var _super = _createSuper$2(WalkManager);
- function WalkManager(app) {
- var _this;
- _classCallCheck(this, WalkManager);
- _this = _super.call(this);
- _this.app = app;
- _this.edit = {};
- var player;
- var deferred = Deferred$1();
- _this.app.Scene.on('loaded', function () {
- player = _this.app.core.get('Player');
- player.linkEditor = new Link(player);
- deferred.resolve();
- });
- _this.edit.enter = function () {
- // 等到linkEditor初始化才能enter
- if (player && player.linkEditor) {
- setTimeout(function () {
- player.linkEditor.enterSet('panoVisible');
- player.labelManager.updateEntryVisi(false);
- }, 0);
- } else {
- deferred.then(function () {
- return _this.edit.enter();
- });
- }
- };
- _this.edit.exit = function () {
- player && player.linkEditor.finishSetPanoVisible();
- };
- _this.edit.undoEdit = function () {
- var pano = player.linkEditor.startEditPano;
- player.linkEditor.pauseSetPanoVisible(false, player.model.currentFloor);
- if (pano && pano.floorIndex == player.model.currentFloor.floorIndex) {
- player.linkEditor.SetOnePanoVisible(pano);
- _this.emit('walkManager.active', player.linkEditor.checkLinkStatus());
- }
- };
- _this.edit.checkNeedSave = function () {
- return player.linkEditor.checkPanoVisiChange();
- };
- _this.edit.save = function (promise) {
- promise(player.linkEditor.savePanoVisibles(), player.linkEditor.afterSavePanoVisibles.bind(player.linkEditor));
- };
- _this.edit.toggle = function (show) {
- // isSuccess 处理初始点位无法隐藏的交互
- var isSuccess = player.linkEditor.toggle(show);
- return isSuccess;
- };
- /**
- * 多楼层连接 相关函数
- */
- _this.edit.linkToUpperFloor = function () {
- var linkEditor = player.linkEditor;
- if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
- // let upperFloorIndex = linkEditor.activePano.floorIndex + 1
- var upperFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'upper');
- if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
- player.model.once('floor.changed', function (toFloor, mode) {
- setTimeout(function () {
- linkEditor.actionIcons.forEach(function (icon) {
- return icon.visible = false;
- });
- var activePano = linkEditor.lastFloorActivePano;
- activePano.footIcon.visible = true;
- linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
- }, 10);
- });
- _this.edit.unlinkToOtherFloor(null, {
- checkMainFirstView: false
- });
- _this.app.Scene.gotoFloor(upperFloorIndex);
- linkEditor.setMultiFloorPanoVisible = 'upper';
- };
- _this.edit.linkToLowerFloor = function () {
- var linkEditor = player.linkEditor;
- if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
- // 楼层跳转,多楼层模式
- // let lowerFloorIndex = linkEditor.activePano.floorIndex - 1
- var lowerFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'lower');
- if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
- player.model.once('floor.changed', function (toFloor, mode) {
- setTimeout(function () {
- linkEditor.actionIcons.forEach(function (icon) {
- return icon.visible = false;
- });
- var activePano = linkEditor.lastFloorActivePano;
- activePano.footIcon.visible = true;
- linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
- }, 10);
- });
- _this.edit.unlinkToOtherFloor(null, {
- checkMainFirstView: false
- }); //先取消旧连接
- _this.app.Scene.gotoFloor(lowerFloorIndex);
- linkEditor.setMultiFloorPanoVisible = 'lower';
- };
- _this.edit.floorLinkConfirm = function () {
- //确定楼层连接点
- var linkEditor = player.linkEditor;
- var activePano = linkEditor.lastFloorActivePano; // let upperFloorPano = linkEditor.getClosestOtherFloorPano(activePano, 'up')
- var linkToFloorPano = linkEditor.linkToFloorPano;
- if (!linkToFloorPano) return console.log('没有选择漫游点');
- _this.edit.unlinkToOtherFloor(linkToFloorPano); // 暂时单对单. 取消要连接的点的旧的楼连接
- if (linkToFloorPano) {
- linkEditor.savePanoVisiChange(activePano.id, [{
- type: 'add',
- id: linkToFloorPano.id
- }]);
- linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano));
- }
- };
- _this.edit.unlinkToOtherFloor = function (pano) {
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- _ref$checkMainFirstVi = _ref.checkMainFirstView,
- checkMainFirstView = _ref$checkMainFirstVi === void 0 ? true : _ref$checkMainFirstVi;
- //先取消和别的楼层的所有连接 / 点击‘不设置’
- var linkEditor = player.linkEditor;
- var firstViewPano = player.$app.core.get('Scene').firstView.pano;
- var shouldWarn;
- if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
- var activePano = pano || linkEditor.activePano;
- linkEditor.saveLastPanoVi(); //清除线前先保存设置
- var neighbours = linkEditor.panoVTemp[activePano.id] && linkEditor.panoVTemp[activePano.id].neighbourPanos || player.model.panos.index[activePano.id].neighbourPanos;
- var neighbourPanos = Object.keys(neighbours).map(function (pId) {
- return player.model.panos.index[pId];
- });
- var change = [];
- neighbourPanos.forEach(function (pano) {
- if (pano.floorIndex != activePano.floorIndex) {
- /* if (this.edit.checkFirstView(pano, activePano)) { //-----被驳回,所以先注释
- //被连接的是初始点且断开后会变孤立点
- return (shouldWarn = true)
- } */
- change.push({
- type: 'sub',
- id: pano.id
- });
- }
- });
- if (change.length) {
- linkEditor.savePanoVisiChange(activePano.id, change); //check activePano if it is firstViewPano . 如果不用检查代表过后还要连接别的
- if (checkMainFirstView && activePano == firstViewPano && !linkEditor.checkHasNeighbor(firstViewPano)) {
- shouldWarn = true; //恢复一个,使之不是孤立点
- change = [{
- type: 'add',
- id: change[0].id
- }];
- linkEditor.savePanoVisiChange(activePano.id, change);
- }
- linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano)); // 更新连接状态
- linkEditor.delVisibleLines(); //删除线
- linkEditor.showFootIcons(activePano, true);
- linkEditor.createPanoVisiLines(activePano); //创线
- }
- if (shouldWarn) {
- player.$app.gui.toast({
- event: 'DialogList3D.WalkManger.firstPointLimit',
- content: DialogList3D.WalkManger.firstPointLimit
- });
- setTimeout(function () {
- linkEditor.checkFloorLinkStatus(); //上下楼选项恢复
- }, 1);
- }
- };
- _this.edit.cancelFloorLink = function () {
- //取消设置楼层连接
- var linkEditor = player.linkEditor;
- _this.app.Scene.gotoFloor(linkEditor.lastFloorActivePano.floorIndex);
- linkEditor.actionIcons.forEach(function (icon) {
- return icon.visible = true;
- });
- linkEditor.linkToFloorPano = null;
- linkEditor.setMultiFloorPanoVisible = false;
- player.$app.WalkManager.emit('walkManager.multiFloorLinking', false); //置灰确定按钮
- }; //主点是初始点的话,主点可能连接多个其他点。
- _this.edit.checkFirstView = function (panoA, panoB) {
- var firstViewPano = player.$app.core.get('Scene').firstView.pano;
- var another;
- if (firstViewPano == panoA) {
- another = panoB;
- } else if (firstViewPano == panoB) {
- another = panoA;
- } else return false;
- var neighbours = player.linkEditor.getCurNeighbors(firstViewPano);
- var firstViewWillHide = neighbours.length == 1 && neighbours.includes(another.id);
- return firstViewWillHide;
- };
- return _this;
- }
- return WalkManager;
- }(tinyEmitter);
- 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); }; }
- 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; } }
- var WalkManager = /*#__PURE__*/function (_Emiter) {
- _inherits(WalkManager, _Emiter);
- var _super = _createSuper$1(WalkManager);
- function WalkManager(app) {
- var _this;
- _classCallCheck(this, WalkManager);
- _this = _super.call(this);
- _this.app = app;
- _this.player = null; // 所选点位的连接状态
- _this.on('walkManager.active', function (state) {
- var status = null;
- switch (state) {
- case 'walkManager.linkAll':
- status = 'all'; // 全部连接
- break;
- case 'walkManager.linkSome':
- status = 'some'; // 部分连接
- break;
- case 'walkManager.linkNone':
- status = 'none'; // 没有连接
- break;
- }
- _this.emit('pano.status', status);
- }); // 所选点位取消选择
- _this.on('walkManager.deactive', function () {
- _this.emit('pano.status');
- });
- return _this;
- }
- _createClass(WalkManager, [{
- key: "save",
- value: function save() {
- var data = this.toJSON();
- if (data.length == 0) {
- return Promise.resolve();
- }
- return this.app.APIs.editor.walk_save({
- data
- });
- }
- /**
- * 进入编辑状态
- * @returns
- */
- }, {
- key: "enter",
- value: function enter() {
- var _this2 = this;
- if (this.player === null) {
- this.app.Scene.whenLoaded(function () {
- _this2.player = _this2.app.core.get('Player');
- _this2.player.linkEditor = new Link(_this2.player);
- setTimeout(function () {
- return _this2.enter();
- }, 200);
- });
- return;
- }
- this.app.Scene.hideFloorCadImage();
- this.player.linkEditor.enterSet('panoVisible');
- this.player.labelManager.updateEntryVisi(false);
- }
- /**
- * 退出编辑状态
- */
- }, {
- key: "leave",
- value: function leave() {
- if (this.player) {
- this.app.Scene.showFloorCadImage();
- this.player.linkEditor.finishSetPanoVisible();
- }
- }
- /**
- * 处理初始点位无法隐藏的交互
- * @param {*} type
- * @returns
- */
- }, {
- key: "toggle",
- value: function toggle(type) {
- if (this.player) {
- return this.player.linkEditor.toggle(type);
- }
- }
- /**
- * 取消操作
- */
- }, {
- key: "cancel",
- value: function cancel() {
- if (this.player === null) {
- return;
- }
- var pano = this.player.linkEditor.startEditPano;
- this.player.linkEditor.pauseSetPanoVisible(false, this.player.model.currentFloor);
- if (pano && pano.floorIndex == this.player.model.currentFloor.floorIndex) {
- this.player.linkEditor.SetOnePanoVisible(pano);
- this.emit('walkManager.active', this.player.linkEditor.checkLinkStatus());
- }
- }
- /**
- * 确认操作
- */
- }, {
- key: "confirm",
- value: function confirm() {}
- /**
- * 获取编辑数据
- * @returns {Array<Object>}
- */
- }, {
- key: "toJSON",
- value: function toJSON() {
- if (this.player === null) {
- return [];
- }
- return this.player.linkEditor.savePanoVisibles() || [];
- }
- }]);
- return WalkManager;
- }(tinyEmitter);
- var CadManager$1 = /*#__PURE__*/function () {
- function CadManager(app) {
- var _this = this;
- _classCallCheck(this, CadManager);
- this.app = app;
- this.edit = {};
- this.labels = [{
- key: 'porch',
- text: '玄关',
- type: 'hall'
- }, {
- key: 'masterGuard',
- text: '主卫',
- type: 'hall'
- }, {
- key: 'aisle',
- text: '过道',
- type: 'hall'
- }, {
- key: 'guestGuard',
- text: '客卫',
- type: 'hall'
- }, {
- key: 'kitchen',
- text: '厨房',
- type: 'hall'
- }, {
- key: 'garage',
- text: '车库',
- type: 'hall'
- }, {
- key: 'garden',
- text: '花园',
- type: 'hall'
- }, {
- key: 'balcony',
- text: '阳台',
- type: 'hall'
- }, {
- key: 'masterBedroom',
- text: '主卧',
- type: 'room'
- }, {
- key: 'guestBedroom',
- text: '次卧',
- type: 'room'
- }, {
- key: 'study',
- text: '书房',
- type: 'room'
- }, {
- key: 'lockerRoom',
- text: '储物间',
- type: 'room'
- }, {
- key: 'cloakroom',
- text: '衣帽间',
- type: 'room'
- }, {
- key: 'elderlyRoom',
- text: '老人房',
- type: 'room'
- }, {
- key: 'childrenRoom',
- text: '儿童房',
- type: 'room'
- }, {
- key: 'petRoom',
- text: '宠物房',
- type: 'room'
- }, {
- key: 'livingRoom',
- text: '客厅',
- type: 'other'
- }, {
- key: 'restaurant',
- text: '餐厅',
- type: 'other'
- }];
- this.plugin = Deferred$1();
- this.deferred = Deferred$1();
- this.app.Scene.on('loaded', function () {
- _this.deferred.resolve();
- });
- this.edit.enter = function () {
- _this.app.VideoManager.BoxVideo.hideAll();
- _this.app.Scene.Decoration.hideAll();
- _this.waitLoaded(function () {
- _this.app.core.get('Player').model.floorplanCadImg.isEdit = true;
- });
- };
- this.edit.exit = function () {
- _this.app.VideoManager.BoxVideo.showAll();
- _this.app.Scene.Decoration.showAll();
- var player = _this.app.core.get('Player');
- player && (player.model.floorplanCadImg.isEdit = false);
- };
- }
- _createClass(CadManager, [{
- key: "install",
- value: function install(target) {
- this.target = target;
- this.plugin.resolve(target);
- }
- }, {
- key: "use",
- value: function use() {
- if (this.target) {
- return Promise.resolve(this.target);
- }
- return this.plugin.promise();
- }
- }, {
- key: "cad",
- value: function cad() {
- return this.target;
- }
- }, {
- key: "waitLoaded",
- value: function waitLoaded(func) {
- if (!func) return;
- if (this.app.core.get('Player')) {
- func();
- } else {
- this.deferred.then(func);
- }
- }
- }]);
- return CadManager;
- }();
- var CadManager = /*#__PURE__*/function () {
- function CadManager(app) {
- _classCallCheck(this, CadManager);
- this.app = app;
- this.ready = Deferred$1();
- this.option = {};
- this.player = null;
- this.instance = null;
- }
- _createClass(CadManager, [{
- key: "install",
- value: function install(instance) {
- for (var key in instance) {
- this[key] = instance[key];
- }
- this.instance = instance;
- this.ready.resolve();
- }
- }, {
- key: "config",
- value: function config(option) {
- var _this = this;
- Object.assign(this.option, option || {});
- this.ready.then(function () {
- if (_this.option.padding) {
- _this.instance.padding(_this.option.padding);
- }
- });
- }
- }, {
- key: "enter",
- value: function enter() {
- var _this2 = this;
- return this.app.Scene.whenLoaded(function () {
- _this2.app.VideoManager.BoxVideo.hideAll();
- _this2.app.Scene.Decoration.hideAll();
- _this2.player = _this2.app.core.get('Player');
- _this2.player.model.floorplanCadImg.isEdit = true;
- _this2.ready.then(function () {
- if (_this2.instance.$xui == void 0) {
- _this2.instance.$xui = _this2.$xui;
- }
- _this2.show();
- });
- });
- }
- }, {
- key: "leave",
- value: function leave() {
- var _this3 = this;
- return this.app.Scene.whenLoaded(function () {
- _this3.app.Scene.Decoration.showAll();
- _this3.player.model.floorplanCadImg.isEdit = false;
- _this3.ready.then(function () {
- return _this3.hide();
- });
- });
- }
- }]);
- return CadManager;
- }();
- 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; }
- 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; }
- var ModelManager = /*#__PURE__*/function () {
- function ModelManager(app) {
- _classCallCheck(this, ModelManager);
- this.app = app;
- this.player = null;
- }
- _createClass(ModelManager, [{
- key: "length",
- get: function get() {
- return this.player.GLTFEditor.group.children.length;
- }
- /**
- *
- * @param {string} url
- * @param {Object} options
- * @param {string} options.panoId 0
- * @param {Object} options.scale {x:0,y:0,z:0}
- * @param {Object} options.position {x:0,y:0,z:0}
- * @param {Object} options.quaternion {x:0,y:0,z:0,w:1}
- * @returns
- */
- }, {
- key: "add",
- value: function add(url, options) {
- var _this = this;
- if (!url) {
- return;
- }
- if (url.indexOf('?') === -1) {
- url += '?';
- }
- if (options == void 0) {
- options = {
- scale: {
- x: 0.1,
- y: 0.1,
- z: 0.1
- },
- position: {
- x: 0,
- y: 0,
- z: 0
- },
- quaternion: {
- x: 0,
- y: 0,
- z: 0,
- w: 1
- }
- };
- } else if (options.scale == void 0) {
- options.scale = {
- x: 0.1,
- y: 0.1,
- z: 0.1
- };
- } else if (options.position == void 0) {
- options.position = {
- x: 0,
- y: 0,
- z: 0
- };
- } else if (options.quaternion == void 0) {
- options.quaternion = {
- x: 0,
- y: 0,
- z: 0,
- w: 1
- };
- }
- this.app.Scene.whenLoaded(function () {
- if (_this.player == null) {
- _this.player = _this.app.core.get('Player');
- }
- if (_this.player.GLTFEditor == void 0) {
- _this.player.GLTFEditor = new GLTFAddManager(_this.player);
- }
- _this.player.GLTFEditor.add(_objectSpread({
- url,
- sid: options.sid || String(_this.player.GLTFEditor.group.children.length),
- panoId: options.panoId || _this.app.Scene.panos.list[0].id,
- visible: true
- }, options));
- });
- }
- }, {
- key: "load",
- value: function load(data) {
- var _this2 = this;
- if (Array.isArray(data)) {
- data.forEach(function (item) {
- return _this2.add(item.url, item.options);
- });
- }
- }
- }, {
- key: "enter",
- value: function enter() {
- var _this3 = this;
- this.app.Scene.whenLoaded(function () {
- if (_this3.player == null) {
- _this3.player = _this3.app.core.get('Player');
- }
- if (_this3.player.GLTFEditor == void 0) {
- _this3.player.GLTFEditor = new GLTFAddManager(_this3.player);
- }
- _this3.player.GLTFEditor.editing = true;
- });
- }
- }, {
- key: "leave",
- value: function leave() {
- if (this.player) {
- this.player.GLTFEditor.editing = false;
- }
- }
- }, {
- key: "select",
- value: function select(sid) {
- if (this.player === null) {
- return;
- }
- sid = String(sid);
- var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
- return gltf.sid === sid;
- });
- if (gltf) {
- this.player.GLTFEditor.select(gltf);
- this.player.flyToPano({
- pano: this.player.model.panos.get(gltf.panoId),
- lookAtPoint: gltf.position,
- checkAlone: true
- });
- }
- }
- }, {
- key: "unselect",
- value: function unselect() {
- this.player.GLTFEditor.unselect();
- }
- }, {
- key: "remove",
- value: function remove(sid) {
- var _this4 = this;
- if (!this.player || !this.player.GLTFEditor) {
- return;
- }
- if (sid == void 0) {
- this.player.GLTFEditor.group.children.forEach(function (gltf) {
- _this4.player.GLTFEditor.delete(gltf);
- });
- } else {
- sid = String(sid);
- var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
- return gltf.sid === sid;
- });
- if (gltf) {
- this.player.GLTFEditor.delete(gltf);
- }
- }
- }
- }, {
- key: "transformMode",
- value: function transformMode(mode) {
- if (this.player === null) {
- return;
- }
- if ('translate,rotate,scale'.indexOf(mode) === -1) {
- return;
- }
- this.player.model.transformControls.mode = mode;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- if (!this.player || !this.player.GLTFEditor) {
- return null;
- }
- if (this.player.GLTFEditor.selecting) {
- var model = this.player.GLTFEditor.selecting;
- var info = {
- url: model.url,
- options: {
- sid: model.sid,
- panoId: model.panoId,
- position: {
- x: parseFloat(model.position.x.toFixed(2)),
- y: parseFloat(model.position.y.toFixed(2)),
- z: parseFloat(model.position.z.toFixed(2))
- },
- scale: {
- x: parseFloat(model.scale.x.toFixed(1)),
- y: parseFloat(model.scale.y.toFixed(1)),
- z: parseFloat(model.scale.z.toFixed(1))
- },
- quaternion: {
- x: parseFloat(model.quaternion.x.toFixed(3)),
- y: parseFloat(model.quaternion.y.toFixed(3)),
- z: parseFloat(model.quaternion.z.toFixed(3)),
- w: parseFloat(model.quaternion.w.toFixed(3))
- },
- visible: model.visible
- }
- };
- return info;
- } else {
- return this.player.GLTFEditor.group.children.map(function (model) {
- return {
- url: model.url,
- options: {
- sid: model.sid,
- panoId: model.panoId,
- position: {
- x: parseFloat(model.position.x.toFixed(2)),
- y: parseFloat(model.position.y.toFixed(2)),
- z: parseFloat(model.position.z.toFixed(2))
- },
- scale: {
- x: parseFloat(model.scale.x.toFixed(1)),
- y: parseFloat(model.scale.y.toFixed(1)),
- z: parseFloat(model.scale.z.toFixed(1))
- },
- quaternion: {
- x: parseFloat(model.quaternion.x.toFixed(3)),
- y: parseFloat(model.quaternion.y.toFixed(3)),
- z: parseFloat(model.quaternion.z.toFixed(3)),
- w: parseFloat(model.quaternion.w.toFixed(3))
- },
- visible: model.visible
- }
- };
- });
- }
- }
- }]);
- return ModelManager;
- }();
- function setup(app) {
- app.APIs = APIs(app);
- app.Scene = new Scene(app);
- app.Camera = new Camera(app);
- app.MinMap = new MinMap(app);
- app.DataSYNC = new DataSYNC(app);
- app.MarkManager = new ObjectManager(app);
- app.VideoManager = new VideoManager(app);
- app.RepairManager = new RepairManager(app);
- app.ClipBoxManager = new ClipBoxManager(app);
- app.CSS3DManager = new CSS3DManager(app);
- app.PolygonMarkManager = new PolygonMarkManager(app);
- app.PanoVideoManager = new PanoVideoManager(app);
- app.TourManager = new TourManager(app);
- app.Editor = new Editor(app);
- app.Connect = new Broadcast(app);
- app.Billboard = new Billboard(app);
- app.Screenshot = new Screenshot(app);
- app.ViewLinkEdit = new ViewLinkEdit(app);
- app.FilterManager = new FilterManager(app);
- app.ConvertViews = new ConvertViews();
- if (app.config.edition) {
- app.TagManager = new TagManager(app);
- app.CadManager = new CadManager(app);
- app.WalkManager = new WalkManager(app);
- } else {
- app.TagManager = new TagManager$1(app);
- app.CadManager = new CadManager$1(app);
- app.WalkManager = new WalkManager$1(app);
- }
- app.ModelManager = new ModelManager(app);
- }
- var convert$1 = {
- /**
- * 2d转3d1
- * @param {*} x
- * @param {*} y
- * @param {*} player
- * @returns
- */
- pointFrom2DTo3D(_ref, player, camera, element) {
- var x = _ref.x,
- y = _ref.y;
- if (!camera) {
- camera = player.camera;
- }
- if (!element) {
- element = player.domElement;
- }
- var position = new THREE.Vector3(0, 0, 0);
- math$2.convertScreenPositionToNDC(x, y, position, element);
- position.unproject(camera);
- position.y = 0;
- return position;
- },
- /**
- * 3d转2d
- * @param {*} position
- * @returns
- */
- pointFrom3DTo2D(position, player, camera, element) {
- var vector = position;
- if (!camera) {
- camera = player.camera;
- }
- if (!element) {
- element = player.domElement;
- }
- if (position instanceof THREE.Vector3 === false) {
- vector = new THREE.Vector3(vector.x || 0, vector.y || 0, vector.z || 0);
- }
- return convertTool.getPos2d(vector, player, camera, element).pos;
- }
- };
- 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; } } }; }
- 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); }
- 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; }
- 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); }; }
- 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; } }
- var _default = /*#__PURE__*/function (_KanKan) {
- _inherits(_default, _KanKan);
- var _super = _createSuper(_default);
- function _default(options) {
- var _this;
- _classCallCheck(this, _default);
- _this = _super.call(this, options);
- if (options.isRouteSnap) {
- _this.config.isRouteSnap = true;
- }
- _this.withComponent('store');
- _this.withComponent('resource');
- _this.withComponent('Scene');
- if (_this.config.dom) {
- _this.withDom();
- }
- _this.remote_editor = editApis;
- _this.remote_viewer = viewApis;
- setup(_assertThisInitialized(_this));
- setup$1(_assertThisInitialized(_this));
- if (_this.config.useStatistics) {
- window._hmt = window._hmt || [];
- (function () {
- var hm = document.createElement('script');
- hm.src = 'https://hm.baidu.com/hm.js?aa59943d9a481ab824cf054f2d463ca2';
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(hm, s);
- })();
- }
- var plugins = browser$1.valueFromUrl('app_plugins');
- if (plugins) {
- plugins.split(',').forEach(function (plugin) {
- if (plugin) {
- _this.use(plugin);
- }
- });
- } // const medici = Medici.init({
- // platform: 'web',
- // appId: '7b5958d5-1ae6-4ad5-8a87-5fc8a4b92999',
- // // endPoint: 'https://v4-test.4dkankan.com', //服务器
- // endPoint: '/track_api', //服务器
- // config: {
- // version: '1', //配置要track当前版本
- // },
- // })
- // KanKan.medici = medici
- return _this;
- }
- _createClass(_default, [{
- key: "use",
- value: function use(plugin, config) {
- var _this2 = this;
- if (typeof plugin === 'string') {
- if (this.Plugins[plugin]) {
- return Promise.resolve(this.Plugins[plugin]);
- }
- return usePlugin(plugin, this.config.version).then(function (name) {
- return _this2.Plugins.add(window[name], config);
- });
- } else if (typeof plugin === 'function') {
- return this.Plugins.add(plugin, config);
- }
- }
- }, {
- key: "mount",
- value: function mount(el) {
- if (!el) {
- throw new Error('el must be require');
- }
- this.config.dom = el;
- this.withDom();
- return this;
- }
- }, {
- key: "render",
- value: function render() {
- this.core.get('Scene').start();
- return this;
- }
- }, {
- key: "metadata",
- value: function metadata(data) {
- if (data === void 0) {
- this.store.set('metadata');
- return this;
- }
- return this.store.get('metadata');
- }
- }, {
- key: "destroy",
- value: function destroy() {
- console.log('dispose renderer!');
- var scene = this.core.get('SceneRenderer').scene;
- this.core.get('SceneRenderer').renderer.dispose();
- this.core.get('SceneRenderer').started = false;
- var cleanMaterial = function cleanMaterial(material) {
- console.log('dispose material!');
- material.dispose(); // dispose textures
- for (var _i = 0, _Object$keys = Object.keys(material); _i < _Object$keys.length; _i++) {
- var key = _Object$keys[_i];
- var value = material[key];
- if (value && typeof value === 'object' && 'minFilter' in value) {
- console.log('dispose texture!');
- value.dispose();
- }
- }
- };
- scene.traverse(function (object) {
- if (!object.isMesh) return;
- console.log('dispose geometry!');
- object.geometry.dispose();
- if (object.material.isMaterial) {
- cleanMaterial(object.material);
- } else {
- // an array of materials
- var _iterator = _createForOfIteratorHelper(object.material),
- _step;
- try {
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- var material = _step.value;
- cleanMaterial(material);
- }
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- }
- });
- }
- }]);
- return _default;
- }(KanKan);
- _default.MITT = {
- Emiter: tinyEmitter
- };
- _default.Utils = {
- http,
- file,
- math: math$2,
- convert: convert$1,
- MathLight
- };
- _default.Animate = {
- transitions: transitions$1,
- easing,
- lerp
- };
- _default.Viewmode = Viewmode$1;
- _default.THREE = THREE;
- _default.Deferred = Deferred$1;
- window.PetiteVue = PetiteVue;
- return _default;
- })));
- //# sourceMappingURL=kankan-sdk.js.map
|