LÖVE, the popular Lua based open source game engine, just released version 0.10. This is excellent news for me as I can now use the newest release in my upcoming complete beginners series.
So, what’s so special about this release? Well the biggest feature has to be iOS and Android support, which I think you will agree is pretty big.
That said, there are tons of new features in this release:
Changes from 0.9.2
Additions
- Added an iOS port.
- Added an Android port.
- Added support for reading accelerometer values on mobile devices. Accelerometers are exposed as 3-axis Joysticks.
- Added the flag t.accelerometerjoystick to love.conf. Disables accelerometer-as-joystick functionality on mobile devices when false.
- Added the flag t.gammacorrect to love.conf (replaces t.window.srgb.) Enabling it globally enables gamma-correct rendering, when supported.
- Added video playback support for Ogg Theora videos, via love.graphics.newVideo.
- Added love.video module. It is not used for displaying videos on-screen (see Video objects for that.)
- Added love.touch module. Note that it has important differences from the touch implementation in the LÖVE 0.9.2 Android and iOS ports.
- Added love.touch.getTouches
- Added love.touch.getPosition
- Added love.touch.getPressure
- Added love.touchpressed, love.touchreleased, and love.touchmoved.
- Added love.system.vibrate.
- Added love.filesystem.setRequirePath and love.filesystem.getRequirePath.
- Added an optional program exit status number argument to love.event.quit.
- Added love.filedropped and love.directorydropped event callback functions.
- Added love.lowmemory event callback function, called when the app is running out of memory on mobile operating systems.
- Added love.textedited event callback function, called when the user is compositing text (e.g. via an IME.)
- Added love.wheelmoved event callback function (replaces “wu” and “wd” constants for love.mousepressed.)
- Added love.mouse.hasCursor.
- Added a boolean argument to love.mousepressed and love.mousereleased indicating whether the button event originated from a touch press.
- Added love.keyboard.isScancodeDown.
- Added optional x/y/width/height arguments to love.keyboard.setTextInput. They tell the system where text will show up so on-screen keyboards can avoid that area.
- Added Source:getType (replaces Source:isStatic.)
- Added Source:getDuration and Decoder:getDuration.
- Added an optional string argument containing raw pixel data to the width/height variant of love.image.newImageData.
- Added love.graphics.ellipse.
- Added rounded-rectangle support to love.graphics.rectangle.
- Added love.graphics.points (replaces love.graphics.point.)
- Added love.graphics.intersectScissor.
- Added an optional argument to love.graphics.setBlendMode which indicates whether to treat the colors of drawn objects as having pre-multiplied alpha.
- Added a new built-in shader variable: “mat3 NormalMatrix”.
- Added love.graphics.getSupported (replaces love.graphics.isSupported.)
- Added love.graphics.getSystemLimits (replaces love.graphics.getSystemLimit.)
- Added love.graphics.stencil, love.graphics.setStencilTest, and love.graphics.getStencilTest. (replaces love.graphics.setStencil.)
- Added love.graphics.isActive.
- Added color arguments to love.graphics.clear. It no longer always uses the background color value.
- Added love.graphics.discard.
- Added love.graphics.isGammaCorrect.
- Added the “clampzero” WrapMode.
- Added the ability to specify custom mipmaps when creating an image, via love.graphics.newImage(filename, {mipmaps={mip1, mip2, …}}).
- Added optional x/y/width/height arguments to Image:refresh and Canvas:newImageData.
- Added Image:getFlags.
- Added one- and two-channel Canvas formats: r8, rg8, r16f, rg16f, r32f, and rg32f.
- Added support for different formats in each Canvas when using multi-canvas rendering. Added the “multicanvasformats” GraphicsFeature constant.
- Added support for OpenGL ES 2 and 3.
- Added support for loading ETC, EAC, PVRTC, and ASTC compressed textures on systems that support them.
- Added custom vertex attribute support for Meshes via new variants of love.graphics.newMesh.
- Added Mesh:setVertexAttribute and Mesh:getVertexAttribute.
- Added Mesh:getVertexFormat.
- Added an optional ‘startvertex’ argument to Mesh:setVertices.
- Added the ability for love.graphics.newMesh and Mesh:setVertices to accept a Data object.
- Added Mesh:flush.
- Added Mesh:setAttributeEnabled and Mesh:isAttributeEnabled.
- Added Mesh:attachAttribute.
- Added SpriteBatch:attachAttribute.
- Added Shader:sendColor.
- Added new shader functions: gammaCorrectColor, gammaToLinear, and linearToGamma. The functions also have ‘precise’ and ‘fast’ variants.
- Added Text objects and love.graphics.newText.
- Added per-character color support to love.graphics.print, love.graphics.printf, and Text objects.
- Added BMFont bitmap font file support to love.graphics.newFont and love.font.
- Added kerning support for TrueType/OpenType and BMFont Fonts.
- Added an optional font hinting argument to love.graphics.newFont when loading TrueType fonts.
- Added an optional spacing argument to love.graphics.newImageFont, which applies additional spacing to all rendered glyphs.
- Added Font:setFallbacks.
- Added love.window.maximize.
- Added love.window.close.
- Added love.window.requestAttention.
- Added love.window.setDisplaySleepEnabled and love.window.isDisplaySleepEnabled.
- Added BezierCurve:renderSegment and BezierCurve:removeControlPoint.
- Added BezierCurve:getSegment.
- Added love.math.compress and love.math.decompress.
- Added Channel:performAtomic.
Changed APIs
- Changed love.mousepressed, love.mousereleased, and love.mouse.isDown to use button numbers instead of named button constants.
- Changed love.keypressed to be love.keypressed(key, scancode, isrepeat).
- Changed love.keyreleased to be love.keyreleased(key, scancode).
- Changed Font:getWrap‘s second return value to be a table containing the text split into lines.
- Changed love.graphics.newImage‘s optional second argument to be a table of flags (flags are “mipmaps” and “linear”.)
- Changed the arguments for the standard variants of love.graphics.newMesh. They’re now love.graphics.newMesh(vertices [, drawmode, usage]) and love.graphics.newMesh(vertexcount [, drawmode, usage]).
- Changed ImageData:encode to return a FileData object. ImageData:encode‘s first parameter is now the format to encode to, and the second parameter is an optional filename to write to.
Renamed APIs
- Renamed the fullscreen type “normal” to “exclusive”.
- Renamed the DistanceModel constants “inverse clamped”, “linear clamped”, and “exponent clamped” to “inverseclamped”, “linearclamped”, and “exponentclamped”.
- Renamed blend modes “additive”, “subtractive”, and “multiplicative” to “add”, “subtract”, and “multiply”.
- Renamed the key constant and Scancode representing the spacebar from ” ” to “space”.
- Renamed File:eof to File:isEOF.
- Renamed Canvas:getImageData to Canvas:newImageData.
- Renamed love.image‘s CompressedData type to CompressedImageData.
Removals
- Removed callback variant of love.filesystem.getDirectoryItems.
- Removed the “wu” and “wd” constants for love.mousepressed (replaced by love.wheelmoved.)
- Removed the named mouse button constants (replaced by button numbers.)
- Removed Source:isStatic (replaced by Source:getType.)
- Removed image loading support for all (non-compressed texture) file formats except for PNG, JPEG, TGA, and BMP.
- Removed JPEG encoding support from ImageData:encode.
- Removed love.graphics.point (replaced by love.graphics.points.)
- Removed love.graphics.setPointStyle and love.graphics.getPointStyle.
- Removed love.graphics.isSupported (replaced by love.graphics.getSupported.)
- Removed love.graphics.getSystemLimit (replaced by love.graphics.getSystemLimits.)
- Removed love.graphics.setStencil (replaced by love.graphics.stencil and love.graphics.setStencilTest.)
- Removed the “canvas”, “shader”, “npot”, “subtractive”, and “mipmap” GraphicsFeature constants (the features always have guaranteed support now.)
- Removed the “multicanvas” GraphicsFeature constant (use love.graphics.getSystemLimits instead.)
- Removed the “srgb” GraphicsFeature constant (use love.graphics.isGammaCorrect or love.graphics.getCanvasFormats().srgb instead.)
- Removed the “srgb” flag in love.window.setMode and in the t.window table in love.conf (Replaced by t.gammacorrect.)
- Removed the “premultiplied” BlendMode (love.graphics.setBlendMode(“alpha”, “premultiplied”) now does the same thing.)
- Removed Canvas:getPixel (use Canvas:newImageData instead.)
- Removed Canvas:clear (use love.graphics.clear instead.)
- Removed Mesh:getVertices.
- Removed Mesh:setVertexColors and Mesh:hasVertexColors (use Mesh:setAttributeEnabled(“VertexColor”, enable) instead.)
- Removed functions deprecated in LOVE 0.9.1 and 0.9.2:
- Removed love.graphics.getMaxImageSize and love.graphics.getMaxPointSize (replaced by love.graphics.getSystemLimits.)
- Removed Mesh:setImage, Mesh:getImage, SpriteBatch:setImage, SpriteBatch:getImage, ParticleSystem:setImage, and ParticleSystem:getImage (replaced by set/getTexture.)
- Removed SpriteBatch:bind and SpriteBatch:unbind.
- Removed Canvas:getFSAA and the “fsaa” flag in love.conf and love.window.setMode (replaced by Canvas:getMSAA and the “msaa” flag.)
- Removed the “dxt” and “bc5” GraphicsFeature constants (replaced by love.graphics.getCompressedImageFormats.)
- Removed the “hdrcanvas” GraphicsFeature constant (replaced by love.graphics.getCanvasFormats.)
- Removed love.window.getWidth, love.window.getHeight and love.window.getDimensions (use love.graphics.getWidth, love.graphics.getHeight, love.graphics.getDimensions or love.window.getMode instead.)
Bugfixes
- Fixed utf8.char.
- Fixed detection of fused executables.
- Fixed crashes when objects which store Lua callback functions are garbage collected after being used in coroutines.
- Fixed World:getCallbacks and World:getContactFilter when used in coroutines.
- Fixed memory leaks in love.physics if World:destroy is never called. When a World is garbage collected it now destroys all associated bodies, fixtures, and joints.
- Fixed love.keyboard.getKeyFromScancode crashing when an invalid scancode is given.
- Fixed decoding of 8-bit WAV files.
- Fixed a crash issue when rewinding streaming ogg Sources, when certain versions of libvorbis are used.
- Fixed love.audio.stop() not rewinding streaming Sources.
- Fixed the stencil buffer in Canvases when an unsupported MSAA value is used to create the Canvas.
- Fixed Canvas:renderTo to restore the previous canvases if an error occurs in the passed function.
- Fixed love.graphics.draw(canvas) to cause a Lua error if that canvas is the active one.
- Fixed Mesh:getVertexMap to return nil, rather than an empty table, if no vertex map has been set.
- Fixed love.graphics.getColorMask.
- Fixed the default offset for particles when ParticleSystem:setQuads or ParticleSystem:setTexture is used.
- Fixed love.graphics.shear resetting all love.graphics transformations.
- Fixed the “add” and “subtract” BlendModes to no longer modify the alpha of the Canvas / screen.
Performance improvements
- Improved the performance of World:rayCast and World:queryBoundingBox.
- Improved the performance of love.graphics.line and other line drawing functions, when the “smooth” LineStyle is used.
- Improved the performance of Shader:send when matrices are used.
- Improved the performance of ImageData and SoundData methods when LuaJIT’s JIT compiler is enabled, by using efficient FFI code.
- Improved the performance of love.math.noise, love.math.gammaToLinear, love.math.linearToGamma, love.math.random, and RandomGenerator:random when LuaJIT’s JIT compiler is enabled.
Other changes
- Updated the compatibility warning notice to use a message box and to show the version specified in love.conf.
- Updated the compatibility warning notice to display before main.lua is loaded.
- Updated the __tostring metamethod of love objects to output the pointer value, similar to tostring(table).
- Updated World:setCallbacks, World:setContactFilter, World:queryBoundingBox, and World:rayCast to have improved argument type checking.
- Updated threads to load love.filesystem automatically.
- Updated love.filesystem to enable symlinks by default.
- Updated love.math.setRandomSeed and RandomGenerator:setSeed to produce better results for the first few random() calls.
- Updated love.math.random and RandomGenerator:random to produce slightly better results in general.
- Updated Source methods that deal with spatial audio to error rather than failing silently if the Source isn’t mono.
- Updated the 3D and 4D variants of love.math.noise to use Perlin noise rather than Simplex noise, to avoid patent issues.
- Updated love.graphics.newImageFont to no longer treat separator pixels as spacing.
- Updated the default font to use less memory.
- Updated the behavior of text wrapping with love.graphics.printf and Font:getWrap to work better.
- Updated love.graphics.print and love.graphics.printf to no longer automatically round the x and y position arguments.
- Updated some of the error messages for love.graphics.newImage to be more descriptive.
- Updated love.graphics color functions to automatically apply love.math.gammaToLinear to color values when gamma-correct rendering is enabled.
- Updated the “normal” CanvasFormat to internally use “srgb” rather than “rgba8” when gamma-correct rendering is enabled.
- Updated love.graphics.setColor to affect all drawn objects, including ParticleSystems, SpriteBatches, and Meshes, even when per-vertex or per-sprite colors are used.
- Updated the default fullscreen type to be “desktop” rather than “exclusive”.
- Updated the minimum runtime system requirements of LOVE to require OpenGL 2.1 or OpenGL ES 2 support.
- Updated the pixel shader effect function so screen_coords.y is 0 at the top of the screen instead of the bottom.
- Updated Images to require setting the mipmaps flag to true on creation in order to use mipmaps.
- Updated Images to allow mipmaps for non-power-of-two sizes.