123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618 |
-
-
-
-
-
-
-
-
- #include "imgui.h"
- #include <ctype.h> // toupper
- #include <math.h> // sqrt
- #include <stdint.h> // intptr_t
- #include <stdio.h> // vsnprintf
- #include <string.h> // memset
- #include <new> // new (ptr)
-
- #ifdef _MSC_VER
- #pragma warning (disable: 4996)
- #endif
-
-
-
-
-
- namespace ImGui
- {
-
- static bool ButtonBehaviour(const ImGuiAabb& bb, const ImGuiID& id, bool* out_hovered, bool* out_held, bool allow_key_modifiers, bool repeat = false);
- static void LogText(const ImVec2& ref_pos, const char* text, const char* text_end = NULL);
-
- static void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, const bool hide_text_after_hash = true);
- static void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
- static void RenderCollapseTriangle(ImVec2 p_min, bool open, float scale = 1.0f, bool shadow = false);
-
- static void ItemSize(ImVec2 size, ImVec2* adjust_start_offset = NULL);
- static void ItemSize(const ImGuiAabb& aabb, ImVec2* adjust_start_offset = NULL);
- static void PushColumnClipRect(int column_index = -1);
- static bool IsClipped(const ImGuiAabb& aabb);
- static bool ClipAdvance(const ImGuiAabb& aabb);
-
- static bool IsMouseHoveringBox(const ImGuiAabb& box);
- static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true);
-
- static bool CloseWindowButton(bool* open = NULL);
- static void FocusWindow(ImGuiWindow* window);
- static ImGuiWindow* FindWindow(const char* name);
- static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs);
-
- };
-
-
-
-
-
- static const char* GetClipboardTextFn_DefaultImpl();
- static void SetClipboardTextFn_DefaultImpl(const char* text);
-
-
-
-
-
- ImGuiStyle::ImGuiStyle()
- {
- Alpha = 1.0f;
- WindowPadding = ImVec2(8,8);
- WindowMinSize = ImVec2(48,48);
- FramePadding = ImVec2(5,4);
- ItemSpacing = ImVec2(10,5);
- ItemInnerSpacing = ImVec2(5,5);
- TouchExtraPadding = ImVec2(0,0);
- AutoFitPadding = ImVec2(8,8);
- WindowFillAlphaDefault = 0.70f;
- WindowRounding = 10.0f;
- TreeNodeSpacing = 22.0f;
- ColumnsMinSpacing = 6.0f;
- ScrollBarWidth = 16.0f;
-
- Colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);
- Colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
- Colors[ImGuiCol_Border] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
- Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.60f);
- Colors[ImGuiCol_FrameBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.30f);
- Colors[ImGuiCol_TitleBg] = ImVec4(0.50f, 0.50f, 1.00f, 0.45f);
- Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.40f, 0.40f, 0.80f, 0.20f);
- Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.40f, 0.40f, 0.80f, 0.15f);
- Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.40f, 0.40f, 0.80f, 0.30f);
- Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.80f, 0.40f);
- Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.80f, 0.50f, 0.50f, 0.40f);
- Colors[ImGuiCol_ComboBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.99f);
- Colors[ImGuiCol_CheckHovered] = ImVec4(0.60f, 0.40f, 0.40f, 0.45f);
- Colors[ImGuiCol_CheckActive] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f);
- Colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f);
- Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.80f, 0.50f, 0.50f, 1.00f);
- Colors[ImGuiCol_Button] = ImVec4(0.67f, 0.40f, 0.40f, 0.60f);
- Colors[ImGuiCol_ButtonHovered] = ImVec4(0.67f, 0.40f, 0.40f, 1.00f);
- Colors[ImGuiCol_ButtonActive] = ImVec4(0.80f, 0.50f, 0.50f, 1.00f);
- Colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f);
- Colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f);
- Colors[ImGuiCol_HeaderActive] = ImVec4(0.60f, 0.60f, 0.80f, 1.00f);
- Colors[ImGuiCol_Column] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
- Colors[ImGuiCol_ColumnHovered] = ImVec4(0.60f, 0.40f, 0.40f, 1.00f);
- Colors[ImGuiCol_ColumnActive] = ImVec4(0.80f, 0.50f, 0.50f, 1.00f);
- Colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f);
- Colors[ImGuiCol_ResizeGripHovered] = ImVec4(1.00f, 1.00f, 1.00f, 0.60f);
- Colors[ImGuiCol_ResizeGripActive] = ImVec4(1.00f, 1.00f, 1.00f, 0.90f);
- Colors[ImGuiCol_CloseButton] = ImVec4(0.50f, 0.50f, 0.90f, 0.50f);
- Colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.70f, 0.70f, 0.90f, 0.60f);
- Colors[ImGuiCol_CloseButtonActive] = ImVec4(0.70f, 0.70f, 0.70f, 1.00f);
- Colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
- Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
- Colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
- Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f);
- Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f);
- Colors[ImGuiCol_TooltipBg] = ImVec4(0.05f, 0.05f, 0.10f, 0.90f);
- }
-
- ImGuiIO::ImGuiIO()
- {
- memset(this, 0, sizeof(*this));
- DeltaTime = 1.0f/60.0f;
- IniSavingRate = 5.0f;
- IniFilename = "imgui.ini";
- LogFilename = "imgui_log.txt";
- Font = NULL;
- FontYOffset = 0.0f;
- FontTexUvForWhite = ImVec2(0.0f,0.0f);
- FontBaseScale = 1.0f;
- FontAllowUserScaling = false;
- FontFallbackGlyph = (ImWchar)'?';
- PixelCenterOffset = 0.0f;
- MousePos = ImVec2(-1,-1);
- MousePosPrev = ImVec2(-1,-1);
- MouseDoubleClickTime = 0.30f;
- MouseDoubleClickMaxDist = 6.0f;
-
-
- RenderDrawListsFn = NULL;
- MemAllocFn = malloc;
- MemReallocFn = realloc;
- MemFreeFn = free;
- GetClipboardTextFn = GetClipboardTextFn_DefaultImpl;
- SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;
- ImeSetInputScreenPosFn = NULL;
- }
-
-
-
-
- static size_t ImStrlenW(const ImWchar* str);
- void ImGuiIO::AddInputCharacter(ImWchar c)
- {
- const size_t n = ImStrlenW(InputCharacters);
- if (n < sizeof(InputCharacters) / sizeof(InputCharacters[0]))
- {
- InputCharacters[n] = c;
- InputCharacters[n+1] = 0;
- }
- }
-
-
-
-
-
- #define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR)))
-
- #undef PI
- const float PI = 3.14159265358979323846f;
-
- #ifdef INT_MAX
- #define IM_INT_MAX INT_MAX
- #else
- #define IM_INT_MAX 2147483647
- #endif
-
-
-
- static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); }
- static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x/rhs, lhs.y/rhs); }
- static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); }
- static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); }
- static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2 rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); }
- static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2 rhs) { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); }
- static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
- static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
- static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
- static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
-
- static inline int ImMin(int lhs, int rhs) { return lhs < rhs ? lhs : rhs; }
- static inline int ImMax(int lhs, int rhs) { return lhs >= rhs ? lhs : rhs; }
- static inline float ImMin(float lhs, float rhs) { return lhs < rhs ? lhs : rhs; }
- static inline float ImMax(float lhs, float rhs) { return lhs >= rhs ? lhs : rhs; }
- static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(ImMin(lhs.x,rhs.x), ImMin(lhs.y,rhs.y)); }
- static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(ImMax(lhs.x,rhs.x), ImMax(lhs.y,rhs.y)); }
- static inline float ImClamp(float f, float mn, float mx) { return (f < mn) ? mn : (f > mx) ? mx : f; }
- static inline ImVec2 ImClamp(const ImVec2& f, const ImVec2& mn, ImVec2 mx) { return ImVec2(ImClamp(f.x,mn.x,mx.x), ImClamp(f.y,mn.y,mx.y)); }
- static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
- static inline float ImLerp(float a, float b, float t) { return a + (b - a) * t; }
- static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return a + (b - a) * t; }
- static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
- static inline float ImLength(const ImVec2& lhs) { return sqrt(lhs.x*lhs.x + lhs.y*lhs.y); }
-
- static int ImTextCharToUtf8(char* buf, size_t buf_size, unsigned int in_char);
- static int ImTextStrToUtf8(char* buf, size_t buf_size, const ImWchar* in_text, const ImWchar* in_text_end);
- static int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end);
- static int ImTextStrFromUtf8(ImWchar* buf, size_t buf_size, const char* in_text, const char* in_text_end);
-
- static int ImStricmp(const char* str1, const char* str2)
- {
- int d;
- while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; }
- return d;
- }
-
- static char* ImStrdup(const char *str)
- {
- char *buff = (char*)ImGui::MemAlloc(strlen(str) + 1);
- IM_ASSERT(buff);
- strcpy(buff, str);
- return buff;
- }
-
- static size_t ImStrlenW(const ImWchar* str)
- {
- size_t n = 0;
- while (*str++)
- n++;
- return n;
- }
-
- static const char* ImStristr(const char* haystack, const char* needle, const char* needle_end)
- {
- if (!needle_end)
- needle_end = needle + strlen(needle);
-
- const char un0 = (char)toupper(*needle);
- while (*haystack)
- {
- if (toupper(*haystack) == un0)
- {
- const char* b = needle + 1;
- for (const char* a = haystack + 1; b < needle_end; a++, b++)
- if (toupper(*a) != toupper(*b))
- break;
- if (b == needle_end)
- return haystack;
- }
- haystack++;
- }
- return NULL;
- }
-
- static ImU32 crc32(const void* data, size_t data_size, ImU32 seed = 0)
- {
- static ImU32 crc32_lut[256] = { 0 };
- if (!crc32_lut[1])
- {
- const ImU32 polynomial = 0xEDB88320;
- for (ImU32 i = 0; i < 256; i++)
- {
- ImU32 crc = i;
- for (ImU32 j = 0; j < 8; j++)
- crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial);
- crc32_lut[i] = crc;
- }
- }
- ImU32 crc = ~seed;
- const unsigned char* current = (const unsigned char*)data;
- while (data_size--)
- crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++];
- return ~crc;
- }
-
- static size_t ImFormatString(char* buf, size_t buf_size, const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- int w = vsnprintf(buf, buf_size, fmt, args);
- va_end(args);
- buf[buf_size-1] = 0;
- return (w == -1) ? buf_size : (size_t)w;
- }
-
- static size_t ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
- {
- int w = vsnprintf(buf, buf_size, fmt, args);
- buf[buf_size-1] = 0;
- return (w == -1) ? buf_size : (size_t)w;
- }
-
- static ImU32 ImConvertColorFloat4ToU32(const ImVec4& in)
- {
- ImU32 out = ((ImU32)(ImSaturate(in.x)*255.f));
- out |= ((ImU32)(ImSaturate(in.y)*255.f) << 8);
- out |= ((ImU32)(ImSaturate(in.z)*255.f) << 16);
- out |= ((ImU32)(ImSaturate(in.w)*255.f) << 24);
- return out;
- }
-
-
-
- static void ImConvertColorRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v)
- {
- float K = 0.f;
- if (g < b)
- {
- const float tmp = g; g = b; b = tmp;
- K = -1.f;
- }
- if (r < g)
- {
- const float tmp = r; r = g; g = tmp;
- K = -2.f / 6.f - K;
- }
-
- const float chroma = r - (g < b ? g : b);
- out_h = fabsf(K + (g - b) / (6.f * chroma + 1e-20f));
- out_s = chroma / (r + 1e-20f);
- out_v = r;
- }
-
-
-
- static void ImConvertColorHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b)
- {
- if (s == 0.0f)
- {
-
- out_r = out_g = out_b = v;
- return;
- }
-
- h = fmodf(h, 1.0f) / (60.0f/360.0f);
- int i = (int)h;
- float f = h - (float)i;
- float p = v * (1.0f - s);
- float q = v * (1.0f - s * f);
- float t = v * (1.0f - s * (1.0f - f));
-
- switch (i)
- {
- case 0: out_r = v; out_g = t; out_b = p; break;
- case 1: out_r = q; out_g = v; out_b = p; break;
- case 2: out_r = p; out_g = v; out_b = t; break;
- case 3: out_r = p; out_g = q; out_b = v; break;
- case 4: out_r = t; out_g = p; out_b = v; break;
- case 5: default: out_r = v; out_g = p; out_b = q; break;
- }
- }
-
-
-
- struct ImGuiColMod // Color/style modifier, backup of modified data so we can restore it
- {
- ImGuiCol Col;
- ImVec4 PreviousValue;
- };
-
- struct ImGuiAabb // 2D axis aligned bounding-box
- {
- ImVec2 Min;
- ImVec2 Max;
-
- ImGuiAabb() { Min = ImVec2(FLT_MAX,FLT_MAX); Max = ImVec2(-FLT_MAX,-FLT_MAX); }
- ImGuiAabb(const ImVec2& min, const ImVec2& max) { Min = min; Max = max; }
- ImGuiAabb(const ImVec4& v) { Min.x = v.x; Min.y = v.y; Max.x = v.z; Max.y = v.w; }
- ImGuiAabb(float x1, float y1, float x2, float y2) { Min.x = x1; Min.y = y1; Max.x = x2; Max.y = y2; }
-
- ImVec2 GetCenter() const { return Min + (Max-Min)*0.5f; }
- ImVec2 GetSize() const { return Max-Min; }
- float GetWidth() const { return (Max-Min).x; }
- float GetHeight() const { return (Max-Min).y; }
- ImVec2 GetTL() const { return Min; }
- ImVec2 GetTR() const { return ImVec2(Max.x,Min.y); }
- ImVec2 GetBL() const { return ImVec2(Min.x,Max.y); }
- ImVec2 GetBR() const { return Max; }
- bool Contains(ImVec2 p) const { return p.x >= Min.x && p.y >= Min.y && p.x <= Max.x && p.y <= Max.y; }
- bool Contains(const ImGuiAabb& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
- bool Overlaps(const ImGuiAabb& r) const { return r.Min.y <= Max.y && r.Max.y >= Min.y && r.Min.x <= Max.x && r.Max.x >= Min.x; }
- void Expand(ImVec2 sz) { Min -= sz; Max += sz; }
- void Clip(const ImGuiAabb& clip) { Min.x = ImMax(Min.x, clip.Min.x); Min.y = ImMax(Min.y, clip.Min.y); Max.x = ImMin(Max.x, clip.Max.x); Max.y = ImMin(Max.y, clip.Max.y); }
- };
-
-
- struct ImGuiDrawContext
- {
- ImVec2 CursorPos;
- ImVec2 CursorPosPrevLine;
- ImVec2 CursorStartPos;
- float CurrentLineHeight;
- float PrevLineHeight;
- float LogLineHeight;
- int TreeDepth;
- ImGuiAabb LastItemAabb;
- bool LastItemHovered;
- ImVector<ImGuiWindow*> ChildWindows;
- ImVector<bool> AllowKeyboardFocus;
- ImVector<float> ItemWidth;
- ImVector<ImGuiColMod> ColorModifiers;
- ImGuiColorEditMode ColorEditMode;
- ImGuiStorage* StateStorage;
- int OpenNextNode;
-
- float ColumnStartX;
- int ColumnCurrent;
- int ColumnsCount;
- bool ColumnsShowBorders;
- ImVec2 ColumnsStartCursorPos;
- ImGuiID ColumnsSetID;
-
- ImGuiDrawContext()
- {
- CursorPos = CursorPosPrevLine = CursorStartPos = ImVec2(0.0f, 0.0f);
- CurrentLineHeight = PrevLineHeight = 0.0f;
- LogLineHeight = -1.0f;
- TreeDepth = 0;
- LastItemAabb = ImGuiAabb(0.0f,0.0f,0.0f,0.0f);
- LastItemHovered = false;
- StateStorage = NULL;
- OpenNextNode = -1;
-
- ColumnStartX = 0.0f;
- ColumnCurrent = 0;
- ColumnsCount = 1;
- ColumnsShowBorders = true;
- ColumnsStartCursorPos = ImVec2(0,0);
- }
- };
-
- struct ImGuiTextEditState;
- #define STB_TEXTEDIT_STRING ImGuiTextEditState
- #define STB_TEXTEDIT_CHARTYPE ImWchar
- #include "stb_textedit.h"
-
-
- struct ImGuiTextEditState
- {
- ImWchar Text[1024];
- char InitialText[1024*3+1];
- size_t BufSize;
- float Width;
- float ScrollX;
- STB_TexteditState StbState;
- float CursorAnim;
- ImVec2 LastCursorPos;
- bool SelectedAllMouseLock;
- ImFont Font;
- float FontSize;
-
- ImGuiTextEditState() { memset(this, 0, sizeof(*this)); }
-
- void CursorAnimReset() { CursorAnim = -0.30f; }
- bool CursorIsVisible() const { return CursorAnim <= 0.0f || fmodf(CursorAnim, 1.20f) <= 0.80f; }
- bool HasSelection() const { return StbState.select_start != StbState.select_end; }
- void SelectAll() { StbState.select_start = 0; StbState.select_end = (int)ImStrlenW(Text); StbState.cursor = StbState.select_end; StbState.has_preferred_x = false; }
-
- void OnKeyboardPressed(int key);
- void UpdateScrollOffset();
- ImVec2 CalcDisplayOffsetFromCharIdx(int i) const;
-
-
- static const char* GetTextPointerClippedA(ImFont font, float font_size, const char* text, float width, ImVec2* out_text_size = NULL);
- static const ImWchar* GetTextPointerClippedW(ImFont font, float font_size, const ImWchar* text, float width, ImVec2* out_text_size = NULL);
- static void RenderTextScrolledClipped(ImFont font, float font_size, const char* text, ImVec2 pos_base, float width, float scroll_x);
- };
-
- struct ImGuiIniData
- {
- char* Name;
- ImVec2 Pos;
- ImVec2 Size;
- bool Collapsed;
-
- ImGuiIniData() { memset(this, 0, sizeof(*this)); }
- ~ImGuiIniData() { if (Name) { ImGui::MemFree(Name); Name = NULL; } }
- };
-
- struct ImGuiState
- {
- bool Initialized;
- ImGuiIO IO;
- ImGuiStyle Style;
- float FontSize;
-
- float Time;
- int FrameCount;
- int FrameCountRendered;
- ImVector<ImGuiWindow*> Windows;
- ImGuiWindow* CurrentWindow;
- ImVector<ImGuiWindow*> CurrentWindowStack;
- ImGuiWindow* FocusedWindow;
- ImGuiWindow* HoveredWindow;
- ImGuiWindow* HoveredWindowExcludingChilds;
- ImGuiID HoveredId;
- ImGuiID ActiveId;
- ImGuiID ActiveIdPreviousFrame;
- bool ActiveIdIsAlive;
- float SettingsDirtyTimer;
- ImVector<ImGuiIniData*> Settings;
- ImVec2 NewWindowDefaultPos;
-
-
- ImVector<ImDrawList*> RenderDrawLists;
-
-
- ImGuiTextEditState InputTextState;
- ImGuiID SliderAsInputTextId;
- ImGuiStorage ColorEditModeStorage;
- ImGuiID ActiveComboID;
- char Tooltip[1024];
- char* PrivateClipboard;
-
-
- bool LogEnabled;
- FILE* LogFile;
- ImGuiTextBuffer* LogClipboard;
- int LogAutoExpandMaxDepth;
-
- ImGuiState()
- {
- Initialized = false;
- Time = 0.0f;
- FrameCount = 0;
- FrameCountRendered = -1;
- CurrentWindow = NULL;
- FocusedWindow = NULL;
- HoveredWindow = NULL;
- HoveredWindowExcludingChilds = NULL;
- ActiveIdIsAlive = false;
- SettingsDirtyTimer = 0.0f;
- NewWindowDefaultPos = ImVec2(60, 60);
- SliderAsInputTextId = 0;
- ActiveComboID = 0;
- memset(Tooltip, 0, sizeof(Tooltip));
- PrivateClipboard = NULL;
- LogEnabled = false;
- LogFile = NULL;
- LogAutoExpandMaxDepth = 2;
- LogClipboard = NULL;
- }
- };
-
- static ImGuiState GImGui;
-
- struct ImGuiWindow
- {
- char* Name;
- ImGuiID ID;
- ImGuiWindowFlags Flags;
- ImVec2 PosFloat;
- ImVec2 Pos;
- ImVec2 Size;
- ImVec2 SizeFull;
- ImVec2 SizeContentsFit;
- float ScrollY;
- float NextScrollY;
- bool ScrollbarY;
- bool Visible;
- bool Accessed;
- bool Collapsed;
- bool SkipItems;
- int AutoFitFrames;
-
- ImGuiDrawContext DC;
- ImVector<ImGuiID> IDStack;
- ImVector<ImVec4> ClipRectStack;
- int LastFrameDrawn;
- float ItemWidthDefault;
- ImGuiStorage StateStorage;
- float FontWindowScale;
-
- int FocusIdxCounter;
- int FocusIdxRequestCurrent;
- int FocusIdxRequestNext;
-
- ImDrawList* DrawList;
-
- public:
- ImGuiWindow(const char* name, ImVec2 default_pos, ImVec2 default_size);
- ~ImGuiWindow();
-
- ImGuiID GetID(const char* str);
- ImGuiID GetID(const void* ptr);
-
- void AddToRenderList();
- bool FocusItemRegister(bool is_active, int* out_idx = NULL);
- void FocusItemUnregister();
-
- ImGuiAabb Aabb() const { return ImGuiAabb(Pos, Pos+Size); }
- ImFont Font() const { return GImGui.IO.Font; }
- float FontSize() const { return GImGui.FontSize * FontWindowScale; }
- ImVec2 CursorPos() const { return DC.CursorPos; }
- float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0 : FontSize() + GImGui.Style.FramePadding.y * 2.0f; }
- ImGuiAabb TitleBarAabb() const { return ImGuiAabb(Pos, Pos + ImVec2(SizeFull.x, TitleBarHeight())); }
- ImVec2 WindowPadding() const { return ((Flags & ImGuiWindowFlags_ChildWindow) && !(Flags & ImGuiWindowFlags_ShowBorders)) ? ImVec2(1,1) : GImGui.Style.WindowPadding; }
- ImU32 Color(ImGuiCol idx, float a=1.f) const { ImVec4 c = GImGui.Style.Colors[idx]; c.w *= GImGui.Style.Alpha * a; return ImConvertColorFloat4ToU32(c); }
- ImU32 Color(const ImVec4& col) const { ImVec4 c = col; c.w *= GImGui.Style.Alpha; return ImConvertColorFloat4ToU32(c); }
- };
-
- static ImGuiWindow* GetCurrentWindow()
- {
- IM_ASSERT(GImGui.CurrentWindow != NULL);
- GImGui.CurrentWindow->Accessed = true;
- return GImGui.CurrentWindow;
- }
-
- static void RegisterAliveId(const ImGuiID& id)
- {
- if (GImGui.ActiveId == id)
- GImGui.ActiveIdIsAlive = true;
- }
-
-
-
-
- void ImGuiStorage::Clear()
- {
- Data.clear();
- }
-
-
- static ImVector<ImGuiStorage::Pair>::iterator LowerBound(ImVector<ImGuiStorage::Pair>& data, ImU32 key)
- {
- ImVector<ImGuiStorage::Pair>::iterator first = data.begin();
- ImVector<ImGuiStorage::Pair>::iterator last = data.end();
- int count = (int)(last - first);
- while (count > 0)
- {
- int count2 = count / 2;
- ImVector<ImGuiStorage::Pair>::iterator mid = first + count2;
- if (mid->key < key)
- {
- first = ++mid;
- count -= count2 + 1;
- }
- else
- {
- count = count2;
- }
- }
- return first;
- }
-
- int* ImGuiStorage::Find(ImU32 key)
- {
- ImVector<Pair>::iterator it = LowerBound(Data, key);
- if (it == Data.end())
- return NULL;
- if (it->key != key)
- return NULL;
- return &it->val;
- }
-
- int ImGuiStorage::GetInt(ImU32 key, int default_val)
- {
- int* pval = Find(key);
- if (!pval)
- return default_val;
- return *pval;
- }
-
-
-
- void ImGuiStorage::SetInt(ImU32 key, int val)
- {
- ImVector<Pair>::iterator it = LowerBound(Data, key);
- if (it != Data.end() && it->key == key)
- {
- it->val = val;
- }
- else
- {
- Pair pair_key;
- pair_key.key = key;
- pair_key.val = val;
- Data.insert(it, pair_key);
- }
- }
-
- void ImGuiStorage::SetAllInt(int v)
- {
- for (size_t i = 0; i < Data.size(); i++)
- Data[i].val = v;
- }
-
-
-
-
- ImGuiTextFilter::ImGuiTextFilter()
- {
- InputBuf[0] = 0;
- CountGrep = 0;
- }
-
- void ImGuiTextFilter::Draw(const char* label, float width)
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (width < 0.0f)
- {
- ImVec2 label_size = ImGui::CalcTextSize(label, NULL);
- width = ImMax(window->Pos.x + ImGui::GetWindowContentRegionMax().x - window->DC.CursorPos.x - (label_size.x + GImGui.Style.ItemSpacing.x*4), 10.0f);
- }
- ImGui::PushItemWidth(width);
- ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf));
- ImGui::PopItemWidth();
- Build();
- }
-
- void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>& out)
- {
- out.resize(0);
- const char* wb = b;
- const char* we = wb;
- while (we < e)
- {
- if (*we == separator)
- {
- out.push_back(TextRange(wb, we));
- wb = we + 1;
- }
- we++;
- }
- if (wb != we)
- out.push_back(TextRange(wb, we));
- }
-
- void ImGuiTextFilter::Build()
- {
- Filters.resize(0);
- TextRange input_range(InputBuf, InputBuf+strlen(InputBuf));
- input_range.split(',', Filters);
-
- CountGrep = 0;
- for (size_t i = 0; i != Filters.size(); i++)
- {
- Filters[i].trim_blanks();
- if (Filters[i].empty())
- continue;
- if (Filters[i].front() != '-')
- CountGrep += 1;
- }
- }
-
- bool ImGuiTextFilter::PassFilter(const char* val) const
- {
- if (Filters.empty())
- return true;
-
- if (val == NULL)
- val = "";
-
- for (size_t i = 0; i != Filters.size(); i++)
- {
- const TextRange& f = Filters[i];
- if (f.empty())
- continue;
- if (f.front() == '-')
- {
-
- if (ImStristr(val, f.begin()+1, f.end()) != NULL)
- return false;
- }
- else
- {
-
- if (ImStristr(val, f.begin(), f.end()) != NULL)
- return true;
- }
- }
-
-
- if (CountGrep == 0)
- return true;
-
- return false;
- }
-
-
-
-
- void ImGuiTextBuffer::append(const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- int len = vsnprintf(NULL, 0, fmt, args);
- va_end(args);
- if (len <= 0)
- return;
-
- const size_t write_off = Buf.size();
- if (write_off + (size_t)len >= Buf.capacity())
- Buf.reserve(Buf.capacity() * 2);
-
- Buf.resize(write_off + (size_t)len);
-
- va_start(args, fmt);
- ImFormatStringV(&Buf[write_off] - 1, (size_t)len+1, fmt, args);
- va_end(args);
- }
-
-
-
- ImGuiWindow::ImGuiWindow(const char* name, ImVec2 default_pos, ImVec2 default_size)
- {
- Name = ImStrdup(name);
- ID = GetID(name);
- IDStack.push_back(ID);
-
- PosFloat = default_pos;
- Pos = ImVec2((float)(int)PosFloat.x, (float)(int)PosFloat.y);
- Size = SizeFull = default_size;
- SizeContentsFit = ImVec2(0.0f, 0.0f);
- ScrollY = 0.0f;
- NextScrollY = 0.0f;
- ScrollbarY = false;
- Visible = false;
- Accessed = false;
- Collapsed = false;
- SkipItems = false;
- AutoFitFrames = -1;
- LastFrameDrawn = -1;
- ItemWidthDefault = 0.0f;
- FontWindowScale = 1.0f;
-
- if (ImLength(Size) < 0.001f)
- AutoFitFrames = 3;
-
- FocusIdxCounter = -1;
- FocusIdxRequestCurrent = IM_INT_MAX;
- FocusIdxRequestNext = IM_INT_MAX;
-
- DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList));
- new(DrawList) ImDrawList();
- }
-
- ImGuiWindow::~ImGuiWindow()
- {
- DrawList->~ImDrawList();
- ImGui::MemFree(DrawList);
- DrawList = NULL;
- ImGui::MemFree(Name);
- Name = NULL;
- }
-
- ImGuiID ImGuiWindow::GetID(const char* str)
- {
- const ImGuiID seed = IDStack.empty() ? 0 : IDStack.back();
- const ImGuiID id = crc32(str, strlen(str), seed);
- RegisterAliveId(id);
- return id;
- }
-
- ImGuiID ImGuiWindow::GetID(const void* ptr)
- {
- const ImGuiID seed = IDStack.empty() ? 0 : IDStack.back();
- const ImGuiID id = crc32(&ptr, sizeof(void*), seed);
- RegisterAliveId(id);
- return id;
- }
-
- bool ImGuiWindow::FocusItemRegister(bool is_active, int* out_idx)
- {
- FocusIdxCounter++;
- if (out_idx)
- *out_idx = FocusIdxCounter;
-
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (!window->DC.AllowKeyboardFocus.back())
- return false;
-
-
- if (FocusIdxRequestNext == IM_INT_MAX && is_active && ImGui::IsKeyPressedMap(ImGuiKey_Tab))
- {
-
- FocusIdxRequestNext = FocusIdxCounter + (g.IO.KeyShift ? -1 : +1);
- }
-
- const bool focus_requested = (FocusIdxCounter == FocusIdxRequestCurrent);
- return focus_requested;
- }
-
- void ImGuiWindow::FocusItemUnregister()
- {
- FocusIdxCounter--;
- }
-
- void ImGuiWindow::AddToRenderList()
- {
- ImGuiState& g = GImGui;
-
- if (!DrawList->commands.empty() && !DrawList->vtx_buffer.empty())
- {
- if (DrawList->commands.back().vtx_count == 0)
- DrawList->commands.pop_back();
- g.RenderDrawLists.push_back(DrawList);
- }
- for (size_t i = 0; i < DC.ChildWindows.size(); i++)
- {
- ImGuiWindow* child = DC.ChildWindows[i];
- if (child->Visible)
- child->AddToRenderList();
- }
- }
-
-
-
- namespace ImGui
- {
-
- void* MemAlloc(size_t sz)
- {
- return GImGui.IO.MemAllocFn(sz);
- }
-
- void MemFree(void* ptr)
- {
- return GImGui.IO.MemFreeFn(ptr);
- }
-
- void* MemRealloc(void* ptr, size_t sz)
- {
- return GImGui.IO.MemReallocFn(ptr, sz);
- }
-
- static ImGuiIniData* FindWindowSettings(const char* name)
- {
- ImGuiState& g = GImGui;
-
- for (size_t i = 0; i != g.Settings.size(); i++)
- {
- ImGuiIniData* ini = g.Settings[i];
- if (ImStricmp(ini->Name, name) == 0)
- return ini;
- }
- ImGuiIniData* ini = (ImGuiIniData*)ImGui::MemAlloc(sizeof(ImGuiIniData));
- new(ini) ImGuiIniData();
- ini->Name = ImStrdup(name);
- ini->Collapsed = false;
- ini->Pos = ImVec2(FLT_MAX,FLT_MAX);
- ini->Size = ImVec2(0,0);
- g.Settings.push_back(ini);
- return ini;
- }
-
-
-
- static void LoadSettings()
- {
- ImGuiState& g = GImGui;
- const char* filename = g.IO.IniFilename;
- if (!filename)
- return;
-
-
- FILE* f;
- if ((f = fopen(filename, "rt")) == NULL)
- return;
- if (fseek(f, 0, SEEK_END))
- {
- fclose(f);
- return;
- }
- const long f_size_signed = ftell(f);
- if (f_size_signed == -1)
- {
- fclose(f);
- return;
- }
- size_t f_size = (size_t)f_size_signed;
- if (fseek(f, 0, SEEK_SET))
- {
- fclose(f);
- return;
- }
- char* f_data = (char*)ImGui::MemAlloc(f_size+1);
- f_size = fread(f_data, 1, f_size, f);
- fclose(f);
- if (f_size == 0)
- {
- ImGui::MemFree(f_data);
- return;
- }
- f_data[f_size] = 0;
-
- ImGuiIniData* settings = NULL;
- const char* buf_end = f_data + f_size;
- for (const char* line_start = f_data; line_start < buf_end; )
- {
- const char* line_end = line_start;
- while (line_end < buf_end && *line_end != '\n' && *line_end != '\r')
- line_end++;
-
- if (line_start[0] == '[' && line_end > line_start && line_end[-1] == ']')
- {
- char name[64];
- ImFormatString(name, IM_ARRAYSIZE(name), "%.*s", line_end-line_start-2, line_start+1);
- settings = FindWindowSettings(name);
- }
- else if (settings)
- {
- float x, y;
- int i;
- if (sscanf(line_start, "Pos=%f,%f", &x, &y) == 2)
- settings->Pos = ImVec2(x, y);
- else if (sscanf(line_start, "Size=%f,%f", &x, &y) == 2)
- settings->Size = ImMax(ImVec2(x, y), g.Style.WindowMinSize);
- else if (sscanf(line_start, "Collapsed=%d", &i) == 1)
- settings->Collapsed = (i != 0);
- }
-
- line_start = line_end+1;
- }
-
- ImGui::MemFree(f_data);
- }
-
- static void SaveSettings()
- {
- ImGuiState& g = GImGui;
- const char* filename = g.IO.IniFilename;
- if (!filename)
- return;
-
-
- for (size_t i = 0; i != g.Windows.size(); i++)
- {
- ImGuiWindow* window = g.Windows[i];
- if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip))
- continue;
- ImGuiIniData* settings = FindWindowSettings(window->Name);
- settings->Pos = window->Pos;
- settings->Size = window->SizeFull;
- settings->Collapsed = window->Collapsed;
- }
-
-
-
- FILE* f = fopen(filename, "wt");
- if (!f)
- return;
- for (size_t i = 0; i != g.Settings.size(); i++)
- {
- const ImGuiIniData* settings = g.Settings[i];
- if (settings->Pos.x == FLT_MAX)
- continue;
- fprintf(f, "[%s]\n", settings->Name);
- fprintf(f, "Pos=%d,%d\n", (int)settings->Pos.x, (int)settings->Pos.y);
- fprintf(f, "Size=%d,%d\n", (int)settings->Size.x, (int)settings->Size.y);
- fprintf(f, "Collapsed=%d\n", settings->Collapsed);
- fprintf(f, "\n");
- }
-
- fclose(f);
- }
-
- static void MarkSettingsDirty()
- {
- ImGuiState& g = GImGui;
-
- if (g.SettingsDirtyTimer <= 0.0f)
- g.SettingsDirtyTimer = g.IO.IniSavingRate;
- }
-
- ImGuiIO& GetIO()
- {
- return GImGui.IO;
- }
-
- ImGuiStyle& GetStyle()
- {
- return GImGui.Style;
- }
-
- void NewFrame()
- {
- ImGuiState& g = GImGui;
-
-
- IM_ASSERT(g.IO.DeltaTime > 0.0f);
- IM_ASSERT(g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f);
- IM_ASSERT(g.IO.RenderDrawListsFn != NULL);
- IM_ASSERT(g.IO.FontBaseScale > 0.0f);
-
- if (!g.Initialized)
- {
-
- g.LogClipboard = (ImGuiTextBuffer*)ImGui::MemAlloc(sizeof(ImGuiTextBuffer));
- new(g.LogClipboard) ImGuiTextBuffer();
-
- IM_ASSERT(g.Settings.empty());
- LoadSettings();
- if (!g.IO.Font)
- {
-
- const void* fnt_data;
- unsigned int fnt_size;
- ImGui::GetDefaultFontData(&fnt_data, &fnt_size, NULL, NULL);
- g.IO.Font = (ImBitmapFont*)ImGui::MemAlloc(sizeof(ImBitmapFont));
- new(g.IO.Font) ImBitmapFont();
- g.IO.Font->LoadFromMemory(fnt_data, fnt_size);
- g.IO.FontYOffset = +1;
- }
- g.Initialized = true;
- }
- IM_ASSERT(g.IO.Font && g.IO.Font->IsLoaded());
-
- g.Time += g.IO.DeltaTime;
- g.FrameCount += 1;
- g.Tooltip[0] = '\0';
- g.FontSize = g.IO.FontBaseScale * g.IO.Font->GetFontSize();
-
-
- if (g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0)
- g.IO.MousePos = ImVec2(-9999.0f, -9999.0f);
- if ((g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0) || (g.IO.MousePosPrev.x < 0 && g.IO.MousePosPrev.y < 0))
- g.IO.MouseDelta = ImVec2(0.0f, 0.0f);
- else
- g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev;
- g.IO.MousePosPrev = g.IO.MousePos;
- for (size_t i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++)
- {
- g.IO.MouseDownTime[i] = g.IO.MouseDown[i] ? (g.IO.MouseDownTime[i] < 0.0f ? 0.0f : g.IO.MouseDownTime[i] + g.IO.DeltaTime) : -1.0f;
- g.IO.MouseClicked[i] = (g.IO.MouseDownTime[i] == 0.0f);
- g.IO.MouseDoubleClicked[i] = false;
- if (g.IO.MouseClicked[i])
- {
- if (g.Time - g.IO.MouseClickedTime[i] < g.IO.MouseDoubleClickTime)
- {
- if (ImLength(g.IO.MousePos - g.IO.MouseClickedPos[i]) < g.IO.MouseDoubleClickMaxDist)
- g.IO.MouseDoubleClicked[i] = true;
- g.IO.MouseClickedTime[i] = -FLT_MAX;
- }
- else
- {
- g.IO.MouseClickedTime[i] = g.Time;
- g.IO.MouseClickedPos[i] = g.IO.MousePos;
- }
- }
- }
- for (size_t i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++)
- g.IO.KeysDownTime[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownTime[i] < 0.0f ? 0.0f : g.IO.KeysDownTime[i] + g.IO.DeltaTime) : -1.0f;
-
-
- g.HoveredId = 0;
- if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
- g.ActiveId = 0;
- g.ActiveIdPreviousFrame = g.ActiveId;
- g.ActiveIdIsAlive = false;
-
-
- if (g.SettingsDirtyTimer > 0.0f)
- {
- g.SettingsDirtyTimer -= g.IO.DeltaTime;
- if (g.SettingsDirtyTimer <= 0.0f)
- SaveSettings();
- }
-
- g.HoveredWindow = ImGui::FindHoveredWindow(g.IO.MousePos, false);
- g.HoveredWindowExcludingChilds = ImGui::FindHoveredWindow(g.IO.MousePos, true);
-
-
- g.IO.WantCaptureMouse = (g.HoveredWindow != NULL) || (g.ActiveId != 0);
- g.IO.WantCaptureKeyboard = (g.ActiveId != 0);
-
-
- if (g.HoveredWindow && g.IO.MouseWheel != 0)
- {
- ImGuiWindow* window = g.HoveredWindow;
- if (g.IO.KeyCtrl)
- {
- if (g.IO.FontAllowUserScaling)
- {
-
- float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
- float scale = new_font_scale / window->FontWindowScale;
- window->FontWindowScale = new_font_scale;
-
- const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
- window->Pos += offset;
- window->PosFloat += offset;
- window->Size *= scale;
- window->SizeFull *= scale;
- }
- }
- else
- {
-
- const int scroll_lines = (window->Flags & ImGuiWindowFlags_ComboBox) ? 3 : 5;
- window->NextScrollY -= g.IO.MouseWheel * window->FontSize() * scroll_lines;
- }
- }
-
-
-
- if (g.ActiveId == 0 && g.FocusedWindow != NULL && g.FocusedWindow->Visible && IsKeyPressedMap(ImGuiKey_Tab, false))
- {
- g.FocusedWindow->FocusIdxRequestNext = 0;
- }
-
-
- for (size_t i = 0; i != g.Windows.size(); i++)
- {
- ImGuiWindow* window = g.Windows[i];
- window->Visible = false;
- window->Accessed = false;
- }
-
-
-
- g.CurrentWindowStack.clear();
-
-
- ImGui::Begin("Debug", NULL, ImVec2(400,400));
- }
-
-
- void Shutdown()
- {
- ImGuiState& g = GImGui;
- if (!g.Initialized)
- return;
-
- SaveSettings();
-
- for (size_t i = 0; i < g.Windows.size(); i++)
- {
- g.Windows[i]->~ImGuiWindow();
- ImGui::MemFree(g.Windows[i]);
- }
- g.Windows.clear();
- g.CurrentWindowStack.clear();
- g.RenderDrawLists.clear();
- g.FocusedWindow = NULL;
- g.HoveredWindow = NULL;
- g.HoveredWindowExcludingChilds = NULL;
- for (size_t i = 0; i < g.Settings.size(); i++)
- {
- g.Settings[i]->~ImGuiIniData();
- ImGui::MemFree(g.Settings[i]);
- }
- g.Settings.clear();
- g.ColorEditModeStorage.Clear();
- if (g.LogFile && g.LogFile != stdout)
- {
- fclose(g.LogFile);
- g.LogFile = NULL;
- }
- if (g.IO.Font)
- {
- g.IO.Font->~ImBitmapFont();
- ImGui::MemFree(g.IO.Font);
- g.IO.Font = NULL;
- }
-
- if (g.PrivateClipboard)
- {
- ImGui::MemFree(g.PrivateClipboard);
- g.PrivateClipboard = NULL;
- }
-
- if (g.LogClipboard)
- {
- g.LogClipboard->~ImGuiTextBuffer();
- ImGui::MemFree(g.LogClipboard);
- }
-
- g.Initialized = false;
- }
-
- static void AddWindowToSortedBuffer(ImGuiWindow* window, ImVector<ImGuiWindow*>& sorted_windows)
- {
- sorted_windows.push_back(window);
- if (window->Visible)
- {
- for (size_t i = 0; i < window->DC.ChildWindows.size(); i++)
- {
- ImGuiWindow* child = window->DC.ChildWindows[i];
- if (child->Visible)
- AddWindowToSortedBuffer(child, sorted_windows);
- }
- }
- }
-
- static void PushClipRect(const ImVec4& clip_rect, bool clipped = true)
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- ImVec4 cr = clip_rect;
- if (clipped && !window->ClipRectStack.empty())
- {
-
- const ImVec4 cur_cr = window->ClipRectStack.back();
- cr = ImVec4(ImMax(cr.x, cur_cr.x), ImMax(cr.y, cur_cr.y), ImMin(cr.z, cur_cr.z), ImMin(cr.w, cur_cr.w));
- }
-
- window->ClipRectStack.push_back(cr);
- window->DrawList->PushClipRect(cr);
- }
-
- static void PopClipRect()
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->ClipRectStack.pop_back();
- window->DrawList->PopClipRect();
- }
-
- void Render()
- {
- ImGuiState& g = GImGui;
- IM_ASSERT(g.Initialized);
-
- const bool first_render_of_the_frame = (g.FrameCountRendered != g.FrameCount);
- g.FrameCountRendered = g.FrameCount;
-
- if (first_render_of_the_frame)
- {
-
- IM_ASSERT(g.CurrentWindowStack.size() == 1);
- if (g.CurrentWindow && !g.CurrentWindow->Accessed)
- g.CurrentWindow->Visible = false;
- ImGui::End();
-
-
-
- ImVector<ImGuiWindow*> sorted_windows;
- sorted_windows.reserve(g.Windows.size());
- for (size_t i = 0; i != g.Windows.size(); i++)
- {
- ImGuiWindow* window = g.Windows[i];
- if (window->Flags & ImGuiWindowFlags_ChildWindow)
- if (window->Visible)
- continue;
- AddWindowToSortedBuffer(window, sorted_windows);
- }
- IM_ASSERT(g.Windows.size() == sorted_windows.size());
- g.Windows.swap(sorted_windows);
-
-
- g.IO.MouseWheel = 0;
- memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));
- }
-
-
-
- if (g.Style.Alpha > 0.0f)
- {
-
- if (g.Tooltip[0])
- {
-
- ImGui::BeginTooltip();
- ImGui::TextUnformatted(g.Tooltip);
- ImGui::EndTooltip();
- }
-
-
- g.RenderDrawLists.resize(0);
- for (size_t i = 0; i != g.Windows.size(); i++)
- {
- ImGuiWindow* window = g.Windows[i];
- if (window->Visible && (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0)
- window->AddToRenderList();
- }
- for (size_t i = 0; i != g.Windows.size(); i++)
- {
- ImGuiWindow* window = g.Windows[i];
- if (window->Visible && (window->Flags & ImGuiWindowFlags_Tooltip))
- window->AddToRenderList();
- }
-
-
- if (!g.RenderDrawLists.empty())
- g.IO.RenderDrawListsFn(&g.RenderDrawLists[0], (int)g.RenderDrawLists.size());
- g.RenderDrawLists.resize(0);
- }
- }
-
-
- static const char* FindTextDisplayEnd(const char* text, const char* text_end = NULL)
- {
- const char* text_display_end = text;
- while ((!text_end || text_display_end < text_end) && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#'))
- text_display_end++;
- return text_display_end;
- }
-
-
- static void LogText(const ImVec2& ref_pos, const char* text, const char* text_end)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- if (!text_end)
- text_end = FindTextDisplayEnd(text, text_end);
-
- const bool log_new_line = ref_pos.y > window->DC.LogLineHeight+1;
- window->DC.LogLineHeight = ref_pos.y;
-
- const char* text_remaining = text;
- const int tree_depth = window->DC.TreeDepth;
- while (true)
- {
- const char* line_end = text_remaining;
- while (line_end < text_end)
- if (*line_end == '\n')
- break;
- else
- line_end++;
- if (line_end >= text_end)
- line_end = NULL;
-
- const bool is_first_line = (text == text_remaining);
- bool is_last_line = false;
- if (line_end == NULL)
- {
- is_last_line = true;
- line_end = text_end;
- }
- if (line_end != NULL && !(is_last_line && (line_end - text_remaining)==0))
- {
- const int char_count = (int)(line_end - text_remaining);
- if (g.LogFile)
- {
- if (log_new_line || !is_first_line)
- fprintf(g.LogFile, "\n%*s%.*s", tree_depth*4, "", char_count, text_remaining);
- else
- fprintf(g.LogFile, " %.*s", char_count, text_remaining);
- }
- else
- {
- if (log_new_line || !is_first_line)
- g.LogClipboard->append("\n%*s%.*s", tree_depth*4, "", char_count, text_remaining);
- else
- g.LogClipboard->append(" %.*s", char_count, text_remaining);
- }
- }
-
- if (is_last_line)
- break;
- text_remaining = line_end + 1;
- }
- }
-
-
- static void RenderText(ImVec2 pos, const char* text, const char* text_end, const bool hide_text_after_hash)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
-
- const char* text_display_end;
- if (hide_text_after_hash)
- {
- text_display_end = FindTextDisplayEnd(text, text_end);
- }
- else
- {
- if (!text_end)
- text_end = text + strlen(text);
- text_display_end = text_end;
- }
-
- const int text_len = (int)(text_display_end - text);
-
- if (text_len > 0)
- {
-
- window->DrawList->AddText(window->Font(), window->FontSize(), pos, window->Color(ImGuiCol_Text), text, text + text_len);
-
-
- if (g.LogEnabled)
- LogText(pos, text, text_display_end);
- }
- }
-
-
- static void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding)
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding);
- if (border && (window->Flags & ImGuiWindowFlags_ShowBorders))
- {
-
- const float offset = GImGui.IO.PixelCenterOffset;
- window->DrawList->AddRect(p_min+ImVec2(1.5f-offset,1.5f-offset), p_max+ImVec2(1.0f-offset*2,1.0f-offset*2), window->Color(ImGuiCol_BorderShadow), rounding);
- window->DrawList->AddRect(p_min+ImVec2(0.5f-offset,0.5f-offset), p_max+ImVec2(0.0f-offset*2,0.0f-offset*2), window->Color(ImGuiCol_Border), rounding);
- }
- }
-
-
- static void RenderCollapseTriangle(ImVec2 p_min, bool open, float scale, bool shadow)
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- const float h = window->FontSize() * 1.00f;
- const float r = h * 0.40f * scale;
- ImVec2 center = p_min + ImVec2(h*0.50f, h*0.50f*scale);
-
- ImVec2 a, b, c;
- if (open)
- {
- center.y -= r*0.25f;
- a = center + ImVec2(0,1)*r;
- b = center + ImVec2(-0.866f,-0.5f)*r;
- c = center + ImVec2(0.866f,-0.5f)*r;
- }
- else
- {
- a = center + ImVec2(1,0)*r;
- b = center + ImVec2(-0.500f,0.866f)*r;
- c = center + ImVec2(-0.500f,-0.866f)*r;
- }
-
- if (shadow && (window->Flags & ImGuiWindowFlags_ShowBorders) != 0)
- window->DrawList->AddTriangleFilled(a+ImVec2(2,2), b+ImVec2(2,2), c+ImVec2(2,2), window->Color(ImGuiCol_BorderShadow));
- window->DrawList->AddTriangleFilled(a, b, c, window->Color(ImGuiCol_Border));
- }
-
-
-
- ImVec2 CalcTextSize(const char* text, const char* text_end, const bool hide_text_after_hash)
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- const char* text_display_end;
- if (hide_text_after_hash)
- text_display_end = FindTextDisplayEnd(text, text_end);
- else
- text_display_end = text_end;
-
- const ImVec2 size = window->Font()->CalcTextSizeA(window->FontSize(), 0, text, text_display_end, NULL);
- return size;
- }
-
-
- static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
- {
- ImGuiState& g = GImGui;
- for (int i = (int)g.Windows.size()-1; i >= 0; i--)
- {
- ImGuiWindow* window = g.Windows[(size_t)i];
- if (!window->Visible)
- continue;
- if (excluding_childs && (window->Flags & ImGuiWindowFlags_ChildWindow) != 0)
- continue;
- ImGuiAabb bb(window->Pos - g.Style.TouchExtraPadding, window->Pos+window->Size + g.Style.TouchExtraPadding);
- if (bb.Contains(pos))
- return window;
- }
- return NULL;
- }
-
-
-
-
- static bool IsMouseHoveringBox(const ImGuiAabb& box)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
-
- ImGuiAabb box_clipped = box;
- if (!window->ClipRectStack.empty())
- {
- const ImVec4 clip_rect = window->ClipRectStack.back();
- box_clipped.Clip(ImGuiAabb(ImVec2(clip_rect.x, clip_rect.y), ImVec2(clip_rect.z, clip_rect.w)));
- }
-
-
- const ImGuiAabb box_for_touch(box_clipped.Min - g.Style.TouchExtraPadding, box_clipped.Max + g.Style.TouchExtraPadding);
- return box_for_touch.Contains(g.IO.MousePos);
- }
-
- bool IsMouseHoveringBox(const ImVec2& box_min, const ImVec2& box_max)
- {
- return IsMouseHoveringBox(ImGuiAabb(box_min, box_max));
- }
-
- bool IsMouseHoveringWindow()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- return g.HoveredWindow == window;
- }
-
- bool IsMouseHoveringAnyWindow()
- {
- ImGuiState& g = GImGui;
- return g.HoveredWindow != NULL;
- }
-
- bool IsPosHoveringAnyWindow(const ImVec2& pos)
- {
- return ImGui::FindHoveredWindow(pos, false) != NULL;
- }
-
- static bool IsKeyPressedMap(ImGuiKey key, bool repeat)
- {
- ImGuiState& g = GImGui;
- const int key_index = g.IO.KeyMap[key];
- return IsKeyPressed(key_index, repeat);
- }
-
- bool IsKeyPressed(int key_index, bool repeat)
- {
- ImGuiState& g = GImGui;
- IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown));
- const float t = g.IO.KeysDownTime[key_index];
- if (t == 0.0f)
- return true;
-
-
- const float KEY_REPEAT_DELAY = 0.250f;
- const float KEY_REPEAT_RATE = 0.020f;
- if (repeat && t > KEY_REPEAT_DELAY)
- if ((fmodf(t - KEY_REPEAT_DELAY, KEY_REPEAT_RATE) > KEY_REPEAT_RATE*0.5f) != (fmodf(t - KEY_REPEAT_DELAY - g.IO.DeltaTime, KEY_REPEAT_RATE) > KEY_REPEAT_RATE*0.5f))
- return true;
-
- return false;
- }
-
- bool IsMouseClicked(int button, bool repeat)
- {
- ImGuiState& g = GImGui;
- IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
- const float t = g.IO.MouseDownTime[button];
- if (t == 0.0f)
- return true;
-
-
- const float MOUSE_REPEAT_DELAY = 0.250f;
- const float MOUSE_REPEAT_RATE = 0.020f;
- if (repeat && t > MOUSE_REPEAT_DELAY)
- if ((fmodf(t - MOUSE_REPEAT_DELAY, MOUSE_REPEAT_RATE) > MOUSE_REPEAT_RATE*0.5f) != (fmodf(t - MOUSE_REPEAT_DELAY - g.IO.DeltaTime, MOUSE_REPEAT_RATE) > MOUSE_REPEAT_RATE*0.5f))
- return true;
-
- return false;
- }
-
- bool IsMouseDoubleClicked(int button)
- {
- ImGuiState& g = GImGui;
- IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
- return g.IO.MouseDoubleClicked[button];
- }
-
- ImVec2 GetMousePos()
- {
- return GImGui.IO.MousePos;
- }
-
- bool IsHovered()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.LastItemHovered;
- }
-
- ImVec2 GetItemBoxMin()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.LastItemAabb.Min;
- }
-
- ImVec2 GetItemBoxMax()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.LastItemAabb.Max;
- }
-
-
- void SetTooltipV(const char* fmt, va_list args)
- {
- ImGuiState& g = GImGui;
- ImFormatStringV(g.Tooltip, IM_ARRAYSIZE(g.Tooltip), fmt, args);
- }
-
- void SetTooltip(const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- SetTooltipV(fmt, args);
- va_end(args);
- }
-
-
- void SetNewWindowDefaultPos(const ImVec2& pos)
- {
- ImGuiState& g = GImGui;
- g.NewWindowDefaultPos = pos;
- }
-
- float GetTime()
- {
- return GImGui.Time;
- }
-
- int GetFrameCount()
- {
- return GImGui.FrameCount;
- }
-
- static ImGuiWindow* FindWindow(const char* name)
- {
- ImGuiState& g = GImGui;
- for (size_t i = 0; i != g.Windows.size(); i++)
- if (strcmp(g.Windows[i]->Name, name) == 0)
- return g.Windows[i];
- return NULL;
- }
-
- void BeginTooltip()
- {
- ImGui::Begin("##Tooltip", NULL, ImVec2(0,0), 0.9f, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_Tooltip);
- }
-
- void EndTooltip()
- {
- IM_ASSERT(GetCurrentWindow()->Flags & ImGuiWindowFlags_Tooltip);
- ImGui::End();
- }
-
- void BeginChild(const char* str_id, ImVec2 size, bool border, ImGuiWindowFlags extra_flags)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_ChildWindow;
-
- const ImVec2 content_max = window->Pos + ImGui::GetWindowContentRegionMax();
- const ImVec2 cursor_pos = window->Pos + ImGui::GetCursorPos();
- if (size.x <= 0.0f)
- {
- size.x = ImMax(content_max.x - cursor_pos.x, g.Style.WindowMinSize.x);
- flags |= ImGuiWindowFlags_ChildWindowAutoFitX;
- }
- if (size.y <= 0.0f)
- {
- size.y = ImMax(content_max.y - cursor_pos.y, g.Style.WindowMinSize.y);
- flags |= ImGuiWindowFlags_ChildWindowAutoFitY;
- }
- if (border)
- flags |= ImGuiWindowFlags_ShowBorders;
- flags |= extra_flags;
-
- char title[256];
- ImFormatString(title, IM_ARRAYSIZE(title), "%s.%s", window->Name, str_id);
-
- const float alpha = (flags & ImGuiWindowFlags_ComboBox) ? 1.0f : 0.0f;
- ImGui::Begin(title, NULL, size, alpha, flags);
-
- if (!(window->Flags & ImGuiWindowFlags_ShowBorders))
- g.CurrentWindow->Flags &= ~ImGuiWindowFlags_ShowBorders;
- }
-
- void EndChild()
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- if (window->Flags & ImGuiWindowFlags_ComboBox)
- {
- ImGui::End();
- }
- else
- {
-
- ImVec2 sz = ImGui::GetWindowSize();
- if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitX)
- sz.x = 0;
- if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitY)
- sz.y = 0;
-
- ImGui::End();
- ImGui::ItemSize(sz);
- }
- }
-
-
- bool Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, ImGuiWindowFlags flags)
- {
- ImGuiState& g = GImGui;
- const ImGuiStyle& style = g.Style;
-
- ImGuiWindow* window = FindWindow(name);
- if (!window)
- {
-
- if (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip))
- {
-
- window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow));
- new(window) ImGuiWindow(name, ImVec2(0,0), size);
- }
- else
- {
- ImGuiIniData* settings = FindWindowSettings(name);
- if (settings && ImLength(settings->Size) > 0.0f && !(flags & ImGuiWindowFlags_NoResize))
- size = settings->Size;
-
- window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow));
- new(window) ImGuiWindow(name, g.NewWindowDefaultPos, size);
-
- if (settings->Pos.x != FLT_MAX)
- {
- window->PosFloat = settings->Pos;
- window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
- window->Collapsed = settings->Collapsed;
- }
- }
- g.Windows.push_back(window);
- }
- window->Flags = (ImGuiWindowFlags)flags;
-
- g.CurrentWindowStack.push_back(window);
- g.CurrentWindow = window;
-
-
- if (fill_alpha < 0.0f)
- fill_alpha = style.WindowFillAlphaDefault;
-
-
- const int current_frame = ImGui::GetFrameCount();
- const bool first_begin_of_the_frame = (window->LastFrameDrawn != current_frame);
- if (first_begin_of_the_frame)
- {
- window->DrawList->Clear();
- window->Visible = true;
-
-
- if (window->LastFrameDrawn < current_frame - 1)
- {
- ImGui::FocusWindow(window);
- if ((window->Flags & ImGuiWindowFlags_Tooltip) != 0)
- {
-
- window->AutoFitFrames = 2;
- window->Visible = false;
- }
- }
-
- window->LastFrameDrawn = current_frame;
- window->ClipRectStack.resize(0);
-
- if (flags & ImGuiWindowFlags_ChildWindow)
- {
- ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.size()-2];
- parent_window->DC.ChildWindows.push_back(window);
- window->Pos = window->PosFloat = parent_window->DC.CursorPos;
- window->SizeFull = size;
- }
-
-
- if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ComboBox))
- ImGui::PushClipRect(g.CurrentWindowStack[g.CurrentWindowStack.size()-2]->ClipRectStack.back());
- else
- ImGui::PushClipRect(ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y));
-
-
- window->IDStack.resize(0);
- ImGui::PushID(window);
-
-
- const ImGuiID move_id = window->GetID("#MOVE");
- RegisterAliveId(move_id);
- if (g.ActiveId == move_id)
- {
- if (g.IO.MouseDown[0])
- {
- if (!(window->Flags & ImGuiWindowFlags_NoMove))
- {
- window->PosFloat += g.IO.MouseDelta;
- MarkSettingsDirty();
- }
- ImGui::FocusWindow(window);
- }
- else
- {
- g.ActiveId = 0;
- }
- }
-
-
- if ((window->Flags & ImGuiWindowFlags_Tooltip) != 0)
- {
- window->PosFloat = g.IO.MousePos + ImVec2(32,16) - g.Style.FramePadding*2;
- }
-
-
- if (!(window->Flags & ImGuiWindowFlags_ChildWindow))
- {
- const ImVec2 pad = ImVec2(window->FontSize()*2.0f, window->FontSize()*2.0f);
- window->PosFloat = ImMax(window->PosFloat + window->Size, pad) - window->Size;
- window->PosFloat = ImMin(window->PosFloat, ImVec2(g.IO.DisplaySize.x, g.IO.DisplaySize.y) - pad);
- window->SizeFull = ImMax(window->SizeFull, pad);
- }
- window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
-
-
- if (window->Size.x > 0.0f && !(window->Flags & ImGuiWindowFlags_Tooltip))
- window->ItemWidthDefault = (float)(int)(window->Size.x * 0.65f);
- else
- window->ItemWidthDefault = 200.0f;
-
-
- if (window->FocusIdxRequestNext == IM_INT_MAX || window->FocusIdxCounter == -1)
- {
- window->FocusIdxRequestCurrent = IM_INT_MAX;
- }
- else
- {
- const int mod = window->FocusIdxCounter+1;
- window->FocusIdxRequestCurrent = (window->FocusIdxRequestNext + mod) % mod;
- }
- window->FocusIdxCounter = -1;
- window->FocusIdxRequestNext = IM_INT_MAX;
-
- ImGuiAabb title_bar_aabb = window->TitleBarAabb();
-
-
- window->ScrollY = window->NextScrollY;
- window->ScrollY = ImMax(window->ScrollY, 0.0f);
- if (!window->Collapsed && !window->SkipItems)
- window->ScrollY = ImMin(window->ScrollY, ImMax(0.0f, (float)window->SizeContentsFit.y - window->SizeFull.y));
- window->NextScrollY = window->ScrollY;
-
-
-
- if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
- {
- if (g.HoveredWindow == window && IsMouseHoveringBox(title_bar_aabb) && g.IO.MouseDoubleClicked[0])
- {
- window->Collapsed = !window->Collapsed;
- MarkSettingsDirty();
- ImGui::FocusWindow(window);
- }
- }
- else
- {
- window->Collapsed = false;
- }
-
- if (window->Collapsed)
- {
-
- window->Size = title_bar_aabb.GetSize();
- window->DrawList->AddRectFilled(title_bar_aabb.GetTL(), title_bar_aabb.GetBR(), window->Color(ImGuiCol_TitleBgCollapsed), g.Style.WindowRounding);
- if (window->Flags & ImGuiWindowFlags_ShowBorders)
- {
- window->DrawList->AddRect(title_bar_aabb.GetTL()+ImVec2(1,1), title_bar_aabb.GetBR()+ImVec2(1,1), window->Color(ImGuiCol_BorderShadow), g.Style.WindowRounding);
- window->DrawList->AddRect(title_bar_aabb.GetTL(), title_bar_aabb.GetBR(), window->Color(ImGuiCol_Border), g.Style.WindowRounding);
- }
- }
- else
- {
- window->Size = window->SizeFull;
-
- ImU32 resize_col = 0;
- if ((window->Flags & ImGuiWindowFlags_Tooltip) != 0)
- {
-
- if (window->AutoFitFrames > 0)
- {
- window->SizeFull = window->SizeContentsFit + g.Style.WindowPadding - ImVec2(0.0f, g.Style.ItemSpacing.y);
- }
- }
- else if (!(window->Flags & ImGuiWindowFlags_NoResize))
- {
-
- const ImGuiAabb resize_aabb(window->Aabb().GetBR()-ImVec2(18,18), window->Aabb().GetBR());
- const ImGuiID resize_id = window->GetID("#RESIZE");
- bool hovered, held;
- ButtonBehaviour(resize_aabb, resize_id, &hovered, &held, true);
- resize_col = window->Color(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
-
- ImVec2 size_auto_fit = ImClamp(window->SizeContentsFit + style.AutoFitPadding, style.WindowMinSize, g.IO.DisplaySize - style.AutoFitPadding);
- if (window->AutoFitFrames > 0)
- {
-
- window->SizeFull = ImMax(window->SizeFull, size_auto_fit);
- MarkSettingsDirty();
- }
- else if (g.HoveredWindow == window && held && g.IO.MouseDoubleClicked[0])
- {
-
- window->SizeFull = size_auto_fit;
- window->Size = window->SizeFull;
- MarkSettingsDirty();
- }
- else if (held)
- {
-
- window->SizeFull = ImMax(window->SizeFull + g.IO.MouseDelta, style.WindowMinSize);
- window->Size = window->SizeFull;
- MarkSettingsDirty();
- }
-
-
- title_bar_aabb = window->TitleBarAabb();
- }
-
-
- if (fill_alpha > 0.0f)
- {
- if ((window->Flags & ImGuiWindowFlags_ComboBox) != 0)
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_ComboBg, fill_alpha), 0);
- else
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_WindowBg, fill_alpha), g.Style.WindowRounding);
- }
-
- if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddRectFilled(title_bar_aabb.GetTL(), title_bar_aabb.GetBR(), window->Color(ImGuiCol_TitleBg), g.Style.WindowRounding, 1|2);
-
-
- if (window->Flags & ImGuiWindowFlags_ShowBorders)
- {
- const float rounding = (window->Flags & ImGuiWindowFlags_ComboBox) ? 0.0f : g.Style.WindowRounding;
- window->DrawList->AddRect(window->Pos+ImVec2(1,1), window->Pos+window->Size+ImVec2(1,1), window->Color(ImGuiCol_BorderShadow), rounding);
- window->DrawList->AddRect(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_Border), rounding);
- if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddLine(title_bar_aabb.GetBL(), title_bar_aabb.GetBR(), window->Color(ImGuiCol_Border));
- }
-
-
- window->ScrollbarY = (window->SizeContentsFit.y > window->Size.y) && !(window->Flags & ImGuiWindowFlags_NoScrollbar);
- if (window->ScrollbarY)
- {
- ImGuiAabb scrollbar_bb(window->Aabb().Max.x - style.ScrollBarWidth, title_bar_aabb.Max.y+1, window->Aabb().Max.x, window->Aabb().Max.y-1);
-
- window->DrawList->AddRectFilled(scrollbar_bb.Min, scrollbar_bb.Max, window->Color(ImGuiCol_ScrollbarBg));
- scrollbar_bb.Expand(ImVec2(-3,-3));
-
- const float grab_size_y_norm = ImSaturate(window->Size.y / ImMax(window->SizeContentsFit.y, window->Size.y));
- const float grab_size_y = scrollbar_bb.GetHeight() * grab_size_y_norm;
-
-
- bool held = false;
- bool hovered = false;
- if (grab_size_y_norm < 1.0f)
- {
- const ImGuiID scrollbar_id = window->GetID("#SCROLLY");
- ButtonBehaviour(scrollbar_bb, scrollbar_id, &hovered, &held, true);
- if (held)
- {
- g.HoveredId = scrollbar_id;
- const float pos_y_norm = ImSaturate((g.IO.MousePos.y - (scrollbar_bb.Min.y + grab_size_y*0.5f)) / (scrollbar_bb.GetHeight() - grab_size_y)) * (1.0f - grab_size_y_norm);
- window->ScrollY = pos_y_norm * window->SizeContentsFit.y;
- window->NextScrollY = window->ScrollY;
- }
- }
-
-
- const float pos_y_norm = ImSaturate(window->ScrollY / ImMax(0.0f, window->SizeContentsFit.y));
- const ImU32 grab_col = window->Color(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab);
- window->DrawList->AddRectFilled(
- ImVec2(scrollbar_bb.Min.x, ImLerp(scrollbar_bb.Min.y, scrollbar_bb.Max.y, pos_y_norm)),
- ImVec2(scrollbar_bb.Max.x, ImLerp(scrollbar_bb.Min.y, scrollbar_bb.Max.y, pos_y_norm + grab_size_y_norm)), grab_col);
- }
-
-
-
- if (!(window->Flags & ImGuiWindowFlags_NoResize))
- {
- const float r = style.WindowRounding;
- const ImVec2 br = window->Aabb().GetBR();
- if (r == 0.0f)
- {
- window->DrawList->AddTriangleFilled(br, br-ImVec2(0,14), br-ImVec2(14,0), resize_col);
- }
- else
- {
-
- window->DrawList->AddArc(br - ImVec2(r,r), r, resize_col, 6, 9, true);
- window->DrawList->AddTriangleFilled(br+ImVec2(0,-2*r),br+ImVec2(0,-r),br+ImVec2(-r,-r), resize_col);
- window->DrawList->AddTriangleFilled(br+ImVec2(-r,-r), br+ImVec2(-r,0),br+ImVec2(-2*r,0), resize_col);
- }
- }
- }
-
-
- window->DC.ColumnStartX = window->WindowPadding().x;
- window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.ColumnStartX, window->TitleBarHeight() + window->WindowPadding().y) - ImVec2(0.0f, window->ScrollY);
- window->DC.CursorPos = window->DC.CursorStartPos;
- window->DC.CursorPosPrevLine = window->DC.CursorPos;
- window->DC.CurrentLineHeight = window->DC.PrevLineHeight = 0.0f;
- window->DC.LogLineHeight = window->DC.CursorPos.y - 9999.0f;
- window->DC.ChildWindows.resize(0);
- window->DC.ItemWidth.resize(0);
- window->DC.ItemWidth.push_back(window->ItemWidthDefault);
- window->DC.AllowKeyboardFocus.resize(0);
- window->DC.AllowKeyboardFocus.push_back(true);
- window->DC.ColorModifiers.resize(0);
- window->DC.ColorEditMode = ImGuiColorEditMode_UserSelect;
- window->DC.ColumnCurrent = 0;
- window->DC.ColumnsCount = 1;
- window->DC.TreeDepth = 0;
- window->DC.StateStorage = &window->StateStorage;
- window->DC.OpenNextNode = -1;
-
-
- window->SizeContentsFit = ImVec2(0.0f, 0.0f);
- if (window->AutoFitFrames > 0)
- window->AutoFitFrames--;
-
-
- if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
- {
- RenderCollapseTriangle(window->Pos + style.FramePadding, !window->Collapsed, 1.0f, true);
- if (open)
- ImGui::CloseWindowButton(open);
-
- const ImVec2 text_size = CalcTextSize(name);
- const ImVec2 text_min = window->Pos + style.FramePadding + ImVec2(window->FontSize() + style.ItemInnerSpacing.x, 0.0f);
- const ImVec2 text_max = window->Pos + ImVec2(window->Size.x - (open ? (title_bar_aabb.GetHeight()-3) : style.FramePadding.x), style.FramePadding.y + text_size.y);
- const bool clip_title = text_size.x > (text_max.x - text_min.x);
- if (clip_title)
- ImGui::PushClipRect(ImVec4(text_min.x, text_min.y, text_max.x, text_max.y));
- RenderText(text_min, name);
- if (clip_title)
- ImGui::PopClipRect();
- }
- }
- else
- {
-
- if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ComboBox))
- {
- ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.size()-2];
- ImGui::PushClipRect(parent_window->ClipRectStack.back());
- }
- else
- {
- ImGui::PushClipRect(ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y));
- }
- }
-
-
-
- const ImGuiAabb title_bar_aabb = window->TitleBarAabb();
- ImVec4 clip_rect(title_bar_aabb.Min.x+0.5f+window->WindowPadding().x*0.5f, title_bar_aabb.Max.y+0.5f, window->Aabb().Max.x+0.5f-window->WindowPadding().x*0.5f, window->Aabb().Max.y-1.5f);
- if (window->ScrollbarY)
- clip_rect.z -= g.Style.ScrollBarWidth;
- ImGui::PushClipRect(clip_rect);
-
-
- if (first_begin_of_the_frame)
- window->Accessed = false;
-
-
-
- if (flags & ImGuiWindowFlags_ChildWindow)
- {
- IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);
- const ImVec4 clip_rect = window->ClipRectStack.back();
- window->Collapsed = (clip_rect.x >= clip_rect.z || clip_rect.y >= clip_rect.w);
-
-
-
- if (window->Collapsed)
- window->Visible = false;
- }
- if (g.Style.Alpha <= 0.0f)
- window->Visible = false;
-
-
- window->SkipItems = window->Collapsed || (!window->Visible && window->AutoFitFrames == 0);
- return !window->SkipItems;
- }
-
- void End()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = g.CurrentWindow;
-
- ImGui::Columns(1, "#CloseColumns");
- ImGui::PopClipRect();
- ImGui::PopClipRect();
-
-
- const ImGuiAabb bb(window->Pos, window->Pos+window->Size);
- if (g.ActiveId == 0 && g.HoveredId == 0 && g.HoveredWindowExcludingChilds == window && IsMouseHoveringBox(bb) && g.IO.MouseClicked[0])
- g.ActiveId = window->GetID("#MOVE");
-
-
- if (!(window->Flags & ImGuiWindowFlags_ChildWindow))
- {
- g.LogEnabled = false;
- if (g.LogFile != NULL)
- {
- fprintf(g.LogFile, "\n");
- if (g.LogFile == stdout)
- fflush(g.LogFile);
- else
- fclose(g.LogFile);
- g.LogFile = NULL;
- }
- if (g.LogClipboard->size() > 1)
- {
- g.LogClipboard->append("\n");
- if (g.IO.SetClipboardTextFn)
- g.IO.SetClipboardTextFn(g.LogClipboard->begin());
- g.LogClipboard->clear();
- }
- }
-
-
- g.CurrentWindowStack.pop_back();
- g.CurrentWindow = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
- }
-
-
- static void FocusWindow(ImGuiWindow* window)
- {
- ImGuiState& g = GImGui;
- g.FocusedWindow = window;
-
- for (size_t i = 0; i < g.Windows.size(); i++)
- if (g.Windows[i] == window)
- {
- g.Windows.erase(g.Windows.begin() + i);
- break;
- }
- g.Windows.push_back(window);
- }
-
- void PushItemWidth(float item_width)
- {
- ImGuiWindow* window = GetCurrentWindow();
- item_width = (float)(int)item_width;
- window->DC.ItemWidth.push_back(item_width > 0.0f ? item_width : window->ItemWidthDefault);
- }
-
- void PopItemWidth()
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.ItemWidth.pop_back();
- }
-
- float GetItemWidth()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.ItemWidth.back();
- }
-
- void PushAllowKeyboardFocus(bool allow_keyboard_focus)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.AllowKeyboardFocus.push_back(allow_keyboard_focus);
- }
-
- void PopAllowKeyboardFocus()
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.AllowKeyboardFocus.pop_back();
- }
-
- void PushStyleColor(ImGuiCol idx, const ImVec4& col)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- ImGuiColMod backup;
- backup.Col = idx;
- backup.PreviousValue = g.Style.Colors[idx];
- window->DC.ColorModifiers.push_back(backup);
- g.Style.Colors[idx] = col;
- }
-
- void PopStyleColor()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- ImGuiColMod& backup = window->DC.ColorModifiers.back();
- g.Style.Colors[backup.Col] = backup.PreviousValue;
- window->DC.ColorModifiers.pop_back();
- }
-
- const char* GetStyleColorName(ImGuiCol idx)
- {
-
- switch (idx)
- {
- case ImGuiCol_Text: return "Text";
- case ImGuiCol_WindowBg: return "WindowBg";
- case ImGuiCol_Border: return "Border";
- case ImGuiCol_BorderShadow: return "BorderShadow";
- case ImGuiCol_FrameBg: return "FrameBg";
- case ImGuiCol_TitleBg: return "TitleBg";
- case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed";
- case ImGuiCol_ScrollbarBg: return "ScrollbarBg";
- case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab";
- case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered";
- case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive";
- case ImGuiCol_ComboBg: return "ComboBg";
- case ImGuiCol_CheckHovered: return "CheckHovered";
- case ImGuiCol_CheckActive: return "CheckActive";
- case ImGuiCol_SliderGrab: return "SliderGrab";
- case ImGuiCol_SliderGrabActive: return "SliderGrabActive";
- case ImGuiCol_Button: return "Button";
- case ImGuiCol_ButtonHovered: return "ButtonHovered";
- case ImGuiCol_ButtonActive: return "ButtonActive";
- case ImGuiCol_Header: return "Header";
- case ImGuiCol_HeaderHovered: return "HeaderHovered";
- case ImGuiCol_HeaderActive: return "HeaderActive";
- case ImGuiCol_Column: return "Column";
- case ImGuiCol_ColumnHovered: return "ColumnHovered";
- case ImGuiCol_ColumnActive: return "ColumnActive";
- case ImGuiCol_ResizeGrip: return "ResizeGrip";
- case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
- case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
- case ImGuiCol_CloseButton: return "CloseButton";
- case ImGuiCol_CloseButtonHovered: return "CloseButtonHovered";
- case ImGuiCol_CloseButtonActive: return "CloseButtonActive";
- case ImGuiCol_PlotLines: return "PlotLines";
- case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered";
- case ImGuiCol_PlotHistogram: return "PlotHistogram";
- case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered";
- case ImGuiCol_TextSelectedBg: return "TextSelectedBg";
- case ImGuiCol_TooltipBg: return "TooltipBg";
- }
- IM_ASSERT(0);
- return "Unknown";
- }
-
- bool GetWindowIsFocused()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- return g.FocusedWindow == window;
- }
-
- float GetWindowWidth()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->Size.x;
- }
-
- ImVec2 GetWindowPos()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->Pos;
- }
-
- void SetWindowPos(const ImVec2& pos)
- {
- ImGuiWindow* window = GetCurrentWindow();
- const ImVec2 old_pos = window->Pos;
- window->PosFloat = pos;
- window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
-
-
- window->DC.CursorPos += (window->Pos - old_pos);
- }
-
- ImVec2 GetWindowSize()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->Size;
- }
-
- ImVec2 GetWindowContentRegionMin()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return ImVec2(0, window->TitleBarHeight()) + window->WindowPadding();
- }
-
- ImVec2 GetWindowContentRegionMax()
- {
- ImGuiWindow* window = GetCurrentWindow();
- ImVec2 m = window->Size - window->WindowPadding();
- if (window->ScrollbarY)
- m.x -= GImGui.Style.ScrollBarWidth;
- return m;
- }
-
- float GetTextLineHeight()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->FontSize();
- }
-
- float GetTextLineSpacing()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- return window->FontSize() + g.Style.ItemSpacing.y;
- }
-
- ImDrawList* GetWindowDrawList()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DrawList;
- }
-
- void SetWindowFontScale(float scale)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->FontWindowScale = scale;
- }
-
- ImVec2 GetCursorPos()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.CursorPos - window->Pos;
- }
-
- void SetCursorPos(const ImVec2& pos)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.CursorPos = window->Pos + pos;
- }
-
- void SetCursorPosX(float x)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.CursorPos.x = window->Pos.x + x;
- }
-
- void SetCursorPosY(float y)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.CursorPos.y = window->Pos.y + y;
- }
-
- ImVec2 GetCursorScreenPos()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.CursorPos;
- }
-
- void SetScrollPosHere()
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->NextScrollY = (window->DC.CursorPos.y + window->ScrollY) - (window->Pos.y + window->SizeFull.y * 0.5f) - (window->TitleBarHeight() + window->WindowPadding().y);
- }
-
- void SetTreeStateStorage(ImGuiStorage* tree)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.StateStorage = tree ? tree : &window->StateStorage;
- }
-
- ImGuiStorage* GetTreeStateStorage()
- {
- ImGuiWindow* window = GetCurrentWindow();
- return window->DC.StateStorage;
- }
-
- void TextV(const char* fmt, va_list args)
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- static char buf[1024];
- const char* text_end = buf + ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
- TextUnformatted(buf, text_end);
- }
-
- void Text(const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- TextV(fmt, args);
- va_end(args);
- }
-
- void TextColoredV(const ImVec4& col, const char* fmt, va_list args)
- {
- ImGui::PushStyleColor(ImGuiCol_Text, col);
- TextV(fmt, args);
- ImGui::PopStyleColor();
- }
-
- void TextColored(const ImVec4& col, const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- TextColoredV(col, fmt, args);
- va_end(args);
- }
-
- void TextUnformatted(const char* text, const char* text_end)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- IM_ASSERT(text != NULL);
- const char* text_begin = text;
- if (text_end == NULL)
- text_end = text + strlen(text);
-
- if (text_end - text > 2000)
- {
-
-
-
- const char* line = text;
- const float line_height = ImGui::GetTextLineHeight();
- const ImVec2 start_pos = window->DC.CursorPos;
- const ImVec4 clip_rect = window->ClipRectStack.back();
- ImVec2 text_size(0,0);
-
- if (start_pos.y <= clip_rect.w)
- {
- ImVec2 pos = start_pos;
-
-
- if (!g.LogEnabled)
- {
- int lines_skippable = (int)((clip_rect.y - start_pos.y) / line_height) - 1;
- if (lines_skippable > 0)
- {
- int lines_skipped = 0;
- while (line < text_end && lines_skipped <= lines_skippable)
- {
- const char* line_end = strchr(line, '\n');
- line = line_end + 1;
- lines_skipped++;
- }
- pos.y += lines_skipped * line_height;
- }
- }
-
-
- if (line < text_end)
- {
- ImGuiAabb line_box(pos, pos + ImVec2(ImGui::GetWindowWidth(), line_height));
- while (line < text_end)
- {
- const char* line_end = strchr(line, '\n');
- if (ImGui::IsClipped(line_box))
- break;
-
- const ImVec2 line_size = CalcTextSize(line, line_end, false);
- text_size.x = ImMax(text_size.x, line_size.x);
- RenderText(pos, line, line_end, false);
- if (!line_end)
- line_end = text_end;
- line = line_end + 1;
- line_box.Min.y += line_height;
- line_box.Max.y += line_height;
- pos.y += line_height;
- }
-
-
- int lines_skipped = 0;
- while (line < text_end)
- {
- const char* line_end = strchr(line, '\n');
- if (!line_end)
- line_end = text_end;
- line = line_end + 1;
- lines_skipped++;
- }
- pos.y += lines_skipped * line_height;
- }
-
- text_size.y += (pos - start_pos).y;
- }
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size);
- ItemSize(bb);
- ClipAdvance(bb);
- }
- else
- {
- const ImVec2 text_size = CalcTextSize(text_begin, text_end, false);
- ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size);
- ItemSize(bb.GetSize(), &bb.Min);
-
- if (ClipAdvance(bb))
- return;
-
-
-
- RenderText(bb.Min, text_begin, text_end, false);
- }
- }
-
- void AlignFirstTextHeightToWidgets()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
-
- ImGui::ItemSize(ImVec2(0, window->FontSize() + g.Style.FramePadding.y*2));
- ImGui::SameLine(0, 0);
- }
-
-
- void LabelTextV(const char* label, const char* fmt, va_list args)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
- const ImGuiStyle& style = g.Style;
- const float w = window->DC.ItemWidth.back();
-
- static char buf[1024];
- const char* text_begin = &buf[0];
- const char* text_end = text_begin + ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
-
- const ImVec2 text_size = CalcTextSize(label);
- const ImGuiAabb value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2, text_size.y));
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2 + style.ItemInnerSpacing.x, 0.0f) + text_size);
- ItemSize(bb);
-
- if (ClipAdvance(value_bb))
- return;
-
-
- RenderText(value_bb.Min, text_begin, text_end);
- RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y), label);
- }
-
- void LabelText(const char* label, const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- LabelTextV(label, fmt, args);
- va_end(args);
- }
-
- static bool ButtonBehaviour(const ImGuiAabb& bb, const ImGuiID& id, bool* out_hovered, bool* out_held, bool allow_key_modifiers, bool repeat)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(bb);
- bool pressed = false;
- if (hovered)
- {
- g.HoveredId = id;
- if (allow_key_modifiers || (!g.IO.KeyCtrl && !g.IO.KeyShift))
- {
- if (g.IO.MouseClicked[0])
- {
- g.ActiveId = id;
- }
- else if (repeat && g.ActiveId && ImGui::IsMouseClicked(0, true))
- {
- pressed = true;
- }
- }
- }
-
- bool held = false;
- if (g.ActiveId == id)
- {
- if (g.IO.MouseDown[0])
- {
- held = true;
- }
- else
- {
- if (hovered)
- pressed = true;
- g.ActiveId = 0;
- }
- }
-
- if (out_hovered) *out_hovered = hovered;
- if (out_held) *out_held = held;
-
- return pressed;
- }
-
- bool Button(const char* label, ImVec2 size, bool repeat_when_held)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
-
- const ImVec2 text_size = CalcTextSize(label);
- if (size.x == 0.0f)
- size.x = text_size.x;
- if (size.y == 0.0f)
- size.y = text_size.y;
-
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos+size + style.FramePadding*2.0f);
- ItemSize(bb);
-
- if (ClipAdvance(bb))
- return false;
-
- bool hovered, held;
- bool pressed = ButtonBehaviour(bb, id, &hovered, &held, true, repeat_when_held);
-
-
- const ImU32 col = window->Color((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
- RenderFrame(bb.Min, bb.Max, col);
-
- if (size.x < text_size.x || size.y < text_size.y)
- PushClipRect(ImVec4(bb.Min.x+style.FramePadding.x, bb.Min.y+style.FramePadding.y, bb.Max.x, bb.Max.y-style.FramePadding.y));
- const ImVec2 off = ImVec2(ImMax(0.0f, size.x - text_size.x) * 0.5f, ImMax(0.0f, size.y - text_size.y) * 0.5f);
- RenderText(bb.Min + style.FramePadding + off, label);
- if (size.x < text_size.x || size.y < text_size.y)
- PopClipRect();
-
- return pressed;
- }
-
-
- bool SmallButton(const char* label)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
-
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos+CalcTextSize(label) + ImVec2(style.FramePadding.x*2,0));
- ItemSize(bb);
-
- if (ClipAdvance(bb))
- return false;
-
- bool hovered, held;
- bool pressed = ButtonBehaviour(bb, id, &hovered, &held, true);
-
-
- const ImU32 col = window->Color((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
- RenderFrame(bb.Min, bb.Max, col);
- RenderText(bb.Min + ImVec2(style.FramePadding.x,0), label);
-
- return pressed;
- }
-
-
- static bool CloseWindowButton(bool* open)
- {
- ImGuiWindow* window = GetCurrentWindow();
-
- const ImGuiID id = window->GetID("##CLOSE");
- const float size = window->TitleBarHeight() - 4.0f;
- const ImGuiAabb bb(window->Aabb().GetTR() + ImVec2(-3.0f-size,2.0f), window->Aabb().GetTR() + ImVec2(-3.0f,2.0f+size));
-
- bool hovered, held;
- bool pressed = ButtonBehaviour(bb, id, &hovered, &held, true);
-
-
- const ImU32 col = window->Color((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton);
- const ImVec2 center = bb.GetCenter();
- window->DrawList->AddCircleFilled(center, ImMax(2.0f,size*0.5f), col, 16);
-
- const float cross_extent = (size * 0.5f * 0.7071f) - 1.0f;
- if (hovered)
- {
- window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), window->Color(ImGuiCol_Text));
- window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), window->Color(ImGuiCol_Text));
- }
-
- if (open != NULL && pressed)
- *open = !*open;
-
- return pressed;
- }
-
-
- void LogToTTY(int max_depth)
- {
- ImGuiState& g = GImGui;
- if (g.LogEnabled)
- return;
- g.LogEnabled = true;
- g.LogFile = stdout;
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
- }
-
-
- void LogToFile(int max_depth, const char* filename)
- {
- ImGuiState& g = GImGui;
- if (g.LogEnabled)
- return;
- if (!filename)
- filename = g.IO.LogFilename;
- g.LogEnabled = true;
- g.LogFile = fopen(filename, "at");
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
- }
-
-
- void LogToClipboard(int max_depth)
- {
- ImGuiState& g = GImGui;
- if (g.LogEnabled)
- return;
- g.LogEnabled = true;
- g.LogFile = NULL;
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
- }
-
-
- void LogButtons()
- {
- ImGuiState& g = GImGui;
-
- ImGui::PushID("LogButtons");
- const bool log_to_tty = ImGui::Button("Log To TTY");
- ImGui::SameLine();
- const bool log_to_file = ImGui::Button("Log To File");
- ImGui::SameLine();
- const bool log_to_clipboard = ImGui::Button("Log To Clipboard");
- ImGui::SameLine();
-
- ImGui::PushItemWidth(80.0f);
- ImGui::PushAllowKeyboardFocus(false);
- ImGui::SliderInt("Depth", &g.LogAutoExpandMaxDepth, 0, 9, NULL);
- ImGui::PopAllowKeyboardFocus();
- ImGui::PopItemWidth();
- ImGui::PopID();
-
-
- if (log_to_tty)
- LogToTTY(g.LogAutoExpandMaxDepth);
- if (log_to_file)
- LogToFile(g.LogAutoExpandMaxDepth, g.IO.LogFilename);
- if (log_to_clipboard)
- LogToClipboard(g.LogAutoExpandMaxDepth);
- }
-
- bool CollapsingHeader(const char* label, const char* str_id, const bool display_frame, const bool default_open)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
-
- IM_ASSERT(str_id != NULL || label != NULL);
- if (str_id == NULL)
- str_id = label;
- if (label == NULL)
- label = str_id;
- const ImGuiID id = window->GetID(str_id);
-
-
- ImGuiStorage* tree = window->DC.StateStorage;
- bool opened;
- if (window->DC.OpenNextNode != -1)
- {
- opened = window->DC.OpenNextNode > 0;
- tree->SetInt(id, opened);
- window->DC.OpenNextNode = -1;
- }
- else
- {
- opened = tree->GetInt(id, default_open) != 0;
- }
-
-
- const ImVec2 window_padding = window->WindowPadding();
- const ImVec2 text_size = CalcTextSize(label);
- const ImVec2 pos_min = window->DC.CursorPos;
- const ImVec2 pos_max = window->Pos + GetWindowContentRegionMax();
- ImGuiAabb bb = ImGuiAabb(pos_min, ImVec2(pos_max.x, pos_min.y + text_size.y));
- if (display_frame)
- {
- bb.Min.x -= window_padding.x*0.5f - 1;
- bb.Max.x += window_padding.x*0.5f - 1;
- bb.Max.y += style.FramePadding.y * 2;
- }
-
- const ImGuiAabb text_bb(bb.Min, bb.Min + ImVec2(window->FontSize() + style.FramePadding.x*2*2,0) + text_size);
- ItemSize(ImVec2(text_bb.GetSize().x, bb.GetSize().y));
-
-
-
- if (!display_frame)
- if (g.LogEnabled && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)
- opened = true;
-
- if (ClipAdvance(bb))
- return opened;
-
- bool hovered, held;
- bool pressed = ButtonBehaviour(display_frame ? bb : text_bb, id, &hovered, &held, false);
- if (pressed)
- {
- opened = !opened;
- tree->SetInt(id, opened);
- }
-
-
- const ImU32 col = window->Color((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- if (display_frame)
- {
-
- RenderFrame(bb.Min, bb.Max, col, true);
- RenderCollapseTriangle(bb.Min + style.FramePadding, opened, 1.0f, true);
- RenderText(bb.Min + style.FramePadding + ImVec2(window->FontSize() + style.FramePadding.x*2,0), label);
- }
- else
- {
-
- if ((held && hovered) || hovered)
- RenderFrame(bb.Min, bb.Max, col, false);
- RenderCollapseTriangle(bb.Min + ImVec2(style.FramePadding.x, window->FontSize()*0.15f), opened, 0.70f, false);
- RenderText(bb.Min + ImVec2(window->FontSize() + style.FramePadding.x*2,0), label);
- }
-
- return opened;
- }
-
-
- void BulletTextV(const char* fmt, va_list args)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- static char buf[1024];
- const char* text_begin = buf;
- const char* text_end = text_begin + ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
-
- const float line_height = window->FontSize();
- const ImVec2 text_size = CalcTextSize(text_begin, text_end);
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(line_height + (text_size.x > 0.0f ? (g.Style.FramePadding.x*2) : 0.0f),0) + text_size);
- ItemSize(bb);
-
- if (ClipAdvance(bb))
- return;
-
-
- const float bullet_size = line_height*0.15f;
- window->DrawList->AddCircleFilled(bb.Min + ImVec2(g.Style.FramePadding.x + line_height*0.5f, line_height*0.5f), bullet_size, window->Color(ImGuiCol_Text));
- RenderText(bb.Min+ImVec2(window->FontSize()+g.Style.FramePadding.x*2,0), text_begin, text_end);
- }
-
- void BulletText(const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- BulletTextV(fmt, args);
- va_end(args);
- }
-
-
- bool TreeNodeV(const char* str_id, const char* fmt, va_list args)
- {
- static char buf[1024];
- ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
-
- if (!str_id || !str_id[0])
- str_id = fmt;
-
- ImGui::PushID(str_id);
- const bool opened = ImGui::CollapsingHeader(buf, "", false);
- ImGui::PopID();
-
- if (opened)
- ImGui::TreePush(str_id);
-
- return opened;
- }
-
- bool TreeNode(const char* str_id, const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- bool s = TreeNodeV(str_id, fmt, args);
- va_end(args);
- return s;
- }
-
-
- bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args)
- {
- static char buf[1024];
- ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
-
- if (!ptr_id)
- ptr_id = fmt;
-
- ImGui::PushID(ptr_id);
- const bool opened = ImGui::CollapsingHeader(buf, "", false);
- ImGui::PopID();
-
- if (opened)
- ImGui::TreePush(ptr_id);
-
- return opened;
- }
-
- bool TreeNode(const void* ptr_id, const char* fmt, ...)
- {
- va_list args;
- va_start(args, fmt);
- bool s = TreeNodeV(ptr_id, fmt, args);
- va_end(args);
- return s;
- }
-
- bool TreeNode(const char* str_label_id)
- {
- return TreeNode(str_label_id, "%s", str_label_id);
- }
-
- void OpenNextNode(bool open)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.OpenNextNode = open ? 1 : 0;
- }
-
- void PushID(const char* str_id)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->IDStack.push_back(window->GetID(str_id));
- }
-
- void PushID(const void* ptr_id)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->IDStack.push_back(window->GetID(ptr_id));
- }
-
- void PushID(const int int_id)
- {
- const void* ptr_id = (void*)(intptr_t)int_id;
- ImGuiWindow* window = GetCurrentWindow();
- window->IDStack.push_back(window->GetID(ptr_id));
- }
-
- void PopID()
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->IDStack.pop_back();
- }
-
-
-
- static void ApplyNumericalTextInput(const char* buf, float *v)
- {
- while (*buf == ' ' || *buf == '\t')
- buf++;
-
-
-
- char op = buf[0];
- if (op == '+' || op == '*' || op == '/')
- {
- buf++;
- while (*buf == ' ' || *buf == '\t')
- buf++;
- }
- else
- {
- op = 0;
- }
- if (!buf[0])
- return;
-
- float ref_v = *v;
- if (op)
- if (sscanf(GImGui.InputTextState.InitialText, "%f", &ref_v) < 1)
- return;
-
- float op_v = 0.0f;
- if (sscanf(buf, "%f", &op_v) < 1)
- return;
-
- if (op == '+')
- *v = ref_v + op_v;
- else if (op == '*')
- *v = ref_v * op_v;
- else if (op == '/')
- {
- if (op_v == 0.0f)
- return;
- *v = ref_v / op_v;
- }
- else
- *v = op_v;
- }
-
-
-
- bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format, float power)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
- const float w = window->DC.ItemWidth.back();
-
- if (!display_format)
- display_format = "%.3f";
-
-
- int decimal_precision = 3;
- if (const char* p = strchr(display_format, '%'))
- {
- p++;
- while (*p >= '0' && *p <= '9')
- p++;
- if (*p == '.')
- {
- decimal_precision = atoi(p+1);
- if (decimal_precision < 0 || decimal_precision > 10)
- decimal_precision = 3;
- }
- }
-
- const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id);
-
- const ImVec2 text_size = CalcTextSize(label);
- const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f);
- const ImGuiAabb slider_bb(frame_bb.Min+g.Style.FramePadding, frame_bb.Max-g.Style.FramePadding);
- const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x, 0.0f));
-
- if (IsClipped(slider_bb))
- {
-
- ItemSize(bb);
- return false;
- }
-
- const bool is_unbound = v_min == -FLT_MAX || v_min == FLT_MAX || v_max == -FLT_MAX || v_max == FLT_MAX;
-
- const float grab_size_in_units = 1.0f;
- float grab_size_in_pixels;
- if (decimal_precision > 0 || is_unbound)
- grab_size_in_pixels = 10.0f;
- else
- grab_size_in_pixels = ImMax(grab_size_in_units * (w / (v_max-v_min+1.0f)), 8.0f);
- const float slider_effective_w = slider_bb.GetWidth() - grab_size_in_pixels;
- const float slider_effective_x1 = slider_bb.Min.x + grab_size_in_pixels*0.5f;
- const float slider_effective_x2 = slider_bb.Max.x - grab_size_in_pixels*0.5f;
-
-
- float linear_zero_pos = 0.0f;
- if (!is_unbound)
- {
- if (v_min * v_max < 0.0f)
- {
-
- const float linear_dist_min_to_0 = powf(fabsf(0.0f - v_min), 1.0f/power);
- const float linear_dist_max_to_0 = powf(fabsf(v_max - 0.0f), 1.0f/power);
- linear_zero_pos = linear_dist_min_to_0 / (linear_dist_min_to_0+linear_dist_max_to_0);
- }
- else
- {
-
- linear_zero_pos = v_min < 0.0f ? 1.0f : 0.0f;
- }
- }
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(slider_bb);
- if (hovered)
- g.HoveredId = id;
-
- bool start_text_input = false;
- if (tab_focus_requested || (hovered && g.IO.MouseClicked[0]))
- {
- g.ActiveId = id;
-
- const bool is_ctrl_down = g.IO.KeyCtrl;
- if (tab_focus_requested || is_ctrl_down || is_unbound)
- {
- start_text_input = true;
- g.SliderAsInputTextId = 0;
- }
- }
-
-
- bool value_changed = false;
- if (start_text_input || (g.ActiveId == id && id == g.SliderAsInputTextId))
- {
- char text_buf[64];
- ImFormatString(text_buf, IM_ARRAYSIZE(text_buf), "%.*f", decimal_precision, *v);
-
- g.ActiveId = g.SliderAsInputTextId;
- g.HoveredId = 0;
- window->FocusItemUnregister();
- value_changed = ImGui::InputText(label, text_buf, IM_ARRAYSIZE(text_buf), ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll);
- if (g.SliderAsInputTextId == 0)
- {
-
- IM_ASSERT(g.ActiveId == id);
- g.SliderAsInputTextId = g.ActiveId;
- g.ActiveId = id;
- g.HoveredId = id;
- }
- else
- {
- if (g.ActiveId == g.SliderAsInputTextId)
- g.ActiveId = id;
- else
- g.ActiveId = g.SliderAsInputTextId = 0;
- }
- if (value_changed)
- {
- ApplyNumericalTextInput(text_buf, v);
- }
- return value_changed;
- }
-
- ItemSize(bb);
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg));
-
- if (g.ActiveId == id)
- {
- if (g.IO.MouseDown[0])
- {
- if (!is_unbound)
- {
- const float normalized_pos = ImClamp((g.IO.MousePos.x - slider_effective_x1) / slider_effective_w, 0.0f, 1.0f);
-
-
-
-
-
- float new_value;
- if (normalized_pos < linear_zero_pos)
- {
-
- float a = 1.0f - (normalized_pos / linear_zero_pos);
- a = powf(a, power);
- new_value = ImLerp(ImMin(v_max,0.f), v_min, a);
- }
- else
- {
-
- float a;
- if (fabsf(linear_zero_pos - 1.0f) > 1.e-6)
- a = (normalized_pos - linear_zero_pos) / (1.0f - linear_zero_pos);
- else
- a = normalized_pos;
- a = powf(a, power);
- new_value = ImLerp(ImMax(v_min,0.0f), v_max, a);
- }
-
-
-
-
-
-
-
- const float min_step = 1.0f / powf(10.0f, (float)decimal_precision);
- const float remainder = fmodf(new_value, min_step);
- if (remainder <= min_step*0.5f)
- new_value -= remainder;
- else
- new_value += (min_step - remainder);
-
- if (*v != new_value)
- {
- *v = new_value;
- value_changed = true;
- }
- }
- }
- else
- {
- g.ActiveId = 0;
- }
- }
-
- if (!is_unbound)
- {
-
-
-
-
- float grab_t;
- float v_clamped = ImClamp(*v, v_min, v_max);
- if (v_clamped < 0.0f)
- {
- const float f = 1.0f - (v_clamped - v_min) / (ImMin(0.0f,v_max) - v_min);
- grab_t = (1.0f - powf(f, 1.0f/power)) * linear_zero_pos;
- }
- else
- {
- const float f = (v_clamped - ImMax(0.0f,v_min)) / (v_max - ImMax(0.0f,v_min));
- grab_t = linear_zero_pos + powf(f, 1.0f/power) * (1.0f - linear_zero_pos);
- }
-
-
- const float grab_x = ImLerp(slider_effective_x1, slider_effective_x2, grab_t);
- const ImGuiAabb grab_bb(ImVec2(grab_x-grab_size_in_pixels*0.5f,frame_bb.Min.y+2.0f), ImVec2(grab_x+grab_size_in_pixels*0.5f,frame_bb.Max.y-2.0f));
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, window->Color(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab));
- }
-
-
- char value_buf[64];
- ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);
- RenderText(ImVec2(slider_bb.GetCenter().x-CalcTextSize(value_buf).x*0.5f, frame_bb.Min.y + style.FramePadding.y), value_buf);
-
- RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, slider_bb.Min.y), label);
-
- return value_changed;
- }
-
- bool SliderAngle(const char* label, float* v, float v_degrees_min, float v_degrees_max)
- {
- float v_deg = *v * 360.0f / (2*PI);
- bool changed = ImGui::SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, "%.0f deg", 1.0f);
- *v = v_deg * (2*PI) / 360.0f;
- return changed;
- }
-
- bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format)
- {
- if (!display_format)
- display_format = "%.0f";
- float v_f = (float)*v;
- bool changed = ImGui::SliderFloat(label, &v_f, (float)v_min, (float)v_max, display_format, 1.0f);
- *v = (int)v_f;
- return changed;
- }
-
- static bool SliderFloatN(const char* label, float v[3], int components, float v_min, float v_max, const char* display_format, float power)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const float w_full = window->DC.ItemWidth.back();
- const float w_item_one = ImMax(1.0f, (float)(int)((w_full - (style.FramePadding.x*2.0f+style.ItemInnerSpacing.x)*(components-1)) / (float)components));
- const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one+style.FramePadding.x*2.0f+style.ItemInnerSpacing.x)*(components-1)));
-
- bool value_changed = false;
- ImGui::PushID(label);
- ImGui::PushItemWidth(w_item_one);
- for (int i = 0; i < components; i++)
- {
- ImGui::PushID(i);
- if (i + 1 == components)
- {
- ImGui::PopItemWidth();
- ImGui::PushItemWidth(w_item_last);
- }
- value_changed |= ImGui::SliderFloat("##v", &v[i], v_min, v_max, display_format, power);
- ImGui::SameLine(0, 0);
- ImGui::PopID();
- }
- ImGui::PopItemWidth();
- ImGui::PopID();
-
- ImGui::TextUnformatted(label, FindTextDisplayEnd(label));
-
- return value_changed;
- }
-
- bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format, float power)
- {
- return SliderFloatN(label, v, 2, v_min, v_max, display_format, power);
- }
-
- bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format, float power)
- {
- return SliderFloatN(label, v, 3, v_min, v_max, display_format, power);
- }
-
- bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format, float power)
- {
- return SliderFloatN(label, v, 4, v_min, v_max, display_format, power);
- }
-
-
- enum ImGuiPlotType
- {
- ImGuiPlotType_Lines,
- ImGuiPlotType_Histogram,
- };
-
- static float PlotGetValue(const float* values, size_t stride, int idx)
- {
- const float v = *(float*)((unsigned char*)values + (size_t)idx * stride);
- return v;
- }
-
- static void Plot(ImGuiPlotType plot_type, const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, size_t stride)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- const ImGuiStyle& style = g.Style;
-
- const ImVec2 text_size = CalcTextSize(label);
- if (graph_size.x == 0)
- graph_size.x = window->DC.ItemWidth.back();
- if (graph_size.y == 0)
- graph_size.y = text_size.y;
-
- const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(graph_size.x, graph_size.y) + style.FramePadding*2.0f);
- const ImGuiAabb graph_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
- const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x,0));
- ItemSize(bb);
-
- if (ClipAdvance(bb))
- return;
-
-
- if (scale_min == FLT_MAX || scale_max == FLT_MAX)
- {
- float v_min = FLT_MAX;
- float v_max = -FLT_MAX;
- for (int i = 0; i < values_count; i++)
- {
- const float v = PlotGetValue(values, stride, i);
- v_min = ImMin(v_min, v);
- v_max = ImMax(v_max, v);
- }
- if (scale_min == FLT_MAX)
- scale_min = v_min;
- if (scale_max == FLT_MAX)
- scale_max = v_max;
- }
-
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg));
-
- int res_w = ImMin((int)graph_size.x, values_count);
- if (plot_type == ImGuiPlotType_Lines)
- res_w -= 1;
-
-
- int v_hovered = -1;
- if (IsMouseHoveringBox(graph_bb))
- {
- const float t = ImClamp((g.IO.MousePos.x - graph_bb.Min.x) / (graph_bb.Max.x - graph_bb.Min.x), 0.0f, 0.9999f);
- const int v_idx = (int)(t * (values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0)));
- IM_ASSERT(v_idx >= 0 && v_idx < values_count);
-
- const float v0 = PlotGetValue(values, stride, (v_idx + values_offset) % values_count);
- const float v1 = PlotGetValue(values, stride, (v_idx + 1 + values_offset) % values_count);
- if (plot_type == ImGuiPlotType_Lines)
- ImGui::SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx+1, v1);
- else if (plot_type == ImGuiPlotType_Histogram)
- ImGui::SetTooltip("%d: %8.4g", v_idx, v0);
- v_hovered = v_idx;
- }
-
- const float t_step = 1.0f / (float)res_w;
-
- float v0 = PlotGetValue(values, stride, (0 + values_offset) % values_count);
- float t0 = 0.0f;
- ImVec2 p0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) / (scale_max - scale_min)) );
-
- const ImU32 col_base = window->Color((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram);
- const ImU32 col_hovered = window->Color((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered);
-
- for (int n = 0; n < res_w; n++)
- {
- const float t1 = t0 + t_step;
- const int v_idx = (int)(t0 * values_count);
- IM_ASSERT(v_idx >= 0 && v_idx < values_count);
- const float v1 = PlotGetValue(values, stride, (v_idx + values_offset + 1) % values_count);
- const ImVec2 p1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) / (scale_max - scale_min)) );
-
-
- if (plot_type == ImGuiPlotType_Lines)
- window->DrawList->AddLine(ImLerp(graph_bb.Min, graph_bb.Max, p0), ImLerp(graph_bb.Min, graph_bb.Max, p1), v_hovered == v_idx ? col_hovered : col_base);
- else if (plot_type == ImGuiPlotType_Histogram)
- window->DrawList->AddRectFilled(ImLerp(graph_bb.Min, graph_bb.Max, p0), ImLerp(graph_bb.Min, graph_bb.Max, ImVec2(p1.x, 1.0f))+ImVec2(-1,0), v_hovered == v_idx ? col_hovered : col_base);
-
- t0 = t1;
- p0 = p1;
- }
-
-
- if (overlay_text)
- RenderText(ImVec2(graph_bb.GetCenter().x-CalcTextSize(overlay_text).x*0.5f, frame_bb.Min.y + style.FramePadding.y), overlay_text);
-
- RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, graph_bb.Min.y), label);
- }
-
- void PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, size_t stride)
- {
- ImGui::Plot(ImGuiPlotType_Lines, label, values, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size, stride);
- }
-
- void PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, size_t stride)
- {
- ImGui::Plot(ImGuiPlotType_Histogram, label, values, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size, stride);
- }
-
- bool Checkbox(const char* label, bool* v)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
-
- const ImVec2 text_size = CalcTextSize(label);
-
- const ImGuiAabb check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(text_size.y + style.FramePadding.y*2, text_size.y + style.FramePadding.y*2));
- ItemSize(check_bb);
- SameLine(0, (int)g.Style.ItemInnerSpacing.x);
-
- const ImGuiAabb text_bb(window->DC.CursorPos + ImVec2(0,style.FramePadding.y), window->DC.CursorPos + ImVec2(0,style.FramePadding.y) + text_size);
- ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()));
- const ImGuiAabb total_bb(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));
-
- if (ClipAdvance(total_bb))
- return false;
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(total_bb);
- const bool pressed = hovered && g.IO.MouseClicked[0];
- if (hovered)
- g.HoveredId = id;
- if (pressed)
- {
- *v = !(*v);
- g.ActiveId = 0;
- }
-
- RenderFrame(check_bb.Min, check_bb.Max, window->Color(hovered ? ImGuiCol_CheckHovered : ImGuiCol_FrameBg));
- if (*v)
- {
- window->DrawList->AddRectFilled(check_bb.Min+ImVec2(3,3), check_bb.Max-ImVec2(3,3), window->Color(ImGuiCol_CheckActive));
- }
-
- if (g.LogEnabled)
- LogText(text_bb.GetTL(), *v ? "[x]" : "[ ]");
- RenderText(text_bb.GetTL(), label);
-
- return pressed;
- }
-
- bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value)
- {
- bool v = (*flags & flags_value) ? true : false;
- bool pressed = ImGui::Checkbox(label, &v);
- if (v)
- *flags |= flags_value;
- else
- *flags &= ~flags_value;
- return pressed;
- }
-
- bool RadioButton(const char* label, bool active)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
-
- const ImVec2 text_size = CalcTextSize(label);
-
- const ImGuiAabb check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(text_size.y + style.FramePadding.y*2-1, text_size.y + style.FramePadding.y*2-1));
- ItemSize(check_bb);
- SameLine(0, (int)style.ItemInnerSpacing.x);
-
- const ImGuiAabb text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + text_size);
- ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()));
- const ImGuiAabb total_bb(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));
-
- if (ClipAdvance(total_bb))
- return false;
-
- ImVec2 center = check_bb.GetCenter();
- center.x = (float)(int)center.x + 0.5f;
- center.y = (float)(int)center.y + 0.5f;
- const float radius = check_bb.GetHeight() * 0.5f;
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(total_bb);
- const bool pressed = hovered && g.IO.MouseClicked[0];
- if (hovered)
- g.HoveredId = id;
-
- window->DrawList->AddCircleFilled(center, radius, window->Color(hovered ? ImGuiCol_CheckHovered : ImGuiCol_FrameBg), 16);
- if (active)
- window->DrawList->AddCircleFilled(center, radius-3.0f, window->Color(ImGuiCol_CheckActive), 16);
-
- if (window->Flags & ImGuiWindowFlags_ShowBorders)
- {
- window->DrawList->AddCircle(center+ImVec2(1,1), radius, window->Color(ImGuiCol_BorderShadow), 16);
- window->DrawList->AddCircle(center, radius, window->Color(ImGuiCol_Border), 16);
- }
-
- if (g.LogEnabled)
- LogText(text_bb.GetTL(), active ? "(x)" : "( )");
- RenderText(text_bb.GetTL(), label);
-
- return pressed;
- }
-
- bool RadioButton(const char* label, int* v, int v_button)
- {
- const bool pressed = ImGui::RadioButton(label, *v == v_button);
- if (pressed)
- {
- *v = v_button;
- }
- return pressed;
- }
-
- };
-
-
- int STB_TEXTEDIT_STRINGLEN(const STB_TEXTEDIT_STRING* obj) { return (int)ImStrlenW(obj->Text); }
- ImWchar STB_TEXTEDIT_GETCHAR(const STB_TEXTEDIT_STRING* obj, int idx) { return obj->Text[idx]; }
- float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { (void)line_start_idx; return obj->Font->CalcTextSizeW(obj->FontSize, 0, &obj->Text[char_idx], &obj->Text[char_idx]+1, NULL).x; }
- int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x10000 ? 0 : key; }
- ImWchar STB_TEXTEDIT_NEWLINE = '\n';
- void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx)
- {
- const ImWchar* text_remaining = NULL;
- const ImVec2 size = obj->Font->CalcTextSizeW(obj->FontSize, FLT_MAX, obj->Text + line_start_idx, NULL, &text_remaining);
- r->x0 = 0.0f;
- r->x1 = size.x;
- r->baseline_y_delta = size.y;
- r->ymin = 0.0f;
- r->ymax = size.y;
- r->num_chars = (int)(text_remaining - (obj->Text + line_start_idx));
- }
-
- static bool is_white(unsigned int c) { return c==0 || c==' ' || c=='\t' || c=='\r' || c=='\n'; }
- static bool is_separator(unsigned int c) { return c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|'; }
-
- #define STB_TEXTEDIT_IS_SPACE(c) (is_white((unsigned int)c) || is_separator((unsigned int)c))
- void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int idx, int n) { ImWchar* dst = obj->Text+idx; const ImWchar* src = obj->Text+idx+n; while (ImWchar c = *src++) *dst++ = c; *dst = '\0'; }
-
- bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int idx, const ImWchar* new_text, int new_text_len)
- {
- ImWchar* buf_end = obj->Text + obj->BufSize;
- const size_t text_len = ImStrlenW(obj->Text);
-
- if (new_text_len > buf_end - (obj->Text + text_len + 1))
- return false;
-
- memmove(obj->Text + (size_t)idx + new_text_len, obj->Text + (size_t)idx, (text_len - (size_t)idx) * sizeof(ImWchar));
- memcpy(obj->Text + (size_t)idx, new_text, (size_t)new_text_len * sizeof(ImWchar));
- obj->Text[text_len + (size_t)new_text_len] = 0;
-
- return true;
- }
-
- enum
- {
- STB_TEXTEDIT_K_LEFT = 1 << 16,
- STB_TEXTEDIT_K_RIGHT,
- STB_TEXTEDIT_K_UP,
- STB_TEXTEDIT_K_DOWN,
- STB_TEXTEDIT_K_LINESTART,
- STB_TEXTEDIT_K_LINEEND,
- STB_TEXTEDIT_K_TEXTSTART,
- STB_TEXTEDIT_K_TEXTEND,
- STB_TEXTEDIT_K_DELETE,
- STB_TEXTEDIT_K_BACKSPACE,
- STB_TEXTEDIT_K_UNDO,
- STB_TEXTEDIT_K_REDO,
- STB_TEXTEDIT_K_WORDLEFT,
- STB_TEXTEDIT_K_WORDRIGHT,
- STB_TEXTEDIT_K_SHIFT = 1 << 17,
- };
-
- #define STB_TEXTEDIT_IMPLEMENTATION
- #include "stb_textedit.h"
-
- void ImGuiTextEditState::OnKeyboardPressed(int key)
- {
- stb_textedit_key(this, &StbState, key);
- CursorAnimReset();
- }
-
- void ImGuiTextEditState::UpdateScrollOffset()
- {
-
- const float scroll_x_increment = Width * 0.25f;
- const float cursor_offset_x = Font->CalcTextSizeW(FontSize, 0, Text, Text+StbState.cursor, NULL).x;
- if (ScrollX > cursor_offset_x)
- ScrollX = ImMax(0.0f, cursor_offset_x - scroll_x_increment);
- else if (ScrollX < cursor_offset_x - Width)
- ScrollX = cursor_offset_x - Width + scroll_x_increment;
- }
-
- ImVec2 ImGuiTextEditState::CalcDisplayOffsetFromCharIdx(int i) const
- {
- const ImWchar* text_start = GetTextPointerClippedW(Font, FontSize, Text, ScrollX, NULL);
- const ImWchar* text_end = (Text+i >= text_start) ? Text+i : text_start;
- IM_ASSERT(text_end >= text_start);
-
- const ImVec2 offset = Font->CalcTextSizeW(FontSize, Width, text_start, text_end, NULL);
- return offset;
- }
-
-
- const char* ImGuiTextEditState::GetTextPointerClippedA(ImFont font, float font_size, const char* text, float width, ImVec2* out_text_size)
- {
- if (width <= 0.0f)
- return text;
-
- const char* text_clipped_end = NULL;
- const ImVec2 text_size = font->CalcTextSizeA(font_size, width, text, NULL, &text_clipped_end);
- if (out_text_size)
- *out_text_size = text_size;
- return text_clipped_end;
- }
-
-
- const ImWchar* ImGuiTextEditState::GetTextPointerClippedW(ImFont font, float font_size, const ImWchar* text, float width, ImVec2* out_text_size)
- {
- if (width <= 0.0f)
- return text;
-
- const ImWchar* text_clipped_end = NULL;
- const ImVec2 text_size = font->CalcTextSizeW(font_size, width, text, NULL, &text_clipped_end);
- if (out_text_size)
- *out_text_size = text_size;
- return text_clipped_end;
- }
-
-
- void ImGuiTextEditState::RenderTextScrolledClipped(ImFont font, float font_size, const char* buf, ImVec2 pos, float width, float scroll_x)
- {
-
- ImVec2 text_size;
- const char* text_start = GetTextPointerClippedA(font, font_size, buf, scroll_x, NULL);
- const char* text_end = GetTextPointerClippedA(font, font_size, text_start, width, &text_size);
-
-
- const char symbol_c = '~';
- const float symbol_w = font_size*0.40f;
- const float clip_begin = (text_start > buf && text_start < text_end) ? symbol_w : 0.0f;
- const float clip_end = (text_end[0] != '\0' && text_end > text_start) ? symbol_w : 0.0f;
-
-
- ImGui::RenderText(pos+ImVec2(clip_begin,0), text_start+(clip_begin>0.0f?1:0), text_end-(clip_end>0.0f?1:0), false);
-
-
- const char s[2] = {symbol_c,'\0'};
- if (clip_begin > 0.0f)
- ImGui::RenderText(pos, s);
- if (clip_end > 0.0f)
- ImGui::RenderText(pos+ImVec2(width-clip_end,0.0f), s);
- }
-
- namespace ImGui
- {
-
- bool InputFloat(const char* label, float *v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const float w = window->DC.ItemWidth.back();
- const ImVec2 text_size = CalcTextSize(label);
- const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f);
-
- ImGui::PushID(label);
- const float button_sz = window->FontSize();
- if (step > 0.0f)
- ImGui::PushItemWidth(ImMax(1.0f, window->DC.ItemWidth.back() - (button_sz+g.Style.FramePadding.x*2.0f+g.Style.ItemInnerSpacing.x)*2));
-
- char buf[64];
- if (decimal_precision < 0)
- ImFormatString(buf, IM_ARRAYSIZE(buf), "%f", *v);
- else
- ImFormatString(buf, IM_ARRAYSIZE(buf), "%.*f", decimal_precision, *v);
- bool value_changed = false;
- const ImGuiInputTextFlags flags = extra_flags | (ImGuiInputTextFlags_CharsDecimal|ImGuiInputTextFlags_AutoSelectAll);
- if (ImGui::InputText("", buf, IM_ARRAYSIZE(buf), flags))
- {
- ApplyNumericalTextInput(buf, v);
- value_changed = true;
- }
-
-
- if (step > 0.0f)
- {
- ImGui::PopItemWidth();
- ImGui::SameLine(0, 0);
- if (ImGui::Button("-", ImVec2(button_sz,button_sz), true))
- {
- *v -= g.IO.KeyCtrl && step_fast > 0.0f ? step_fast : step;
- value_changed = true;
- }
- ImGui::SameLine(0, (int)g.Style.ItemInnerSpacing.x);
- if (ImGui::Button("+", ImVec2(button_sz,button_sz), true))
- {
- *v += g.IO.KeyCtrl && step_fast > 0.0f ? step_fast : step;
- value_changed = true;
- }
- }
-
- ImGui::PopID();
-
- RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + g.Style.FramePadding.y), label);
-
-
-
-
- return value_changed;
- }
-
- bool InputInt(const char* label, int *v, int step, int step_fast, ImGuiInputTextFlags extra_flags)
- {
- float f = (float)*v;
- const bool value_changed = ImGui::InputFloat(label, &f, (float)step, (float)step_fast, 0, extra_flags);
- *v = (int)f;
- return value_changed;
- }
-
- bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiIO& io = g.IO;
- const ImGuiStyle& style = g.Style;
-
- const ImGuiID id = window->GetID(label);
- const float w = window->DC.ItemWidth.back();
-
- const ImVec2 text_size = CalcTextSize(label);
- const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f);
- const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x, 0.0f));
- ItemSize(bb);
-
- if (ClipAdvance(frame_bb))
- return false;
-
-
- ImGuiTextEditState& edit_state = g.InputTextState;
-
- const bool is_ctrl_down = io.KeyCtrl;
- const bool is_shift_down = io.KeyShift;
- const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id);
-
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(frame_bb);
- if (hovered)
- g.HoveredId = id;
-
- bool select_all = (g.ActiveId != id) && (flags & ImGuiInputTextFlags_AutoSelectAll) != 0;
- if (tab_focus_requested || (hovered && io.MouseClicked[0]))
- {
- if (g.ActiveId != id)
- {
-
-
- ImFormatString(edit_state.InitialText, IM_ARRAYSIZE(edit_state.InitialText), "%s", buf);
- ImTextStrFromUtf8(edit_state.Text, IM_ARRAYSIZE(edit_state.Text), buf, NULL);
- edit_state.ScrollX = 0.0f;
- edit_state.Width = w;
- stb_textedit_initialize_state(&edit_state.StbState, true);
- edit_state.CursorAnimReset();
- edit_state.LastCursorPos = ImVec2(-1.f,-1.f);
-
- if (tab_focus_requested || is_ctrl_down)
- select_all = true;
- }
- g.ActiveId = id;
- }
- else if (io.MouseClicked[0])
- {
-
- if (g.ActiveId == id)
- {
- g.ActiveId = 0;
- }
- }
-
- bool value_changed = false;
- bool cancel_edit = false;
- bool enter_pressed = false;
- static char text_tmp_utf8[IM_ARRAYSIZE(edit_state.InitialText)];
- if (g.ActiveId == id)
- {
-
- edit_state.BufSize = buf_size < IM_ARRAYSIZE(edit_state.Text) ? buf_size : IM_ARRAYSIZE(edit_state.Text);
- edit_state.Font = window->Font();
- edit_state.FontSize = window->FontSize();
-
- const float mx = g.IO.MousePos.x - frame_bb.Min.x - style.FramePadding.x;
- const float my = window->FontSize()*0.5f;
-
- edit_state.UpdateScrollOffset();
- if (select_all || (hovered && io.MouseDoubleClicked[0]))
- {
- edit_state.SelectAll();
- edit_state.SelectedAllMouseLock = true;
- }
- else if (io.MouseClicked[0] && !edit_state.SelectedAllMouseLock)
- {
- stb_textedit_click(&edit_state, &edit_state.StbState, mx + edit_state.ScrollX, my);
- edit_state.CursorAnimReset();
-
- }
- else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock)
- {
- stb_textedit_drag(&edit_state, &edit_state.StbState, mx + edit_state.ScrollX, my);
- edit_state.CursorAnimReset();
- }
- if (edit_state.SelectedAllMouseLock && !io.MouseDown[0])
- edit_state.SelectedAllMouseLock = false;
-
- const int k_mask = (is_shift_down ? STB_TEXTEDIT_K_SHIFT : 0);
- if (IsKeyPressedMap(ImGuiKey_LeftArrow)) edit_state.OnKeyboardPressed(is_ctrl_down ? STB_TEXTEDIT_K_WORDLEFT | k_mask : STB_TEXTEDIT_K_LEFT | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_RightArrow)) edit_state.OnKeyboardPressed(is_ctrl_down ? STB_TEXTEDIT_K_WORDRIGHT | k_mask : STB_TEXTEDIT_K_RIGHT | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_UpArrow)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_UP | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_DownArrow)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_DOWN | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_Home)) edit_state.OnKeyboardPressed(is_ctrl_down ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_End)) edit_state.OnKeyboardPressed(is_ctrl_down ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_Delete)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_DELETE | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_Backspace)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask);
- else if (IsKeyPressedMap(ImGuiKey_Enter)) { g.ActiveId = 0; enter_pressed = true; }
- else if (IsKeyPressedMap(ImGuiKey_Escape)) { g.ActiveId = 0; cancel_edit = true; }
- else if (is_ctrl_down && IsKeyPressedMap(ImGuiKey_Z)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_UNDO);
- else if (is_ctrl_down && IsKeyPressedMap(ImGuiKey_Y)) edit_state.OnKeyboardPressed(STB_TEXTEDIT_K_REDO);
- else if (is_ctrl_down && IsKeyPressedMap(ImGuiKey_A)) edit_state.SelectAll();
- else if (is_ctrl_down && (IsKeyPressedMap(ImGuiKey_X) || IsKeyPressedMap(ImGuiKey_C)))
- {
-
- const bool cut = IsKeyPressedMap(ImGuiKey_X);
- if (cut && !edit_state.HasSelection())
- edit_state.SelectAll();
-
- if (g.IO.SetClipboardTextFn)
- {
- const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0;
- const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : (int)ImStrlenW(edit_state.Text);
- ImTextStrToUtf8(text_tmp_utf8, IM_ARRAYSIZE(text_tmp_utf8), edit_state.Text+ib, edit_state.Text+ie);
- g.IO.SetClipboardTextFn(text_tmp_utf8);
- }
-
- if (cut)
- stb_textedit_cut(&edit_state, &edit_state.StbState);
- }
- else if (is_ctrl_down && IsKeyPressedMap(ImGuiKey_V))
- {
-
- if (g.IO.GetClipboardTextFn)
- {
- if (const char* clipboard = g.IO.GetClipboardTextFn())
- {
-
- size_t clipboard_len = strlen(clipboard);
- ImWchar* clipboard_filtered = (ImWchar*)ImGui::MemAlloc((clipboard_len+1) * sizeof(ImWchar));
- int clipboard_filtered_len = 0;
- for (const char* s = clipboard; *s; )
- {
- unsigned int c;
- const int bytes_count = ImTextCharFromUtf8(&c, s, NULL);
- if (bytes_count <= 0)
- break;
- s += bytes_count;
- if (c == '\n' || c == '\r')
- continue;
- clipboard_filtered[clipboard_filtered_len++] = c;
- }
- clipboard_filtered[clipboard_filtered_len] = 0;
- stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len);
- ImGui::MemFree(clipboard_filtered);
- }
- }
- }
- else if (g.IO.InputCharacters[0])
- {
-
- for (int n = 0; n < IM_ARRAYSIZE(g.IO.InputCharacters) && g.IO.InputCharacters[n]; n++)
- {
- const ImWchar c = g.IO.InputCharacters[n];
- if (c)
- {
-
- if (c < 256 && !isprint((char)(c & 0xFF)) && c != ' ')
- continue;
- if (flags & ImGuiInputTextFlags_CharsDecimal)
- if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/'))
- continue;
- if (flags & ImGuiInputTextFlags_CharsHexadecimal)
- if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F'))
- continue;
-
-
- edit_state.OnKeyboardPressed(c);
- }
- }
- }
-
- edit_state.CursorAnim += g.IO.DeltaTime;
- edit_state.UpdateScrollOffset();
-
- if (cancel_edit)
- {
-
- ImFormatString(buf, buf_size, "%s", edit_state.InitialText);
- value_changed = true;
- }
- else
- {
-
-
-
-
- ImTextStrToUtf8(text_tmp_utf8, IM_ARRAYSIZE(text_tmp_utf8), edit_state.Text, NULL);
- if (strcmp(text_tmp_utf8, buf) != 0)
- {
- ImFormatString(buf, buf_size, "%s", text_tmp_utf8);
- value_changed = true;
- }
- }
- }
-
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg), true);
-
- const ImVec2 font_off_up = ImVec2(0.0f,window->FontSize()+1.0f);
- const ImVec2 font_off_dn = ImVec2(0.0f,2.0f);
-
- if (g.ActiveId == id)
- {
-
- const int select_begin_idx = edit_state.StbState.select_start;
- const int select_end_idx = edit_state.StbState.select_end;
- if (select_begin_idx != select_end_idx)
- {
- const ImVec2 select_begin_pos = frame_bb.Min + style.FramePadding + edit_state.CalcDisplayOffsetFromCharIdx(ImMin(select_begin_idx,select_end_idx));
- const ImVec2 select_end_pos = frame_bb.Min + style.FramePadding + edit_state.CalcDisplayOffsetFromCharIdx(ImMax(select_begin_idx,select_end_idx));
- window->DrawList->AddRectFilled(select_begin_pos - font_off_up, select_end_pos + font_off_dn, window->Color(ImGuiCol_TextSelectedBg));
- }
- }
-
-
- ImGuiTextEditState::RenderTextScrolledClipped(window->Font(), window->FontSize(), buf, frame_bb.Min + style.FramePadding, w, (g.ActiveId == id) ? edit_state.ScrollX : 0.0f);
-
- if (g.ActiveId == id)
- {
- const ImVec2 cursor_pos = frame_bb.Min + style.FramePadding + edit_state.CalcDisplayOffsetFromCharIdx(edit_state.StbState.cursor);
-
-
- if (g.InputTextState.CursorIsVisible())
- window->DrawList->AddRect(cursor_pos - font_off_up + ImVec2(0,2), cursor_pos + font_off_dn - ImVec2(0,3), window->Color(ImGuiCol_Text));
-
-
- if (io.ImeSetInputScreenPosFn && ImLength(edit_state.LastCursorPos - cursor_pos) > 0.01f)
- io.ImeSetInputScreenPosFn((int)cursor_pos.x - 1, (int)(cursor_pos.y - window->FontSize()));
-
- edit_state.LastCursorPos = cursor_pos;
- }
-
- RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
-
- if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0)
- return enter_pressed;
- else
- return value_changed;
- }
-
- static bool InputFloatN(const char* label, float* v, int components, int decimal_precision)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const float w_full = window->DC.ItemWidth.back();
- const float w_item_one = ImMax(1.0f, (float)(int)((w_full - (style.FramePadding.x*2.0f+style.ItemInnerSpacing.x) * (components-1)) / (float)components));
- const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one+style.FramePadding.x*2.0f+style.ItemInnerSpacing.x) * (components-1)));
-
- bool value_changed = false;
- ImGui::PushID(label);
- ImGui::PushItemWidth(w_item_one);
- for (int i = 0; i < components; i++)
- {
- ImGui::PushID(i);
- if (i + 1 == components)
- {
- ImGui::PopItemWidth();
- ImGui::PushItemWidth(w_item_last);
- }
- value_changed |= ImGui::InputFloat("##v", &v[i], 0, 0, decimal_precision);
- ImGui::SameLine(0, 0);
- ImGui::PopID();
- }
- ImGui::PopItemWidth();
- ImGui::PopID();
-
- ImGui::TextUnformatted(label, FindTextDisplayEnd(label));
-
- return value_changed;
- }
-
- bool InputFloat2(const char* label, float v[2], int decimal_precision)
- {
- return InputFloatN(label, v, 2, decimal_precision);
- }
-
- bool InputFloat3(const char* label, float v[3], int decimal_precision)
- {
- return InputFloatN(label, v, 3, decimal_precision);
- }
-
- bool InputFloat4(const char* label, float v[4], int decimal_precision)
- {
- return InputFloatN(label, v, 4, decimal_precision);
- }
-
- static bool Combo_ArrayGetter(void* data, int idx, const char** out_text)
- {
- const char** items = (const char**)data;
- if (out_text)
- *out_text = items[idx];
- return true;
- }
-
-
- bool Combo(const char* label, int* current_item, const char** items, int items_count, int popup_height_items)
- {
- const bool value_changed = Combo(label, current_item, Combo_ArrayGetter, (void*)items, items_count, popup_height_items);
- return value_changed;
- }
-
- static bool Combo_StringListGetter(void* data, int idx, const char** out_text)
- {
-
- const char* items_separated_by_zeros = (const char*)data;
- int items_count = 0;
- const char* p = items_separated_by_zeros;
- while (*p)
- {
- if (idx == items_count)
- break;
- p += strlen(p) + 1;
- items_count++;
- }
- if (!*p)
- return false;
- if (out_text)
- *out_text = p;
- return true;
- }
-
-
- bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_height_items)
- {
- int items_count = 0;
- const char* p = items_separated_by_zeros;
- while (*p)
- {
- p += strlen(p) + 1;
- items_count++;
- }
- bool value_changed = Combo(label, current_item, Combo_StringListGetter, (void*)items_separated_by_zeros, items_count, popup_height_items);
- return value_changed;
- }
-
-
- bool Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_height_items)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
-
- const ImVec2 text_size = CalcTextSize(label);
- const float arrow_size = (window->FontSize() + style.FramePadding.x * 2.0f);
- const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(window->DC.ItemWidth.back(), text_size.y) + style.FramePadding*2.0f);
- const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x,0));
-
- if (ClipAdvance(frame_bb))
- return false;
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(bb);
-
- bool value_changed = false;
- ItemSize(frame_bb);
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg));
- RenderFrame(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y), frame_bb.Max, window->Color(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button));
- RenderCollapseTriangle(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y) + style.FramePadding, true);
-
- if (*current_item >= 0 && *current_item < items_count)
- {
- const char* item_text;
- if (items_getter(data, *current_item, &item_text))
- RenderText(frame_bb.Min + style.FramePadding, item_text, NULL, false);
- }
-
- ImGui::SameLine(0, (int)g.Style.ItemInnerSpacing.x);
- ImGui::TextUnformatted(label, FindTextDisplayEnd(label));
-
- ImGui::PushID((int)id);
- bool menu_toggled = false;
- if (hovered)
- {
- g.HoveredId = id;
- if (g.IO.MouseClicked[0])
- {
- menu_toggled = true;
- g.ActiveComboID = (g.ActiveComboID == id) ? 0 : id;
- }
- }
-
- if (g.ActiveComboID == id)
- {
- const ImVec2 backup_pos = ImGui::GetCursorPos();
- const float popup_off_x = 0.0f;
- const float popup_height = (text_size.y + g.Style.ItemSpacing.y) * ImMin(items_count, popup_height_items) + g.Style.WindowPadding.y;
- const ImGuiAabb popup_aabb(ImVec2(frame_bb.Min.x+popup_off_x, frame_bb.Max.y), ImVec2(frame_bb.Max.x+popup_off_x, frame_bb.Max.y + popup_height));
- ImGui::SetCursorPos(popup_aabb.Min - window->Pos);
-
- const ImGuiWindowFlags flags = ImGuiWindowFlags_ComboBox | ((window->Flags & ImGuiWindowFlags_ShowBorders) ? ImGuiWindowFlags_ShowBorders : 0);
- ImGui::BeginChild("#ComboBox", popup_aabb.GetSize(), false, flags);
- ImGuiWindow* child_window = GetCurrentWindow();
- ImGui::Spacing();
-
- bool combo_item_active = false;
- combo_item_active |= (g.ActiveId == child_window->GetID("#SCROLLY"));
-
- for (int item_idx = 0; item_idx < items_count; item_idx++)
- {
- const float item_h = child_window->FontSize();
- const float spacing_up = (float)(int)(g.Style.ItemSpacing.y/2);
- const float spacing_dn = g.Style.ItemSpacing.y - spacing_up;
- const ImGuiAabb item_aabb(ImVec2(popup_aabb.Min.x, child_window->DC.CursorPos.y - spacing_up), ImVec2(popup_aabb.Max.x, child_window->DC.CursorPos.y + item_h + spacing_dn));
- const ImGuiID item_id = child_window->GetID((void*)(intptr_t)item_idx);
-
- bool item_hovered, item_held;
- bool item_pressed = ButtonBehaviour(item_aabb, item_id, &item_hovered, &item_held, true);
- bool item_selected = item_idx == *current_item;
-
- if (item_hovered || item_selected)
- {
- const ImU32 col = window->Color((item_held && item_hovered) ? ImGuiCol_HeaderActive : item_hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(item_aabb.Min, item_aabb.Max, col, false);
- }
-
- const char* item_text;
- if (!items_getter(data, item_idx, &item_text))
- item_text = "*Unknown item*";
- ImGui::Text("%s", item_text);
-
- if (item_selected)
- {
- if (menu_toggled)
- ImGui::SetScrollPosHere();
- }
- if (item_pressed)
- {
- g.ActiveId = 0;
- g.ActiveComboID = 0;
- value_changed = true;
- *current_item = item_idx;
- }
-
- combo_item_active |= (g.ActiveId == item_id);
- }
- ImGui::EndChild();
- ImGui::SetCursorPos(backup_pos);
-
- if (!combo_item_active && g.ActiveId != 0)
- g.ActiveComboID = 0;
- }
-
- ImGui::PopID();
-
- return value_changed;
- }
-
-
- bool ColorButton(const ImVec4& col, bool small_height, bool outline_border)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const float square_size = window->FontSize();
- const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(square_size + style.FramePadding.x*2, square_size + (small_height ? 0 : style.FramePadding.y*2)));
- ItemSize(bb);
-
- if (ClipAdvance(bb))
- return false;
-
- const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(bb);
- const bool pressed = hovered && g.IO.MouseClicked[0];
- RenderFrame(bb.Min, bb.Max, window->Color(col), outline_border);
-
- if (hovered)
- {
- int ix = (int)(col.x * 255.0f + 0.5f);
- int iy = (int)(col.y * 255.0f + 0.5f);
- int iz = (int)(col.z * 255.0f + 0.5f);
- int iw = (int)(col.w * 255.0f + 0.5f);
- ImGui::SetTooltip("Color:\n(%.2f,%.2f,%.2f,%.2f)\n#%02X%02X%02X%02X", col.x, col.y, col.z, col.w, ix, iy, iz, iw);
- }
-
- return pressed;
- }
-
- bool ColorEdit3(const char* label, float col[3])
- {
- float col4[4];
- col4[0] = col[0];
- col4[1] = col[1];
- col4[2] = col[2];
- col4[3] = 1.0f;
- const bool value_changed = ImGui::ColorEdit4(label, col4, false);
- col[0] = col4[0];
- col[1] = col4[1];
- col[2] = col4[2];
- return value_changed;
- }
-
-
-
- bool ColorEdit4(const char* label, float col[4], bool alpha)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return false;
-
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(label);
- const float w_full = window->DC.ItemWidth.back();
- const float square_sz = (window->FontSize() + style.FramePadding.x * 2.0f);
-
- ImGuiColorEditMode edit_mode = window->DC.ColorEditMode;
- if (edit_mode == ImGuiColorEditMode_UserSelect)
- edit_mode = g.ColorEditModeStorage.GetInt(id, 0) % 3;
-
- float fx = col[0];
- float fy = col[1];
- float fz = col[2];
- float fw = col[3];
- const ImVec4 col_display(fx, fy, fz, 1.0f);
-
- if (edit_mode == ImGuiColorEditMode_HSV)
- ImConvertColorRGBtoHSV(fx, fy, fz, fx, fy, fz);
-
- int ix = (int)(fx * 255.0f + 0.5f);
- int iy = (int)(fy * 255.0f + 0.5f);
- int iz = (int)(fz * 255.0f + 0.5f);
- int iw = (int)(fw * 255.0f + 0.5f);
-
- int components = alpha ? 4 : 3;
- bool value_changed = false;
-
- ImGui::PushID(label);
-
- bool hsv = (edit_mode == 1);
- switch (edit_mode)
- {
- case ImGuiColorEditMode_RGB:
- case ImGuiColorEditMode_HSV:
- {
-
-
- const float w_items_all = w_full - (square_sz + style.ItemInnerSpacing.x);
- const float w_item_one = ImMax(1.0f, (float)(int)((w_items_all - (style.FramePadding.x*2.0f+style.ItemInnerSpacing.x) * (components-1)) / (float)components));
- const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one+style.FramePadding.x*2.0f+style.ItemInnerSpacing.x) * (components-1)));
-
- ImGui::PushItemWidth(w_item_one);
- value_changed |= ImGui::SliderInt("##X", &ix, 0, 255, hsv ? "H:%3.0f" : "R:%3.0f");
- ImGui::SameLine(0, 0);
- value_changed |= ImGui::SliderInt("##Y", &iy, 0, 255, hsv ? "S:%3.0f" : "G:%3.0f");
- ImGui::SameLine(0, 0);
- if (alpha)
- {
- value_changed |= ImGui::SliderInt("##Z", &iz, 0, 255, hsv ? "V:%3.0f" : "B:%3.0f");
- ImGui::SameLine(0, 0);
- ImGui::PushItemWidth(w_item_last);
- value_changed |= ImGui::SliderInt("##W", &iw, 0, 255, "A:%3.0f");
- }
- else
- {
- ImGui::PushItemWidth(w_item_last);
- value_changed |= ImGui::SliderInt("##Z", &iz, 0, 255, hsv ? "V:%3.0f" : "B:%3.0f");
- }
- ImGui::PopItemWidth();
- ImGui::PopItemWidth();
- }
- break;
- case ImGuiColorEditMode_HEX:
- {
-
- const float w_slider_all = w_full - square_sz;
- char buf[64];
- if (alpha)
- sprintf(buf, "#%02X%02X%02X%02X", ix, iy, iz, iw);
- else
- sprintf(buf, "#%02X%02X%02X", ix, iy, iz);
- ImGui::PushItemWidth(w_slider_all - g.Style.ItemInnerSpacing.x);
- value_changed |= ImGui::InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal);
- ImGui::PopItemWidth();
- char* p = buf;
- while (*p == '#' || *p == ' ' || *p == '\t')
- p++;
- ix = iy = iz = iw = 0;
- if (alpha)
- sscanf(p, "%02X%02X%02X%02X", &ix, &iy, &iz, &iw);
- else
- sscanf(p, "%02X%02X%02X", &ix, &iy, &iz);
- }
- break;
- }
-
- ImGui::SameLine(0, 0);
- ImGui::ColorButton(col_display);
-
- if (window->DC.ColorEditMode == ImGuiColorEditMode_UserSelect)
- {
- ImGui::SameLine(0, (int)style.ItemInnerSpacing.x);
- const char* button_titles[3] = { "RGB", "HSV", "HEX" };
- if (ImGui::Button(button_titles[edit_mode]))
- {
-
- g.ColorEditModeStorage.SetInt(id, (edit_mode + 1) % 3);
- }
- }
-
- ImGui::SameLine();
- ImGui::TextUnformatted(label, FindTextDisplayEnd(label));
-
-
- fx = ix / 255.0f;
- fy = iy / 255.0f;
- fz = iz / 255.0f;
- fw = iw / 255.0f;
- if (edit_mode == 1)
- ImConvertColorHSVtoRGB(fx, fy, fz, fx, fy, fz);
-
- if (value_changed)
- {
- col[0] = fx;
- col[1] = fy;
- col[2] = fz;
- if (alpha)
- col[3] = fw;
- }
-
- ImGui::PopID();
-
- return value_changed;
- }
-
- void ColorEditMode(ImGuiColorEditMode mode)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColorEditMode = mode;
- }
-
-
- void Separator()
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- if (window->DC.ColumnsCount > 1)
- ImGui::PopClipRect();
-
- const ImGuiAabb bb(ImVec2(window->Pos.x, window->DC.CursorPos.y), ImVec2(window->Pos.x + window->Size.x, window->DC.CursorPos.y));
- ItemSize(ImVec2(0.0f, bb.GetSize().y));
-
- if (ClipAdvance(bb))
- {
- if (window->DC.ColumnsCount > 1)
- ImGui::PushColumnClipRect();
- return;
- }
-
- window->DrawList->AddLine(bb.Min, bb.Max, window->Color(ImGuiCol_Border));
-
- if (window->DC.ColumnsCount > 1)
- ImGui::PushColumnClipRect();
- }
-
-
- void Spacing()
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- ItemSize(ImVec2(0,0));
- }
-
- static void ItemSize(ImVec2 size, ImVec2* adjust_start_offset)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- const float line_height = ImMax(window->DC.CurrentLineHeight, size.y);
- if (adjust_start_offset)
- adjust_start_offset->y = adjust_start_offset->y + (line_height - size.y) * 0.5f;
-
-
- window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);
- window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.ColumnStartX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
-
- window->SizeContentsFit = ImMax(window->SizeContentsFit, ImVec2(window->DC.CursorPosPrevLine.x, window->DC.CursorPos.y) - window->Pos + ImVec2(0.0f, window->ScrollY));
-
- window->DC.PrevLineHeight = line_height;
- window->DC.CurrentLineHeight = 0.0f;
- }
-
- static void ItemSize(const ImGuiAabb& aabb, ImVec2* adjust_start_offset)
- {
- ItemSize(aabb.GetSize(), adjust_start_offset);
- }
-
- void NextColumn()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- if (window->DC.ColumnsCount > 1)
- {
- ImGui::PopItemWidth();
- ImGui::PopClipRect();
- if (++window->DC.ColumnCurrent < window->DC.ColumnsCount)
- SameLine((int)(ImGui::GetColumnOffset(window->DC.ColumnCurrent) + g.Style.ItemSpacing.x));
- else
- window->DC.ColumnCurrent = 0;
- ImGui::PushColumnClipRect();
- ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f);
- }
- }
-
- bool IsClipped(const ImGuiAabb& bb)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- if (!bb.Overlaps(ImGuiAabb(window->ClipRectStack.back())) && !g.LogEnabled)
- return true;
- return false;
- }
-
- bool IsClipped(const ImVec2& item_size)
- {
- ImGuiWindow* window = GetCurrentWindow();
- return IsClipped(ImGuiAabb(window->DC.CursorPos, window->DC.CursorPos + item_size));
- }
-
- static bool ClipAdvance(const ImGuiAabb& bb)
- {
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.LastItemAabb = bb;
- if (ImGui::IsClipped(bb))
- {
- window->DC.LastItemHovered = false;
- return true;
- }
- window->DC.LastItemHovered = ImGui::IsMouseHoveringBox(bb);
- return false;
- }
-
-
-
-
-
-
- void SameLine(int column_x, int spacing_w)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- float x, y;
- if (column_x != 0)
- {
- if (spacing_w < 0) spacing_w = 0;
- x = window->Pos.x + (float)column_x + (float)spacing_w;
- y = window->DC.CursorPosPrevLine.y;
- }
- else
- {
- if (spacing_w < 0) spacing_w = (int)g.Style.ItemSpacing.x;
- x = window->DC.CursorPosPrevLine.x + (float)spacing_w;
- y = window->DC.CursorPosPrevLine.y;
- }
- window->DC.CurrentLineHeight = window->DC.PrevLineHeight;
- window->DC.CursorPos = ImVec2(x, y);
- }
-
- float GetColumnOffset(int column_index)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (column_index < 0)
- column_index = window->DC.ColumnCurrent;
-
- const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
- RegisterAliveId(column_id);
- const float default_t = column_index / (float)window->DC.ColumnsCount;
- const float t = (float)window->StateStorage.GetInt(column_id, (int)(default_t * 8096)) / 8096;
-
- const float offset = window->DC.ColumnStartX + t * (window->Size.x - g.Style.ScrollBarWidth - window->DC.ColumnStartX);
- return offset;
- }
-
- void SetColumnOffset(int column_index, float offset)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (column_index < 0)
- column_index = window->DC.ColumnCurrent;
-
- const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
- const float t = (offset - window->DC.ColumnStartX) / (window->Size.x - g.Style.ScrollBarWidth - window->DC.ColumnStartX);
- window->StateStorage.SetInt(column_id, (int)(t*8096));
- }
-
- float GetColumnWidth(int column_index)
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (column_index < 0)
- column_index = window->DC.ColumnCurrent;
-
- const float w = GetColumnOffset(column_index+1) - GetColumnOffset(column_index);
- return w;
- }
-
- static void PushColumnClipRect(int column_index)
- {
- ImGuiWindow* window = GetCurrentWindow();
- if (column_index < 0)
- column_index = window->DC.ColumnCurrent;
-
- const float x1 = window->Pos.x + ImGui::GetColumnOffset(column_index) - 1;
- const float x2 = window->Pos.x + ImGui::GetColumnOffset(column_index+1) - 1;
- ImGui::PushClipRect(ImVec4(x1,-FLT_MAX,x2,+FLT_MAX));
- }
-
- void Columns(int columns_count, const char* id, bool border)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
-
- if (window->DC.ColumnsCount != 1)
- {
- if (window->DC.ColumnCurrent != 0)
- ImGui::ItemSize(ImVec2(0,0));
- ImGui::PopItemWidth();
- ImGui::PopClipRect();
- }
-
- if (window->DC.ColumnsCount != columns_count && window->DC.ColumnsCount != 1 && window->DC.ColumnsShowBorders)
- {
-
- const float y1 = window->DC.ColumnsStartCursorPos.y;
- const float y2 = window->DC.CursorPos.y;
- for (int i = 1; i < window->DC.ColumnsCount; i++)
- {
- float x = window->Pos.x + GetColumnOffset(i);
-
- const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(i);
- const ImGuiAabb column_aabb(ImVec2(x-4,y1),ImVec2(x+4,y2));
-
- if (IsClipped(column_aabb))
- continue;
-
- bool hovered, held;
- ButtonBehaviour(column_aabb, column_id, &hovered, &held, true);
-
-
- const ImU32 col = window->Color(held ? ImGuiCol_ColumnActive : hovered ? ImGuiCol_ColumnHovered : ImGuiCol_Column);
- const float xi = (float)(int)x;
- window->DrawList->AddLine(ImVec2(xi, y1), ImVec2(xi, y2), col);
-
- if (held)
- {
- x -= window->Pos.x;
- x = ImClamp(x + g.IO.MouseDelta.x, ImGui::GetColumnOffset(i-1)+g.Style.ColumnsMinSpacing, ImGui::GetColumnOffset(i+1)-g.Style.ColumnsMinSpacing);
- SetColumnOffset(i, x);
- x += window->Pos.x;
- }
- }
- }
-
- window->DC.ColumnsSetID = window->GetID(id ? id : "");
- window->DC.ColumnCurrent = 0;
- window->DC.ColumnsCount = columns_count;
- window->DC.ColumnsShowBorders = border;
- window->DC.ColumnsStartCursorPos = window->DC.CursorPos;
-
- if (window->DC.ColumnsCount != 1)
- {
- ImGui::PushColumnClipRect();
- ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f);
- }
- }
-
- void TreePush(const char* str_id)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColumnStartX += g.Style.TreeNodeSpacing;
- window->DC.CursorPos.x = window->Pos.x + window->DC.ColumnStartX;
- window->DC.TreeDepth++;
- PushID(str_id ? str_id : "#TreePush");
- }
-
- void TreePush(const void* ptr_id)
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColumnStartX += g.Style.TreeNodeSpacing;
- window->DC.CursorPos.x = window->Pos.x + window->DC.ColumnStartX;
- window->DC.TreeDepth++;
- PushID(ptr_id ? ptr_id : (const void*)"#TreePush");
- }
-
- void TreePop()
- {
- ImGuiState& g = GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColumnStartX -= g.Style.TreeNodeSpacing;
- window->DC.CursorPos.x = window->Pos.x + window->DC.ColumnStartX;
- window->DC.TreeDepth--;
- PopID();
- }
-
- void Value(const char* prefix, bool b)
- {
- ImGui::Text("%s: %s", prefix, (b ? "true" : "false"));
- }
-
- void Value(const char* prefix, int v)
- {
- ImGui::Text("%s: %d", prefix, v);
- }
-
- void Value(const char* prefix, unsigned int v)
- {
- ImGui::Text("%s: %d", prefix, v);
- }
-
- void Value(const char* prefix, float v, const char* float_format)
- {
- if (float_format)
- {
- char fmt[64];
- sprintf(fmt, "%%s: %s", float_format);
- ImGui::Text(fmt, prefix, v);
- }
- else
- {
- ImGui::Text("%s: %.3f", prefix, v);
- }
- }
-
- void Color(const char* prefix, const ImVec4& v)
- {
- ImGui::Text("%s: (%.2f,%.2f,%.2f,%.2f)", prefix, v.x, v.y, v.z, v.w);
- ImGui::SameLine();
- ImGui::ColorButton(v, true);
- }
-
- void Color(const char* prefix, unsigned int v)
- {
- ImGui::Text("%s: %08X", prefix, v);
- ImGui::SameLine();
-
- ImVec4 col;
- col.x = (float)((v >> 0) & 0xFF) / 255.0f;
- col.y = (float)((v >> 8) & 0xFF) / 255.0f;
- col.z = (float)((v >> 16) & 0xFF) / 255.0f;
- col.w = (float)((v >> 24) & 0xFF) / 255.0f;
- ImGui::ColorButton(col, true);
- }
-
- };
-
-
-
-
-
- void ImDrawList::Clear()
- {
- commands.resize(0);
- vtx_buffer.resize(0);
- vtx_write = NULL;
- clip_rect_stack.resize(0);
- }
-
- void ImDrawList::PushClipRect(const ImVec4& clip_rect)
- {
- if (!commands.empty() && commands.back().vtx_count == 0)
- {
-
- commands.back().clip_rect = clip_rect;
- }
- else
- {
- ImDrawCmd draw_cmd;
- draw_cmd.vtx_count = 0;
- draw_cmd.clip_rect = clip_rect;
- commands.push_back(draw_cmd);
- }
- clip_rect_stack.push_back(clip_rect);
- }
-
- void ImDrawList::PopClipRect()
- {
- clip_rect_stack.pop_back();
- const ImVec4 clip_rect = clip_rect_stack.empty() ? ImVec4(-9999.0f,-9999.0f, +9999.0f, +9999.0f) : clip_rect_stack.back();
- if (!commands.empty() && commands.back().vtx_count == 0)
- {
-
- commands.back().clip_rect = clip_rect;
- }
- else
- {
- ImDrawCmd draw_cmd;
- draw_cmd.vtx_count = 0;
- draw_cmd.clip_rect = clip_rect;
- commands.push_back(draw_cmd);
- }
- }
-
- void ImDrawList::ReserveVertices(unsigned int vtx_count)
- {
- if (vtx_count > 0)
- {
- ImDrawCmd& draw_cmd = commands.back();
- draw_cmd.vtx_count += vtx_count;
- vtx_buffer.resize(vtx_buffer.size() + vtx_count);
- vtx_write = &vtx_buffer[vtx_buffer.size() - vtx_count];
- }
- }
-
- void ImDrawList::AddVtx(const ImVec2& pos, ImU32 col)
- {
- vtx_write->pos = pos;
- vtx_write->col = col;
- vtx_write->uv = GImGui.IO.FontTexUvForWhite;
- vtx_write++;
- }
-
- void ImDrawList::AddVtxLine(const ImVec2& a, const ImVec2& b, ImU32 col)
- {
- const float offset = GImGui.IO.PixelCenterOffset;
- const ImVec2 hn = (b - a) * (0.50f / ImLength(b - a));
- const ImVec2 hp0 = ImVec2(offset - hn.y, offset + hn.x);
- const ImVec2 hp1 = ImVec2(offset + hn.y, offset - hn.x);
-
-
- AddVtx(a + hp0, col);
- AddVtx(b + hp0, col);
- AddVtx(a + hp1, col);
- AddVtx(b + hp0, col);
- AddVtx(b + hp1, col);
- AddVtx(a + hp1, col);
- }
-
- void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col)
- {
- if ((col >> 24) == 0)
- return;
-
- ReserveVertices(6);
- AddVtxLine(a, b, col);
- }
-
- void ImDrawList::AddArc(const ImVec2& center, float rad, ImU32 col, int a_min, int a_max, bool tris, const ImVec2& third_point_offset)
- {
- if ((col >> 24) == 0)
- return;
-
- static ImVec2 circle_vtx[12];
- static bool circle_vtx_builds = false;
- if (!circle_vtx_builds)
- {
- for (int i = 0; i < IM_ARRAYSIZE(circle_vtx); i++)
- {
- const float a = ((float)i / (float)IM_ARRAYSIZE(circle_vtx)) * 2*PI;
- circle_vtx[i].x = cos(a + PI);
- circle_vtx[i].y = sin(a + PI);
- }
- circle_vtx_builds = true;
- }
-
- if (tris)
- {
- ReserveVertices((unsigned int)(a_max-a_min) * 3);
- for (int a = a_min; a < a_max; a++)
- {
- AddVtx(center + circle_vtx[a % IM_ARRAYSIZE(circle_vtx)] * rad, col);
- AddVtx(center + circle_vtx[(a+1) % IM_ARRAYSIZE(circle_vtx)] * rad, col);
- AddVtx(center + third_point_offset, col);
- }
- }
- else
- {
- ReserveVertices((unsigned int)(a_max-a_min) * 6);
- for (int a = a_min; a < a_max; a++)
- AddVtxLine(center + circle_vtx[a % IM_ARRAYSIZE(circle_vtx)] * rad, center + circle_vtx[(a+1) % IM_ARRAYSIZE(circle_vtx)] * rad, col);
- }
- }
-
- void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
- {
- if ((col >> 24) == 0)
- return;
-
-
- float r = rounding;
- r = ImMin(r, fabsf(b.x-a.x) * ( ((rounding_corners&(1|2))==(1|2)) || ((rounding_corners&(4|8))==(4|8)) ? 0.5f : 1.0f ));
- r = ImMin(r, fabsf(b.y-a.y) * ( ((rounding_corners&(1|8))==(1|8)) || ((rounding_corners&(2|4))==(2|4)) ? 0.5f : 1.0f ));
-
- if (r == 0.0f || rounding_corners == 0)
- {
- ReserveVertices(4*6);
- AddVtxLine(ImVec2(a.x,a.y), ImVec2(b.x,a.y), col);
- AddVtxLine(ImVec2(b.x,a.y), ImVec2(b.x,b.y), col);
- AddVtxLine(ImVec2(b.x,b.y), ImVec2(a.x,b.y), col);
- AddVtxLine(ImVec2(a.x,b.y), ImVec2(a.x,a.y), col);
- }
- else
- {
- ReserveVertices(4*6);
- AddVtxLine(ImVec2(a.x + ((rounding_corners & 1)?r:0), a.y), ImVec2(b.x - ((rounding_corners & 2)?r:0), a.y), col);
- AddVtxLine(ImVec2(b.x, a.y + ((rounding_corners & 2)?r:0)), ImVec2(b.x, b.y - ((rounding_corners & 4)?r:0)), col);
- AddVtxLine(ImVec2(b.x - ((rounding_corners & 4)?r:0), b.y), ImVec2(a.x + ((rounding_corners & 8)?r:0), b.y), col);
- AddVtxLine(ImVec2(a.x, b.y - ((rounding_corners & 8)?r:0)), ImVec2(a.x, a.y + ((rounding_corners & 1)?r:0)), col);
-
- if (rounding_corners & 1) AddArc(ImVec2(a.x+r,a.y+r), r, col, 0, 3);
- if (rounding_corners & 2) AddArc(ImVec2(b.x-r,a.y+r), r, col, 3, 6);
- if (rounding_corners & 4) AddArc(ImVec2(b.x-r,b.y-r), r, col, 6, 9);
- if (rounding_corners & 8) AddArc(ImVec2(a.x+r,b.y-r), r, col, 9, 12);
- }
- }
-
- void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
- {
- if ((col >> 24) == 0)
- return;
-
-
- float r = rounding;
- r = ImMin(r, fabsf(b.x-a.x) * ( ((rounding_corners&(1|2))==(1|2)) || ((rounding_corners&(4|8))==(4|8)) ? 0.5f : 1.0f ));
- r = ImMin(r, fabsf(b.y-a.y) * ( ((rounding_corners&(1|8))==(1|8)) || ((rounding_corners&(2|4))==(2|4)) ? 0.5f : 1.0f ));
-
- if (r == 0.0f || rounding_corners == 0)
- {
-
- ReserveVertices(6);
- AddVtx(ImVec2(a.x,a.y), col);
- AddVtx(ImVec2(b.x,a.y), col);
- AddVtx(ImVec2(b.x,b.y), col);
- AddVtx(ImVec2(a.x,a.y), col);
- AddVtx(ImVec2(b.x,b.y), col);
- AddVtx(ImVec2(a.x,b.y), col);
- }
- else
- {
- ReserveVertices(6+6*2);
- AddVtx(ImVec2(a.x+r,a.y), col);
- AddVtx(ImVec2(b.x-r,a.y), col);
- AddVtx(ImVec2(b.x-r,b.y), col);
- AddVtx(ImVec2(a.x+r,a.y), col);
- AddVtx(ImVec2(b.x-r,b.y), col);
- AddVtx(ImVec2(a.x+r,b.y), col);
-
- float top_y = (rounding_corners & 1) ? a.y+r : a.y;
- float bot_y = (rounding_corners & 8) ? b.y-r : b.y;
- AddVtx(ImVec2(a.x,top_y), col);
- AddVtx(ImVec2(a.x+r,top_y), col);
- AddVtx(ImVec2(a.x+r,bot_y), col);
- AddVtx(ImVec2(a.x,top_y), col);
- AddVtx(ImVec2(a.x+r,bot_y), col);
- AddVtx(ImVec2(a.x,bot_y), col);
-
- top_y = (rounding_corners & 2) ? a.y+r : a.y;
- bot_y = (rounding_corners & 4) ? b.y-r : b.y;
- AddVtx(ImVec2(b.x-r,top_y), col);
- AddVtx(ImVec2(b.x,top_y), col);
- AddVtx(ImVec2(b.x,bot_y), col);
- AddVtx(ImVec2(b.x-r,top_y), col);
- AddVtx(ImVec2(b.x,bot_y), col);
- AddVtx(ImVec2(b.x-r,bot_y), col);
-
- if (rounding_corners & 1) AddArc(ImVec2(a.x+r,a.y+r), r, col, 0, 3, true);
- if (rounding_corners & 2) AddArc(ImVec2(b.x-r,a.y+r), r, col, 3, 6, true);
- if (rounding_corners & 4) AddArc(ImVec2(b.x-r,b.y-r), r, col, 6, 9, true);
- if (rounding_corners & 8) AddArc(ImVec2(a.x+r,b.y-r), r, col, 9, 12,true);
- }
- }
-
- void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
- {
- if ((col >> 24) == 0)
- return;
-
- const ImVec2 offset(GImGui.IO.PixelCenterOffset,GImGui.IO.PixelCenterOffset);
-
- ReserveVertices(3);
- AddVtx(a + offset, col);
- AddVtx(b + offset, col);
- AddVtx(c + offset, col);
- }
-
- void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments)
- {
- if ((col >> 24) == 0)
- return;
-
- const ImVec2 offset(GImGui.IO.PixelCenterOffset,GImGui.IO.PixelCenterOffset);
-
- ReserveVertices((unsigned int)num_segments*6);
- const float a_step = 2*PI/(float)num_segments;
- float a0 = 0.0f;
- for (int i = 0; i < num_segments; i++)
- {
- const float a1 = (i + 1) == num_segments ? 0.0f : a0 + a_step;
- AddVtxLine(centre + offset + ImVec2(cos(a0),sin(a0))*radius, centre + ImVec2(cos(a1),sin(a1))*radius, col);
- a0 = a1;
- }
- }
-
- void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)
- {
- if ((col >> 24) == 0)
- return;
-
- const ImVec2 offset(GImGui.IO.PixelCenterOffset,GImGui.IO.PixelCenterOffset);
-
- ReserveVertices((unsigned int)num_segments*3);
- const float a_step = 2*PI/(float)num_segments;
- float a0 = 0.0f;
- for (int i = 0; i < num_segments; i++)
- {
- const float a1 = (i + 1) == num_segments ? 0.0f : a0 + a_step;
- AddVtx(centre + offset + ImVec2(cos(a0),sin(a0))*radius, col);
- AddVtx(centre + offset + ImVec2(cos(a1),sin(a1))*radius, col);
- AddVtx(centre + offset, col);
- a0 = a1;
- }
- }
-
- void ImDrawList::AddText(ImFont font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)
- {
- if ((col >> 24) == 0)
- return;
-
- if (text_end == NULL)
- text_end = text_begin + strlen(text_begin);
-
-
- const unsigned int char_count = (unsigned int)(text_end - text_begin);
- const unsigned int vtx_count_max = char_count * 6;
- const size_t vtx_begin = vtx_buffer.size();
- ReserveVertices(vtx_count_max);
-
- font->RenderText(font_size, pos, col, clip_rect_stack.back(), text_begin, text_end, vtx_write);
-
-
- vtx_buffer.resize((size_t)(vtx_write - &vtx_buffer.front()));
- const size_t vtx_count = vtx_buffer.size() - vtx_begin;
- commands.back().vtx_count -= (unsigned int)(vtx_count_max - vtx_count);
- vtx_write -= (vtx_count_max - vtx_count);
- }
-
-
-
-
-
- ImBitmapFont::ImBitmapFont()
- {
- Data = NULL;
- DataSize = 0;
- DataOwned = false;
- Info = NULL;
- Common = NULL;
- Glyphs = NULL;
- GlyphsCount = 0;
- Kerning = NULL;
- KerningCount = 0;
- TabCount = 4;
- }
-
- void ImBitmapFont::Clear()
- {
- if (Data && DataOwned)
- ImGui::MemFree(Data);
- Data = NULL;
- DataOwned = false;
- Info = NULL;
- Common = NULL;
- Glyphs = NULL;
- GlyphsCount = 0;
- Filenames.clear();
- IndexLookup.clear();
- }
-
- bool ImBitmapFont::LoadFromFile(const char* filename)
- {
- IM_ASSERT(!IsLoaded());
-
-
- FILE* f;
- if ((f = fopen(filename, "rb")) == NULL)
- return false;
- if (fseek(f, 0, SEEK_END))
- {
- fclose(f);
- return false;
- }
- const long f_size = ftell(f);
- if (f_size == -1)
- {
- fclose(f);
- return false;
- }
- DataSize = (size_t)f_size;
- if (fseek(f, 0, SEEK_SET))
- {
- fclose(f);
- return false;
- }
- if ((Data = (unsigned char*)ImGui::MemAlloc(DataSize)) == NULL)
- {
- fclose(f);
- return false;
- }
- if (fread(Data, 1, DataSize, f) != DataSize)
- {
- fclose(f);
- ImGui::MemFree(Data);
- return false;
- }
- fclose(f);
- DataOwned = true;
- return LoadFromMemory(Data, DataSize);
- }
-
- bool ImBitmapFont::LoadFromMemory(const void* data, size_t data_size)
- {
- IM_ASSERT(!IsLoaded());
-
- Data = (unsigned char*)data;
- DataSize = data_size;
-
-
- if (DataSize < 4 || Data[0] != 'B' || Data[1] != 'M' || Data[2] != 'F' || Data[3] != 0x03)
- return false;
- for (const unsigned char* p = Data+4; p < Data + DataSize; )
- {
- const unsigned char block_type = *(unsigned char*)p;
- p += sizeof(unsigned char);
- const ImU32 block_size = *(ImU32*)p;
- p += sizeof(ImU32);
-
- switch (block_type)
- {
- case 1:
- IM_ASSERT(Info == NULL);
- Info = (FntInfo*)p;
- break;
- case 2:
- IM_ASSERT(Common == NULL);
- Common = (FntCommon*)p;
- break;
- case 3:
- for (const unsigned char* s = p; s < p+block_size && s < Data+DataSize; s = s + strlen((const char*)s) + 1)
- Filenames.push_back((const char*)s);
- break;
- case 4:
- IM_ASSERT(Glyphs == NULL && GlyphsCount == 0);
- Glyphs = (FntGlyph*)p;
- GlyphsCount = block_size / sizeof(FntGlyph);
- break;
- default:
- IM_ASSERT(Kerning == NULL && KerningCount == 0);
- Kerning = (FntKerning*)p;
- KerningCount = block_size / sizeof(FntKerning);
- break;
- }
- p += block_size;
- }
-
- BuildLookupTable();
- return true;
- }
-
- void ImBitmapFont::BuildLookupTable()
- {
- ImU32 max_c = 0;
- for (size_t i = 0; i != GlyphsCount; i++)
- if (max_c < Glyphs[i].Id)
- max_c = Glyphs[i].Id;
-
- IndexLookup.clear();
- IndexLookup.resize(max_c + 1);
- for (size_t i = 0; i < IndexLookup.size(); i++)
- IndexLookup[i] = -1;
- for (size_t i = 0; i < GlyphsCount; i++)
- IndexLookup[Glyphs[i].Id] = (int)i;
- }
-
- const ImBitmapFont::FntGlyph* ImBitmapFont::FindGlyph(unsigned short c) const
- {
- if (c < (int)IndexLookup.size())
- {
- const int i = IndexLookup[c];
- if (i >= 0 && i < (int)GlyphsCount)
- return &Glyphs[i];
- }
- return NULL;
- }
-
-
-
- static int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end)
- {
- if (*in_text != 0)
- {
- unsigned int c = -1;
- const unsigned char* str = (const unsigned char*)in_text;
- if (!(*str & 0x80))
- {
- c = (unsigned int)(*str++);
- *out_char = c;
- return 1;
- }
- if ((*str & 0xe0) == 0xc0)
- {
- if (in_text_end && in_text_end - (const char*)str < 2) return -1;
- if (*str < 0xc2) return -1;
- c = (*str++ & 0x1f) << 6;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f);
- *out_char = c;
- return 2;
- }
- if ((*str & 0xf0) == 0xe0)
- {
- if (in_text_end && in_text_end - (const char*)str < 3) return -1;
- if (*str == 0xe0 && (str[1] < 0xa0 || str[1] > 0xbf)) return -1;
- if (*str == 0xed && str[1] > 0x9f) return -1;
- c = (*str++ & 0x0f) << 12;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f) << 6;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f);
- *out_char = c;
- return 3;
- }
- if ((*str & 0xf8) == 0xf0)
- {
- if (in_text_end && in_text_end - (const char*)str < 4) return -1;
- if (*str > 0xf4) return -1;
- if (*str == 0xf0 && (str[1] < 0x90 || str[1] > 0xbf)) return -1;
- if (*str == 0xf4 && str[1] > 0x8f) return -1;
- c = (*str++ & 0x07) << 18;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f) << 12;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f) << 6;
- if ((*str & 0xc0) != 0x80) return -1;
- c += (*str++ & 0x3f);
-
- if ((c & 0xFFFFF800) == 0xD800) return -1;
- *out_char = c;
- return 4;
- }
- }
- *out_char = 0;
- return 0;
- }
-
- static int ImTextStrFromUtf8(ImWchar* buf, size_t buf_size, const char* in_text, const char* in_text_end)
- {
- ImWchar* buf_out = buf;
- ImWchar* buf_end = buf + buf_size;
- while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text)
- {
- unsigned int c;
- in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);
- if (c < 0x10000)
- *buf_out++ = (ImWchar)c;
- }
- *buf_out = 0;
- return buf_out - buf;
- }
-
-
- static int ImTextCharToUtf8(char* buf, size_t buf_size, unsigned int c)
- {
- if (c)
- {
- int i = 0;
- int n = (size_t)buf_size;
- if (c < 0x80)
- {
- if (i+1 > n) return 0;
- buf[i++] = (char)c;
- return 1;
- }
- else if (c < 0x800)
- {
- if (i+2 > n) return 0;
- buf[i++] = 0xc0 + (c >> 6);
- buf[i++] = 0x80 + (c & 0x3f);
- return 2;
- }
- else if (c >= 0xdc00 && c < 0xe000)
- {
- return 0;
- }
- else if (c >= 0xd800 && c < 0xdc00)
- {
- if (i+4 > n) return 0;
- buf[i++] = 0xf0 + (c >> 18);
- buf[i++] = 0x80 + ((c >> 12) & 0x3f);
- buf[i++] = 0x80 + ((c >> 6) & 0x3f);
- buf[i++] = 0x80 + ((c ) & 0x3f);
- return 4;
- }
-
- {
- if (i+3 > n) return 0;
- buf[i++] = 0xe0 + (c >> 12);
- buf[i++] = 0x80 + ((c>> 6) & 0x3f);
- buf[i++] = 0x80 + ((c ) & 0x3f);
- return 3;
- }
- }
- return 0;
- }
-
- static int ImTextStrToUtf8(char* buf, size_t buf_size, const ImWchar* in_text, const ImWchar* in_text_end)
- {
- char* buf_out = buf;
- const char* buf_end = buf + buf_size;
- while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text)
- {
- buf_out += ImTextCharToUtf8(buf_out, buf_end-buf_out-1, (unsigned int)*in_text);
- in_text++;
- }
- *buf_out = 0;
- return buf_out - buf;
- }
-
- ImVec2 ImBitmapFont::CalcTextSizeA(float size, float max_width, const char* text_begin, const char* text_end, const char** remaining) const
- {
- if (max_width == 0.0f)
- max_width = FLT_MAX;
- if (!text_end)
- text_end = text_begin + strlen(text_begin);
-
- const float scale = size / (float)Info->FontSize;
- const float line_height = (float)Info->FontSize * scale;
- const FntGlyph* fallback_glyph = FindGlyph(GImGui.IO.FontFallbackGlyph);
-
- ImVec2 text_size = ImVec2(0,0);
- float line_width = 0.0f;
-
- const char* s = text_begin;
- while (s < text_end)
- {
- unsigned int c;
- const int bytes_count = ImTextCharFromUtf8(&c, s, text_end);
- s += bytes_count > 0 ? bytes_count : 1;
-
- if (c == '\n')
- {
- if (text_size.x < line_width)
- text_size.x = line_width;
- text_size.y += line_height;
- line_width = 0;
- }
- else if (c == '\t')
- {
-
- if (const FntGlyph* glyph = FindGlyph((unsigned short)' '))
- line_width += (glyph->XAdvance + Info->SpacingHoriz) * 4 * scale;
- }
- else
- {
- const FntGlyph* glyph = FindGlyph((unsigned short)c);
- if (!glyph)
- glyph = fallback_glyph;
- if (glyph)
- {
- const float char_width = (glyph->XAdvance + Info->SpacingHoriz) * scale;
-
- if (line_width + char_width >= max_width)
- break;
- line_width += char_width;
- }
- }
- }
-
- if (line_width > 0 || text_size.y == 0.0f)
- {
- if (text_size.x < line_width)
- text_size.x = line_width;
- text_size.y += line_height;
- }
-
- if (remaining)
- *remaining = s;
-
- return text_size;
- }
-
- ImVec2 ImBitmapFont::CalcTextSizeW(float size, float max_width, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining) const
- {
- if (max_width == 0.0f)
- max_width = FLT_MAX;
- if (!text_end)
- text_end = text_begin + ImStrlenW(text_begin);
-
- const float scale = size / (float)Info->FontSize;
- const float line_height = (float)Info->FontSize * scale;
- const FntGlyph* fallback_glyph = FindGlyph(GImGui.IO.FontFallbackGlyph);
-
- ImVec2 text_size = ImVec2(0,0);
- float line_width = 0.0f;
-
- const ImWchar* s = text_begin;
- while (s < text_end)
- {
- const unsigned int c = (unsigned int)(*s++);
-
- if (c == '\n')
- {
- if (text_size.x < line_width)
- text_size.x = line_width;
- text_size.y += line_height;
- line_width = 0;
- }
- else if (c == '\t')
- {
-
- if (const FntGlyph* glyph = FindGlyph((unsigned short)' '))
- line_width += (glyph->XAdvance + Info->SpacingHoriz) * 4 * scale;
- }
- else
- {
- const FntGlyph* glyph = FindGlyph((unsigned short)c);
- if (!glyph)
- glyph = fallback_glyph;
- if (glyph)
- {
- const float char_width = (glyph->XAdvance + Info->SpacingHoriz) * scale;
-
- if (line_width + char_width >= max_width)
- break;
- line_width += char_width;
- }
- }
- }
-
- if (line_width > 0 || text_size.y == 0.0f)
- {
- if (text_size.x < line_width)
- text_size.x = line_width;
- text_size.y += line_height;
- }
-
- if (remaining)
- *remaining = s;
-
- return text_size;
- }
-
- void ImBitmapFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect_ref, const char* text_begin, const char* text_end, ImDrawVert*& out_vertices) const
- {
- if (!text_end)
- text_end = text_begin + strlen(text_begin);
-
- const float line_height = (float)Info->FontSize;
- const float scale = size / (float)Info->FontSize;
- const float tex_scale_x = 1.0f / (float)Common->ScaleW;
- const float tex_scale_y = 1.0f / (float)(Common->ScaleH);
- const float outline = (float)Info->Outline;
- const FntGlyph* fallback_glyph = FindGlyph(GImGui.IO.FontFallbackGlyph);
-
-
- pos.x = (float)(int)pos.x;
- pos.y = (float)(int)pos.y + GImGui.IO.FontYOffset;
-
- const ImVec4 clip_rect = clip_rect_ref;
-
- float x = pos.x;
- float y = pos.y;
- for (const char* s = text_begin; s < text_end; )
- {
- unsigned int c;
- const int bytes_count = ImTextCharFromUtf8(&c, s, text_end);
- s += bytes_count > 0 ? bytes_count : 1;
- if (c >= 0x10000)
- continue;
-
- if (c == '\n')
- {
- x = pos.x;
- y += line_height * scale;
- continue;
- }
-
- const FntGlyph* glyph = FindGlyph((unsigned short)c);
- if (!glyph)
- glyph = fallback_glyph;
- if (glyph)
- {
- const float char_width = (glyph->XAdvance + Info->SpacingHoriz) * scale;
-
-
- if (c != ' ' && c != '\n')
- {
-
- const float y1 = (float)(y + (glyph->YOffset + outline*2) * scale);
- const float y2 = (float)(y1 + glyph->Height * scale);
- if (y1 > clip_rect.w || y2 < clip_rect.y)
- {
- x += char_width;
- continue;
- }
-
- const float x1 = (float)(x + (glyph->XOffset + outline) * scale);
- const float x2 = (float)(x1 + glyph->Width * scale);
- if (x1 > clip_rect.z || x2 < clip_rect.x)
- {
- x += char_width;
- continue;
- }
-
- const float s1 = (glyph->X) * tex_scale_x;
- const float t1 = (glyph->Y) * tex_scale_y;
- const float s2 = (glyph->X + glyph->Width) * tex_scale_x;
- const float t2 = (glyph->Y + glyph->Height) * tex_scale_y;
-
- out_vertices[0].pos = ImVec2(x1, y1);
- out_vertices[0].uv = ImVec2(s1, t1);
- out_vertices[0].col = col;
-
- out_vertices[1].pos = ImVec2(x2, y1);
- out_vertices[1].uv = ImVec2(s2, t1);
- out_vertices[1].col = col;
-
- out_vertices[2].pos = ImVec2(x2, y2);
- out_vertices[2].uv = ImVec2(s2, t2);
- out_vertices[2].col = col;
-
- out_vertices[3] = out_vertices[0];
- out_vertices[4] = out_vertices[2];
-
- out_vertices[5].pos = ImVec2(x1, y2);
- out_vertices[5].uv = ImVec2(s1, t2);
- out_vertices[5].col = col;
-
- out_vertices += 6;
- }
-
- x += char_width;
- }
- else if (c == '\t')
- {
- if (const FntGlyph* glyph = FindGlyph((unsigned short)' '))
- x += (glyph->XAdvance + Info->SpacingHoriz) * 4 * scale;
- }
- }
- }
-
-
-
-
-
- #if defined(_MSC_VER) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS)
-
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
-
-
- static const char* GetClipboardTextFn_DefaultImpl()
- {
- static char* buf_local = NULL;
- if (buf_local)
- {
- ImGui::MemFree(buf_local);
- buf_local = NULL;
- }
- if (!OpenClipboard(NULL))
- return NULL;
- HANDLE buf_handle = GetClipboardData(CF_TEXT);
- if (buf_handle == NULL)
- return NULL;
- if (char* buf_global = (char*)GlobalLock(buf_handle))
- buf_local = ImStrdup(buf_global);
- GlobalUnlock(buf_handle);
- CloseClipboard();
- return buf_local;
- }
-
-
- static void SetClipboardTextFn_DefaultImpl(const char* text)
- {
- if (!OpenClipboard(NULL))
- return;
- const char* text_end = text + strlen(text);
- const int buf_length = (int)(text_end - text) + 1;
- HGLOBAL buf_handle = GlobalAlloc(GMEM_MOVEABLE, buf_length * sizeof(char));
- if (buf_handle == NULL)
- return;
- char* buf_global = (char *)GlobalLock(buf_handle);
- memcpy(buf_global, text, text_end - text);
- buf_global[text_end - text] = 0;
- GlobalUnlock(buf_handle);
- EmptyClipboard();
- SetClipboardData(CF_TEXT, buf_handle);
- CloseClipboard();
- }
-
- #else
-
-
- static const char* GetClipboardTextFn_DefaultImpl()
- {
- return GImGui.PrivateClipboard;
- }
-
-
- static void SetClipboardTextFn_DefaultImpl(const char* text)
- {
- if (GImGui.PrivateClipboard)
- {
- ImGui::MemFree(GImGui.PrivateClipboard);
- GImGui.PrivateClipboard = NULL;
- }
- const char* text_end = text + strlen(text);
- GImGui.PrivateClipboard = (char*)ImGui::MemAlloc((size_t)(text_end - text) + 1);
- memcpy(GImGui.PrivateClipboard, text, (size_t)(text_end - text));
- GImGui.PrivateClipboard[(size_t)(text_end - text)] = 0;
- }
-
- #endif
-
-
-
-
-
- namespace ImGui
- {
-
- void ShowUserGuide()
- {
- ImGuiState& g = GImGui;
-
- ImGui::BulletText("Double-click on title bar to collapse window.");
- ImGui::BulletText("Click and drag on lower right corner to resize window.");
- ImGui::BulletText("Click and drag on any empty space to move window.");
- ImGui::BulletText("Mouse Wheel to scroll.");
- if (g.IO.FontAllowUserScaling)
- ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents.");
- ImGui::BulletText("TAB/SHIFT+TAB to cycle thru keyboard editable fields.");
- ImGui::BulletText("CTRL+Click on a slider to input text.");
- ImGui::BulletText(
- "While editing text:\n"
- "- Hold SHIFT or use mouse to select text\n"
- "- CTRL+Left/Right to word jump\n"
- "- CTRL+A select all\n"
- "- CTRL+X,CTRL+C,CTRL+V clipboard\n"
- "- CTRL+Z,CTRL+Y undo/redo\n"
- "- ESCAPE to revert\n"
- "- You can apply arithmetic operators +,*,/ on numerical values.\n"
- " Use +- to subtract.\n");
- }
-
- void ShowStyleEditor(ImGuiStyle* ref)
- {
- ImGuiState& g = GImGui;
- ImGuiStyle& style = g.Style;
-
- const ImGuiStyle def;
-
- if (ImGui::Button("Revert Style"))
- g.Style = ref ? *ref : def;
- if (ref)
- {
- ImGui::SameLine();
- if (ImGui::Button("Save Style"))
- *ref = g.Style;
- }
-
- ImGui::PushItemWidth(ImGui::GetWindowWidth()*0.55f);
-
- if (ImGui::TreeNode("Sizes"))
- {
- ImGui::SliderFloat("Alpha", &style.Alpha, 0.20f, 1.0f, "%.2f");
- ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 16.0f, "%.0f");
- ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat("TreeNodeSpacing", &style.TreeNodeSpacing, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat("ScrollBarWidth", &style.ScrollBarWidth, 0.0f, 20.0f, "%.0f");
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Colors"))
- {
- static ImGuiColorEditMode edit_mode = ImGuiColorEditMode_RGB;
- ImGui::RadioButton("RGB", &edit_mode, ImGuiColorEditMode_RGB);
- ImGui::SameLine();
- ImGui::RadioButton("HSV", &edit_mode, ImGuiColorEditMode_HSV);
- ImGui::SameLine();
- ImGui::RadioButton("HEX", &edit_mode, ImGuiColorEditMode_HEX);
-
- static ImGuiTextFilter filter;
- filter.Draw("Filter colors", 200);
-
- ImGui::ColorEditMode(edit_mode);
- for (int i = 0; i < ImGuiCol_COUNT; i++)
- {
- const char* name = GetStyleColorName(i);
- if (!filter.PassFilter(name))
- continue;
- ImGui::PushID(i);
- ImGui::ColorEdit4(name, (float*)&style.Colors[i], true);
- if (memcmp(&style.Colors[i], (ref ? &ref->Colors[i] : &def.Colors[i]), sizeof(ImVec4)) != 0)
- {
- ImGui::SameLine(); if (ImGui::Button("Revert")) style.Colors[i] = ref ? ref->Colors[i] : def.Colors[i];
- if (ref) { ImGui::SameLine(); if (ImGui::Button("Save")) ref->Colors[i] = style.Colors[i]; }
- }
- ImGui::PopID();
- }
- ImGui::TreePop();
- }
-
- ImGui::PopItemWidth();
- }
-
-
-
-
-
-
- void ShowTestWindow(bool* open)
- {
- static bool no_titlebar = false;
- static bool no_border = true;
- static bool no_resize = false;
- static bool no_move = false;
- static bool no_scrollbar = false;
- static float fill_alpha = 0.65f;
-
- const ImGuiWindowFlags layout_flags = (no_titlebar ? ImGuiWindowFlags_NoTitleBar : 0) | (no_border ? 0 : ImGuiWindowFlags_ShowBorders) | (no_resize ? ImGuiWindowFlags_NoResize : 0) | (no_move ? ImGuiWindowFlags_NoMove : 0) | (no_scrollbar ? ImGuiWindowFlags_NoScrollbar : 0);
- ImGui::Begin("ImGui Test", open, ImVec2(550,680), fill_alpha, layout_flags);
- ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f);
-
- ImGui::Text("ImGui says hello.");
-
-
-
- ImGui::Spacing();
- if (ImGui::CollapsingHeader("Help"))
- {
- ImGui::ShowUserGuide();
- }
-
- if (ImGui::CollapsingHeader("Window options"))
- {
- ImGui::Checkbox("no titlebar", &no_titlebar); ImGui::SameLine(150);
- ImGui::Checkbox("no border", &no_border); ImGui::SameLine(300);
- ImGui::Checkbox("no resize", &no_resize);
- ImGui::Checkbox("no move", &no_move); ImGui::SameLine(150);
- ImGui::Checkbox("no scrollbar", &no_scrollbar);
- ImGui::SliderFloat("fill alpha", &fill_alpha, 0.0f, 1.0f);
- if (ImGui::TreeNode("Style Editor"))
- {
- ImGui::ShowStyleEditor();
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Logging"))
- {
- ImGui::LogButtons();
- ImGui::TreePop();
- }
- }
-
- if (ImGui::CollapsingHeader("Widgets"))
- {
-
-
- static bool a=false;
- if (ImGui::Button("Button")) { printf("Clicked\n"); a ^= 1; }
- if (a)
- {
- ImGui::SameLine();
- ImGui::Text("Thanks for clicking me!");
- }
-
- static bool check = true;
- ImGui::Checkbox("checkbox", &check);
-
- if (ImGui::TreeNode("Tree"))
- {
- for (size_t i = 0; i < 5; i++)
- {
- if (ImGui::TreeNode((void*)i, "Child %d", i))
- {
- ImGui::Text("blah blah");
- ImGui::SameLine();
- if (ImGui::SmallButton("print"))
- printf("Child %d pressed", (int)i);
- ImGui::TreePop();
- }
- }
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Bullets"))
- {
- ImGui::BulletText("Bullet point 1");
- ImGui::BulletText("Bullet point 2\nOn multiple lines");
- ImGui::BulletText("Bullet point 3");
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Colored Text"))
- {
-
- ImGui::TextColored(ImVec4(1.0f,0.0f,1.0f,1.0f), "Pink");
- ImGui::TextColored(ImVec4(1.0f,1.0f,0.0f,1.0f), "Yellow");
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("UTF-8 Text"))
- {
-
-
-
-
-
- ImGui::Text("(CJK text will only appears if the font supports it. Please check in\nthe extra_fonts/ folder if you intend to use non-ASCII characters.\nNote that characters values are preserved even if the font cannot be\ndisplayed, so you can safely copy & paste garbled characters.)");
- ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)");
- ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
- static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e";
- ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf));
- ImGui::TreePop();
- }
-
-
- static int e = 0;
- ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine();
- ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine();
- ImGui::RadioButton("radio c", &e, 2);
-
- ImGui::Text("Hover me");
- if (ImGui::IsHovered())
- ImGui::SetTooltip("I am a tooltip");
-
- ImGui::SameLine();
- ImGui::Text("- or me");
- if (ImGui::IsHovered())
- {
- ImGui::BeginTooltip();
- ImGui::Text("I am a fancy tooltip");
- static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
- ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr));
- ImGui::EndTooltip();
- }
-
- ImGui::Separator();
- ImGui::Text("^ Horizontal separator");
-
- static int item = 1;
- ImGui::Combo("combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
-
- const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK" };
- static int item2 = -1;
- ImGui::Combo("combo scroll", &item2, items, IM_ARRAYSIZE(items));
-
- static char str0[128] = "Hello, world!";
- static int i0=123;
- static float f0=0.001f;
- ImGui::InputText("string", str0, IM_ARRAYSIZE(str0));
- ImGui::InputInt("input int", &i0);
- ImGui::InputFloat("input float", &f0, 0.01f, 1.0f);
-
-
-
-
- static float vec3a[3] = { 0.10f, 0.20f, 0.30f };
- ImGui::InputFloat3("input float3", vec3a);
-
-
-
-
- static int i1=0;
- static int i2=42;
- ImGui::SliderInt("int 0..3", &i1, 0, 3);
- ImGui::SliderInt("int -100..100", &i2, -100, 100);
-
- static float f1=1.123f;
- static float f2=0;
- static float f3=0;
- static float f4=123456789.0f;
- ImGui::SliderFloat("float", &f1, 0.0f, 2.0f);
- ImGui::SliderFloat("log float", &f2, 0.0f, 10.0f, "%.4f", 2.0f);
- ImGui::SliderFloat("signed log float", &f3, -10.0f, 10.0f, "%.4f", 3.0f);
- ImGui::SliderFloat("unbound float", &f4, -FLT_MAX, FLT_MAX, "%.4f");
- static float angle = 0.0f;
- ImGui::SliderAngle("angle", &angle);
-
-
-
-
- static float vec3b[3] = { 0.10f, 0.20f, 0.30f };
- ImGui::SliderFloat3("slider float3", vec3b, 0.0f, 1.0f);
-
-
-
-
- static float col1[3] = { 1.0f,0.0f,0.2f };
- static float col2[4] = { 0.4f,0.7f,0.0f,0.5f };
- ImGui::ColorEdit3("color 1", col1);
- ImGui::ColorEdit4("color 2", col2);
-
-
- }
-
- if (ImGui::CollapsingHeader("Graphs widgets"))
- {
- static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
- ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
-
- static bool pause;
- static ImVector<float> values; if (values.empty()) { values.resize(100); memset(&values.front(), 0, values.size()*sizeof(float)); }
- static size_t values_offset = 0;
- if (!pause)
- {
-
- static float refresh_time = -1.0f;
- if (ImGui::GetTime() > refresh_time + 1.0f/60.0f)
- {
- refresh_time = ImGui::GetTime();
- static float phase = 0.0f;
- values[values_offset] = cos(phase);
- values_offset = (values_offset+1)%values.size();
- phase += 0.10f*values_offset;
- }
- }
- ImGui::PlotLines("Frame Times", &values.front(), (int)values.size(), (int)values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,70));
-
- ImGui::SameLine(); ImGui::Checkbox("pause", &pause);
- ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,70));
- }
-
- if (ImGui::CollapsingHeader("Widgets on same line"))
- {
-
- ImGui::Text("Hello");
- ImGui::SameLine();
- ImGui::Text("World");
-
-
- if (ImGui::Button("Banana")) printf("Pressed!\n");
- ImGui::SameLine();
- ImGui::Button("Apple");
- ImGui::SameLine();
- ImGui::Button("Corniflower");
-
-
- ImGui::SmallButton("Banana");
- ImGui::SameLine();
- ImGui::SmallButton("Apple");
- ImGui::SameLine();
- ImGui::SmallButton("Corniflower");
- ImGui::SameLine();
- ImGui::Text("Small buttons fit in a text block");
-
-
- static bool c1=false,c2=false,c3=false,c4=false;
- ImGui::Checkbox("My", &c1);
- ImGui::SameLine();
- ImGui::Checkbox("Tailor", &c2);
- ImGui::SameLine();
- ImGui::Checkbox("Is", &c3);
- ImGui::SameLine();
- ImGui::Checkbox("Rich", &c4);
-
-
- static float f0=1.0f, f1=2.0f, f2=3.0f;
- ImGui::PushItemWidth(80);
- ImGui::SliderFloat("f0", &f0, 0.0f,5.0f);
- ImGui::SameLine();
- ImGui::SliderFloat("f1", &f1, 0.0f,5.0f);
- ImGui::SameLine();
- ImGui::SliderFloat("f2", &f2, 0.0f,5.0f);
-
-
- static char s0[128] = "one", s1[128] = "two", s2[128] = "three";
- ImGui::InputText("s0", s0, 128);
- ImGui::SameLine();
- ImGui::InputText("s1", s1, 128);
- ImGui::SameLine();
- ImGui::InputText("s2", s2, 128);
-
-
- ImGui::LabelText("l0", "one");
- ImGui::SameLine();
- ImGui::LabelText("l0", "two");
- ImGui::SameLine();
- ImGui::LabelText("l0", "three");
- ImGui::PopItemWidth();
- }
-
- if (ImGui::CollapsingHeader("Child regions"))
- {
- ImGui::Text("Without border");
- static int line = 50;
- bool goto_line = ImGui::Button("Goto");
- ImGui::SameLine();
- ImGui::PushItemWidth(100);
- goto_line |= ImGui::InputInt("##Line", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue);
- ImGui::PopItemWidth();
- ImGui::BeginChild("Sub1", ImVec2(ImGui::GetWindowWidth()*0.5f,300));
- for (int i = 0; i < 100; i++)
- {
- ImGui::Text("%04d: scrollable region", i);
- if (goto_line && line == i)
- ImGui::SetScrollPosHere();
- }
- if (goto_line && line >= 100)
- ImGui::SetScrollPosHere();
- ImGui::EndChild();
-
- ImGui::SameLine();
-
- ImGui::BeginChild("Sub2", ImVec2(0,300), true);
- ImGui::Text("With border");
- ImGui::Columns(2);
- for (int i = 0; i < 100; i++)
- {
- char buf[32];
- ImFormatString(buf, IM_ARRAYSIZE(buf), "%08x", i*5731);
- ImGui::Button(buf);
- ImGui::NextColumn();
- }
- ImGui::EndChild();
- }
-
- if (ImGui::CollapsingHeader("Columns"))
- {
- ImGui::Columns(4, "data", true);
- ImGui::Text("ID"); ImGui::NextColumn();
- ImGui::Text("Name"); ImGui::NextColumn();
- ImGui::Text("Path"); ImGui::NextColumn();
- ImGui::Text("Flags"); ImGui::NextColumn();
- ImGui::Separator();
-
- ImGui::Text("0000"); ImGui::NextColumn();
- ImGui::Text("Robert"); ImGui::NextColumn();
- ImGui::Text("/path/robert"); ImGui::NextColumn();
- ImGui::Text("...."); ImGui::NextColumn();
-
- ImGui::Text("0001"); ImGui::NextColumn();
- ImGui::Text("Stephanie"); ImGui::NextColumn();
- ImGui::Text("/path/stephanie"); ImGui::NextColumn();
- ImGui::Text("...."); ImGui::NextColumn();
-
- ImGui::Text("0002"); ImGui::NextColumn();
- ImGui::Text("C64"); ImGui::NextColumn();
- ImGui::Text("/path/computer"); ImGui::NextColumn();
- ImGui::Text("...."); ImGui::NextColumn();
- ImGui::Columns(1);
-
- ImGui::Separator();
-
- ImGui::Columns(3, "mixed");
- ImGui::Text("Hello"); ImGui::NextColumn();
- ImGui::Text("World"); ImGui::NextColumn();
- ImGui::Text("Hmm..."); ImGui::NextColumn();
-
- ImGui::Button("Banana"); ImGui::NextColumn();
- ImGui::Button("Apple"); ImGui::NextColumn();
- ImGui::Button("Corniflower"); ImGui::NextColumn();
-
- static int e = 0;
- ImGui::RadioButton("radio a", &e, 0); ImGui::NextColumn();
- ImGui::RadioButton("radio b", &e, 1); ImGui::NextColumn();
- ImGui::RadioButton("radio c", &e, 2); ImGui::NextColumn();
- ImGui::Columns(1);
-
- ImGui::Separator();
-
- ImGui::Columns(2, "multiple components");
- static float foo = 1.0f;
- ImGui::InputFloat("red", &foo, 0.05f, 0, 3); ImGui::NextColumn();
- static float bar = 1.0f;
- ImGui::InputFloat("blue", &bar, 0.05f, 0, 3); ImGui::NextColumn();
- ImGui::Columns(1);
-
- ImGui::Separator();
-
- if (ImGui::TreeNode("Inside a tree.."))
- {
- if (ImGui::TreeNode("node 1 (with borders)"))
- {
- ImGui::Columns(4);
- ImGui::Text("aaa"); ImGui::NextColumn();
- ImGui::Text("bbb"); ImGui::NextColumn();
- ImGui::Text("ccc"); ImGui::NextColumn();
- ImGui::Text("ddd"); ImGui::NextColumn();
- ImGui::Text("eee"); ImGui::NextColumn();
- ImGui::Text("fff"); ImGui::NextColumn();
- ImGui::Text("ggg"); ImGui::NextColumn();
- ImGui::Text("hhh"); ImGui::NextColumn();
- ImGui::Columns(1);
- ImGui::TreePop();
- }
- if (ImGui::TreeNode("node 2 (without borders)"))
- {
- ImGui::Columns(4, NULL, false);
- ImGui::Text("aaa"); ImGui::NextColumn();
- ImGui::Text("bbb"); ImGui::NextColumn();
- ImGui::Text("ccc"); ImGui::NextColumn();
- ImGui::Text("ddd"); ImGui::NextColumn();
- ImGui::Text("eee"); ImGui::NextColumn();
- ImGui::Text("fff"); ImGui::NextColumn();
- ImGui::Text("ggg"); ImGui::NextColumn();
- ImGui::Text("hhh"); ImGui::NextColumn();
- ImGui::Columns(1);
- ImGui::TreePop();
- }
- ImGui::TreePop();
- }
- }
-
- if (ImGui::CollapsingHeader("Filtering"))
- {
- static ImGuiTextFilter filter;
- ImGui::Text("Filter usage:\n"
- " \"\" display all lines\n"
- " \"xxx\" display lines containing \"xxx\"\n"
- " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n"
- " \"-xxx\" hide lines containing \"xxx\"");
- filter.Draw();
- const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" };
- for (size_t i = 0; i < IM_ARRAYSIZE(lines); i++)
- if (filter.PassFilter(lines[i]))
- ImGui::BulletText("%s", lines[i]);
- }
-
- if (ImGui::CollapsingHeader("Long text"))
- {
- static ImGuiTextBuffer log;
- static int lines = 0;
- ImGui::Text("Printing unusually long amount of text.");
- ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size());
- if (ImGui::Button("Clear")) { log.clear(); lines = 0; }
- ImGui::SameLine();
- if (ImGui::Button("Add 1000 lines"))
- {
- for (int i = 0; i < 1000; i++)
- log.append("%i The quick brown fox jumps over the lazy dog\n", lines+i);
- lines += 1000;
- }
- ImGui::BeginChild("Log");
- ImGui::TextUnformatted(log.begin(), log.end());
- ImGui::EndChild();
- }
-
- ImGui::End();
- }
-
-
- };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- static const unsigned int proggy_clean_13_png_size = 1557;
- static const unsigned int proggy_clean_13_png_data[1560/4] =
- {
- 0x474e5089, 0x0a1a0a0d, 0x0d000000, 0x52444849, 0x00010000, 0x80000000, 0x00000308, 0x476bd300, 0x00000038, 0x544c5006, 0x00000045, 0xa5ffffff,
- 0x00dd9fd9, 0x74010000, 0x00534e52, 0x66d8e640, 0xbd050000, 0x54414449, 0x9bed5e78, 0x30e36e51, 0xeef5440c, 0x31fde97f, 0x584ec0f0, 0x681ace39,
- 0xca120e6b, 0x1c5a28a6, 0xc5d98a89, 0x1a3d602e, 0x323c0043, 0xf6bc9e68, 0xbe3ad62c, 0x3d60260f, 0x82d60096, 0xe0bfc707, 0xfb9bf1d1, 0xbf0267ac,
- 0x1600260f, 0x061229c0, 0x0000c183, 0x37162c58, 0xdfa088fc, 0xde7d5704, 0x77fcbb80, 0x48e5c3f1, 0x73d8b8f8, 0xc4af7802, 0x1ca111ad, 0x0001ed7a,
- 0x76eda3ef, 0xb78d3e00, 0x801c7203, 0x0215c0b1, 0x0410b044, 0xa85100d4, 0x07627ec7, 0x0cf83fa8, 0x94001a22, 0xf87347f1, 0xdcb5cfc1, 0x1c3880cc,
- 0xd4e034ca, 0xfa928d9d, 0xb0167e31, 0x325cc570, 0x4bbd584b, 0xbd4e6574, 0x70bae084, 0xf0c0008a, 0x3f601ddb, 0x0bba506a, 0xa58a0082, 0x5b46946e,
- 0x720a4ccd, 0xdfaaed39, 0x25dc8042, 0x7ee403f4, 0x2ad69cc9, 0x6c4b3009, 0x429037ed, 0x0293f875, 0x1a69dced, 0xab120198, 0x61c01d88, 0xcf2e43dc,
- 0xfc3c00ef, 0xc049a270, 0xdbbea582, 0x0d592601, 0xc3c9a8dd, 0x5013d143, 0x19a47bbb, 0xf89253dd, 0x0a9901dc, 0x38900ecd, 0xb2dec9d7, 0xc2b91230,
- 0xb8e0106f, 0x976404cb, 0x5d83c3f3, 0x6e8086fd, 0x5c9ab007, 0xf50354f6, 0xe7e72002, 0x4bc870ca, 0xab49736f, 0xc137c6e0, 0xa9aa6ff3, 0xbff84f2f,
- 0x673e6e20, 0xf6e3c7e0, 0x618fe05a, 0x39ca2a00, 0x93ca03b4, 0x3a9d2728, 0xbbebba41, 0xce0e3681, 0x6e29ec05, 0x111eca83, 0xfdfe7ec1, 0xa7c8a75b,
- 0xac6bc3ab, 0x72a5bc25, 0x9f612c1c, 0x378ec05e, 0x7202b157, 0x789e5a82, 0x5256bc0e, 0xcb900996, 0x10721105, 0x00823ce0, 0x69ab59fb, 0x39c72084,
- 0xf5e37b25, 0xd1794700, 0x538d0637, 0x9a2bff4f, 0xce0d43a4, 0xa6da7ed2, 0xd7095132, 0xf5ad6232, 0x9aaa8e9c, 0xd8d1d3ed, 0x058940a1, 0x21f00d64,
- 0x89a5c9de, 0x021b3f24, 0x77a97aac, 0x714be65a, 0x5e2d57ae, 0x27e3610f, 0x28809288, 0x36b9559f, 0xd00e347a, 0x0094e385, 0x565d034d, 0x7f52d5f2,
- 0x9aea81de, 0x5e804909, 0x010d7f0a, 0x8f0d3fb1, 0xbbce23bc, 0x375e85ac, 0x01fa03b9, 0xc0526c3a, 0xf7866870, 0x9d46d804, 0x158ebf64, 0x7bd534c5,
- 0xd80cf202, 0x410ee80f, 0x79419915, 0x74a844ae, 0x94119881, 0xcbbcc0fc, 0xa263d471, 0x013d0269, 0x67f6a0f8, 0x3e4474d0, 0xd1e50cb5, 0x56fd0e60,
- 0xc4c0fd4c, 0x940629ff, 0xe18a7a16, 0xcca0330f, 0xb8ed50b7, 0x6935778b, 0x3735c791, 0x3909eb94, 0x0be36620, 0x0ac0d7aa, 0xefe942c9, 0xf0092727,
- 0x5c020ee2, 0x0246da53, 0xa24be8bc, 0xa891ab94, 0xd012c7e2, 0x9c115954, 0xde0dac8e, 0x555dc022, 0x59e84f77, 0xbed2cf80, 0xe9af2cda, 0x4b600716,
- 0x8955bd80, 0x7098c3f3, 0x25a8466a, 0x4ddbf26a, 0x5f554753, 0xf4890f28, 0x886a27ab, 0x54a00413, 0x0a157ca9, 0x52909a80, 0x7122a312, 0x0024a75c,
- 0xe6d72935, 0xecde29cf, 0x025de009, 0x7995a6aa, 0x4a180491, 0x013df0d8, 0xe009edba, 0xd40019dc, 0x45b36b2a, 0x0122eb0d, 0x6e80a79f, 0x746590f5,
- 0xd1a6dd49, 0xc05954b6, 0x83d4b957, 0xa00fe5b1, 0x59695ad7, 0xcff8433d, 0x44a0f340, 0xdd226c73, 0x5537f08c, 0xe1e89c32, 0x431056af, 0x233eb000,
- 0x60773f40, 0xed7e490a, 0xc160091f, 0x12829db5, 0x43fbe6cf, 0x0a6b26c2, 0xd5f0f35a, 0xfc09fda8, 0x73525f8c, 0x2ea38cf9, 0x32bc410b, 0x94a60a22,
- 0x1f62a42b, 0x5f290034, 0x07beaa91, 0x1e8ccb40, 0x17d6b0f9, 0xa2a017c9, 0x4c79a610, 0xa1de6525, 0xe975029f, 0xe063585f, 0x6246cfbb, 0x04acad44,
- 0xe6a05138, 0xd03d8434, 0xc9950013, 0x5d4c809e, 0xfd26932d, 0x739213ac, 0xe260d8ef, 0xe4164617, 0x16fc60aa, 0x1d0b21e7, 0x445004b4, 0x13fd1b59,
- 0x56b0f804, 0xaa936a3a, 0x335459c1, 0xb37f8caa, 0x06b68e03, 0x14d5eb01, 0x8300c78c, 0x9674792a, 0x20ba791b, 0x4d88024d, 0xef747354, 0x451e673e,
- 0xc4dafc9a, 0xe53b9cd1, 0x32b4011a, 0x3d702c0f, 0x09bc0b40, 0x220d277d, 0x47eb7809, 0x8a946500, 0x7a28c4bd, 0x96e00f99, 0xc04365da, 0x05edcf46,
- 0x7dee2c27, 0xe6020b7f, 0x159ecedf, 0xcbdb00ff, 0x516bb9e3, 0xd0716161, 0xeba75956, 0xf17fc22b, 0x5c578beb, 0xfe474a09, 0xc1750a87, 0xe384c189,
- 0x5df54e26, 0xa6f76b79, 0xd4b172be, 0x3e8d5ceb, 0x832d90ec, 0x180368e7, 0x354c724d, 0x1a8b1412, 0x8de07be9, 0xaf009efe, 0x4616c621, 0x2860eb01,
- 0x244f1404, 0xc3de724b, 0x6497a802, 0xab2f4419, 0x4e02910d, 0xe3ecf410, 0x7a6404a8, 0x8c72b112, 0xde5bc706, 0xd4f8ffe9, 0x50176344, 0x7b49fe7d,
- 0x02c1d88c, 0x25634a40, 0x194804f7, 0x03b76d84, 0x392bde58, 0xdeebad27, 0xc160c021, 0xa97a72db, 0xa8040b83, 0x78804f3e, 0x046b9433, 0x178cc824,
- 0x62800897, 0x7010370b, 0x21cfe7e4, 0x8053ec40, 0xf9d60526, 0xae9d353f, 0x069b40c7, 0x80496f14, 0x57e682b3, 0x6e0273e0, 0x974e2e28, 0x60ab7c3d,
- 0x2025ba33, 0x507b3a8c, 0x12b70173, 0xd095c400, 0xee012d96, 0x6e194c9a, 0xe5933f89, 0x43b70102, 0xf30306aa, 0xc5802189, 0x53c077c3, 0x86029009,
- 0xa0c1e780, 0xa4c04c1f, 0x93dbd580, 0xf8149809, 0x06021893, 0x3060c183, 0x83060c18, 0x183060c1, 0xc183060c, 0x0c183060, 0x60c18306, 0xfe0c1830,
- 0x0cb69501, 0x7a40d9df, 0x000000dd, 0x4e454900, 0x6042ae44, 0x00000082,
- };
-
- static const unsigned int proggy_clean_13_fnt_size = 4647;
- static const unsigned int proggy_clean_13_fnt_data[4648/4] =
- {
- 0x03464d42, 0x00001a01, 0x40000d00, 0x01006400, 0x00000000, 0x50000101, 0x67676f72, 0x656c4379, 0x02006e61, 0x0000000f, 0x000a000d, 0x00800100,
- 0x01000001, 0x03000000, 0x00000016, 0x676f7270, 0x635f7967, 0x6e61656c, 0x5f33315f, 0x6e702e30, 0xd0040067, 0x00000011, 0x2e000000, 0x07000e00,
- 0x00000d00, 0x07000000, 0x010f0000, 0x36000000, 0x05003800, 0x01000d00, 0x07000000, 0x020f0000, 0x86000000, 0x07000e00, 0x00000d00, 0x07000000,
- 0x030f0000, 0x07000000, 0x06001c00, 0x01000d00, 0x07000000, 0x040f0000, 0x15000000, 0x06001c00, 0x01000d00, 0x07000000, 0x050f0000, 0x23000000,
- 0x06001c00, 0x01000d00, 0x07000000, 0x060f0000, 0x31000000, 0x06001c00, 0x01000d00, 0x07000000, 0x070f0000, 0xfc000000, 0x03003800, 0x02000d00,
- 0x07000000, 0x080f0000, 0x54000000, 0x05003800, 0x01000d00, 0x07000000, 0x090f0000, 0x4d000000, 0x06001c00, 0x01000d00, 0x07000000, 0x0a0f0000,
- 0xa8000000, 0x06001c00, 0x01000d00, 0x07000000, 0x0b0f0000, 0x6a000000, 0x04004600, 0x00000d00, 0x07000000, 0x0c0f0000, 0x74000000, 0x04004600,
- 0x00000d00, 0x07000000, 0x0d0f0000, 0x88000000, 0x04004600, 0x03000d00, 0x07000000, 0x0e0f0000, 0x65000000, 0x04004600, 0x03000d00, 0x07000000,
- 0x0f0f0000, 0x36000000, 0x07000e00, 0x00000d00, 0x07000000, 0x100f0000, 0x5a000000, 0x05003800, 0x00000d00, 0x07000000, 0x110f0000, 0x60000000,
- 0x05003800, 0x00000d00, 0x07000000, 0x120f0000, 0xe4000000, 0x03004600, 0x01000d00, 0x07000000, 0x130f0000, 0xe0000000, 0x03004600, 0x01000d00,
- 0x07000000, 0x140f0000, 0x66000000, 0x05003800, 0x00000d00, 0x07000000, 0x150f0000, 0x6c000000, 0x05003800, 0x00000d00, 0x07000000, 0x160f0000,
- 0x72000000, 0x05003800, 0x00000d00, 0x07000000, 0x170f0000, 0xd8000000, 0x03004600, 0x00000d00, 0x07000000, 0x180f0000, 0xcc000000, 0x03004600,
- 0x01000d00, 0x07000000, 0x190f0000, 0xc8000000, 0x03004600, 0x02000d00, 0x07000000, 0x1a0f0000, 0x78000000, 0x05003800, 0x00000d00, 0x07000000,
- 0x1b0f0000, 0x84000000, 0x05003800, 0x00000d00, 0x07000000, 0x1c0f0000, 0x00000000, 0x15000000, 0xf9000d00, 0x070000ff, 0x1d0f0000, 0xb0000000,
- 0x15000000, 0xf9000d00, 0x070000ff, 0x1e0f0000, 0x2c000000, 0x15000000, 0xf9000d00, 0x070000ff, 0x200f0000, 0x9a000000, 0x15000000, 0xf9000d00,
- 0x070000ff, 0x210f0000, 0x0c000000, 0x01005400, 0x03000d00, 0x07000000, 0x220f0000, 0xbc000000, 0x03004600, 0x02000d00, 0x07000000, 0x230f0000,
- 0x4e000000, 0x07000e00, 0x00000d00, 0x07000000, 0x240f0000, 0x8a000000, 0x05003800, 0x01000d00, 0x07000000, 0x250f0000, 0xa6000000, 0x07000e00,
- 0x00000d00, 0x07000000, 0x260f0000, 0xf4000000, 0x06000e00, 0x01000d00, 0x07000000, 0x270f0000, 0x06000000, 0x01005400, 0x03000d00, 0x07000000,
- 0x280f0000, 0xb8000000, 0x03004600, 0x02000d00, 0x07000000, 0x290f0000, 0xb4000000, 0x03004600, 0x02000d00, 0x07000000, 0x2a0f0000, 0x90000000,
- 0x05003800, 0x01000d00, 0x07000000, 0x2b0f0000, 0x96000000, 0x05003800, 0x01000d00, 0x07000000, 0x2c0f0000, 0xe8000000, 0x02004600, 0x01000d00,
- 0x07000000, 0x2d0f0000, 0x9c000000, 0x05003800, 0x01000d00, 0x07000000, 0x2e0f0000, 0x04000000, 0x01005400, 0x02000d00, 0x07000000, 0x2f0f0000,
- 0xa2000000, 0x05003800, 0x01000d00, 0x07000000, 0x300f0000, 0xae000000, 0x05003800, 0x01000d00, 0x07000000, 0x310f0000, 0xd8000000, 0x05003800,
- 0x01000d00, 0x07000000, 0x320f0000, 0xfa000000, 0x05000000, 0x01000d00, 0x07000000, 0x330f0000, 0x31000000, 0x05002a00, 0x01000d00, 0x07000000,
- 0x340f0000, 0x3f000000, 0x06001c00, 0x01000d00, 0x07000000, 0x350f0000, 0x37000000, 0x05002a00, 0x01000d00, 0x07000000, 0x360f0000, 0x3d000000,
- 0x05002a00, 0x01000d00, 0x07000000, 0x370f0000, 0x43000000, 0x05002a00, 0x01000d00, 0x07000000, 0x380f0000, 0x49000000, 0x05002a00, 0x01000d00,
- 0x07000000, 0x390f0000, 0x4f000000, 0x05002a00, 0x01000d00, 0x07000000, 0x3a0f0000, 0x02000000, 0x01005400, 0x03000d00, 0x07000000, 0x3b0f0000,
- 0xfa000000, 0x02004600, 0x01000d00, 0x07000000, 0x3c0f0000, 0x77000000, 0x06001c00, 0x00000d00, 0x07000000, 0x3d0f0000, 0x7e000000, 0x06001c00,
- 0x01000d00, 0x07000000, 0x3e0f0000, 0x85000000, 0x06001c00, 0x01000d00, 0x07000000, 0x3f0f0000, 0x55000000, 0x05002a00, 0x01000d00, 0x07000000,
- 0x400f0000, 0xae000000, 0x07000e00, 0x00000d00, 0x07000000, 0x410f0000, 0xe0000000, 0x06001c00, 0x01000d00, 0x07000000, 0x420f0000, 0xa1000000,
- 0x06001c00, 0x01000d00, 0x07000000, 0x430f0000, 0x5b000000, 0x05002a00, 0x01000d00, 0x07000000, 0x440f0000, 0xaf000000, 0x06001c00, 0x01000d00,
- 0x07000000, 0x450f0000, 0x61000000, 0x05002a00, 0x01000d00, 0x07000000, 0x460f0000, 0x67000000, 0x05002a00, 0x01000d00, 0x07000000, 0x470f0000,
- 0x38000000, 0x06001c00, 0x01000d00, 0x07000000, 0x480f0000, 0x8c000000, 0x06001c00, 0x01000d00, 0x07000000, 0x490f0000, 0xa0000000, 0x03004600,
- 0x02000d00, 0x07000000, 0x4a0f0000, 0x97000000, 0x04004600, 0x01000d00, 0x07000000, 0x4b0f0000, 0xb6000000, 0x06001c00, 0x01000d00, 0x07000000,
- 0x4c0f0000, 0x6d000000, 0x05002a00, 0x01000d00, 0x07000000, 0x4d0f0000, 0x1e000000, 0x07000e00, 0x00000d00, 0x07000000, 0x4e0f0000, 0x23000000,
- 0x06002a00, 0x01000d00, 0x07000000, 0x4f0f0000, 0xed000000, 0x06000e00, 0x01000d00, 0x07000000, 0x500f0000, 0x73000000, 0x05002a00, 0x01000d00,
- 0x07000000, 0x510f0000, 0x00000000, 0x06001c00, 0x01000d00, 0x07000000, 0x520f0000, 0x0e000000, 0x06001c00, 0x01000d00, 0x07000000, 0x530f0000,
- 0x1c000000, 0x06001c00, 0x01000d00, 0x07000000, 0x540f0000, 0x66000000, 0x07000e00, 0x00000d00, 0x07000000, 0x550f0000, 0x2a000000, 0x06001c00,
- 0x01000d00, 0x07000000, 0x560f0000, 0x6e000000, 0x07000e00, 0x00000d00, 0x07000000, 0x570f0000, 0x76000000, 0x07000e00, 0x00000d00, 0x07000000,
- 0x580f0000, 0x46000000, 0x06001c00, 0x01000d00, 0x07000000, 0x590f0000, 0x7e000000, 0x07000e00, 0x00000d00, 0x07000000, 0x5a0f0000, 0x54000000,
- 0x06001c00, 0x01000d00, 0x07000000, 0x5b0f0000, 0x9c000000, 0x03004600, 0x02000d00, 0x07000000, 0x5c0f0000, 0x79000000, 0x05002a00, 0x01000d00,
- 0x07000000, 0x5d0f0000, 0xdc000000, 0x03004600, 0x02000d00, 0x07000000, 0x5e0f0000, 0x7f000000, 0x05002a00, 0x01000d00, 0x07000000, 0x5f0f0000,
- 0xc6000000, 0x07000e00, 0x00000d00, 0x07000000, 0x600f0000, 0xfd000000, 0x02004600, 0x02000d00, 0x07000000, 0x610f0000, 0x85000000, 0x05002a00,
- 0x01000d00, 0x07000000, 0x620f0000, 0x8b000000, 0x05002a00, 0x01000d00, 0x07000000, 0x630f0000, 0x91000000, 0x05002a00, 0x01000d00, 0x07000000,
- 0x640f0000, 0x97000000, 0x05002a00, 0x01000d00, 0x07000000, 0x650f0000, 0x9d000000, 0x05002a00, 0x01000d00, 0x07000000, 0x660f0000, 0xa3000000,
- 0x05002a00, 0x01000d00, 0x07000000, 0x670f0000, 0xa9000000, 0x05002a00, 0x01000d00, 0x07000000, 0x680f0000, 0xaf000000, 0x05002a00, 0x01000d00,
- 0x07000000, 0x690f0000, 0xee000000, 0x02004600, 0x02000d00, 0x07000000, 0x6a0f0000, 0x92000000, 0x04004600, 0x01000d00, 0x07000000, 0x6b0f0000,
- 0xb5000000, 0x05002a00, 0x01000d00, 0x07000000, 0x6c0f0000, 0xfd000000, 0x02002a00, 0x02000d00, 0x07000000, 0x6d0f0000, 0x8e000000, 0x07000e00,
- 0x00000d00, 0x07000000, 0x6e0f0000, 0xbb000000, 0x05002a00, 0x01000d00, 0x07000000, 0x6f0f0000, 0xc1000000, 0x05002a00, 0x01000d00, 0x07000000,
- 0x700f0000, 0xc7000000, 0x05002a00, 0x01000d00, 0x07000000, 0x710f0000, 0xcd000000, 0x05002a00, 0x01000d00, 0x07000000, 0x720f0000, 0xd3000000,
- 0x05002a00, 0x01000d00, 0x07000000, 0x730f0000, 0xd9000000, 0x05002a00, 0x01000d00, 0x07000000, 0x740f0000, 0x7e000000, 0x04004600, 0x02000d00,
- 0x07000000, 0x750f0000, 0xdf000000, 0x05002a00, 0x01000d00, 0x07000000, 0x760f0000, 0xe5000000, 0x05002a00, 0x01000d00, 0x07000000, 0x770f0000,
- 0xbe000000, 0x07000e00, 0x00000d00, 0x07000000, 0x780f0000, 0xeb000000, 0x05002a00, 0x01000d00, 0x07000000, 0x790f0000, 0xf1000000, 0x05002a00,
- 0x01000d00, 0x07000000, 0x7a0f0000, 0xf7000000, 0x05002a00, 0x01000d00, 0x07000000, 0x7b0f0000, 0x00000000, 0x05003800, 0x01000d00, 0x07000000,
- 0x7c0f0000, 0x00000000, 0x01005400, 0x03000d00, 0x07000000, 0x7d0f0000, 0x06000000, 0x05003800, 0x01000d00, 0x07000000, 0x7e0f0000, 0x16000000,
- 0x07000e00, 0x00000d00, 0x07000000, 0x7f0f0000, 0x58000000, 0x15000000, 0xf9000d00, 0x070000ff, 0x810f0000, 0x16000000, 0x15000000, 0xf9000d00,
- 0x070000ff, 0x8d0f0000, 0x00000000, 0x15000e00, 0xf9000d00, 0x070000ff, 0x8f0f0000, 0xc6000000, 0x15000000, 0xf9000d00, 0x070000ff, 0x900f0000,
- 0x6e000000, 0x15000000, 0xf9000d00, 0x070000ff, 0x9d0f0000, 0x84000000, 0x15000000, 0xf9000d00, 0x070000ff, 0xa00f0000, 0xdc000000, 0x15000000,
- 0xf9000d00, 0x070000ff, 0xa10f0000, 0x0a000000, 0x01005400, 0x03000d00, 0x07000000, 0xa20f0000, 0x0c000000, 0x05003800, 0x01000d00, 0x07000000,
- 0xa30f0000, 0x12000000, 0x05003800, 0x01000d00, 0x07000000, 0xa40f0000, 0x96000000, 0x07000e00, 0x00000d00, 0x07000000, 0xa50f0000, 0x5e000000,
- 0x07000e00, 0x00000d00, 0x07000000, 0xa60f0000, 0x08000000, 0x01005400, 0x03000d00, 0x07000000, 0xa70f0000, 0x18000000, 0x05003800, 0x01000d00,
- 0x07000000, 0xa80f0000, 0xac000000, 0x03004600, 0x02000d00, 0x07000000, 0xa90f0000, 0x56000000, 0x07000e00, 0x00000d00, 0x07000000, 0xaa0f0000,
- 0x8d000000, 0x04004600, 0x01000d00, 0x07000000, 0xab0f0000, 0x1e000000, 0x05003800, 0x01000d00, 0x07000000, 0xac0f0000, 0xfb000000, 0x04000e00,
- 0x01000d00, 0x07000000, 0xad0f0000, 0x42000000, 0x15000000, 0xf9000d00, 0x070000ff, 0xae0f0000, 0x3e000000, 0x07000e00, 0x00000d00, 0x07000000,
- 0xaf0f0000, 0x26000000, 0x07000e00, 0x00000d00, 0x07000000, 0xb00f0000, 0x6f000000, 0x04004600, 0x01000d00, 0x07000000, 0xb10f0000, 0x24000000,
- 0x05003800, 0x01000d00, 0x07000000, 0xb20f0000, 0x79000000, 0x04004600, 0x01000d00, 0x07000000, 0xb30f0000, 0x83000000, 0x04004600, 0x01000d00,
- 0x07000000, 0xb40f0000, 0xeb000000, 0x02004600, 0x03000d00, 0x07000000, 0xb50f0000, 0x46000000, 0x07000e00, 0x00000d00, 0x07000000, 0xb60f0000,
- 0xe6000000, 0x06000e00, 0x01000d00, 0x07000000, 0xb70f0000, 0xc0000000, 0x03004600, 0x02000d00, 0x07000000, 0xb80f0000, 0xf7000000, 0x02004600,
- 0x03000d00, 0x07000000, 0xb90f0000, 0xc4000000, 0x03004600, 0x01000d00, 0x07000000, 0xba0f0000, 0x60000000, 0x04004600, 0x01000d00, 0x07000000,
- 0xbb0f0000, 0x2a000000, 0x05003800, 0x01000d00, 0x07000000, 0xbc0f0000, 0x1c000000, 0x06002a00, 0x01000d00, 0x07000000, 0xbd0f0000, 0xc4000000,
- 0x06001c00, 0x01000d00, 0x07000000, 0xbe0f0000, 0x9e000000, 0x07000e00, 0x00000d00, 0x07000000, 0xbf0f0000, 0x30000000, 0x05003800, 0x01000d00,
- 0x07000000, 0xc00f0000, 0x9a000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc10f0000, 0x93000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc20f0000,
- 0x70000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc30f0000, 0x69000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc40f0000, 0x62000000, 0x06001c00,
- 0x01000d00, 0x07000000, 0xc50f0000, 0x5b000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc60f0000, 0xf2000000, 0x07000000, 0x00000d00, 0x07000000,
- 0xc70f0000, 0xbd000000, 0x06001c00, 0x01000d00, 0x07000000, 0xc80f0000, 0x3c000000, 0x05003800, 0x01000d00, 0x07000000, 0xc90f0000, 0x42000000,
- 0x05003800, 0x01000d00, 0x07000000, 0xca0f0000, 0x48000000, 0x05003800, 0x01000d00, 0x07000000, 0xcb0f0000, 0x4e000000, 0x05003800, 0x01000d00,
- 0x07000000, 0xcc0f0000, 0xa4000000, 0x03004600, 0x02000d00, 0x07000000, 0xcd0f0000, 0xb0000000, 0x03004600, 0x02000d00, 0x07000000, 0xce0f0000,
- 0xa8000000, 0x03004600, 0x02000d00, 0x07000000, 0xcf0f0000, 0xfc000000, 0x03001c00, 0x02000d00, 0x07000000, 0xd00f0000, 0xce000000, 0x07000e00,
- 0x00000d00, 0x07000000, 0xd10f0000, 0xcb000000, 0x06001c00, 0x01000d00, 0x07000000, 0xd20f0000, 0xd2000000, 0x06001c00, 0x01000d00, 0x07000000,
- 0xd30f0000, 0xd9000000, 0x06001c00, 0x01000d00, 0x07000000, 0xd40f0000, 0x2a000000, 0x06002a00, 0x01000d00, 0x07000000, 0xd50f0000, 0xe7000000,
- 0x06001c00, 0x01000d00, 0x07000000, 0xd60f0000, 0xee000000, 0x06001c00, 0x01000d00, 0x07000000, 0xd70f0000, 0x7e000000, 0x05003800, 0x01000d00,
- 0x07000000, 0xd80f0000, 0xf5000000, 0x06001c00, 0x01000d00, 0x07000000, 0xd90f0000, 0x00000000, 0x06002a00, 0x01000d00, 0x07000000, 0xda0f0000,
- 0x07000000, 0x06002a00, 0x01000d00, 0x07000000, 0xdb0f0000, 0x0e000000, 0x06002a00, 0x01000d00, 0x07000000, 0xdc0f0000, 0x15000000, 0x06002a00,
- 0x01000d00, 0x07000000, 0xdd0f0000, 0xd6000000, 0x07000e00, 0x00000d00, 0x07000000, 0xde0f0000, 0xa8000000, 0x05003800, 0x01000d00, 0x07000000,
- 0xdf0f0000, 0xde000000, 0x07000e00, 0x00000d00, 0x07000000, 0xe00f0000, 0xb4000000, 0x05003800, 0x01000d00, 0x07000000, 0xe10f0000, 0xba000000,
- 0x05003800, 0x01000d00, 0x07000000, 0xe20f0000, 0xc0000000, 0x05003800, 0x01000d00, 0x07000000, 0xe30f0000, 0xc6000000, 0x05003800, 0x01000d00,
- 0x07000000, 0xe40f0000, 0xcc000000, 0x05003800, 0x01000d00, 0x07000000, 0xe50f0000, 0xd2000000, 0x05003800, 0x01000d00, 0x07000000, 0xe60f0000,
- 0xb6000000, 0x07000e00, 0x00000d00, 0x07000000, 0xe70f0000, 0xde000000, 0x05003800, 0x01000d00, 0x07000000, 0xe80f0000, 0xe4000000, 0x05003800,
- 0x01000d00, 0x07000000, 0xe90f0000, 0xea000000, 0x05003800, 0x01000d00, 0x07000000, 0xea0f0000, 0xf0000000, 0x05003800, 0x01000d00, 0x07000000,
- 0xeb0f0000, 0xf6000000, 0x05003800, 0x01000d00, 0x07000000, 0xec0f0000, 0xf1000000, 0x02004600, 0x02000d00, 0x07000000, 0xed0f0000, 0xf4000000,
- 0x02004600, 0x02000d00, 0x07000000, 0xee0f0000, 0xd0000000, 0x03004600, 0x02000d00, 0x07000000, 0xef0f0000, 0xd4000000, 0x03004600, 0x02000d00,
- 0x07000000, 0xf00f0000, 0x00000000, 0x05004600, 0x01000d00, 0x07000000, 0xf10f0000, 0x06000000, 0x05004600, 0x01000d00, 0x07000000, 0xf20f0000,
- 0x0c000000, 0x05004600, 0x01000d00, 0x07000000, 0xf30f0000, 0x12000000, 0x05004600, 0x01000d00, 0x07000000, 0xf40f0000, 0x18000000, 0x05004600,
- 0x01000d00, 0x07000000, 0xf50f0000, 0x1e000000, 0x05004600, 0x01000d00, 0x07000000, 0xf60f0000, 0x24000000, 0x05004600, 0x01000d00, 0x07000000,
- 0xf70f0000, 0x2a000000, 0x05004600, 0x01000d00, 0x07000000, 0xf80f0000, 0x30000000, 0x05004600, 0x01000d00, 0x07000000, 0xf90f0000, 0x36000000,
- 0x05004600, 0x01000d00, 0x07000000, 0xfa0f0000, 0x3c000000, 0x05004600, 0x01000d00, 0x07000000, 0xfb0f0000, 0x42000000, 0x05004600, 0x01000d00,
- 0x07000000, 0xfc0f0000, 0x48000000, 0x05004600, 0x01000d00, 0x07000000, 0xfd0f0000, 0x4e000000, 0x05004600, 0x01000d00, 0x07000000, 0xfe0f0000,
- 0x54000000, 0x05004600, 0x01000d00, 0x07000000, 0xff0f0000, 0x5a000000, 0x05004600, 0x01000d00, 0x07000000, 0x000f0000,
- };
-
- namespace ImGui
- {
-
- void GetDefaultFontData(const void** fnt_data, unsigned int* fnt_size, const void** png_data, unsigned int* png_size)
- {
- if (fnt_data) *fnt_data = (const void*)proggy_clean_13_fnt_data;
- if (fnt_size) *fnt_size = proggy_clean_13_fnt_size;
- if (png_data) *png_data = (const void*)proggy_clean_13_png_data;
- if (png_size) *png_size = proggy_clean_13_png_size;
- }
-
- };
-
-
-
-
- #ifdef IMGUI_INCLUDE_IMGUI_USER_CPP
- #include "imgui_user.cpp"
- #endif
-
|