libGDX 1.9.10 released

libGDX 1.9.10

Yes thats right, 10 comes after 8!

A few of the notable changes and updates since last post

  • GWT update to 2.8.2
  • MobiVM release 2.3.7
  • Lwjgl 3.2.1
  • Lots of QOL and bug fixes for GWT backend
  • Better iOS backend customization
  • PixmapPacker features like NinePatch and whitespace stripping
  • InstancedRendering support via Mesh and InstanceBufferObjects
  • SCENE2D (Standard tweaks and improvements across the board)
  • Gradle updates to latest

Long overdue Gradle upgrade to 5.4 for new projects, now that the major IDEs are playing slightly nicer with our multi-project setup. For changes you need to have for your own existing projects, see the build script resources at the link below.

And also the latest versions of dependencies at


- API Addition: Allow target display for maximization LWJGL3 backend
- API Addition: Accelerometer support on GWT
- API Change: Set default behaviour of iOS audio to allow use of iPod
- API Change: IOSDevice is no longer an enum to allow users to add their own new devices when LibGDX is not up to date
- API Addition: Add statusBarVisible configuration to IOSApplicationConfiguration
- Update GWT Backend to GWT 2.8.2
- Update Android backend to build against API 28 (Android 9.0)
- API Addition: Input.isButtonJustPressed
- Update to LWJGL 2 backend to 2.9.3
- Update to MobiVM 2.3.6 release
- Update to LWJGL 3.2.1
- API Addition: Input allows getting the maximum number of pointers supported by the backend
- API Addition: Configuration option added to allow setting a max number of threads to use for net requests
- API Change: NetJavaImpl now uses a cached thread pool to allow concurrent requests (by default, the thread pool is unbounded - use maxNetThreads in backend configurations to set a limit - set to 1 for previous behavior)
- API Addition: New MathUtils norm and map methods
- API Change: Pixmap blending was incorrect. Generated fonts may change for the better, but may require adjusting font settings.
- API Change: Particle effects obtained from a ParticleEffectPool are now automatically started
- Removed OSX 32-bit support
- API Change: By default LWJGL2 backend no longer does pause/resume when becoming background/foreground window. New app config setting was added to enable the old behavior.
- API Change: By default LWJGL2 backend now does pause/resume when window is minimized/restored. New app config setting was added to disable this behavior.
- LWJGL3: Fixed window creation ignoring refresh rate of fullscreen mode.
- TmxMapLoader and AtlasTmxMapLoader refactoring: Shared functionality was moved to BaseTmxMapLoader, duplicate code was removed.
- AtlasTmxMapLoader supports group layers now (a positive side effect of the BaseTmxMapLoader refactoring).
- API Change: TmxMapLoader and AtlasTmxMapLoader: load/loadAsync methods work exactly as before, but many methods of these classes had to change. This makes it possible implement new Tiled features.
- API Addition: TextField#drawMessageText.
- Fixed TextField rendering text outside the widget at small sizes.
- API Addition: Group#getChild(int)
- API Addition: notEmpty() for collections.
- API Change: scene2d.ui Tree methods renamed for node set/getObject to set/getValue.
- API Change: scene2d.ui Tree and Tree.Node require generics for the type of node, values, and actors.
- API Change: For Selection in scene2d.utils "toggle" is now respected when !required and selected.size == 1.
- API Addition: new InstanceBufferObject and InstanceBufferObjectSubData classes to enable instanced rendering.
- API Addition: Support for InstancedRendering via Mesh
- API Change: Cell#setLayout renamed to setTable.
- API Addition: Added Collections#allocateIterators. When true, iterators are allocated. When false (default), iterators cannot be used nested.

