12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478 |
- return {
- callbacks = {
- {
- name = "conf",
- tag = "callbacks",
- summary = "Called to read configuration settings at startup.",
- description = "The `lovr.conf` callback lets you configure default settings for LÖVR. It is called once right before the game starts. Make sure you put `lovr.conf` in a file called `conf.lua`, a special file that's loaded before the rest of the framework initializes.",
- key = "lovr.conf",
- module = "lovr",
- variants = {
- {
- arguments = {
- {
- name = "t",
- type = "table",
- description = "The table to edit the configuration settings on.",
- table = {
- {
- name = "identity",
- type = "string",
- description = "A unique label for this project."
- },
- {
- name = "headset",
- type = "table",
- description = "Configuration for the headset.",
- table = {
- {
- name = "drivers",
- type = "table",
- description = "An ordered list of preferred headset drivers."
- },
- {
- name = "msaa",
- type = "number",
- description = "The amount of antialiasing to use when rendering to the headset."
- },
- {
- name = "offset",
- type = "number",
- description = "The vertical offset for seated experiences."
- }
- }
- },
- {
- name = "math",
- type = "table",
- description = "Configuration for the math module.",
- table = {
- {
- name = "ffi",
- type = "boolean",
- description = "Whether vector objects should use an optimized LuaJIT FFI codepath."
- },
- {
- name = "globals",
- type = "boolean",
- description = "Whether vector object functions should be added to the global scope."
- }
- }
- },
- {
- name = "modules",
- type = "table",
- description = "The set of enabled modules to use.",
- table = {
- {
- name = "audio",
- type = "boolean",
- description = "Whether the audio module should be enabled."
- },
- {
- name = "data",
- type = "boolean",
- description = "Whether the data module should be enabled."
- },
- {
- name = "event",
- type = "boolean",
- description = "Whether the event module should be enabled."
- },
- {
- name = "filesystem",
- type = "boolean",
- description = "Whether the filesystem module should be enabled."
- },
- {
- name = "graphics",
- type = "boolean",
- description = "Whether the graphics module should be enabled."
- },
- {
- name = "headset",
- type = "boolean",
- description = "Whether the headset module should be enabled."
- },
- {
- name = "math",
- type = "boolean",
- description = "Whether the math module should be enabled."
- },
- {
- name = "physics",
- type = "boolean",
- description = "Whether the physics module should be enabled."
- },
- {
- name = "thread",
- type = "boolean",
- description = "Whether the thread module should be enabled."
- },
- {
- name = "timer",
- type = "boolean",
- description = "Whether the timer module should be enabled."
- }
- }
- },
- {
- name = "gammacorrect",
- type = "boolean",
- description = "Whether colors are gamma corrected."
- },
- {
- name = "window",
- type = "table",
- description = "Configuration for the window.",
- table = {
- {
- name = "width",
- type = "number",
- description = "The width of the window."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the window."
- },
- {
- name = "fullscreen",
- type = "boolean",
- description = "Whether the window is fullscreen."
- },
- {
- name = "msaa",
- type = "number",
- description = "The number of antialiasing samples to use."
- },
- {
- name = "title",
- type = "string",
- description = "The window title."
- },
- {
- name = "icon",
- type = "string",
- description = "The path to the window icon file."
- }
- }
- }
- }
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.load"
- },
- examples = {
- {
- description = "A noop conf.lua that sets all configuration settings to their defaults:",
- code = "function lovr.conf(t)\n\n -- Set the project identity\n t.identity = 'default'\n\n -- Headset settings\n t.headset.drivers = { 'leap', 'openxr', 'oculus', 'oculusmobile', 'openvr', 'webvr', 'desktop' }\n t.headset.msaa = 4\n t.headset.offset = 1.7\n\n -- Math settings\n t.math.ffi = true\n t.math.globals = true\n\n -- Enable or disable different modules\n t.modules.audio = true\n t.modules.data = true\n t.modules.event = true\n t.modules.graphics = true\n t.modules.headset = true\n t.modules.math = true\n t.modules.physics = true\n t.modules.thread = true\n t.modules.timer = true\n\n -- Configure gamma correction\n t.gammacorrect = false\n\n -- Configure the desktop window\n t.window.width = 1080\n t.window.height = 600\n t.window.fullscreen = false\n t.window.msaa = 0\n t.window.title = 'LÖVR'\n t.window.icon = nil\nend"
- }
- },
- notes = "Disabling the `headset` module can improve startup time a lot if you aren't intending to use `lovr.headset`.\n\nYou can set `t.window` to nil to avoid creating the window. You can do it yourself later by using `lovr.graphics.createWindow`.\n\nIf the `lovr.graphics` module is disabled or the window isn't created, attempting to use any functionality requiring graphics may cause a crash.\n\nThe `headset.offset` field is a vertical offset applied to the scene for headsets that do not center their tracking origin on the floor. This can be thought of as a \"default user height\". Setting this offset makes it easier to design experiences that work in both seated and standing VR configurations."
- },
- {
- name = "draw",
- tag = "callbacks",
- summary = "Called continuously to render frames to the display.",
- description = "This callback is called every frame. Use it to render the scene. If a VR headset is connected, anything rendered by this function will appear in the headset display.",
- key = "lovr.draw",
- module = "lovr",
- related = {
- "lovr.headset.renderTo"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "errhand",
- tag = "callbacks",
- summary = "Called when an error occurs.",
- description = "The \"lovr.errhand\" callback is run whenever an error occurs. It receives two parameters. The first is a string containing the error message. The second is either nil, or a string containing a traceback (as returned by \"debug.traceback()\"); if nil, this means \"lovr.errhand\" is being called in the stack where the error occurred, and it can call \"debug.traceback()\" itself.\n\n\"lovr.errhand\" should return a handler function to run in a loop to show the error screen. This handler function is of the same type as the one returned by \"lovr.run\" and has the same requirements (such as pumping events). If an error occurs while this handler is running, the program will terminate immediately-- \"lovr.errhand\" will not be given a second chance. Errors which occur inside \"lovr.errhand\" or in the handler it returns may not be cleanly reported, so be careful.\n\nA default error handler is supplied that renders the error message as text to the headset and to the window.",
- key = "lovr.errhand",
- module = "lovr",
- variants = {
- {
- arguments = {
- {
- name = "message",
- type = "string",
- description = "The error message."
- },
- {
- name = "traceback",
- type = "string",
- description = "A traceback string, or nil."
- }
- },
- returns = {
- {
- name = "handler",
- type = "function",
- description = "The error handler function. It should return nil to continue running, \"restart\" to restart the app, or a number representing an exit status.",
- arguments = {},
- returns = {
- {
- name = "result",
- type = "*"
- }
- }
- }
- }
- }
- },
- examples = {
- {
- code = "function lovr.errhand(message, traceback)\n traceback = traceback or debug.traceback('', 3)\n print('ohh NOOOO!', message)\n print(traceback)\n return function()\n lovr.graphics.print('There was an error', 0, 2, -5)\n end\nend"
- }
- },
- related = {
- "lovr.quit"
- }
- },
- {
- name = "focus",
- tag = "callbacks",
- summary = "Called when the application gets or loses focus.",
- description = "The `lovr.focus` callback is called whenever the application acquires or loses focus (for example, when opening or closing the Steam dashboard). The callback receives a single argument, focused, which is a boolean indicating whether or not the application is now focused. It may make sense to pause the game or reduce visual fidelity when the application loses focus.",
- key = "lovr.focus",
- module = "lovr",
- related = {},
- variants = {
- {
- arguments = {
- {
- name = "focused",
- type = "boolean",
- description = "Whether the program is now focused."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "load",
- tag = "callbacks",
- summary = "Called once at startup.",
- description = "This callback is called once when the app starts. It should be used to perform initial setup work, like loading resources and initializing classes and variables.",
- key = "lovr.load",
- module = "lovr",
- variants = {
- {
- arguments = {
- {
- name = "args",
- type = "table",
- description = "The command line arguments provided to the program."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- code = "function lovr.load(args)\n model = lovr.graphics.newModel('cena.gltf')\n texture = lovr.graphics.newTexture('cena.png')\n levelGeometry = lovr.graphics.newMesh(1000)\n effects = lovr.graphics.newShader('vert.glsl', 'frag.glsl')\n loadLevel(1)\nend"
- }
- },
- related = {
- "lovr.quit"
- }
- },
- {
- name = "mirror",
- tag = "callbacks",
- summary = "Called to render content to the desktop window.",
- description = "This callback is called every frame after rendering to the headset and is usually used to render a mirror of the headset display onto the desktop window. It can be overridden for custom mirroring behavior. For example, you could render a single eye instead of a stereo view, apply postprocessing effects, add 2D UI, or render the scene from an entirely different viewpoint for a third person camera.",
- key = "lovr.mirror",
- module = "lovr",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- related = {
- "lovr.headset.renderTo",
- "lovr.headset.getMirrorTexture",
- "lovr.graphics.createWindow",
- "lovr.graphics.setProjection",
- "lovr.draw"
- },
- examples = {
- {
- description = "The default `lovr.mirror` implementation draws the headset mirror texture to the window if the headset is active, or just calls `lovr.draw` if there isn't a headset.",
- code = "function lovr.mirror()\n if lovr.headset then\n local texture = lovr.headset.getMirrorTexture()\n if texture then\n lovr.graphics.fill(texture)\n end\n else\n lovr.graphics.clear()\n lovr.draw()\n end\nend"
- }
- },
- notes = "When this callback is called, the camera is located at `(0, 0, 0)` and is looking down the negative-z axis.\n\nNote that the usual graphics state applies while `lovr.mirror` is invoked, so you may need to reset graphics state at the end of `lovr.draw` to get the result you want."
- },
- {
- name = "quit",
- tag = "callbacks",
- summary = "Called before quitting.",
- description = "This callback is called right before the game is about to quit. Use it to perform any cleanup you need to do. You can also return a \"truthy\" value from this callback to abort quitting.",
- key = "lovr.quit",
- module = "lovr",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "abort",
- type = "boolean",
- description = "Whether quitting should be aborted."
- }
- }
- }
- },
- examples = {
- {
- code = "function lovr.quit()\n if shouldQuit() then\n return false\n else\n return true\n end\nend"
- }
- },
- related = {
- "lovr.event.quit",
- "lovr.load"
- }
- },
- {
- name = "run",
- tag = "callbacks",
- summary = "The main entry point.",
- description = "This callback is the main entry point for a LÖVR program. It is responsible for calling `lovr.load` and returning the main loop function.",
- key = "lovr.run",
- module = "lovr",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "loop",
- type = "function",
- description = "The main loop function. It should return nil to continue running, \"restart\" to restart the app, or a number representing an exit status.\n\nMost users should overload lovr.load, lovr.update and lovr.draw instead, since if a custom lovr.run does not do everything it is expected that some features may not work. For example, if lovr.run does not respond to \"quit\" events the program will not be able to quit, and if it does not call \"present\" then no graphics will be drawn.",
- arguments = {},
- returns = {
- {
- name = "result",
- type = "*"
- }
- }
- }
- }
- }
- },
- examples = {
- {
- description = "The default `lovr.run`:",
- code = "function lovr.run()\n lovr.timer.step()\n if lovr.load then lovr.load() end\n return function()\n lovr.event.pump()\n for name, a, b, c, d in lovr.event.poll() do\n if name == 'quit' and (not lovr.quit or not lovr.quit()) then\n return a or 0\n end\n if lovr.handlers[name] then lovr.handlers[name](a, b, c, d) end\n end\n local dt = lovr.timer.step()\n if lovr.headset then\n lovr.headset.update(dt)\n end\n if lovr.audio then\n lovr.audio.update()\n if lovr.headset then\n lovr.audio.setOrientation(lovr.headset.getOrientation())\n lovr.audio.setPosition(lovr.headset.getPosition())\n lovr.audio.setVelocity(lovr.headset.getVelocity())\n end\n end\n if lovr.update then lovr.update(dt) end\n if lovr.graphics then\n lovr.graphics.origin()\n if lovr.draw then\n if lovr.headset then\n lovr.headset.renderTo(lovr.draw)\n end\n if lovr.graphics.hasWindow() then\n lovr.mirror()\n end\n end\n lovr.graphics.present()\n end\n end\nend"
- }
- },
- related = {
- "lovr.load",
- "lovr.quit"
- }
- },
- {
- name = "threaderror",
- tag = "callbacks",
- summary = "Called when an error occurs in a thread.",
- description = "The `lovr.threaderror` callback is called whenever an error occurs in a Thread. It receives a the Thread object where the error occurred and an error message.\n\nThe default implementation of this callback will call `lovr.errhand` with the error.",
- key = "lovr.threaderror",
- module = "lovr",
- related = {
- "Thread",
- "Thread:getError",
- "lovr.errhand"
- },
- variants = {
- {
- arguments = {
- {
- name = "thread",
- type = "Thread",
- description = "The Thread that errored."
- },
- {
- name = "message",
- type = "string",
- description = "The error message."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "update",
- tag = "callbacks",
- summary = "Called every frame to update the application logic.",
- description = "The `lovr.update` callback should be used to update your game's logic. It receives a single parameter, `dt`, which represents the amount of elapsed time between frames. You can use this value to scale timers, physics, and animations in your game so they play at a smooth, consistent speed.",
- key = "lovr.update",
- module = "lovr",
- variants = {
- {
- arguments = {
- {
- name = "dt",
- type = "number",
- description = "The number of seconds elapsed since the last update."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- code = "function lovr.update(dt)\n ball.vy = ball.vy + ball.gravity * dt\n ball.y = ball.y + ball.vy * dt\nend"
- }
- },
- related = {
- "lovr.timer.getDelta"
- }
- }
- },
- modules = {
- {
- name = "enet",
- tag = "library",
- summary = "Multiplayer utilities.",
- description = "ENet is a UDP networking library bundled with LÖVR that allows you to create multiplayer experiences.\n\nTo use it, `require` the `enet` module.\n\nMore information, including full documentation and examples can be found on the [lua-enet](http://leafo.net/lua-enet/) page.",
- key = "enet",
- functions = {},
- objects = {},
- enums = {},
- external = true,
- examples = {
- {
- description = "Here's a simple echo server example. The client sends a message to the server and waits for a response. The server waits for a message and sends it back to the client.",
- code = "-- client/main.lua\nlocal enet = require 'enet'\n\nfunction lovr.load()\n local host = enet.host_create()\n local server = host:connect('localhost:6789')\n\n local done = false\n while not done do\n local event = host:service(100)\n if event then\n if event.type == 'connect' then\n print('Connected to', event.peer)\n event.peer:send('hello world')\n elseif event.type == 'receive' then\n print('Got message: ', event.data, event.peer)\n done = true\n end\n end\n end\n\n server:disconnect()\n host:flush()\nend\n\n-- server/main.lua\nlocal enet = require 'enet'\n\nfunction lovr.load()\n local host = enet.host_create('localhost:6789')\n while true do\n local event = host:service(100)\n if event and event.type == 'receive' then\n print('Got message: ', event.data, event.peer)\n event.peer:send(event.data)\n end\n end\nend"
- }
- }
- },
- {
- name = "json",
- tag = "library",
- summary = "Encodes and decodes JSON.",
- description = "The json module exposes functions for encoding and decoding JSON. You can use it by requiring the `json` module.",
- key = "json",
- functions = {},
- objects = {},
- enums = {},
- external = true,
- examples = {
- {
- code = "local json = require 'json'\nlocal data = { health = 10, position = { 1, 2, 3 } }\nlocal encoded = json.encode(data)\nprint(encoded)\nlocal decoded = json.decode(encoded)\nprint(decoded.health, unpack(decoded.position))"
- }
- }
- },
- {
- name = "lovr",
- summary = "In the beginning, there was nothing.",
- description = "`lovr` is the single global table that is exposed to every LÖVR app. It contains a set of **modules** and a set of **callbacks**.",
- key = "lovr",
- enums = {},
- sections = {
- {
- name = "Modules",
- tag = "modules",
- description = "Modules are the **what** of your app; you can use the functions in modules to tell LÖVR to do things. For example, you can draw things on the screen, figure out what buttons on a controller are pressed, or load a 3D model from a file. Each module does what it says on the tin, so the `lovr.graphics` module deals with rendering graphics and `lovr.headset` allows you to interact with VR hardware."
- },
- {
- name = "Callbacks",
- tag = "callbacks",
- description = "Callbacks are the **when** of the application; you write code inside callbacks which LÖVR then calls at certain points in time. For example, the `lovr.load` callback is called once at startup, and `lovr.focus` is called when the VR application gains or loses input focus."
- },
- {
- name = "System",
- tag = "system",
- description = "The lovr module also exposes some functions for retrieving information about the system."
- },
- {
- name = "Libraries",
- tag = "library",
- description = "A few helpful third-party libraries are included with LÖVR for convenience."
- }
- },
- functions = {
- {
- name = "getOS",
- tag = "system",
- summary = "Get the current operating system.",
- description = "Returns the current operating system.",
- key = "lovr.getOS",
- module = "lovr",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "os",
- type = "string",
- description = "Either \"Windows\", \"macOS\", \"Linux\", \"Android\" or \"Web\"."
- }
- }
- }
- }
- },
- {
- name = "getVersion",
- tag = "system",
- summary = "Get the current version.",
- description = "Get the current major, minor, and patch version of LÖVR.",
- key = "lovr.getVersion",
- module = "lovr",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "major",
- type = "number",
- description = "The major version."
- },
- {
- name = "minor",
- type = "number",
- description = "The minor version."
- },
- {
- name = "patch",
- type = "number",
- description = "The patch number."
- }
- }
- }
- }
- }
- },
- objects = {}
- },
- {
- name = "audio",
- tag = "modules",
- summary = "Plays sound.",
- description = "The `lovr.audio` module is responsible for playing sound effects and music. Currently, the only supported audio format is .ogg (Vorbis). Playing a sound involves creating a `Source` object for the sound and calling `Source:play` on it.",
- key = "lovr.audio",
- sections = {
- {
- name = "Sources",
- tag = "sources",
- description = "Sources are objects that represent a single sound instance."
- },
- {
- name = "Listener",
- tag = "listener",
- description = "The listener is a virtual object in 3D space that \"hears\" all the sounds that are playing. The listener can be positioned and oriented in 3D space, which controls how Sources in the world are heard. For example, sounds further away from the listener will be more quiet, and sounds to the left of the listener will be heard from the left speaker. By default, the listener will be synchronized with any connected headset so audio is positioned properly as the headset is moved around and rotated."
- },
- {
- name = "Microphones",
- tag = "microphones",
- description = "Microphones can be used to receive audio input."
- }
- },
- enums = {
- {
- name = "SourceType",
- summary = "Different ways to handle audio data for Source objects.",
- description = "When you create a Source, you can either decode audio data gradually over time or you can decode it all at once. Streaming it over time will use less memory but cause higher processing overhead because audio is continuously being decoded. On the other hand, decoding a sound all at once means it will take more time to load and use more memory, but after it's loaded there is virtually no processing overhead. It's recommended to use the 'static' mode for short sound effects and the 'stream' mode for longer music tracks.",
- key = "SourceType",
- module = "lovr.audio",
- values = {
- {
- name = "static",
- description = "Decode the entire sound file up front."
- },
- {
- name = "stream",
- description = "Decode the sound gradually over time."
- }
- }
- },
- {
- name = "TimeUnit",
- summary = "Time units for sound samples.",
- description = "When figuring out how long a Source is or seeking to a specific position in the sound file, units can be expressed in terms of seconds or in terms of samples.",
- key = "TimeUnit",
- module = "lovr.audio",
- values = {
- {
- name = "seconds",
- description = "Seconds."
- },
- {
- name = "samples",
- description = "Samples."
- }
- }
- }
- },
- functions = {
- {
- name = "getDopplerEffect",
- tag = "listener",
- summary = "Get the doppler effect parameters.",
- description = "Returns the parameters that control the simulated doppler effect: The effect intensity and the speed of sound.",
- key = "lovr.audio.getDopplerEffect",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "factor",
- type = "number",
- description = "The doppler effect scaling factor."
- },
- {
- name = "speedOfSound",
- type = "number",
- description = "The speed of sound, in meters per second."
- }
- }
- }
- },
- notes = "The default factor is 1 and the default speed of sound is 343.29."
- },
- {
- name = "getMicrophoneNames",
- tag = "microphones",
- summary = "Get a table containing the names of all connected microphones.",
- description = "Returns a table containing the names of all microphones connected to the system.",
- key = "lovr.audio.getMicrophoneNames",
- module = "lovr.audio",
- related = {
- "lovr.audio.newMicrophone",
- "Microphone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "names",
- type = "table",
- description = "The list of microphone names as strings."
- }
- }
- },
- {
- arguments = {
- {
- name = "t",
- type = "table",
- description = "A table to fill with the microphone names."
- }
- },
- returns = {
- {
- name = "t",
- type = "table",
- description = "The original table that was passed in."
- }
- }
- }
- }
- },
- {
- name = "getOrientation",
- tag = "listener",
- summary = "Get the orientation of the listener.",
- description = "Returns the orientation of the virtual audio listener in angle/axis representation.",
- key = "lovr.audio.getOrientation",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the listener is rotated around its axis of rotation."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- }
- },
- {
- name = "getPosition",
- tag = "listener",
- summary = "Get the position of the listener.",
- description = "Returns the position of the virtual audio listener, in meters.",
- key = "lovr.audio.getPosition",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the listener."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the listener."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the listener."
- }
- }
- }
- }
- },
- {
- name = "getVelocity",
- tag = "listener",
- summary = "Get the velocity of the audio listener.",
- description = "Returns the velocity of the audio listener, in meters per second. This affects the doppler effect.",
- key = "lovr.audio.getVelocity",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x velocity."
- },
- {
- name = "y",
- type = "number",
- description = "The y velocity."
- },
- {
- name = "z",
- type = "number",
- description = "The z velocity."
- }
- }
- }
- },
- notes = "The audio listener does not move based on its velocity."
- },
- {
- name = "getVolume",
- tag = "listener",
- summary = "Get the master volume.",
- description = "Returns the master volume. All Source objects have their volume multiplied by this factor.",
- key = "lovr.audio.getVolume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "volume",
- type = "number",
- description = "The master volume."
- }
- }
- }
- },
- notes = "The default is 1.0."
- },
- {
- name = "isSpatialized",
- tag = "listener",
- summary = "Check if audio is spatialized.",
- description = "Returns whether or not audio is currently spatialized with HRTFs. Spatialized audio is much more immersive.",
- key = "lovr.audio.isSpatialized",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "spatialized",
- type = "boolean",
- description = "Whether or not audio is spatialized."
- }
- }
- }
- }
- },
- {
- name = "newMicrophone",
- tag = "microphones",
- summary = "Create a new Microphone.",
- description = "Creates a new Microphone based on the name of an existing micrphone and a set of capture parameters. If the specified parameters are not supported, `nil` will be returned.",
- key = "lovr.audio.newMicrophone",
- module = "lovr.audio",
- related = {
- "lovr.audio.getMicrophoneNames",
- "Microphone"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the microphone that this Microphone will record from."
- },
- {
- name = "samples",
- type = "number",
- description = "The maximum number of samples that will be stored in the Microphone's internal buffer.",
- default = "1024"
- },
- {
- name = "sampleRate",
- type = "number",
- description = "The number of audio samples to record each second.",
- default = "8000"
- },
- {
- name = "bitDepth",
- type = "number",
- description = "The number of bits occupied by each sample. Usually 8 or 16.",
- default = "16"
- },
- {
- name = "channelCount",
- type = "number",
- description = "The number of channels to record (1 for mono, 2 for stereo).",
- default = "1"
- }
- },
- returns = {
- {
- name = "microphone",
- type = "Microphone",
- description = "The new Microphone, or `nil` if the capture settings are not supported."
- }
- }
- }
- }
- },
- {
- name = "newSource",
- tag = "sources",
- summary = "Create a new Source.",
- description = "Creates a new Source from an ogg file.",
- key = "lovr.audio.newSource",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the sound to load."
- },
- {
- name = "type",
- type = "SourceType",
- description = "How to stream in audio data."
- }
- },
- returns = {
- {
- name = "source",
- type = "Source",
- description = "The new Source."
- }
- }
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing the Source data."
- },
- {
- name = "type",
- type = "SourceType",
- description = "How to stream in audio data."
- }
- },
- returns = {
- {
- name = "source",
- type = "Source",
- description = "The new Source."
- }
- }
- },
- {
- arguments = {
- {
- name = "stream",
- type = "AudioStream",
- description = "The AudioStream used to stream audio data to the Source."
- },
- {
- name = "type",
- type = "SourceType",
- description = "How to stream in audio data."
- }
- },
- returns = {
- {
- name = "source",
- type = "Source",
- description = "The new Source."
- }
- }
- },
- {
- arguments = {
- {
- name = "soundData",
- type = "SoundData",
- description = "The SoundData containing raw audio samples to play."
- }
- },
- returns = {
- {
- name = "source",
- type = "Source",
- description = "The new Source."
- }
- }
- }
- }
- },
- {
- name = "pause",
- tag = "sources",
- summary = "Pause all Sources.",
- description = "Pause all playing audio.",
- key = "lovr.audio.pause",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "resume",
- tag = "sources",
- summary = "Resume all Sources.",
- description = "Resume all Sources. Has no effect on Sources that are playing or stopped.",
- key = "lovr.audio.resume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "rewind",
- tag = "sources",
- summary = "Rewind all Sources.",
- description = "Rewind all playing audio.",
- key = "lovr.audio.rewind",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "Sources that are paused will remain paused. Sources that are currently playing will restart from the beginning."
- },
- {
- name = "setDopplerEffect",
- tag = "listener",
- summary = "Set the doppler effect parameters.",
- description = "Sets the parameters that control the simulated doppler effect: The effect intensity and the speed of sound.",
- key = "lovr.audio.setDopplerEffect",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "factor",
- type = "number",
- description = "The doppler effect scaling factor.",
- default = "1.0"
- },
- {
- name = "speedOfSound",
- type = "number",
- description = "The speed of sound, in meters per second.",
- default = "343.29"
- }
- },
- returns = {}
- }
- },
- notes = "The default factor is 1 and the default speed of sound is 343.29."
- },
- {
- name = "setOrientation",
- tag = "listener",
- summary = "Set the orientation of the listener.",
- description = "Sets the orientation of the virtual audio listener in angle/axis representation.",
- key = "lovr.audio.setOrientation",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the listener should be rotated around its rotation axis."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPosition",
- tag = "listener",
- summary = "Set the position of the listener.",
- description = "Sets the position of the virtual audio listener, in meters.",
- key = "lovr.audio.setPosition",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x position of the listener."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the listener."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the listener."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVelocity",
- tag = "listener",
- summary = "Set the velocity of the audio listener.",
- description = "Sets the velocity of the audio listener, in meters per second. This affects the doppler effect.",
- key = "lovr.audio.setVelocity",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x velocity."
- },
- {
- name = "y",
- type = "number",
- description = "The y velocity."
- },
- {
- name = "z",
- type = "number",
- description = "The z velocity."
- }
- },
- returns = {}
- }
- },
- notes = "The audio listener does not move based on its velocity."
- },
- {
- name = "setVolume",
- tag = "listener",
- summary = "Set the master volume.",
- description = "Sets the master volume. The volume of all Sources will be multiplied by this factor.",
- key = "lovr.audio.setVolume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "volume",
- type = "number",
- description = "The master volume."
- }
- }
- }
- },
- notes = "The default is 1.0."
- },
- {
- name = "stop",
- tag = "sources",
- summary = "Stop all Sources.",
- description = "Stops all audio.",
- key = "lovr.audio.stop",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "If you want to resume the stopped audio later, see `lovr.audio.pause`."
- },
- {
- name = "update",
- tag = "sources",
- summary = "Updates the audio system.",
- description = "Updates all playing sources. This must be called regularly for audio playback to occur. Normally this is called for you by `lovr.run`.",
- key = "lovr.audio.update",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- }
- },
- objects = {
- {
- name = "Microphone",
- summary = "An object that records audio.",
- description = "A Microphone object provides audio input by recording sounds.",
- key = "Microphone",
- module = "lovr.audio",
- methods = {
- {
- name = "getBitDepth",
- summary = "Get the bit depth of the Microphone.",
- description = "Returns the number of bits occupied for each recorded sample. This is a rough indicator of the quality of the recording, and is 16 by default.",
- key = "Microphone:getBitDepth",
- module = "lovr.audio",
- related = {
- "Microphone:getChannelCount",
- "Microphone:getSampleRate",
- "lovr.audio.newMicrophone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "bits",
- type = "number",
- description = "The number of bits per sample."
- }
- }
- }
- }
- },
- {
- name = "getChannelCount",
- summary = "Get the number of channels recorded by the Microphone.",
- description = "Returns the number of channels recorded by the Microphone. One recorded channel will result in a mono sound, and there will be two channels for a stereo sound. Most microphones only support recording a single channel.",
- key = "Microphone:getChannelCount",
- module = "lovr.audio",
- related = {
- "Microphone:getBitDepth",
- "Microphone:getSampleRate",
- "lovr.audio.newMicrophone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "channels",
- type = "number",
- description = "The number of channels recorded."
- }
- }
- }
- }
- },
- {
- name = "getData",
- summary = "Get a new SoundData with recorded audio.",
- description = "Returns a new SoundData with all of the buffered audio samples that the Microphone has recorded.",
- key = "Microphone:getData",
- module = "lovr.audio",
- related = {
- "Microphone:getSampleCount",
- "Microphone:startRecording",
- "Microphone:stopRecording",
- "Microphone:isRecording",
- "SoundData"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "channels",
- type = "number",
- description = "The number of channels recorded."
- }
- }
- }
- },
- notes = "There's a limit on the number of samples the Microphone is able to hold, which can be set at creation time in `lovr.audio.newMicrophone`. While the Microphone is recording, be sure to call this function periodically to get a new chunk of audio in order to make room for more.\n\nYou can use `Microphone:getSampleCount` to figure out how many samples the Microphone is currently holding."
- },
- {
- name = "getName",
- summary = "Get the name of the Microphone.",
- description = "Returns the name of the Microphone.",
- key = "Microphone:getName",
- module = "lovr.audio",
- related = {
- "lovr.audio.getMicrophoneNames",
- "lovr.audio.newMicrophone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "name",
- type = "string",
- description = "The name of the Microphone."
- }
- }
- }
- }
- },
- {
- name = "getSampleCount",
- summary = "Get the number of recorded audio samples.",
- description = "Returns the number of audio samples the Microphone has recorded so far. This will be zero if the Microphone hasn't started recording yet, see `Microphone:startRecording`.\n\nThere's a limit on the number of samples the Microphone is able to hold, which can be set at creation time in `lovr.audio.newMicrophone`. While the Microphone is recording, be sure to call `Microphone:getData` periodically to get a new chunk of audio in order to make room for more.",
- key = "Microphone:getSampleCount",
- module = "lovr.audio",
- related = {
- "Microphone:getData",
- "Microphone:isRecording",
- "Microphone:startRecording",
- "Microphone:stopRecording",
- "lovr.audio.newMicrophone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "samples",
- type = "number",
- description = "The number of recorded samples."
- }
- }
- }
- }
- },
- {
- name = "getSampleRate",
- summary = "Get the sample rate of the Microphone.",
- description = "Returns the number of samples recorded each second. Higher sample rates lead to higher quality audio, but they can reduce performance and may not be supported by all microphones.",
- key = "Microphone:getSampleRate",
- module = "lovr.audio",
- related = {
- "Microphone:getBitDepth",
- "Microphone:getChannelCount",
- "lovr.audio.newMicrophone"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "sampleRate",
- type = "number",
- description = "The number of samples recorded every second."
- }
- }
- }
- }
- },
- {
- name = "isRecording",
- summary = "Get whether the Microphone is recording.",
- description = "Returns whether or not the Microphone is currently recording.",
- key = "Microphone:isRecording",
- module = "lovr.audio",
- related = {
- "Microphone:startRecording",
- "Microphone:stopRecording"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "recording",
- type = "boolean",
- description = "Whether the Microphone is recording."
- }
- }
- }
- }
- },
- {
- name = "startRecording",
- summary = "Start recording.",
- description = "Starts recording audio samples from the Microphone. You can use `Microphone:getData` to periodically read the captured audio samples, and use `Microphone:stopRecording` when you're done.",
- key = "Microphone:startRecording",
- module = "lovr.audio",
- related = {
- "Microphone:getData",
- "Microphone:stopRecording",
- "Microphone:isRecording"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "stopRecording",
- summary = "Stop recording.",
- description = "Stops recording from the Microphone.",
- key = "Microphone:stopRecording",
- module = "lovr.audio",
- related = {
- "Microphone:startRecording",
- "Microphone:isRecording"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.audio.newMicrophone"
- },
- related = {
- "lovr.audio.getMicrophoneNames",
- "SoundData"
- }
- },
- {
- name = "Source",
- summary = "A playable sound object.",
- description = "A Source is an object representing a single sound. Currently, only ogg sounds are supported. Sources can be in three different states:\n\n<table>\n <tr>\n <td>Playing</td>\n <td>The source is currently playing. It can be stopped, paused, or rewound.</td>\n </tr>\n <tr>\n <td>Paused</td>\n <td>The source is paused. It can be stopped, played/resumed, or rewound.</td>\n </tr>\n <tr>\n <td>Stopped</td>\n <td>The source has been stopped. It can be played.</td>\n </tr> </table>",
- key = "Source",
- module = "lovr.audio",
- methods = {
- {
- name = "getBitDepth",
- summary = "Get the bit depth of the Source.",
- description = "Returns the number of bits per sample in the Source. This is a rough indicator of the resolution of the Source, and is usually 16.",
- key = "Source:getBitDepth",
- module = "lovr.audio",
- related = {
- "SoundData:getBitDepth",
- "AudioStream:getBitDepth"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "bits",
- type = "number",
- description = "The number of bits per sample."
- }
- }
- }
- }
- },
- {
- name = "getChannelCount",
- summary = "Get the number of channels in the Source.",
- description = "Returns the number of channels in the Source. Mono sounds have 1 channel and stereo sounds have 2 channels.",
- key = "Source:getChannelCount",
- module = "lovr.audio",
- related = {
- "SoundData:getChannelCount",
- "AudioStream:getChannelCount"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "channels",
- type = "number",
- description = "The number of channels."
- }
- }
- }
- }
- },
- {
- name = "getCone",
- summary = "Get the Source's volume cone.",
- description = "Returns the directional volume cone of the Source. The cone is specified by three values: `innerAngle`, `outerAngle`, and `outerVolume`. If the listener is inside the `innerAngle`, the Source won't have its volume changed. Otherwise, the volume will start to decrease, reaching a minimum volume of `outerVolume` once the listener is `outerAngle` degrees from the direction of the Source.",
- key = "Source:getCone",
- module = "lovr.audio",
- notes = "The default `innerAngle` for a Source is `0`.\n\nThe default `outerAngle` for a Source is `2 * math.pi`.\n\nThe default `outerVolume` for a Source is `0`.\n\nMake sure to set the direction of a Source before setting its cone.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "innerAngle",
- type = "number",
- description = "The inner cone angle, in radians."
- },
- {
- name = "outerAngle",
- type = "number",
- description = "The outer cone angle, in radians."
- },
- {
- name = "outerVolume",
- type = "number",
- description = "The outer cone angle, in radians."
- }
- }
- }
- }
- },
- {
- name = "getDirection",
- summary = "Get the direction vector of the Source.",
- description = "Returns the direction vector of the Source (the direction it's playing in).",
- key = "Source:getDirection",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x component of the direction vector."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the direction vector."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the direction vector."
- }
- }
- }
- }
- },
- {
- name = "getDuration",
- summary = "Get the duration of the Source.",
- description = "Returns the duration of the Source.",
- key = "Source:getDuration",
- module = "lovr.audio",
- related = {
- "AudioStream:getDuration",
- "SoundData:getDuration"
- },
- variants = {
- {
- arguments = {
- {
- name = "unit",
- type = "TimeUnit",
- description = "The unit to return.",
- default = "'seconds'"
- }
- },
- returns = {
- {
- name = "duration",
- type = "number",
- description = "The duration of the Source."
- }
- }
- }
- }
- },
- {
- name = "getFalloff",
- summary = "Get the falloff parameters for the Source.",
- description = "Returns parameters that control how the volume of the Source falls of with distance.",
- key = "Source:getFalloff",
- module = "lovr.audio",
- related = {
- "Source:getVolumeLimits",
- "Source:setVolumeLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "reference",
- type = "number",
- description = "The distance at which the volume will start to decrease."
- },
- {
- name = "max",
- type = "number",
- description = "The distance at which the Source will be its quietest."
- },
- {
- name = "rolloff",
- type = "number",
- description = "How quickly the sound falls off between the reference and max distances (1.0 is the default)."
- }
- }
- }
- }
- },
- {
- name = "getPitch",
- summary = "Get the pitch of the Source.",
- description = "Returns the current pitch factor of the Source. The default is 1.0.",
- key = "Source:getPitch",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "pitch",
- type = "number",
- description = "The current pitch."
- }
- }
- }
- }
- },
- {
- name = "getPosition",
- summary = "Get the position of the Source.",
- description = "Returns the position of the Source, in meters. Setting the position will cause the Source to be distorted and attenuated based on its position relative to the listener.",
- key = "Source:getPosition",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate."
- }
- }
- }
- }
- },
- {
- name = "getSampleRate",
- summary = "Get the sample rate of the Source.",
- description = "Returns the number of samples per second in the Source. This is usually a high number like 44100.",
- key = "Source:getSampleRate",
- module = "lovr.audio",
- related = {
- "SoundData:getSampleRate",
- "AudioStream:getSampleRate"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "frequency",
- type = "number",
- description = "The number of samples per second in the Source."
- }
- }
- }
- }
- },
- {
- name = "getType",
- summary = "Get the SourceType of the Source.",
- description = "Returns the SourceType of the Source that controls how the Source decodes audio. See `SourceType` for more info.",
- key = "Source:getType",
- module = "lovr.audio",
- related = {
- "SourceType",
- "lovr.audio.newSource"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "SourceType",
- description = "The SourceType of the Source."
- }
- }
- }
- }
- },
- {
- name = "getVelocity",
- summary = "Get the velocity of the Source.",
- description = "Returns the velocity of the Source, in meters per second. This affects the doppler effect.",
- key = "Source:getVelocity",
- module = "lovr.audio",
- notes = "The Source does not move based on its velocity.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x velocity."
- },
- {
- name = "y",
- type = "number",
- description = "The y velocity."
- },
- {
- name = "z",
- type = "number",
- description = "The z velocity."
- }
- }
- }
- }
- },
- {
- name = "getVolume",
- summary = "Get the volume of the Source.",
- description = "Returns the current volume factor for the Source. 1.0 is the default and the maximum.",
- key = "Source:getVolume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "volume",
- type = "number",
- description = "The volume of the Source."
- }
- }
- }
- }
- },
- {
- name = "getVolumeLimits",
- summary = "Get the volume limits of the Source.",
- description = "Returns the minimum and maximum volume of the Source. These limits have priority over the parameters set by `Source:setFalloff` and `Source:setCone`, so they can be used to make sure a Source can always be heard even if it's far away.",
- key = "Source:getVolumeLimits",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "min",
- type = "number",
- description = "The minimum volume of the Source."
- },
- {
- name = "max",
- type = "number",
- description = "The maximum volume of the Source."
- }
- }
- }
- }
- },
- {
- name = "isLooping",
- summary = "Check if the Source is looping.",
- description = "Returns whether or not the Source will loop when it finishes.",
- key = "Source:isLooping",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "looping",
- type = "boolean",
- description = "Whether or not the Source is looping."
- }
- }
- }
- }
- },
- {
- name = "isPaused",
- summary = "Check if the Source is paused.",
- description = "Returns whether or not the Source is paused.",
- key = "Source:isPaused",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "paused",
- type = "boolean",
- description = "Whether the Source is paused."
- }
- }
- }
- }
- },
- {
- name = "isPlaying",
- summary = "Check if the Source is playing.",
- description = "Returns whether or not the Source is playing.",
- key = "Source:isPlaying",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "playing",
- type = "boolean",
- description = "Whether the Source is playing."
- }
- }
- }
- }
- },
- {
- name = "isRelative",
- summary = "Check if the Source is relative to the listener.",
- description = "Returns whether or not the Source is relative to the listener. If a Source is relative then its position, velocity, cone, and direction are all relative to the audio listener.",
- key = "Source:isRelative",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "relative",
- type = "boolean",
- description = "Whether or not the Source is relative."
- }
- }
- }
- }
- },
- {
- name = "isStopped",
- summary = "Check if the Source is stopped.",
- description = "Returns whether or not the Source is stopped.",
- key = "Source:isStopped",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "stopped",
- type = "boolean",
- description = "Whether the Source is stopped."
- }
- }
- }
- }
- },
- {
- name = "pause",
- summary = "Pause the Source.",
- description = "Pauses the source. It can be resumed with `Source:resume` or `Source:play`. If a paused source is rewound, it will remain paused.",
- key = "Source:pause",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "play",
- summary = "Play the Source.",
- description = "Plays the Source. This has no effect if the Source is already playing.",
- key = "Source:play",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "resume",
- summary = "Resume the Source.",
- description = "Resumes the Source.",
- key = "Source:resume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "rewind",
- summary = "Rewind the Source.",
- description = "Rewinds the Source, starting it over at the beginning. Paused Sources will remain paused.",
- key = "Source:rewind",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "seek",
- summary = "Set the playback position of the Source.",
- description = "Seeks the Source to the specified position.",
- key = "Source:seek",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "position",
- type = "number",
- description = "The position to seek to."
- },
- {
- name = "unit",
- type = "TimeUnit",
- description = "The units for the seek position.",
- default = "'seconds'"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setCone",
- summary = "Set the Source's volume cone.",
- description = "Sets the directional volume cone of the Source. The cone is specified by three values: `innerAngle`, `outerAngle`, and `outerVolume`. If the listener is inside the `innerAngle`, the Source won't have its volume changed. Otherwise, the volume will start to decrease, reaching a minimum volume of `outerVolume` once the listener is `outerAngle` degrees from the direction of the Source.",
- key = "Source:setCone",
- module = "lovr.audio",
- notes = "The default `innerAngle` for a Source is `0`.\n\nThe default `outerAngle` for a Source is `2 * math.pi`.\n\nThe default `outerVolume` for a Source is `0`.\n\nMake sure to set the direction of a Source before setting its cone.",
- variants = {
- {
- arguments = {
- {
- name = "innerAngle",
- type = "number",
- description = "The inner cone angle, in radians."
- },
- {
- name = "outerAngle",
- type = "number",
- description = "The outer cone angle, in radians."
- },
- {
- name = "outerVolume",
- type = "number",
- description = "The outer cone angle, in radians."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setDirection",
- summary = "Set the direction vector of the Source.",
- description = "Sets the direction vector of the Source (the direction it's playing in).",
- key = "Source:setDirection",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the direction vector."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the direction vector."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the direction vector."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setFalloff",
- summary = "Set the falloff parameters for the Source.",
- description = "Sets parameters that control how the volume of the Source falls of with distance.",
- key = "Source:setFalloff",
- module = "lovr.audio",
- related = {
- "Source:getVolumeLimits",
- "Source:setVolumeLimits"
- },
- variants = {
- {
- arguments = {
- {
- name = "reference",
- type = "number",
- description = "The distance at which the volume will start to decrease."
- },
- {
- name = "max",
- type = "number",
- description = "The distance at which the Source will be its quietest."
- },
- {
- name = "rolloff",
- type = "number",
- description = "How quickly the sound falls off between the reference and max distances (1.0 is the default)."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLooping",
- summary = "Set whether or not the Source loops.",
- description = "Sets whether or not the Source loops.",
- key = "Source:setLooping",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "loop",
- type = "boolean",
- description = "Whether or not the Source will loop."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPitch",
- summary = "Set the pitch of the Source.",
- description = "Sets the pitch of the Source. The default is 1.0.",
- key = "Source:setPitch",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "pitch",
- type = "number",
- description = "The new pitch."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPosition",
- summary = "Set the position of the Source.",
- description = "Sets the position of the Source, in meters. Setting the position will cause the Source to be distorted and attenuated based on its position relative to the listener.\n\nOnly mono sources can be positioned.",
- key = "Source:setPosition",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setRelative",
- summary = "Set whether or not the Source is relative.",
- description = "Sets whether or not the Source is relative to the listener. If a Source is relative then its position, velocity, cone, and direction are all relative to the audio listener.",
- key = "Source:setRelative",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "relative",
- type = "boolean",
- description = "Whether or not the Source is relative."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVelocity",
- summary = "Set the velocity of the Source.",
- description = "Sets the velocity of the Source, in meters per second. This affects the doppler effect.",
- key = "Source:setVelocity",
- module = "lovr.audio",
- notes = "The Source does not move based on its velocity.",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x velocity."
- },
- {
- name = "y",
- type = "number",
- description = "The y velocity."
- },
- {
- name = "z",
- type = "number",
- description = "The z velocity."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVolume",
- summary = "Set the volume of the Source.",
- description = "Sets the current volume factor for the Source. 1.0 is the default and the maximum.",
- key = "Source:setVolume",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "volume",
- type = "number",
- description = "The new volume."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVolumeLimits",
- summary = "Set the volume limits of the Source.",
- description = "Sets the minimum and maximum volume of the Source. These limits have priority over the parameters set by `Source:setFalloff` and `Source:setCone`, so they can be used to make sure a Source can always be heard even if it's far away.",
- key = "Source:setVolumeLimits",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "min",
- type = "number",
- description = "The minimum volume of the Source."
- },
- {
- name = "max",
- type = "number",
- description = "The maximum volume of the Source."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "stop",
- summary = "Stop the Source.",
- description = "Stops the source.",
- key = "Source:stop",
- module = "lovr.audio",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "tell",
- summary = "Get the playback position of the Source.",
- description = "Returns the current playback position of the Source.",
- key = "Source:tell",
- module = "lovr.audio",
- variants = {
- {
- arguments = {
- {
- name = "unit",
- type = "TimeUnit",
- description = "The unit to return.",
- default = "'seconds'"
- }
- },
- returns = {
- {
- name = "position",
- type = "number",
- description = "The current playback position."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.audio.newSource"
- }
- }
- }
- },
- {
- name = "data",
- tag = "modules",
- summary = "Exposes low level functions for working with data.",
- description = "The `lovr.data` module provides functions for accessing underlying data representations for several LÖVR objects.",
- key = "lovr.data",
- functions = {
- {
- name = "newAudioStream",
- summary = "Create a new AudioStream.",
- description = "Creates a new AudioStream from ogg data.",
- key = "lovr.data.newAudioStream",
- module = "lovr.data",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the audio file to load."
- },
- {
- name = "bufferSize",
- type = "number",
- description = "The size of the stream's audio buffer, in samples.",
- default = "4096"
- }
- },
- returns = {
- {
- name = "audioStream",
- type = "AudioStream",
- description = "The new AudioStream."
- }
- }
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing audio data to decode."
- },
- {
- name = "bufferSize",
- type = "number",
- description = "The size of the stream's audio buffer, in samples.",
- default = "4096"
- }
- },
- returns = {
- {
- name = "audioStream",
- type = "AudioStream",
- description = "The new AudioStream."
- }
- }
- }
- }
- },
- {
- name = "newBlob",
- summary = "Create a new Blob.",
- description = "Creates a new Blob. A Blob is a piece of binary data.",
- key = "lovr.data.newBlob",
- module = "lovr.data",
- notes = "Note that `TextureData` and `SoundData` are Blobs and can be cloned using this function.",
- variants = {
- {
- arguments = {
- {
- name = "size",
- type = "number",
- description = "The amount of data to allocate for the Blob, in bytes. Its content will be set to zero."
- },
- {
- name = "name",
- type = "string",
- description = "A name for the Blob (used in error messages)",
- default = "''"
- }
- },
- returns = {
- {
- name = "blob",
- type = "Blob",
- description = "The new Blob."
- }
- }
- },
- {
- arguments = {
- {
- name = "contents",
- type = "string",
- description = "A string containing the Blob's contents."
- },
- {
- name = "name",
- type = "string",
- description = "A name for the Blob (used in error messages)",
- default = "''"
- }
- },
- returns = {
- {
- name = "blob",
- type = "Blob",
- description = "The new Blob."
- }
- }
- },
- {
- arguments = {
- {
- name = "source",
- type = "Blob",
- description = "A Blob to copy the contents from."
- },
- {
- name = "name",
- type = "string",
- description = "A name for the Blob (used in error messages)",
- default = "''"
- }
- },
- returns = {
- {
- name = "blob",
- type = "Blob",
- description = "The new Blob."
- }
- }
- }
- }
- },
- {
- name = "newModelData",
- summary = "Create a new ModelData.",
- description = "Creates a new ModelData from a 3D model file.",
- key = "lovr.data.newModelData",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "modelData",
- type = "ModelData",
- description = "The new ModelData."
- }
- }
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing model to decode."
- }
- },
- returns = {
- {
- name = "modelData",
- type = "ModelData",
- description = "The new ModelData."
- }
- }
- }
- }
- },
- {
- name = "newRasterizer",
- summary = "Create a new Rasterizer.",
- description = "Creates a new Rasterizer from a TTF file.",
- key = "lovr.data.newRasterizer",
- module = "lovr.data",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the font file to load."
- },
- {
- name = "size",
- type = "number",
- description = "The resolution to render the fonts at, in pixels.",
- default = "32"
- }
- },
- returns = {
- {
- name = "rasterizer",
- type = "Rasterizer",
- description = "The new Rasterizer."
- }
- }
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing font data."
- },
- {
- name = "size",
- type = "number",
- description = "The resolution to render the fonts at, in pixels.",
- default = "32"
- }
- },
- returns = {
- {
- name = "rasterizer",
- type = "Rasterizer",
- description = "The new Rasterizer."
- }
- }
- }
- }
- },
- {
- name = "newSoundData",
- summary = "Create a new SoundData.",
- description = "Creates a new SoundData. You can pass a filename or Blob to decode, an existing AudioStream to decode audio samples from, or you can create an empty SoundData that is able to hold a certain number of samples.",
- key = "lovr.data.newSoundData",
- module = "lovr.data",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the sound to decode."
- }
- },
- returns = {
- {
- name = "soundData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- },
- {
- arguments = {
- {
- name = "samples",
- type = "number",
- description = "The total number of samples in each channel."
- },
- {
- name = "sampleRate",
- type = "number",
- description = "The number of samples per second.",
- default = "44100"
- },
- {
- name = "bitDepth",
- type = "number",
- description = "The number of bits stored for each sample.",
- default = "16"
- }
- },
- returns = {
- {
- name = "soundData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- },
- {
- arguments = {},
- returns = {
- {
- name = "soundData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- },
- {
- arguments = {
- {
- name = "blob",
- type = "string",
- description = "The Blob containing sound data to decode."
- }
- },
- returns = {
- {
- name = "soundData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- }
- }
- },
- {
- name = "newTextureData",
- summary = "Create a new TextureData.",
- description = "Creates a new TextureData with a given width and height or from an image file.",
- key = "lovr.data.newTextureData",
- module = "lovr.data",
- variants = {
- {
- description = "Load image data from a file.",
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the image to load."
- }
- },
- returns = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- },
- {
- description = "Create an empty TextureData, initializing all color components to 0.",
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the texture data."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the texture data."
- },
- {
- name = "format",
- type = "TextureFormat",
- description = "The format of the texture's pixels.",
- default = "rgba"
- }
- },
- returns = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- },
- {
- description = "Decode image data from a Blob.",
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing image data to decode."
- }
- },
- returns = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- }
- }
- }
- },
- enums = {},
- objects = {
- {
- name = "AudioStream",
- summary = "An object that gradually decodes audio data.",
- description = "An AudioStream is an object that reads and decodes compressed sound data. All Source objects are powered by AudioStreams.\n\nUsually you can just use Sources without having to deal with AudioStreams, but sometimes you may need low-level access to the audio stream.",
- key = "AudioStream",
- module = "lovr.data",
- methods = {
- {
- name = "decode",
- summary = "Decode the next chunk of audio in the AudioStream.",
- description = "Returns a new SoundData containing the next chunk of audio in the AudioStream.",
- key = "AudioStream:decode",
- module = "lovr.data",
- notes = "This function may return nil if there isn't any audio left in the stream.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "soundData",
- type = "SoundData",
- description = "The SoundData object containing raw audio samples."
- }
- }
- }
- }
- },
- {
- name = "getBitDepth",
- summary = "Get the bit depth of the AudioStream.",
- description = "Returns the number of bits per sample in the stream's sound data. This is a rough indicator of the \"resolution\" of the sound, and is usually 16.",
- key = "AudioStream:getBitDepth",
- module = "lovr.data",
- related = {
- "SoundData:getBitDepth",
- "Source:getBitDepth"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "bits",
- type = "number",
- description = "The number of bits per sample."
- }
- }
- }
- }
- },
- {
- name = "getChannelCount",
- summary = "Get the number of channels in the AudioStream.",
- description = "Returns the number of channels present in the stream's sound data. Mono sounds have 1 channel and stereo sounds have 2 channels.",
- key = "AudioStream:getChannelCount",
- module = "lovr.data",
- related = {
- "SoundData:getChannelCount",
- "Source:getChannelCount"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "channels",
- type = "number",
- description = "The number of channels."
- }
- }
- }
- }
- },
- {
- name = "getDuration",
- summary = "Get the duration of the AudioStream.",
- description = "Returns the duration of the sound data in seconds.",
- key = "AudioStream:getDuration",
- module = "lovr.data",
- related = {
- "SoundData:getDuration",
- "Source:getDuration"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "duration",
- type = "number",
- description = "The duration of the sound."
- }
- }
- }
- }
- },
- {
- name = "getSampleRate",
- summary = "Get the sample rate of the AudioStream.",
- description = "Returns the number of samples per second in the stream's sound data. This is usually a high number like 44100.",
- key = "AudioStream:getSampleRate",
- module = "lovr.data",
- related = {
- "SoundData:getSampleRate",
- "Source:getSampleRate"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "frequency",
- type = "number",
- description = "The number of samples per second in the AudioStream."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.data.newAudioStream"
- }
- },
- {
- name = "Blob",
- summary = "A chunk of binary data.",
- description = "A Blob is an object that holds binary data. It can be passed to most functions that take filename arguments, like `lovr.graphics.newModel` or `lovr.audio.newSource`. Blobs aren't usually necessary for simple projects, but they can be really helpful if:\n\n- You need to work with low level binary data, potentially using the LuaJIT FFI for increased\n performance.\n- You are working with data that isn't stored as a file, such as programmatically generated data\n or a string from a network request.\n- You want to load data from a file once and then use it to create many different objects.\n\nA Blob's size cannot be changed once it is created.",
- key = "Blob",
- module = "lovr.data",
- methods = {
- {
- name = "getName",
- summary = "Get the label of the Blob.",
- description = "Returns the filename the Blob was loaded from, or the custom name given to it when it was created. This label is also used in error messages.",
- key = "Blob:getName",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "name",
- type = "string",
- description = "The name of the Blob."
- }
- }
- }
- }
- },
- {
- name = "getPointer",
- summary = "Get a raw pointer to the Blob's data.",
- description = "Returns a raw pointer to the Blob's data. This can be used to interface with other C libraries using the LuaJIT FFI. Use this only if you know what you're doing!",
- key = "Blob:getPointer",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "pointer",
- type = "userdata",
- description = "A pointer to the data."
- }
- }
- }
- }
- },
- {
- name = "getSize",
- summary = "Get the size of the Blob's data.",
- description = "Returns the size of the Blob's contents, in bytes.",
- key = "Blob:getSize",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "bytes",
- type = "number",
- description = "The size of the Blob, in bytes."
- }
- }
- }
- }
- },
- {
- name = "getString",
- summary = "Get the Blob's contents as a string.",
- description = "Returns a binary string containing the Blob's data.",
- key = "Blob:getString",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "data",
- type = "string",
- description = "The Blob's data."
- }
- }
- }
- },
- examples = {
- {
- description = "Manually copy a file using Blobs:",
- code = "blob = lovr.filesystem.newBlob('image.png')\nlovr.filesystem.write('copy.png', blob:getString())"
- }
- }
- }
- },
- constructors = {
- "lovr.data.newBlob",
- "lovr.filesystem.newBlob"
- }
- },
- {
- name = "ModelData",
- summary = "An object that loads and stores data for 3D models.",
- description = "A ModelData is a container object that loads and holds data contained in 3D model files. This can include a variety of things like the node structure of the asset, the vertex data it contains, contains, the `TextureData` and `Material` properties, and any included animations.\n\nThe current supported formats are OBJ and glTF.\n\nUsually you can just load a `Model` directly, but using a `ModelData` can be helpful if you want to load models in a thread or access more low-level information about the Model.",
- key = "ModelData",
- module = "lovr.data",
- methods = {},
- constructors = {
- "lovr.data.newModelData"
- }
- },
- {
- name = "Rasterizer",
- summary = "An object that rasterizes glyphs from font files.",
- description = "A Rasterizer is an object that parses a TTF file, decoding and rendering glyphs from it.\n\nUsually you can just use `Font` objects.",
- key = "Rasterizer",
- module = "lovr.data",
- methods = {
- {
- name = "getAdvance",
- summary = "Get the advance of the font.",
- description = "Returns the advance metric of the font, in pixels. The advance is how many pixels the font advances horizontally after each glyph is rendered. This does not include kerning.",
- key = "Rasterizer:getAdvance",
- module = "lovr.data",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "advance",
- type = "number",
- description = "The advance of the font, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getAscent",
- summary = "Get the ascent of the font.",
- description = "Returns the ascent metric of the font, in pixels. The ascent represents how far any glyph of the font ascends above the baseline.",
- key = "Rasterizer:getAscent",
- module = "lovr.data",
- related = {
- "Rasterizer:getDescent",
- "Font:getAscent"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "ascent",
- type = "number",
- description = "The ascent of the font, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getDescent",
- summary = "Get the descent of the font.",
- description = "Returns the descent metric of the font, in pixels. The descent represents how far any glyph of the font descends below the baseline.",
- key = "Rasterizer:getDescent",
- module = "lovr.data",
- related = {
- "Rasterzer:getAscent",
- "Font:getDescent"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "descent",
- type = "number",
- description = "The descent of the font, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getGlyphCount",
- summary = "Get the number of glyphs stored in the font file.",
- description = "Returns the number of glyphs stored in the font file.",
- key = "Rasterizer:getGlyphCount",
- module = "lovr.data",
- related = {
- "Rasterizer:hasGlyphs"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "count",
- type = "number",
- description = "The number of glyphs stored in the font file."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- summary = "Get the height of the font.",
- description = "Returns the height metric of the font, in pixels.",
- key = "Rasterizer:getHeight",
- module = "lovr.data",
- related = {
- "Font:getHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the font, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getLineHeight",
- summary = "Get the line height of the font.",
- description = "Returns the line height metric of the font, in pixels. This is how far apart lines are.",
- key = "Rasterizer:getLineHeight",
- module = "lovr.data",
- related = {
- "Rasterizer:getHeight",
- "Font:getLineHeight",
- "Font:setLineHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The line height of the font, in pixels."
- }
- }
- }
- }
- },
- {
- name = "hasGlyphs",
- summary = "Get whether the Rasterizer can rasterize a set of glyphs.",
- description = "Check if the Rasterizer can rasterize a set of glyphs.",
- key = "Rasterizer:hasGlyphs",
- module = "lovr.data",
- related = {
- "Rasterizer:getGlyphCount"
- },
- variants = {
- {
- arguments = {
- {
- name = "...",
- type = "*",
- description = "Strings (sets of characters) or numbers (character codes) to check for."
- }
- },
- returns = {
- {
- name = "hasGlyphs",
- type = "boolean",
- description = "true if the Rasterizer can rasterize all of the supplied characters, false otherwise."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.data.newRasterizer"
- }
- },
- {
- name = "SoundData",
- summary = "An object that holds raw audio samples.",
- description = "A SoundData stores raw audio samples that make up a sound file. You can use `Source` objects to play SoundData.",
- key = "SoundData",
- module = "lovr.data",
- methods = {
- {
- name = "getBitDepth",
- summary = "Get the bit depth of the SoundData.",
- description = "Returns the number of bits taken up by each sample in the SoundData. Higher bit depths mean the sound is higher quality and takes up more space. This is usually 8 or 16.",
- key = "SoundData:getBitDepth",
- module = "lovr.data",
- related = {
- "AudioStream:getBitDepth",
- "Source:getBitDepth"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "bitDepth",
- type = "number",
- description = "The size of each sample, in bits."
- }
- }
- }
- }
- },
- {
- name = "getChannelCount",
- summary = "Get the number of channels in the SoundData.",
- description = "Returns the number of channels in the SoundData. Mono sounds have 1 channel and stereo sounds have 2 channels.",
- key = "SoundData:getChannelCount",
- module = "lovr.data",
- related = {
- "AudioStream:getChannelCount",
- "Source:getChannelCount"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "channels",
- type = "number",
- description = "The number of channels."
- }
- }
- }
- },
- notes = "It's important to keep in mind the channel count if you're using `SoundData:getSample` and `SoundData:setSample`. The SoundData stores its samples in an \"interleaved\" manner, meaning the samples from different channels are stored next to each other.\n\nIf you want to get the 3rd sample of the second channel of a stereo sound, you would use sample number 5, since samples start at zero and `(sample * channelCount) + channelIndex = 5`."
- },
- {
- name = "getDuration",
- summary = "Get the duration of the SoundData.",
- description = "Returns the duration of the sound data in seconds.",
- key = "SoundData:getDuration",
- module = "lovr.data",
- related = {
- "SoundData:getSampleCount",
- "AudioStream:getDuration",
- "Source:getDuration"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "duration",
- type = "number",
- description = "The duration of the sound."
- }
- }
- }
- }
- },
- {
- name = "getSample",
- summary = "Get a sample from the SoundData.",
- description = "Returns a single sample from the SoundData. Sample indices start at 0, and the returned value will be between -1 and 1.",
- key = "SoundData:getSample",
- module = "lovr.data",
- related = {
- "SoundData:getSampleCount",
- "SoundData:getSampleRate"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the sample to get."
- }
- },
- returns = {
- {
- name = "value",
- type = "number",
- description = "A number indicating the value of the sample at the given index."
- }
- }
- }
- },
- notes = "Note that samples for individual channels in stereo sounds are stored next to each other."
- },
- {
- name = "getSampleCount",
- summary = "Get the number of samples stored in the SoundData.",
- description = "Returns the number of samples in the SoundData (per channel).",
- key = "SoundData:getSampleCount",
- module = "lovr.data",
- related = {
- "SoundData:getSample",
- "SoundData:getChannelCount",
- "Source:getDuration"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "samples",
- type = "number",
- description = "The total number of channels per channel."
- }
- }
- }
- }
- },
- {
- name = "getSampleRate",
- summary = "Get the sample rate of the SoundData.",
- description = "Returns the number of samples per second in the SoundData. This is usually a high number like 44100.",
- key = "SoundData:getSampleRate",
- module = "lovr.data",
- related = {
- "AudioStream:getSampleRate",
- "Source:getSampleRate"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "frequency",
- type = "number",
- description = "The number of samples per second in the SoundData."
- }
- }
- }
- }
- },
- {
- name = "setSample",
- summary = "Modify a sample in the SoundData.",
- description = "Modify a single sample in the SoundData. Sample indices start at zero, and samples should be between -1 and 1.",
- key = "SoundData:setSample",
- module = "lovr.data",
- related = {
- "SoundData:getSampleCount",
- "SoundData:getSampleRate"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the sample to set."
- },
- {
- name = "value",
- type = "number",
- description = "The new value of the sample."
- }
- },
- returns = {}
- }
- },
- notes = "Note that samples for individual channels in stereo sounds are stored next to each other."
- }
- },
- constructors = {
- "lovr.data.newSoundData",
- "AudioStream:decode",
- "Microphone:getData"
- }
- },
- {
- name = "TextureData",
- summary = "An object that stores pixel data for Textures.",
- description = "A TextureData stores raw 2D pixel info for `Texture`s. It has a width, height, and format. The TextureData can be initialized with the contents of an image file or it can be created with uninitialized contents. The supported image formats are `png`, `jpg`, `hdr`, `dds`, `ktx`, and `astc`.\n\nUsually you can just use Textures, but TextureData can be useful if you want to manipulate individual pixels or load Textures in a background thread.",
- key = "TextureData",
- module = "lovr.data",
- methods = {
- {
- name = "encode",
- summary = "Encode the TextureData as png and write it to a file.",
- description = "Encodes the TextureData to png and writes it to the specified file.",
- key = "TextureData:encode",
- module = "lovr.data",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The file to write the png data to."
- }
- },
- returns = {
- {
- name = "success",
- type = "boolean",
- description = "Whether or not the file was successfully written to."
- }
- }
- }
- }
- },
- {
- name = "getDimensions",
- summary = "Get the dimensions of the TextureData.",
- description = "Returns the dimensions of the TextureData, in pixels.",
- key = "TextureData:getDimensions",
- module = "lovr.data",
- related = {
- "TextureData:getWidth",
- "TextureData:getHeight",
- "Texture:getDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the TextureData, in pixels."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the TextureData, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- summary = "Get the height of the TextureData.",
- description = "Returns the height of the TextureData, in pixels.",
- key = "TextureData:getHeight",
- module = "lovr.data",
- related = {
- "TextureData:getWidth",
- "TextureData:getDimensions",
- "Texture:getHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the TextureData, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getPixel",
- summary = "Get the value of a pixel of the TextureData.",
- description = "Returns the value of a pixel of the TextureData.",
- key = "TextureData:getPixel",
- module = "lovr.data",
- related = {
- "TextureData:setPixel",
- "Texture:replacePixels"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the pixel to get (0-indexed)."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the pixel to get (0-indexed)."
- }
- },
- returns = {
- {
- name = "r",
- type = "number",
- description = "The red component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the pixel, from 0.0 to 1.0."
- }
- }
- }
- }
- },
- {
- name = "getWidth",
- summary = "Get the width of the TextureData.",
- description = "Returns the width of the TextureData, in pixels.",
- key = "TextureData:getWidth",
- module = "lovr.data",
- related = {
- "TextureData:getHeight",
- "TextureData:getDimensions",
- "Texture:getWidth"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the TextureData, in pixels."
- }
- }
- }
- }
- },
- {
- name = "setPixel",
- summary = "Set the value of a pixel of the TextureData.",
- description = "Sets the value of a pixel of the TextureData.",
- key = "TextureData:setPixel",
- module = "lovr.data",
- related = {
- "TextureData:getPixel",
- "Texture:replacePixels"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the pixel to set (0-indexed)."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the pixel to set (0-indexed)."
- },
- {
- name = "r",
- type = "number",
- description = "The red component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the pixel, from 0.0 to 1.0."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the pixel, from 0.0 to 1.0.",
- default = "1.0"
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.data.newTextureData",
- "Canvas:newTextureData"
- }
- }
- }
- },
- {
- name = "event",
- tag = "modules",
- summary = "Handles events from the operating system.",
- description = "The `lovr.event` module handles events from the operating system.\n\nDue to its low-level nature, it's rare to use `lovr.event` in simple projects.",
- key = "lovr.event",
- functions = {
- {
- name = "clear",
- summary = "Clear the event queue.",
- description = "Clears the event queue, removing any unprocessed events.",
- key = "lovr.event.clear",
- module = "lovr.event",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "poll",
- summary = "Iterate over unprocessed events in the queue.",
- description = "This function returns a Lua iterator for all of the unprocessed items in the event queue. Each event consists of a name as a string, followed by event-specific arguments. Typically this function is automatically called for you by `lovr.run`.",
- key = "lovr.event.poll",
- module = "lovr.event",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "iterator",
- type = "function",
- description = "The iterator function, usable in a for loop.",
- arguments = {},
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "pump",
- summary = "Pump new events into the queue for processing.",
- description = "Fills the event queue with unprocessed events from the operating system. This function should be called often, otherwise the operating system will consider your application unresponsive. By default, this function is called automatically by `lovr.run`.",
- key = "lovr.event.pump",
- module = "lovr.event",
- related = {
- "lovr.event.poll"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "push",
- summary = "Manually push an event onto the queue.",
- description = "Pushes an event onto the event queue. It will be processed the next time `lovr.event.poll` is called. For an event to be processed properly, there needs to be a function in the `lovr.handlers` table with a key that's the same as the event name.",
- key = "lovr.event.push",
- module = "lovr.event",
- related = {
- "lovr.event.poll",
- "lovr.event.quit"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the event."
- },
- {
- name = "...",
- type = "*",
- description = "The arguments for the event. Currently, up to 4 are supported."
- }
- },
- returns = {}
- }
- },
- notes = "Only nil, booleans, numbers, strings, and LÖVR objects are supported types for event payloads."
- },
- {
- name = "quit",
- summary = "Quit the application.",
- description = "Pushes an event to quit or restart the application. An optional number can be passed to set the exit code for the application. An exit code of zero indicates normal termination, whereas a nonzero exit code indicates that an error occurred.",
- key = "lovr.event.quit",
- module = "lovr.event",
- related = {
- "lovr.quit",
- "lovr.event.poll"
- },
- variants = {
- {
- arguments = {
- {
- name = "code",
- type = "number",
- description = "The exit code of the program.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "'restart'",
- type = "string",
- description = "Restart instead of quitting."
- }
- },
- returns = {}
- }
- },
- notes = "This function is equivalent to calling `lovr.event.push('quit', <args>)`.\n\nThe program won't actually exit until the next time `lovr.event.poll` is called."
- }
- },
- examples = {
- {
- description = "Adding a custom event.",
- code = "function lovr.load()\n lovr.handlers['customevent'] = function(a, b, c)\n print('custom event handled with args:', a, b, c)\n end\n\n lovr.event.push('customevent', 1, 2, 3)\nend"
- }
- },
- enums = {},
- objects = {},
- notes = "You can define your own custom events by adding a function to the `lovr.handlers` table with a key of the name of the event you want to add. Then, push the event using `lovr.event.push`."
- },
- {
- name = "filesystem",
- tag = "modules",
- summary = "Provides access to the filesystem.",
- description = "The `lovr.filesystem` module provides access to the filesystem.",
- key = "lovr.filesystem",
- enums = {},
- notes = "LÖVR programs can only write to a single directory, called the save directory. The location of the save directory is platform-specific:\n\n<table>\n <tr>\n <td>Windows</td>\n <td><code>C:\\Users\\<user>\\AppData\\Roaming\\LOVR\\<identity></code></td>\n </tr>\n <tr>\n <td>macOS</td>\n <td><code>/Users/<user>/Library/Application Support/LOVR/<identity></code></td>\n </tr> </table>\n\n`<identity>` should be a unique identifier for your app. It can be set either in `lovr.conf` or by using `lovr.filesystem.setIdentity`.\n\nAll filenames are relative to either the save directory or the directory containing the project source. Files in the save directory take precedence over files in the project.",
- functions = {
- {
- name = "append",
- summary = "Append content to the end of a file.",
- description = "Appends content to the end of the file.",
- key = "lovr.filesystem.append",
- module = "lovr.filesystem",
- notes = "If the file does not exist, it is created.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The file to append to."
- },
- {
- name = "content",
- type = "string",
- description = "A string to write to the end of the file."
- }
- },
- returns = {
- {
- name = "bytes",
- type = "number",
- description = "The number of bytes written."
- }
- }
- }
- }
- },
- {
- name = "createDirectory",
- summary = "Create a directory.",
- description = "Creates a directory in the save directory.",
- key = "lovr.filesystem.createDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The directory to create."
- }
- },
- returns = {
- {
- name = "success",
- type = "boolean",
- description = "Whether the directory was created."
- }
- }
- }
- }
- },
- {
- name = "getAppdataDirectory",
- summary = "Get the application data directory.",
- description = "Returns the application data directory. This will be something like `C:\\Users\\user\\AppData` on Windows, or `/Users/user/Library/Application Support` on macOS.",
- key = "lovr.filesystem.getAppdataDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The absolute path to the appdata directory."
- }
- }
- }
- }
- },
- {
- name = "getApplicationId",
- summary = "Get the application ID.",
- description = "Returns the platform-specific application ID, or `nil` if this does not apply.\n\nCurrently only implemented on Android.",
- key = "lovr.filesystem.getApplicationId",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "id",
- type = "string",
- description = "The application ID."
- }
- }
- }
- }
- },
- {
- name = "getDirectoryItems",
- summary = "Get a list of files in a directory..",
- description = "Returns an unsorted table containing all files and subfolders in a directory.",
- key = "lovr.filesystem.getDirectoryItems",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The directory."
- }
- },
- returns = {
- {
- name = "table",
- type = "items",
- description = "A table with a string for each file and subfolder in the directory."
- }
- }
- }
- }
- },
- {
- name = "getExecutablePath",
- summary = "Get the path of the LÖVR executable.",
- description = "Returns the absolute path of the LÖVR executable.",
- key = "lovr.filesystem.getExecutablePath",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The absolute path of the LÖVR executable."
- }
- }
- }
- }
- },
- {
- name = "getIdentity",
- summary = "Get the name of the save directory.",
- description = "Returns the identity of the game, which is used as the name of the save directory. The default is `default`.",
- key = "lovr.filesystem.getIdentity",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "identity",
- type = "string",
- description = "The name of the save directory."
- }
- }
- }
- }
- },
- {
- name = "getLastModified",
- summary = "Get the modification time of a file.",
- description = "Returns when a file was last modified.",
- key = "lovr.filesystem.getLastModified",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "file",
- type = "string",
- description = "The file."
- }
- },
- returns = {
- {
- name = "time",
- type = "number",
- description = "The time when the file was last modified, in seconds."
- }
- }
- }
- }
- },
- {
- name = "getRealDirectory",
- summary = "Get the absolute path to a file.",
- description = "Get the absolute path of a directory containing a path in the virtual filesystem. This can be used to determine if a file is in the game's source directory or the save directory.",
- key = "lovr.filesystem.getRealDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The path to check."
- }
- },
- returns = {
- {
- name = "realpath",
- type = "string",
- description = "The absolute path of the directory containing `path`."
- }
- }
- }
- }
- },
- {
- name = "getRequirePath",
- summary = "Get the require path.",
- description = "Returns the require path. The require path is a semicolon-separated list of patterns that LÖVR will use to search for files when they are `require`d. Any question marks in the pattern will be replaced with the module that is being required. It is similar to Lua\\'s `package.path` variable, but the main difference is that the patterns are relative to the save directory and the project directory.\n\nFor the C require path, double question marks will be replaced by the name of the module with the operating system's native extension for shared libraries. For example, if you do `require('lib')` and the C require path is `??`, LÖVR will try to load `lib.dll` if you're on Windows or `lib.so` if you're on Linux.",
- key = "lovr.filesystem.getRequirePath",
- module = "lovr.filesystem",
- notes = "The default reqiure path is '?.lua;?/init.lua;lua_modules/?.lua;lua_modules/?/init.lua'. The default C require path is '??'.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The semicolon separated list of search patterns."
- },
- {
- name = "cpath",
- type = "string",
- description = "The semicolon separated list of search patterns for C libraries."
- }
- }
- }
- }
- },
- {
- name = "getSaveDirectory",
- summary = "Get the location of the save directory.",
- description = "Returns the absolute path to the save directory.",
- key = "lovr.filesystem.getSaveDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The absolute path to the save directory."
- }
- }
- }
- }
- },
- {
- name = "getSize",
- summary = "Get the size of a file.",
- description = "Returns the size of a file, in bytes.",
- key = "lovr.filesystem.getSize",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "file",
- type = "string",
- description = "The file."
- }
- },
- returns = {
- {
- name = "size",
- type = "number",
- description = "The size of the file, in bytes."
- }
- }
- }
- }
- },
- {
- name = "getSource",
- summary = "Get the location of the project source.",
- description = "Get the absolute path of the project's source directory or archive.",
- key = "lovr.filesystem.getSource",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The absolute path of the project's source."
- }
- }
- }
- }
- },
- {
- name = "getUserDirectory",
- summary = "Get the location of the user's home directory.",
- description = "Returns the absolute path of the user's home directory.",
- key = "lovr.filesystem.getUserDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The absolute path of the user's home directory."
- }
- }
- }
- }
- },
- {
- name = "getWorkingDirectory",
- summary = "Get the current working directory.",
- description = "Returns the absolute path of the working directory. Usually this is where the executable was started from.",
- key = "lovr.filesystem.getWorkingDirectory",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "path",
- type = "string",
- description = "The current working directory."
- }
- }
- }
- }
- },
- {
- name = "isDirectory",
- summary = "Check whether a path is a directory.",
- description = "Check if a path exists and is a directory.",
- key = "lovr.filesystem.isDirectory",
- module = "lovr.filesystem",
- related = {
- "lovr.filesystem.isFile"
- },
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The path to check."
- }
- },
- returns = {
- {
- name = "isDirectory",
- type = "boolean",
- description = "Whether or not path is a directory."
- }
- }
- }
- }
- },
- {
- name = "isFile",
- summary = "Check whether a path is a file.",
- description = "Check if a path exists and is a file.",
- key = "lovr.filesystem.isFile",
- module = "lovr.filesystem",
- related = {
- "lovr.filesystem.isDirectory"
- },
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The path to check."
- }
- },
- returns = {
- {
- name = "isFile",
- type = "boolean",
- description = "Whether or not path is a file."
- }
- }
- }
- }
- },
- {
- name = "isFused",
- summary = "Check if the project is fused.",
- description = "Returns whether the current project source is fused to the executable.",
- key = "lovr.filesystem.isFused",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "fused",
- type = "boolean",
- description = "Whether or not the project is fused."
- }
- }
- }
- }
- },
- {
- name = "load",
- summary = "Load a file as Lua code.",
- description = "Load a file containing Lua code, returning a Lua chunk that can be run.",
- key = "lovr.filesystem.load",
- module = "lovr.filesystem",
- notes = "An error is thrown if the file contains syntax errors.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The file to load."
- }
- },
- returns = {
- {
- name = "chunk",
- type = "function",
- description = "The runnable chunk.",
- arguments = {
- {
- name = "...",
- type = "*"
- }
- },
- returns = {
- {
- name = "...",
- type = "*"
- }
- }
- }
- }
- }
- },
- examples = {
- {
- description = "Safely loading code:",
- code = "local success, chunk = pcall(lovr.filesystem.load, filename)\nif not success then\n print('Oh no! There was an error: ' .. tostring(chunk))\nelse\n local success, result = pcall(chunk)\n print(success, result)\nend"
- }
- }
- },
- {
- name = "mount",
- summary = "Mount a directory or archive.",
- description = "Mounts a directory or `.zip` archive, adding it to the virtual filesystem. This allows you to read files from it.",
- key = "lovr.filesystem.mount",
- module = "lovr.filesystem",
- related = {
- "lovr.filesystem.unmount"
- },
- notes = "The `append` option lets you control the priority of the archive's files in the event of naming collisions.",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The path to mount."
- },
- {
- name = "mountpoint",
- type = "string",
- description = "The path in the virtual filesystem to mount to.",
- default = "'/'"
- },
- {
- name = "append",
- type = "boolean",
- description = "Whether the archive will be added to the end or the beginning of the search path.",
- default = "false"
- },
- {
- name = "root",
- type = "string",
- description = "A subdirectory inside the archive to use as the root. If `nil`, the actual root of the archive is used.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "success",
- type = "boolean",
- description = "Whether the archive was successfully mounted."
- }
- }
- }
- },
- examples = {
- {
- description = "Mount `data.zip` with a file `images/background.png`:",
- code = "lovr.filesystem.mount('data.zip', 'assets')\nprint(lovr.filesystem.isFile('assets/images/background.png')) -- true"
- }
- }
- },
- {
- name = "newBlob",
- summary = "Create a new Blob from a file.",
- description = "Creates a new Blob that contains the contents of a file.",
- key = "lovr.filesystem.newBlob",
- module = "lovr.filesystem",
- related = {
- "lovr.data.newBlob",
- "Blob"
- },
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The file to load."
- }
- },
- returns = {
- {
- name = "blob",
- type = "Blob",
- description = "The new Blob."
- }
- }
- }
- }
- },
- {
- name = "read",
- summary = "Read a file.",
- description = "Read the contents of a file.",
- key = "lovr.filesystem.read",
- module = "lovr.filesystem",
- notes = "If the file does not exist or cannot be read, an error is thrown.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The name of the file to read."
- }
- },
- returns = {
- {
- name = "contents",
- type = "string",
- description = "The contents of the file."
- }
- }
- }
- }
- },
- {
- name = "remove",
- summary = "Remove a file or directory.",
- description = "Remove a file or directory in the save directory.",
- key = "lovr.filesystem.remove",
- module = "lovr.filesystem",
- notes = "A directory can only be removed if it is empty.",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The file or folder to remove.."
- }
- },
- returns = {
- {
- name = "success",
- type = "boolean",
- description = "Whether the path was removed."
- }
- }
- }
- }
- },
- {
- name = "setIdentity",
- summary = "Set the name of the save directory.",
- description = "Set the name of the save directory.",
- key = "lovr.filesystem.setIdentity",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "identity",
- type = "string",
- description = "The new name of the save directory."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setRequirePath",
- summary = "Set the require path.",
- description = "Sets the require path. The require path is a semicolon-separated list of patterns that LÖVR will use to search for files when they are `require`d. Any question marks in the pattern will be replaced with the module that is being required. It is similar to Lua\\'s `package.path` variable, but the main difference is that the patterns are relative to the save directory and the project directory.\n\nFor the C require path, double question marks will be replaced by the name of the module with the operating system's native extension for shared libraries. For example, if you do `require('lib')` and the C require path is `??`, LÖVR will try to load `lib.dll` if you're on Windows or `lib.so` if you're on Linux.",
- key = "lovr.filesystem.setRequirePath",
- module = "lovr.filesystem",
- notes = "The default reqiure path is '?.lua;?/init.lua;lua_modules/?.lua;lua_modules/?/init.lua'. The default C require path is '??'.",
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "An optional semicolon separated list of search patterns.",
- default = "nil"
- },
- {
- name = "cpath",
- type = "string",
- description = "An optional semicolon separated list of search patterns for C libraries.",
- default = "nil"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setSource",
- summary = "Set the project source.",
- description = "Sets the location of the project's source. This can only be done once, and is usually done internally.",
- key = "lovr.filesystem.setSource",
- module = "lovr.filesystem",
- variants = {
- {
- arguments = {
- {
- name = "identity",
- type = "string",
- description = "The path containing the project's source."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "unmount",
- summary = "Unmount a mounted archive.",
- description = "Unmounts a directory or archive previously mounted with `lovr.filesystem.mount`.",
- key = "lovr.filesystem.unmount",
- module = "lovr.filesystem",
- related = {
- "lovr.filesystem.mount"
- },
- variants = {
- {
- arguments = {
- {
- name = "path",
- type = "string",
- description = "The path to unmount."
- }
- },
- returns = {
- {
- name = "success",
- type = "boolean",
- description = "Whether the archive was unmounted."
- }
- }
- }
- }
- },
- {
- name = "write",
- summary = "Write to a file.",
- description = "Write to a file.",
- key = "lovr.filesystem.write",
- module = "lovr.filesystem",
- notes = "If the file does not exist, it is created.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The file to write to."
- },
- {
- name = "content",
- type = "string",
- description = "A string to write to the file."
- }
- },
- returns = {
- {
- name = "bytes",
- type = "number",
- description = "The number of bytes written."
- }
- }
- }
- }
- }
- },
- objects = {}
- },
- {
- name = "graphics",
- tag = "modules",
- summary = "Renders graphics.",
- description = "The `lovr.graphics` module renders graphics to displays. Anything rendered using this module will automatically show up in the VR headset if one is connected, otherwise it will just show up in a window on the desktop.",
- key = "lovr.graphics",
- sections = {
- {
- name = "Drawing",
- tag = "graphicsPrimitives",
- description = "Simple functions for drawing simple shapes."
- },
- {
- name = "Objects",
- tag = "graphicsObjects",
- description = "Several graphics-related objects can be created with the graphics module. Try to avoid calling these functions in `lovr.update` or `lovr.draw`, because then the objects will be loaded every frame, which can really slow things down!"
- },
- {
- name = "Transforms",
- tag = "graphicsTransforms",
- description = "These functions manipulate the 3D coordinate system. By default the negative z axis points forwards and the positive y axis points up. Manipulating the coordinate system can be used to create a hierarchy of rendered objects. Thinking in many different coordinate systems can be challenging though, so be sure to brush up on 3D math first!"
- },
- {
- name = "State",
- tag = "graphicsState",
- description = "These functions get or set graphics state. Graphics state is is a collection of small settings like the background color of the scene or the active shader. Keep in mind that all this state is **global**, so if you change a setting, the change will persist until that piece of state is changed again."
- },
- {
- name = "Window",
- tag = "window",
- description = "Get info about the desktop window or operate on the underlying graphics context."
- }
- },
- enums = {
- {
- name = "ArcMode",
- summary = "Different ways arcs can be drawn.",
- description = "Different ways arcs can be drawn with `lovr.graphics.arc`.",
- key = "ArcMode",
- module = "lovr.graphics",
- values = {
- {
- name = "pie",
- description = "The arc is drawn with the center of its circle included in the list of points (default)."
- },
- {
- name = "open",
- description = "The curve of the arc is drawn as a single line."
- },
- {
- name = "closed",
- description = "The starting and ending points of the arc's curve are connected."
- }
- }
- },
- {
- name = "BlendAlphaMode",
- summary = "Different ways of blending alpha.",
- description = "Different ways the alpha channel of pixels affects blending.",
- key = "BlendAlphaMode",
- module = "lovr.graphics",
- notes = "The premultiplied mode should be used if pixels being drawn have already been blended, or \"pre-multiplied\", by the alpha channel. This happens when rendering a framebuffer that contains pixels with transparent alpha values, since the stored color values have already been faded by alpha and don't need to be faded a second time with the alphamultiply blend mode.",
- related = {
- "BlendMode",
- "lovr.graphics.getBlendMode",
- "lovr.graphics.setBlendMode"
- },
- values = {
- {
- name = "alphamultiply",
- description = "Color channel values are multiplied by the alpha channel during blending."
- },
- {
- name = "premultiplied",
- description = "Color channels are not multiplied by the alpha channel. This should be used if the pixels being drawn have already been blended, or \"pre-multiplied\", by the alpha channel."
- }
- }
- },
- {
- name = "BlendMode",
- summary = "Different blend modes.",
- description = "Blend modes control how overlapping pixels are blended together, similar to layers in Photoshop.",
- key = "BlendMode",
- module = "lovr.graphics",
- values = {
- {
- name = "alpha",
- description = "Normal blending where the alpha value controls how the colors are blended."
- },
- {
- name = "add",
- description = "The incoming pixel color is added to the destination pixel color."
- },
- {
- name = "subtract",
- description = "The incoming pixel color is subtracted from the destination pixel color."
- },
- {
- name = "multiply",
- description = "The color channels from the two pixel values are multiplied together to produce a result."
- },
- {
- name = "lighten",
- description = "The maximum value from each color channel is used, resulting in a lightening effect."
- },
- {
- name = "darken",
- description = "The minimum value from each color channel is used, resulting in a darkening effect."
- },
- {
- name = "screen",
- description = "The opposite of multiply: The pixel values are inverted, multiplied, and inverted again, resulting in a lightening effect."
- }
- },
- related = {
- "BlendAlphaMode",
- "lovr.graphics.getBlendMode",
- "lovr.graphics.setBlendMode"
- }
- },
- {
- name = "BlockType",
- summary = "Different types of ShaderBlocks.",
- description = "There are two types of ShaderBlocks that can be used: `uniform` and `compute`.\n\nUniform blocks are read only in shaders, can sometimes be a bit faster than compute blocks, and have a limited size (but the limit will be at least 16KB, you can check `lovr.graphics.getLimits` to check).\n\nCompute blocks can be written to by compute shaders, might be slightly slower than uniform blocks, and have a much, much larger maximum size.",
- key = "BlockType",
- module = "lovr.graphics",
- values = {
- {
- name = "uniform",
- description = "A uniform block."
- },
- {
- name = "compute",
- description = "A compute block."
- }
- },
- related = {
- "ShaderBlock",
- "lovr.graphics.newShaderBlock",
- "ShaderBlock:getType",
- "lovr.graphics.getLimits"
- }
- },
- {
- name = "CompareMode",
- summary = "Different depth test modes.",
- description = "The method used to compare z values when deciding how to overlap rendered objects. This is called the \"depth test\", and it happens on a pixel-by-pixel basis every time new objects are drawn. If the depth test \"passes\" for a pixel, then the pixel color will be replaced by the new color and the depth value in the depth buffer will be updated. Otherwise, the pixel will not be changed and the depth value will not be updated.",
- key = "CompareMode",
- module = "lovr.graphics",
- values = {
- {
- name = "equal",
- description = "The depth test passes when the depth values are equal."
- },
- {
- name = "notequal",
- description = "The depth test passes when the depth values are not equal."
- },
- {
- name = "less",
- description = "The depth test passes when the new depth value is less than the existing one."
- },
- {
- name = "lequal",
- description = "The depth test passes when the new depth value is less than or equal to the existing one."
- },
- {
- name = "gequal",
- description = "The depth test passes when the new depth value is greater than or equal to the existing one."
- },
- {
- name = "greater",
- description = "The depth test passes when the new depth value is greater than the existing one."
- }
- },
- related = {
- "lovr.graphics.getDepthTest",
- "lovr.graphics.setDepthTest",
- "lovr.graphics.getStencilTest",
- "lovr.graphics.setStencilTest"
- }
- },
- {
- name = "DefaultShader",
- summary = "The set of builtin shaders.",
- description = "The following shaders are built in to LÖVR, and can be used as an argument to `lovr.graphics.newShader` instead of providing raw GLSL shader code. The shaders can be further customized by using the `flags` argument. If you pass in `nil` to `lovr.graphics.setShader`, LÖVR will automatically pick a DefaultShader to use based on whatever is being drawn.",
- key = "DefaultShader",
- module = "lovr.graphics",
- values = {
- {
- name = "unlit",
- description = "A simple shader without lighting, using only colors and a diffuse texture."
- },
- {
- name = "standard",
- description = "A physically-based rendering (PBR) shader, using advanced material properties."
- },
- {
- name = "cube",
- description = "A shader that renders a cubemap texture."
- },
- {
- name = "pano",
- description = "A shader that renders a 2D equirectangular texture with spherical coordinates."
- },
- {
- name = "font",
- description = "A shader that renders font glyphs."
- },
- {
- name = "fill",
- description = "A shader that passes its vertex coordinates unmodified to the fragment shader, used to render view-independent fixed geometry like fullscreen quads."
- }
- }
- },
- {
- name = "DrawMode",
- summary = "Different ways Mesh objects can be drawn.",
- description = "Meshes are lists of arbitrary vertices. These vertices can be drawn in a few different ways, leading to different results.",
- key = "DrawMode",
- module = "lovr.graphics",
- values = {
- {
- name = "points",
- description = "Draw each vertex as a single point."
- },
- {
- name = "lines",
- description = "The vertices represent a list of line segments. Each pair of vertices will have a line drawn between them."
- },
- {
- name = "linestrip",
- description = "The first two vertices have a line drawn between them, and each vertex after that will be connected to the previous vertex with a line."
- },
- {
- name = "lineloop",
- description = "Similar to linestrip, except the last vertex is connected back to the first."
- },
- {
- name = "strip",
- description = "The first three vertices define a triangle. Each vertex after that creates a triangle using the new vertex and last two vertices."
- },
- {
- name = "triangles",
- description = "Each set of three vertices represents a discrete triangle."
- },
- {
- name = "fan",
- description = "Draws a set of triangles. Each one shares the first vertex as a common point, leading to a fan-like shape."
- }
- }
- },
- {
- name = "DrawStyle",
- summary = "Different ways graphics primitives can be drawn.",
- description = "Most graphics primitives can be drawn in one of two modes: a filled mode and a wireframe mode.",
- key = "DrawStyle",
- module = "lovr.graphics",
- values = {
- {
- name = "fill",
- description = "The shape is drawn as a filled object."
- },
- {
- name = "line",
- description = "The shape is drawn as a wireframe object."
- }
- }
- },
- {
- name = "FilterMode",
- summary = "How textures are sampled.",
- description = "The method used to downsample (or upsample) a texture. \"nearest\" can be used for a pixelated effect, whereas \"linear\" leads to more smooth results. Nearest is slightly faster than linear.",
- key = "FilterMode",
- module = "lovr.graphics",
- values = {
- {
- name = "nearest",
- description = "Fast nearest-neighbor sampling. Leads to a pixelated style."
- },
- {
- name = "bilinear",
- description = "Smooth pixel sampling."
- },
- {
- name = "trilinear",
- description = "Smooth pixel sampling, with smooth sampling across mipmap levels."
- },
- {
- name = "anisotropic",
- description = "Anisotropic texture filtering. The level of anisotropy can also be specified when setting this filter mode. Gives the best results but is also slower."
- }
- }
- },
- {
- name = "HorizontalAlign",
- summary = "Different ways to horizontally align text.",
- description = "Different ways to horizontally align text when using `lovr.graphics.print`.",
- key = "HorizontalAlign",
- module = "lovr.graphics",
- values = {
- {
- name = "left",
- description = "Left aligned lines of text."
- },
- {
- name = "center",
- description = "Centered aligned lines of text."
- },
- {
- name = "right",
- description = "Right aligned lines of text."
- }
- },
- related = {
- "VerticalAlign",
- "lovr.graphics.print"
- }
- },
- {
- name = "MaterialColor",
- summary = "Different material color parameters.",
- description = "The different types of color parameters `Material`s can hold.",
- key = "MaterialColor",
- module = "lovr.graphics",
- values = {
- {
- name = "diffuse",
- description = "The diffuse color."
- },
- {
- name = "emissive",
- description = "The emissive color."
- }
- },
- related = {
- "Material:getColor",
- "Material:setColor",
- "MaterialScalar",
- "MaterialTexture",
- "Material"
- }
- },
- {
- name = "MaterialScalar",
- summary = "Different material parameters.",
- description = "The different types of float parameters `Material`s can hold.",
- key = "MaterialScalar",
- module = "lovr.graphics",
- values = {
- {
- name = "metalness",
- description = "The constant metalness factor."
- },
- {
- name = "roughness",
- description = "The constant roughness factor."
- }
- },
- related = {
- "Material:getScalar",
- "Material:setScalar",
- "MaterialColor",
- "MaterialTexture",
- "Material"
- }
- },
- {
- name = "MaterialTexture",
- summary = "Different material texture parameters.",
- description = "The different types of texture parameters `Material`s can hold.",
- key = "MaterialTexture",
- module = "lovr.graphics",
- values = {
- {
- name = "diffuse",
- description = "The diffuse texture."
- },
- {
- name = "emissive",
- description = "The emissive texture."
- },
- {
- name = "metalness",
- description = "The metalness texture."
- },
- {
- name = "roughness",
- description = "The roughness texture."
- },
- {
- name = "occlusion",
- description = "The ambient occlusion texture."
- },
- {
- name = "normal",
- description = "The normal map."
- },
- {
- name = "environment",
- description = "The environment map, should be specified as a cubemap texture."
- }
- },
- related = {
- "Material:getTexture",
- "Material:setTexture",
- "MaterialColor",
- "MaterialScalar",
- "Material"
- }
- },
- {
- name = "MeshUsage",
- summary = "How a Mesh is going to be updated.",
- description = "Meshes can have a usage hint, describing how they are planning on being updated. Setting the usage hint allows the graphics driver optimize how it handles the data in the Mesh.",
- key = "MeshUsage",
- module = "lovr.graphics",
- values = {
- {
- name = "static",
- description = "The Mesh contents will rarely change."
- },
- {
- name = "dynamic",
- description = "The Mesh contents will change often."
- },
- {
- name = "stream",
- description = "The Mesh contents will change constantly, potentially multiple times each frame."
- }
- }
- },
- {
- name = "ShaderType",
- summary = "Different types of shaders.",
- description = "Shaders can be used for either rendering operations or generic compute tasks. Graphics shaders are created with `lovr.graphics.newShader` and compute shaders are created with `lovr.graphics.newComputeShader`. `Shader:getType` can be used on an existing Shader to figure out what type it is.",
- key = "ShaderType",
- module = "lovr.graphics",
- values = {
- {
- name = "graphics",
- description = "A graphics shader."
- },
- {
- name = "compute",
- description = "A compute shader."
- }
- },
- related = {
- "Shader",
- "lovr.graphics.newShader",
- "lovr.graphics.newComputeShader"
- }
- },
- {
- name = "StencilAction",
- summary = "Different stencil operations available.",
- description = "How to modify pixels in the stencil buffer when using `lovr.graphics.stencil`.",
- key = "StencilAction",
- module = "lovr.graphics",
- values = {
- {
- name = "replace",
- description = "Stencil values will be replaced with a custom value."
- },
- {
- name = "increment",
- description = "Stencil values will increment every time they are rendered to."
- },
- {
- name = "decrement",
- description = "Stencil values will decrement every time they are rendered to."
- },
- {
- name = "incrementwrap",
- description = "Similar to `increment`, but the stencil value will be set to 0 if it exceeds 255."
- },
- {
- name = "decrementwrap",
- description = "Similar to `decrement`, but the stencil value will be set to 255 if it drops below 0."
- },
- {
- name = "invert",
- description = "Stencil values will be bitwise inverted every time they are rendered to."
- }
- }
- },
- {
- name = "TextureFormat",
- summary = "Different storage formats for pixels in Textures.",
- description = "Textures can store their pixels in different formats. The set of color channels and the number of bits stored for each channel can differ, allowing Textures to optimize their storage for certain kinds of image formats or rendering techniques.",
- key = "TextureFormat",
- module = "lovr.graphics",
- values = {
- {
- name = "rgb",
- description = "Each pixel is 24 bits, or 8 bits for each channel."
- },
- {
- name = "rgba",
- description = "Each pixel is 32 bits, or 8 bits for each channel (including alpha)."
- },
- {
- name = "rgba4",
- description = "An rgba format where the colors occupy 4 bits instead of the usual 8."
- },
- {
- name = "rgba16f",
- description = "Each pixel is 64 bits. Each channel is a 16 bit floating point number."
- },
- {
- name = "rgba32f",
- description = "Each pixel is 128 bits. Each channel is a 32 bit floating point number."
- },
- {
- name = "r16f",
- description = "A 16-bit floating point format with a single color channel."
- },
- {
- name = "r32f",
- description = "A 32-bit floating point format with a single color channel."
- },
- {
- name = "rg16f",
- description = "A 16-bit floating point format with two color channels."
- },
- {
- name = "rg32f",
- description = "A 32-bit floating point format with two color channels."
- },
- {
- name = "rgb5a1",
- description = "A 16 bit format with 5-bit color channels and a single alpha bit."
- },
- {
- name = "rgb10a2",
- description = "A 32 bit format with 10-bit color channels and two alpha bits."
- },
- {
- name = "rg11b10f",
- description = "Each pixel is 32 bits, and packs three color channels into 10 or 11 bits each."
- },
- {
- name = "d16",
- description = "A 16 bit depth buffer."
- },
- {
- name = "d32f",
- description = "A 32 bit floating point depth buffer."
- },
- {
- name = "d24s8",
- description = "A depth buffer with 24 bits for depth and 8 bits for stencil."
- }
- }
- },
- {
- name = "TextureType",
- summary = "Different types of Textures.",
- description = "Different types of Textures.",
- key = "TextureType",
- module = "lovr.graphics",
- values = {
- {
- name = "2d",
- description = "A 2D texture."
- },
- {
- name = "array",
- description = "A 2D array texture with multiple independent 2D layers."
- },
- {
- name = "cube",
- description = "A cubemap texture with 6 2D faces."
- },
- {
- name = "volume",
- description = "A 3D volumetric texture consisting of multiple 2D layers."
- }
- }
- },
- {
- name = "VerticalAlign",
- summary = "Different ways to vertically align text.",
- description = "Different ways to vertically align text when using `lovr.graphics.print`.",
- key = "VerticalAlign",
- module = "lovr.graphics",
- values = {
- {
- name = "top",
- description = "Align the top of the text to the origin."
- },
- {
- name = "middle",
- description = "Vertically center the text."
- },
- {
- name = "bottom",
- description = "Align the bottom of the text to the origin."
- }
- },
- related = {
- "HorizontalAlign",
- "lovr.graphics.print"
- }
- },
- {
- name = "Winding",
- summary = "Different winding directions.",
- description = "Whether the points on triangles are specified in a clockwise or counterclockwise order.",
- key = "Winding",
- module = "lovr.graphics",
- values = {
- {
- name = "clockwise",
- description = "Triangle vertices are specified in a clockwise order."
- },
- {
- name = "counterclockwise",
- description = "Triangle vertices are specified in a counterclockwise order."
- }
- }
- },
- {
- name = "WrapMode",
- summary = "How to wrap Textures.",
- description = "The method used to render textures when texture coordinates are outside of the 0-1 range.",
- key = "WrapMode",
- module = "lovr.graphics",
- values = {
- {
- name = "clamp",
- description = "The texture will be clamped at its edges."
- },
- {
- name = "repeat",
- description = "The texture repeats."
- },
- {
- name = "mirroredrepeat",
- description = "The texture will repeat, mirroring its appearance each time it repeats."
- }
- }
- }
- },
- functions = {
- {
- name = "arc",
- tag = "graphicsPrimitives",
- summary = "Draw an arc.",
- description = "Draws an arc.",
- key = "lovr.graphics.arc",
- module = "lovr.graphics",
- notes = "The local normal vector of the circle is `(0, 0, 1)`.",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the arc is filled or outlined."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the arc, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the arc around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the arc's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the arc."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the arc, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the arc around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the arc's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the arc is filled or outlined."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The arc's transform."
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the arc."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The arc's transform."
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the arc is filled or outlined."
- },
- {
- name = "arcmode",
- type = "ArcMode",
- description = "How to draw the arc.",
- default = "'pie'"
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the arc, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the arc around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the arc's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the arc."
- },
- {
- name = "arcmode",
- type = "ArcMode",
- description = "How to draw the arc.",
- default = "'pie'"
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the arc.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the arc, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the arc around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the arc's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the arc's axis of rotation.",
- default = "0"
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the arc is filled or outlined."
- },
- {
- name = "arcmode",
- type = "ArcMode",
- description = "How to draw the arc.",
- default = "'pie'"
- },
- {
- name = "transform",
- type = "mat4",
- description = "The arc's transform."
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the arc."
- },
- {
- name = "arcmode",
- type = "ArcMode",
- description = "How to draw the arc.",
- default = "'pie'"
- },
- {
- name = "transform",
- type = "mat4",
- description = "The arc's transform."
- },
- {
- name = "start",
- type = "number",
- description = "The starting angle of the arc, in radians.",
- default = "0"
- },
- {
- name = "end",
- type = "number",
- description = "The ending angle of the arc, in radians.",
- default = "2 * math.pi"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of segments to use for the full circle. A smaller number of segments will be used, depending on how long the arc is.",
- default = "32"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.arc"
- }
- },
- {
- name = "box",
- tag = "graphicsPrimitives",
- summary = "Draw a box.",
- description = "Draws a box. This is similar to `lovr.graphics.cube` except you can have different values for the width, height, and depth of the box.",
- key = "lovr.graphics.box",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the box."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "width",
- type = "number",
- description = "The width of the box, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the box, in meters.",
- default = "1"
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the box, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the box around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the box."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "width",
- type = "number",
- description = "The width of the box, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the box, in meters.",
- default = "1"
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the box, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the box around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the box."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The transform of the box."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the box."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The transform of the box."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "circle",
- tag = "graphicsPrimitives",
- summary = "Draw a 2D circle.",
- description = "Draws a 2D circle.",
- key = "lovr.graphics.circle",
- module = "lovr.graphics",
- notes = "The local normal vector of the circle is `(0, 0, 1)`.",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the circle is filled or outlined."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the circle, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the circle around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the circle's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the circle's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the circle's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the circle."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the circle.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the circle, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the circle around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the circle's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the circle's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the circle's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "Whether the circle is filled or outlined."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The circle's transform."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the circle."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The circle's transform."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.arc"
- }
- },
- {
- name = "clear",
- tag = "window",
- summary = "Clear the screen.",
- description = "Clears the screen, resetting the color, depth, and stencil information to default values. This function is called automatically by `lovr.run` at the beginning of each frame to clear out the data from the previous frame.",
- key = "lovr.graphics.clear",
- module = "lovr.graphics",
- notes = "The two variants of this function can be mixed and matched, meaning you can use booleans for some of the values and numeric values for others.\n\nIf you are using `lovr.graphics.setStencilTest`, it will not affect how the screen gets cleared. Instead, you can use `lovr.graphics.fill` to draw a fullscreen quad, which will get masked by the active stencil.",
- variants = {
- {
- description = "Clears the color, depth, and stencil to their default values. Color will be cleared to the current background color, depth will be cleared to 1.0, and stencil will be cleared to 0.",
- arguments = {
- {
- name = "color",
- type = "boolean",
- description = "Whether or not to clear color information on the screen.",
- default = "true"
- },
- {
- name = "depth",
- type = "boolean",
- description = "Whether or not to clear the depth information on the screen.",
- default = "true"
- },
- {
- name = "stencil",
- type = "boolean",
- description = "Whether or not to clear the stencil information on the screen.",
- default = "true"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "r",
- type = "number",
- description = "The value to clear the red channel to, from 0.0 to 1.0."
- },
- {
- name = "g",
- type = "number",
- description = "The value to clear the green channel to, from 0.0 to 1.0."
- },
- {
- name = "b",
- type = "number",
- description = "The value to clear the blue channel to, from 0.0 to 1.0."
- },
- {
- name = "a",
- type = "number",
- description = "The value to clear the alpha channel to, from 0.0 to 1.0."
- },
- {
- name = "z",
- type = "number",
- description = "The value to clear the depth buffer to.",
- default = "1.0"
- },
- {
- name = "s",
- type = "number",
- description = "The integer value to clear the stencil buffer to.",
- default = "0"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.setBackgroundColor"
- }
- },
- {
- name = "compute",
- tag = "graphicsPrimitives",
- summary = "Run a compute shader.",
- description = "This function runs a compute shader on the GPU. Compute shaders must be created with `lovr.graphics.newComputeShader` and they should implement the `void compute();` GLSL function. Running a compute shader doesn't actually do anything, but the Shader can modify data stored in `Texture`s or `ShaderBlock`s to get interesting things to happen.\n\nWhen running the compute shader, you can specify the number of times to run it in 3 dimensions, which is useful to iterate over large numbers of elements like pixels or array elements.",
- key = "lovr.graphics.compute",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "shader",
- type = "Shader",
- description = "The compute shader to run."
- },
- {
- name = "x",
- type = "number",
- description = "The amount of times to run in the x direction.",
- default = "1"
- },
- {
- name = "y",
- type = "number",
- description = "The amount of times to run in the y direction.",
- default = "1"
- },
- {
- name = "z",
- type = "number",
- description = "The amount of times to run in the z direction.",
- default = "1"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.newComputeShader",
- "lovr.graphics.getShader",
- "lovr.graphics.setShader",
- "Shader"
- },
- notes = "Only compute shaders created with `lovr.graphics.newComputeShader` can be used here."
- },
- {
- name = "createWindow",
- tag = "window",
- summary = "Creates the window.",
- description = "Create the desktop window, usually used to mirror the headset display.",
- key = "lovr.graphics.createWindow",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the window.",
- default = "1080"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the window.",
- default = "600"
- },
- {
- name = "fullscreen",
- type = "boolean",
- description = "Whether the window should be fullscreen.",
- default = "false"
- },
- {
- name = "msaa",
- type = "number",
- description = "The number of samples to use for multisample antialiasing.",
- default = "0"
- },
- {
- name = "title",
- type = "string",
- description = "The window title.",
- default = "nil"
- },
- {
- name = "icon",
- type = "string",
- description = "A path to an image to use for the window icon.",
- default = "nil"
- }
- },
- returns = {}
- }
- },
- notes = "This function can only be called once. It is normally called internally, but you can override this by setting window to `nil` in conf.lua. See `lovr.conf` for more information."
- },
- {
- name = "cube",
- tag = "graphicsPrimitives",
- summary = "Draw a cube.",
- description = "Draws a cube.",
- key = "lovr.graphics.cube",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the cube."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "size",
- type = "number",
- description = "The size of the cube, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the cube around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the cube's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the cube's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the cube's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the cube faces."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the cube.",
- default = "0"
- },
- {
- name = "size",
- type = "number",
- description = "The size of the cube, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the cube around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the cube's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the cube's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the cube's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the cube."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The cube's transform."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the cube faces."
- },
- {
- name = "transform",
- type = "mat4",
- description = "The cube's transform."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "cylinder",
- tag = "graphicsPrimitives",
- summary = "Draw a cylinder.",
- description = "Draws a cylinder.",
- key = "lovr.graphics.cylinder",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the cylinder, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the cylinder around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the cylinder's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the cylinder's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the cylinder's axis of rotation.",
- default = "0"
- },
- {
- name = "r1",
- type = "number",
- description = "The radius of one end of the cylinder.",
- default = "1"
- },
- {
- name = "r2",
- type = "number",
- description = "The radius of the other end of the cylinder.",
- default = "1"
- },
- {
- name = "capped",
- type = "boolean",
- description = "Whether the top and bottom should be rendered.",
- default = "true"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of radial segments to use for the cylinder. If nil, the segment count is automatically determined from the radii.",
- default = "nil"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the cylinder."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the cylinder.",
- default = "0"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the cylinder, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the cylinder around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the cylinder's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the cylinder's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the cylinder's axis of rotation.",
- default = "0"
- },
- {
- name = "r1",
- type = "number",
- description = "The radius of one end of the cylinder.",
- default = "1"
- },
- {
- name = "r2",
- type = "number",
- description = "The radius of the other end of the cylinder.",
- default = "1"
- },
- {
- name = "capped",
- type = "boolean",
- description = "Whether the top and bottom should be rendered.",
- default = "true"
- },
- {
- name = "segments",
- type = "number",
- description = "The number of radial segments to use for the cylinder. If nil, the segment count is automatically determined from the radii.",
- default = "nil"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "discard",
- tag = "graphicsPrimitives",
- summary = "Discard the current pixel values.",
- description = "Discards pixel information in the active Canvas or display. This is mostly used as an optimization hint for the GPU, and is usually most helpful on mobile devices.",
- key = "lovr.graphics.discard",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.clear"
- },
- variants = {
- {
- arguments = {
- {
- name = "color",
- type = "boolean",
- description = "Whether or not to discard color information.",
- default = "true"
- },
- {
- name = "depth",
- type = "boolean",
- description = "Whether or not to discard depth information.",
- default = "true"
- },
- {
- name = "stencil",
- type = "boolean",
- description = "Whether or not to discard stencil information.",
- default = "true"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "fill",
- tag = "graphicsPrimitives",
- summary = "Fill the screen with a texture.",
- description = "Draws a fullscreen textured quad.",
- key = "lovr.graphics.fill",
- module = "lovr.graphics",
- notes = "This function ignores stereo rendering, so it will stretch the input across the entire Canvas if it's stereo.",
- variants = {
- {
- description = "Fills the screen with a Texture.",
- arguments = {
- {
- name = "texture",
- type = "Texture",
- description = "The texture to use."
- },
- {
- name = "u",
- type = "number",
- description = "The x component of the uv offset.",
- default = "0"
- },
- {
- name = "v",
- type = "number",
- description = "The y component of the uv offset.",
- default = "0"
- },
- {
- name = "w",
- type = "number",
- description = "The width of the Texture to render, in uv coordinates.",
- default = "1 - u"
- },
- {
- name = "h",
- type = "number",
- description = "The height of the Texture to render, in uv coordinates.",
- default = "1 - v"
- }
- },
- returns = {}
- },
- {
- description = "Fills the screen with the first Texture attached to a Canvas.",
- arguments = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The first Texture attached to this Canvas will be used."
- },
- {
- name = "u",
- type = "number",
- description = "The x component of the uv offset.",
- default = "0"
- },
- {
- name = "v",
- type = "number",
- description = "The y component of the uv offset.",
- default = "0"
- },
- {
- name = "w",
- type = "number",
- description = "The width of the Texture to render, in uv coordinates.",
- default = "1 - u"
- },
- {
- name = "h",
- type = "number",
- description = "The height of the Texture to render, in uv coordinates.",
- default = "1 - v"
- }
- },
- returns = {}
- },
- {
- description = "Fills the screen with the active color.",
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "flush",
- tag = "graphicsPrimitives",
- summary = "Flush any pending batched draw calls.",
- description = "Flushes the internal queue of draw batches. Under normal circumstances this is done automatically when needed, but the ability to flush manually may be helpful if you're integrating a LÖVR project with some external rendering code.",
- key = "lovr.graphics.flush",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.clear",
- "lovr.graphics.discard"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "getAlphaSampling",
- tag = "graphicsState",
- summary = "Get whether alpha sampling (alpha to coverage) is enabled.",
- description = "Returns whether or not alpha sampling is enabled. Alpha sampling is also known as alpha-to-coverage. When it is enabled, the alpha channel of a pixel is factored into how antialiasing is computed, so the edges of a transparent texture will be correctly antialiased.",
- key = "lovr.graphics.getAlphaSampling",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether or not alpha sampling is enabled."
- }
- }
- }
- },
- notes = "- Alpha sampling is disabled by default.\n- This feature can be used for a cheap transparency effect, pixels with an alpha of zero will\n have their depth value discarded, allowing things behind them to show through (normally you\n have to sort objects or write a shader for this)."
- },
- {
- name = "getBackgroundColor",
- tag = "graphicsState",
- summary = "Get the background color.",
- description = "Returns the current background color. Color components are from 0.0 to 1.0.",
- key = "lovr.graphics.getBackgroundColor",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "r",
- type = "number",
- description = "The red component of the background color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the background color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the background color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the background color."
- }
- }
- }
- },
- notes = "The default background color is black."
- },
- {
- name = "getBlendMode",
- tag = "graphicsState",
- summary = "Get the blend mode.",
- description = "Returns the current blend mode. The blend mode controls how each pixel's color is blended with the previous pixel's color when drawn.\n\nIf blending is disabled, `nil` will be returned.",
- key = "lovr.graphics.getBlendMode",
- module = "lovr.graphics",
- related = {
- "BlendMode",
- "BlendAlphaMode"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "blend",
- type = "BlendMode",
- description = "The current blend mode."
- },
- {
- name = "alphaBlend",
- type = "BlendAlphaMode",
- description = "The current alpha blend mode."
- }
- }
- }
- }
- },
- {
- name = "getCanvas",
- tag = "graphicsState",
- summary = "Get the active Canvas.",
- description = "Returns the active Canvas. Usually when you render something it will render directly to the headset. If a Canvas object is active, things will be rendered to the textures attached to the Canvas instead.",
- key = "lovr.graphics.getCanvas",
- module = "lovr.graphics",
- related = {
- "Canvas:renderTo",
- "Canvas"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The active Canvas, or `nil` if no canvas is set."
- }
- }
- }
- }
- },
- {
- name = "getColor",
- tag = "graphicsState",
- summary = "Get the global color factor.",
- description = "Returns the current global color factor. Color components are from 0.0 to 1.0. Every pixel drawn will be multiplied (i.e. tinted) by this color.",
- key = "lovr.graphics.getColor",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "r",
- type = "number",
- description = "The red component of the color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the color."
- }
- }
- }
- },
- notes = "The default color is white."
- },
- {
- name = "getDefaultFilter",
- tag = "graphicsState",
- summary = "Get the default filter mode for Textures.",
- description = "Returns the default filter mode for new Textures. This controls how textures are sampled when they are minified, magnified, or stretched.",
- key = "lovr.graphics.getDefaultFilter",
- module = "lovr.graphics",
- related = {
- "Texture:getFilter",
- "Texture:setFilter"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mode",
- type = "FilterMode",
- description = "The filter mode."
- },
- {
- name = "anisotropy",
- type = "number",
- description = "If the filtering mode is \"anisotropic\", returns the level of anisotropy. Otherwise, this will be nil."
- }
- }
- }
- }
- },
- {
- name = "getDepthTest",
- tag = "graphicsState",
- summary = "Get the depth test mode.",
- description = "Returns the current depth test settings.",
- key = "lovr.graphics.getDepthTest",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "compareMode",
- type = "CompareMode",
- description = "The current comparison method for depth testing."
- },
- {
- name = "write",
- type = "boolean",
- description = "Whether pixels will have their z value updated when rendered to."
- }
- }
- }
- },
- notes = "The depth test is an advanced technique to control how 3D objects overlap each other when they are rendered. It works as follows:\n\n- Each pixel keeps track of its z value as well as its color.\n- If `write` is enabled when something is drawn, then any pixels that are drawn will have their\n z values updated.\n- Additionally, anything drawn will first compare the existing z value of a pixel with the new z\n value. The `compareMode` setting determines how this comparison is performed. If the\n comparison succeeds, the new pixel will overwrite the previous one, otherwise that pixel won't\n be rendered to.\n\nSmaller z values are closer to the camera.\n\nThe default compare mode is `lequal`, which usually gives good results for normal 3D rendering."
- },
- {
- name = "getDimensions",
- tag = "window",
- summary = "Get the dimensions of the window.",
- description = "Returns the dimensions of the desktop window.",
- key = "lovr.graphics.getDimensions",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getWidth",
- "lovr.graphics.getHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the window, in pixels."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the window, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getFeatures",
- tag = "window",
- summary = "Check if certain features are supported.",
- description = "Returns whether certain features are supported by the system\\'s graphics card.",
- key = "lovr.graphics.getFeatures",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "features",
- type = "table",
- description = "A table of features and whether or not they are supported.",
- table = {
- {
- name = "astc",
- type = "boolean",
- description = "Whether ASTC textures are supported."
- },
- {
- name = "compute",
- type = "boolean",
- description = "Whether compute shaders are available."
- },
- {
- name = "dxt",
- type = "boolean",
- description = "Whether DXT (.dds) textures are supported."
- },
- {
- name = "instancedstereo",
- type = "boolean",
- description = "True if the instanced single-pass stereo rendering method is supported."
- },
- {
- name = "multiview",
- type = "boolean",
- description = "True if the multiview single-pass stereo rendering method is supported."
- },
- {
- name = "timers",
- type = "boolean",
- description = "Whether `lovr.graphics.tick` and `lovr.graphics.tock` are supported."
- }
- }
- }
- }
- }
- }
- },
- {
- name = "getFont",
- tag = "graphicsState",
- summary = "Get the active font.",
- description = "Returns the active font.",
- key = "lovr.graphics.getFont",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.print"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "font",
- type = "Font",
- description = "The active font object."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- tag = "window",
- summary = "Get the height of the window.",
- description = "Returns the height of the desktop window.",
- key = "lovr.graphics.getHeight",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getWidth",
- "lovr.graphics.getDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the window, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getLimits",
- tag = "window",
- summary = "Get capabilities of the graphics card.",
- description = "Returns information about the maximum limits of the graphics card, such as the maximum texture size or the amount of supported antialiasing.",
- key = "lovr.graphics.getLimits",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getFeatures"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "limits",
- type = "table",
- description = "The table of limits.",
- table = {
- {
- name = "anisotropy",
- type = "number",
- description = "The maximum anisotropy value supported by `Texture:setFilter`."
- },
- {
- name = "blocksize",
- type = "number",
- description = "The maximum size of a uniform ShaderBlock, in bytes."
- },
- {
- name = "pointsize",
- type = "number",
- description = "The maximum size of points, in pixels."
- },
- {
- name = "texturemsaa",
- type = "number",
- description = "The maximum MSAA value supported by `lovr.graphics.newTexture`."
- },
- {
- name = "texturesize",
- type = "number",
- description = "The maximum width or height of textures, in pixels."
- }
- }
- }
- }
- }
- }
- },
- {
- name = "getLineWidth",
- tag = "graphicsState",
- summary = "Get the line width.",
- description = "Returns the current line width.",
- key = "lovr.graphics.getLineWidth",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The current line width, in pixels."
- }
- }
- }
- },
- related = {
- "lovr.graphics.line"
- },
- notes = "The default line width is `1.0`."
- },
- {
- name = "getPixelDensity",
- tag = "window",
- summary = "Get the pixel density of the window.",
- description = "Returns the pixel density of the window. On \"high-dpi\" displays, this will be `2.0`, indicating that there are 2 pixels for every window coordinate. On a normal display it will be `1.0`, meaning that the pixel to window-coordinate ratio is 1:1.",
- key = "lovr.graphics.getPixelDensity",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "density",
- type = "number",
- description = "The pixel density of the window."
- }
- }
- }
- },
- related = {
- "lovr.graphics.getWidth",
- "lovr.graphics.getHeight",
- "lovr.graphics.getDimensions",
- "lovr.graphics.createWindow",
- "lovr.conf"
- },
- notes = "If the window isn't created yet, this function will return 0."
- },
- {
- name = "getPointSize",
- tag = "graphicsState",
- summary = "Get the point size.",
- description = "Returns the current point size.",
- key = "lovr.graphics.getPointSize",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "size",
- type = "number",
- description = "The current point size, in pixels."
- }
- }
- }
- },
- related = {
- "lovr.graphics.points"
- },
- notes = "The default point size is `1.0`."
- },
- {
- name = "getShader",
- tag = "graphicsState",
- summary = "Get the active shader.",
- description = "Returns the active shader.",
- key = "lovr.graphics.getShader",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "shader",
- type = "Shader",
- description = "The active shader object, or `nil` if none is active."
- }
- }
- }
- }
- },
- {
- name = "getStats",
- tag = "graphicsState",
- summary = "Get renderer stats for the current frame.",
- description = "Returns graphics-related performance statistics for the current frame.",
- key = "lovr.graphics.getStats",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "stats",
- type = "table",
- description = "The table of stats.",
- table = {
- {
- name = "drawcalls",
- type = "number",
- description = "The number of draw calls."
- },
- {
- name = "shaderswitches",
- type = "number",
- description = "The number of times the shader has been switched."
- }
- }
- }
- }
- }
- }
- },
- {
- name = "getStencilTest",
- tag = "graphicsState",
- summary = "Get the current stencil test.",
- description = "Returns the current stencil test. The stencil test lets you mask out pixels that meet certain criteria, based on the contents of the stencil buffer. The stencil buffer can be modified using `lovr.graphics.stencil`. After rendering to the stencil buffer, the stencil test can be set to control how subsequent drawing functions are masked by the stencil buffer.",
- key = "lovr.graphics.getStencilTest",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "compareMode",
- type = "CompareMode",
- description = "The comparison method used to decide if a pixel should be visible, or nil if the stencil test is disabled."
- },
- {
- name = "compareValue",
- type = "number",
- description = "The value stencil values are compared against, or nil if the stencil test is disabled."
- }
- }
- }
- },
- related = {
- "lovr.graphics.stencil"
- },
- notes = "Stencil values are between 0 and 255."
- },
- {
- name = "getWidth",
- tag = "window",
- summary = "Get the width of the window.",
- description = "Returns the width of the desktop window.",
- key = "lovr.graphics.getWidth",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getHeight",
- "lovr.graphics.getDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the window, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getWinding",
- tag = "graphicsState",
- summary = "Get the winding direction.",
- description = "Returns the current polygon winding. The winding direction determines which face of a triangle is the front face and which is the back face. This lets the graphics engine cull the back faces of polygons, improving performance.",
- key = "lovr.graphics.getWinding",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "winding",
- type = "Winding",
- description = "The current winding direction."
- }
- }
- }
- },
- related = {
- "lovr.graphics.setCullingEnabled",
- "lovr.graphics.isCullingEnabled"
- },
- notes = "Culling is initially disabled and must be enabled using `lovr.graphics.setCullingEnabled`.\n\nThe default winding direction is counterclockwise."
- },
- {
- name = "hasWindow",
- tag = "window",
- summary = "Check if the window is created.",
- description = "Returns whether the desktop window is currently created.",
- key = "lovr.graphics.hasWindow",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.createWindow",
- "lovr.conf"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "present",
- type = "boolean",
- description = "Whether a window is created."
- }
- }
- }
- }
- },
- {
- name = "isCullingEnabled",
- tag = "graphicsState",
- summary = "Get whether backface culling is enabled.",
- description = "Returns whether or not culling is active. Culling is an optimization that avoids rendering the back face of polygons. This improves performance by reducing the number of polygons drawn, but requires that the vertices in triangles are specified in a consistent clockwise or counter clockwise order.",
- key = "lovr.graphics.isCullingEnabled",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "isEnabled",
- type = "boolean",
- description = "Whether or not culling is enabled."
- }
- }
- }
- },
- notes = "Culling is disabled by default."
- },
- {
- name = "isGammaCorrect",
- tag = "graphicsState",
- summary = "Get whether wireframe mode is enabled.",
- description = "Get whether or not gamma correct rendering is supported and enabled. When enabled, lovr will automatically perform gamma correction on colors set via `lovr.graphics.setColor`, `lovr.graphics.setBackgroundColor`, `Material:setColor`, and textures created without the linear flag set. Gamma correction will subtly improve lighting quality, especially in darker regions.",
- key = "lovr.graphics.isGammaCorrect",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "isGammaCorrect",
- type = "boolean",
- description = "Whether or not gamma correction is applied to colors."
- }
- }
- }
- },
- related = {
- "lovr.conf",
- "lovr.math.gammaToLinear",
- "lovr.math.linearToGamma"
- },
- notes = "Gamma correction must first be enabled in `lovr.conf`."
- },
- {
- name = "isWireframe",
- tag = "graphicsState",
- summary = "Get whether wireframe mode is enabled.",
- description = "Returns a boolean indicating whether or not wireframe rendering is enabled.",
- key = "lovr.graphics.isWireframe",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "isWireframe",
- type = "boolean",
- description = "Whether or not wireframe rendering is enabled."
- }
- }
- }
- },
- notes = "Wireframe rendering is initially disabled."
- },
- {
- name = "line",
- tag = "graphicsPrimitives",
- summary = "Draw lines.",
- description = "Draws lines between points. Each point will be connected to the previous point in the list.",
- key = "lovr.graphics.line",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the first point."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the first point."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the first point."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the second point."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the second point."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the second point."
- },
- {
- name = "...",
- type = "number",
- description = "More points."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "points",
- type = "table",
- description = "A table of point positions, as described above."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "newCanvas",
- tag = "graphicsObjects",
- summary = "Create a new Canvas.",
- description = "Creates a new Canvas. You can specify Textures to attach to it, or just specify a width and height and attach textures later using `Canvas:setTexture`.\n\nOnce created, you can render to the Canvas using `Canvas:renderTo`, or `lovr.graphics.setCanvas`.",
- key = "lovr.graphics.newCanvas",
- module = "lovr.graphics",
- notes = "Textures created by this function will have `clamp` as their `TextureWrap`.",
- variants = {
- {
- description = "Create an empty Canvas with no Textures attached.",
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the canvas, in pixels."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the canvas, in pixels."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the Canvas.",
- table = {
- {
- name = "format",
- type = "TextureFormat",
- description = "The format of a Texture to create and attach to this Canvas, or false if no Texture should be created. This is ignored if Textures are already passed in.",
- default = "'rgba'"
- },
- {
- name = "depth",
- type = "TextureFormat",
- description = "A depth TextureFormat to use for the Canvas depth buffer, or false for no depth buffer. Note that this can also be a table with `format` and `readable` keys.",
- default = "d16"
- },
- {
- name = "stereo",
- type = "boolean",
- description = "Whether the Canvas is stereo.",
- default = "true"
- },
- {
- name = "msaa",
- type = "number",
- description = "The number of MSAA samples to use for antialiasing.",
- default = "0"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether the Canvas will automatically generate mipmaps for its attached textures.",
- default = "true"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The new Canvas."
- }
- }
- },
- {
- description = "Create a Canvas with attached Textures.",
- arguments = {
- {
- name = "...",
- type = "Texture",
- description = "One or more Textures to attach to the Canvas."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the Canvas.",
- table = {
- {
- name = "format",
- type = "TextureFormat",
- description = "The format of a Texture to create and attach to this Canvas, or false if no Texture should be created. This is ignored if Textures are already passed in.",
- default = "'rgba'"
- },
- {
- name = "depth",
- type = "TextureFormat",
- description = "A depth TextureFormat to use for the Canvas depth buffer, or false for no depth buffer. Note that this can also be a table with `format` and `readable` keys.",
- default = "d16"
- },
- {
- name = "stereo",
- type = "boolean",
- description = "Whether the Canvas is stereo.",
- default = "true"
- },
- {
- name = "msaa",
- type = "number",
- description = "The number of MSAA samples to use for antialiasing.",
- default = "0"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether the Canvas will automatically generate mipmaps for its attached textures.",
- default = "true"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The new Canvas."
- }
- }
- },
- {
- description = "Create a Canvas with attached Textures, using specific layers and mipmap levels from each one. Layers and mipmaps can be specified after each Texture as numbers, or a table of a Texture, layer, and mipmap can be used for each attachment.",
- arguments = {
- {
- name = "attachments",
- type = "table",
- description = "A table of textures, layers, and mipmaps (in any combination) to attach."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the Canvas.",
- table = {
- {
- name = "format",
- type = "TextureFormat",
- description = "The format of a Texture to create and attach to this Canvas, or false if no Texture should be created. This is ignored if Textures are already passed in.",
- default = "'rgba'"
- },
- {
- name = "depth",
- type = "TextureFormat",
- description = "A depth TextureFormat to use for the Canvas depth buffer, or false for no depth buffer. Note that this can also be a table with `format` and `readable` keys.",
- default = "d16"
- },
- {
- name = "stereo",
- type = "boolean",
- description = "Whether the Canvas is stereo.",
- default = "true"
- },
- {
- name = "msaa",
- type = "number",
- description = "The number of MSAA samples to use for antialiasing.",
- default = "0"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether the Canvas will automatically generate mipmaps for its attached textures.",
- default = "true"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The new Canvas."
- }
- }
- }
- },
- related = {
- "lovr.graphics.setCanvas",
- "lovr.graphics.getCanvas",
- "Canvas:renderTo"
- }
- },
- {
- name = "newComputeShader",
- tag = "graphicsObjects",
- summary = "Create a new compute Shader.",
- description = "Creates a new compute Shader, used for running generic compute operations on the GPU.",
- key = "lovr.graphics.newComputeShader",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "source",
- type = "string",
- description = "The code or filename of the compute shader."
- }
- },
- returns = {
- {
- name = "shader",
- type = "Shader",
- description = "The new compute Shader."
- }
- }
- }
- },
- related = {
- "lovr.graphics.compute",
- "lovr.graphics.newShader",
- "lovr.graphics.setShader",
- "lovr.graphics.getShader"
- },
- examples = {
- {
- code = "function lovr.load()\n computer = lovr.graphics.newComputeShader([[\n layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\n void compute() {\n // compute things!\n }\n ]])\n\n -- Run the shader 4 times\n local width, height, depth = 4, 1, 1\n\n -- Dispatch the compute operation\n lovr.graphics.compute(computer, width, height, depth)\nend"
- }
- },
- notes = "Compute shaders are not supported on all hardware, use `lovr.graphics.getSupported` to check if they're available on the current system.\n\nThe source code for a compute shader needs to implement the `void compute();` GLSL function. This function doesn't return anything, but the compute shader is able to write data out to `Texture`s or `ShaderBlock`s.\n\nThe GLSL version used for compute shaders is GLSL 430."
- },
- {
- name = "newFont",
- tag = "graphicsObjects",
- summary = "Create a new Font.",
- description = "Creates a new Font. It can be used to render text with `lovr.graphics.print`.\n\nCurrently, the only supported font format is TTF.",
- key = "lovr.graphics.newFont",
- module = "lovr.graphics",
- notes = "Larger font sizes will lead to more detailed curves at the cost of performance.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the font file."
- },
- {
- name = "size",
- type = "number",
- description = "The size of the font, in pixels.",
- default = "32"
- }
- },
- returns = {
- {
- name = "font",
- type = "Font",
- description = "The new Font."
- }
- }
- },
- {
- description = "Creates a new Font from the default font included with LÖVR (Varela Round).",
- arguments = {
- {
- name = "size",
- type = "number",
- description = "The size of the font, in pixels.",
- default = "32"
- }
- },
- returns = {
- {
- name = "font",
- type = "Font",
- description = "The new Font."
- }
- }
- },
- {
- arguments = {
- {
- name = "rasterizer",
- type = "Rasterizer",
- description = "The existing Rasterizer object used to render the glyphs."
- }
- },
- returns = {
- {
- name = "font",
- type = "Font",
- description = "The new Font."
- }
- }
- }
- }
- },
- {
- name = "newMaterial",
- tag = "graphicsObjects",
- summary = "Create a new Material.",
- description = "Creates a new Material. Materials are sets of colors, textures, and other parameters that affect the appearance of objects. They can be applied to `Model`s, `Mesh`es, and most graphics primitives accept a Material as an optional first argument.",
- key = "lovr.graphics.newMaterial",
- module = "lovr.graphics",
- notes = "- Scalar properties will default to `1.0`.\n- Color properties will default to `(1.0, 1.0, 1.0, 1.0)`, except for `emissive` which will\n default to `(0.0, 0.0, 0.0, 0.0)`.\n- Textures will default to `nil` (a single 1x1 white pixel will be used for them).",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The new Material."
- }
- }
- },
- {
- arguments = {
- {
- name = "texture",
- type = "Texture",
- description = "The diffuse texture."
- },
- {
- name = "r",
- type = "number",
- description = "The red component of the diffuse color.",
- default = "1"
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the diffuse color.",
- default = "1"
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the diffuse color.",
- default = "1"
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the diffuse color.",
- default = "1"
- }
- },
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The new Material."
- }
- }
- },
- {
- arguments = {
- {
- name = "canvas",
- type = "Canvas",
- description = "A Canvas to use as the diffuse texture."
- },
- {
- name = "r",
- type = "number",
- description = "The red component of the diffuse color.",
- default = "1"
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the diffuse color.",
- default = "1"
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the diffuse color.",
- default = "1"
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the diffuse color.",
- default = "1"
- }
- },
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The new Material."
- }
- }
- },
- {
- arguments = {
- {
- name = "r",
- type = "number",
- description = "The red component of the diffuse color.",
- default = "1"
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the diffuse color.",
- default = "1"
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the diffuse color.",
- default = "1"
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the diffuse color.",
- default = "1"
- }
- },
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The new Material."
- }
- }
- }
- }
- },
- {
- name = "newMesh",
- tag = "graphicsObjects",
- summary = "Create a new Mesh.",
- description = "Creates a new Mesh. Meshes contain the data for an arbitrary set of vertices, and can be drawn. You must specify either the capacity for the Mesh or an initial set of vertex data. Optionally, a custom format table can be used to specify the set of vertex attributes the mesh will provide to the active shader. The draw mode and usage hint can also optionally be specified.",
- key = "lovr.graphics.newMesh",
- module = "lovr.graphics",
- notes = "Once created, the size of the Mesh can't be changed.",
- variants = {
- {
- arguments = {
- {
- name = "size",
- type = "number",
- description = "The maximum number of vertices the Mesh can store."
- },
- {
- name = "mode",
- type = "DrawMode",
- description = "How the Mesh will connect its vertices into triangles.",
- default = "'fan'"
- },
- {
- name = "usage",
- type = "MeshUsage",
- description = "An optimization hint indicating how often the data in the Mesh will be updated.",
- default = "'dynamic'"
- }
- },
- returns = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The new Mesh."
- }
- }
- },
- {
- arguments = {
- {
- name = "vertices",
- type = "table",
- description = "A table of vertices. Each vertex is a table containing the vertex data."
- },
- {
- name = "mode",
- type = "DrawMode",
- description = "How the Mesh will connect its vertices into triangles.",
- default = "'fan'"
- },
- {
- name = "usage",
- type = "MeshUsage",
- description = "An optimization hint indicating how often the data in the Mesh will be updated.",
- default = "'dynamic'"
- }
- },
- returns = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The new Mesh."
- }
- }
- },
- {
- description = "These variants accept a custom vertex format. For more info, see the <a data-key=\"Mesh\">`Mesh`</a> page.",
- arguments = {
- {
- name = "format",
- type = "table",
- description = "A table describing the attribute format for the vertices."
- },
- {
- name = "size",
- type = "number",
- description = "The maximum number of vertices the Mesh can store."
- },
- {
- name = "mode",
- type = "DrawMode",
- description = "How the Mesh will connect its vertices into triangles.",
- default = "'fan'"
- },
- {
- name = "usage",
- type = "MeshUsage",
- description = "An optimization hint indicating how often the data in the Mesh will be updated.",
- default = "'dynamic'"
- }
- },
- returns = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The new Mesh."
- }
- }
- },
- {
- arguments = {
- {
- name = "format",
- type = "table",
- description = "A table describing the attribute format for the vertices."
- },
- {
- name = "vertices",
- type = "table",
- description = "A table of vertices. Each vertex is a table containing the vertex data."
- },
- {
- name = "mode",
- type = "DrawMode",
- description = "How the Mesh will connect its vertices into triangles.",
- default = "'fan'"
- },
- {
- name = "usage",
- type = "MeshUsage",
- description = "An optimization hint indicating how often the data in the Mesh will be updated.",
- default = "'dynamic'"
- }
- },
- returns = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The new Mesh."
- }
- }
- }
- }
- },
- {
- name = "newModel",
- tag = "graphicsObjects",
- summary = "Create a new Model.",
- description = "Creates a new Model from a file. The supported 3D file formats are OBJ and glTF.\n\nThe following features are not supported yet: animations, materials, vertex colors.",
- key = "lovr.graphics.newModel",
- module = "lovr.graphics",
- notes = "Diffuse and emissive textures will be loaded in the sRGB encoding, all other textures will be loaded as linear.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the model to load."
- },
- {
- name = "texture",
- type = "string",
- description = "The filename of the texture to apply to the model.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "model",
- type = "Model",
- description = "The new Model."
- }
- }
- },
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the model to load."
- },
- {
- name = "material",
- type = "Material",
- description = "The material to apply to the model. If nil, the materials will be loaded from the model file.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "model",
- type = "Model",
- description = "The new Model."
- }
- }
- },
- {
- arguments = {
- {
- name = "modelData",
- type = "ModelData",
- description = "The ModelData holding the data for the Model."
- },
- {
- name = "texture",
- type = "string",
- description = "The filename of the texture to apply to the model.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "model",
- type = "Model",
- description = "The new Model."
- }
- }
- },
- {
- arguments = {
- {
- name = "modelData",
- type = "ModelData",
- description = "The ModelData holding the data for the Model."
- },
- {
- name = "material",
- type = "Material",
- description = "The material to apply to the model. If nil, the materials will be loaded from the model file.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "model",
- type = "Model",
- description = "The new Model."
- }
- }
- }
- }
- },
- {
- name = "newShader",
- tag = "graphicsObjects",
- summary = "Create a new Shader.",
- description = "Creates a new Shader.",
- key = "lovr.graphics.newShader",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.setShader",
- "lovr.graphics.getShader"
- },
- variants = {
- {
- arguments = {
- {
- name = "vertex",
- type = "string",
- description = "The code or filename of the vertex shader. If nil, the default vertex shader is used."
- },
- {
- name = "fragment",
- type = "string",
- description = "The code or filename of the fragment shader. If nil, the default fragment shader is used."
- }
- },
- returns = {
- {
- name = "shader",
- type = "Shader",
- description = "The new Shader."
- }
- }
- }
- }
- },
- {
- name = "newShaderBlock",
- tag = "graphicsObjects",
- summary = "Create a new ShaderBlock.",
- description = "Creates a new ShaderBlock from a table of variable definitions with their names and types.",
- key = "lovr.graphics.newShaderBlock",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "uniforms",
- type = "table",
- description = "A table where the keys are uniform names and the values are uniform types. Uniform arrays can be specified by supplying a table as the uniform's value containing the type and the array size."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings.",
- default = "{}",
- table = {
- {
- name = "usage",
- type = "BufferUsage",
- description = "How the data in the block will be updated.",
- default = "dynamic"
- },
- {
- name = "writable",
- type = "boolean",
- description = "Whether Shaders can write to the data in the block.",
- default = "false"
- }
- }
- }
- },
- returns = {
- {
- name = "shaderBlock",
- type = "ShaderBlock",
- description = "The new ShaderBlock."
- }
- }
- }
- },
- related = {
- "lovr.graphics.newShader",
- "lovr.graphics.newComputeShader"
- },
- examples = {
- {
- description = "Create a ShaderBlock to hold a block of useful shader data.",
- code = "function lovr.load()\n block = lovr.graphics.newShaderBlock({\n time = 'float',\n lightCount = 'int',\n lightPositions = { 'vec3', 16 },\n lightColors = { 'vec3', 16 },\n objectCount = 'int',\n objectTransforms = { 'mat4', 256 }\n })\n\n shader = lovr.graphics.newShader(\n block:getShaderCode('Block') .. -- Define the block in the shader\n [[\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n // ...use the object transforms from the block\n return projection * transform * vertex;\n }\n ]],\n\n block:getShaderCode('Block') ..\n [[\n vec4 color(vec4 gColor, sampler2D image, vec2 uv) {\n // ...use the lights from the block\n return gColor * texture(image, uv);\n }\n ]]\n )\n\n -- Bind the block to the shader\n shader:sendBlock('Block', block)\nend\n\n-- Update the data in the block every frame\nfunction lovr.update(dt)\n block:send('time', lovr.timer.getTime())\n block:send('lightCount', lightCount)\n block:send('lightPositions', { { x, y, z}, { x, y, z } })\n -- etc.\nend"
- }
- },
- notes = "The writable flag can only be true if compute shaders are supported, see `lovr.graphics.getFeatures`. Writable blocks may be slightly slower than non-writable blocks, but they can also be much, much larger. Non-writable blocks are usually limited to around 16 kilobytes in size, depending on hardware."
- },
- {
- name = "newTexture",
- tag = "graphicsObjects",
- summary = "Create a new Texture.",
- description = "Creates a new Texture from an image file.",
- key = "lovr.graphics.newTexture",
- module = "lovr.graphics",
- notes = "The \"linear\" flag should be set to true for textures that don't contain color information, such as normal maps. It is ignored if gamma correct rendering is disabled. See `lovr.graphics.isGammaCorrect` for more info.",
- variants = {
- {
- arguments = {
- {
- name = "filename",
- type = "string",
- description = "The filename of the image to load."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the texture.",
- table = {
- {
- name = "linear",
- type = "boolean",
- description = "Whether the texture is in linear color space instead of sRGB.",
- default = "false"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether mipmaps will be generated for the texture.",
- default = "true"
- },
- {
- name = "type",
- type = "TextureType",
- description = "The type of Texture to load the images into. If nil, the type will be `2d` for a single image, `array` for a table of images with numeric keys, or `cube` for a table of images with string keys.",
- default = "nil"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The new Texture."
- }
- }
- },
- {
- description = "Create a Texture from a table of filenames, Blobs, or TextureData. For cube textures, the individual faces can be specified using the string keys \"right\", \"left\", \"top\", \"bottom\", \"back\", \"front\".",
- arguments = {
- {
- name = "images",
- type = "table",
- description = ""
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the texture.",
- table = {
- {
- name = "linear",
- type = "boolean",
- description = "Whether the texture is in linear color space instead of sRGB.",
- default = "false"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether mipmaps will be generated for the texture.",
- default = "true"
- },
- {
- name = "type",
- type = "TextureType",
- description = "The type of Texture to load the images into. If nil, the type will be `2d` for a single image, `array` for a table of images with numeric keys, or `cube` for a table of images with string keys.",
- default = "nil"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The new Texture."
- }
- }
- },
- {
- description = "Creates a blank Texture with specified dimensions. This saves memory if you're planning on rendering to the Texture using a Canvas or a compute shader, but the contents of the Texture will be initialized to random data.",
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the Texture."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the Texture."
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the Texture."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the texture.",
- table = {
- {
- name = "linear",
- type = "boolean",
- description = "Whether the texture is in linear color space instead of sRGB.",
- default = "false"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether mipmaps will be generated for the texture.",
- default = "true"
- },
- {
- name = "type",
- type = "TextureType",
- description = "The type of Texture to load the images into. If nil, the type will be `2d` for a single image, `array` for a table of images with numeric keys, or `cube` for a table of images with string keys.",
- default = "nil"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The new Texture."
- }
- }
- },
- {
- description = "Create a texture from a single Blob.",
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob containing encoded image data used to create the Texture."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the texture.",
- table = {
- {
- name = "linear",
- type = "boolean",
- description = "Whether the texture is in linear color space instead of sRGB.",
- default = "false"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether mipmaps will be generated for the texture.",
- default = "true"
- },
- {
- name = "type",
- type = "TextureType",
- description = "The type of Texture to load the images into. If nil, the type will be `2d` for a single image, `array` for a table of images with numeric keys, or `cube` for a table of images with string keys.",
- default = "nil"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The new Texture."
- }
- }
- },
- {
- description = "Create a texture from a single TextureData.",
- arguments = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The TextureData to create the Texture from."
- },
- {
- name = "flags",
- type = "table",
- description = "Optional settings for the texture.",
- table = {
- {
- name = "linear",
- type = "boolean",
- description = "Whether the texture is in linear color space instead of sRGB.",
- default = "false"
- },
- {
- name = "mipmaps",
- type = "boolean",
- description = "Whether mipmaps will be generated for the texture.",
- default = "true"
- },
- {
- name = "type",
- type = "TextureType",
- description = "The type of Texture to load the images into. If nil, the type will be `2d` for a single image, `array` for a table of images with numeric keys, or `cube` for a table of images with string keys.",
- default = "nil"
- }
- },
- default = "{}"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The new Texture."
- }
- }
- }
- }
- },
- {
- name = "origin",
- tag = "graphicsTransforms",
- summary = "Reset the coordinate system.",
- description = "Resets the transformation to the origin.",
- key = "lovr.graphics.origin",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "This is called at the beginning of every frame to reset the coordinate space."
- },
- {
- name = "plane",
- tag = "graphicsPrimitives",
- summary = "Draw a plane.",
- description = "Draws a plane with a given position, size, and orientation.",
- key = "lovr.graphics.plane",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the plane."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "width",
- type = "number",
- description = "The width of the plane, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the plane, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The number of radians to rotate around the rotation axis.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the rotation axis.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the rotation axis.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the rotation axis.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- description = "Draw a plane with a custom material.",
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The material to apply to the plane."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the plane.",
- default = "0"
- },
- {
- name = "width",
- type = "number",
- description = "The width of the plane, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the plane, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The number of radians to rotate around the rotation axis.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the rotation axis.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the rotation axis.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the rotation axis.",
- default = "0"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "points",
- tag = "graphicsPrimitives",
- summary = "Draw one or more points.",
- description = "Draws one or more points.",
- key = "lovr.graphics.points",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the point."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the point."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the point."
- },
- {
- name = "...",
- type = "number",
- description = "More points."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "points",
- type = "table",
- description = "A table of points, as described above."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "pop",
- tag = "graphicsTransforms",
- summary = "Pop the current transform off the stack.",
- description = "Pops the current transform from the stack, returning to the transformation that was applied before `lovr.graphics.push` was called.",
- key = "lovr.graphics.pop",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- related = {
- "lovr.graphics.push"
- },
- notes = "An error is thrown if there isn't a transform to pop. This can happen if you forget to call push before calling pop, or if you have an unbalanced sequence of pushes and pops."
- },
- {
- name = "present",
- tag = "window",
- summary = "Present a frame to the window.",
- description = "Presents the results of pending drawing operations to the window. This is automatically called after `lovr.draw` by the default `lovr.run` function.",
- key = "lovr.graphics.present",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "print",
- tag = "graphicsPrimitives",
- summary = "Render text.",
- description = "Draws text in 3D space using the active font.",
- key = "lovr.graphics.print",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "str",
- type = "string",
- description = "The text to render."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the text.",
- default = 0
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the text.",
- default = 0
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the text.",
- default = 0
- },
- {
- name = "scale",
- type = "number",
- description = "The scale of the text.",
- default = 1
- },
- {
- name = "angle",
- type = "number",
- description = "The number of radians to rotate the text around its rotation axis.",
- default = 0
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = 0
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = 1
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = 0
- },
- {
- name = "wrap",
- type = "number",
- description = "The maximum width of each line, in meters (affected by `scale`). Set to 0 or nil for no wrapping.",
- default = "0"
- },
- {
- name = "halign",
- type = "HorizontalAlign",
- description = "The horizontal alignment.",
- default = "'center'"
- },
- {
- name = "valign",
- type = "VerticalAlign",
- description = "The vertical alignment.",
- default = "'middle'"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.getFont",
- "lovr.graphics.setFont",
- "lovr.graphics.newFont",
- "Font"
- },
- notes = "Unicode text is supported.\n\nUse `\\n` to add line breaks. `\\t` will be rendered as four spaces.\n\nLÖVR uses a fancy technique for font rendering called multichannel signed distance fields. This leads to crisp text in VR, but requires a special shader to use. LÖVR internally switches to the appropriate shader, but only when the default shader is already set. If you see strange font artifacts, make sure you switch back to the default shader by using `lovr.graphics.setShader()` before you draw text."
- },
- {
- name = "push",
- tag = "graphicsTransforms",
- summary = "Push a copy of the current transform onto the stack.",
- description = "Pushes a copy of the current transform onto the transformation stack. After changing the transform using `lovr.graphics.translate`, `lovr.graphics.rotate`, and `lovr.graphics.scale`, the original state can be restored using `lovr.graphics.pop`.",
- key = "lovr.graphics.push",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- related = {
- "lovr.graphics.pop"
- },
- notes = "An error is thrown if more than 64 matrices are pushed. This can happen accidentally if a push isn't followed by a corresponding pop."
- },
- {
- name = "reset",
- tag = "graphicsState",
- summary = "Reset all graphics state.",
- description = "Resets the graphics state. This includes the coordinate transformation, projection, shader, colors, scissor, and culling state.",
- key = "lovr.graphics.reset",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "rotate",
- tag = "graphicsTransforms",
- summary = "Rotate the coordinate system.",
- description = "Rotates the coordinate system around an axis.\n\nThe rotation will last until `lovr.draw` returns or the transformation is popped off the transformation stack.",
- key = "lovr.graphics.rotate",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "angle",
- type = "number",
- description = "The amount to rotate the coordinate system by, in radians."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.scale",
- "lovr.graphics.translate",
- "lovr.graphics.transform"
- },
- notes = "Order matters when scaling, translating, and rotating the coordinate system."
- },
- {
- name = "scale",
- tag = "graphicsTransforms",
- summary = "Scale the coordinate system.",
- description = "Scales the coordinate system in 3 dimensions. This will cause objects to appear bigger or smaller.\n\nThe scaling will last until `lovr.draw` returns or the transformation is popped off the transformation stack.",
- key = "lovr.graphics.scale",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The amount to scale on the x axis."
- },
- {
- name = "y",
- type = "number",
- description = "The amount to scale on the y axis.",
- default = "x"
- },
- {
- name = "z",
- type = "number",
- description = "The amount to scale on the z axis.",
- default = "x"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.rotate",
- "lovr.graphics.translate",
- "lovr.graphics.transform"
- },
- notes = "Order matters when scaling, translating, and rotating the coordinate system."
- },
- {
- name = "setAlphaSampling",
- tag = "graphicsState",
- summary = "Enable or disable alpha sampling.",
- description = "Enables or disables alpha sampling. Alpha sampling is also known as alpha-to-coverage. When it is enabled, the alpha channel of a pixel is factored into how antialiasing is computed, so the edges of a transparent texture will be correctly antialiased.",
- key = "lovr.graphics.setAlphaSampling",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether or not alpha sampling is enabled."
- }
- },
- returns = {}
- }
- },
- notes = "- Alpha sampling is disabled by default.\n- This feature can be used for a cheap transparency effect, pixels with an alpha of zero will\n have their depth value discarded, allowing things behind them to show through (normally you\n have to sort objects or write a shader for this)."
- },
- {
- name = "setBackgroundColor",
- tag = "graphicsState",
- summary = "Set the background color.",
- description = "Sets the background color used to clear the screen. Color components are from 0.0 to 1.0.",
- key = "lovr.graphics.setBackgroundColor",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "r",
- type = "number",
- description = "The red component of the background color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the background color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the background color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the background color.",
- default = "1.0"
- }
- },
- returns = {}
- }
- },
- notes = "The default background color is black."
- },
- {
- name = "setBlendMode",
- tag = "graphicsState",
- summary = "Set the blend mode.",
- description = "Sets the blend mode. The blend mode controls how each pixel's color is blended with the previous pixel's color when drawn.",
- key = "lovr.graphics.setBlendMode",
- module = "lovr.graphics",
- related = {
- "BlendMode",
- "BlendAlphaMode"
- },
- variants = {
- {
- arguments = {
- {
- name = "blend",
- type = "BlendMode",
- description = "The blend mode."
- },
- {
- name = "alphaBlend",
- type = "BlendAlphaMode",
- description = "The alpha blend mode."
- }
- },
- returns = {}
- },
- {
- description = "Disable blending.",
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "setCanvas",
- tag = "graphicsState",
- summary = "Set the active Canvas.",
- description = "Sets or disables the active Canvas object. If there is an active Canvas, things will be rendered to the Textures attached to that Canvas instead of to the headset.",
- key = "lovr.graphics.setCanvas",
- module = "lovr.graphics",
- related = {
- "Canvas:renderTo",
- "Canvas"
- },
- variants = {
- {
- arguments = {
- {
- name = "canvas",
- type = "Canvas",
- description = "The new active Canvas object, or `nil` to just render to the headset.",
- default = "nil"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setColor",
- tag = "graphicsState",
- summary = "Set the global color factor.",
- description = "Sets the color used for drawing objects. Color components are from 0.0 to 1.0. Every pixel drawn will be multiplied (i.e. tinted) by this color. This is a global setting, so it will affect all subsequent drawing operations.",
- key = "lovr.graphics.setColor",
- module = "lovr.graphics",
- notes = "The default color is white.",
- variants = {
- {
- arguments = {
- {
- name = "r",
- type = "number",
- description = "The red component of the color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the color.",
- default = "1.0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "color",
- type = "table",
- description = "A table containing the color components."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- description = "Draw a red cube.",
- code = "function lovr.draw()\n lovr.graphics.setColor(1.0, 0, 0)\n lovr.graphics.cube('fill', 0, 1.7, -1, .5, lovr.timer.getTime())\nend"
- }
- }
- },
- {
- name = "setCullingEnabled",
- tag = "graphicsState",
- summary = "Enable or disable backface culling.",
- description = "Enables or disables culling. Culling is an optimization that avoids rendering the back face of polygons. This improves performance by reducing the number of polygons drawn, but requires that the vertices in triangles are specified in a consistent clockwise or counter clockwise order.",
- key = "lovr.graphics.setCullingEnabled",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "isEnabled",
- type = "boolean",
- description = "Whether or not culling should be enabled."
- }
- },
- returns = {}
- }
- },
- notes = "Culling is disabled by default."
- },
- {
- name = "setDefaultFilter",
- tag = "graphicsState",
- summary = "Set the default filter mode for Textures.",
- description = "Sets the default filter mode for new Textures. This controls how textures are sampled when they are minified, magnified, or stretched.",
- key = "lovr.graphics.setDefaultFilter",
- module = "lovr.graphics",
- related = {
- "Texture:getFilter",
- "Texture:setFilter"
- },
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "FilterMode",
- description = "The filter mode."
- },
- {
- name = "anisotropy",
- type = "number",
- description = "If the filtering mode is \"anisotropic\", returns the level of anisotropy. Otherwise, this will be nil."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setDepthTest",
- tag = "graphicsState",
- summary = "Set or disable the depth test.",
- description = "Sets the current depth test. The depth test controls how overlapping objects are rendered.",
- key = "lovr.graphics.setDepthTest",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "compareMode",
- type = "CompareMode",
- description = "The new depth test. Use `nil` to disable the depth test.",
- default = "nil"
- },
- {
- name = "write",
- type = "boolean",
- description = "Whether pixels will have their z value updated when rendered to.",
- default = "true"
- }
- },
- returns = {}
- }
- },
- notes = "The depth test is an advanced technique to control how 3D objects overlap each other when they are rendered. It works as follows:\n\n- Each pixel keeps track of its z value as well as its color.\n- If `write` is enabled when something is drawn, then any pixels that are drawn will have their\n z values updated.\n- Additionally, anything drawn will first compare the existing z value of a pixel with the new z\n value. The `compareMode` setting determines how this comparison is performed. If the\n comparison succeeds, the new pixel will overwrite the previous one, otherwise that pixel won't\n be rendered to.\n\nSmaller z values are closer to the camera.\n\nThe default compare mode is `lequal`, which usually gives good results for normal 3D rendering."
- },
- {
- name = "setFont",
- tag = "graphicsState",
- summary = "Set the active font.",
- description = "Sets the active font used to render text with `lovr.graphics.print`.",
- key = "lovr.graphics.setFont",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.print"
- },
- variants = {
- {
- arguments = {
- {
- name = "font",
- type = "Font",
- description = "The font to use. If `nil`, the default font is set.",
- default = "nil"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLineWidth",
- tag = "graphicsState",
- summary = "Set the line width.",
- description = "Sets the width of lines rendered using `lovr.graphics.line`.",
- key = "lovr.graphics.setLineWidth",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The new line width, in pixels."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.line"
- },
- notes = "The default line width is `1.0`.\n\nDriver support for line widths is poor. The actual width of lines may be different from what is set here. In particular, some graphics drivers only support a line width of `1.0`."
- },
- {
- name = "setPointSize",
- tag = "graphicsState",
- summary = "Set the point size.",
- description = "Sets the width of drawn points, in pixels.",
- key = "lovr.graphics.setPointSize",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "size",
- type = "number",
- description = "The new point size."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.points"
- },
- notes = "The default point size is `1.0`."
- },
- {
- name = "setProjection",
- tag = "graphicsState",
- summary = "Set the projection matrix.",
- description = "Sets the projection matrix.",
- key = "lovr.graphics.setProjection",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "projection",
- type = "mat4",
- description = "The projection matrix to use."
- }
- },
- returns = {}
- }
- },
- notes = "- The projection matrix will be set for both \"eyes\" of the camera.\n- This state is reset at the beginning and end of `lovr.headset.renderTo`."
- },
- {
- name = "setShader",
- tag = "graphicsState",
- summary = "Set or disable the active shader.",
- description = "Sets or disables the Shader used for drawing.",
- key = "lovr.graphics.setShader",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "shader",
- type = "Shader",
- description = "The shader to use."
- }
- },
- returns = {}
- },
- {
- description = "Revert back to the default shader.",
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "setStencilTest",
- tag = "graphicsState",
- summary = "Set the stencil test.",
- description = "Sets the stencil test. The stencil test lets you mask out pixels that meet certain criteria, based on the contents of the stencil buffer. The stencil buffer can be modified using `lovr.graphics.stencil`. After rendering to the stencil buffer, the stencil test can be set to control how subsequent drawing functions are masked by the stencil buffer.",
- key = "lovr.graphics.setStencilTest",
- module = "lovr.graphics",
- notes = "Stencil values are between 0 and 255.",
- variants = {
- {
- arguments = {
- {
- name = "compareMode",
- type = "CompareMode",
- description = "The comparison method used to decide if a pixel should be visible, or nil if the stencil test is disabled."
- },
- {
- name = "compareValue",
- type = "number",
- description = "The value to compare stencil values to."
- }
- },
- returns = {}
- },
- {
- description = "Disables the stencil test.",
- arguments = {},
- returns = {}
- }
- },
- related = {
- "lovr.graphics.stencil"
- }
- },
- {
- name = "setWinding",
- tag = "graphicsState",
- summary = "Set the winding direction.",
- description = "Sets the polygon winding. The winding direction determines which face of a triangle is the front face and which is the back face. This lets the graphics engine cull the back faces of polygons, improving performance. The default is counterclockwise.",
- key = "lovr.graphics.setWinding",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "winding",
- type = "Winding",
- description = "The new winding direction."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.setCullingEnabled",
- "lovr.graphics.isCullingEnabled"
- },
- notes = "Culling is initially disabled and must be enabled using `lovr.graphics.setCullingEnabled`.\n\nThe default winding direction is counterclockwise."
- },
- {
- name = "setWireframe",
- tag = "graphicsState",
- summary = "Enable or disable wireframe rendering.",
- description = "Enables or disables wireframe rendering. This is meant to be used as a debugging tool.",
- key = "lovr.graphics.setWireframe",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "wireframe",
- type = "boolean",
- description = "Whether or not wireframe rendering should be enabled."
- }
- },
- returns = {}
- }
- },
- notes = "Wireframe rendering is initially disabled."
- },
- {
- name = "skybox",
- tag = "graphicsPrimitives",
- summary = "Render a skybox.",
- description = "Render a skybox from a texture. Two common kinds of skybox textures are supported: A 2d equirectangular texture with a spherical coordinates can be used, or a \"cubemap\" texture created from 6 images.",
- key = "lovr.graphics.skybox",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "texture",
- type = "Texture",
- description = "The texture to use."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- code = "function lovr.load()\n skybox = lovr.graphics.newTexture({\n left = 'left.png',\n right = 'right.png',\n top = 'up.png',\n bottom = 'down.png',\n back = 'back.png',\n front = 'front.png'\n })\n\n -- or skybox = lovr.graphics.newTexture('equirectangular.png')\nend\n\nfunction lovr.draw()\n lovr.graphics.skybox(skybox)\nend"
- }
- }
- },
- {
- name = "sphere",
- tag = "graphicsPrimitives",
- summary = "Draw a sphere.",
- description = "Draws a sphere.",
- key = "lovr.graphics.sphere",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "size",
- type = "number",
- description = "The size of the sphere, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the sphere around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the sphere's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the sphere's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the sphere's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply to the sphere."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "size",
- type = "number",
- description = "The size of the sphere, in meters.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The rotation of the sphere around its rotation axis, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x coordinate of the sphere's axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y coordinate of the sphere's axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z coordinate of the sphere's axis of rotation.",
- default = "0"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "stencil",
- tag = "graphicsPrimitives",
- summary = "Modify the stencil buffer.",
- description = "Renders to the stencil buffer using a function.",
- key = "lovr.graphics.stencil",
- module = "lovr.graphics",
- notes = "Stencil values are between 0 and 255.",
- variants = {
- {
- arguments = {
- {
- name = "callback",
- type = "function",
- description = "The function that will be called to render to the stencil buffer.",
- arguments = {},
- returns = {}
- },
- {
- name = "action",
- type = "StencilAction",
- description = "How to modify the stencil value of pixels that are rendered to.",
- default = "'replace'"
- },
- {
- name = "value",
- type = "number",
- description = "If `action` is \"replace\", this is the value that pixels are replaced with.",
- default = "1"
- },
- {
- name = "keep",
- type = "boolean",
- description = "If false, the stencil buffer will be cleared to zero before rendering.",
- default = "false"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "callback",
- type = "function",
- description = "The function that will be called to render to the stencil buffer.",
- arguments = {},
- returns = {}
- },
- {
- name = "action",
- type = "StencilAction",
- description = "How to modify the stencil value of pixels that are rendered to.",
- default = "'replace'"
- },
- {
- name = "value",
- type = "number",
- description = "If `action` is \"replace\", this is the value that pixels are replaced with.",
- default = "1"
- },
- {
- name = "initial",
- type = "number",
- description = "The value to clear the stencil buffer to before rendering.",
- default = "0"
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.getStencilTest",
- "lovr.graphics.setStencilTest"
- }
- },
- {
- name = "transform",
- tag = "graphicsTransforms",
- summary = "Apply a general transform to the coordinate system.",
- description = "Apply a transform to the coordinate system, changing its translation, rotation, and scale using a single function. A `mat4` can also be used.\n\nThe transformation will last until `lovr.draw` returns or the transformation is popped off the transformation stack.",
- key = "lovr.graphics.transform",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.rotate",
- "lovr.graphics.scale",
- "lovr.graphics.translate"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the translation.",
- default = 0
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the translation.",
- default = 0
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the translation.",
- default = 0
- },
- {
- name = "sx",
- type = "number",
- description = "The x scale factor.",
- default = 1
- },
- {
- name = "sy",
- type = "number",
- description = "The y scale factor.",
- default = 1
- },
- {
- name = "sz",
- type = "number",
- description = "The z scale factor.",
- default = 1
- },
- {
- name = "angle",
- type = "number",
- description = "The number of radians to rotate around the rotation axis.",
- default = 0
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = 0
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = 1
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = 0
- }
- },
- returns = {}
- },
- {
- description = "Modify the coordinate system using a mat4 object.",
- arguments = {
- {
- name = "transform",
- type = "mat4",
- description = "The mat4 to apply to the coordinate system."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "translate",
- tag = "graphicsTransforms",
- summary = "Translate the coordinate system.",
- description = "Translates the coordinate system in three dimensions. All graphics operations that use coordinates will behave as if they are offset by the translation value.\n\nThe translation will last until `lovr.draw` returns or the transformation is popped off the transformation stack.",
- key = "lovr.graphics.translate",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The amount to translate on the x axis."
- },
- {
- name = "y",
- type = "number",
- description = "The amount to translate on the y axis."
- },
- {
- name = "z",
- type = "number",
- description = "The amount to translate on the z axis."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.graphics.rotate",
- "lovr.graphics.scale",
- "lovr.graphics.transform"
- },
- notes = "Order matters when scaling, translating, and rotating the coordinate system."
- },
- {
- name = "triangle",
- tag = "graphicsPrimitives",
- summary = "Draw triangles.",
- description = "Draws triangles from a list of points.",
- key = "lovr.graphics.triangle",
- module = "lovr.graphics",
- notes = "The number of vertices must be a multiple of three.",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawStyle",
- description = "How to draw the triangle."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of a vertex."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of a vertex."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of a vertex."
- },
- {
- name = "...",
- type = "number",
- description = "More vertices."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply."
- },
- {
- name = "x",
- type = "number",
- description = "The x coordinate of a vertex."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of a vertex."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of a vertex."
- },
- {
- name = "...",
- type = "number",
- description = "More vertices."
- }
- },
- returns = {}
- }
- }
- }
- },
- objects = {
- {
- name = "Canvas",
- summary = "An offscreen render target.",
- description = "A Canvas is also known as a framebuffer or render-to-texture. It allows you to render to a texture instead of directly to the screen. This lets you postprocess or transform the results later before finally rendering them to the screen.\n\nAfter creating a Canvas, you can attach Textures to it using `Canvas:setTexture`.",
- key = "Canvas",
- module = "lovr.graphics",
- examples = {
- {
- description = "Apply a postprocessing effect (wave) using a Canvas and a fragment shader.",
- code = "function lovr.load()\n lovr.graphics.setBackgroundColor(.1, .1, .1)\n canvas = lovr.graphics.newCanvas(lovr.headset.getDisplayDimensions())\n\n wave = lovr.graphics.newShader([[\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n return vertex;\n }\n ]], [[\n uniform float time;\n vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {\n uv.x += sin(uv.y * 10 + time * 4) * .01;\n uv.y += cos(uv.x * 10 + time * 4) * .01;\n return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv);\n }\n ]])\nend\n\nfunction lovr.update(dt)\n wave:send('time', lovr.timer.getTime())\nend\n\nfunction lovr.draw(eye)\n -- Render the scene to the canvas instead of the headset.\n canvas:renderTo(function()\n lovr.graphics.clear()\n local size = 5\n for i = 1, size do\n for j = 1, size do\n for k = 1, size do\n lovr.graphics.setColor(i / size, j / size, k / size)\n local x, y, z = i - size / 2, j - size / 2, k - size / 2\n lovr.graphics.cube('fill', x, y, z, .5)\n end\n end\n end\n end)\n\n -- Render the canvas to the headset using a shader.\n lovr.graphics.setColor(1, 1, 1)\n lovr.graphics.setShader(wave)\n lovr.graphics.plane(canvas)\n lovr.graphics.setShader()\nend"
- }
- },
- constructors = {
- "lovr.graphics.newCanvas"
- },
- methods = {
- {
- name = "getDepthTexture",
- summary = "Get the depth buffer used by the Canvas.",
- description = "Returns the depth buffer used by the Canvas as a Texture. If the Canvas was not created with a readable depth buffer (the `depth.readable` flag in `lovr.graphics.newCanvas`), then this function will return `nil`.",
- key = "Canvas:getDepthTexture",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.newCanvas"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The depth Texture of the Canvas."
- }
- }
- }
- }
- },
- {
- name = "getDimensions",
- summary = "Get the dimensions of the Canvas.",
- description = "Returns the dimensions of the Canvas, its Textures, and its depth buffer.",
- key = "Canvas:getDimensions",
- module = "lovr.graphics",
- related = {
- "Canvas:getWidth",
- "Canvas:getHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the Canvas, in pixels."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the Canvas, in pixels."
- }
- }
- }
- },
- notes = "The dimensions of a Canvas can not be changed after it is created."
- },
- {
- name = "getFormat",
- summary = "Get the format of the Canvas texture.",
- description = "Returns the internal storage format used for the Canvas.",
- key = "Canvas:getFormat",
- module = "lovr.graphics",
- related = {
- "TextureFormat",
- "lovr.graphics.newCanvas"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "format",
- type = "TextureFormat",
- description = "The texture format used by the Canvas."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- summary = "Get the height of the Canvas.",
- description = "Returns the height of the Canvas, its Textures, and its depth buffer.",
- key = "Canvas:getHeight",
- module = "lovr.graphics",
- related = {
- "Canvas:getWidth",
- "Canvas:getDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the Canvas, in pixels."
- }
- }
- }
- },
- notes = "The height of a Canvas can not be changed after it is created."
- },
- {
- name = "getMSAA",
- summary = "Get the number of MSAA samples used by the Canvas.",
- description = "Returns the number of multisample antialiasing samples to use when rendering to the Canvas. Increasing this number will make the contents of the Canvas appear more smooth at the cost of performance. It is common to use powers of 2 for this value.",
- key = "Canvas:getMSAA",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.newCanvas",
- "lovr.graphics.newTexture"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "samples",
- type = "number",
- description = "The number of MSAA samples."
- }
- }
- }
- },
- notes = "All textures attached to the Canvas must be created with this MSAA value."
- },
- {
- name = "getTexture",
- summary = "Get the Textures attached to the Canvas.",
- description = "Returns the set of Textures currently attached to the Canvas.",
- key = "Canvas:getTexture",
- module = "lovr.graphics",
- notes = "Up to 4 Textures can be attached at once.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "...",
- type = "Texture",
- description = "One or more Textures attached to the Canvas."
- }
- }
- }
- }
- },
- {
- name = "getWidth",
- summary = "Get the width of the Canvas.",
- description = "Returns the width of the Canvas, its Textures, and its depth buffer.",
- key = "Canvas:getWidth",
- module = "lovr.graphics",
- related = {
- "Canvas:getHeight",
- "Canvas:getDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the Canvas, in pixels."
- }
- }
- }
- },
- notes = "The width of a Canvas can not be changed after it is created."
- },
- {
- name = "isStereo",
- summary = "Check if the Canvas is stereo.",
- description = "Returns whether the Canvas was created with the `stereo` flag. Drawing something to a stereo Canvas will draw it to two viewports in the left and right half of the Canvas, using transform information from two different eyes.",
- key = "Canvas:isStereo",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.newCanvas",
- "lovr.graphics.fill"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "stereo",
- type = "boolean",
- description = "Whether the Canvas is stereo."
- }
- }
- }
- }
- },
- {
- name = "newTextureData",
- summary = "Create a new TextureData from a Canvas texture.",
- description = "Returns a new TextureData containing the contents of a Texture attached to the Canvas.",
- key = "Canvas:newTextureData",
- module = "lovr.graphics",
- related = {
- "lovr.data.newTextureData",
- "TextureData"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the Texture to read from.",
- default = "1"
- }
- },
- returns = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The new TextureData."
- }
- }
- }
- }
- },
- {
- name = "renderTo",
- summary = "Render to the Canvas using a function.",
- description = "Renders to the Canvas using a function. All graphics functions inside the callback will affect the Canvas contents instead of directly rendering to the headset. This can be used in `lovr.update`.",
- key = "Canvas:renderTo",
- module = "lovr.graphics",
- notes = "Make sure you clear the contents of the canvas before rendering by using `lovr.graphics.clear`. Otherwise there might be data in the canvas left over from a previous frame.\n\nAlso note that the transform stack is not modified by this function. If you plan on modifying the transform stack inside your callback it may be a good idea to use `lovr.graphics.push` and `lovr.graphics.pop` so you can revert to the previous transform afterwards.",
- variants = {
- {
- arguments = {
- {
- name = "callback",
- type = "function",
- description = "The function to use to render to the Canvas.",
- arguments = {
- {
- name = "...",
- type = "*"
- }
- },
- returns = {}
- },
- {
- name = "...",
- type = "*",
- description = "Additional arguments to pass to the callback."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setTexture",
- summary = "Attach one or more Textures to the Canvas.",
- description = "Attaches one or more Textures to the Canvas. When rendering to the Canvas, everything will be drawn to all attached Textures. You can attach different layers of an array, cubemap, or volume texture, and also attach different mipmap levels of Textures.",
- key = "Canvas:setTexture",
- module = "lovr.graphics",
- notes = "There are some restrictions on how textures can be attached:\n\n- Up to 4 textures can be attached at once.\n- Textures must have the same dimensions and multisample settings as the Canvas.\n\nTo specify layers and mipmaps to attach, specify them after the Texture. You can also optionally wrap them in a table.",
- variants = {
- {
- arguments = {
- {
- name = "...",
- type = "*",
- description = "One or more Textures to attach to the Canvas."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- description = "Various ways to attach textures to a Canvas.",
- code = "canvas:setTexture(textureA)\ncanvas:setTexture(textureA, textureB) -- Attach two textures\ncanvas:setTexture(textureA, layer, mipmap) -- Attach a specific layer and mipmap\ncanvas:setTexture(textureA, layer, textureB, layer) -- Attach specific layers\ncanvas:setTexture({ textureA, layer, mipmap }, textureB, { textureC, layer }) -- Tables\ncanvas:setTexture({ { textureA, layer, mipmap }, textureB, { textureC, layer } })"
- }
- }
- }
- },
- notes = "Up to four textures can be attached to a Canvas and anything rendered to the Canvas will be broadcast to all attached Textures. If you want to do render different things to different textures, add a `#define MULTICANVAS` line to the top of your fragment shader and implement the `void colors` function instead of the usual `vec4 color` function. You can then assign different output colors to `lovrCanvas[0]`, `lovrCanvas[1]`, etc. instead of returning a single color."
- },
- {
- name = "Font",
- summary = "A loaded font used to render text.",
- description = "A Font is an object created from a TTF file. It can be used to render text with `lovr.graphics.print`.",
- key = "Font",
- module = "lovr.graphics",
- methods = {
- {
- name = "getAscent",
- summary = "Get the ascent of the Font.",
- description = "Returns the maximum distance that any glyph will extend above the Font's baseline. Units are generally in meters, see `Font:getPixelDensity`.",
- key = "Font:getAscent",
- module = "lovr.graphics",
- related = {
- "Font:getDescent",
- "Rasterizer:getAscent"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "ascent",
- type = "number",
- description = "The ascent of the Font."
- }
- }
- }
- }
- },
- {
- name = "getBaseline",
- summary = "Get the baseline of the Font.",
- description = "Returns the baseline of the Font. This is where the characters \"rest on\", relative to the y coordinate of the drawn text. Units are generally in meters, see `Font:setPixelDensity`.",
- key = "Font:getBaseline",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "baseline",
- type = "number",
- description = "The baseline of the Font."
- }
- }
- }
- }
- },
- {
- name = "getDescent",
- summary = "Get the descent of the Font.",
- description = "Returns the maximum distance that any glyph will extend below the Font's baseline. Units are generally in meters, see `Font:getPixelDensity` for more information. Note that due to the coordinate system for fonts, this is a negative value.",
- key = "Font:getDescent",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "descent",
- type = "number",
- description = "The descent of the Font."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- summary = "Get the height of a line of text.",
- description = "Returns the height of a line of text, in meters. Units are in meters, see `Font:setPixelDensity`.",
- key = "Font:getHeight",
- module = "lovr.graphics",
- related = {
- "Rasterizer:getHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of a rendered line of text."
- }
- }
- }
- }
- },
- {
- name = "getLineHeight",
- summary = "Get the line height of the Font.",
- description = "Returns the current line height of the Font. The default is 1.0.",
- key = "Font:getLineHeight",
- module = "lovr.graphics",
- related = {
- "Rasterizer:getLineHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "lineHeight",
- type = "number",
- description = "The line height."
- }
- }
- }
- }
- },
- {
- name = "getPixelDensity",
- summary = "Get the pixel density of the Font.",
- description = "Returns the current pixel density for the Font. The default is 1.0. Normally, this is in pixels per meter. When rendering to a 2D texture, the units are pixels.",
- key = "Font:getPixelDensity",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "pixelDensity",
- type = "number",
- description = "The current pixel density."
- }
- }
- }
- }
- },
- {
- name = "getRasterizer",
- summary = "Get the underlying Rasterizer.",
- description = "Returns the underyling `Rasterizer` object for a Font.",
- key = "Font:getRasterizer",
- module = "lovr.graphics",
- related = {
- "Rasterizer",
- "lovr.data.newRasterizer"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "rasterizer",
- type = "Rasterizer",
- description = "The rasterizer."
- }
- }
- }
- }
- },
- {
- name = "getWidth",
- summary = "Get the width of a line of text.",
- description = "Returns the width of a string when rendered using the font, with an optional wrap. To get the correct units returned, make sure the pixel density is set with `Font:setPixelDensity`.",
- key = "Font:getWidth",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "text",
- type = "string",
- description = "The text to get the width of."
- },
- {
- name = "wrap",
- type = "number",
- description = "The width at which to wrap lines, or 0 for no wrap.",
- default = "0"
- }
- },
- returns = {
- {
- name = "width",
- type = "number",
- description = "The maximum width of any line in the text."
- }
- }
- }
- }
- },
- {
- name = "hasGlyphs",
- summary = "Check if a Font has a set of glyphs.",
- description = "Returns whether the Font has a set of glyphs. Any combination of strings and numbers (corresponding to character codes) can be specified. This function will return true if the Font is able to render *all* of the glyphs.",
- key = "Font:hasGlyphs",
- module = "lovr.graphics",
- related = {
- "Rasterizer:hasGlyphs"
- },
- variants = {
- {
- arguments = {
- {
- name = "...",
- type = "*",
- description = "Strings or numbers to test."
- }
- },
- returns = {
- {
- name = "has",
- type = "boolean",
- description = "Whether the Font has the glyphs."
- }
- }
- }
- },
- notes = "It is a good idea to use this function when you're rendering an unknown or user-supplied string to avoid embarrassing crashes."
- },
- {
- name = "setLineHeight",
- summary = "Set the line height of the Font.",
- description = "Sets the line height of the Font, which controls how far lines apart lines are vertically separated. This value is a ratio and the default is 1.0.",
- key = "Font:setLineHeight",
- module = "lovr.graphics",
- related = {
- "Rasterizer:getLineHeight"
- },
- variants = {
- {
- arguments = {
- {
- name = "lineHeight",
- type = "number",
- description = "The new line height."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPixelDensity",
- summary = "Set the pixel density of the Font.",
- description = "Sets the pixel density for the Font. Normally, this is in pixels per meter. When rendering to a 2D texture, the units are pixels.",
- key = "Font:setPixelDensity",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "pixelDensity",
- type = "number",
- description = "The new pixel density."
- }
- },
- returns = {}
- },
- {
- description = "Reset the pixel density to the default (`font:getRasterizer():getHeight()`).",
- arguments = {},
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.graphics.newFont"
- }
- },
- {
- name = "Material",
- summary = "An object that controls texturing and shading.",
- description = "A Material is an object used to control how objects appear, through coloring, texturing, and shading. The Material itself holds sets of colors, textures, and other parameters that are made available to Shaders.",
- key = "Material",
- module = "lovr.graphics",
- methods = {
- {
- name = "getColor",
- summary = "Get a color property of the Material.",
- description = "Returns a color property for a Material. Different types of colors are supported for different lighting parameters. Colors default to white and are gamma corrected as necessary, see `lovr.graphics.isGammaCorrect` for more info on that.",
- key = "Material:getColor",
- module = "lovr.graphics",
- related = {
- "MaterialColor",
- "lovr.graphics.setColor"
- },
- variants = {
- {
- arguments = {
- {
- name = "colorType",
- type = "MaterialColor",
- description = "The type of color to get.",
- default = "'diffuse'"
- }
- },
- returns = {
- {
- name = "r",
- type = "number",
- description = "The red component of the color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the color."
- }
- }
- }
- }
- },
- {
- name = "getScalar",
- summary = "Get a scalar property of the Material.",
- description = "Returns a numeric property of a Material. Scalar properties default to 1.0.",
- key = "Material:getScalar",
- module = "lovr.graphics",
- related = {
- "MaterialScalar"
- },
- variants = {
- {
- arguments = {
- {
- name = "scalarType",
- type = "MaterialScalar",
- description = "The type of property to get."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The value of the property."
- }
- }
- }
- }
- },
- {
- name = "getTexture",
- summary = "Get a texture for the Material.",
- description = "Returns a texture for a Material. Different types of textures are supported for different lighting parameters. If unset, textures default to a blank white texture.",
- key = "Material:getTexture",
- module = "lovr.graphics",
- related = {
- "MaterialTexture"
- },
- variants = {
- {
- arguments = {
- {
- name = "textureType",
- type = "MaterialTexture",
- description = "The type of texture to get.",
- default = "'diffuse'"
- }
- },
- returns = {
- {
- name = "texture",
- type = "Texture",
- description = "The texture that is set, or `nil` if no texture is set."
- }
- }
- }
- }
- },
- {
- name = "getTransform",
- summary = "Get the transformation applied to texture coordinates.",
- description = "Returns the transformation applied to texture coordinates of the Material.",
- key = "Material:getTransform",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "ox",
- type = "number",
- description = "The texture coordinate x offset."
- },
- {
- name = "oy",
- type = "number",
- description = "The texture coordinate y offset."
- },
- {
- name = "sx",
- type = "number",
- description = "The texture coordinate x scale."
- },
- {
- name = "sy",
- type = "number",
- description = "The texture coordinate y scale."
- },
- {
- name = "angle",
- type = "number",
- description = "The texture coordinate rotation, in radians."
- }
- }
- }
- }
- },
- {
- name = "setColor",
- summary = "Set a color property of the Material.",
- description = "Sets a color property for a Material. Different types of colors are supported for different lighting parameters. Color channels should be from 0.0 to 1.0. Colors default to white and are gamma corrected as necessary, see `lovr.graphics.isGammaCorrect` for more info on that.",
- key = "Material:setColor",
- module = "lovr.graphics",
- related = {
- "MaterialColor",
- "lovr.graphics.setColor"
- },
- variants = {
- {
- arguments = {
- {
- name = "colorType",
- type = "MaterialColor",
- description = "The type of color to get.",
- default = "'diffuse'"
- },
- {
- name = "r",
- type = "number",
- description = "The red component of the color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the color.",
- default = "1.0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "r",
- type = "number",
- description = "The red component of the color."
- },
- {
- name = "g",
- type = "number",
- description = "The green component of the color."
- },
- {
- name = "b",
- type = "number",
- description = "The blue component of the color."
- },
- {
- name = "a",
- type = "number",
- description = "The alpha component of the color.",
- default = "1.0"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setScalar",
- summary = "Set a scalar property of the Material.",
- description = "Sets a numeric property of a Material. Scalar properties default to 1.0.",
- key = "Material:setScalar",
- module = "lovr.graphics",
- related = {
- "MaterialScalar"
- },
- variants = {
- {
- arguments = {
- {
- name = "scalarType",
- type = "MaterialScalar",
- description = "The type of property to get."
- },
- {
- name = "x",
- type = "number",
- description = "The value of the property."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setTexture",
- summary = "Set a texture for the Material.",
- description = "Sets a texture for a Material. Different types of textures are supported for different lighting parameters. If set to `nil`, textures default to a blank white texture.",
- key = "Material:setTexture",
- module = "lovr.graphics",
- related = {
- "MaterialTexture",
- "lovr.graphics.newTexture"
- },
- variants = {
- {
- arguments = {
- {
- name = "textureType",
- type = "MaterialTexture",
- description = "The type of texture to get.",
- default = "'diffuse'"
- },
- {
- name = "texture",
- type = "Texture",
- description = "The texture to apply, or `nil` to use the default."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "texture",
- type = "Texture",
- description = "The texture to apply, or `nil` to use the default."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "textureType",
- type = "MaterialTexture",
- description = "The type of texture to get.",
- default = "'diffuse'"
- },
- {
- name = "canvas",
- type = "Canvas",
- description = "A Canvas. The first Texture attached to the Canvas will be used."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "canvas",
- type = "Canvas",
- description = "A Canvas. The first Texture attached to the Canvas will be used."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setTransform",
- summary = "Set the transformation applied to texture coordinates.",
- description = "Sets the transformation applied to texture coordinates of the Material. This lets you offset, scale, or rotate textures as they are applied to geometry.",
- key = "Material:setTransform",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "ox",
- type = "number",
- description = "The texture coordinate x offset."
- },
- {
- name = "oy",
- type = "number",
- description = "The texture coordinate y offset."
- },
- {
- name = "sx",
- type = "number",
- description = "The texture coordinate x scale."
- },
- {
- name = "sy",
- type = "number",
- description = "The texture coordinate y scale."
- },
- {
- name = "angle",
- type = "number",
- description = "The texture coordinate rotation, in radians."
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.graphics.newMaterial"
- }
- },
- {
- name = "Mesh",
- summary = "A drawable list of vertices.",
- description = "A Mesh is a low-level graphics object that stores and renders a list of vertices.\n\nMeshes are really flexible since you can pack pretty much whatever you want in them. This makes them great for rendering arbitrary geometry, but it also makes them kinda difficult to use since you have to place each vertex yourself.\n\nIt's possible to batch geometry with Meshes too. Instead of drawing a shape 100 times, it's much faster to pack 100 copies of the shape into a Mesh and draw the Mesh once.\n\nMeshes are also a good choice if you have a mesh that changes its shape over time.",
- key = "Mesh",
- module = "lovr.graphics",
- constructors = {
- "lovr.graphics.newMesh"
- },
- notes = "Each vertex in a Mesh can hold several pieces of data. For example, you might want a vertex to keep track of its position, color, and a weight. Each one of these pieces of information is called a vertex **attribute**. A vertex attribute must have a name, a type, and a size. Here's what the \"position\" attribute would look like as a Lua table:\n\n { 'vPosition', 'float', 3 } -- 3 floats for x, y, and z\n\nEvery vertex in a Mesh must have the same set of attributes. We call this set of attributes the **format** of the Mesh, and it's specified as a simple table of attributes. For example, we could represent the format described above as:\n\n {\n { 'vPosition', 'float', 3 },\n { 'vColor', 'byte', 4 },\n { 'vWeight', 'int', 1 }\n }\n\nWhen creating a Mesh, you can give it any format you want, or use the default. The default Mesh format looks like this:\n\n {\n { 'lovrPosition', 'float', 3 },\n { 'lovrNormal', 'float', 3 },\n { 'lovrTexCoord', 'float', 2 }\n }\n\nGreat, so why do we go through the trouble of naming everything in our vertex and saying what type and size it is? The cool part is that we can access this data in a Shader. We can write a vertex Shader that has `in` variables for every vertex attribute in our Mesh:\n\n in vec3 vPosition;\n in vec4 vColor;\n in int vWeight;\n\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n // Here we can access the vPosition, vColor, and vWeight of each vertex in the Mesh!\n }\n\nSpecifying custom vertex data is really powerful and is often used for lighting, animation, and more!\n\nThe types of attributes that are available are:\n\n- `byte` (-128 to 127)\n- `ubyte` (0 to 255)\n- `short` (-32768 to 32767)\n- `ushort` (0 to 65535)\n- `int` (-2147483648 to 2147483647)\n- `uint` (0 to 4294967295)\n- `float` (floating point value)",
- methods = {
- {
- name = "attachAttributes",
- summary = "Attach attributes from another Mesh onto this one.",
- description = "Attaches attributes from another Mesh onto this one. This can be used to share vertex data across multiple meshes without duplicating the data, and can also be used for instanced rendering by using the `divisor` parameter.",
- key = "Mesh:attachAttributes",
- module = "lovr.graphics",
- related = {
- "Mesh:detachAttributes",
- "Mesh:drawInstanced"
- },
- variants = {
- {
- description = "Attach all attributes from the other mesh.",
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The Mesh to attach attributes from."
- },
- {
- name = "divisor",
- type = "number",
- description = "The attribute divisor for all attached attributes.",
- default = "0"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The Mesh to attach attributes from."
- },
- {
- name = "divisor",
- type = "number",
- description = "The attribute divisor for all attached attributes.",
- default = "0"
- },
- {
- name = "...",
- type = "string",
- description = "The names of attributes to attach from the other Mesh."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "The Mesh to attach attributes from."
- },
- {
- name = "divisor",
- type = "number",
- description = "The attribute divisor for all attached attributes.",
- default = "0"
- },
- {
- name = "attributes",
- type = "table",
- description = "A table of attribute names to attach from the other Mesh."
- }
- },
- returns = {}
- }
- },
- notes = "The attribute divisor is a number used to control how the attribute data relates to instancing. If 0, then the attribute data is considered \"per vertex\", and each vertex will get the next element of the attribute's data. If the divisor 1 or more, then the attribute data is considered \"per instance\", and every N instances will get the next element of the attribute data.\n\nTo prevent cycles, it is not possible to attach attributes onto a Mesh that already has attributes attached to a different Mesh."
- },
- {
- name = "detachAttributes",
- summary = "Detach attributes that were attached from a different Mesh.",
- description = "Detaches attributes that were attached using `Mesh:attachAttributes`.",
- key = "Mesh:detachAttributes",
- module = "lovr.graphics",
- related = {
- "Mesh:attachAttributes"
- },
- variants = {
- {
- description = "Detaches all attributes from the other mesh, by name.",
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "A Mesh. The names of all of the attributes from this Mesh will be detached."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "A Mesh. The names of all of the attributes from this Mesh will be detached."
- },
- {
- name = "...",
- type = "string",
- description = "The names of attributes to detach."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "mesh",
- type = "Mesh",
- description = "A Mesh. The names of all of the attributes from this Mesh will be detached."
- },
- {
- name = "attributes",
- type = "table",
- description = "A table of attribute names to detach."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "draw",
- summary = "Draw the Mesh.",
- description = "Draws the contents of the Mesh.",
- key = "Mesh:draw",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate to draw the Mesh at.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate to draw the Mesh at.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate to draw the Mesh at.",
- default = "0"
- },
- {
- name = "scale",
- type = "number",
- description = "The scale to draw the Mesh at.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The angle to rotate the Mesh around its axis of rotation.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- },
- {
- name = "instances",
- type = "number",
- description = "The number of copies of the Mesh to draw.",
- default = "1"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "transform",
- type = "mat4",
- description = "The transform to apply before drawing."
- },
- {
- name = "instances",
- type = "number",
- description = "The number of copies of the Mesh to draw.",
- default = "1"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "getDrawMode",
- summary = "Get the draw mode of the Mesh.",
- description = "Get the draw mode of the Mesh, which controls how the vertices are connected together.",
- key = "Mesh:getDrawMode",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mode",
- type = "DrawMode",
- description = "The draw mode of the Mesh."
- }
- }
- }
- }
- },
- {
- name = "getDrawRange",
- summary = "Get the draw range of the Mesh.",
- description = "Retrieve the current draw range for the Mesh. The draw range is a subset of the vertices of the Mesh that will be drawn.",
- key = "Mesh:getDrawRange",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "start",
- type = "number",
- description = "The index of the first vertex that will be drawn, or nil if no draw range is set."
- },
- {
- name = "count",
- type = "number",
- description = "The number of vertices that will be drawn, or nil if no draw range is set."
- }
- }
- }
- }
- },
- {
- name = "getMaterial",
- summary = "Get the Material applied to the Mesh.",
- description = "Get the Material applied to the Mesh.",
- key = "Mesh:getMaterial",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The current material applied to the Mesh."
- }
- }
- }
- }
- },
- {
- name = "getVertex",
- summary = "Get a single vertex in the Mesh.",
- description = "Gets the data for a single vertex in the Mesh. The set of data returned depends on the Mesh's vertex format. The default vertex format consists of 8 floating point numbers: the vertex position, the vertex normal, and the texture coordinates.",
- key = "Mesh:getVertex",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the vertex to retrieve."
- }
- },
- returns = {
- {
- name = "...",
- type = "number",
- description = "All attributes of the vertex."
- }
- }
- }
- }
- },
- {
- name = "getVertexAttribute",
- summary = "Get an attribute of a single vertex in the Mesh.",
- description = "Get the components of a specific attribute of a single vertex in the Mesh.",
- key = "Mesh:getVertexAttribute",
- module = "lovr.graphics",
- notes = "Meshes without a custom format have the vertex position as their first attribute, the normal vector as the second attribute, and the texture coordinate as the third attribute.",
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the vertex to retrieve the attribute of."
- },
- {
- name = "attribute",
- type = "number",
- description = "The index of the attribute to retrieve the components of."
- }
- },
- returns = {
- {
- name = "...",
- type = "number",
- description = "The components of the vertex attribute."
- }
- }
- }
- }
- },
- {
- name = "getVertexCount",
- summary = "Get the number of vertices the Mesh can hold.",
- description = "Returns the maximum number of vertices the Mesh can hold.",
- key = "Mesh:getVertexCount",
- module = "lovr.graphics",
- notes = "The size can only be set when creating the Mesh, and cannot be changed afterwards.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "size",
- type = "number",
- description = "The number of vertices the Mesh can hold."
- }
- }
- }
- }
- },
- {
- name = "getVertexFormat",
- summary = "Get the vertex format of the Mesh.",
- description = "Get the format table of the Mesh's vertices. The format table describes the set of data that each vertex contains.",
- key = "Mesh:getVertexFormat",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "format",
- type = "table",
- description = "The table of vertex attributes. Each attribute is a table containing the name of the attribute, the data type, and the number of components."
- }
- }
- }
- }
- },
- {
- name = "getVertexMap",
- summary = "Get the current vertex map of the Mesh.",
- description = "Returns the current vertex map for the Mesh. The vertex map is a list of indices in the Mesh, allowing the reordering or reuse of vertices.",
- key = "Mesh:getVertexMap",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {}
- },
- {
- arguments = {
- {
- name = "t",
- type = "table",
- description = "The table to fill with the vertex map."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "The Blob to fill with the vertex map data."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "isAttributeEnabled",
- summary = "Check if a vertex attribute is enabled.",
- description = "Returns whether or not a vertex attribute is enabled. Disabled attributes won't be sent to shaders.",
- key = "Mesh:isAttributeEnabled",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "attribute",
- type = "string",
- description = "The name of the attribute."
- }
- },
- returns = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether or not the attribute is enabled when drawing the Mesh."
- }
- }
- }
- }
- },
- {
- name = "setAttributeEnabled",
- summary = "Enable or disable a vertex attribute.",
- description = "Sets whether a vertex attribute is enabled. Disabled attributes won't be sent to shaders.",
- key = "Mesh:setAttributeEnabled",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "attribute",
- type = "string",
- description = "The name of the attribute."
- },
- {
- name = "enabled",
- type = "boolean",
- description = "Whether or not the attribute is enabled when drawing the Mesh."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setDrawMode",
- summary = "Change the draw mode of the Mesh.",
- description = "Set a new draw mode for the Mesh.",
- key = "Mesh:setDrawMode",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "DrawMode",
- description = "The new draw mode for the Mesh."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setDrawRange",
- summary = "Set the draw range of the Mesh.",
- description = "Set the draw range for the Mesh. The draw range is a subset of the vertices of the Mesh that will be drawn.",
- key = "Mesh:setDrawRange",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "start",
- type = "number",
- description = "The first vertex that will be drawn."
- },
- {
- name = "count",
- type = "number",
- description = "The number of vertices that will be drawn."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setMaterial",
- summary = "Apply a Material to the Mesh.",
- description = "Applies a Material to the Mesh. This will cause it to use the Material's properties whenever it is rendered.",
- key = "Mesh:setMaterial",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The Material to apply."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVertex",
- summary = "Update a single vertex in the Mesh.",
- description = "Update a single vertex in the Mesh.",
- key = "Mesh:setVertex",
- module = "lovr.graphics",
- notes = "Any unspecified components will be set to 0.",
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the vertex to set."
- },
- {
- name = "...",
- type = "number",
- description = "The attributes of the vertex."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- description = "Set the position of a vertex:",
- code = "function lovr.load()\n mesh = lovr.graphics.newMesh({\n { -1, 1, 0, 0, 0, 1, 0, 0 },\n { 1, 1, 0, 0, 0, 1, 1, 0 },\n { -1, -1, 0, 0, 0, 1, 0, 1 },\n { 1, -1, 0, 0, 0, 1, 1, 1 }\n }, 'strip')\n\n mesh:setVertex(2, { 7, 7, 7 })\n print(mesh:getVertex(2)) -- 7, 7, 7, 0, 0, 0, 0, 0\nend"
- }
- }
- },
- {
- name = "setVertexAttribute",
- summary = "Update a specific attribute of a single vertex in the Mesh.",
- description = "Set the components of a specific attribute of a vertex in the Mesh.",
- key = "Mesh:setVertexAttribute",
- module = "lovr.graphics",
- notes = "Meshes without a custom format have the vertex position as their first attribute, the normal vector as the second attribute, and the texture coordinate as the third attribute.",
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the vertex to update."
- },
- {
- name = "attribute",
- type = "number",
- description = "The index of the attribute to update."
- },
- {
- name = "...",
- type = "number",
- description = "Thew new components for the attribute."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVertexMap",
- summary = "Set the vertex map of the Mesh.",
- description = "Sets the vertex map. The vertex map is a list of indices in the Mesh, allowing the reordering or reuse of vertices.\n\nOften, a vertex map is used to improve performance, since it usually requires less data to specify the index of a vertex than it does to specify all of the data for a vertex.",
- key = "Mesh:setVertexMap",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "map",
- type = "table",
- description = "The new vertex map. Each element of the table is an index of a vertex."
- }
- },
- returns = {}
- },
- {
- description = "This variant is much faster than the previous one, but is harder to use.",
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "A Blob to use to update vertex data."
- },
- {
- name = "size",
- type = "number",
- description = "The size of each element of the Blob, in bytes. Must be 2 or 4.",
- default = "4"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setVertices",
- summary = "Update multiple vertices in the Mesh.",
- description = "Update multiple vertices in the Mesh.",
- key = "Mesh:setVertices",
- module = "lovr.graphics",
- notes = "The start index plus the number of vertices in the table should not exceed the maximum size of the Mesh.",
- variants = {
- {
- arguments = {
- {
- name = "vertices",
- type = "table",
- description = "The new set of vertices."
- },
- {
- name = "start",
- type = "number",
- description = "The index of the vertex to start replacing at.",
- default = "1"
- },
- {
- name = "count",
- type = "number",
- description = "The number of vertices to replace. If nil, all vertices will be used.",
- default = "nil"
- }
- },
- returns = {}
- }
- }
- }
- },
- examples = {
- {
- description = "Draw a circle using a Mesh.",
- code = "function lovr.load()\n local x, y, z = 0, 1, -2\n local radius = .3\n local points = 40\n\n -- A table to hold the Mesh data\n local vertices = {}\n\n for i = 0, points do\n local angle = i / points * 2 * math.pi\n local vx = x + math.cos(angle)\n local vy = y + math.sin(angle)\n table.insert(vertices, { vx, vy, z })\n end\n\n mesh = lovr.graphics.newMesh(vertices, 'fan')\nend\n\nfunction lovr.draw()\n mesh:draw()\nend"
- }
- }
- },
- {
- name = "Model",
- summary = "An asset imported from a 3D model file.",
- description = "A Model is a drawable object loaded from a 3D file format. The supported 3D file formats are OBJ and glTF.",
- key = "Model",
- module = "lovr.graphics",
- examples = {
- {
- code = "local model\n\nfunction lovr.load()\n model = lovr.graphics.newModel('assets/model.gltf', 'assets/texture.png')\nend\n\nfunction lovr.draw()\n model:draw(0, 1, -1, 1, lovr.timer.getTime())\nend"
- }
- },
- constructors = {
- "lovr.graphics.newModel",
- "lovr.headset.newModel"
- },
- methods = {
- {
- name = "draw",
- summary = "Draw the Model.",
- description = "Draw the Model.",
- key = "Model:draw",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate to draw the Model at.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate to draw the Model at.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate to draw the Model at.",
- default = "0"
- },
- {
- name = "scale",
- type = "number",
- description = "The scale to draw the Model at.",
- default = "1"
- },
- {
- name = "angle",
- type = "number",
- description = "The angle to rotate the Model around its axis of rotation.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- },
- {
- name = "instances",
- type = "number",
- description = "The number of copies of the Model to draw.",
- default = "1"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "transform",
- type = "mat4",
- description = "The transform to apply before drawing."
- },
- {
- name = "instances",
- type = "number",
- description = "The number of copies of the Model to draw.",
- default = "1"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "getAABB",
- summary = "Get the Model's axis aligned bounding box.",
- description = "Returns a bounding box that encloses the vertices of the Model.",
- key = "Model:getAABB",
- module = "lovr.graphics",
- related = {
- "Collider:getAABB"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "minx",
- type = "number",
- description = "The minimum x coordinate of the box."
- },
- {
- name = "maxx",
- type = "number",
- description = "The maximum x coordinate of the box."
- },
- {
- name = "miny",
- type = "number",
- description = "The minimum y coordinate of the box."
- },
- {
- name = "maxy",
- type = "number",
- description = "The maximum y coordinate of the box."
- },
- {
- name = "minz",
- type = "number",
- description = "The minimum z coordinate of the box."
- },
- {
- name = "maxz",
- type = "number",
- description = "The maximum z coordinate of the box."
- }
- }
- }
- }
- },
- {
- name = "getMaterial",
- summary = "Get the Material applied to the Model.",
- description = "Returns the Material applied to the Model.",
- key = "Model:getMaterial",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "material",
- type = "Material",
- description = "The current material applied to the Model."
- }
- }
- }
- }
- },
- {
- name = "setMaterial",
- summary = "Apply a Material to the Model.",
- description = "Applies a Material to the Model.",
- key = "Model:setMaterial",
- module = "lovr.graphics",
- notes = "A model's Material will be used when drawing every part of the model. It will override any materials included in the model file. It isn't currently possible to apply multiple materials to different pieces of the Model.",
- variants = {
- {
- arguments = {
- {
- name = "material",
- type = "Material",
- description = "The material to apply to the Model."
- }
- },
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "Shader",
- summary = "A GLSL program used for low-level control over rendering.",
- description = "Shaders are GLSL programs that transform the way vertices and pixels show up on the screen. They can be used for lighting, postprocessing, particles, animation, and much more. You can use `lovr.graphics.setShader` to change the active Shader.",
- key = "Shader",
- module = "lovr.graphics",
- examples = {
- {
- description = "Set a simple shader that colors pixels based on vertex normals.",
- code = "function lovr.load()\n lovr.graphics.setShader(lovr.graphics.newShader([[\n out vec3 vNormal; // This gets passed to the fragment shader\n\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n vNormal = lovrNormal;\n return projection * transform * vertex;\n }\n ]], [[\n in vec3 vNormal; // This gets passed from the vertex shader\n\n vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {\n return vec4(vNormal * .5 + .5, 1.0);\n }\n ]]))\n\n model = lovr.graphics.newModel('model.gltf')\nend\n\nfunction lovr.draw()\n model:draw(x, y, z, 1)\nend"
- }
- },
- related = {
- "lovr.graphics.newComputeShader",
- "lovr.graphics.setShader",
- "lovr.graphics.getShader"
- },
- constructors = {
- "lovr.graphics.newShader",
- "lovr.graphics.newComputeShader"
- },
- methods = {
- {
- name = "getType",
- summary = "Get the type of the Shader.",
- description = "Returns the type of the Shader, which will be \"graphics\" or \"compute\".\n\nGraphics shaders are created with `lovr.graphics.newShader` and can be used for rendering with `lovr.graphics.setShader`. Compute shaders are created with `lovr.graphics.newComputeShader` and can be run using `lovr.graphics.compute`.",
- key = "Shader:getType",
- module = "lovr.graphics",
- related = {
- "ShaderType"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "ShaderType",
- description = "The type of the Shader."
- }
- }
- }
- }
- },
- {
- name = "hasUniform",
- summary = "Check if a Shader has a uniform variable.",
- description = "Returns whether a Shader has a particular uniform variable.",
- key = "Shader:hasUniform",
- module = "lovr.graphics",
- notes = "If a uniform variable is defined but unused in the shader, the shader compiler will optimize it out and the uniform will not report itself as present.",
- variants = {
- {
- arguments = {
- {
- name = "uniform",
- type = "string",
- description = "The name of the uniform variable."
- }
- },
- returns = {
- {
- name = "present",
- type = "boolean",
- description = "Whether the shader has the specified uniform."
- }
- }
- }
- }
- },
- {
- name = "send",
- summary = "Update a uniform variable in the Shader.",
- description = "Updates a uniform variable in the Shader.",
- key = "Shader:send",
- module = "lovr.graphics",
- related = {
- "ShaderBlock:sendBlock",
- "Shader:sendBlock"
- },
- notes = "The shader does not need to be active to update its uniforms. However, the types must match up. Uniform variables declared as `float`s must be sent a single number, whereas uniforms declared as `vec4`s must be sent a table containing 4 numbers, etc. Note that uniforms declared as mat4s can be sent a `mat4` object.\n\nAn error is thrown if the uniform does not exist or is not used in the shader.\n\n`Blob`s can be used to pass arbitrary binary data to Shader variables.",
- variants = {
- {
- arguments = {
- {
- name = "uniform",
- type = "string",
- description = "The name of the uniform to update."
- },
- {
- name = "value",
- type = "*",
- description = "The new value of the uniform."
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- description = "Updating a `vec3` uniform:",
- code = "function lovr.load()\n shader = lovr.graphics.newShader [[\n uniform vec3 offset;\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n vertex.xyz += offset;\n return projection * transform * vertex;\n }\n ]]\n\n shader:send('offset', { .3, .7, 0 })\nend"
- }
- }
- },
- {
- name = "sendBlock",
- summary = "Send a ShaderBlock to a Shader.",
- description = "Sends a ShaderBlock to a Shader. After the block is sent, you can update the data in the block without needing to resend the block. The block can be sent to multiple shaders and they will all see the same data from the block.",
- key = "Shader:sendBlock",
- module = "lovr.graphics",
- related = {
- "Shader:send",
- "ShaderBlock:send",
- "ShaderBlock:getShaderCode",
- "UniformAccess",
- "ShaderBlock"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the block to send to."
- },
- {
- name = "block",
- type = "ShaderBlock",
- description = "The ShaderBlock to associate with the specified block."
- },
- {
- name = "access",
- type = "UniformAccess",
- description = "How the Shader will use this block (used as an optimization hint).",
- default = "readwrite"
- }
- },
- returns = {}
- }
- },
- notes = "The Shader does not need to be active to send it a block.\n\nMake sure the ShaderBlock's variables line up with the block variables declared in the shader code, otherwise you'll get garbage data in the block. An easy way to do this is to use `ShaderBlock:getShaderCode` to get a GLSL snippet that is compatible with the block."
- },
- {
- name = "sendImage",
- summary = "Send a Texture to a Shader for writing.",
- description = "Sends a Texture to a Shader for writing. This is meant to be used with compute shaders and only works with uniforms declared as `image2D`, `imageCube`, `image2DArray`, and `image3D`. The normal `Shader:send` function accepts Textures and should be used most of the time.",
- key = "Shader:sendImage",
- module = "lovr.graphics",
- related = {
- "Shader:send",
- "ShaderBlock:send",
- "ShaderBlock:getShaderCode",
- "UniformAccess",
- "ShaderBlock"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the image uniform."
- },
- {
- name = "slice",
- type = "number",
- description = "The slice of a cube, array, or volume texture to use, or `nil` for all slices.",
- default = "nil"
- },
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap of the texture to use.",
- default = "1"
- },
- {
- name = "access",
- type = "UniformAccess",
- description = "Whether the image will be read from, written to, or both.",
- default = "readwrite"
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the image uniform."
- },
- {
- name = "index",
- type = "number",
- description = "The array index to set."
- },
- {
- name = "slice",
- type = "number",
- description = "The slice of a cube, array, or volume texture to use, or `nil` for all slices.",
- default = "nil"
- },
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap of the texture to use.",
- default = "1"
- },
- {
- name = "access",
- type = "UniformAccess",
- description = "Whether the image will be read from, written to, or both.",
- default = "readwrite"
- }
- },
- returns = {}
- }
- }
- }
- },
- notes = "The GLSL version used is 430 on systems that support compute shaders and 150 otherwise. The version used for WebGL is 300 es.\n\nThe default vertex shader:\n\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n return projection * transform * vertex;\n }\n\nThe default fragment shader:\n\n vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {\n return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv);\n }\n\nAdditionally, the following headers are prepended to the shader source, giving you convenient access to a default set of uniform variables and vertex attributes.\n\nVertex shader header:\n\n in vec3 lovrPosition;\n in vec3 lovrNormal;\n in vec2 lovrTexCoord;\n in vec4 lovrVertexColor;\n in vec3 lovrTangent;\n in uvec4 lovrBones;\n in vec4 lovrBoneWeights;\n out vec2 texCoord;\n out vec4 vertexColor;\n out vec4 lovrColor;\n uniform mat4 lovrModel;\n uniform mat4 lovrView;\n uniform mat4 lovrProjection;\n uniform mat4 lovrTransform; // Model-View matrix\n uniform mat3 lovrNormalMatrix;\n uniform mat3 lovrMaterialTransform;\n uniform float lovrPointSize;\n uniform mat4 lovrPose[48];\n uniform int lovrViewportCount;\n uniform int lovrViewportIndex;\n const mat4 lovrPoseMatrix; // Bone-weighted pose\n const int lovrInstanceID; // Current instance ID\n\nFragment shader header:\n\n in vec2 texCoord;\n in vec4 vertexColor;\n in vec4 lovrColor;\n out vec4 lovrCanvas[gl_MaxDrawBuffers];\n uniform float lovrMetalness;\n uniform float lovrRoughness;\n uniform vec4 lovrColor;\n uniform vec4 lovrDiffuseColor;\n uniform vec4 lovrEmissiveColor;\n uniform sampler2D lovrDiffuseTexture;\n uniform sampler2D lovrEmissiveTexture;\n uniform sampler2D lovrMetalnessTexture;\n uniform sampler2D lovrRoughnessTexture;\n uniform sampler2D lovrOcclusionTexture;\n uniform sampler2D lovrNormalTexture;\n uniform samplerCube lovrEnvironmentTexture;\n uniform int lovrViewportCount;\n uniform int lovrViewportIndex;\n\n### Compute Shaders\n\nCompute shaders can be created with `lovr.graphics.newComputeShader` and run with `lovr.graphics.compute`. Currently, compute shaders are written with raw GLSL. There is no default compute shader, instead the `void compute();` function must be implemented.\n\nYou can use the `layout` qualifier to specify a local work group size:\n\n layout(local_size_x = X, local_size_y = Y, local_size_z = Z) in;\n\nAnd the following built in variables can be used:\n\n in uvec3 gl_NumWorkGroups; // The size passed to lovr.graphics.compute\n in uvec3 gl_WorkGroupSize; // The local work group size\n in uvec3 gl_WorkGroupID; // The current global work group\n in uvec3 gl_LocalInvocationID; // The current local work group\n in uvec3 gl_GlobalInvocationID; // A unique ID combining the global and local IDs\n in uint gl_LocalInvocationIndex; // A 1D index of the LocalInvocationID\n\nCompute shaders don't return anything but they can write data to `Texture`s or `ShaderBlock`s. To bind a texture in a way that can be written to a compute shader, declare the uniforms with a type of `image2D`, `imageCube`, etc. instead of the usual `sampler2D` or `samplerCube`. Once a texture is bound to an image uniform, you can use the `imageLoad` and `imageStore` GLSL functions to read and write pixels in the image. Variables in `ShaderBlock`s can be written to using assignment syntax.\n\nLÖVR handles synchronization of textures and shader blocks so there is no need to use manual memory barriers to synchronize writes to resources from compute shaders."
- },
- {
- name = "ShaderBlock",
- summary = "A big ol' block of data that can be sent to a Shader.",
- description = "ShaderBlocks are objects that can hold large amounts of data and can be sent to Shaders. It is common to use \"uniform\" variables to send data to shaders, but uniforms are usually limited to a few kilobytes in size. ShaderBlocks are useful for a few reasons:\n\n- They can hold a lot more data.\n- Shaders can modify the data in them, which is really useful for compute shaders.\n- Setting the data in a ShaderBlock updates the data for all Shaders using the block, so you\n don't need to go around setting the same uniforms in lots of different shaders.\n\nOn systems that support compute shaders, ShaderBlocks can optionally be \"writable\". A writable ShaderBlock is a little bit slower than a non-writable one, but shaders can modify its contents and it can be much, much larger than a non-writable ShaderBlock.",
- key = "ShaderBlock",
- module = "lovr.graphics",
- constructors = {
- "lovr.graphics.newShaderBlock"
- },
- notes = "- A Shader can use up to 8 ShaderBlocks.\n- ShaderBlocks can not contain textures.\n- Some systems have bugs with `vec3` variables in ShaderBlocks. If you run into strange bugs,\n try switching to a `vec4` for the variable.",
- methods = {
- {
- name = "getOffset",
- summary = "Get the byte offset of a variable in the ShaderBlock.",
- description = "Returns the byte offset of a variable in a ShaderBlock. This is useful if you want to manually send binary data to the ShaderBlock using a `Blob` in `ShaderBlock:send`.",
- key = "ShaderBlock:getOffset",
- module = "lovr.graphics",
- related = {
- "ShaderBlock:getSize",
- "lovr.graphics.newShaderBlock"
- },
- variants = {
- {
- arguments = {
- {
- name = "field",
- type = "string",
- description = "The name of the variable to get the offset of."
- }
- },
- returns = {
- {
- name = "offset",
- type = "number",
- description = "The byte offset of the variable."
- }
- }
- }
- }
- },
- {
- name = "getShaderCode",
- summary = "Get a GLSL string that defines the ShaderBlock in a Shader.",
- description = "Before a ShaderBlock can be used in a Shader, the Shader has to have the block's variables defined in its source code. This can be a tedious process, so you can call this function to return a GLSL string that contains this definition. Roughly, it will look something like this:\n\n uniform <label> {\n <type> <name>[<count>];\n };",
- key = "ShaderBlock:getShaderCode",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.newShader",
- "lovr.graphics.newComputeShader"
- },
- examples = {
- {
- code = "lovr.graphics.newShader(\n block:getShaderCode() .. [[\n // The rest of the shader here\n ]]\n)"
- }
- },
- variants = {
- {
- arguments = {
- {
- name = "label",
- type = "string",
- description = "The label of the block in the shader code. This will be used to identify it when using Shader:sendBlock."
- }
- },
- returns = {
- {
- name = "code",
- type = "string",
- description = "The code that can be prepended to a Shader."
- }
- }
- }
- }
- },
- {
- name = "getSize",
- summary = "Get the size of the ShaderBlock.",
- description = "Returns the size of the ShaderBlock's data, in bytes.",
- key = "ShaderBlock:getSize",
- module = "lovr.graphics",
- related = {
- "ShaderBlock:getOffset",
- "lovr.graphics.newShaderBlock"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "size",
- type = "number",
- description = "The size of the ShaderBlock, in bytes."
- }
- }
- }
- }
- },
- {
- name = "getType",
- summary = "Get the type of the ShaderBlock.",
- description = "Returns the type of the ShaderBlock.",
- key = "ShaderBlock:getType",
- module = "lovr.graphics",
- related = {
- "ShaderBlock:getOffset",
- "lovr.graphics.newShaderBlock",
- "lovr.graphics.getLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "BlockType",
- description = "The type of the ShaderBlock."
- }
- }
- }
- }
- },
- {
- name = "read",
- summary = "Read a variable from the ShaderBlock.",
- description = "Returns a variable in the ShaderBlock.",
- key = "ShaderBlock:read",
- module = "lovr.graphics",
- related = {
- "Shader:send",
- "Shader:sendBlock",
- "ShaderBlock:getShaderCode",
- "ShaderBlock:getOffset",
- "ShaderBlock:getSize"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the variable to read."
- }
- },
- returns = {
- {
- name = "value",
- type = "*",
- description = "The value of the variable."
- }
- }
- }
- },
- notes = "This function is really slow! Only read back values when you need to.\n\nVectors and matrices will be returned as (flat) tables."
- },
- {
- name = "send",
- summary = "Update a variable in the ShaderBlock.",
- description = "Updates a variable in the ShaderBlock.",
- key = "ShaderBlock:send",
- module = "lovr.graphics",
- related = {
- "Shader:send",
- "Shader:sendBlock",
- "ShaderBlock:getShaderCode",
- "ShaderBlock:getOffset",
- "ShaderBlock:getSize"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- },
- {
- arguments = {
- {
- name = "blob",
- type = "Blob",
- description = "A Blob to replace the entire block with."
- }
- },
- returns = {
- {
- name = "bytes",
- type = "number",
- description = "How many bytes were copied to the block."
- }
- }
- }
- },
- notes = "For scalar or vector types, use tables of numbers or `vec3`s for each vector.\n\nFor matrix types, use tables of numbers or `mat4` objects.\n\n`Blob`s can also be used to pass arbitrary binary data to individual variables."
- }
- },
- examples = {
- {
- code = "function lovr.load()\n -- Create a ShaderBlock to store positions for 1000 models\n block = lovr.graphics.newShaderBlock('uniform', {\n modelPositions = { 'mat4', 1000 }\n }, { usage = 'static' })\n\n -- Write some random transforms to the block\n local transforms = {}\n for i = 1, 1000 do\n transforms[i] = lovr.math.mat4()\n local random, randomNormal = lovr.math.random, lovr.math.randomNormal\n transforms[i]:translate(randomNormal(8), randomNormal(8), randomNormal(8))\n transforms[i]:rotate(random(2 * math.pi), random(), random(), random())\n end\n block:send('modelPositions', transforms)\n\n -- Create the shader, injecting the shader code for the block\n shader = lovr.graphics.newShader(\n block:getShaderCode('ModelBlock') .. [[\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n return projection * transform * modelPositions[gl_InstanceID] * vertex;\n }\n ]])\n\n -- Bind the block to the shader\n shader:sendBlock('ModelBlock', block)\n model = lovr.graphics.newModel('monkey.obj')\nend\n\n-- Draw the model 1000 times, using positions from the shader block\nfunction lovr.draw()\n lovr.graphics.setShader(shader)\n model:draw(lovr.math.mat4(), 1000)\n lovr.graphics.setShader()\nend"
- }
- }
- },
- {
- name = "Texture",
- summary = "An image that can be applied to Materials.",
- description = "A Texture is an image that can be applied to `Material`s. The supported file formats are `.png`, `.jpg`, `.hdr`, `.dds`, `.ktx`, and `.astc`. DDS and ASTC are compressed formats, which are recommended because they're smaller and faster.",
- key = "Texture",
- module = "lovr.graphics",
- methods = {
- {
- name = "getDepth",
- summary = "Get the depth of the Texture.",
- description = "Returns the depth of the Texture, or the number of images stored in the Texture.",
- key = "Texture:getDepth",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap level to get the depth of. This is only valid for volume textures.",
- default = "1"
- }
- },
- returns = {
- {
- name = "depth",
- type = "number",
- description = "The depth of the Texture."
- }
- }
- }
- }
- },
- {
- name = "getDimensions",
- summary = "Get the dimensions of the Texture.",
- description = "Returns the dimensions of the Texture.",
- key = "Texture:getDimensions",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap level to get the dimensions of.",
- default = "1"
- }
- },
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the Texture, in pixels."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the Texture, in pixels."
- },
- {
- name = "depth",
- type = "number",
- description = "The number of images stored in the Texture, for non-2D textures."
- }
- }
- }
- }
- },
- {
- name = "getFilter",
- summary = "Get the FilterMode for the Texture.",
- description = "Returns the current FilterMode for the Texture.",
- key = "Texture:getFilter",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mode",
- type = "FilterMode",
- description = "The filter mode for the Texture."
- },
- {
- name = "anisotropy",
- type = "number",
- description = "If the filtering mode is \"anisotropic\", returns the level of anisotropy. Otherwise, this will be nil."
- }
- }
- }
- }
- },
- {
- name = "getFormat",
- summary = "Get the format of the Texture.",
- description = "Returns the format of the Texture. This describes how many color channels are in the texture as well as the size of each one. The most common format used is `rgba`, which contains red, green, blue, and alpha color channels. See `TextureFormat` for all of the possible formats.",
- key = "Texture:getFormat",
- module = "lovr.graphics",
- related = {
- "TextureFormat"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "format",
- type = "TextureFormat",
- description = "The format of the Texture."
- }
- }
- }
- }
- },
- {
- name = "getHeight",
- summary = "Get the height of the Texture.",
- description = "Returns the height of the Texture.",
- key = "Texture:getHeight",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap level to get the height of.",
- default = "1"
- }
- },
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the Texture, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getMipmapCount",
- summary = "Get the number of mipmap levels of the Texture.",
- description = "Returns the number of mipmap levels of the Texture.",
- key = "Texture:getMipmapCount",
- module = "lovr.graphics",
- related = {
- "Texture:getWidth",
- "Texture:getHeight",
- "Texture:getDepth",
- "Texture:getDimensions",
- "lovr.graphics.newTexture"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mipmaps",
- type = "number",
- description = "The number of mipmap levels in the Texture."
- }
- }
- }
- }
- },
- {
- name = "getType",
- summary = "Get the type of the Texture.",
- description = "Returns the type of the Texture.",
- key = "Texture:getType",
- module = "lovr.graphics",
- related = {
- "TextureType",
- "lovr.graphics.newTexture"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "TextureType",
- description = "The type of the Texture."
- }
- }
- }
- }
- },
- {
- name = "getWidth",
- summary = "Get the width of the Texture.",
- description = "Returns the width of the Texture.",
- key = "Texture:getWidth",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap level to get the width of.",
- default = "1"
- }
- },
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the Texture, in pixels."
- }
- }
- }
- }
- },
- {
- name = "getWrap",
- summary = "Get the WrapMode for the Texture.",
- description = "Returns the current WrapMode for the Texture.",
- key = "Texture:getWrap",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "horizontal",
- type = "WrapMode",
- description = "How the texture wraps horizontally."
- },
- {
- name = "vertical",
- type = "WrapMode",
- description = "How the texture wraps vertically."
- }
- }
- }
- }
- },
- {
- name = "replacePixels",
- summary = "Replace pixels in the Texture using a TextureData object.",
- description = "Replaces pixels in the Texture, sourcing from a `TextureData` object.",
- key = "Texture:replacePixels",
- module = "lovr.graphics",
- related = {
- "TextureData:setPixel",
- "TextureData"
- },
- variants = {
- {
- arguments = {
- {
- name = "textureData",
- type = "TextureData",
- description = "The TextureData containing the pixels to use. Currently, the TextureData needs to have the same dimensions as the source Texture."
- },
- {
- name = "x",
- type = "number",
- description = "The x offset to replace at.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y offset to replace at.",
- default = "0"
- },
- {
- name = "slice",
- type = "number",
- description = "The slice to replace. Not applicable for 2D textures.",
- default = "1"
- },
- {
- name = "mipmap",
- type = "number",
- description = "The mipmap to replace.",
- default = "1"
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setFilter",
- summary = "Set the FilterMode for the Texture.",
- description = "Sets the `FilterMode` used by the texture.",
- key = "Texture:setFilter",
- module = "lovr.graphics",
- related = {
- "lovr.graphics.getDefaultFilter",
- "lovr.graphics.setDefaultFilter"
- },
- variants = {
- {
- arguments = {
- {
- name = "mode",
- type = "FilterMode",
- description = "The filter mode."
- },
- {
- name = "anisotropy",
- type = "number",
- description = "The level of anisotropy to use when using anisotropic filtering."
- }
- },
- returns = {}
- }
- },
- notes = "The default setting for new textures can be set with `lovr.graphics.setDefaultFilter`."
- },
- {
- name = "setWrap",
- summary = "Set the WrapMode for the Texture.",
- description = "Sets the wrap mode of a texture. The wrap mode controls how the texture is sampled when texture coordinates lie outside the usual 0 - 1 range. The default for both directions is `repeat`.",
- key = "Texture:setWrap",
- module = "lovr.graphics",
- variants = {
- {
- arguments = {
- {
- name = "horizontal",
- type = "WrapMode",
- description = "How the texture should wrap horizontally."
- },
- {
- name = "vertical",
- type = "WrapMode",
- description = "How the texture should wrap vertically.",
- default = "horizontal"
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.graphics.newTexture"
- }
- }
- }
- },
- {
- name = "headset",
- tag = "modules",
- summary = "Connects to VR hardware.",
- description = "The `lovr.headset` module is where all the magical VR functionality is. With it, you can access connected VR hardware and get information about the available space the player has. Note that all units are reported in meters. Position `(0, 0, 0)` is the center of the play area.",
- key = "lovr.headset",
- sections = {
- {
- name = "Headset",
- tag = "headset",
- description = "Functions that return information about the active head mounted display (HMD)."
- },
- {
- name = "Input",
- tag = "input",
- description = "Functions for accessing input devices, like controllers, hands, trackers, or gamepads."
- },
- {
- name = "Play area",
- tag = "playArea",
- description = "Retrieve information about the size and shape of the room the player is in, and provides information about the \"chaperone\", a visual indicator that appears whenever a player is about to run into a wall."
- }
- },
- enums = {
- {
- name = "ControllerHand",
- description = "Represents which hand a Controller is thought to be held in.",
- key = "ControllerHand",
- module = "lovr.headset",
- values = {
- {
- name = "left",
- description = "The left hand."
- },
- {
- name = "right",
- description = "The right hand."
- },
- {
- name = "unknown",
- description = "Can not be determined."
- }
- }
- },
- {
- name = "Device",
- description = "Different types of input devices supported by the `lovr.headset` module.",
- key = "Device",
- module = "lovr.headset",
- values = {
- {
- name = "head",
- description = "The headset."
- },
- {
- name = "hand/left",
- description = "The left controller."
- },
- {
- name = "hand/right",
- description = "The right controller."
- },
- {
- name = "left",
- description = "A shorthand for hand/left."
- },
- {
- name = "right",
- description = "A shorthand for hand/right."
- },
- {
- name = "eye/left",
- description = "The left eye."
- },
- {
- name = "eye/right",
- description = "The right eye."
- },
- {
- name = "tracker/1",
- description = "The first tracker."
- },
- {
- name = "tracker/2",
- description = "The second tracker."
- },
- {
- name = "tracker/3",
- description = "The third tracker."
- },
- {
- name = "tracker/4",
- description = "The fourth tracker."
- }
- }
- },
- {
- name = "DeviceAxis",
- description = "Axes on an input device.",
- key = "DeviceAxis",
- module = "lovr.headset",
- values = {
- {
- name = "primary",
- description = "The primary analog axis (usually thumbstick or touchpad)."
- },
- {
- name = "trigger",
- description = "A trigger (1D)."
- },
- {
- name = "thumbstick",
- description = "A thumbstick (2D)."
- },
- {
- name = "touchpad",
- description = "A touchpad (2D)."
- },
- {
- name = "pinch",
- description = "A tracked pinch gesture between the thumb and index finger (1D, Leap Motion)."
- },
- {
- name = "grip",
- description = "A grip button or grab gesture (1D)."
- }
- },
- related = {
- "lovr.headset.getAxis",
- "DeviceButton",
- "DeviceBone"
- }
- },
- {
- name = "DeviceBone",
- description = "Bones tracked by input devices.",
- key = "DeviceBone",
- module = "lovr.headset",
- values = {
- {
- name = "thumb",
- description = "The tip of the thumb."
- },
- {
- name = "thumb/1",
- description = "The metacarpal bone of the thumb."
- },
- {
- name = "thumb/2",
- description = "The proximal bone of the thumb."
- },
- {
- name = "thumb/3",
- description = "The distal bone of the thumb."
- },
- {
- name = "index",
- description = "The tip of the index finger."
- },
- {
- name = "index/1",
- description = "The metacarpal bone of the index finger."
- },
- {
- name = "index/2",
- description = "The proximal bone of the index finger."
- },
- {
- name = "index/3",
- description = "The intermediate bone of the index finger."
- },
- {
- name = "index/4",
- description = "The distal bone of the index finger."
- },
- {
- name = "middle",
- description = "The tip of the middle finger."
- },
- {
- name = "middle/1",
- description = "The metacarpal bone of the middle finger."
- },
- {
- name = "middle/2",
- description = "The proximal bone of the middle finger."
- },
- {
- name = "middle/3",
- description = "The intermediate bone of the middle finger."
- },
- {
- name = "middle/4",
- description = "The distal bone of the middle finger."
- },
- {
- name = "ring",
- description = "The tip of the ring finger."
- },
- {
- name = "ring/1",
- description = "The metacarpal bone of the ring finger."
- },
- {
- name = "ring/2",
- description = "The proximal bone of the ring finger."
- },
- {
- name = "ring/3",
- description = "The intermediate bone of the ring finger."
- },
- {
- name = "ring/4",
- description = "The distal bone of the ring finger."
- },
- {
- name = "pinky",
- description = "The tip of the pinky finger."
- },
- {
- name = "pinky/1",
- description = "The metacarpal bone of the pinky finger."
- },
- {
- name = "pinky/2",
- description = "The proximal bone of the pinky finger."
- },
- {
- name = "pinky/3",
- description = "The intermediate bone of the pinky finger."
- },
- {
- name = "pinky/4",
- description = "The distal bone of the pinky finger."
- }
- },
- related = {
- "lovr.headset.getBonePose",
- "DeviceButton",
- "DeviceAxis"
- }
- },
- {
- name = "DeviceButton",
- description = "Buttons on an input device.",
- key = "DeviceButton",
- module = "lovr.headset",
- values = {
- {
- name = "primary",
- description = "The primary button (usually trigger)."
- },
- {
- name = "trigger",
- description = "The trigger button."
- },
- {
- name = "thumbstick",
- description = "The thumbstick."
- },
- {
- name = "touchpad",
- description = "The touchpad."
- },
- {
- name = "grip",
- description = "The grip button."
- },
- {
- name = "menu",
- description = "The menu button."
- },
- {
- name = "touchpad",
- description = "The button on the touchpad."
- },
- {
- name = "a",
- description = "The A button."
- },
- {
- name = "b",
- description = "The B button."
- },
- {
- name = "x",
- description = "The X button."
- },
- {
- name = "y",
- description = "The Y button."
- },
- {
- name = "proximity",
- description = "The proximity sensor on a headset."
- }
- }
- },
- {
- name = "HeadsetDriver",
- summary = "VR APIs.",
- description = "These are all of the supported VR APIs that LÖVR can use to power the lovr.headset module. You can change the order of headset drivers using `lovr.conf` to prefer or exclude specific VR APIs.\n\nAt startup, LÖVR searches through the list of drivers in order. One headset driver will be used for rendering to the VR display, and all supported headset drivers will be used for device input. The way this works is that when poses or button input is requested, the input drivers are queried (in the order they appear in `conf.lua`) to see if any of them currently have data for the specified device. The first one that returns data will be used to provide the result. This allows projects to support multiple types of hardware devices.",
- key = "HeadsetDriver",
- module = "lovr.headset",
- values = {
- {
- name = "desktop",
- description = "A VR simulator using keyboard/mouse."
- },
- {
- name = "leap",
- description = "Leap Motion hand tracking driver."
- },
- {
- name = "oculus",
- description = "Oculus Desktop SDK."
- },
- {
- name = "oculusmobile",
- description = "Oculus Mobile SDK."
- },
- {
- name = "openvr",
- description = "OpenVR."
- },
- {
- name = "openxr",
- description = "OpenXR."
- },
- {
- name = "webvr",
- description = "WebVR."
- }
- }
- },
- {
- name = "HeadsetOrigin",
- summary = "Different types of coordinate space origins.",
- description = "Represents the different types of origins for coordinate spaces. An origin of \"floor\" means that the origin is on the floor in the middle of a room-scale play area. An origin of \"head\" means that no positional tracking is available, and consequently the origin is always at the position of the headset.",
- key = "HeadsetOrigin",
- module = "lovr.headset",
- values = {
- {
- name = "head",
- description = "The origin is at the head."
- },
- {
- name = "floor",
- description = "The origin is on the floor."
- }
- }
- },
- {
- name = "HeadsetType",
- summary = "Types of VR headsets.",
- description = "Types of headsets LÖVR recognizes.",
- key = "HeadsetType",
- module = "lovr.headset",
- values = {
- {
- name = "vive",
- description = "HTC Vive."
- },
- {
- name = "rift",
- description = "Oculus Rift."
- },
- {
- name = "go",
- description = "Oculus Go."
- },
- {
- name = "gear",
- description = "Gear VR."
- },
- {
- name = "windowsmr",
- description = "A Windows Mixed Reality headset."
- },
- {
- name = "unknown",
- description = "An unknown headset."
- }
- }
- }
- },
- functions = {
- {
- name = "getAcceleration",
- tag = "input",
- summary = "Get the linear acceleration of a device.",
- description = "Returns the current linear acceleration of a device, in meters per second per second.",
- key = "lovr.headset.getAcceleration",
- module = "lovr.headset",
- related = {
- "lovr.headset.getPosition",
- "lovr.headset.getOrientation",
- "lovr.headset.getVelocity",
- "lovr.headset.getAngularVelocity",
- "lovr.headset.getAngularAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the acceleration of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "ax",
- type = "number",
- description = "The x component of the linear acceleration."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the linear acceleration."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the linear acceleration."
- }
- }
- }
- }
- },
- {
- name = "getAngularAcceleration",
- tag = "input",
- summary = "Get the angular acceleration of a device.",
- description = "Returns the current angular acceleration of a device.",
- key = "lovr.headset.getAngularAcceleration",
- module = "lovr.headset",
- related = {
- "lovr.headset.getPosition",
- "lovr.headset.getOrientation",
- "lovr.headset.getVelocity",
- "lovr.headset.getAngularVelocity",
- "lovr.headset.getAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the acceleration of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "ax",
- type = "number",
- description = "The x component of the angular acceleration."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the angular acceleration."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the angular acceleration."
- }
- }
- }
- }
- },
- {
- name = "getAngularVelocity",
- tag = "input",
- summary = "Get the angular velocity of a device.",
- description = "Returns the current angular velocity of a device.",
- key = "lovr.headset.getAngularVelocity",
- module = "lovr.headset",
- related = {
- "lovr.headset.getPosition",
- "lovr.headset.getOrientation",
- "lovr.headset.getVelocity",
- "lovr.headset.getAcceleration",
- "lovr.headset.getAngularAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the velocity of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x component of the angular velocity."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the angular velocity."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the angular velocity."
- }
- }
- }
- }
- },
- {
- name = "getAxis",
- tag = "input",
- summary = "Get the state of an analog axis on a device.",
- description = "Get the current state of an analog axis on a device. Axis values are usually between 0 and 1.\n Some axes are multidimensional, for example a 2D touchpad or thumbstick with x/y axes. For\n multidimensional axes, this function will return multiple values, one number for each axis.",
- key = "lovr.headset.getAxis",
- module = "lovr.headset",
- related = {
- "DeviceAxis",
- "lovr.headset.isDown"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device."
- },
- {
- name = "axis",
- type = "DeviceAxis",
- description = "The axis."
- }
- },
- returns = {
- {
- name = "...",
- type = "number",
- description = "The current state of the components of the axis, or `nil` if the device does not have any information about the axis."
- }
- }
- }
- }
- },
- {
- name = "getBonePose",
- tag = "input",
- summary = "Get the pose of a tracked bone.",
- description = "Returns the current position and orientation of a bone tracked by a device. This is mainly used for tracking hands.",
- key = "lovr.headset.getBonePose",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device."
- },
- {
- name = "bone",
- type = "DeviceBone",
- description = "The bone."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position."
- },
- {
- name = "y",
- type = "number",
- description = "The y position."
- },
- {
- name = "z",
- type = "number",
- description = "The z position."
- },
- {
- name = "angle",
- type = "number",
- description = "The amount of rotation around the axis of rotation, in radians."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- },
- related = {
- "lovr.headset.getPose"
- },
- notes = "Units are in meters."
- },
- {
- name = "getBoundsDepth",
- tag = "playArea",
- summary = "Get the depth of the play area.",
- description = "Returns the depth of the play area, in meters.",
- key = "lovr.headset.getBoundsDepth",
- module = "lovr.headset",
- related = {
- "lovr.headset.getBoundsWidth",
- "lovr.headset.getBoundsDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "depth",
- type = "number",
- description = "The depth of the play area, in meters."
- }
- }
- }
- }
- },
- {
- name = "getBoundsDimensions",
- tag = "playArea",
- summary = "Get the size of the play area.",
- description = "Returns the size of the play area, in meters.",
- key = "lovr.headset.getBoundsDimensions",
- module = "lovr.headset",
- related = {
- "lovr.headset.getBoundsWidth",
- "lovr.headset.getBoundsDepth",
- "lovr.headset.getBoundsGeometry"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the play area, in meters."
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the play area, in meters."
- }
- }
- }
- }
- },
- {
- name = "getBoundsGeometry",
- tag = "playArea",
- summary = "Get a list of points that make up the play area boundary.",
- description = "Returns a list of points representing the boundaries of the play area, or `nil` if the current headset driver does not expose this information.",
- key = "lovr.headset.getBoundsGeometry",
- module = "lovr.headset",
- related = {
- "lovr.headset.getBoundsDimensions"
- },
- variants = {
- {
- arguments = {
- {
- name = "t",
- type = "table",
- description = "A table to fill with the points. If `nil`, a new table will be created.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "points",
- type = "table",
- description = "A flat table of 3D points representing the play area boundaries."
- }
- }
- }
- }
- },
- {
- name = "getBoundsWidth",
- tag = "playArea",
- summary = "Get the width of the play area.",
- description = "Returns the width of the play area, in meters.",
- key = "lovr.headset.getBoundsWidth",
- module = "lovr.headset",
- related = {
- "lovr.headset.getBoundsDepth",
- "lovr.headset.getBoundsDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the play area, in meters."
- }
- }
- }
- }
- },
- {
- name = "getClipDistance",
- tag = "headset",
- summary = "Get the near and far clipping planes of the headset.",
- description = "Returns the near and far clipping planes used to render to the headset. Objects closer than the near clipping plane or further than the far clipping plane will be clipped out of view.",
- key = "lovr.headset.getClipDistance",
- module = "lovr.headset",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "near",
- type = "number",
- description = "The distance to the near clipping plane, in meters."
- },
- {
- name = "far",
- type = "number",
- description = "The distance to the far clipping plane, in meters."
- }
- }
- }
- }
- },
- {
- name = "getDisplayDimensions",
- tag = "headset",
- summary = "Get the dimensions of the headset display.",
- description = "Returns the dimensions of the headset display (for both eyes), in pixels.",
- key = "lovr.headset.getDisplayDimensions",
- module = "lovr.headset",
- related = {
- "lovr.headset.getDisplayWidth",
- "lovr.headset.getDisplayHeight"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the display."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the display."
- }
- }
- }
- }
- },
- {
- name = "getDisplayHeight",
- tag = "headset",
- summary = "Get the height of the headset display.",
- description = "Returns the height of the headset display (both eyes), in pixels.",
- key = "lovr.headset.getDisplayHeight",
- module = "lovr.headset",
- related = {
- "lovr.headset.getDisplayWidth",
- "lovr.headset.getDisplayDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "height",
- type = "number",
- description = "The height of the display."
- }
- }
- }
- }
- },
- {
- name = "getDisplayMask",
- tag = "headset",
- summary = "Get a mesh that masks out the visible display area.",
- description = "Returns a list of 2D triangle vertices that represents areas of the headset display that will never be seen by the user (due to the circular nature of the lenses). This area can be masked out by rendering it to the depth buffer or stencil buffer. Then, Further drawing operations can skip rendering to those pixels using the depth test (`lovr.graphics.setDepthTest`) or stencil test (`lovr.graphics.setStencilTest`), which improves performance.",
- key = "lovr.headset.getDisplayMask",
- module = "lovr.headset",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "points",
- type = "table",
- description = "A table of points. Each point is a table with two numbers between 0 and 1."
- }
- }
- }
- },
- examples = {
- {
- code = "function lovr.load()\n lovr.graphics.setBackgroundColor(1, 1, 1)\n\n shader = lovr.graphics.newShader([[\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n\n // Rescale mesh coordinates from (0,1) to (-1,1)\n vertex.xy *= 2.;\n vertex.xy -= 1.;\n\n // Flip the mesh if it's being drawn in the right eye\n if (lovrViewID == 1) {\n vertex.x = -vertex.x;\n }\n\n return vertex;\n }\n ]], [[\n // The fragment shader returns solid black for illustration purposes. It could be transparent.\n vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {\n return vec4(0., 0., 0., 1.);\n }\n ]])\n\n mask = lovr.headset.getDisplayMask()\n\n if mask then\n mesh = lovr.graphics.newMesh({ { 'lovrPosition', 'float', 2 } }, mask, 'triangles')\n end\nend\n\nfunction lovr.draw()\n if mask then\n -- Mask out parts of the display that aren't visible to skip rendering those pixels later\n lovr.graphics.setShader(shader)\n mesh:draw()\n lovr.graphics.setShader()\n\n -- Draw a red cube\n lovr.graphics.setColor(0xff0000)\n lovr.graphics.cube('fill', 0, 1.7, -1, .5, lovr.timer.getTime())\n lovr.graphics.setColor(0xffffff)\n else\n lovr.graphics.setColor(0x000000)\n lovr.graphics.print('No mask found.', 0, 1.7, -3, .2)\n lovr.graphics.setColor(0xffffff)\n end\nend"
- }
- },
- related = {
- "lovr.graphics.newMesh",
- "lovr.graphics.setDepthTest",
- "lovr.graphics.setStencilTest"
- }
- },
- {
- name = "getDisplayWidth",
- tag = "headset",
- summary = "Get the width of the headset display.",
- description = "Returns the width of the headset display (for both eyes), in pixels.",
- key = "lovr.headset.getDisplayWidth",
- module = "lovr.headset",
- related = {
- "lovr.headset.getDisplayHeight",
- "lovr.headset.getDisplayDimensions"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the display."
- }
- }
- }
- }
- },
- {
- name = "getDriver",
- tag = "headset",
- summary = "Get the VR API currently in use for a device.",
- description = "Returns the `HeadsetDriver` that is currently in use, optionally for a specific device. You can change the order of headset drivers using `lovr.conf` to prefer or exclude specific VR APIs.",
- key = "lovr.headset.getDriver",
- module = "lovr.headset",
- variants = {
- {
- description = "Return the current driver for the headset display.",
- arguments = {},
- returns = {
- {
- name = "driver",
- type = "HeadsetDriver",
- description = "The driver of the headset in use, e.g. \"OpenVR\"."
- }
- }
- },
- {
- description = "Return the current input driver for a device.",
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the active driver of. This will be the first driver that is currently returning a pose for the device.",
- default = "head"
- }
- },
- returns = {
- {
- name = "driver",
- type = "HeadsetDriver",
- description = "The driver of the headset in use, e.g. \"OpenVR\"."
- }
- }
- }
- }
- },
- {
- name = "getHands",
- tag = "input",
- summary = "Get a list of currently tracked hand devices.",
- description = "Returns a table with all of the currently tracked hand devices.",
- key = "lovr.headset.getHands",
- module = "lovr.headset",
- notes = "The hand paths *always* be either `hand/left` or `hand/right`.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "hands",
- type = "table",
- description = "The currently tracked hand devices.",
- arguments = {},
- returns = {}
- }
- }
- }
- },
- examples = {
- {
- code = "function lovr.update(dt)\n for i, hand in ipairs(lovr.headset.getHands()) do\n print(hand, lovr.headset.getPose(hand))\n end\nend"
- }
- }
- },
- {
- name = "getMirrorTexture",
- tag = "headset",
- summary = "Get the Texture containing a view of what's in the headset.",
- description = "Returns a Texture that contains whatever is currently rendered to the headset.\n\nSometimes this can be `nil` if the current headset driver doesn't have a mirror texture, which can happen if the driver renders directly to the display. Currently the `fake`, `webvr`, and `oculusmobile` drivers do not have a mirror texture.\n\nIt also isn't guaranteed that the same Texture will be returned by subsequent calls to this function. Currently, the `oculus` driver exhibits this behavior.",
- key = "lovr.headset.getMirrorTexture",
- module = "lovr.headset",
- related = {
- "lovr.mirror"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mirror",
- type = "Texture",
- description = "The mirror texture."
- }
- }
- }
- }
- },
- {
- name = "getName",
- tag = "headset",
- summary = "Get the name of the connected headset display.",
- description = "Returns the name of the headset as a string. The exact string that is returned depends on the hardware and VR SDK that is currently in use.",
- key = "lovr.headset.getName",
- module = "lovr.headset",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "name",
- type = "string",
- description = "The name of the headset as a string."
- }
- }
- }
- }
- },
- {
- name = "getOrientation",
- tag = "input",
- summary = "Get the orientation of a device.",
- description = "Returns the current orientation of a device, in angle/axis form.",
- key = "lovr.headset.getOrientation",
- module = "lovr.headset",
- related = {
- "lovr.headset.getPosition",
- "lovr.headset.getVelocity",
- "lovr.headset.getAngularVelocity",
- "lovr.headset.getAcceleration",
- "lovr.headset.getAngularAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the orientation of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The amount of rotation around the axis of rotation, in radians."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- }
- },
- {
- name = "getOriginType",
- tag = "headset",
- summary = "Get the type of tracking origin of the headset.",
- description = "Returns the type of origin used for the tracking volume. The different types of origins are explained on the `HeadsetOrigin` page.",
- key = "lovr.headset.getOriginType",
- module = "lovr.headset",
- related = {
- "HeadsetOrigin"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "origin",
- type = "HeadsetOrigin",
- description = "The type of origin."
- }
- }
- }
- }
- },
- {
- name = "getPose",
- tag = "input",
- summary = "Get the pose of a device.",
- description = "Returns the current position and orientation of a device.",
- key = "lovr.headset.getPose",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the pose of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position."
- },
- {
- name = "y",
- type = "number",
- description = "The y position."
- },
- {
- name = "z",
- type = "number",
- description = "The z position."
- },
- {
- name = "angle",
- type = "number",
- description = "The amount of rotation around the axis of rotation, in radians."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- },
- related = {
- "lovr.headset.getBonePose",
- "lovr.headset.getPosition",
- "lovr.headset.getOrientation"
- },
- notes = "Units are in meters."
- },
- {
- name = "getPosition",
- tag = "input",
- summary = "Get the position of a device.",
- description = "Returns the current position of a device, in meters, relative to the play area.",
- key = "lovr.headset.getPosition",
- module = "lovr.headset",
- related = {
- "lovr.headset.getOrientation",
- "lovr.headset.getVelocity",
- "lovr.headset.getAngularVelocity",
- "lovr.headset.getAcceleration",
- "lovr.headset.getAngularAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the position of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the device."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the device."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the device."
- }
- }
- }
- }
- },
- {
- name = "getVelocity",
- tag = "input",
- summary = "Get the linear velocity of a device.",
- description = "Returns the current linear velocity of a device, in meters per second.",
- key = "lovr.headset.getVelocity",
- module = "lovr.headset",
- related = {
- "lovr.headset.getPosition",
- "lovr.headset.getOrientation",
- "lovr.headset.getAngularVelocity",
- "lovr.headset.getAcceleration",
- "lovr.headset.getAngularAcceleration"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get the velocity of.",
- default = "head"
- }
- },
- returns = {
- {
- name = "vx",
- type = "number",
- description = "The x component of the linear velocity."
- },
- {
- name = "vy",
- type = "number",
- description = "The y component of the linear velocity."
- },
- {
- name = "vz",
- type = "number",
- description = "The z component of the linear velocity."
- }
- }
- }
- }
- },
- {
- name = "isDown",
- tag = "input",
- summary = "Get the state of a button on a device.",
- description = "Returns whether a button on a device is pressed.",
- key = "lovr.headset.isDown",
- module = "lovr.headset",
- related = {
- "DeviceButton",
- "lovr.headset.isTouched",
- "lovr.headset.getAxis"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device."
- },
- {
- name = "button",
- type = "DeviceButton",
- description = "The button."
- }
- },
- returns = {
- {
- name = "down",
- type = "boolean",
- description = "Whether the button on the device is currently pressed, or `nil` if the device does not have the specified button."
- }
- }
- }
- }
- },
- {
- name = "isTouched",
- tag = "input",
- summary = "Check if a button on a device is touched.",
- description = "Returns whether a button on a device is currently touched.",
- key = "lovr.headset.isTouched",
- module = "lovr.headset",
- related = {
- "DeviceButton",
- "lovr.headset.isDown",
- "lovr.headset.getAxis"
- },
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device."
- },
- {
- name = "button",
- type = "DeviceButton",
- description = "The button."
- }
- },
- returns = {
- {
- name = "touched",
- type = "boolean",
- description = "Whether the button on the device is currently touched, or `nil` if the device does not have the button or it isn't touch-sensitive."
- }
- }
- }
- }
- },
- {
- name = "newModel",
- tag = "input",
- summary = "Get a Model for a device.",
- description = "Returns a new Model for the specified device.",
- key = "lovr.headset.newModel",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to get a model for.",
- default = "head"
- }
- },
- returns = {
- {
- name = "model",
- type = "Model",
- description = "The new Model, or `nil` if a model could not be loaded."
- }
- }
- }
- },
- examples = {
- {
- code = "local models = {}\n\nfunction lovr.draw()\n for hand in lovr.headset.hands() do\n models[hand] = models[hand] or lovr.headset.newModel(hand)\n\n if models[hand] then\n local x, y, z, angle, ax, ay, az = lovr.headset.getPose(hand)\n models[hand]:draw(x, y, z, 1, angle, ax, ay, az)\n end\n end\nend"
- }
- }
- },
- {
- name = "renderTo",
- tag = "headset",
- summary = "Render to the headset using a function.",
- description = "Renders to each eye of the headset using a function.\n\nThis function takes care of setting the appropriate graphics transformations to ensure that the scene is rendered as though it is being viewed through each eye of the player. It also takes care of setting the correct projection for the headset lenses.\n\nIf the headset module is enabled, this function is called automatically by `lovr.run` with `lovr.draw` as the callback.",
- key = "lovr.headset.renderTo",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "callback",
- type = "function",
- description = "The function used to render. Any functions called will render to the headset instead of to the window.",
- arguments = {},
- returns = {}
- }
- },
- returns = {}
- }
- },
- notes = "On the `web` and `android` platforms (see `lovr.getOS`), headset rendering is asynchronous and the callback passed to `lovr.headset.renderTo` will not be called immediately. This is due to certain restrictions inherent to these platforms."
- },
- {
- name = "setClipDistance",
- tag = "headset",
- summary = "Set the near and far clipping planes of the headset.",
- description = "Sets the near and far clipping planes used to render to the headset. Objects closer than the near clipping plane or further than the far clipping plane will be clipped out of view.",
- key = "lovr.headset.setClipDistance",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "near",
- type = "number",
- description = "The distance to the near clipping plane, in meters."
- },
- {
- name = "far",
- type = "number",
- description = "The distance to the far clipping plane, in meters."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "vibrate",
- tag = "input",
- summary = "Make a device go BZZZ!",
- description = "Causes the device to vibrate with a custom strength, duration, and frequency, if possible.",
- key = "lovr.headset.vibrate",
- module = "lovr.headset",
- variants = {
- {
- arguments = {
- {
- name = "device",
- type = "Device",
- description = "The device to vibrate.",
- default = "head"
- },
- {
- name = "strength",
- type = "number",
- description = "The strength of the vibration (amplitude), between 0 and 1.",
- default = "1"
- },
- {
- name = "duration",
- type = "number",
- description = "The duration of the vibration, in seconds.",
- default = ".5"
- },
- {
- name = "frequency",
- type = "number",
- description = "The frequency of the vibration, in hertz. 0 will use a default frequency.",
- default = "0"
- }
- },
- returns = {
- {
- name = "vibrated",
- type = "boolean",
- description = "Whether the device supports haptics and the vibration was successfully triggered."
- }
- }
- }
- },
- notes = "When using OpenVR, the value for the `duration` currently must be less than .004 seconds. Call this function several frames in a row for stronger or prolonged vibration patterns."
- }
- },
- objects = {}
- },
- {
- name = "math",
- tag = "modules",
- summary = "Contains useful math helpers.",
- description = "The `lovr.math` module provides math helpers commonly used for 3D applications.",
- key = "lovr.math",
- functions = {
- {
- name = "gammaToLinear",
- summary = "\9Convert a color from gamma space to linear space.",
- description = "Converts a color from gamma space to linear space.",
- key = "lovr.math.gammaToLinear",
- module = "lovr.math",
- related = {
- "lovr.math.linearToGamma",
- "lovr.graphics.isGammaCorrect"
- },
- variants = {
- {
- arguments = {
- {
- name = "gr",
- type = "number",
- description = "The red component of the gamma-space color."
- },
- {
- name = "gg",
- type = "number",
- description = "The green component of the gamma-space color."
- },
- {
- name = "gb",
- type = "number",
- description = "The blue component of the gamma-space color."
- }
- },
- returns = {
- {
- name = "lr",
- type = "number",
- description = "The red component of the resulting linear-space color."
- },
- {
- name = "lg",
- type = "number",
- description = "The green component of the resulting linear-space color."
- },
- {
- name = "lb",
- type = "number",
- description = "The blue component of the resulting linear-space color."
- }
- }
- },
- {
- description = "A table can also be used.",
- arguments = {
- {
- name = "color",
- type = "table",
- description = "A table containing the components of a gamma-space color."
- }
- },
- returns = {
- {
- name = "lr",
- type = "number",
- description = "The red component of the resulting linear-space color."
- },
- {
- name = "lg",
- type = "number",
- description = "The green component of the resulting linear-space color."
- },
- {
- name = "lb",
- type = "number",
- description = "The blue component of the resulting linear-space color."
- }
- }
- },
- {
- description = "Convert a single color channel.",
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The color channel to convert."
- }
- },
- returns = {
- {
- name = "y",
- type = "number",
- description = "The converted color channel."
- }
- }
- }
- }
- },
- {
- name = "getRandomSeed",
- summary = "Get the random seed.",
- description = "Get the seed used to initialize the random generator.",
- key = "lovr.math.getRandomSeed",
- module = "lovr.math",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "seed",
- type = "number",
- description = "The new seed."
- }
- }
- }
- }
- },
- {
- name = "linearToGamma",
- summary = "\9Convert a color from linear space to gamma space.",
- description = "Converts a color from linear space to gamma space.",
- key = "lovr.math.linearToGamma",
- module = "lovr.math",
- related = {
- "lovr.math.gammaToLinear",
- "lovr.graphics.isGammaCorrect"
- },
- variants = {
- {
- arguments = {
- {
- name = "lr",
- type = "number",
- description = "The red component of the linear-space color."
- },
- {
- name = "lg",
- type = "number",
- description = "The green component of the linear-space color."
- },
- {
- name = "lb",
- type = "number",
- description = "The blue component of the linear-space color."
- }
- },
- returns = {
- {
- name = "gr",
- type = "number",
- description = "The red component of the resulting gamma-space color."
- },
- {
- name = "gg",
- type = "number",
- description = "The green component of the resulting gamma-space color."
- },
- {
- name = "gb",
- type = "number",
- description = "The blue component of the resulting gamma-space color."
- }
- }
- },
- {
- description = "A table can also be used.",
- arguments = {
- {
- name = "color",
- type = "table",
- description = "A table containing the components of a linear-space color."
- }
- },
- returns = {
- {
- name = "gr",
- type = "number",
- description = "The red component of the resulting gamma-space color."
- },
- {
- name = "gg",
- type = "number",
- description = "The green component of the resulting gamma-space color."
- },
- {
- name = "gb",
- type = "number",
- description = "The blue component of the resulting gamma-space color."
- }
- }
- },
- {
- description = "Convert a single color channel.",
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The color channel to convert."
- }
- },
- returns = {
- {
- name = "y",
- type = "number",
- description = "The converted color channel."
- }
- }
- }
- }
- },
- {
- name = "lookAt",
- summary = "Compute an angle/axis rotation from a vector.",
- description = "Returns the angle/axis orientation to use to get an object to look at a point.",
- key = "lovr.math.lookAt",
- module = "lovr.math",
- notes = "With the default up vector, strange things will happen when trying to look in directions that line up with the up vector, similar to how the cameras in a first person shooter work. Sometimes this is alright, but other times you may want to keep track of the up vector of the camera as it rotates and pass that in as the up vector to avoid issues.",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x position of the object."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the object."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the object."
- },
- {
- name = "tx",
- type = "number",
- description = "The x position of the target to look at."
- },
- {
- name = "ty",
- type = "number",
- description = "The y position of the target to look at."
- },
- {
- name = "tz",
- type = "number",
- description = "The z position of the target to look at."
- },
- {
- name = "ux",
- type = "number",
- description = "The x component of the global up vector.",
- default = "0"
- },
- {
- name = "uy",
- type = "number",
- description = "The y component of the global up vector.",
- default = "1"
- },
- {
- name = "uz",
- type = "number",
- description = "The z component of the global up vector.",
- default = "0"
- }
- },
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians to rotate around the axis of rotation."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- },
- examples = {
- {
- description = "Rotate a texture so it always faces the headset.",
- code = "function lovr.load()\n eye = lovr.graphics.newTexture('texture.png')\nend\n\nfunction lovr.draw()\n local x, y, z = 0, 2, -2\n local angle, ax, ay, az = lovr.math.lookAt(x, y, z, lovr.headset.getPosition())\n lovr.graphics.plane(eye, x, y, z, 1, angle, ax, ay, az)\nend"
- }
- }
- },
- {
- name = "mat4",
- summary = "Create a new mat4.",
- description = "Creates a new `mat4`.\n\nNote that this function is also a table containing the `__index` key of the mat4 metatable. This means that you can add your own functions onto the `lovr.math.mat4` table to extend the built-in functionality.",
- key = "lovr.math.mat4",
- module = "lovr.math",
- related = {
- "lovr.math.vec3",
- "lovr.math.quat"
- },
- variants = {
- {
- description = "Sets the matrix to the identity matrix.",
- arguments = {},
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The new matrix."
- }
- }
- },
- {
- description = "Copies values from an existing matrix.",
- arguments = {
- {
- name = "n",
- type = "mat4",
- description = "An existing matrix to copy the values from."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The new matrix."
- }
- }
- },
- {
- arguments = {
- {
- name = "position",
- type = "vec3",
- description = "The translation of the matrix.",
- default = "0, 0, 0"
- },
- {
- name = "scale",
- type = "vec3",
- description = "The scale of the matrix.",
- default = "1, 1, 1"
- },
- {
- name = "rotation",
- type = "quat",
- description = "The rotation of the matrix.",
- default = "0, 0, 0, 0"
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The new matrix."
- }
- }
- },
- {
- arguments = {
- {
- name = "...",
- type = "number",
- description = "16 numbers to use as the raw values of the matrix (column-major)."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The new matrix."
- }
- }
- }
- },
- notes = "This function takes the same arguments as `mat4:set`."
- },
- {
- name = "newCurve",
- summary = "Create a new Curve.",
- description = "Creates a new `Curve` from a list of control points.",
- key = "lovr.math.newCurve",
- module = "lovr.math",
- variants = {
- {
- description = "Create a Curve from a set of initial control points.",
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the first control point."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the first control point."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the first control point."
- },
- {
- name = "...",
- type = "*",
- description = "Additional control points."
- }
- },
- returns = {
- {
- name = "curve",
- type = "Curve",
- description = "The new Curve."
- }
- }
- },
- {
- description = "Create a Curve from a (flat) table of points.",
- arguments = {
- {
- name = "points",
- type = "table",
- description = "A table of points, as above."
- }
- },
- returns = {
- {
- name = "curve",
- type = "Curve",
- description = "The new Curve."
- }
- }
- },
- {
- description = "Create an empty Curve, reserving space ahead of time for a certain number of control points.",
- arguments = {
- {
- name = "n",
- type = "number",
- description = "The number of points to reserve for the Curve."
- }
- },
- returns = {
- {
- name = "curve",
- type = "Curve",
- description = "The new Curve."
- }
- }
- }
- }
- },
- {
- name = "newRandomGenerator",
- summary = "Create a new RandomGenerator.",
- description = "Creates a new `RandomGenerator`, which can be used to generate random numbers. If you just want some random numbers, you can use `lovr.math.random`. Individual RandomGenerator objects are useful if you need more control over the random sequence used or need a random generator isolated from other instances.",
- key = "lovr.math.newRandomGenerator",
- module = "lovr.math",
- variants = {
- {
- description = "Create a RandomGenerator with a default seed.",
- arguments = {},
- returns = {
- {
- name = "randomGenerator",
- type = "RandomGenerator",
- description = "The new RandomGenerator."
- }
- }
- },
- {
- arguments = {
- {
- name = "seed",
- type = "number",
- description = "The initial seed for the RandomGenerator."
- }
- },
- returns = {
- {
- name = "randomGenerator",
- type = "RandomGenerator",
- description = "The new RandomGenerator."
- }
- }
- },
- {
- description = "This variant allows creation of random generators with precise 64-bit seed values, since Lua's number format loses precision with really big numbers.",
- arguments = {
- {
- name = "low",
- type = "number",
- description = "The lower 32 bits of the seed."
- },
- {
- name = "high",
- type = "number",
- description = "The upper 32 bits of the seed."
- }
- },
- returns = {
- {
- name = "randomGenerator",
- type = "RandomGenerator",
- description = "The new RandomGenerator."
- }
- }
- }
- }
- },
- {
- name = "noise",
- summary = "Generate perlin noise.",
- description = "Returns a 1D, 2D, 3D, or 4D perlin noise value. The number will be between 0 and 1, and it will always be 0.5 when the inputs are integers.",
- key = "lovr.math.noise",
- module = "lovr.math",
- related = {
- "lovr.math.random"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the input."
- }
- },
- returns = {
- {
- name = "noise",
- type = "number",
- description = "The noise value, between 0 and 1."
- }
- }
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the input."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the input."
- }
- },
- returns = {
- {
- name = "noise",
- type = "number",
- description = "The noise value, between 0 and 1."
- }
- }
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the input."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the input."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the input."
- }
- },
- returns = {
- {
- name = "noise",
- type = "number",
- description = "The noise value, between 0 and 1."
- }
- }
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the input."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the input."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the input."
- },
- {
- name = "w",
- type = "number",
- description = "The w coordinate of the input."
- }
- },
- returns = {
- {
- name = "noise",
- type = "number",
- description = "The noise value, between 0 and 1."
- }
- }
- }
- }
- },
- {
- name = "orientationToDirection",
- summary = "Convert an angle/axis orientation to a direction vector.",
- description = "Converts a rotation in angle/axis representation into a direction vector.",
- key = "lovr.math.orientationToDirection",
- module = "lovr.math",
- related = {
- "lovr.math.lookAt"
- },
- examples = {
- {
- description = "Give Controllers laser beams.",
- code = "function lovr.draw()\n for i, controller in ipairs(lovr.headset.getControllers()) do\n local x, y, z = controller:getPosition()\n local angle, ax, ay, az = controller:getOrientation()\n local dx, dy, dz = lovr.math.orientationToDirection(angle, ax, ay, az)\n local length = 2\n lovr.graphics.line(x, y, z, x + dx * length, y + dy * length, z + dz * length)\n end\nend"
- }
- },
- variants = {
- {
- arguments = {
- {
- name = "angle",
- type = "number",
- description = "The angle (in radians)."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "1"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x component of the direction vector."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the direction vector."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the direction vector."
- }
- }
- }
- }
- },
- {
- name = "quat",
- summary = "Create a new quat.",
- description = "Creates a new `quat`. Have a look at `quat:set` for more information about how all these variants can be used.\n\nNote that this function is also a table containing the `__index` key of the quat metatable. This means that you can add your own functions onto the `lovr.math.quat` table to extend the built-in functionality.",
- key = "lovr.math.quat",
- module = "lovr.math",
- related = {
- "lovr.math.vec3",
- "lovr.math.mat4"
- },
- variants = {
- {
- arguments = {
- {
- name = "angle",
- description = "The angle to use for the rotation, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "0"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- },
- {
- name = "raw",
- type = "boolean",
- description = "Whether the components should be interpreted as raw `(x, y, z, w)` components.",
- default = "false"
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "angle",
- description = "The angle to use for the rotation, in radians.",
- default = "0"
- },
- {
- name = "axis",
- type = "vec3",
- description = "The axis of rotation (does not need to be normalized)."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "r",
- type = "quat",
- description = "An existing quaternion to copy the values from."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- },
- {
- description = "Sets the values from a direction vector.",
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "A normalized direction vector."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- },
- {
- description = "Sets the values to represent the rotation between two vectors.",
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "A normalized direction vector."
- },
- {
- name = "u",
- type = "vec3",
- description = "Another normalized direction vector."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "m",
- type = "mat4",
- description = "A matrix to use the rotation from."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The new quaternion."
- }
- }
- }
- },
- notes = "This function takes the same arguments as `quat:set`."
- },
- {
- name = "random",
- summary = "Get a random number.",
- description = "Returns a uniformly distributed pseudo-random number. This function has improved randomness over Lua's `math.random` and also guarantees that the sequence of random numbers will be the same on all platforms (given the same seed).",
- key = "lovr.math.random",
- module = "lovr.math",
- related = {
- "lovr.math.randomNormal",
- "RandomGenerator",
- "lovr.math.noise"
- },
- variants = {
- {
- description = "Generate a pseudo-random floating point number in the range `[0,1)`",
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- },
- {
- description = "Generate a pseudo-random integer in the range `[1,high]`",
- arguments = {
- {
- name = "high",
- type = "number",
- description = "The maximum number to generate."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- },
- {
- description = "Generate a pseudo-random integer in the range `[low,high]`",
- arguments = {
- {
- name = "low",
- type = "number",
- description = "The minimum number to generate."
- },
- {
- name = "high",
- type = "number",
- description = "The maximum number to generate."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- }
- },
- notes = "You can set the random seed using `lovr.math.setRandomSeed`."
- },
- {
- name = "randomNormal",
- summary = "Get a random number from a normal distribution.",
- description = "Returns a pseudo-random number from a normal distribution (a bell curve). You can control the center of the bell curve (the mean value) and the overall width (sigma, or standard deviation).",
- key = "lovr.math.randomNormal",
- module = "lovr.math",
- related = {
- "lovr.math.random",
- "RandomGenerator"
- },
- variants = {
- {
- arguments = {
- {
- name = "sigma",
- type = "number",
- description = "The standard deviation of the distribution. This can be thought of how \"wide\" the range of numbers is or how much variability there is.",
- default = "1"
- },
- {
- name = "mu",
- type = "number",
- description = "The average value returned.",
- default = "0"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A normally distributed pseudo-random number."
- }
- }
- }
- }
- },
- {
- name = "setRandomSeed",
- summary = "Set the random seed.",
- description = "Seed the random generator with a new seed. Each seed will cause `lovr.math.random` and `lovr.math.randomNormal` to produce a unique sequence of random numbers. This is done once automatically at startup by `lovr.run`.",
- key = "lovr.math.setRandomSeed",
- module = "lovr.math",
- variants = {
- {
- arguments = {
- {
- name = "seed",
- type = "number",
- description = "The new seed."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "vec3",
- summary = "Create a new vec3.",
- description = "Creates a new `vec3`.\n\nNote that this function is also a table containing the `__index` key of the vec3 metatable. This means that you can add your own functions onto the `lovr.math.vec3` table to extend the built-in functionality.",
- key = "lovr.math.vec3",
- module = "lovr.math",
- related = {
- "lovr.math.quat",
- "lovr.math.mat4"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x value of the vector.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y value of the vector.",
- default = "x"
- },
- {
- name = "z",
- type = "number",
- description = "The z value of the vector.",
- default = "x"
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The new vector."
- }
- }
- },
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to copy the values from."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The new vector."
- }
- }
- }
- },
- notes = "This function takes the same arguments as `vec3:set`."
- }
- },
- enums = {},
- objects = {
- {
- name = "Curve",
- summary = "A Bézier curve.",
- description = "A Curve is an object that represents a Bézier curve in three dimensions. Curves are defined by an arbitrary number of control points (note that the curve only passes through the first and last control point).\n\nOnce a Curve is created with `lovr.math.newCurve`, you can use `Curve:evaluate` to get a point on the curve or `Curve:render` to get a list of all of the points on the curve. These points can be passed directly to `lovr.graphics.points` or `lovr.graphics.line` to render the curve.\n\nNote that for longer or more complicated curves (like in a drawing application) it can be easier to store the path as several Curve objects.",
- key = "Curve",
- module = "lovr.math",
- methods = {
- {
- name = "addPoint",
- summary = "Add a new control point to the Curve.",
- description = "Inserts a new control point into the Curve at the specified index.",
- key = "Curve:addPoint",
- module = "lovr.math",
- related = {
- "Curve:getPointCount",
- "Curve:getPoint",
- "Curve:setPoint",
- "Curve:removePoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the control point."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the control point."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the control point."
- },
- {
- name = "index",
- type = "number",
- description = "The index to insert the control point at. If nil, the control point is added to the end of the list of control points.",
- default = "nil"
- }
- },
- returns = {}
- }
- },
- notes = "An error will be thrown if the index is less than one or more than the number of control points."
- },
- {
- name = "evaluate",
- summary = "Turn a number from 0 to 1 into a point on the Curve.",
- description = "Returns a point on the Curve given a parameter `t` from 0 to 1. 0 will return the first control point, 1 will return the last point, .5 will return a point in the \"middle\" of the Curve, etc.",
- key = "Curve:evaluate",
- module = "lovr.math",
- related = {
- "Curve:getTangent",
- "Curve:render",
- "Curve:slice"
- },
- variants = {
- {
- arguments = {
- {
- name = "t",
- type = "number",
- description = "The parameter to evaluate the Curve at."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the point."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the point."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the point."
- }
- }
- }
- },
- notes = "An error will be thrown if `t` is not between 0 and 1, or if the Curve has less than two points."
- },
- {
- name = "getPoint",
- summary = "Get a control point of the Curve.",
- description = "Returns a control point of the Curve.",
- key = "Curve:getPoint",
- module = "lovr.math",
- related = {
- "Curve:getPointCount",
- "Curve:setPoint",
- "Curve:addPoint",
- "Curve:removePoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index to retrieve."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the control point."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the control point."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the control point."
- }
- }
- }
- },
- notes = "An error will be thrown if the index is less than one or more than the number of control points."
- },
- {
- name = "getPointCount",
- summary = "Get the number of control points in the Curve.",
- description = "Returns the number of control points in the Curve.",
- key = "Curve:getPointCount",
- module = "lovr.math",
- related = {
- "Curve:getPoint",
- "Curve:setPoint",
- "Curve:addPoint",
- "Curve:removePoint"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "count",
- type = "number",
- description = "The number of control points."
- }
- }
- }
- }
- },
- {
- name = "getTangent",
- summary = "Get the direction of the Curve at a point.",
- description = "Returns a direction vector for the Curve given a parameter `t` from 0 to 1. 0 will return the direction at the first control point, 1 will return the direction at the last point, .5 will return the direction at the \"middle\" of the Curve, etc.",
- key = "Curve:getTangent",
- module = "lovr.math",
- related = {
- "Curve:evaluate",
- "Curve:render",
- "Curve:slice"
- },
- variants = {
- {
- arguments = {
- {
- name = "t",
- type = "number",
- description = "Where on the Curve to compute the direction."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the point."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the point."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the point."
- }
- }
- }
- },
- notes = "The direction vector returned by this function will have a length of one."
- },
- {
- name = "removePoint",
- summary = "Remove a control point from the Curve.",
- description = "Removes a control point from the Curve.",
- key = "Curve:removePoint",
- module = "lovr.math",
- related = {
- "Curve:getPointCount",
- "Curve:getPoint",
- "Curve:setPoint",
- "Curve:addPoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index of the control point to remove."
- }
- },
- returns = {}
- }
- },
- notes = "An error will be thrown if the index is less than one or more than the number of control points."
- },
- {
- name = "render",
- summary = "Get a list of points on the Curve.",
- description = "Returns a list of points on the Curve. The number of points can be specified to get a more or less detailed representation, and it is also possible to render a subsection of the Curve.",
- key = "Curve:render",
- module = "lovr.math",
- related = {
- "Curve:evaluate",
- "Curve:slice",
- "lovr.graphics.points",
- "lovr.graphics.line"
- },
- variants = {
- {
- arguments = {
- {
- name = "n",
- type = "number",
- description = "The number of points to use.",
- default = "32"
- },
- {
- name = "t1",
- type = "number",
- description = "How far along the curve to start rendering.",
- default = "0"
- },
- {
- name = "t2",
- type = "number",
- description = "How far along the curve to stop rendering.",
- default = "1"
- }
- },
- returns = {
- {
- name = "t",
- type = "table",
- description = "A (flat) table of 3D points along the curve."
- }
- }
- }
- }
- },
- {
- name = "setPoint",
- summary = "Set a control point of the Curve.",
- description = "Changes the position of a control point on the Curve.",
- key = "Curve:setPoint",
- module = "lovr.math",
- related = {
- "Curve:getPointCount",
- "Curve:getPoint",
- "Curve:addPoint",
- "Curve:removePoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "index",
- type = "number",
- description = "The index to modify."
- },
- {
- name = "x",
- type = "number",
- description = "The new x coordinate."
- },
- {
- name = "y",
- type = "number",
- description = "The new y coordinate."
- },
- {
- name = "z",
- type = "number",
- description = "The new z coordinate."
- }
- },
- returns = {}
- }
- },
- notes = "An error will be thrown if the index is less than one or more than the number of control points."
- },
- {
- name = "slice",
- summary = "Get a new Curve from a slice of an existing one.",
- description = "Returns a new Curve created by slicing the Curve at the specified start and end points.",
- key = "Curve:slice",
- module = "lovr.math",
- related = {
- "Curve:evaluate",
- "Curve:render"
- },
- variants = {
- {
- arguments = {
- {
- name = "t1",
- type = "number",
- description = "The starting point to slice at."
- },
- {
- name = "t2",
- type = "number",
- description = "The ending point to slice at."
- }
- },
- returns = {
- {
- name = "curve",
- type = "Curve",
- description = "A new Curve."
- }
- }
- }
- },
- notes = "The new Curve will have the same number of control points as the existing curve.\n\nAn error will be thrown if t1 or t2 are not between 0 and 1, or if the Curve has less than two points."
- }
- },
- constructors = {
- "lovr.math.newCurve",
- "Curve:slice"
- }
- },
- {
- name = "RandomGenerator",
- summary = "A pseudo-random number generator.",
- description = "A RandomGenerator is a standalone object that can be used to independently generate pseudo-random numbers. If you just need basic randomness, you can use `lovr.math.random` without needing to create a random generator.",
- key = "RandomGenerator",
- module = "lovr.math",
- methods = {
- {
- name = "getSeed",
- summary = "Get the seed value of the RandomGenerator.",
- description = "Returns the seed used to initialize the RandomGenerator.",
- key = "RandomGenerator:getSeed",
- module = "lovr.math",
- related = {
- "lovr.math.newRandomGenerator"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "low",
- type = "number",
- description = "The lower 32 bits of the seed."
- },
- {
- name = "high",
- type = "number",
- description = "The upper 32 bits of the seed."
- }
- }
- }
- },
- notes = "Since the seed is a 64 bit integer, each 32 bits of the seed are returned separately to avoid precision issues."
- },
- {
- name = "getState",
- summary = "Get the current state of the RandomGenerator.",
- description = "Returns the current state of the RandomGenerator. This can be used with `RandomGenerator:setState` to reliably restore a previous state of the generator.",
- key = "RandomGenerator:getState",
- module = "lovr.math",
- notes = "The seed represents the starting state of the RandomGenerator, whereas the state represents the current state of the generator.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "state",
- type = "string",
- description = "The serialized state."
- }
- }
- }
- }
- },
- {
- name = "random",
- summary = "Get a random number.",
- description = "Returns the next uniformly distributed pseudo-random number from the RandomGenerator's sequence.",
- key = "RandomGenerator:random",
- module = "lovr.math",
- related = {
- "lovr.math.random",
- "RandomGenerator:randomNormal"
- },
- variants = {
- {
- description = "Generate a pseudo-random floating point number in the range `[0,1)`",
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- },
- {
- description = "Generate a pseudo-random integer in the range `[1,high]`",
- arguments = {
- {
- name = "high",
- type = "number",
- description = "The maximum number to generate."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- },
- {
- description = "Generate a pseudo-random integer in the range `[low,high]`",
- arguments = {
- {
- name = "low",
- type = "number",
- description = "The minimum number to generate."
- },
- {
- name = "high",
- type = "number",
- description = "The maximum number to generate."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A pseudo-random number."
- }
- }
- }
- }
- },
- {
- name = "randomNormal",
- summary = "Get a random number from a normal distribution.",
- description = "Returns a pseudo-random number from a normal distribution (a bell curve). You can control the center of the bell curve (the mean value) and the overall width (sigma, or standard deviation).",
- key = "RandomGenerator:randomNormal",
- module = "lovr.math",
- related = {
- "lovr.math.randomNormal",
- "RandomGenerator:random"
- },
- variants = {
- {
- arguments = {
- {
- name = "sigma",
- type = "number",
- description = "The standard deviation of the distribution. This can be thought of how \"wide\" the range of numbers is or how much variability there is.",
- default = "1"
- },
- {
- name = "mu",
- type = "number",
- description = "The average value returned.",
- default = "0"
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "A normally distributed pseudo-random number."
- }
- }
- }
- }
- },
- {
- name = "setSeed",
- summary = "Reinitialize the RandomGenerator with a new seed.",
- description = "Seed the RandomGenerator with a new seed. Each seed will cause the RandomGenerator to produce a unique sequence of random numbers.",
- key = "RandomGenerator:setSeed",
- module = "lovr.math",
- notes = "For precise 64 bit seeds, you should specify the lower and upper 32 bits of the seed separately. Otherwise, seeds larger than 2^53 will start to lose precision.",
- variants = {
- {
- arguments = {
- low = {
- type = "number",
- description = "The lower 32 bits of the seed."
- },
- seed = {
- type = "number",
- description = "The random seed."
- },
- high = {
- type = "number",
- description = "The upper 32 bits of the seed."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setState",
- summary = "Set the state of the RandomGenerator.",
- description = "Sets the state of the RandomGenerator, as previously obtained using `RandomGenerator:getState`. This can be used to reliably restore a previous state of the generator.",
- key = "RandomGenerator:setState",
- module = "lovr.math",
- notes = "The seed represents the starting state of the RandomGenerator, whereas the state represents the current state of the generator.",
- variants = {
- {
- arguments = {
- {
- name = "state",
- type = "string",
- description = "The serialized state."
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.math.newRandomGenerator"
- }
- },
- {
- name = "mat4",
- summary = "A 4x4 matrix.",
- description = "A `mat4` is a math type that holds 16 values in a 4x4 grid. They are very useful for representing and manipulating transforms in 3D space. LÖVR functions that accept 3D transforms can take a single `mat4` instead of 10 numbers or an assortment of `vec3`s and `quat`s, which is more concise and improves performance slightly. `mat4`s are created using `lovr.math.mat4`.\n\nExplaining the math behind `mat4`s and transforms is outside the scope of these docs, but there are some fairly straightforward functions that can be used to move, rotate, and scale the transform represented by the matrix:\n\n- `mat4:translate`\n- `mat4:rotate`\n- `mat4:scale`\n\nThe \"default\" matrix is called the identity matrix and `mat4:identity` can be used to reset any matrix to the default state.\n\nMatrices can be multiplied together using the normal `*` operator, which combines both of their transformations into a single matrix. This is really useful for condensing a set of simple transforms into a more complex one, or creating parent-child relationships between objects. Note that the multiplication returns a new matrix.\n\nCreating huge numbers of matrices every frame can lead to performance problems due to the sheer amount of memory allocation and garbage collection overhead. If you need lots of matrix objects you can use `Pool`s to make things much more efficient.",
- key = "mat4",
- module = "lovr.math",
- methods = {
- {
- name = "__mul",
- summary = "Multiply a matrix with another matrix or a vector.",
- description = "Multiplies this matrix by another value. Multiplying by a matrix combines their two transforms together. Multiplying by a vector applies the transformation from the matrix to the vector and returns the vector.",
- key = "mat4:__mul",
- module = "lovr.math",
- related = {
- "mat4:mul",
- "mat4:translate",
- "mat4:rotate",
- "mat4:scale"
- },
- variants = {
- {
- arguments = {
- {
- name = "m",
- type = "mat4",
- description = "The matrix."
- },
- {
- name = "n",
- type = "mat4",
- description = "Another matrix."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "A new matrix containing the multiplied result."
- }
- }
- },
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The vector."
- }
- },
- returns = {
- {
- name = "u",
- type = "vec3",
- description = "A new transformed vector."
- }
- }
- }
- }
- },
- {
- name = "identity",
- summary = "Reset the matrix to the identity.",
- description = "Resets the matrix to the identity, effectively setting its translation to zero, its scale to 1, and clearing any rotation.",
- key = "mat4:identity",
- module = "lovr.math",
- related = {
- "lovr.graphics.origin"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "invert",
- summary = "Invert the matrix.",
- description = "Inverts the matrix, causing it to represent the opposite of its old transform.",
- key = "mat4:invert",
- module = "lovr.math",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "mul",
- summary = "Multiply a matrix with another matrix or a vector.",
- description = "Multiplies this matrix by another value. Multiplying by a matrix combines their two transforms together. Multiplying by a vector applies the transformation from the matrix to the vector and returns the vector.",
- key = "mat4:mul",
- module = "lovr.math",
- related = {
- "mat4:__mul",
- "mat4:translate",
- "mat4:rotate",
- "mat4:scale"
- },
- variants = {
- {
- arguments = {
- {
- name = "n",
- type = "mat4",
- description = "The matrix."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix, containing the result."
- }
- }
- },
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The vector."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The transformed vector."
- }
- }
- }
- }
- },
- {
- name = "orthographic",
- summary = "Turn the matrix into an orthographic projection.",
- description = "Sets this matrix to represent an orthographic projection, useful for 2D/isometric rendering.\n\nThis can be used with `lovr.graphics.setProjection`, or it can be sent to a `Shader` for use in GLSL.",
- key = "mat4:orthographic",
- module = "lovr.math",
- related = {
- "mat4:perspective",
- "lovr.graphics.setProjection"
- },
- variants = {
- {
- arguments = {
- {
- name = "left",
- type = "number",
- description = "The left edge of the projection."
- },
- {
- name = "right",
- type = "number",
- description = "The right edge of the projection."
- },
- {
- name = "top",
- type = "number",
- description = "The top edge of the projection."
- },
- {
- name = "bottom",
- type = "number",
- description = "The bottom edge of the projection."
- },
- {
- name = "near",
- type = "number",
- description = "The position of the near clipping plane."
- },
- {
- name = "far",
- type = "number",
- description = "The position of the far clipping plane."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "perspective",
- summary = "Turn the matrix into a perspective projection.",
- description = "Sets this matrix to represent a perspective projection.\n\nThis can be used with `lovr.graphics.setProjection`, or it can be sent to a `Shader` for use in GLSL.",
- key = "mat4:perspective",
- module = "lovr.math",
- related = {
- "mat4:orthographic",
- "lovr.graphics.setProjection"
- },
- variants = {
- {
- arguments = {
- {
- name = "near",
- type = "number",
- description = "The near plane."
- },
- {
- name = "far",
- type = "number",
- description = "The far plane."
- },
- {
- name = "fov",
- type = "number",
- description = "The field of view (in radians)."
- },
- {
- name = "aspect",
- type = "number",
- description = "The vertical aspect ratio of the projection."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "rotate",
- summary = "Rotate the matrix.",
- description = "Rotates the matrix using a quaternion or an angle/axis rotation.",
- key = "mat4:rotate",
- module = "lovr.math",
- related = {
- "mat4:translate",
- "mat4:scale",
- "mat4:identity"
- },
- variants = {
- {
- arguments = {
- {
- name = "rotation",
- type = "quat",
- description = "The rotation to apply to the matrix."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "scale",
- summary = "Scale the matrix.",
- description = "Scales the matrix.",
- key = "mat4:scale",
- module = "lovr.math",
- related = {
- "mat4:translate",
- "mat4:rotate",
- "mat4:identity"
- },
- variants = {
- {
- arguments = {
- {
- name = "scale",
- type = "vec3",
- description = "The 3D scale to apply."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- },
- {
- arguments = {
- {
- name = "s",
- type = "number",
- description = "A uniform scale to apply."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "set",
- summary = "Set the components of the matrix.",
- description = "Sets the components of the matrix from separate position, rotation, and scale arguments or an existing matrix.",
- key = "mat4:set",
- module = "lovr.math",
- related = {
- "mat4:unpack"
- },
- variants = {
- {
- description = "Resets the matrix to the identity matrix.",
- arguments = {},
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- },
- {
- description = "Copies the values from an existing matrix.",
- arguments = {
- {
- name = "n",
- type = "mat4",
- description = "An existing matrix to copy the values from."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- },
- {
- arguments = {
- {
- name = "position",
- type = "vec3",
- description = "The translation of the matrix.",
- default = "0, 0, 0"
- },
- {
- name = "scale",
- type = "vec3",
- description = "The scale of the matrix.",
- default = "1, 1, 1"
- },
- {
- name = "rotation",
- type = "quat",
- description = "The rotation of the matrix.",
- default = "0, 0, 0, 0"
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- },
- {
- arguments = {
- {
- name = "...",
- type = "number",
- description = "16 numbers to use as the raw values of the matrix (column-major)."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "translate",
- summary = "Translate the matrix.",
- description = "Translates the matrix.",
- key = "mat4:translate",
- module = "lovr.math",
- related = {
- "mat4:rotate",
- "mat4:scale",
- "mat4:identity"
- },
- variants = {
- {
- arguments = {
- {
- name = "translation",
- type = "vec3",
- description = "The translation vector."
- }
- },
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "transpose",
- summary = "Transpose the matrix.",
- description = "Transposes the matrix, mirroring its values along the diagonal.",
- key = "mat4:transpose",
- module = "lovr.math",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "m",
- type = "mat4",
- description = "The original matrix."
- }
- }
- }
- }
- },
- {
- name = "unpack",
- summary = "Get the individual components of the matrix.",
- description = "Returns the components of matrix, either as 10 separated numbers representing the position, scale, and rotation, or as 16 raw numbers representing the individual components of the matrix in column-major order.",
- key = "mat4:unpack",
- module = "lovr.math",
- related = {
- "mat4:set"
- },
- variants = {
- {
- arguments = {
- {
- name = "raw",
- type = "boolean",
- description = "Whether to return the 16 raw components."
- }
- },
- returns = {
- {
- name = "...",
- type = "number",
- description = "The requested components of the matrix."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.math.mat4"
- },
- related = {
- "vec3",
- "quat"
- }
- },
- {
- name = "quat",
- summary = "A quaternion.",
- description = "A `quat` is a math type that represents a 3D rotation, stored as four numbers. LÖVR functions that take rotations also accept quaternions. `quat`s are created using `lovr.math.quat`.\n\nThe four numbers stored in a `quat`, normally called `x, y, z, w`, are not very intuitive to work with. Instead, rotations in most LÖVR APIs use the angle/axis representation, which is defined by a rotation angle in radians and an axis to rotate around. Accordingly, the quat functions for getting and setting elements, `quat:unpack` and `quat:set`, don't take the normal `x, y, z, w` elements but instead take four angle/axis values. If you need to access the raw components, you can pass in `true` as the last argument to signify that you want to work with raw components.\n\nTwo quaternions can be multiplied together to combine their rotations into a single new quaternion. The `quat:mul` function can be used to multiply two quaternions \"in place\", modifying the first quaternion. Alternatively, the `*` operator can be used to multiply them, which will create a new quaternion to store the result in.\n\nA quaternion can also be multiplied by a vector. This rotates the vector. Both `quat:mul` and the `*` operator can be used for this.\n\nA common source of bugs is to forget to normalize a quaternion. If you run into weird bugs with rotations, calling `quat:normalize` on your rotations may fix the issue!\n\nCreating huge numbers of quaternions every frame can lead to performance problems due to the sheer amount of memory allocation and garbage collection overhead. If you need lots of quaternion objects you can use `Pool`s to make things much more efficient.",
- key = "quat",
- module = "lovr.math",
- methods = {
- {
- name = "__len",
- summary = "Get the length of the quaternion.",
- description = "Returns the length of the quaternion.",
- key = "quat:__len",
- module = "lovr.math",
- related = {
- "quat:length",
- "quat:normalize"
- },
- variants = {
- {
- arguments = {
- {
- name = "q",
- type = "quat",
- description = "The quaternion."
- }
- },
- returns = {
- {
- name = "length",
- type = "number",
- description = "The length of the quaternion."
- }
- }
- }
- }
- },
- {
- name = "__mul",
- summary = "Multiply a quaternion by another quaternion or a vector.",
- description = "Multiplies this quaternion by another value. If the value is a quaternion, the rotations in the two quaternions are applied sequentially and a new quaternion is returned with the result. If the value is a vector, then a new rotated vector is returned.",
- key = "quat:__mul",
- module = "lovr.math",
- related = {
- "quat:mul"
- },
- variants = {
- {
- arguments = {
- {
- name = "q",
- type = "quat",
- description = "A quaternion."
- },
- {
- name = "r",
- type = "quat",
- description = "A quaternion to combine with the original."
- }
- },
- returns = {
- {
- name = "s",
- type = "quat",
- description = "The combined quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "q",
- type = "quat",
- description = "A quaternion."
- },
- {
- name = "v",
- type = "vec3",
- description = "A vector to rotate."
- }
- },
- returns = {
- {
- name = "u",
- type = "vec3",
- description = "The rotated vector."
- }
- }
- }
- }
- },
- {
- name = "mul",
- summary = "Multiply a quaternion by another quaternion or a vector.",
- description = "Multiplies this quaternion by another value. If the value is a quaternion, the rotations in the two quaternions are applied sequentially and the result is stored in the first quaternion. If the value is a vector, then the vector is rotated by the quaternion.",
- key = "quat:mul",
- module = "lovr.math",
- related = {
- "quat:__mul"
- },
- variants = {
- {
- arguments = {
- {
- name = "r",
- type = "quat",
- description = "A quaternion to combine with the original."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "A vector to rotate."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- }
- }
- },
- {
- name = "normalize",
- summary = "Normalize the length of the quaternion to 1.",
- description = "Adjusts the values in the quaternion so that its length becomes 1.",
- key = "quat:normalize",
- module = "lovr.math",
- related = {
- "quat:__len",
- "quat:length"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- }
- },
- notes = "A common source of bugs with quaternions is to forget to normalize them after performing a series of operations on them. Try normalizing a quaternion if some of the calculations aren't working quite right!"
- },
- {
- name = "set",
- summary = "Set the components of the quaternion.",
- description = "Sets the components of the quaternion. There are lots of different ways to specify the new components, the summary is:\n\n- Four numbers can be used to specify an angle/axis rotation, similar to other LÖVR functions.\n - Alternatively, a `vec3` can be used for the axis.\n- Four numbers plus the fifth `raw` flag can be used to set the raw values of the quaternion.\n- An existing quaternion can be passed in to copy its values.\n- A single direction vector can be specified to turn its direction (relative to the default\n forward direction of \"negative z\") into a rotation.\n- Two direction vectors can be specified to set the quaternion equal to the rotation between the\n two vectors.\n- A matrix can be passed in to extract the rotation of the matrix into a quaternion.",
- key = "quat:set",
- module = "lovr.math",
- related = {
- "quat:unpack",
- "lovr.math.quat",
- "Pool:quat"
- },
- variants = {
- {
- arguments = {
- {
- name = "angle",
- description = "The angle to use for the rotation, in radians.",
- default = "0"
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation.",
- default = "0"
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation.",
- default = "0"
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation.",
- default = "0"
- },
- {
- name = "raw",
- type = "boolean",
- description = "Whether the components should be interpreted as raw `(x, y, z, w)` components.",
- default = "false"
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "angle",
- description = "The angle to use for the rotation, in radians.",
- default = "0"
- },
- {
- name = "axis",
- type = "vec3",
- description = "The axis of rotation (does not need to be normalized)."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "r",
- type = "quat",
- description = "An existing quaternion to copy the values from."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- description = "Sets the values from a direction vector.",
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "A normalized direction vector."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- description = "Sets the values to represent the rotation between two vectors.",
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "A normalized direction vector."
- },
- {
- name = "u",
- type = "vec3",
- description = "Another normalized direction vector."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- },
- {
- arguments = {
- {
- name = "m",
- type = "mat4",
- description = "A matrix to use the rotation from."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion."
- }
- }
- }
- }
- },
- {
- name = "slerp",
- summary = "Moves this quaternion some amount towards another one.",
- description = "Performs a spherical linear interpolation between this quaternion and another one, which can be used for smoothly animating between two rotations.\n\nThe amount of interpolation is controlled by a parameter `t`. A `t` value of zero leaves the original quaternion unchanged, whereas a `t` of one sets the original quaternion exactly equal to the target. A value between `0` and `1` returns a rotation between the two based on the value.",
- key = "quat:slerp",
- module = "lovr.math",
- related = {
- "vec3:lerp"
- },
- variants = {
- {
- arguments = {
- {
- name = "r",
- type = "quat",
- description = "The quaternion to slerp towards."
- },
- {
- name = "t",
- type = "number",
- description = "The lerping parameter."
- }
- },
- returns = {
- {
- name = "q",
- type = "quat",
- description = "The original quaternion, containing the new lerped values."
- }
- }
- }
- }
- },
- {
- name = "unpack",
- summary = "Get the components of the quaternion.",
- description = "Returns the components of the quaternion as numbers, either in an angle/axis representation or as raw quaternion values.",
- key = "quat:unpack",
- module = "lovr.math",
- related = {
- "quat:set"
- },
- variants = {
- {
- arguments = {
- {
- name = "raw",
- type = "boolean",
- description = "Whether the values should be returned as raw values instead of angle/axis.",
- default = "false"
- }
- },
- returns = {
- {
- name = "a",
- type = "number",
- description = "The angle in radians, or the x value."
- },
- {
- name = "b",
- type = "number",
- description = "The x component of the rotation axis or the y value."
- },
- {
- name = "c",
- type = "number",
- description = "The y component of the rotation axis or the z value."
- },
- {
- name = "d",
- type = "number",
- description = "The z component of the rotation axis or the w value."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.math.quat"
- },
- related = {
- "vec3",
- "mat4"
- }
- },
- {
- name = "vec3",
- summary = "A 3D vector.",
- description = "A `vec3` is a math type that holds three numbers. It's very helpful for representing and manipulating 3D positions and directions. LÖVR functions that accept 3D positions, directions, or velocities generally also accept `vec3`s. `vec3`s are created using `lovr.math.vec3`.\n\n`vec3`s have metamethods, allowing you to add, subtract, multiply, and divide them using the usual binary operators that you would use on numbers. Note that these create new vectors to store their results in. If you want to modify a vector instead of creating new ones, you can use the named operator functions like `vec3:add`.\n\nCreating huge numbers of vectors every frame can lead to performance problems due to the sheer amount of memory allocation and garbage collection overhead. If you need lots of vector objects you can use `Pool`s to make things much more efficient.\n\nNote that accessing properties directly (like `v.x`) is not an officially supported feature right now (for performance reasons), though it does happen to work by accident in LuaJIT. This limitation may be improved in the future. For now, it is recommended to use `vec3:unpack` and `vec3:set` if you need to work with individual components of a vector.",
- key = "vec3",
- module = "lovr.math",
- methods = {
- {
- name = "__add",
- summary = "Add two vectors.",
- description = "Adds two vectors, returning a new vector containing the sum.",
- key = "vec3:__add",
- module = "lovr.math",
- related = {
- "vec3:add",
- "vec3:__sub",
- "vec3:__mul",
- "vec3:__div"
- },
- variants = {
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The first vector."
- },
- {
- name = "u",
- type = "vec3",
- description = "The second vector."
- }
- },
- returns = {
- {
- name = "out",
- type = "vec3",
- description = "The result."
- }
- }
- }
- }
- },
- {
- name = "__div",
- summary = "Divide vectors by vectors or numbers.",
- description = "Divides a vector by another vector or a vector by a number. Returns a new vector that contains the divided values.",
- key = "vec3:__div",
- module = "lovr.math",
- related = {
- "vec3:div",
- "vec3:__add",
- "vec3:__sub",
- "vec3:__mul"
- },
- variants = {
- {
- arguments = {
- v = {
- type = "vec3",
- description = "The first vector."
- },
- x = {
- type = "number",
- description = "A number to divide each value in the vector by."
- },
- u = {
- type = "vec3",
- description = "The second vector."
- }
- },
- returns = {
- {
- name = "out",
- type = "vec3",
- description = "The result."
- }
- }
- }
- }
- },
- {
- name = "__len",
- summary = "Get the length of the vector.",
- description = "Returns the length of the vector.",
- key = "vec3:__len",
- module = "lovr.math",
- related = {
- "vec3:length",
- "vec3:normalize",
- "vec3:distance"
- },
- variants = {
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The vector."
- }
- },
- returns = {
- {
- name = "length",
- type = "number",
- description = "The length of the vector."
- }
- }
- }
- }
- },
- {
- name = "__mul",
- summary = "Multiply vectors by vectors or numbers.",
- description = "Multiplies a vector by another vector or a vector by a number. Returns a new vector that contains the multiplied values.",
- key = "vec3:__mul",
- module = "lovr.math",
- related = {
- "vec3:mul",
- "vec3:__add",
- "vec3:__sub",
- "vec3:__div"
- },
- variants = {
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The first vector."
- },
- {
- name = "u",
- type = "vec3",
- description = "The second vector."
- }
- },
- returns = {
- {
- name = "out",
- type = "vec3",
- description = "The result."
- }
- }
- },
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The first vector."
- },
- {
- name = "x",
- type = "number",
- description = "A number to scale each value in the vector by."
- }
- },
- returns = {
- {
- name = "out",
- type = "vec3",
- description = "The result."
- }
- }
- }
- }
- },
- {
- name = "__sub",
- summary = "Subtract two vectors.",
- description = "Subtracts two vectors, returning a new vector containing the difference.",
- key = "vec3:__sub",
- module = "lovr.math",
- related = {
- "vec3:sub",
- "vec3:__add",
- "vec3:__mul",
- "vec3:__div"
- },
- variants = {
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The first vector."
- },
- {
- name = "u",
- type = "vec3",
- description = "The second vector."
- }
- },
- returns = {
- {
- name = "out",
- type = "vec3",
- description = "The result."
- }
- }
- }
- }
- },
- {
- name = "__unm",
- summary = "Negate a vector.",
- description = "Returns a new vector with the negated components of the original.",
- key = "vec3:__unm",
- module = "lovr.math",
- variants = {
- {
- arguments = {
- {
- name = "v",
- type = "vec3",
- description = "The first vector."
- }
- },
- returns = {
- {
- name = "negated",
- type = "vec3",
- description = "The result."
- }
- }
- }
- }
- },
- {
- name = "add",
- summary = "Add a vector to this vector.",
- description = "Adds a vector to this vector.",
- key = "vec3:add",
- module = "lovr.math",
- related = {
- "vec3:__add",
- "vec3:sub",
- "vec3:mul",
- "vec3:div"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The other vector."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- }
- },
- notes = "This function modifies `v` and sets the values to equal the summed values, like this:\n\n v.x, v.y, v.z = v.x + u.x, v.y + u.y, v.z + u.z"
- },
- {
- name = "cross",
- summary = "Get the cross product with another vector.",
- description = "Sets this vector to be equal to the cross product between this vector and another one. The new `v` will be perpendicular to both the old `v` and `u`.",
- key = "vec3:cross",
- module = "lovr.math",
- related = {
- "vec3:dot"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to compute the cross product with."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector, with the cross product as its values."
- }
- }
- }
- },
- notes = "The vectors are not normalized before or after computing the cross product."
- },
- {
- name = "distance",
- summary = "Get the distance to another vector.",
- description = "Returns the distance to another vector.",
- key = "vec3:distance",
- module = "lovr.math",
- related = {
- "vec3:__len",
- "vec3:length",
- "vec3:dot",
- "vec3:cross"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to measure the distance to."
- }
- },
- returns = {
- {
- name = "distance",
- type = "number",
- description = "The distance to `u`."
- }
- }
- }
- }
- },
- {
- name = "div",
- summary = "Divides the vector by a vector or a number.",
- description = "Divides the vector by a vector or a number.",
- key = "vec3:div",
- module = "lovr.math",
- related = {
- "vec3:__div",
- "vec3:add",
- "vec3:sub",
- "vec3:mul"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The other vector to divide the components by."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The number to divide each component by."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- }
- },
- notes = "This function modifies `v` and sets the values to equal the divided values. When dividing by a vector, the division is component-wise, like this:\n\n v.x, v.y, v.z = v.x / u.x, v.y / u.y, v.z / u.z\n\nDividing by a number divides each component of the vector by that number:\n\n v.x, v.y, v.z = v.x / x, v.y / x, v.z / x"
- },
- {
- name = "dot",
- summary = "Get the dot product with another vector.",
- description = "Returns the dot product between this vector and another one.",
- key = "vec3:dot",
- module = "lovr.math",
- related = {
- "vec3:cross",
- "vec3:__len",
- "vec3:length",
- "vec3:distance"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to compute the dot product with."
- }
- },
- returns = {
- {
- name = "dot",
- type = "number",
- description = "The dot product between `v` and `u`."
- }
- }
- }
- },
- notes = "This is computed as:\n\n dot = v.x * u.x + v.y * u.y + v.z * u.z\n\nThe vectors are not normalized before computing the dot product."
- },
- {
- name = "length",
- summary = "Get the length of the vector.",
- description = "Returns the length of the vector.",
- key = "vec3:length",
- module = "lovr.math",
- related = {
- "vec3:__len",
- "vec3:normalize",
- "vec3:distance"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "length",
- type = "number",
- description = "The length of the vector."
- }
- }
- }
- },
- notes = "The length is equivalent to this:\n\n math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)"
- },
- {
- name = "lerp",
- summary = "Moves this vector some amount towards another one.",
- description = "Performs a linear interpolation between this vector and another one, which can be used to smoothly animate between two vectors, based on a parameter value. A parameter value of `0` will leave the vector unchanged, a parameter value of `1` will set the vector to be equal to the input vector, and a value of `.5` will set the components to be halfway between the two vectors.",
- key = "vec3:lerp",
- module = "lovr.math",
- related = {
- "quat:slerp"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to lerp towards."
- },
- {
- name = "t",
- type = "number",
- description = "The lerping parameter."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector, containing the new lerped values."
- }
- }
- }
- }
- },
- {
- name = "mul",
- summary = "Multiply the vector by a vector or a number.",
- description = "Multiplies the vector by a vector or a number.",
- key = "vec3:mul",
- module = "lovr.math",
- related = {
- "vec3:__mul",
- "vec3:add",
- "vec3:sub",
- "vec3:div"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The other vector to multiply the components by."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The number to multiply each component by."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- }
- },
- notes = "This function modifies `v` and sets the values to equal the multiplied values. When multiplying by a vector, the multiplication is component-wise, like this:\n\n v.x, v.y, v.z = v.x * u.x, v.y * u.y, v.z * u.z\n\nMultiplying by a number scales each component of the vector by that number:\n\n v.x, v.y, v.z = v.x * x, v.y * x, v.z * x"
- },
- {
- name = "normalize",
- summary = "Normalize the length of the vector to 1.",
- description = "Adjusts the values in the vector so that its direction stays the same but its length becomes 1.",
- key = "vec3:normalize",
- module = "lovr.math",
- related = {
- "vec3:__len",
- "vec3:length"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- }
- }
- },
- {
- name = "set",
- summary = "Set the components of the vector.",
- description = "Sets the components of the vector, either from numbers or an existing vector.",
- key = "vec3:set",
- module = "lovr.math",
- related = {
- "vec3:unpack",
- "lovr.math.vec3",
- "Pool:vec3"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The new x value of the vector.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The new y value of the vector.",
- default = "x"
- },
- {
- name = "z",
- type = "number",
- description = "The new z value of the vector.",
- default = "x"
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The input vector."
- }
- }
- },
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The vector to copy the values from."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The input vector."
- }
- }
- }
- }
- },
- {
- name = "sub",
- summary = "Subtract a vector from this vector.",
- description = "Subtracts a vector from this vector.",
- key = "vec3:sub",
- module = "lovr.math",
- related = {
- "vec3:__sub",
- "vec3:add",
- "vec3:mul",
- "vec3:div"
- },
- variants = {
- {
- arguments = {
- {
- name = "u",
- type = "vec3",
- description = "The other vector."
- }
- },
- returns = {
- {
- name = "v",
- type = "vec3",
- description = "The original vector."
- }
- }
- }
- },
- notes = "This function modifies `v` and sets the values to equal the subtracted values, like this:\n\n v.x, v.y, v.z = v.x - u.x, v.y - u.y, v.z - u.z"
- },
- {
- name = "unpack",
- summary = "Get the components of the vector.",
- description = "Returns the 3 components of vector as numbers.",
- key = "vec3:unpack",
- module = "lovr.math",
- related = {
- "vec3:set"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x value."
- },
- {
- name = "y",
- type = "number",
- description = "The y value."
- },
- {
- name = "z",
- type = "number",
- description = "The z value."
- }
- }
- }
- }
- }
- },
- constructors = {
- "lovr.math.vec3"
- },
- related = {
- "quat",
- "mat4"
- }
- }
- }
- },
- {
- name = "physics",
- tag = "modules",
- summary = "Simulates 3D physics.",
- description = "The `lovr.physics` module simulates 3D rigid body physics.",
- key = "lovr.physics",
- sections = {
- {
- name = "Worlds",
- tag = "world",
- description = "A physics World holds all of the colliders and joints in the simulation. It must be updated every frame using `World:update`, during which it will move all the colliders and resolve collisions between them."
- },
- {
- name = "Colliders",
- tag = "colliders",
- description = "Colliders are objects that represent a single rigid body in the physics simulation. They can have forces applied to them and collide with other colliders."
- },
- {
- name = "Shapes",
- tag = "shapes",
- description = "Shapes are 3D physics shapes that can be attached to colliders. Shapes define, well, the shape of a Collider and how it collides with other objects. Without any Shapes, a collider wouldn't collide with anything.\n\nNormally, you don't need to create Shapes yourself, as there are convenience functions on the World that will create colliders with shapes already attached. However, you can attach multiple Shapes to a collider to create more complicated objects, and sometimes it can be useful to access the individual Shapes on a collider."
- },
- {
- name = "Joints",
- tag = "joints",
- description = "Joints are objects that constrain the movement of colliders in various ways. Joints are attached to two colliders when they're created and usually have a concept of an \"anchor\", which is where the Joint is attached to relative to the colliders. Joints can be used to create all sorts of neat things like doors, drawers, buttons, levers, or pendulums."
- }
- },
- enums = {
- {
- name = "JointType",
- summary = "Types of physics joints.",
- description = "Represents the different types of physics Joints available.",
- key = "JointType",
- module = "lovr.physics",
- values = {
- {
- name = "ball",
- description = "A BallJoint."
- },
- {
- name = "distance",
- description = "A DistanceJoint."
- },
- {
- name = "hinge",
- description = "A HingeJoint."
- },
- {
- name = "slider",
- description = "A SliderJoint."
- }
- },
- related = {
- "Joint",
- "BallJoint",
- "DistanceJoint",
- "HingeJoint",
- "SliderJoint"
- }
- },
- {
- name = "ShapeType",
- summary = "Types of physics shapes.",
- description = "Represents the different types of physics Shapes available.",
- key = "ShapeType",
- module = "lovr.physics",
- values = {
- {
- name = "box",
- description = "A BoxShape."
- },
- {
- name = "capsule",
- description = "A CapsuleShape."
- },
- {
- name = "cylinder",
- description = "A CylinderShape."
- },
- {
- name = "sphere",
- description = "A SphereShape."
- }
- },
- related = {
- "Shape",
- "BoxShape",
- "CapsuleShape",
- "CylinderShape",
- "SphereShape"
- }
- }
- },
- functions = {
- {
- name = "newBallJoint",
- tag = "joints",
- summary = "Create a new BallJoint.",
- description = "Creates a new BallJoint.",
- key = "lovr.physics.newBallJoint",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "colliderA",
- type = "Collider",
- description = "The first collider to attach the Joint to."
- },
- {
- name = "colliderB",
- type = "Collider",
- description = "The second collider to attach the Joint to."
- },
- {
- name = "x",
- type = "number",
- description = "The x position of the joint anchor point, in world coordinates."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the joint anchor point, in world coordinates."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the joint anchor point, in world coordinates."
- }
- },
- returns = {
- {
- name = "ball",
- type = "BallJoint",
- description = "The new BallJoint."
- }
- }
- }
- },
- related = {
- "lovr.physics.newDistanceJoint",
- "lovr.physics.newHingeJoint",
- "lovr.physics.newSliderJoint"
- },
- notes = "A ball joint is like a ball and socket between the two colliders. It tries to keep the distance between the colliders and the anchor position the same, but does not constrain the angle between them."
- },
- {
- name = "newBoxShape",
- tag = "shapes",
- summary = "Create a new BoxShape.",
- description = "Creates a new BoxShape.",
- key = "lovr.physics.newBoxShape",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the box, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The height of the box, in meters.",
- default = "width"
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the box, in meters.",
- default = "width"
- }
- },
- returns = {
- {
- name = "box",
- type = "BoxShape",
- description = "The new BoxShape."
- }
- }
- }
- },
- related = {
- "BoxShape",
- "lovr.physics.newCapsuleShape",
- "lovr.physics.newCylinderShape",
- "lovr.physics.newSphereShape"
- },
- notes = "A Shape can be attached to a Collider using `Collider:addShape`."
- },
- {
- name = "newCapsuleShape",
- tag = "shapes",
- summary = "Create a new CapsuleShape.",
- description = "Creates a new CapsuleShape. Capsules are cylinders with hemispheres on each end.",
- key = "lovr.physics.newCapsuleShape",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the capsule, in meters.",
- default = "1"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the capsule, not including the caps, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "capsule",
- type = "CapsuleShape",
- description = "The new CapsuleShape."
- }
- }
- }
- },
- related = {
- "CapsuleShape",
- "lovr.physics.newBoxShape",
- "lovr.physics.newCylinderShape",
- "lovr.physics.newSphereShape"
- },
- notes = "A Shape can be attached to a Collider using `Collider:addShape`."
- },
- {
- name = "newCylinderShape",
- tag = "shapes",
- summary = "Create a new CylinderShape.",
- description = "Creates a new CylinderShape.",
- key = "lovr.physics.newCylinderShape",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the cylinder, in meters.",
- default = "1"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the cylinder, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "cylinder",
- type = "CylinderShape",
- description = "The new CylinderShape."
- }
- }
- }
- },
- related = {
- "CylinderShape",
- "lovr.physics.newBoxShape",
- "lovr.physics.newCapsuleShape",
- "lovr.physics.newSphereShape"
- },
- notes = "A Shape can be attached to a Collider using `Collider:addShape`."
- },
- {
- name = "newDistanceJoint",
- tag = "joints",
- summary = "Create a new DistanceJoint.",
- description = "Creates a new DistanceJoint.",
- key = "lovr.physics.newDistanceJoint",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "colliderA",
- type = "Collider",
- description = "The first collider to attach the Joint to."
- },
- {
- name = "colliderB",
- type = "Collider",
- description = "The second collider to attach the Joint to."
- },
- {
- name = "x1",
- type = "number",
- description = "The x position of the first anchor point, in world coordinates."
- },
- {
- name = "y1",
- type = "number",
- description = "The y position of the first anchor point, in world coordinates."
- },
- {
- name = "z1",
- type = "number",
- description = "The z position of the first anchor point, in world coordinates."
- },
- {
- name = "x2",
- type = "number",
- description = "The x position of the second anchor point, in world coordinates."
- },
- {
- name = "y2",
- type = "number",
- description = "The y position of the second anchor point, in world coordinates."
- },
- {
- name = "z2",
- type = "number",
- description = "The z position of the second anchor point, in world coordinates."
- }
- },
- returns = {
- {
- name = "joint",
- type = "DistanceJoint",
- description = "The new DistanceJoint."
- }
- }
- }
- },
- related = {
- "lovr.physics.newBallJoint",
- "lovr.physics.newHingeJoint",
- "lovr.physics.newSliderJoint"
- },
- notes = "A distance joint tries to keep the two colliders a fixed distance apart. The distance is determined by the initial distance between the anchor points. The joint allows for rotation on the anchor points."
- },
- {
- name = "newHingeJoint",
- tag = "joints",
- summary = "Create a new HingeJoint.",
- description = "Creates a new HingeJoint.",
- key = "lovr.physics.newHingeJoint",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "colliderA",
- type = "Collider",
- description = "The first collider to attach the Joint to."
- },
- {
- name = "colliderB",
- type = "Collider",
- description = "The second collider to attach the Joint to."
- },
- {
- name = "x",
- type = "number",
- description = "The x position of the hinge anchor, in world coordinates."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the hinge anchor, in world coordinates."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the hinge anchor, in world coordinates."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the hinge axis."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the hinge axis."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the hinge axis."
- }
- },
- returns = {
- {
- name = "hinge",
- type = "HingeJoint",
- description = "The new HingeJoint."
- }
- }
- }
- },
- related = {
- "lovr.physics.newBallJoint",
- "lovr.physics.newDistanceJoint",
- "lovr.physics.newSliderJoint"
- },
- notes = "A hinge joint constrains two colliders to allow rotation only around the hinge's axis."
- },
- {
- name = "newSliderJoint",
- tag = "joints",
- summary = "Create a new SliderJoint.",
- description = "Creates a new SliderJoint.",
- key = "lovr.physics.newSliderJoint",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "colliderA",
- type = "Collider",
- description = "The first collider to attach the Joint to."
- },
- {
- name = "colliderB",
- type = "Collider",
- description = "The second collider to attach the Joint to."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the slider axis."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the slider axis."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the slider axis."
- }
- },
- returns = {
- {
- name = "slider",
- type = "SliderJoint",
- description = "The new SliderJoint."
- }
- }
- }
- },
- related = {
- "lovr.physics.newBallJoint",
- "lovr.physics.newDistanceJoint",
- "lovr.physics.newHingeJoint"
- },
- notes = "A slider joint constrains two colliders to only allow movement along the slider's axis."
- },
- {
- name = "newSphereShape",
- tag = "shapes",
- summary = "Create a new SphereShape.",
- description = "Creates a new SphereShape.",
- key = "lovr.physics.newSphereShape",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the sphere, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "sphere",
- type = "SphereShape",
- description = "The new SphereShape."
- }
- }
- }
- },
- related = {
- "SphereShape",
- "lovr.physics.newBoxShape",
- "lovr.physics.newCapsuleShape",
- "lovr.physics.newCylinderShape"
- },
- notes = "A Shape can be attached to a Collider using `Collider:addShape`."
- },
- {
- name = "newWorld",
- tag = "world",
- summary = "Create a new World.",
- description = "Creates a new physics World, which tracks the overall physics simulation, holds collider objects, and resolves collisions between them.",
- key = "lovr.physics.newWorld",
- module = "lovr.physics",
- notes = "A World must be updated with `World:update` in `lovr.update` for the physics simulation to advance.",
- variants = {
- {
- arguments = {
- {
- name = "xg",
- type = "number",
- description = "The x component of the gravity force.",
- default = "0"
- },
- {
- name = "yg",
- type = "number",
- description = "The y component of the gravity force.",
- default = "-9.81"
- },
- {
- name = "zg",
- type = "number",
- description = "The z component of the gravity force.",
- default = "0"
- },
- {
- name = "allowSleep",
- type = "boolean",
- description = "Whether or not colliders will automatically be put to sleep.",
- default = "true"
- },
- {
- name = "tags",
- type = "table",
- description = "A list of collision tags colliders can be assigned to.",
- default = "{}"
- }
- },
- returns = {
- {
- name = "world",
- type = "World",
- description = "A whole new World."
- }
- }
- }
- },
- examples = {
- {
- description = "Create a new world, add a collider to it, and update it, printing out its position as it falls.",
- code = "function lovr.load()\n world = lovr.physics.newWorld()\n box = world:newBoxCollider()\nend\n\nfunction lovr.update(dt)\n world:update(dt)\n print(box:getPosition())\nend"
- }
- }
- }
- },
- objects = {
- {
- name = "BallJoint",
- summary = "A ball and socket joint.",
- description = "A BallJoint is a type of `Joint` that acts like a ball and socket between two colliders. It allows the colliders to rotate freely around an anchor point, but does not allow the colliders' distance from the anchor point to change.",
- key = "BallJoint",
- module = "lovr.physics",
- related = {
- "Collider"
- },
- constructors = {
- "lovr.physics.newBallJoint"
- },
- methods = {
- {
- name = "getAnchors",
- summary = "Get the anchor points of the BallJoint.",
- description = "Returns the anchor points of the BallJoint, in world coordinates. The first point is the anchor on the first collider, and the second point is on the second collider. The joint tries to keep these points the same, but they may be different if the joint is forced apart by some other means.",
- key = "BallJoint:getAnchors",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the second anchor point, in world coordinates."
- }
- }
- }
- }
- },
- {
- name = "setAnchor",
- summary = "Set the anchor point of the BallJoint.",
- description = "Sets a new anchor point for the BallJoint.",
- key = "BallJoint:setAnchor",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the anchor point, in world coordinates."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the anchor point, in world coordinates."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the anchor point, in world coordinates."
- }
- },
- returns = {}
- }
- }
- }
- },
- extends = "Joint"
- },
- {
- name = "BoxShape",
- summary = "A box Shape.",
- description = "A type of `Shape` that can be used for cubes or boxes.",
- key = "BoxShape",
- module = "lovr.physics",
- extends = "Shape",
- constructors = {
- "lovr.physics.newBoxShape",
- "World:newBoxCollider"
- },
- methods = {
- {
- name = "getDimensions",
- summary = "Get the dimensions of the BoxShape.",
- description = "Returns the width, height, and depth of the BoxShape.",
- key = "BoxShape:getDimensions",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "width",
- type = "number",
- description = "The width of the box, in meters."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the box, in meters."
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the box, in meters."
- }
- }
- }
- }
- },
- {
- name = "setDimensions",
- summary = "Set the dimensions of the BoxShape.",
- description = "Sets the width, height, and depth of the BoxShape.",
- key = "BoxShape:setDimensions",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "width",
- type = "number",
- description = "The width of the box, in meters."
- },
- {
- name = "height",
- type = "number",
- description = "The height of the box, in meters."
- },
- {
- name = "depth",
- type = "number",
- description = "The depth of the box, in meters."
- }
- },
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "CapsuleShape",
- summary = "A capsule Shape.",
- description = "A type of `Shape` that can be used for capsule-shaped things.",
- key = "CapsuleShape",
- module = "lovr.physics",
- extends = "Shape",
- constructors = {
- "lovr.physics.newCapsuleShape",
- "World:newCapsuleCollider"
- },
- methods = {
- {
- name = "getLength",
- summary = "Get the length of the CapsuleShape.",
- description = "Returns the length of the CapsuleShape, not including the caps.",
- key = "CapsuleShape:getLength",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "length",
- type = "number",
- description = "The length of the capsule, in meters."
- }
- }
- }
- }
- },
- {
- name = "getRadius",
- summary = "Get the radius of the CapsuleShape.",
- description = "Returns the radius of the CapsuleShape.",
- key = "CapsuleShape:getRadius",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the capsule, in meters."
- }
- }
- }
- }
- },
- {
- name = "setLength",
- summary = "Set the length of the CapsuleShape.",
- description = "Sets the length of the CapsuleShape.",
- key = "CapsuleShape:setLength",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "length",
- type = "number",
- description = "The new length, in meters, not including the caps."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setRadius",
- summary = "Set the radius of the CapsuleShape.",
- description = "Sets the radius of the CapsuleShape.",
- key = "CapsuleShape:setRadius",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The new radius, in meters."
- }
- },
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "Collider",
- summary = "A single entity in a physics simulation.",
- description = "Colliders are objects that represent a single rigid body in a physics simulation. They can have forces applied to them and collide with other colliders.",
- key = "Collider",
- module = "lovr.physics",
- methods = {
- {
- name = "addShape",
- summary = "Add a Shape to the Collider.",
- description = "Attaches a Shape to the collider. Attached shapes will collide with other shapes in the world.",
- key = "Collider:addShape",
- module = "lovr.physics",
- related = {
- "Collider:removeShape",
- "Collider:getShapes",
- "Shape"
- },
- variants = {
- {
- arguments = {
- {
- name = "shape",
- type = "Shape",
- description = "The Shape to attach."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "applyForce",
- summary = "Apply a force to the Collider.",
- description = "Applies a force to the Collider.",
- key = "Collider:applyForce",
- module = "lovr.physics",
- related = {
- "Collider:applyTorque"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the force to apply."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the force to apply."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the force to apply."
- }
- },
- returns = {}
- },
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the force to apply."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the force to apply."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the force to apply."
- },
- {
- name = "px",
- type = "number",
- description = "The x position to apply the force at, in world coordinates."
- },
- {
- name = "py",
- type = "number",
- description = "The y position to apply the force at, in world coordinates."
- },
- {
- name = "pz",
- type = "number",
- description = "The z position to apply the force at, in world coordinates."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "applyTorque",
- summary = "Apply torque to the Collider.",
- description = "Applies torque to the Collider.",
- key = "Collider:applyTorque",
- module = "lovr.physics",
- related = {
- "Collider:applyForce"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the torque."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the torque."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the torque."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "destroy",
- summary = "Destroy the Collider.",
- description = "Destroy the Collider, removing it from the World.",
- key = "Collider:destroy",
- module = "lovr.physics",
- related = {
- "World:destroy",
- "Shape:destroy",
- "Joint:destroy"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "Calling functions on the collider after destroying it is a bad idea."
- },
- {
- name = "getAABB",
- summary = "Get the Collider's axis aligned bounding box.",
- description = "Returns the bounding box for the Collider, computed from attached shapes.",
- key = "Collider:getAABB",
- module = "lovr.physics",
- related = {
- "Shape:getAABB"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "minx",
- type = "number",
- description = "The minimum x coordinate of the box."
- },
- {
- name = "maxx",
- type = "number",
- description = "The maximum x coordinate of the box."
- },
- {
- name = "miny",
- type = "number",
- description = "The minimum y coordinate of the box."
- },
- {
- name = "maxy",
- type = "number",
- description = "The maximum y coordinate of the box."
- },
- {
- name = "minz",
- type = "number",
- description = "The minimum z coordinate of the box."
- },
- {
- name = "maxz",
- type = "number",
- description = "The maximum z coordinate of the box."
- }
- }
- }
- }
- },
- {
- name = "getAngularDamping",
- summary = "Get the angular damping of the Collider.",
- description = "Returns the angular damping of the Collider. Angular damping makes things less \"spinny\", causing them them slow down their angular velocity over time.",
- key = "Collider:getAngularDamping",
- module = "lovr.physics",
- related = {
- "World:getAngularDamping",
- "World:setAngularDamping"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "damping",
- type = "number",
- description = "The angular damping."
- }
- }
- }
- },
- notes = "Angular damping can also be set on the World."
- },
- {
- name = "getAngularVelocity",
- summary = "Get the angular velocity of the Collider.",
- description = "Returns the angular velocity of the Collider.",
- key = "Collider:getAngularVelocity",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocity",
- "Collider:setLinearVelocity",
- "Collider:applyTorque",
- "Collider:getOrientation",
- "Collider:setOrientation"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "vx",
- type = "number",
- description = "The x component of the angular velocity."
- },
- {
- name = "vy",
- type = "number",
- description = "The y component of the angular velocity."
- },
- {
- name = "vz",
- type = "number",
- description = "The z component of the angular velocity."
- }
- }
- }
- }
- },
- {
- name = "getFriction",
- summary = "Get the friction of the Collider.",
- description = "Returns the friction of the Collider. By default, the friction of two Colliders is combined (multiplied) when they collide to generate a friction force. The initial friction is 0.",
- key = "Collider:getFriction",
- module = "lovr.physics",
- related = {
- "Collider:getRestitution",
- "Collider:setRestitution",
- "World:collide"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "friction",
- type = "number",
- description = "The friction of the Collider."
- }
- }
- }
- }
- },
- {
- name = "getJoints",
- summary = "Get a list of Joints attached to the Collider.",
- description = "Returns a list of Joints attached to the Collider.",
- key = "Collider:getJoints",
- module = "lovr.physics",
- related = {
- "Joint"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "joints",
- type = "table",
- description = "A list of Joints attached to the Collider."
- }
- }
- }
- }
- },
- {
- name = "getLinearDamping",
- summary = "Get the linear damping of the Collider.",
- description = "Returns the Collider's linear damping parameter. Linear damping is similar to drag or air resistance, slowing the Collider down over time.",
- key = "Collider:getLinearDamping",
- module = "lovr.physics",
- related = {
- "World:getLinearDamping",
- "World:setLinearDamping"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "damping",
- type = "number",
- description = "The linear damping."
- }
- }
- }
- },
- notes = "A linear damping of 0 means the Collider won't slow down over time.\n\nLinear damping can also be set on the World using `World:setLinearDamping`, which will affect all new colliders."
- },
- {
- name = "getLinearVelocity",
- summary = "Get the linear velocity of the Collider.",
- description = "Returns the linear velocity of the Collider. This is how fast the Collider is moving. There is also angular velocity, which is how fast the Collider is spinning.",
- key = "Collider:getLinearVelocity",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocityFromLocalPoint",
- "Collider:getLinearVelocityFromWorldPoint",
- "Collider:getAngularVelocity",
- "Collider:setAngularVelocity",
- "Collider:applyForce",
- "Collider:getPosition",
- "Collider:setPosition"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "vx",
- type = "number",
- description = "The x velocity of the Collider, in meters per second."
- },
- {
- name = "vy",
- type = "number",
- description = "The y velocity of the Collider, in meters per second."
- },
- {
- name = "vz",
- type = "number",
- description = "The z velocity of the Collider, in meters per second."
- }
- }
- }
- }
- },
- {
- name = "getLinearVelocityFromLocalPoint",
- summary = "Get the linear velocity of the Collider at a point.",
- description = "Returns the linear velocity of a point relative to the Collider.",
- key = "Collider:getLinearVelocityFromLocalPoint",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocity",
- "Collider:getLinearVelocityFromWorldPoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate."
- }
- },
- returns = {
- {
- name = "vx",
- type = "number",
- description = "The x component of the velocity of the point."
- },
- {
- name = "vy",
- type = "number",
- description = "The y component of the velocity of the point."
- },
- {
- name = "vz",
- type = "number",
- description = "The z component of the velocity of the point."
- }
- }
- }
- }
- },
- {
- name = "getLinearVelocityFromWorldPoint",
- summary = "Get the linear velocity of the Collider at a world space point.",
- description = "Returns the linear velocity of a point on the Collider specified in world space.",
- key = "Collider:getLinearVelocityFromWorldPoint",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocity",
- "Collider:getLinearVelocityFromLocalPoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate in world space."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate in world space."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate in world space."
- }
- },
- returns = {
- {
- name = "vx",
- type = "number",
- description = "The x component of the velocity of the point."
- },
- {
- name = "vy",
- type = "number",
- description = "The y component of the velocity of the point."
- },
- {
- name = "vz",
- type = "number",
- description = "The z component of the velocity of the point."
- }
- }
- }
- }
- },
- {
- name = "getLocalCenter",
- summary = "Get the Collider's center of mass.",
- description = "Returns the Collider's center of mass.",
- key = "Collider:getLocalCenter",
- module = "lovr.physics",
- related = {
- "Collider:getLocalPoint",
- "Collider:getMassData",
- "Collider:setMassData"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "cx",
- type = "number",
- description = "The x position of the center of mass."
- },
- {
- name = "cy",
- type = "number",
- description = "The y position of the center of mass."
- },
- {
- name = "cz",
- type = "number",
- description = "The z position of the center of mass."
- }
- }
- }
- }
- },
- {
- name = "getLocalPoint",
- summary = "Convert a point from world space to collider space.",
- description = "Converts a point from world coordinates into local coordinates relative to the Collider.",
- key = "Collider:getLocalPoint",
- module = "lovr.physics",
- related = {
- "Collider:getWorldPoint",
- "Collider:getLocalVector",
- "Collider:getWorldVector"
- },
- variants = {
- {
- arguments = {
- {
- name = "wx",
- type = "number",
- description = "The x coordinate of the world point."
- },
- {
- name = "wy",
- type = "number",
- description = "The y coordinate of the world point."
- },
- {
- name = "wz",
- type = "number",
- description = "The z coordinate of the world point."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the local-space point."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the local-space point."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the local-space point."
- }
- }
- }
- }
- },
- {
- name = "getLocalVector",
- summary = "Convert a vector from world space to local space.",
- description = "Converts a direction vector from world space to local space.",
- key = "Collider:getLocalVector",
- module = "lovr.physics",
- related = {
- "Collider:getWorldVector",
- "Collider:getLocalPoint",
- "Collider:getWorldPoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "wx",
- type = "number",
- description = "The x component of the world vector."
- },
- {
- name = "wy",
- type = "number",
- description = "The y component of the world vector."
- },
- {
- name = "wz",
- type = "number",
- description = "The z component of the world vector."
- }
- },
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the local vector."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the local vector."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the local vector."
- }
- }
- }
- }
- },
- {
- name = "getMass",
- summary = "Get the total mass of the Collider.",
- description = "Returns the total mass of the Collider. The mass of a Collider depends on its attached shapes.",
- key = "Collider:getMass",
- module = "lovr.physics",
- related = {
- "Collider:getMassData",
- "Collider:setMassData",
- "Shape:getMass"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "mass",
- type = "number",
- description = "The mass of the Collider, in kilograms."
- }
- }
- }
- }
- },
- {
- name = "getMassData",
- summary = "Compute mass properties for the Collider.",
- description = "Computes mass properties for the Collider.",
- key = "Collider:getMassData",
- module = "lovr.physics",
- related = {
- "Collider:getMass",
- "Collider:setMass",
- "Shape:getMass"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "cx",
- type = "number",
- description = "The x position of the center of mass."
- },
- {
- name = "cy",
- type = "number",
- description = "The y position of the center of mass."
- },
- {
- name = "cz",
- type = "number",
- description = "The z position of the center of mass."
- },
- {
- name = "mass",
- type = "number",
- description = "The computed mass of the Collider."
- },
- {
- name = "inertia",
- type = "table",
- description = "A table containing 6 values of the rotational inertia tensor matrix. The table contains the 3 diagonal elements of the matrix (upper left to bottom right), followed by the 3 elements of the upper right portion of the 3x3 matrix."
- }
- }
- }
- }
- },
- {
- name = "getOrientation",
- summary = "Get the orientation of the Collider.",
- description = "Returns the orientation of the Collider in angle/axis representation.",
- key = "Collider:getOrientation",
- module = "lovr.physics",
- related = {
- "Collider:applyTorque",
- "Collider:getAngularVelocity",
- "Collider:setAngularVelocity",
- "Collider:getPosition",
- "Collider:setPosition"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the Collider is rotated around its axis of rotation."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- }
- }
- }
- },
- {
- name = "getPosition",
- summary = "Get the position of the Collider.",
- description = "Returns the position of the Collider.",
- key = "Collider:getPosition",
- module = "lovr.physics",
- related = {
- "Collider:applyForce",
- "Collider:getLinearVelocity",
- "Collider:setLinearVelocity",
- "Collider:getOrientation",
- "Collider:setOrientation"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x position of the Collider, in meters."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the Collider, in meters."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the Collider, in meters."
- }
- }
- }
- }
- },
- {
- name = "getRestitution",
- summary = "Get the bounciness of the Collider.",
- description = "Returns the restitution (bounciness) of the Collider. By default, the restitution of two Colliders is combined (the max is used) when they collide to cause them to bounce away from each other. The initial restitution is 0.",
- key = "Collider:getRestitution",
- module = "lovr.physics",
- related = {
- "Collider:getFriction",
- "Collider:setFriction",
- "World:collide"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "restitution",
- type = "number",
- description = "The restitution of the Collider."
- }
- }
- }
- }
- },
- {
- name = "getShapes",
- summary = "Get a list of Shapes attached to the Collider.",
- description = "Returns a list of Shapes attached to the Collider.",
- key = "Collider:getShapes",
- module = "lovr.physics",
- related = {
- "Collider:addShape",
- "Collider:removeShape",
- "Shape"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "shapes",
- type = "table",
- description = "A list of Shapes attached to the Collider."
- }
- }
- }
- }
- },
- {
- name = "getTag",
- summary = "Get the Collider's tag.",
- description = "Returns the Collider's tag.",
- key = "Collider:getTag",
- module = "lovr.physics",
- related = {
- "World:disableCollisionBetween",
- "World:enableCollisionBetween",
- "World:isCollisionEnabledBetween",
- "lovr.physics.newWorld"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "tag",
- type = "string",
- description = "The Collider's collision tag."
- }
- }
- }
- },
- notes = "Collision between tags can be enabled and disabled using `World:enableCollisionBetween` and `World:disableCollisionBetween`."
- },
- {
- name = "getUserData",
- summary = "Get the Collider's user data.",
- description = "Returns the user data associated with the Collider.",
- key = "Collider:getUserData",
- module = "lovr.physics",
- notes = "User data can be useful to identify the Collider in callbacks.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "data",
- type = "*",
- description = "The custom value associated with the Collider."
- }
- }
- }
- }
- },
- {
- name = "getWorld",
- summary = "Get the World the Collider is in.",
- description = "Returns the World the Collider is in.",
- key = "Collider:getWorld",
- module = "lovr.physics",
- related = {
- "World"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "world",
- type = "World",
- description = "The World the Collider is in."
- }
- }
- }
- },
- notes = "Colliders can only be in one World at a time."
- },
- {
- name = "getWorldPoint",
- summary = "Convert a point from local space to world space.",
- description = "Convert a point relative to the collider to a point in world coordinates.",
- key = "Collider:getWorldPoint",
- module = "lovr.physics",
- related = {
- "Collider:getLocalPoint",
- "Collider:getLocalVector",
- "Collider:getWorldVector"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x position of the point."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the point."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the point."
- }
- },
- returns = {
- {
- name = "wx",
- type = "number",
- description = "The x coordinate of the world point."
- },
- {
- name = "wy",
- type = "number",
- description = "The y coordinate of the world point."
- },
- {
- name = "wz",
- type = "number",
- description = "The z coordinate of the world point."
- }
- }
- }
- }
- },
- {
- name = "getWorldVector",
- summary = "Convert a vector from local space to world space.",
- description = "Converts a direction vector from local space to world space.",
- key = "Collider:getWorldVector",
- module = "lovr.physics",
- related = {
- "Collider:getLocalVector",
- "Collider:getLocalPoint",
- "Collider:getWorldPoint"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the local vector."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the local vector."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the local vector."
- }
- },
- returns = {
- {
- name = "wx",
- type = "number",
- description = "The x component of the world vector."
- },
- {
- name = "wy",
- type = "number",
- description = "The y component of the world vector."
- },
- {
- name = "wz",
- type = "number",
- description = "The z component of the world vector."
- }
- }
- }
- }
- },
- {
- name = "isAwake",
- summary = "Check if the Collider is awake.",
- description = "Returns whether the Collider is currently awake.",
- key = "Collider:isAwake",
- module = "lovr.physics",
- related = {
- "World:isSleepingAllowed",
- "World:setSleepingAllowed",
- "Collider:isSleepingAllowed",
- "Collider:setSleepingAllowed"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "awake",
- type = "boolean",
- description = "Whether the Collider is awake."
- }
- }
- }
- }
- },
- {
- name = "isGravityIgnored",
- summary = "Check if the Collider ignores gravity.",
- description = "Returns whether the Collider is currently ignoring gravity.",
- key = "Collider:isGravityIgnored",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "ignored",
- type = "boolean",
- description = "Whether gravity is ignored for this Collider."
- }
- }
- }
- }
- },
- {
- name = "isKinematic",
- summary = "Check if the Collider is kinematic.",
- description = "Returns whether the Collider is kinematic.",
- key = "Collider:isKinematic",
- module = "lovr.physics",
- notes = "Kinematic colliders behave as though they have infinite mass, ignoring external forces like gravity, joints, or collisions (though non-kinematic colliders will collide with them). They can be useful for static objects like floors or walls.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "kinematic",
- type = "boolean",
- description = "Whether the Collider is kinematic."
- }
- }
- }
- }
- },
- {
- name = "isSleepingAllowed",
- summary = "Check if the Collider is allowed to sleep.",
- description = "Returns whether the Collider is allowed to sleep.",
- key = "Collider:isSleepingAllowed",
- module = "lovr.physics",
- related = {
- "World:isSleepingAllowed",
- "World:setSleepingAllowed",
- "Collider:isAwake",
- "Collider:setAwake"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "allowed",
- type = "boolean",
- description = "Whether the Collider can go to sleep."
- }
- }
- }
- },
- notes = "If sleeping is enabled, the simulation will put the Collider to sleep if it hasn't moved in a while. Sleeping colliders don't impact the physics simulation, which makes updates more efficient and improves physics performance. However, the physics engine isn't perfect at waking up sleeping colliders and this can lead to bugs where colliders don't react to forces or collisions properly.\n\nIt is possible to set the default value for new colliders using `World:setSleepingAllowed`.\n\nColliders can be manually put to sleep or woken up using `Collider:setAwake`."
- },
- {
- name = "removeShape",
- summary = "Remove a Shape from the Collider.",
- description = "Removes a Shape from the Collider.",
- key = "Collider:removeShape",
- module = "lovr.physics",
- related = {
- "Collider:addShape",
- "Collider:getShapes",
- "Shape"
- },
- variants = {
- {
- arguments = {
- {
- name = "shape",
- type = "Shape",
- description = "The Shape to remove."
- }
- },
- returns = {}
- }
- },
- notes = "Colliders without any shapes won't collide with anything."
- },
- {
- name = "setAngularDamping",
- summary = "Set the angular damping of the Collider.",
- description = "Sets the angular damping of the Collider. Angular damping makes things less \"spinny\", causing them them slow down their angular velocity over time.",
- key = "Collider:setAngularDamping",
- module = "lovr.physics",
- related = {
- "World:getAngularDamping",
- "World:setAngularDamping"
- },
- variants = {
- {
- arguments = {
- {
- name = "damping",
- type = "number",
- description = "The angular damping."
- }
- },
- returns = {}
- }
- },
- notes = "Angular damping can also be set on the World."
- },
- {
- name = "setAngularVelocity",
- summary = "Set the angular velocity of the Collider.",
- description = "Sets the angular velocity of the Collider.",
- key = "Collider:setAngularVelocity",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocity",
- "Collider:setLinearVelocity",
- "Collider:applyTorque",
- "Collider:getOrientation",
- "Collider:setOrientation"
- },
- variants = {
- {
- arguments = {
- {
- name = "vx",
- type = "number",
- description = "The x component of the angular velocity."
- },
- {
- name = "vy",
- type = "number",
- description = "The y component of the angular velocity."
- },
- {
- name = "vz",
- type = "number",
- description = "The z component of the angular velocity."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setAwake",
- summary = "Put the Collider to sleep or wake it up.",
- description = "Manually puts the Collider to sleep or wakes it up. You can do this if you know a Collider won't be touched for a while or if you need to it be active.",
- key = "Collider:setAwake",
- module = "lovr.physics",
- related = {
- "World:isSleepingAllowed",
- "World:setSleepingAllowed",
- "Collider:isSleepingAllowed",
- "Collider:setSleepingAllowed"
- },
- variants = {
- {
- arguments = {
- {
- name = "awake",
- type = "boolean",
- description = "Whether the Collider should be awake."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setFriction",
- summary = "Set the friction of the Collider.",
- description = "Sets the friction of the Collider. By default, the friction of two Colliders is combined (multiplied) when they collide to generate a friction force. The initial friction is 0.",
- key = "Collider:setFriction",
- module = "lovr.physics",
- related = {
- "Collider:getRestitution",
- "Collider:setRestitution",
- "World:collide"
- },
- variants = {
- {
- arguments = {
- {
- name = "friction",
- type = "number",
- description = "The new friction."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setGravityIgnored",
- summary = "Set whether the Collider ignores gravity.",
- description = "Sets whether the Collider should ignore gravity.",
- key = "Collider:setGravityIgnored",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "ignored",
- type = "boolean",
- description = "Whether gravity should be ignored."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setKinematic",
- summary = "Set whether the Collider is kinematic.",
- description = "Sets whether the Collider is kinematic.",
- key = "Collider:setKinematic",
- module = "lovr.physics",
- notes = "Kinematic colliders behave as though they have infinite mass, ignoring external forces like gravity, joints, or collisions (though non-kinematic colliders will collide with them). They can be useful for static objects like floors or walls.",
- variants = {
- {
- arguments = {
- {
- name = "kinematic",
- type = "boolean",
- description = "Whether the Collider is kinematic."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLinearDamping",
- summary = "Set the linear damping of the Collider.",
- description = "Sets the Collider's linear damping parameter. Linear damping is similar to drag or air resistance, slowing the Collider down over time.",
- key = "Collider:setLinearDamping",
- module = "lovr.physics",
- related = {
- "World:getLinearDamping",
- "World:setLinearDamping"
- },
- variants = {
- {
- arguments = {
- {
- name = "damping",
- type = "number",
- description = "The linear damping."
- }
- },
- returns = {}
- }
- },
- notes = "A linear damping of 0 means the Collider won't slow down over time.\n\nLinear damping can also be set on the World using `World:setLinearDamping`, which will affect all new colliders."
- },
- {
- name = "setLinearVelocity",
- summary = "Set the linear velocity of the Collider.",
- description = "Sets the linear velocity of the Collider directly. Usually it's preferred to use `Collider:applyForce` to change velocity since instantaneous velocity changes can lead to weird glitches.",
- key = "Collider:setLinearVelocity",
- module = "lovr.physics",
- related = {
- "Collider:getLinearVelocityFromLocalPoint",
- "Collider:getLinearVelocityFromWorldPoint",
- "Collider:getAngularVelocity",
- "Collider:setAngularVelocity",
- "Collider:applyForce",
- "Collider:getPosition",
- "Collider:setPosition"
- },
- variants = {
- {
- arguments = {
- {
- name = "vx",
- type = "number",
- description = "The x velocity of the Collider, in meters per second."
- },
- {
- name = "vy",
- type = "number",
- description = "The y velocity of the Collider, in meters per second."
- },
- {
- name = "vz",
- type = "number",
- description = "The z velocity of the Collider, in meters per second."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setMass",
- summary = "Set the total mass of the Collider.",
- description = "Sets the total mass of the Collider.",
- key = "Collider:setMass",
- module = "lovr.physics",
- related = {
- "Collider:getMassData",
- "Collider:setMassData",
- "Shape:getMass"
- },
- variants = {
- {
- arguments = {
- {
- name = "mass",
- type = "number",
- description = "The new mass for the Collider, in kilograms."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setMassData",
- summary = "Set mass properties for the Collider.",
- description = "Sets mass properties for the Collider.",
- key = "Collider:setMassData",
- module = "lovr.physics",
- related = {
- "Collider:getMass",
- "Collider:setMass",
- "Shape:getMass"
- },
- variants = {
- {
- arguments = {
- {
- name = "cx",
- type = "number",
- description = "The x position of the center of mass."
- },
- {
- name = "cy",
- type = "number",
- description = "The y position of the center of mass."
- },
- {
- name = "cz",
- type = "number",
- description = "The z position of the center of mass."
- },
- {
- name = "mass",
- type = "number",
- description = "The computed mass of the Collider."
- },
- {
- name = "inertia",
- type = "table",
- description = "A table containing 6 values of the rotational inertia tensor matrix. The table contains the 3 diagonal elements of the matrix (upper left to bottom right), followed by the 3 elements of the upper right portion of the 3x3 matrix."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setOrientation",
- summary = "Set the orientation of the Collider.",
- description = "Sets the orientation of the Collider in angle/axis representation.",
- key = "Collider:setOrientation",
- module = "lovr.physics",
- related = {
- "Collider:applyTorque",
- "Collider:getAngularVelocity",
- "Collider:setAngularVelocity",
- "Collider:getPosition",
- "Collider:setPosition"
- },
- variants = {
- {
- arguments = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the Collider is rotated around its axis of rotation."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the axis of rotation."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the axis of rotation."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the axis of rotation."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPosition",
- summary = "Set the position of the Collider.",
- description = "Sets the position of the Collider.",
- key = "Collider:setPosition",
- module = "lovr.physics",
- related = {
- "Collider:applyForce",
- "Collider:getLinearVelocity",
- "Collider:setLinearVelocity",
- "Collider:getOrientation",
- "Collider:setOrientation"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x position of the Collider, in meters."
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the Collider, in meters."
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the Collider, in meters."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setRestitution",
- summary = "Set the bounciness of the Collider.",
- description = "Sets the restitution (bounciness) of the Collider. By default, the restitution of two Colliders is combined (the max is used) when they collide to cause them to bounce away from each other. The initial restitution is 0.",
- key = "Collider:setRestitution",
- module = "lovr.physics",
- related = {
- "Collider:getFriction",
- "Collider:setFriction",
- "World:collide"
- },
- variants = {
- {
- arguments = {
- {
- name = "restitution",
- type = "number",
- description = "The new restitution."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setSleepingAllowed",
- summary = "Set whether the Collider is allowed to sleep.",
- description = "Sets whether the Collider is allowed to sleep.",
- key = "Collider:setSleepingAllowed",
- module = "lovr.physics",
- related = {
- "World:isSleepingAllowed",
- "World:setSleepingAllowed",
- "Collider:isAwake",
- "Collider:setAwake"
- },
- variants = {
- {
- arguments = {
- {
- name = "allowed",
- type = "boolean",
- description = "Whether the Collider can go to sleep."
- }
- },
- returns = {}
- }
- },
- notes = "If sleeping is enabled, the simulation will put the Collider to sleep if it hasn't moved in a while. Sleeping colliders don't impact the physics simulation, which makes updates more efficient and improves physics performance. However, the physics engine isn't perfect at waking up sleeping colliders and this can lead to bugs where colliders don't react to forces or collisions properly.\n\nIt is possible to set the default value for new colliders using `World:setSleepingAllowed`.\n\nColliders can be manually put to sleep or woken up using `Collider:setAwake`."
- },
- {
- name = "setTag",
- summary = "Set the Collider's tag.",
- description = "Sets the Collider's tag.",
- key = "Collider:setTag",
- module = "lovr.physics",
- related = {
- "World:disableCollisionBetween",
- "World:enableCollisionBetween",
- "World:isCollisionEnabledBetween",
- "lovr.physics.newWorld"
- },
- variants = {
- {
- arguments = {
- {
- name = "tag",
- type = "string",
- description = "The Collider's collision tag."
- }
- },
- returns = {}
- }
- },
- notes = "Collision between tags can be enabled and disabled using `World:enableCollisionBetween` and `World:disableCollisionBetween`."
- },
- {
- name = "setUserData",
- summary = "Set the Collider's user data.",
- description = "Associates a custom value with the Collider.",
- key = "Collider:setUserData",
- module = "lovr.physics",
- notes = "User data can be useful to identify the Collider in callbacks.",
- variants = {
- {
- arguments = {
- {
- name = "data",
- type = "*",
- description = "The custom value to associate with the Collider."
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "World:newCollider",
- "World:newBoxCollider",
- "World:newCapsuleCollider",
- "World:newCylinderCollider",
- "World:newSphereCollider"
- }
- },
- {
- name = "CylinderShape",
- summary = "A cylinder Shape.",
- description = "A type of `Shape` that can be used for cylinder-shaped things.",
- key = "CylinderShape",
- module = "lovr.physics",
- extends = "Shape",
- constructors = {
- "lovr.physics.newCylinderShape",
- "World:newCylinderCollider"
- },
- methods = {
- {
- name = "getLength",
- summary = "Get the length of the CylinderShape.",
- description = "Returns the length of the CylinderShape.",
- key = "CylinderShape:getLength",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "length",
- type = "number",
- description = "The length of the cylinder, in meters."
- }
- }
- }
- }
- },
- {
- name = "getRadius",
- summary = "Get the radius of the CylinderShape.",
- description = "Returns the radius of the CylinderShape.",
- key = "CylinderShape:getRadius",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the cylinder, in meters."
- }
- }
- }
- }
- },
- {
- name = "setLength",
- summary = "Set the length of the CylinderShape.",
- description = "Sets the length of the CylinderShape.",
- key = "CylinderShape:setLength",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "length",
- type = "number",
- description = "The new length, in meters."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setRadius",
- summary = "Set the radius of the CylinderShape.",
- description = "Sets the radius of the CylinderShape.",
- key = "CylinderShape:setRadius",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The new radius, in meters."
- }
- },
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "DistanceJoint",
- summary = "A fixed distance joint.",
- description = "A DistanceJoint is a type of `Joint` that tries to keep two colliders a fixed distance apart. The distance is determined by the initial distance between the anchor points. The joint allows for rotation on the anchor points.",
- key = "DistanceJoint",
- module = "lovr.physics",
- related = {
- "Collider"
- },
- constructors = {
- "lovr.physics.newDistanceJoint"
- },
- methods = {
- {
- name = "getAnchors",
- summary = "Get the anchor points of the DistanceJoint.",
- description = "Returns the anchor points of the DistanceJoint.",
- key = "DistanceJoint:getAnchors",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the second anchor point, in world coordinates."
- }
- }
- }
- }
- },
- {
- name = "getDistance",
- summary = "Get the target distance of the DistanceJoint.",
- description = "Returns the target distance for the DistanceJoint. The joint tries to keep the Colliders this far apart.",
- key = "DistanceJoint:getDistance",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "distance",
- type = "number",
- description = "The target distance."
- }
- }
- }
- }
- },
- {
- name = "setAnchors",
- summary = "Set the anchor points of the DistanceJoint.",
- description = "Sets the anchor points of the DistanceJoint.",
- key = "DistanceJoint:setAnchors",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the second anchor point, in world coordinates."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setDistance",
- summary = "Set the target distance of the DistanceJoint.",
- description = "Sets the target distance for the DistanceJoint. The joint tries to keep the Colliders this far apart.",
- key = "DistanceJoint:setDistance",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "distance",
- type = "number",
- description = "The new target distance."
- }
- },
- returns = {}
- }
- }
- }
- },
- extends = "Joint"
- },
- {
- name = "HingeJoint",
- summary = "A hinge joint.",
- description = "A HingeJoint is a type of `Joint` that only allows colliders to rotate on a single axis.",
- key = "HingeJoint",
- module = "lovr.physics",
- related = {
- "Collider"
- },
- constructors = {
- "lovr.physics.newHingeJoint"
- },
- methods = {
- {
- name = "getAnchors",
- summary = "Get the anchor points of the HingeJoint.",
- description = "Returns the anchor points of the HingeJoint.",
- key = "HingeJoint:getAnchors",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the first anchor point, in world coordinates."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the second anchor point, in world coordinates."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the second anchor point, in world coordinates."
- }
- }
- }
- }
- },
- {
- name = "getAngle",
- summary = "Get the angle of the HingeJoint.",
- description = "Get the angle between the two colliders attached to the HingeJoint. When the joint is created or when the anchor or axis is set, the current angle is the new \"zero\" angle.",
- key = "HingeJoint:getAngle",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The hinge angle."
- }
- }
- }
- }
- },
- {
- name = "getAxis",
- summary = "Get the HingeJoint's axis.",
- description = "Returns the axis of the hinge.",
- key = "HingeJoint:getAxis",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x component of the axis."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the axis."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the axis."
- }
- }
- }
- }
- },
- {
- name = "getLimits",
- summary = "Get the HingeJoint's angle limits.",
- description = "Returns the upper and lower limits of the hinge angle. These will be between -π and π.",
- key = "HingeJoint:getLimits",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getLowerLimit",
- "HingeJoint:setLowerLimit",
- "HingeJoint:getUpperLimit",
- "HingeJoint:setUpperLimit"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "lower",
- type = "number",
- description = "The lower limit."
- },
- {
- name = "upper",
- type = "number",
- description = "The upper limit."
- }
- }
- }
- }
- },
- {
- name = "getLowerLimit",
- summary = "Get the HingeJoint's lower angle limit.",
- description = "Returns the lower limit of the hinge angle. This will be greater than -π.",
- key = "HingeJoint:getLowerLimit",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getUpperLimit",
- "HingeJoint:setUpperLimit",
- "HingeJoint:getLimits",
- "HingeJoint:setLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "limit",
- type = "number",
- description = "The lower limit."
- }
- }
- }
- }
- },
- {
- name = "getUpperLimit",
- summary = "Get the HingeJoint's upper angle limit.",
- description = "Returns the upper limit of the hinge angle. This will be less than π.",
- key = "HingeJoint:getUpperLimit",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getLowerLimit",
- "HingeJoint:setLowerLimit",
- "HingeJoint:getLimits",
- "HingeJoint:setLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "limit",
- type = "number",
- description = "The upper limit."
- }
- }
- }
- }
- },
- {
- name = "setAnchor",
- summary = "Set the anchor point of the HingeJoint.",
- description = "Sets a new anchor point for the HingeJoint.",
- key = "HingeJoint:setAnchor",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the anchor point, in world coordinates."
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the anchor point, in world coordinates."
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the anchor point, in world coordinates."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setAxis",
- summary = "Set the HingeJoint's axis.",
- description = "Sets the axis of the hinge.",
- key = "HingeJoint:setAxis",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the axis."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the axis."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the axis."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLimits",
- summary = "Set the HingeJoint's angle limits.",
- description = "Sets the upper and lower limits of the hinge angle. These should be between -π and π.",
- key = "HingeJoint:setLimits",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getLowerLimit",
- "HingeJoint:setLowerLimit",
- "HingeJoint:getUpperLimit",
- "HingeJoint:setUpperLimit"
- },
- variants = {
- {
- arguments = {
- {
- name = "lower",
- type = "number",
- description = "The lower limit."
- },
- {
- name = "upper",
- type = "number",
- description = "The upper limit."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLowerLimit",
- summary = "Set the HingeJoint's lower angle limit.",
- description = "Sets the lower limit of the hinge angle. This should be greater than -π.",
- key = "HingeJoint:setLowerLimit",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getUpperLimit",
- "HingeJoint:setUpperLimit",
- "HingeJoint:getLimits",
- "HingeJoint:setLimits"
- },
- variants = {
- {
- arguments = {
- {
- name = "limit",
- type = "number",
- description = "The lower limit."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setUpperLimit",
- summary = "Set the HingeJoint's upper angle limit.",
- description = "Sets the upper limit of the hinge angle. This should be less than π.",
- key = "HingeJoint:setUpperLimit",
- module = "lovr.physics",
- related = {
- "HingeJoint:getAngle",
- "HingeJoint:getLowerLimit",
- "HingeJoint:setLowerLimit",
- "HingeJoint:getLimits",
- "HingeJoint:setLimits"
- },
- variants = {
- {
- arguments = {
- {
- name = "limit",
- type = "number",
- description = "The upper limit."
- }
- },
- returns = {}
- }
- }
- }
- },
- extends = "Joint"
- },
- {
- name = "Joint",
- summary = "Joins two Colliders together.",
- description = "A Joint is a physics object that constrains the movement of two Colliders.",
- key = "Joint",
- module = "lovr.physics",
- methods = {
- {
- name = "destroy",
- summary = "Destroy the Joint.",
- description = "Destroy the Joint, removing it from Colliders it's attached to.",
- key = "Joint:destroy",
- module = "lovr.physics",
- related = {
- "Collider:destroy",
- "Shape:destroy",
- "World:destroy"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "Calling functions on the Joint after destroying it is a bad idea."
- },
- {
- name = "getColliders",
- summary = "Get the Colliders the Joint is attached to.",
- description = "Returns the Colliders the Joint is attached to. All Joints are attached to two colliders.",
- key = "Joint:getColliders",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "colliderA",
- type = "Collider",
- description = "The first Collider."
- },
- {
- name = "colliderB",
- type = "Collider",
- description = "The second Collider."
- }
- }
- }
- }
- },
- {
- name = "getType",
- summary = "Get the type of the Joint.",
- description = "Returns the type of the Joint.",
- key = "Joint:getType",
- module = "lovr.physics",
- related = {
- "JointType"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "JointType",
- description = "The type of the Joint."
- }
- }
- }
- }
- },
- {
- name = "getUserData",
- summary = "Get the Joint's user data.",
- description = "Returns the user data associated with the Joint.",
- key = "Joint:getUserData",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "data",
- type = "*",
- description = "The custom value associated with the Joint."
- }
- }
- }
- }
- },
- {
- name = "setUserData",
- summary = "Set the Joint's user data.",
- description = "Sets the user data associated with the Joint.",
- key = "Joint:setUserData",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "data",
- type = "*",
- description = "The custom value associated with the Joint."
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.physics.newBallJoint",
- "lovr.physics.newDistanceJoint",
- "lovr.physics.newHingeJoint",
- "lovr.physics.newSliderJoint"
- },
- related = {
- "Collider"
- }
- },
- {
- name = "Shape",
- summary = "Defines the shape of Colliders.",
- description = "A Shape is a physics object that can be attached to colliders to define their shape.",
- key = "Shape",
- module = "lovr.physics",
- methods = {
- {
- name = "destroy",
- summary = "Destroy the Shape.",
- description = "Destroy the Shape, removing it from Colliders it's attached to.",
- key = "Shape:destroy",
- module = "lovr.physics",
- related = {
- "Collider:destroy",
- "Joint:destroy",
- "World:destroy"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "Calling functions on the Shape after destroying it is a bad idea."
- },
- {
- name = "getAABB",
- summary = "Get the Shape's axis aligned bounding box.",
- description = "Returns the bounding box for the Shape.",
- key = "Shape:getAABB",
- module = "lovr.physics",
- related = {
- "Collider:getAABB"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "minx",
- type = "number",
- description = "The minimum x coordinate of the box."
- },
- {
- name = "maxx",
- type = "number",
- description = "The maximum x coordinate of the box."
- },
- {
- name = "miny",
- type = "number",
- description = "The minimum y coordinate of the box."
- },
- {
- name = "maxy",
- type = "number",
- description = "The maximum y coordinate of the box."
- },
- {
- name = "minz",
- type = "number",
- description = "The minimum z coordinate of the box."
- },
- {
- name = "maxz",
- type = "number",
- description = "The maximum z coordinate of the box."
- }
- }
- }
- }
- },
- {
- name = "getCollider",
- summary = "Get the Collider the Shape is attached to.",
- description = "Returns the Collider the Shape is attached to.",
- key = "Shape:getCollider",
- module = "lovr.physics",
- related = {
- "Collider",
- "Collider:addShape",
- "Collider:removeShape"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The Collider the Shape is attached to."
- }
- }
- }
- },
- notes = "A Shape can only be attached to one Collider at a time."
- },
- {
- name = "getMass",
- summary = "Compute mass properties of the Shape.",
- description = "Computes mass properties of the Shape.",
- key = "Shape:getMass",
- module = "lovr.physics",
- related = {
- "Collider:getMass",
- "Collider:setMass",
- "Collider:getMassData",
- "Collider:setMassData"
- },
- variants = {
- {
- arguments = {
- {
- name = "density",
- type = "number",
- description = "The density to use, in kilograms per cubic meter."
- }
- },
- returns = {
- {
- name = "cx",
- type = "number",
- description = "The x position of the center of mass."
- },
- {
- name = "cy",
- type = "number",
- description = "The y position of the center of mass."
- },
- {
- name = "cz",
- type = "number",
- description = "The z position of the center of mass."
- },
- {
- name = "mass",
- type = "number",
- description = "The mass of the Shape."
- },
- {
- name = "inertia",
- type = "table",
- description = "A table containing 6 values of the rotational inertia tensor matrix. The table contains the 3 diagonal elements of the matrix (upper left to bottom right), followed by the 3 elements of the upper right portion of the 3x3 matrix."
- }
- }
- }
- }
- },
- {
- name = "getOrientation",
- summary = "Get the Shape's orientation.",
- description = "Get the orientation of the Shape relative to its Collider.",
- key = "Shape:getOrientation",
- module = "lovr.physics",
- related = {
- "Shape:getPosition",
- "Shape:setPosition"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the Shape is rotated."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the rotation axis."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the rotation axis."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the rotation axis."
- }
- }
- }
- }
- },
- {
- name = "getPosition",
- summary = "Get the Shape's position.",
- description = "Get the position of the Shape relative to its Collider.",
- key = "Shape:getPosition",
- module = "lovr.physics",
- related = {
- "Shape:getOrientation",
- "Shape:setOrientation"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x offset."
- },
- {
- name = "y",
- type = "number",
- description = "The y offset."
- },
- {
- name = "z",
- type = "number",
- description = "The z offset."
- }
- }
- }
- }
- },
- {
- name = "getType",
- summary = "Get the type of the Shape.",
- description = "Returns the type of the Shape.",
- key = "Shape:getType",
- module = "lovr.physics",
- related = {
- "ShapeType"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "type",
- type = "ShapeType",
- description = "The type of the Shape."
- }
- }
- }
- }
- },
- {
- name = "getUserData",
- summary = "Get the Shape's user data.",
- description = "Returns the user data associated with the Shape.",
- key = "Shape:getUserData",
- module = "lovr.physics",
- notes = "User data can be useful to identify the Shape in callbacks.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "data",
- type = "*",
- description = "The custom value associated with the Shape."
- }
- }
- }
- }
- },
- {
- name = "isEnabled",
- summary = "Check if the Shape is enabled.",
- description = "Returns whether the Shape is enabled.",
- key = "Shape:isEnabled",
- module = "lovr.physics",
- notes = "Disabled shapes won't collide with anything.",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether the Shape is enabled."
- }
- }
- }
- }
- },
- {
- name = "setEnabled",
- summary = "Enable or disable the Shape.",
- description = "Enable or disable the Shape.",
- key = "Shape:setEnabled",
- module = "lovr.physics",
- notes = "Disabled shapes won't collide with anything.",
- variants = {
- {
- arguments = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether the Shape should be enabled."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setOrientation",
- summary = "Set the Shape's orientation.",
- description = "Set the orientation of the Shape relative to its Collider.",
- key = "Shape:setOrientation",
- module = "lovr.physics",
- related = {
- "Shape:getPosition",
- "Shape:setPosition"
- },
- variants = {
- {
- arguments = {
- {
- name = "angle",
- type = "number",
- description = "The number of radians the Shape is rotated."
- },
- {
- name = "ax",
- type = "number",
- description = "The x component of the rotation axis."
- },
- {
- name = "ay",
- type = "number",
- description = "The y component of the rotation axis."
- },
- {
- name = "az",
- type = "number",
- description = "The z component of the rotation axis."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setPosition",
- summary = "Set the Shape's position.",
- description = "Set the position of the Shape relative to its Collider.",
- key = "Shape:setPosition",
- module = "lovr.physics",
- related = {
- "Shape:getOrientation",
- "Shape:setOrientation"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x offset."
- },
- {
- name = "y",
- type = "number",
- description = "The y offset."
- },
- {
- name = "z",
- type = "number",
- description = "The z offset."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setUserData",
- summary = "Set the Shape's user data.",
- description = "Sets the user data associated with the Shape.",
- key = "Shape:setUserData",
- module = "lovr.physics",
- notes = "User data can be useful to identify the Shape in callbacks.",
- variants = {
- {
- arguments = {
- {
- name = "data",
- type = "*",
- description = "The custom value associated with the Shape."
- }
- },
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.physics.newBoxShape",
- "lovr.physics.newCapsuleShape",
- "lovr.physics.newCylinderShape",
- "lovr.physics.newSphereShape",
- "World:newBoxCollider",
- "World:newCapsuleCollider",
- "World:newCylinderCollider",
- "World:newSphereCollider"
- }
- },
- {
- name = "SliderJoint",
- summary = "A slider joint.",
- description = "A SliderJoint is a type of `Joint` that only allows colliders to move on a single axis.",
- key = "SliderJoint",
- module = "lovr.physics",
- related = {
- "Collider"
- },
- constructors = {
- "lovr.physics.newSliderJoint"
- },
- methods = {
- {
- name = "getAxis",
- summary = "Get the SliderJoint's axis.",
- description = "Returns the axis of the slider.",
- key = "SliderJoint:getAxis",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "x",
- type = "number",
- description = "The x component of the axis."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the axis."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the axis."
- }
- }
- }
- }
- },
- {
- name = "getLimits",
- summary = "Get the SliderJoint's limits.",
- description = "Returns the upper and lower limits of the slider position.",
- key = "SliderJoint:getLimits",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getLowerLimit",
- "SliderJoint:setLowerLimit",
- "SliderJoint:getUpperLimit",
- "SliderJoint:setUpperLimit"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "lower",
- type = "number",
- description = "The lower limit."
- },
- {
- name = "upper",
- type = "number",
- description = "The upper limit."
- }
- }
- }
- }
- },
- {
- name = "getLowerLimit",
- summary = "Get the SliderJoint's lower limit.",
- description = "Returns the lower limit of the slider position.",
- key = "SliderJoint:getLowerLimit",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getUpperLimit",
- "SliderJoint:setUpperLimit",
- "SliderJoint:getLimits",
- "SliderJoint:setLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "limit",
- type = "number",
- description = "The lower limit."
- }
- }
- }
- }
- },
- {
- name = "getUpperLimit",
- summary = "Get the SliderJoint's upper limit.",
- description = "Returns the upper limit of the slider position.",
- key = "SliderJoint:getUpperLimit",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getLowerLimit",
- "SliderJoint:setLowerLimit",
- "SliderJoint:getLimits",
- "SliderJoint:setLimits"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "limit",
- type = "number",
- description = "The upper limit."
- }
- }
- }
- }
- },
- {
- name = "setAxis",
- summary = "Set the SliderJoint's axis.",
- description = "Sets the axis of the slider.",
- key = "SliderJoint:setAxis",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x component of the axis."
- },
- {
- name = "y",
- type = "number",
- description = "The y component of the axis."
- },
- {
- name = "z",
- type = "number",
- description = "The z component of the axis."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLimits",
- summary = "Set the SliderJoint's limits.",
- description = "Sets the upper and lower limits of the slider position.",
- key = "SliderJoint:setLimits",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getLowerLimit",
- "SliderJoint:setLowerLimit",
- "SliderJoint:getUpperLimit",
- "SliderJoint:setUpperLimit"
- },
- variants = {
- {
- arguments = {
- {
- name = "lower",
- type = "number",
- description = "The lower limit."
- },
- {
- name = "upper",
- type = "number",
- description = "The upper limit."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLowerLimit",
- summary = "Set the SliderJoint's lower limit.",
- description = "Sets the lower limit of the slider position.",
- key = "SliderJoint:setLowerLimit",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getUpperLimit",
- "SliderJoint:setUpperLimit",
- "SliderJoint:getLimits",
- "SliderJoint:setLimits"
- },
- variants = {
- {
- arguments = {
- {
- name = "limit",
- type = "number",
- description = "The lower limit."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setUpperLimit",
- summary = "Set the SliderJoint's upper limit.",
- description = "Sets the upper limit of the slider position.",
- key = "SliderJoint:setUpperLimit",
- module = "lovr.physics",
- related = {
- "SliderJoint:getPosition",
- "SliderJoint:getLowerLimit",
- "SliderJoint:setLowerLimit",
- "SliderJoint:getLimits",
- "SliderJoint:setLimits"
- },
- variants = {
- {
- arguments = {
- {
- name = "limit",
- type = "number",
- description = "The upper limit."
- }
- },
- returns = {}
- }
- }
- }
- },
- extends = "Joint"
- },
- {
- name = "SphereShape",
- summary = "A sphere Shape.",
- description = "A type of `Shape` that can be used for spheres.",
- key = "SphereShape",
- module = "lovr.physics",
- extends = "Shape",
- constructors = {
- "lovr.physics.newSphereShape",
- "World:newSphereCollider"
- },
- methods = {
- {
- name = "getDimensions",
- summary = "Get the radius of the SphereShape.",
- description = "Returns the radius of the SphereShape.",
- key = "SphereShape:getDimensions",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the sphere, in meters."
- }
- }
- }
- }
- },
- {
- name = "setDimensions",
- summary = "Set the radius of the SphereShape.",
- description = "Sets the radius of the SphereShape.",
- key = "SphereShape:setDimensions",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "radius",
- type = "number",
- description = "The radius of the sphere, in meters."
- }
- },
- returns = {}
- }
- }
- }
- }
- },
- {
- name = "World",
- summary = "An independent physics simulation.",
- description = "A World is an object that holds the colliders, joints, and shapes in a physics simulation.",
- key = "World",
- module = "lovr.physics",
- methods = {
- {
- name = "collide",
- tag = "worldCollision",
- summary = "Attempt to collide two shapes.",
- description = "Attempt to collide two shapes. Internally this uses joints and forces to ensure the colliders attached to the shapes do not pass through each other. Collisions can be customized using friction and restitution (bounciness) parameters, and default to using a mix of the colliders' friction and restitution parameters. Usually this is called automatically by `World:update`.",
- key = "World:collide",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "shapeA",
- type = "Shape",
- description = "The first shape."
- },
- {
- name = "shapeB",
- type = "Shape",
- description = "The second shape."
- },
- {
- name = "friction",
- type = "number",
- description = "The friction parameter for the collision.",
- default = "nil"
- },
- {
- name = "restitution",
- type = "number",
- description = "The restitution (bounciness) parameter for the collision.",
- default = "nil"
- }
- },
- returns = {
- {
- name = "collided",
- type = "boolean",
- description = "Whether the shapes collided."
- }
- }
- }
- },
- related = {
- "World:computeOverlaps",
- "World:overlaps",
- "World:disableCollisionBetween",
- "World:enableCollisionBetween",
- "World:isCollisionEnabledBetween"
- },
- notes = "For friction, numbers in the range of 0-1 are common, but larger numbers can also be used.\n\nFor restitution, numbers in the range 0-1 should be used.\n\nThis function respects collision tags, so using `World:disableCollisionBetween` and `World:enableCollisionBetween` will change the behavior of this function."
- },
- {
- name = "computeOverlaps",
- tag = "worldCollision",
- summary = "Compute pairs of shapes that are close to each other.",
- description = "Detects which pairs of shapes in the world are near each other and could be colliding. After calling this function, the `World:overlaps` iterator can be used to iterate over the overlaps, and `World:collide` can be used to resolve a collision for the shapes (if any). Usually this is called automatically by `World:update`.",
- key = "World:computeOverlaps",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- examples = {
- {
- code = "world:computeOverlaps()\nfor shapeA, shapeB in world:overlaps() do\n local areColliding = world:collide(shapeA, shapeB)\n print(shapeA, shapeB, areColliding)\nend"
- }
- },
- related = {
- "World:overlaps",
- "World:collide",
- "World:update"
- }
- },
- {
- name = "destroy",
- tag = "worldBasics",
- summary = "Destroy the World!! Muahaha!",
- description = "Destroy the World!",
- key = "World:destroy",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- },
- notes = "Bad things will happen if you destroy the world and then try to access it or anything that was in it."
- },
- {
- name = "disableCollisionBetween",
- tag = "worldCollision",
- summary = "Disable collision between two tags.",
- description = "Disables collision between two collison tags.",
- key = "World:disableCollisionBetween",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "tag1",
- type = "string",
- description = "The first tag."
- },
- {
- name = "tag2",
- type = "string",
- description = "The second tag."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.physics.newWorld",
- "World:enableCollisionBetween",
- "World:isCollisionEnabledBetween"
- },
- notes = "Tags must be set up when creating the World, see `lovr.physics.newWorld`.\n\nBy default, collision is enabled between all tags."
- },
- {
- name = "enableCollisionBetween",
- tag = "worldCollision",
- summary = "Enable collision between two tags.",
- description = "Enables collision between two collison tags.",
- key = "World:enableCollisionBetween",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "tag1",
- type = "string",
- description = "The first tag."
- },
- {
- name = "tag2",
- type = "string",
- description = "The second tag."
- }
- },
- returns = {}
- }
- },
- related = {
- "lovr.physics.newWorld",
- "World:disableCollisionBetween",
- "World:isCollisionEnabledBetween"
- },
- notes = "Tags must be set up when creating the World, see `lovr.physics.newWorld`.\n\nBy default, collision is enabled between all tags."
- },
- {
- name = "getAngularDamping",
- tag = "worldProperties",
- summary = "Get the angular damping of the World.",
- description = "Returns the angular damping of the World. Angular damping makes things less \"spinny\", making them slow down their angular velocity over time.",
- key = "World:getAngularDamping",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "damping",
- type = "number",
- description = "The angular damping."
- }
- }
- }
- },
- related = {
- "Collider:getAngularDamping",
- "Collider:setAngularDamping"
- },
- notes = "Angular damping can also be set on individual colliders."
- },
- {
- name = "getGravity",
- tag = "worldProperties",
- summary = "Get the gravity of the World.",
- description = "Returns the gravity of the World.",
- key = "World:getGravity",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "xg",
- type = "number",
- description = "The x component of the gravity force."
- },
- {
- name = "yg",
- type = "number",
- description = "The y component of the gravity force."
- },
- {
- name = "zg",
- type = "number",
- description = "The z component of the gravity force."
- }
- }
- }
- }
- },
- {
- name = "getLinearDamping",
- tag = "worldProperties",
- summary = "Get the linear damping of the World.",
- description = "Returns the linear damping of the World. Linear damping is similar to drag or air resistance, slowing down colliders over time as they move.",
- key = "World:getLinearDamping",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "damping",
- type = "number",
- description = "The linear damping."
- }
- }
- }
- },
- related = {
- "Collider:getLinearDamping",
- "Collider:setLinearDamping"
- },
- notes = "A linear damping of 0 means colliders won't slow down over time.\n\nLinear damping can also be set on individual colliders."
- },
- {
- name = "isCollisionEnabledBetween",
- tag = "worldCollision",
- summary = "Check if two tags can collide.",
- description = "Returns whether collisions are currently enabled between two tags.",
- key = "World:isCollisionEnabledBetween",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "tag1",
- type = "string",
- description = "The first tag."
- },
- {
- name = "tag2",
- type = "string",
- description = "The second tag."
- }
- },
- returns = {
- {
- name = "enabled",
- type = "boolean",
- description = "Whether or not two colliders with the specified tags will collide."
- }
- }
- }
- },
- related = {
- "lovr.physics.newWorld",
- "World:disableCollisionBetween",
- "World:enableCollisionBetween"
- },
- notes = "Tags must be set up when creating the World, see `lovr.physics.newWorld`.\n\nBy default, collision is enabled between all tags."
- },
- {
- name = "isSleepingAllowed",
- tag = "worldProperties",
- summary = "Check if colliders can go to sleep.",
- description = "Returns whether colliders can go to sleep in the World.",
- key = "World:isSleepingAllowed",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "allowed",
- type = "boolean",
- description = "Whether colliders can sleep."
- }
- }
- }
- },
- related = {
- "Collider:isSleepingAllowed",
- "Collider:setSleepingAllowed",
- "Collider:isAwake",
- "Collider:setAwake"
- },
- notes = "If sleeping is enabled, the World will try to detect colliders that haven't moved for a while and put them to sleep. Sleeping colliders don't impact the physics simulation, which makes updates more efficient and improves physics performance. However, the physics engine isn't perfect at waking up sleeping colliders and this can lead to bugs where colliders don't react to forces or collisions properly.\n\nThis can be set on individual colliders.\n\nColliders can be manually put to sleep or woken up using `Collider:setAwake`."
- },
- {
- name = "newBoxCollider",
- tag = "colliders",
- summary = "Add a Collider with a BoxShape to the World.",
- description = "Adds a new Collider to the World with a BoxShape already attached.",
- key = "World:newBoxCollider",
- module = "lovr.physics",
- related = {
- "BoxShape",
- "Collider",
- "World:newCollider",
- "World:newCapsuleCollider",
- "World:newCylinderCollider",
- "World:newSphereCollider"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the box.",
- default = "0"
- },
- {
- name = "width",
- type = "number",
- description = "The total width of the box, in meters.",
- default = "1"
- },
- {
- name = "height",
- type = "number",
- description = "The total height of the box, in meters.",
- default = "width"
- },
- {
- name = "depth",
- type = "number",
- description = "The total depth of the box, in meters.",
- default = "width"
- }
- },
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The new Collider."
- }
- }
- }
- }
- },
- {
- name = "newCapsuleCollider",
- tag = "colliders",
- summary = "Add a Collider with a CapsuleShape to the World.",
- description = "Adds a new Collider to the World with a CapsuleShape already attached.",
- key = "World:newCapsuleCollider",
- module = "lovr.physics",
- related = {
- "CapsuleShape",
- "Collider",
- "World:newCollider",
- "World:newBoxCollider",
- "World:newCylinderCollider",
- "World:newSphereCollider"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the capsule.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the capsule.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the capsule.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the capsule, in meters.",
- default = "1"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the capsule, not including the caps, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The new Collider."
- }
- }
- }
- }
- },
- {
- name = "newCollider",
- tag = "colliders",
- summary = "Add a Collider to the World.",
- description = "Adds a new Collider to the World.",
- key = "World:newCollider",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x position of the Collider.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y position of the Collider.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z position of the Collider.",
- default = "0"
- }
- },
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The new Collider."
- }
- }
- }
- },
- related = {
- "World:newBoxCollider",
- "World:newCapsuleCollider",
- "World:newCylinderCollider",
- "World:newSphereCollider",
- "Collider",
- "Shape"
- },
- examples = {
- {
- description = "Create a new world, add a collider to it, and update it, printing out the collider's position as it falls.",
- code = "function lovr.load()\n world = lovr.physics.newWorld()\n box = world:newBoxCollider()\nend\n\nfunction lovr.update(dt)\n world:update(dt)\n print(box:getPosition())\nend"
- }
- },
- notes = "This function creates a collider without any shapes attached to it, which means it won't collide with anything. To add a shape to the collider, use `Collider:addShape`, or use one of the following functions to create the collider:\n\n- `World:newBoxCollider`\n- `World:newCapsuleCollider`\n- `World:newCylinderCollider`\n- `World:newSphereCollider`"
- },
- {
- name = "newCylinderCollider",
- tag = "colliders",
- summary = "Add a Collider with a CylinderShape to the World.",
- description = "Adds a new Collider to the World with a CylinderShape already attached.",
- key = "World:newCylinderCollider",
- module = "lovr.physics",
- related = {
- "CylinderShape",
- "Collider",
- "World:newCollider",
- "World:newBoxCollider",
- "World:newCapsuleCollider",
- "World:newSphereCollider"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the cylinder.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the cylinder.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the cylinder.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the cylinder, in meters.",
- default = "1"
- },
- {
- name = "length",
- type = "number",
- description = "The length of the cylinder, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The new Collider."
- }
- }
- }
- }
- },
- {
- name = "newSphereCollider",
- tag = "colliders",
- summary = "Add a Collider with a SphereShape to the World.",
- description = "Adds a new Collider to the World with a SphereShape already attached.",
- key = "World:newSphereCollider",
- module = "lovr.physics",
- related = {
- "SphereShape",
- "Collider",
- "World:newCollider",
- "World:newBoxCollider",
- "World:newCapsuleCollider",
- "World:newCylinderCollider"
- },
- variants = {
- {
- arguments = {
- {
- name = "x",
- type = "number",
- description = "The x coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "y",
- type = "number",
- description = "The y coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "z",
- type = "number",
- description = "The z coordinate of the center of the sphere.",
- default = "0"
- },
- {
- name = "radius",
- type = "number",
- description = "The radius of the sphere, in meters.",
- default = "1"
- }
- },
- returns = {
- {
- name = "collider",
- type = "Collider",
- description = "The new Collider."
- }
- }
- }
- }
- },
- {
- name = "overlaps",
- tag = "worldCollision",
- summary = "Iterate over pairs of nearby shapes.",
- description = "Returns an iterator that can be used to iterate over \"overlaps\", or potential collisions between pairs of shapes in the World. This should be called after using `World:detectOverlaps` to compute the list of overlaps. Usually this is called automatically by `World:update`.",
- key = "World:overlaps",
- module = "lovr.physics",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "iterator",
- type = "function",
- description = "A Lua iterator, usable in a for loop.",
- arguments = {},
- returns = {}
- }
- }
- }
- },
- examples = {
- {
- code = "world:computeOverlaps()\nfor shapeA, shapeB in world:overlaps() do\n local areColliding = world:collide(shapeA, shapeB)\n print(shapeA, shapeB, areColliding)\nend"
- }
- },
- related = {
- "World:computeOverlaps",
- "World:collide",
- "World:update"
- }
- },
- {
- name = "raycast",
- tag = "worldBasics",
- summary = "Cast a ray through the World.",
- description = "Casts a ray through the World, calling a function every time the ray intersects with a Shape.",
- key = "World:raycast",
- module = "lovr.physics",
- notes = "The callback is passed the shape that was hit, the hit position, and the normal vector of the hit.",
- variants = {
- {
- arguments = {
- {
- name = "x1",
- type = "number",
- description = "The x coordinate of the starting position of the ray."
- },
- {
- name = "y1",
- type = "number",
- description = "The y coordinate of the starting position of the ray."
- },
- {
- name = "z1",
- type = "number",
- description = "The z coordinate of the starting position of the ray."
- },
- {
- name = "x2",
- type = "number",
- description = "The x coordinate of the ending position of the ray."
- },
- {
- name = "y2",
- type = "number",
- description = "The y coordinate of the ending position of the ray."
- },
- {
- name = "z2",
- type = "number",
- description = "The z coordinate of the ending position of the ray."
- },
- {
- name = "callback",
- type = "function",
- description = "The function to call when an intersection is detected.",
- arguments = {
- {
- name = "shape",
- type = "Shape"
- },
- {
- name = "x",
- type = "number"
- },
- {
- name = "y",
- type = "number"
- },
- {
- name = "z",
- type = "number"
- },
- {
- name = "nx",
- type = "number"
- },
- {
- name = "ny",
- type = "number"
- },
- {
- name = "nz",
- type = "number"
- }
- },
- returns = {}
- }
- },
- returns = {}
- }
- },
- examples = {
- {
- code = "function lovr.load()\n world = lovr.physics.newWorld()\n world:newSphereCollider(0, 0, 0, 2)\n\n -- Cast a ray through the sphere\n local x1, y1, z1 = .5, 3, 0\n local x2, y2, z2 = -.5, -2, 0\n world:raycast(x1, y1, z1, x2, y2, z2, function(shape, x, y, z, nx, ny, nz)\n print('Collision detected!', shape, x, y, z, nx, ny, nz)\n end)\nend"
- }
- }
- },
- {
- name = "setAngularDamping",
- tag = "worldProperties",
- summary = "Set the angular damping of the World.",
- description = "Sets the angular damping of the World. Angular damping makes things less \"spinny\", making them slow down their angular velocity over time.",
- key = "World:setAngularDamping",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "damping",
- type = "number",
- description = "The angular damping."
- }
- },
- returns = {}
- }
- },
- related = {
- "Collider:getAngularDamping",
- "Collider:setAngularDamping"
- },
- notes = "Angular damping can also be set on individual colliders."
- },
- {
- name = "setGravity",
- tag = "worldProperties",
- summary = "Set the gravity of the World.",
- description = "Sets the gravity of the World.",
- key = "World:setGravity",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "xg",
- type = "number",
- description = "The x component of the gravity force."
- },
- {
- name = "yg",
- type = "number",
- description = "The y component of the gravity force."
- },
- {
- name = "zg",
- type = "number",
- description = "The z component of the gravity force."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "setLinearDamping",
- tag = "worldProperties",
- summary = "Set the linear damping of the World.",
- description = "Sets the linear damping of the World. Linear damping is similar to drag or air resistance, slowing down colliders over time as they move.",
- key = "World:setLinearDamping",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "damping",
- type = "number",
- description = "The linear damping."
- }
- },
- returns = {}
- }
- },
- related = {
- "Collider:getLinearDamping",
- "Collider:setLinearDamping"
- },
- notes = "A linear damping of 0 means colliders won't slow down over time.\n\nLinear damping can also be set on individual colliders."
- },
- {
- name = "setSleepingAllowed",
- tag = "worldProperties",
- summary = "Set whether colliders can go to sleep.",
- description = "Sets whether colliders can go to sleep in the World.",
- key = "World:setSleepingAllowed",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "allowed",
- type = "boolean",
- description = "Whether colliders can sleep."
- }
- },
- returns = {}
- }
- },
- related = {
- "Collider:isSleepingAllowed",
- "Collider:setSleepingAllowed",
- "Collider:isAwake",
- "Collider:setAwake"
- },
- notes = "If sleeping is enabled, the World will try to detect colliders that haven't moved for a while and put them to sleep. Sleeping colliders don't impact the physics simulation, which makes updates more efficient and improves physics performance. However, the physics engine isn't perfect at waking up sleeping colliders and this can lead to bugs where colliders don't react to forces or collisions properly.\n\nThis can be set on individual colliders.\n\nColliders can be manually put to sleep or woken up using `Collider:setAwake`."
- },
- {
- name = "update",
- tag = "worldBasics",
- summary = "Update the World.",
- description = "Updates the World, advancing the physics simulation forward in time and resolving collisions between colliders in the World.",
- key = "World:update",
- module = "lovr.physics",
- variants = {
- {
- arguments = {
- {
- name = "dt",
- type = "number",
- description = "The amount of time to advance the simultion forward."
- },
- {
- name = "resolver",
- type = "function",
- description = "The collision resolver function to use. This will be called before updating to allow for custom collision processing. If absent, a default will be used.",
- arguments = {
- {
- name = "world",
- type = "World"
- }
- },
- returns = {},
- default = "nil"
- }
- },
- returns = {}
- }
- },
- related = {
- "World:computeOverlaps",
- "World:overlaps",
- "World:collide"
- },
- notes = "It is common to pass the `dt` variable from `lovr.update` into this function.\n\nThe default collision resolver function is:\n\n function defaultResolver(world)\n world:computeOverlaps()\n for shapeA, shapeB in world:overlaps() do\n world:collide(shapeA, shapeB)\n end\n end\n\nAdditional logic could be introduced to the collision resolver function to add custom collision behavior or to change the collision parameters (like friction and restitution) on a per-collision basis.\n\n> If possible, use a fixed timestep value for updating the World. It will greatly improve the\n> accuracy of the simulation and reduce bugs. For more information on implementing a fixed\n> timestep loop, see [this article](http://gafferongames.com/game-physics/fix-your-timestep/)."
- }
- },
- sections = {
- {
- name = "Basics",
- tag = "worldBasics"
- },
- {
- name = "Colliders",
- tag = "colliders",
- description = "The following functions add Colliders to the World. `World:newCollider` adds an \"empty\" Collider without any Shapes attached, whereas the other functions are shortcut functions to add Colliders with Shapes already attached to them."
- },
- {
- name = "Properties",
- tag = "worldProperties",
- description = "The following functions are global properties of the simulation that apply to all new Colliders."
- },
- {
- name = "Collision",
- tag = "worldCollision",
- description = "When the World is created using `lovr.physics.newWorld`, it is possible to specify a list of collision tags for the World. Colliders can then be assigned a tag. You can enable and disable collision between pairs of tags. There are also some helper functions to quickly identify pairs of colliders that are near each other and test whether or not they are colliding. These are used internally by default by `World:update`, but you can override this behavior and use the functions directly for custom collision behavior."
- }
- },
- notes = "Be sure to update the World in `lovr.update` using `World:update`, otherwise everything will stand still.",
- constructors = {
- "lovr.physics.newWorld"
- }
- }
- }
- },
- {
- name = "thread",
- tag = "modules",
- summary = "Allows you to work with background threads.",
- description = "The `lovr.thread` module provides functions for creating threads and communicating between them.\n\nThese are operating system level threads, which are different from Lua coroutines.\n\nThreads are useful for performing expensive background computation without affecting the framerate or performance of the main thread. Some examples of this include asset loading, networking and network requests, and physics simulation.\n\nThreads come with some limitations though.\n\n- Threads are completely isolated from other threads. They do not have access to the variables\n or functions of other threads, and communication between threads must be coordinated through\n `Channel` objects.\n- The graphics module (or any functions that perform rendering) cannot be used in a thread.\n Note that this includes creating graphics objects like Models and Textures. There are \"data\"\n equivalent `ModelData` and `TextureData` objects that can be used in threads though.\n- `lovr.event.pump` cannot be called from a thread.\n- Crashes or problems can happen if two threads access the same object at the same time, so\n special care must be taken to coordinate access to objects from multiple threads.",
- key = "lovr.thread",
- functions = {
- {
- name = "getChannel",
- summary = "Get a Channel for communicating between threads.",
- description = "Returns a named Channel for communicating between threads.",
- key = "lovr.thread.getChannel",
- module = "lovr.thread",
- related = {
- "Channel"
- },
- variants = {
- {
- arguments = {
- {
- name = "name",
- type = "string",
- description = "The name of the Channel to get."
- }
- },
- returns = {
- {
- name = "channel",
- type = "Channel",
- description = "The Channel with the specified name."
- }
- }
- }
- }
- },
- {
- name = "newThread",
- summary = "Create a new Thread.",
- description = "Creates a new Thread from Lua code.",
- key = "lovr.thread.newThread",
- module = "lovr.thread",
- related = {
- "Thread:start",
- "lovr.threaderror"
- },
- variants = {
- {
- arguments = {
- {
- name = "body",
- type = "string",
- description = "The code to run in the Thread."
- }
- },
- returns = {
- {
- name = "thread",
- type = "Thread",
- description = "The new Thread."
- }
- }
- }
- },
- notes = "The Thread won't start running immediately. Use `Thread:start` to start it."
- }
- },
- enums = {},
- objects = {
- {
- name = "Channel",
- summary = "A message channel for communicating between threads.",
- description = "A Channel is an object used to communicate between `Thread` objects. Channels are obtained by name using `lovr.thread.getChannel`. Different threads can send messages on the same Channel to communicate with each other. Messages can be sent and received on a Channel using `Channel:push` and `Channel:pop`. The following types of data can be passed through Channels: nil, boolean, number, string, and any LÖVR object.",
- key = "Channel",
- module = "lovr.thread",
- methods = {
- {
- name = "clear",
- summary = "Clear all messages from the Channel.",
- description = "Removes all pending messages from the Channel.",
- key = "Channel:clear",
- module = "lovr.thread",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "hasRead",
- summary = "Get whether a message has been read.",
- description = "Returns whether or not the message with the given ID has been read. Every call to `Channel:push` returns a message ID.",
- key = "Channel:hasRead",
- module = "lovr.thread",
- related = {
- "Channel:push"
- },
- variants = {
- {
- arguments = {
- {
- name = "id",
- type = "number",
- description = "The ID of the message to check."
- }
- },
- returns = {
- {
- name = "read",
- type = "boolean",
- description = "Whether the message has been read."
- }
- }
- }
- }
- },
- {
- name = "peek",
- summary = "Look at a message from the Channel without popping it.",
- description = "Returns a message from the Channel without popping it from the queue. If the Channel is empty, `nil` is returned. This can be useful to determine if the Channel is empty.",
- key = "Channel:peek",
- module = "lovr.thread",
- related = {
- "Channel:pop"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "message",
- type = "*",
- description = "The message."
- }
- }
- }
- }
- },
- {
- name = "pop",
- summary = "Pop a message from the Channel.",
- description = "Pops a message from the Channel. If the Channel is empty, an optional timeout argument can be used to wait for a message, otherwise `nil` is returned.",
- key = "Channel:pop",
- module = "lovr.thread",
- related = {
- "Channel:peek",
- "Channel:push"
- },
- variants = {
- {
- arguments = {
- {
- name = "wait",
- type = "number",
- description = "How long to wait for the message to be popped. `true` can be used to wait forever and `false` can be used to avoid waiting.",
- default = "false"
- }
- },
- returns = {
- {
- name = "message",
- type = "*",
- description = "The received message, or `nil` if nothing was received."
- }
- }
- }
- },
- notes = "Threads can get stuck forever waiting on Channel messages, so be careful."
- },
- {
- name = "push",
- summary = "Push a message onto the Channel.",
- description = "Pushes a message onto the Channel. The following types of data can be pushed: nil, boolean, number, string, and userdata. Simple tables can be serialized to JSON using the `json` module.",
- key = "Channel:push",
- module = "lovr.thread",
- related = {
- "Channel:pop",
- "Channel:hasRead"
- },
- variants = {
- {
- arguments = {
- {
- name = "message",
- type = "*",
- description = "The message to push."
- },
- {
- name = "wait",
- type = "number",
- description = "How long to wait for the message to be popped, in seconds. `true` can be used to wait forever and `false` can be used to avoid waiting.",
- default = "false"
- }
- },
- returns = {
- {
- name = "id",
- type = "number",
- description = "The ID of the pushed message."
- },
- {
- name = "read",
- type = "boolean",
- description = "Whether the message was read by another thread before the wait timeout."
- }
- }
- }
- },
- notes = "Threads can get stuck forever waiting on Channel messages, so be careful."
- }
- },
- constructors = {
- "lovr.thread.getChannel"
- }
- },
- {
- name = "Thread",
- summary = "A separate thread of execution that can run code in parallel with other threads.",
- description = "A Thread is an object that runs a chunk of Lua code in the background. Threads are completely isolated from other threads, meaning they have their own Lua context and can't access the variables and functions of other threads. Communication between threads is limited and is accomplished by using `Channel` objects.",
- key = "Thread",
- module = "lovr.thread",
- methods = {
- {
- name = "getError",
- summary = "Get the Thread's error message.",
- description = "Returns the message for the error that occurred on the Thread, or nil if no error has occurred.",
- key = "Thread:getError",
- module = "lovr.thread",
- related = {
- "lovr.threaderror"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "error",
- type = "string",
- description = "The error message, or `nil` if no error has occurred on the Thread."
- }
- }
- }
- }
- },
- {
- name = "isRunning",
- summary = "Check if the Thread is running.",
- description = "Returns whether or not the Thread is currently running.",
- key = "Thread:isRunning",
- module = "lovr.thread",
- related = {
- "Thread:start"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "running",
- type = "boolean",
- description = "Whether or not the Thread is running."
- }
- }
- }
- }
- },
- {
- name = "start",
- summary = "Start the Thread.",
- description = "Starts the Thread.",
- key = "Thread:start",
- module = "lovr.thread",
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- },
- {
- name = "wait",
- summary = "Wait for the Thread to complete.",
- description = "Waits for the Thread to complete, then returns.",
- key = "Thread:wait",
- module = "lovr.thread",
- related = {
- "Thread:isRunning"
- },
- variants = {
- {
- arguments = {},
- returns = {}
- }
- }
- }
- },
- constructors = {
- "lovr.thread.newThread"
- },
- related = {
- "lovr.threaderror",
- "Channel"
- }
- }
- }
- },
- {
- name = "timer",
- tag = "modules",
- summary = "Exposes a high resolution timer.",
- description = "The `lovr.timer` module provides a few functions that deal with time. All times are measured in seconds.",
- key = "lovr.timer",
- functions = {
- {
- name = "getAverageDelta",
- summary = "Get the average delta over the last second.",
- description = "Returns the average delta over the last second.",
- key = "lovr.timer.getAverageDelta",
- module = "lovr.timer",
- related = {
- "lovr.timer.getDelta",
- "lovr.update"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "delta",
- type = "number",
- description = "The average delta, in seconds."
- }
- }
- }
- }
- },
- {
- name = "getDelta",
- summary = "Get the time elapsed since the last update.",
- description = "Returns the time between the last two frames. This is the same value as the `dt` argument provided to `lovr.update`.",
- key = "lovr.timer.getDelta",
- module = "lovr.timer",
- related = {
- "lovr.timer.getTime",
- "lovr.update"
- },
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "dt",
- type = "number",
- description = "The delta time, in seconds."
- }
- }
- }
- },
- notes = "The return value of this function will remain the same until `lovr.timer.step` is called. This function should not be used to measure times for game behavior or benchmarking, use `lovr.timer.getTime` for that."
- },
- {
- name = "getFPS",
- summary = "Get the current frames per second.",
- description = "Returns the current frames per second, averaged over the last 90 frames.",
- key = "lovr.timer.getFPS",
- module = "lovr.timer",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "fps",
- type = "number",
- description = "The current FPS."
- }
- }
- }
- }
- },
- {
- name = "getTime",
- summary = "Get the current time.",
- description = "Returns the time since some time in the past. This can be used to measure the difference between two points in time.",
- key = "lovr.timer.getTime",
- module = "lovr.timer",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "time",
- type = "number",
- description = "The current time, in seconds."
- }
- }
- }
- }
- },
- {
- name = "sleep",
- summary = "Go to sleep.",
- description = "Sleeps the application for a specified number of seconds. While the game is asleep, no code will be run, no graphics will be drawn, and the window will be unresponsive.",
- key = "lovr.timer.sleep",
- module = "lovr.timer",
- variants = {
- {
- arguments = {
- {
- name = "duration",
- type = "number",
- description = "The number of seconds to sleep for."
- }
- },
- returns = {}
- }
- }
- },
- {
- name = "step",
- summary = "Steps the internal clock.",
- description = "Steps the timer, returning the new delta time. This is called automatically in `lovr.run` and it's used to calculate the new `dt` to pass to `lovr.update`.",
- key = "lovr.timer.step",
- module = "lovr.timer",
- variants = {
- {
- arguments = {},
- returns = {
- {
- name = "delta",
- type = "number",
- description = "The amount of time since the last call to this function, in seconds."
- }
- }
- }
- }
- }
- },
- enums = {},
- objects = {}
- }
- }
- }
|