It’s been a while since we did a release. The reasons for this delay are the new 3D API as well as the RoboVM backend which is now replacing the deprecated Xamarin iOS backend. But let’s have a closer look at all the changes and new features, shall we?
New 3D API
Xoppa’s been working away on this for quite some time now, with minimal help and input from the rest of the team. The result is a really nice, easy to use 3D API, that’s focused on the programmable pipeline of OpenGL ES 2.0. You can find more information on the wiki.
The new 3D API let’s you work with FBX, which is the industry standard of 3D formats. We have a special little C++ project called fbx-conv that allows you to convert FBX with a libgdx format that’s extremely fast to load at runtime. We hope that htis work can also help other frameworks and engines, as the 3D format problem is one of the toughest ones to solve in that space.
The 3D API supports a metric ton of features, from cubemaps to (experimental) shadowmaps and GPU skinned animation. Xoppa’s constantly improving this feature set, so start playing with it! Here’s a video videos by Xoppa, demonstrating some of the new features. As with all libgdx APIs, we try to keep things as flexible as possible. Feedback welcome!
RoboVM is now our official iOS solution, and works exceptionally well. It’s easier to work with, as the tool chain is a lot more sane than our Xamarin based hack. It’s performance is very good, especially compared to the IKVM/Xamarin backend. Many folks have already released their games via RoboVM, and there’s an ongoing community effort to bind to APIs like Google Play Games Service, Facebook or Game Center. Here’s our bullet extension working smoothly on an iPad 2, Delver and Demise of Nations:
This “new” backend makes developing for iOS free, apart from the mandatory Apple Tax (developer license at 99$/y, Mac). Take that MonoGame :p.
All the instructions on how to run a libgdx app on iOS have been updated accordingly in the Wiki, check it out. I’ll update the tutorial video as soon as i have a better mic.
Updated 3rd party libs
Android x86 support
That’s been a feature request for a while, and we granted that specific wish a while ago. We don’t add the x86 shared libraries by default, but it’s easy to do so manually. Also, there’s still time to participate in this x86 related challenge by Intel and win fancy prizes!
Gradle and Maven
Libgdx is now a first class Maven citizen. All backends and extensions except the gdx-audio extension have no been added to Maven (groupId: com.badlogicgames.libgdx, version: 0.9.9). We also started working on a Gradle based build for libgdx projects, which (will) neatly coexist with Eclipse and IntelliJ. The latest nightlies as well as the 0.9.9 release contain a gdx-setup.jar, which is a command line application allowing you to generate a Gradle based libgdx project. If Scala and/or SBT are your poison, check out this neat SBT based libgdx build by ajhager. Note, the old gdx-setup UI will be replaced by the Gradle based solution soonish!
We’ve been working on our build system quite heavily over the past few months, simplifying it where possible, and integrating Maven as a first class citizen. We also created a new official site with the help of XKalibur and Bitowl, which looks a lot nice than the old coder-art page. Note: you can submit your game to our gallery!. While this won’t drive tons of traffic to your game, it’s nice to share what you worked on with us. We love seeing and playing your games
Bug Fixes and Improvements
Of course we also did a metric ton of bug fixing, and improved many areas of the API and implementation. Here’s the full changelog, which you can also follow in our Git repository.
- added setCursorImage method to Input interface to support custom mouse cursors on the desktop - removed Xamarin backend, see http://www.badlogicgames.com/wordpress/?p=3213 - added Select class for selecting kth ordered statistic from arrays (see Array.selectRanked() method) - refactored Box2D to use badlogic Arrays instead of java.util.ArrayLists - MipMapGenerator methods now don't take disposePixmap argument anymore - added GLTexture, base class for all textures, encapsulates target (2d, cubemap, ...) - added CubeMap, 6 sided texture - changed TextureData#consumeCompressedData, takes target now - added RoboVM backend jar and native libs (libObjectAL, libgdx, in ios/ folder of distribution) - added RoboVM backend to build - changed Bullet wrapper API, see http://www.badlogicgames.com/wordpress/?p=3150 - changed MusicLoader and SoundLoader to be asynchronous loaders - changed behaviour of Net#sendHttpRequest() so HttpResponseListener#handleHttpResponse() callback is executed in worker thread instead of main thread - added Bresenham2, for drawing lines on an integer 2D grid - added GridPoint2 and GridPoint3, representing integer points in a 2D or 3D grid - added attribute location caching for VertexData/Mesh. Hand vertex attribs to a ShaderProgram, get back int, pass that to Mesh - added Android x86 builds, removed libandroidgl20.so, it's now build as part of gdx-core for Android - changed method signature on Box2D World#getBodies and World#getJoints, pass in an Array to fill - removed glGetShaderSource from GL20, use ShaderProgram#getVertexShaderSource/getFragmentShaderSource instead - added reflection api - added AsynchExecutor, execute tasks asynchronously. Used for GWT mainly. - removed FileHandle#file(), has no business in there. - removed box2deditor - removed custom typedarrays in gwt backend - added classpath files support for gwt backend (limited) - moved AndroidWallpaperListener to Android Backend - added new VertexAttribute Usage flags, bone weight, tangent, binormal. previously encoded as Usage.Generic. Also added field "unit" to VertexAttribute, used by texture coordinates and bone weights to specify index/unit. - setup-ui template for iOS disables pngcrush, also updated wiki iOS article - add Pixmap#fillTriangle via jni gdx2d_fill_triangle() to fill a triangle based on its vertices. - add asynchronous download with continuous progress feedback to GWT asset preloader, see https://github.com/libgdx/libgdx/pull/409?w=1 - add capability to add/exclude package/classes GWT Reflection system, see https://github.com/libgdx/libgdx/pull/409?w=1 - add updated gdx-tiled-preprocessor, generate one single TextureAtlas for all the specified Tiled maps, see http://www.badlogicgames.com/forum/viewtopic.php?f=17&t=8911 - maps API, add new AtlasTiledMapLoader for loading maps produced by the tiled preprocessor tool - ImageProcessor, TexturePacker2 now accepts BufferedImage objects as input - TexturePacker2 now avoids duplicated aliases - Updated to LWJGL 2.9.0 - refactored JSON API, see http://www.badlogicgames.com/wordpress/?p=2993 - Updated Box2D to the latest trunk. Body#applyXXX methods now take an additional boolean parameter. - TmxMapLoader has a flag in Parameters that lets you specify whether to generate mipmaps - Animation#isAnimationFinished was fixed to behave as per javadocs (ignores looping) - remove GLU interface and implementations. Use Matrix4 et al instead. see http://www.badlogicgames.com/wordpress/?p=2886 - new maps API, see http://www.badlogicgames.com/wordpress/?p=2870 - removed static public tmp Vector2 instances, manage such temporary vars yourself, see http://www.badlogicgames.com/wordpress/?p=2840 - changed Scene2D Group#clear(), see http://www.badlogicgames.com/wordpress/?p=2837 - changed the build system, natives are now fetched from the build server, see http://www.badlogicgames.com/wordpress/?p=2821 - freetype extension supported on iOS, see http://www.badlogicgames.com/wordpress/?p=2819 - changed ShapeRenderer API, see http://www.badlogicgames.com/wordpress/?p=2809 - changed Actions.add to addAction, changed parameter order, and added removeAction, addListener, removeListener - Box2d joints now allow for user data - Changes to Intersector, Circle, Rectangle and BoundingBox for consistency in #overlap, #intersect and #contains methods, see https://github.com/libgdx/libgdx/pull/312 - Removed LwjglApplicationConfiguration CPU sync. Added foreground and background target framerate. - scene2d, no longer use getters/setters internally for Actor x, y, width, height, scalex, scaley and rotation. - Array, detect nested iterator usage and throw exception. - Added getVolume to Music class and Android, IOS and GWT backends - 1381, fixed JSON parsing of longs. In addition to Float, it now parses Long if no decimal point is found. - Changed Array constructors that took an array to have offset and count - scene2d, Actor parentToLocalCoordinates and localToParentCoordinates refactoring, see http://www.badlogicgames.com/forum/viewtopic.php?p=40441#p40441 - scene2d, Action#setActor no longer calls reset if the Action has no pool. This allows non-pooled actions to be add and removed from actors, restarted, and reused. - ScrollBar#setForceOverscroll renamed to setForceScroll, as it affects more than just overscroll. - ArrayMap#addAll renamed to putAll to match the other maps. - Added ObjectSet and IntSet. - Added completion listener to Music. - Added Music#setPan. - Sound#play and Sound#loop on Android now return -1 on failure, to match other backends. - DelegateAction subclasses need to implement delegate() instead of act(). http://www.badlogicgames.com/forum/viewtopic.php?p=43576#p43576 - Added pause and resume methods to Sound. - Changed AssetErrorListener#error to have AssetDescriptor to enable access to parameters of failed asset. - Changed SelectBoxStyle to have ScrollPaneStyle and ListStyle for fully customizing the drop down list. http://www.badlogicgames.com/wordpress/?p=3110 - AssetLoader now takes a FileHandle that is the resolved file name. The AssetLoader no longer has to resolve the file name, so we can prevent it from being resolved twice. - Rewrote EarClippingTriangulator to not allocate (no more Vector2s). - Added ParticleEffectLoader to make AssetManager load ParticleEffects - Added GeometryUtils, more Intersector functions, DelaunayTriangulator, ConvexHull. - Added getBoundingBox to ParticleEffect - EarClippingTriangulator changed to return triangle indices. - PolygonSpriteBatch and friends refactored to use triangle indices. - Added add(T, float), remove(int), remove(T) and clear() methods to BinaryHeap - Bitmap Font changes: - FreeTypeFontGenerator allows you to specify the PixmapPacker now, to create an atlas with many different fonts (see FreeTypePackTest) - BitmapFont, BitmapFontCache and FreeTypeFontGenerator now support fonts with multiple texture pages. (see BitmapFontTest and FreeTypePackTest) - BitmapFontData.imagePath and getImagePath() is depreacted, use imagePaths and getImagePath(int) instead - Added two BitmapFont constructors for convenience; no need to specify flip boolean - Added getCache() to BitmapFont, for expert users who wish to use the BitmapFontCache (see BitmapFontTest) - FreeTypeFontGenerator now includes setMaxTextureSize and getMaxTextureSize to cap the generated glyph atlas size (default 1024) - added render-hooks beginRender() and endRender() to BatchTiledMapRenderer - Added panStop to GestureListener interface. - ScissorStack#calculateScissors changed to take viewport, enabling it to work with glViewport. - Added Bits#getAndClear, Bits#getAndSet and Bits#containsAll
My personal focus will be on the Gradle build and improving the RoboVM backend. I’m also eyeballing some scripting solutions for integration as an extension. Another future extension should be a cross-platform, pluggable IAP solution. We already have a PR discussing the architecture for that on Github. Xoppa will surely continue his amazing work on the 3D API, i expect great things to come out of this soon.
Big thanks to all of the libgdx devs and the community who make libgdx what it is. Thanks for being awesome!