- Remove orientation arguments from `lovr.graphics.skybox`, rotation is automatically applied.
- Remove `Pool` objects, there is a default temporary vector Pool built in to `lovr.math`.
- Remove `t.gammacorrect` conf flag, all rendering is gamma correct now.
v0.12.0 - 2019-02-14
---
### Add
- Add an Android port, with official support for the Oculus Go and Gear VR.
- Add support for the Oculus Desktop SDK (LibOVR).
- Add automatic batching and instancing of draw calls.
- Add `vec3`, `mat4`, `quat`, and `Pool` objects to `lovr.math`.
- Add support for Vive trackers (they are exposed as Controllers).
- Add `go` and `gear` HeadsetTypes.
- Add `oculus` and `oculusmobile` HeadsetDrivers.
- Add the `lovr.mirror` callback for custom rendering to the desktop window.
- Add `Controller:getVelocity` and `Controller:getAngularVelocity`.
- Add `Curve` objects for working with Bézier curves.
- Add `Canvas:getDepthTexture`.
- Add `lovr.headset.getBoundsGeometry` (again).
- Add `lovr.headset.getMirrorTexture`.
- Add `lovr.graphics.discard`.
- Add `lovr.graphics.flush`.
- Add `lovr.graphics.setAlphaSampling` and `lovr.graphics.getAlphaSampling`.
- Add `lovr.graphics.setProjection`.
- Add `lovr.graphics.getPixelDensity`.
- Add `lovr.graphics.hasWindow`.
- Add `ubyte`, `short`, `ushort`, and `uint` types for Mesh attributes.
- Add `Font:hasGlyphs`.
- Add `Font:getRasterizer`.
- Add `Font:isFlipEnabled` and `Font:setFlipEnabled`.
- Add `ShaderBlock:read`.
- Add `lovr.filesystem.getApplicationId`.
- Add the `--root` command line argument to run a project from a directory inside an archive.
- Add a default HTML file used in the emscripten build, so you don't need to write it yourself.
### Change
- Change API functions to accept vectors and matrices in addition to numbers, where relevant.
- Change some matrix and vector math functions to use SIMD intrinsics.
- Change `lovr.headset.setMirrored` and the `t.headset.mirrored` conf.lua flag to take a HeadsetEye.
- Change the mirror window to use the currently active color and shader.
- Change `lovr.graphics.setBlendMode` to accept `nil` to disable blending.
- Change `lovr.graphics.triangle` to take multiple triangles to draw.
- Change `lovr.graphics.cylinder` to take position, rotation, and scale (length) arguments.
- Change `lovr.graphics.newShaderBlock` to take a `BlockType` instead of a `writable` flag.
- Change `lovr.graphics.newMesh` and `lovr.graphics.newShaderBlock` to accept a `readable` flag.
- Change `lovr.graphics.fill` to accept a subregion of the input Texture to use.
- Change `emissive` colors in Materials to default to black instead of white.
- Change `lovr.graphics.getSystemLimits` to return the maximum ShaderBlock size (`blocksize`).
- Change `lovr.filesystem.mount` to accept a path inside the archive to mount.
- Change the `depth` flag of `lovr.graphics.newCanvas` to additionally accept a table with `format` and `readable` keys for creating a Canvas with a readable depth buffer.
- Change `Animator` functions to accept both animation names and indices.
- Change `DrawMode` to `DrawStyle` and `MeshDrawMode` to `DrawMode` (enum values are unchanged).
- Change `DepthFormat` to be merged into `TextureFormat` (enum values are unchanged).
- Change `lovr.graphics.newCanvas` to create Textures with the `clamp` TextureWrap.
- Change `Font:setPixelDensity` to accept `nil` to reset the density to the default.
- Change the `computeshaders` graphics feature to `compute`.
- Change the default font to Varela Round.
- Change `lovr.getOS` to return `Android` on Android.
- Change build system to be more modular and configurable. Modules can be individually included or excluded, and it's possible to choose whether to use libraries already on the system or compile them from the `deps` folder.
### Fix
- Fix a bug where `lovr.filesystem.unmount` was not exposed.
- Fix a memory corruption when using `Channel:peek`.
- Fix a bug where Microphones wouldn't clean up properly when they were destroyed.
- Fix fonts to render tabs as four spaces instead of...whatever they were doing.
- Add `Microphone` objects, `lovr.audio.getMicrophoneNames`, and `lovr.audio.newMicrophone`.
- Add `SoundData` objects for accessing individual samples of sound files and `Source:getType`.
- Add support for compute shaders via `lovr.graphics.newComputeShader` and `lovr.graphics.compute`.
- Add `ShaderBlock` objects for efficiently sending large amounts of data to Shaders.
- Add `AudioStream:decode` to decode a chunk of audio and return it as a SoundData.
- Add a new `lineloop` value for `MeshDrawMode`.
- Add `lovr.math.noise` for perlin noise.
- Support `require`ing C libraries (.dll, .so) files as LÖVR modules.
- Add `Material:setTransform` and `Material:getTransform` for using subregions of textures or applying other texture coordinate transformations.
- Add `Texture:getMipmapCount`.
- Add support for new Texture/Canvas formats: `rgba4`, `r16f`, `r32f`, `rg16f`, `rg32f`, `rgb5a1`, `rgb10a2`.
- Add support for loading HDR image files in unclipped floating point texture formats.
- Add `Texture:getFormat`.
- Add `conf.headset.msaa` to control the antialiasing of the headset Canvas (it can be different from the MSAA of the desktop window now).
- Add `lovr.graphics.getSupported` so you can figure out if compute shaders are supported.
### Change
- Change rendering to use single pass stereo rendering on supported graphics cards. This renders both eyes at the same time which should reduce CPU usage and nearly double rendering performance.
- Change fonts to use stb_truetype instead of FreeType, which seems to improve text quality.
- Change `lovr.audio.newSource` to accept a `SourceType` so you can create a Source backed by either an AudioStream or a SoundData.
- Change `lovr.graphics.newShader` to accept Blobs containing shader source code.
- Change `lovr.filesystem.getRequirePath` and `lovr.filesystem.setRequirePath` to support C require paths.
- Change the default `lovr.filesystem` to look in `lua_modules` for Lua modules for better luarocks integration.
- Change `Texture:replacePixels` to accept an x/y offset and a mipmap level to replace.
- Change `Texture:getWidth`, `Texture:getHeight`, and `Texture:getDimensions` to accept an optional mipmap level.
- Change `lovr.graphics.newShader` to work with strings longer than 8,192 characters.
- Change `lovr.data.newTextureData` to support an optional texture format.
- Change `Transform:getMatrix` to accept a table to fill with values.
### Fix
- Fix an issue where the no game screen's `conf.lua` wasn't loading properly.
- Fix `lovr.event.push` to work with custom event names.
- Fix `lovr.graphics.getBlendMode` to report correct values.
- Fix various memory leaks.
### Remove
- Remove `AudioStream:seek`.
- Remove support for COLLADA models.
- Remove support for loading tga, bmp, and gif textures.
v0.10.0 - 2018-06-13
---
### Add
- Add the `lovr.thread` module, `Thread` objects, `Channel` objects, and the `lovr.threaderror` callback.
- Add the ability to render to multiple Canvas objects simultaneously and `lovr.graphics.getCanvas` and `lovr.graphics.setCanvas`.
- Add support for 2D array textures and 3D volume textures.
- Add the `lovr.mount` callback and `lovr.headset.isMounted` for detecting when/if the headset is on a head.
- Add `lovr.data` module and `AudioStream`, `ModelData`, `Rasterizer`, `TextureData`, and `VertexData` objects.
- Add a variant of `lovr.event.quit` that restarts instead of quitting.
- Add `Texture:replacePixels` for modifying Texture contents.
- Add variants of `lovr.graphics.clear` for clearing the depth and stencil buffers to custom values.
- Add a second parameter to `lovr.graphics.setDepthTest` for controlling whether the depth buffer is written to.
- Add `ModelData:getVertexData` for access to raw vertex data in models.
- Add new `MaterialTexture`s for PBR maps: `emissive`, `metalness`, `roughness`, `occlusion`, and `normal`. They are loaded for new Models by default.
- Add `MaterialScalar`, `Material:getScalar`, and `Material:setScalar` for metalness and roughness properties.
- Add an `emissive``MaterialColor`.
- Add a `mipmaps` flag to `lovr.graphics.newTexture` and `lovr.graphics.newCanvas`.
- Add `lovr.audio.getDopplerEffect` and `lovr.audio.setDopplerEffect` (removed in a previous version).
- Add `lovrTangent` as a vec3 accessible to Shaders and load tangents from Models.
- Add `Mesh:attachAttributes` and `Mesh:detachAttributes` for improved instancing support.
- Add `lovr.filesystem.getRequirePath` and `lovr.filesystem.setRequirePath`.
- Add `lovr.filesystem.getWorkingDirectory`.
- Add `Canvas:newTextureData` for reading pixel data from Canvas objects.
### Change
- Change `lovr.timer.getFPS` to average over the last 90 frames instead of 60.
- Change `lovr.graphics.newCanvas` to error when given negative/zero sizes.
- Change `Canvas:renderTo` to error if a function isn't supplied to it.
- Change `Canvas:renderTo` to pass extra arguments to the render callback.
- Change `lovr.graphics.plane` to accept separate x/y scales for the plane.
- Change `Source:getChannels` to `Source:getChannelCount`.
- Change the fake headset driver to use right click instead of left click for the controller trigger.
- Change `lovr.controllerpressed` and `lovr.controllerreleased` to pass `nil` instead of `'unknown'` for unknown controller buttons.
- Change `lovr.graphics.newMesh` and `Mesh:setVertices` to accept a `VertexData` object to load vertices from.
- Change `Mesh:setVertexMap` to accept a `Blob` for fast vertex map updating.
- Change `Shader:send` to accept a `Blob` for updating Shaders with arbitrary binary data.
- Change `Collider:getShapeList` to `Collider:getShapes`.
- Change `Collider:getJointList` to `Collider:getJoints` and also fix it.
- Change the fake headset driver to respect the `lovr.headset.setMirrored` function.
- Change the default window size.
- Change the main loop to a cooperative coroutine-based loop.
- Change `Blob:getFilename` to `Blob:getName`.
### Fix
- Fix sphere UV coordinates to be flipped for correct texture mapping.
- Fix issues with transforms of non-animated models.
- Fix `require` when used with dot-separated module paths.
- Fix a bug where `conf.lua` would be loaded from the working directory if one wasn't present in the project.
- Fix a crash when `lovr.headset.getDisplayDimensions` was called before the first frame was rendered.
- Fix `Joint:getType` returning `nil` for DistanceJoints.
- Fix `Texture:setFilter` not doing anything for cubemap textures.
- Fix a bug where sources would sometimes not be able to play again after ending.
- Fix `lovr.audio.newSource` to show an error message when passed an invalid file.
- Fix an edge case in quaternion interpolation that caused some animations with rotations to be bad.
- Fix `Model:getAABB`.
- Fix the winding order of cubes rendered with `lovr.graphics.cube`.
- Fix `lovr.load` to correctly pass in the argument table.
### Remove
- Remove the `lovr.step` callback. It is now returned from `lovr.run`.
- Remove `lovr.headset.getBoundsGeometry`.
- Remove `lovr.headset.isPresent`.
- Remove the ability to modify the view matrix and the `MatrixType` enum.
- Remove the variant `lovr.graphics.plane(texture)` for drawing fullscreen quads, it has its own `lovr.graphics.fill` function now.
- Remove a variant of `lovr.filesystem.newBlob` that creates a Blob from a string, use `lovr.data.newBlob` instead.
v0.9.1 - 2017-12-31
---
### Add
- Add `Canvas` objects.
- Add floating point texture formats.
- Add official support for Windows Mixed Reality headsets through OpenVR.
- Add `lovr.graphics.stencil`, `lovr.graphics.getStencilTest`, and `lovr.graphics.setStencilTest`.
- Add `lovr.headset.getPose` and `Controller:getPose`.
- Add `lovr.graphics.getStats`.
### Change
- Change error messages to be better when requiring or loading files that don't exist.
### Fix
- Fix a bug where updating array uniforms wasn't working.
- Fix a bug where animations had their weight initially set to 0.
- Fix a bug where controller render models weren't working properly.
### Remove
- Remove `Texture:renderTo` and variants of `lovr.graphics.newTexture` that created framebuffers.
- Remove `lovr.headset.getEyePosition`. An HeadsetEye can now optionally be specified as the first argument to `lovr.headset.getPosition`, `lovr.headset.getOrientation`, and `lovr.headset.getPose`.
v0.9.0 - 2017-12-01
---
### Add
- Add `Material` objects. Materials are sets of colors and textures that can be applied to Models and Meshes. Models automatically load referenced materials and textures.
- Add `Animator` objects for skeletal animation playback.
- Add fallback mouse/keyboard controls used when VR hardware is not present.
- Add support for loading glTF models.
- Add gamma correct rendering, `lovr.graphics.isGammaCorrect`, and the `gammacorrect` option to `conf.lua`.
- Add `lovr.math.gammaToLinear` and `lovr.math.linearToGamma`.
- Add `lovr.graphics.circle`.
- Add `lovr.graphics.arc`.
- Add `lovr.math.orientationToDirection`.
- Add `Transform:getMatrix` and `Transform:setMatrix`.
- Add support for vertex colors and add the built in `lovrVertexColor` vertex attribute to shaders.
- Add `Model:getMesh`.
- Add `Mesh:drawInstanced` and `Model:drawInstanced`.
- Add `lines` and `linestrip` draw modes to Meshes.
- Add `Shader:hasUniform`.
- Add the ability to customize VR runtime preferences using the `headset.drivers` table in `conf.lua`.
### Change
- Change `Shader:send` to accept more types of uniforms, including arrays.
- Change `lovr.graphics.newTexture` to accept 6 arguments to create a cube map texture.
- Change functions that deal with colors to use a floating point range of 0 - 1 instead of 0 - 255.
### Fix
- Fix `Controller:getHand`, `lovr.graphics.setPointSize`, HRTF audio, and ZIP archive mounting for WebVR.
- Fix a bug with `World:raycast` that occurred when the ray hit multiple things.
- Fix loading and rendering of more complicated models with node hierarchies and multiple materials.
- Fix a bug with text rendering that caused flickering.
- Fix Shader error messages to include correct line numbers.
- Fix crash on Windows that occurred when paths had non ASCII characters.
### Remove
- Remove `Model:setTexture`, `Model:getTexture`, `Mesh:setTexture`, and `Mesh:getTexture`. They have been replaced by `Model:setMaterial`, `Model:getMaterial`, `Mesh:setMaterial`, and `Mesh:getMaterial`.
- Remove `Skybox` object. It has been replaced with `lovr.graphics.skybox`.
- Remove the ability to pass Textures as the optional first argument of drawing primitives (Materials can be passed instead).
- Remove `lovr.filesystem.exists`. The `lovr.filesystem.isFile` and `lovr.filesystem.isDirectory` functions can be used instead.
v0.8.0 - 2017-08-27
---
### Add
- Add support for Linux.
- Add official support for Oculus Touch.
- Add the `lua-enet` library for multiplayer networking.
- Add signed distance field font rendering.
- Add support for compressed textures (DXT1, DXT3, and DXT5).
- Add texture mipmaps.
- Add support for trilinear and anisotropic texture sampling.
- Add `anisotropy` system limit returned by `lovr.graphics.getSystemLimits`.
- Add `lovr.graphics.getDefaultFilter` and `lovr.graphics.setDefaultFilter`.
- Add `lovr.math.lookAt`.
- Add `lovr.math.random`, `lovr.math.randomNormal`, and `RandomGenerator` objects.
- Add new controller buttons: `unknown`, `trigger`, `a`, `b`, `x`, and `y`.
- Add the `grip``ControllerAxis`.
- Add `Controller:getHand` and `ControllerHand`.
- Add `Controller:isTouched`.
- Add `HeadsetOrigin`, `lovr.headset.getOriginType`, and `headset.offset` option to `conf.lua`.
- Add `HeadsetType`.
- Add `lovr.graphics.createWindow` and `window` options to `conf.lua`.
- Add `lovrModel` and `lovrView` uniform matrices for shaders.
- Add `MatrixType` and allow transform stack functions to manipulate either the model or the view matrix.
### Change
- Change emscripten build to compile to WebAssembly by default.
- Change `lovr.graphics.plane` to take an angle/axis orientation instead of a normal vector.
- Change `FilterMode`. The new values are `nearest`, `bilinear`, `trilinear`, and `anisotropic`.
- Change the default depth test from `less` to `lequal`.
- Change `lovr.graphics.translate`, `lovr.graphics.rotate`, `lovr.graphics.scale`, and `lovr.graphics.transform` to accept an optional `MatrixType` as the first parameter to control whether the model matrix or the view matrix is affected.
- Change the version of OpenVR to 1.0.9.
### Fix
- Fix bug where using custom fonts could cause a crash.
- Fix crash when the graphics module was disabled.
- Fix `lovr.graphics.setFont` when specifying a Font of `nil`.
- Fix fullscreen framebuffer texture coordinates.
- Fix the error screen to use a more readable font size.
- Fix `lovr.headset.getType` to return correct values.
- Fix the error reporting mechanism to capture many more kinds of errors and show the error screen for them instead of printing the message to the console and closing the window.
- Fix several graphics performance issues.
- Fix the normal matrix passed to shaders.
- Fix issues with nonuniform scaling transformations.
### Remove
- Remove `lovr.graphics.getScissor` and `lovr.graphics.setScissor`.
- Remove `lovr.graphics.getColorMask` and `lovr.graphics.setColorMask`.
- Remove undocumented `Texture:bind` function.
v0.7.1 - 2017-06-23
---
### Add
- Add `lovr.graphics.cylinder`.
- Add `lovr.graphics.sphere`.
- Add `lovr.graphics.box`.
- Add `Model:getAABB`.
- Add `lovrNormalMatrix` uniform to shaders.
### Change
- Change the minimum required OpenGL version from 2.1 to 3.3.
- Change the minimum required OpenGL ES version from 2.0 to 3.0.
- Change the minimum required WebGL version from 1.0 to 2.0.
- Change `lovr.math.newTransform`, `Transform:setTransformation`, and `lovr.graphics.transform` to accept 3 scale parameters instead of 1.
### Fix
- Fix `Mesh:getVertexMap` indices.
- Fix bug where Meshes wouldn't unmap sometimes.
- Fix `Collider:getAABB`.
- Fix `Collider:applyTorque`.
### Remove
- Remove `lovr.audio.getDopplerEffect` and `lovr.audio.setDopplerEffect`.
v0.7.0 - 2017-06-11
---
### Add
- Add `lovr.physics` module (YES!)
- Add `lovr.timer.getAverageDelta`
### Change
- Change the window to no longer be resizable.
- Change the window to have an improved title.
- Improve error messages in several places.
### Fix
- Fix unintended interactions between window mirroring and shaders.
- Fix memory leak in `require`.
- Fix lack of clean up when using Mesh vertex maps.
- Fix occasional crash when transform stack overflows.
- Fix WebVR rendering bug when drawing controllers.
v0.6.0-2017-05-06
---
### Add
- Add support for JSON encoding and decoding using lua-cjson.
### Change
- Add support for additional OpenGL versions including OpenGL ES.
- Add support for running in a web browser with WebVR.
### Fix
- Fix potential crash when loading equirectangular skyboxes.
- Fix crash on windows if the save directory does not exist.
### Remove
- Remove headset bounds visibility functions.
v0.5.0 - 2017-04-03
---
### Add
- Add a no game screen.
- Add an error screen.
- Add `lovr.controllerpressed` and `lovr.controllerreleased` callbacks.
- Add `lovr.focus` callback.
- Add support for creating skyboxes from a single equirectangular image.
- Add `lovr --version` command line flag.
- Add `lovr.getOS`.
- Add `Source:getFalloff` and `Source:setFalloff`.
- Add `Source:getVolumeLimits` and `Source:setVolumeLimits`.
- Add `Source:getCone` and `Source:setCone`.
- Add `Source:isRelative` and `Source:setRelative`.
- Add `Source:getVelocity` and `Source:setVelocity`.
- Add `lovr.audio.getVelocity` and `lovr.audio.setVelocity` (called automatically in `lovr.run`).
- Add `lovr.audio.getDopplerEffect` and `lovr.audio.setDopplerEffect`.
- Add `lovr.audio.isSpatialized`.
- Add `lovr.filesystem.load`.
- Add `lovr.filesystem.createDirectory`.
- Add `lovr.filesystem.getAppdataDirectory`.
- Add `lovr.filesystem.getDirectoryItems`.
- Add `lovr.filesystem.getLastModified`.
- Add `lovr.filesystem.getSaveDirectory`.
- Add `lovr.filesystem.getSize`.
- Add `lovr.filesystem.isFused`.
- Add `lovr.filesystem.newBlob`.
- Add `lovr.filesystem.remove`.
- Add `lovr.filesystem.mount` and `lovr.filesystem.unmount`.
- Add `Mesh:isAttributeEnabled` and `Mesh:setAttributeEnabled`.
- Add `lovr.headset.isMirrored` and `lovr.headset.setMirrored`. The initial value can be set in `conf.lua` (`t.headset.mirrored`).
- Add parameters to `lovr.graphics.print` for aligning text horizontally and vertically.
- Add `Font:getPixelDensity` and `Font:setPixelDensity` for controlling scales of fonts independent of units.
- Add `Font:getWidth`, `Font:getHeight`, `Font:getAscent`, `Font:getDescent`, and `Font:getBaseline`.
- Add `lovr.graphics.getBlendMode` and `lovr.graphics.setBlendMode`.
- Add `lovr.graphics.getSystemLimits` for returning the maximum point size, the maximum texture size, and the maximum supported msaa level for render textures.
### Change
- Rename `Buffer` to `Mesh`.
-`lovr.graphics.scale` accepts a single argument that will scale all 3 axes.
-`lovr.graphics.rotate` defaults to rotating around the y axis.
- Allow sending `Transform`s to `mat4` uniforms in shaders.
- Framebuffers now clear their depth buffer when created.
- Rename `Source:getOrientation` and `Source:setOrientation` to `Source:getDirection` and `Source:setDirection`.
- Allow `lovr.headset.getEyePosition` to accept `nil` as a parameter.
- Change the signature of `lovr.graphics.print`.
- Change functions that created resources from files to accept `Blob`s.
### Fix
- Fix coordinate system not resetting when calling `lovr.graphics.reset`.
- Explicitly error when attempting to position a stereo Source.
- Fix a few edge cases in reference counting that resulted in crashes.
- Fix a crash if the error handler caused an error.
### Remove
- Remove `Source:getOrientation` and `Source:setOrientation` (renamed to `getDirection` and `setDirection`).
- Remove support for several 3D model file formats to reduce executable size. The supported formats are now OBJ, FBX, and COLLADA.
- Remove support for several physfs archive formats to reduce executable size. The only supported format is now ZIP files.
- Remove `lovr.graphics.setProjection`.
v0.4.0 - 2017-02-17
---
### Add
- Add `lovr.math` module and `Transform` objects.
- Add `lovr.graphics.transform`.
- Add support for font rendering.
- Add `Buffer:getVertexFormat`.
- Add `lovr.headset.getEyePosition(eye)`.
### Change
- Change `lovr.graphics.cube`, `Model:draw`, and `Buffer:draw` to accept a `Transform`.
- Change `lovr.graphics.newModel` to accept a `Texture` to apply to the model as the second argument.
### Fix
- Fix memory allocation issue in `lovr.event.poll`.
- Fix crash when SteamVR is unavailable.
- Fix Skybox rendering when culling is enabled.
v0.3.0 - 2017-01-15
---
### Add
- Add support for framebuffers using `Texture:renderTo`.
- Add functions for drawing textured primitives by passing a Texture instead of a DrawMode to `lovr.graphics.cube` and `lovr.graphics.plane`.
- Add shorthand for drawing fullscreen quads with `lovr.graphics.plane(texture)`.
### Change
- Upgrade to OpenVR 1.0.5.
- headset display to the window on the desktop.
v0.2.0 - 2017-01-06
---
### Add
- Add `lovr.audio` module.
- Add support for array uniforms in Shaders.
### Fix
- Fix `lovr.headset.getOrientation` and `Controller:getOrientation`