- API Addition: Add support for stripping whitespace in PixmapPacker
- API Addition: Add support for 9 patch packing in PixmapPacker
- API Addition: Pressure support for ios/android.
- Update to Lwjgl 3.2.0
- Update android level we build against to 7.1 (API 25)
- API Change: gdx-tools no longer bundles dependencies to be compatible with java 9
- Skin JSON files can now use the simple names of classes, i.e. "BitmapFont" rather than "". Custom classes can be added by overriding Skin.getJsonLoader() and calling json.setClassTag().
- Skin supports cascading styles in JSON. Use the "parent" property to tag another style by name to use its values as defaults. See for example.
- SkinLoader can be used on subclasses of Skin by overriding generateSkin(). 
- API addition: Tree indentation can be customized.
- Fixed GlyphLayout not respecting BitmapFontData#down.
- API Addition: Added faceIndex paramter to #FreeTypeFontGenerator(FileHandle, int).
- API Change: BitmapFont#getSpaceWidth changed to BitmapFont#getSpaceXadvance.
- Many GlyphLayout fixes.
- API Addition: Added FileHandle#map(), can be used to memory map a file
- API Change: BitmapFontData#getGlyphs changed for better glyph layout. See
- API Change: Actor#hit is now responsible for returning null if invisible. #5264
- API Addition: Added [Collection]#isEmpty() method to all 22 custom LibGDX-collections (e.g. Array, ObjectMap, ObjectSet, Queue, ...)
- API Addition: StringBuilder#clear()
- API Addition: Color#WHITE_FLOAT_BITS
- Table layout fixed when expand is used and the layout width is less than the table's min width.
- InputMultiplexer#setProcessors(Array) now copies the items instead of using the specified array instance.
- API Change: A wrapped HorizontalGroup or VerticalGroup will now size children down to their min size if the group is smaller than their pref size.
- LWJGL3: useVSync() is now a per-window setting. Any additional windows should disable vsync to avoid frames dropping to (refresh rate / # of windows).
- Batch and sprite implementations and SpriteCache store Color separately from the float packed color, since converting to/from float is lossy.
- API Change: NumberUtils floatToIntColor expands the alpha from 0-254 to 0-255, so 255 doesn't become 254 from conversion from int to float to int.
- API Change: Batch and Decal setColor(float) renamed to setPackedColor for differentiation, since the conversion from float to Color is lossy.
- API Change: PolygonSprite getVertexColor renamed to getPackedColor to match other classes.
- API Change: FreeTypeFontGenerator only generates a missing glyph if \0 is in the characters.
- API Change: DragScrollListener no longer requires the touch/mouse cursor to be directly above/below the scroll pane.
- API Change: List#toString(Object) changed from protected to public. Subclasses overriding this need to change to public.
- API Change: List now handles more key presses.
- API Change: TexturePacker ImageProcessor#addImage(File, String) now returns the Rect.

Happy coding,
The libGDX team

libGDX 1.9.8 released

libGDX 1.9.8

Mr. Tomski has graced us with another release, all on his own! Here’s what’s new.

Included in 1.9.8 are a few minor fixes, as well as some hot fixes for box2d build errors from 1.9.7.

Support for iPhoneX by default in new projects was added. For existing projects you can just add the launch images as shown in this commit

We’ve also updated to Bullet 2.87.

And it wouldn’t be a libGDX release without at least one breaking change! FrameBuffers ‘basic’ constructors are back, no more static methods to instantiate basic versions of FrameBuffers.
This is to make it easier for subclassing and extension. See for discussion.


- Add iPhoneX images
- Fix MacOS issue with GL_ARB_texture_float extension check
- Fix AtlasTmxMapLoader tileset tile id offset
- Bullet: updated to 2.87, see:
- API Addition: Possibility to specify TexturePacker settings for resampling when scaling.
- API Addition: Support for customizing render buffer attachments in GLFrameBuffers
- API Change: Revert to constructors for GLFrameBuffers for easier customization

Happy coding,
The libGDX team

libGDX 1.9.7 released

libGDX 1.9.7

Update time. All brought to you by Tomski, marking the first time in libGDX history that someone else did the release!

Heres ya loot drops.

Important and breaking changes

GLFrameBuffer has been refactored

For creating standard FrameBuffers, FloatFrameBuffers, and FrameBufferCubemap use the new static methods in the respective classes.
For creating custom FrameBuffers, use the respective FrameBufferBuilder.

An example for building a custom FrameBuffer with multiple colour attachments and a depth attachment:

GLProfiler has been refactored

In order to support Lwjgl3, GLProfiler has been refactored to be instance based instead of static.
Create an instance of GLProfiler by passing in the Graphics interface. Feel free to make the instance you obtain static.


- Update to MobiVM(RoboVM) 2.3.3
- Add iOS 11 support
- Update to Lwjgl 3.1.3
- Update to MOE 1.4.0
- API Change: GLFrameBuffer has been refactored Create standard FrameBuffers with static methods. Customized FBOS with FrameBufferBuilder
- API addition: Tiled group layer support 
- Fix Tiled properties, offset parsing for image layers
- API addition: Added utility methods for Vector equals with epsilon
- Fix Animation backing array type
- Fix Mesh copying with 0 indices 
- Fix restoration of pooled particle effects scale
- Fix loss of controller listeners on reconnect
- Added basic kotlin project generation support in the setup tool
- API addition: Allow APK expansion to be used in fragments and activities
- API addition: Added color properties support from tiled maps
- API Change: Added rotation vector sensor support on Android
- API Change: GLProfiler refactored for OOP and lwjgl3 multi windows
- LWJGL3: The creation of additional windows via Lwjgl3Application.newWindow() is now deferred, with postRunnable(), until all existing windows have been updated. This fixes a potential native crash with NVidia GL drivers on Windows, presumably caused by a GL context conflict.
- API addition: Lwjgl3WindowListener.created() is called after a new window has been created. It's unsafe to call Lwjgl3Window functions in between Lwjgl3Application.newWindow() and this callback.
- Updated LWJGL3 backend to 3.1.3.
- Lwjgl3Graphics.setUndecorated() and Lwjgl3Graphics.setResizable() now delegate their work to the respective GLFW functions.
- API addition: ProgressBar.isVertical() - returns whether a progress bar is vertical or horizontal.
- API Change: SplitPane now by default does not allow the split amount to shrink children below their minimum sizes (cropping them). This behavior can be reverted by overriding clampSplitAmount or wrapping the children in Containers set to minSize(0) and fill(). SplitPane also now correctly includes the handle min size in its own min size calculations.
- API Change: SplitPane.getSplit() renamed to SplitPane.getSplitAmount() to match other getter and setter names.
- Improved internal Timer synchronization.
- API Change: List#drawItem, added float width parameter.
- API Addition: Make it possible to disable sound on the GWT-Backend with disableSound=true.
- API Change: ScrollPane setWidget deprecated in favor of setActor to match other APIs.
- API Change: removed JGLFW backend
- Fixed mixed up use of TexturePacker.Settings.stripWhitespaceX|Y.
- Added joystick POV support to LWJGL3 controller backend.
- Added support for 2d particles sprite animation.
- API Change: ParticleEmitter getSprite, setSprite, getImagePath, setImagePath are now getSprites, setSprites, getImagePaths, setImagePaths.
- Added support for 2d particles independant scale X and Y.
- API Change: ParticleEmitter getScale, matchSize are now getScaleX/getScaleY, matchSizeX/matchSizeY. Added scaleSize(float scaleX, float scaleY)

Happy coding,
The libGDX team