- BREAKING: Update minimum JDK from 21 to 22.
--enable-preview
is no longer needed. - Update
wgpu
from0.19.4.1
to22.1.0.5
. - BREAKING:
rect.interescts(left, top, right, bottom)
has been reorder to a more natural way:rect.intersects(left, bottom, right, top)
- Fix
rect.intersects(rect2)
to pass in correct coordinates. - Fix indices & vertices being overwritten, when they shouldn't be, when ensuring buffer size inside
Mesh
andIndexedMesh
. - Fix
JsByteSequenceStream
from attempting to flip the passed inBuffer
in order to read. It now assumes the buffer is in a ready-to-ready state. - Add new stats to
EngineStats
:setPipeline
calls per framesetBindGroup
calls per frameset*Buffer
calls per frame
- Fix
IndexedMeshGeometry.clearIndices
not resetting the total tracked indices back to 0.
- Fix
Rect.intersects
to use correct top & bottom coordinate during calculation. - Fix
InputMapController
bindings are triggered without modifiers when a modifier is pressed. - Fix jvm
AudioStream
volume not being able to be set to0
. - Update
TiledLayer.visible
to be mutable. - Add support for object within a tile in
Tiled
maps - Add fetching tile ID by coordinates in
TiledLayer
. - Fix GamePad button axis strength calculation not using the negative input resulting in buttons not affecting axis strength
- Fix
Animation.getFrame(index)
andAnimation.getFrameTime(index)
from being able to go out index bounds. - Add new
Vfs
subtypes:UrlVfs
andLocalVfs
.Context
now has threeVfs
types:resourcesVfs
for loading from theresources
directory. This handles loading from fat JARs fine now (fixes #275)urlVfs
for loading directly from a URL or data URL.applicationVfs
for loading files at the root of the application working directory.
- Update internal JVM
readPixmap
to usestbimage
instead ofImageIO
- Fix
IndexedMeshGeometry
index buffer size calculation - Add
Compression
interface withCompressionGZIP
implementations for jvmAndroid & js. - Fix
AssetProvider.fullyLoaded
calculation to take into account the active job - Update
kotlin
from2.0.0
to2.1.0
- Update
kotlinx.serialization
from1.7.0
to1.7.3
- Update
kotlinx.atomicfu
from0.24.0
to0.26.1
- Update
kotlinx.coroutines
from1.9.0-RC
to1.9.0
- Update
LWJGL
from3.3.3
to3.3.4
- Internal code clean up
- Documentation tweaks and clean up
- Fix miscalculation for scene-graph
Cotnrol.anchor()
forTOP_*
related layouts. - Fix
AssetProvider
to asset preparation logic not preparing additional assets after the initial preparation.
- Replace all of OpenGL with WebGPU. The overall API is mostly the same, save for the specifics of having to use
WebGPU. These changes are too large to fit in a changelog but can be checked out on the documentation and migrated.
- Much of the API under
graphics.*
has changed but stayed relatively the same. E.g.SpriteBatch
contains the samebegin() -> draw() -> end()
flow but requires WebGPU specific classes. graphics.gl.*
classes replaced withgraphics.webgpu.*
- Much of the API under
- Remove the Android target until a generator can be created for the WGPU natives for JNI (Future update).
- The module group id, for defining in dependencies, has been changed from
com.lehaine.littlekt
tocom.littlekt
. - The scene-graph module has been extracted into its own package and will explicitly be defined in your
dependencies:
com.littlekt:scene-graph
- Remove
FrameBufferNode
and related UI classes. UseCanvasLayerContainer
andCanvasLayer
for FBO related purposes. - Remove
FrameBuffer
class. WebGPUsRenderPass
is essentially a Framebuffer / Render target. - Remove
GlslGenerator
and all related classes. UseWGSL
for your shader needs, either by loading them from a file or directly in a string. - Remove
vSync
andbackgroundColor
configuration options. - Remove
Game<T>
andScene<T>
classes as they aren't in scope of the framework. - Rename
Disposable
to beReleasable
as well asdispose()
torelease()
. - Remove
FitViewport
andFillViewport
as they don't work with the current viewport limitations WebGPU imposes. WebGPU doesn't allow out-of-bounds viewports which causes a fatal error. There is no workaround without getting clever with shaders. - Update
TextureSlice.originalWidth/Height
&TextureSlice.packedWidth/Height
toactualWidth/Height
andtrimmedWidth/Height
, respecitively.
- Add new
wgpu-ffm
module. - Add new
wgpu-natives
module. - Add new
SpriteCache
renderer. - Update Kotlin to
2.0.0
- Update
Kotlin.coroutines
to1.9.0-RC
- Update
Kotlin.atomicfu
to0.24.0
- Update
Kotlinx.serialization
to1.7.0
- Update
Kotlinx.html
to0.11.0
- Add documentation to most of the framework.
- Dozens of other minor misc. changes all across the framework.
- Dozens of fixes related to the scene-graph:
- Layout miscalculations
- Optimizations
- Scrolling fixes
- Scissor fixes
- Fix LDtk tilemap rendering issues
- Fix Tiled tilemap rendering issues
- Dozens of other minor misc. fixes all across the framework.
ShaderProgram.getAttrib()
can now return a-1
instead of throwing anIllegalStateException
if the attribute name doesn't exist.ShaderProgram.getUniformLocation
can now return anull
instead of theUniformLocation
if the uniform name doesn't exist.- Update JVM target to 17 from 11.
- Add WASM as an official platform target.
- Update
FrameBuffer
to allow for multiple texture attachments to be used. - Remove nest-ability from
FrameBuffer
due to poor performance with multiple calls to get currently bound frame buffer.FrameBuffer.end()
will now bind to the default frame buffer instead with optional viewport position and size parameters.
- Update
GLSlGenerator
to supportgl_FragData[]
. - Update
GL
with newdrawBuffer
andclearBuffer[fuiv]
functions. - Update
GL
with newgetActiveAttrib
andgetActiveUniform
related functions. - Optimize
WebGL
to prevent creating a new array on certainGL
calls. - Update
ShaderProgram
to handle finding and setting active uniforms and attributes instead relying on theShaderParameter
to do so. - Update
AGP
to8.2.0
. - Update Kotlin to
1.9.23
. - Update
kotlinx-coroutines
to1.8.0
. - Update Dokka gradle plugin to
1.9.20
.
- Fix
InputQueueProcessor
to clear events pool even when noInputProcessor
exists. - Fix
SpriteBatch
default size to be back to 1000 sprites instead of 8191 sprites.- This makes it consistent with
TextureArraySpriteBatch
as well as increases performance if using the default size and using less than 8191 sprites.
- This makes it consistent with
- Remove remaining 3D spatial graphic classes that were accidentally left over from
0.8.0
. - Update LDtk to handle changes up to LDtk
1.5.3
. - Update Kotlin to
1.9.21
. - Update
Kotlinx.coroutines
to1.8.0-RC2
. - Update
Kotlinx.atomicfu
to0.23.1
. - Update
Kotlinx.serialization
to1.6.2
. - Update Dokka gradle plugin to
1.9.10
.
- Fix
NoSuchElementException
being thrown when testing touch input in browsers simulated device-mode.
- Removed all experimental GLTF and 3D rendering graphics.
- Update Kotlin to
1.9.10
. - Update
Kotlinx.coroutines
to1.7.3
. - Update
Kotlinx.atomicfu
to0.22.0
. - Update
Kotlinx.serialization
to1.6.0
. - Update
LWJGL
to3.3.3
. - Update Android Gradle plugin to
7.3.1
. - Update Gradle Version (gver) plugin to
0.48.0
. - Update Dokka gradle plugin to
1.9.0
.
- Fix
Button
label not calculating layout correctly when adding directly to aControl
node.
- Update Kotlin to
1.8.20
. - Update
FrameBuffer
class is nowopen
. - Add new
forEachTileInView
toLdtkLayer
to iterate over tiles current in the view bounds without rendering. - Breaking: Move
BlendMode
andDepthStencilMode
out of thegraph
package and into thegraphics.utils
. - Add new
setBlendFunction(blendMode)
toBatch
. - Breaking: update
createShader
to return the type of vertex and fragment shaders instead of the super class. - Add
FrameBuffer.use
extension similar toBatch.use
. - Breaking:
Shader.parameters
are now to be used with aLinkedHashSet
instead of aMutableList()
.mutableListOf(param1, param2) -> linkedSetOf(param1, param2)
. - Breaking: Update
Shader.parameters
to grab parameters by variable name instead of index.parameters[0] -> parameters["u_texture"]
- Breaking:
GlslGenerator.texture2D
,GlslGenerator.shadow2D
, andGlslGenerator.texture
now returns a constructor delegate instead of a literal.val color = texture2D(...) -> val color by texture2D(...)
- Fix
TextureArraySpriteBatch.draw(spriteVertices)
to manually increaseMesh.geometry.numVertices
to prevent data from being overwritten withgeometry.addVertex
. - Fix
TextureArraySpriteBatch
to use the correctVertexAttribute
for 2D positions. - Fix
TextureArraySpriteBatch.maxVertices
calculation. - Fix
LDtkLayer
rendering to calculate the correct maximum cells in both x & y axes. - Fix
SceneGraph
to set the correct blend equation off a materialBlendMode
. - Fix
GlslGenerator
not removing unused definitions from functions. - Fix
Tiled
row & column calculations & iso transform to use correct view bound points. - Fix
GlslGenerator.For
not usingGLInt
value directly - Fix
GlslGenerator.atan
to use correct parameters (was only allowing one parameter to be passed in) - Fix
InputMapController.addBinding
to check for key modifiers fordown()
,pressed()
, andreleased()
functions
- Fix an issue with
Button
not calculating label sizing when added after scene creation.
This contains only a single change related to the GLSLGenerator
.
- Update
GLSLGenerator
uniform delegates to only add to theShader.paremeters
only when has its value used in the source. Due to some static conditions some uniforms may not be used while still being defined in theparamters
list. When creating aShaderProgram
with WebGL, it would throw shader compilation error due to not finding in the glsl source. This was preventing aSceneGraph
from being rendered on the Web due to the default 3D model shader.
This contains fixes for Mac support.
- Add new HdpiMode for JVM platforms. Setting to HdpiMode.PIXELS will allow correct display on Macs with retina displays.
- Update GlVersion to handle comparisons of versions correctly. This fixes issues in the
GlslGenerator
. - Update
LjwglGL
to only use the extension framebuffer and renderbuffer calls if the OpenGL version is< 3
. - Fix shader compilation errors on Macs.
This version is full of breaking changes, mainly to mesh creation and handling, to make way for adding some basic 3d related graphics and handling.
- Basic 3D support This is experimental and not really meant to be used in a real game yet:
- Adds a few new nodes to the
SceneGraph
to handle rendering 3D meshes and models:Node3D
,VisualInstance
,Model
, andCamera3D
.
- Extremely basic lighting (this will improve in the future).
- Skeletal animation.
- glTF loading and basic material rendering:
resourceVfs["myModel.glb"].readGltfModel()
. - New
PerspectiveCamera
class.
- Adds a few new nodes to the
- New
MeshGeometry
class. Replaces the oldMeshBatcher
but doesn't require to make a newMesh
instance to create the vertices. An instance can be passed into aMesh
for it to use. - New
MeshBuilder
class that uses the newMeshGeometry
class to help facilitate generating meshes and vertices. - Various GLSL generator improvements and optimizations
- Declare and set value of variable in line.
- 3.3 layout locations support.
- Add new
predicate
option when declaring anattribute
orvarying
for conditional shaders.
Vec4
updates to handleQuaternion
related math
-
Update
BaseButton.buttonGroup
to be private and added a newsetButtonGroup(group)
function to handle setting button groups.Previous:
val myButtonGroup = ButtonGroup() button { buttonGroup = myButtonGroup buttonGroup.buttons += this }
New:
val myButtonGroup = ButtonGroup() button { setButtonGroup(myButtonGroup) }
-
Move all 2D graphic related items to new subpackage call
g2d
. To migrate: append.g2d
to all imports using any 2D related class. -
Mesh changes:
- Removed
MeshBatcher
and replaced with separateMeshGeometry
. - If you are using a
Mesh
instance that was using the batcher and making use ofMesh.addVertex
do the following:- Previously:
mesh.addVertex { ... }
. New:mesh.geometry.addVertex { ... }
- Previously:
- Removed
useBatcher
in favor of usingMeshGeometry
to create aMesh
without binding it.
- Removed
-
SceneGraph.showDebugInfo
is no longer able to be changed. To request debug rendering use the newSceneGraph.requestShowDebugInfo
. The reason for this change was theshowDebugInfo
was taking effect immediately and throwing exceptions due to the internalBatch
not being ready to render withShapeRenderer
and such. The request will take into effect after the current frame finishes rendering.SceneGraph.showDebugInfo
will contain the true value of debug rendering.
- Fix
BaseButton
pressed
&disabled
properties incorrectly comparing new value with a wrong value affecting toggle buttons. - Update
NodeList
to handleNode.updateInterval
values less than1
. Anything less than1
will now not update itself or its children. - Add
useOriginalSize
option toTextureRect
node to allow positioning theTextureSlice
based off the original size before packing and trimming. - Fix
SceneGraph
touch focuses not being cleared after aTOUCH_UP
event being fired resulting in thousands of elements in the list. - Fix
SceneGraph
to fire the correctMOUSE_EXIT
input event with pointers last over an input control. - Update
Control.hasPoint
to handle rotated control nodes - Fix
CanvasItem.toLocal
andCanvasItem.toGlobal
to use its respective matrices for calculation of the coordinates. - Fix
Control.hit
not handling rotated nodes in its calculation - Update all checks of
rotation == Angle.ZERO
to use a normalized angle and fuzzy zero checking. This results in angles of360
degrees to satisfy the condition. - Fix
TOUCH_UP
event not being sent toinput
&unhandledInput
functions when not clicking on aControl
node. - Fix multiple calls to
debugRender
in theSceneGraph
when using any nestedCanvasLayer
. - Fix
FrameBufferNode
not propagating debug render calls to its children. - Add new
InputEvent.canvasX
andInputEvent.canvasY
to get coordinates of the event in theCanvasItem.canvas
coordinates. This is useful when nestingCanvas
nodes. - Update existing
Control
nodes that useuiInput
to check against newInputEvent.canvasX
andInputEvent.canvasY
coordinates. - Fix
GlyphLayout
not calculating glyph advances properly resulting in incorrect wrapping calculations - Fix when a
Control
node should calculate its minimum size. This fixes issues with labels not using the correct layout height. - Add
getOrNull(Int)
to all variants ofArrayList
data structure.
- Update
kotlin
to1.8.10
. - Update
kotlinx.serialization
to1.5.0-RC
. - Update
kotlinx.atomicfu
to0.19.0
.
- Fix
NodeList
not handling removing children correctly, missingonDestroy
calls and not removing every child.
- Fix
NodeList
not adding newly added nodes to the internalsortedNodeList
preventing nodes from being rendered.
- Update
EmptyDrawable
to be an immutable singleton object instead of a class. Any attempted changes to this will throw an exception.- Migration:
val drawable = EmptyDrawable()
toval drawable = createEmptyDrawable()
orval drawable = EmptyDrawable
- Migration:
-
Update
ScrollContainer
vertical scrollbar to extend the entire height of the container. -
Update
ScrollContainer
add newDrawable
properties that can be overridden. -
Update
Scrollbar
add newDrawable
properties that can be overridden. -
Fix
Scrollbar
grabber height and position not fully reaching the correct position at the end of the scrollbar. -
Adds new child tree positioning methods. NodeList updated to use just an array list to handle the indexing as the multiple collections were not able to handle the movement changes.
sendChildToTop()
- sends child to top of parent treesendChildAtToTop()
- sends child at index to top of parent treesendChildToBottom()
- sends child to bottom of parent treesendChildAtToBottom()
- sends child at index to bottom of parent treeaddChildAt()
- adds new child to parent node at specified indexswapChildren()
- swap child positions in the parent treeswapChildrenAt()
- swap children node positions at indices in the paren tree
- Add
ScrollContainer
,VScrollBar
, andHScrollBar
control nodes for scroll handling - Add automatic caching of
Control
theme values when first grabbing the theme value.- For Example:
getThemeDrawable()
will return a result and then is cached in thedrawableCache
map. Any subsequent calls togetThemeDrawable()
will first check in thedrawableOverrides
and then in thedrawableCache
map and return a result if it exists. - When a theme owners theme changes, the theme owners and its child control nodes will all have their caches cleared.
- For Example:
- Add an experimental API for rendering scalable TrueType Fonts (TTF) called
VectorFont
. A sampleVectorFontTest
exists for usage. - Add a
GestureProcessor
interface with aGestureController
input processor to handle gesture detection and callbacks. Comes with aGestureProcessorBuilder
class for easy callback creation. A helper extensionInput.gestureController
to easily create and add the gesture controller as an input processor to the input. - Update default theme colors and tweak default UI assets to be slightly more presentable.
- Add
column
androw
DSL aliases forVBoxContainer
andHBoxContainer
containers.
Context.onRender
,Context.onPostRender
,Context.onPostRunnable
, andContext.onResize
are now non-suspending. This fixed issues with the Android and Web platforms from creating unneeded coroutines every frame. Wrap any suspending calls called within these callbacks in a coroutine,KtScope.launch { }
, or check if the suspending function can be made non-suspending.
- add:
EmptyDrawable
to handle drawables that don't need drawn. - add: Additional vec3
CanvasLayer.canvasToScreen
methods. - add: two new size properties to
NinePatch
:totalWidth
&totalHeight
. - add: new
Textures.transparent
1x1 transparent pixel texture slice. - add:
MutableVec2f.mul(Mat4)
implementation. - add:
Node.moveChild(child, index)
method to handle moving a child to different index in the tree. - add:
SceneGraph
now propagates scroll input to control nodes that the mouse is over. - add:
allowGreater
&allowLesser
flags toRange
node to allow values pass the min & max values.
- fix:
SceneGraph
sometimes adding handled input to the unhandled input queue. - update:
Theme.FALLBACK_DRAWABLE
is not anEmptyDrawable
instead of a whiteTextureSliceDrawable
. - update:
Control
now checks to ensure node isvisible
before returning successfully in thehit
test. - update:
NinePatchDrawable
minWidth
andminHeight
calculations to use the newNinePatch.totalWidth
andNinePatch.totalHeight
properties. - fix:
PanelContainer
not fitting children nodes to the correct positions. - update: default UI asset pngs.
- update:
Label
defaultmouseFilter
is nowIGNORE
. - update:
Control.setAnchor
to be public. - fix:
Dispatchers
coroutines attempting to resume an already cancelled continuation. - fix: Android input not properly detecting the correct touch event action when touching with the 2 or more pointers.
- fix: LWJGL & JS input from not properly outputting the correct
Pointer
ontouchDragged
when using any pointer but the left mouse button. - fix:
FontCache
not resetting its current tint when callingclear()
. - fix:
Label
bottom vertical alignment calculation not being correct. - fix:
Label
horizontal alignment calculations not being correct. - fix:
Label
not taking into account the correct minimum size when usingellipsis
. - fix:
Button
horizontal alignment calculations not being correct. - fix:
Button
not taking into account the correct minimum size when usingellipsis
. - fix:
ProgressBar
percentage font positioning to be more centered. - update:
ProgressBar
to only measure font when value changes.
SceneGraph
nodes now allow for custom sort options when updating lists. This allows to render nodes based on the sort while keeping the update order.SceneGraph
: NewySort
option added toNode2D
to allow y-sorting rendering.SceneGraph
will now handle debug rendering as well asControl
nodes to render it's bounds when rendering to help UI positioning.JVM
: Addedarm64
dependencies for LWJGL.
-
Add
ShapeRenderer
toSceneGraph
andNode
render methods. This includespreRender
,render
,postRender
anddebugRender
as well as all theNode
rendering signals.Before:
DSL:
node { onRender += { batch, camera -> // render logic } }
Extending a Node:
override fun render(batch: Batch, camera: Camera) { // render logic }
New:
DSL:
node { onRender += { batch, camera, shapeRenderer -> // render logic } }
Extending a Node:
override fun render(batch: Batch, camera: Camera, shapeRenderer: ShapeRenderer) { // render logic }
- add:
Camera.boundsInFrustum
implementation. - add: New implementation of
AnimationPlayer.start()
that will restart the current running animation to the first frame.AnimationPlayer.resume()
provides the old functionality ofAnimationPlayer.start()
- add:
AnimationPlayer.restart()
alias forAnimationPlayer.start()
. - add:
Experimental
annotation that requires opt-in.
- fix: add missing
contract
call forvBoxContainer
. - fix: JVM - add a
isMac
check before attempting to set window icon. - fix: Texture Packer Plugin - All LWJGL dependencies are now removed from the plugin.
- update: Refactor
AnimationPlayer.start()
toAnimationPlayer.resume()
. - update:
AnimationPlayer
restarts the last frame time back to zero when stopping an animation. - update:
GpuFont
is now marked asExperimental
. - update Android compile & target versions to 33.
- update
AssetProviderer
to use anArrayList
instead of aMutableList
to fix iterating through assets to prepare.
- fix: Infix function
ife
from using the incorrectisFuzzyEquals
method resulting in incorrect values.
- update:
Viewport.camera
to be mutable. - update: all existing
Viewport
subtype classes to receive a constructor paramter for aCamera
.
For the full log see below.
- New
SceneGraph
nodes to handle different viewports, frame buffers, and materials (shaders, blend modes, depth/stencil modes). - New input and unhandled input handling inside a
SceneGraph
. - New lifecycle methods added to Nodes in a
SceneGraph
:preUpdate()
,postUpdate()
andfixedUpdate()
. - Major optimizations and clean up of the
SceneGraph
in general. Camera
&Viewport
relationship refactoring to make more sense. See full changelog for more info.AnimationPlayer
playback clean up and add few additional playback methods- New optional
AnimationStateMachine
withinAnimationPlayer
. - New shape, lines, and path drawing class
ShapeRenderer
.
-
refactor
Viewport
to contain an internalCamera
and removeViewport
fromCamera
.Before:
val viewport = ExtendViewport(480, 270) val camera = OrthographicCamrea().apply { this.viewport = viewport }
New:
val viewport = ExtendViewport(480, 270) val camera = viewport.camera
-
remove
SceneGraph.viewport: Viewport
andSceneGraph.camera
and replaced with theViewportCanvasLayer
node.Before:
val viewport: Viewport = graph.viewport val camera: Camera = graph.camera
After:
val viewport: Viewport = graph.sceneCanvas.viewport val camera: Camera = -graph.sceneCanvas.canvasCamera
-
update
SceneGraph.initialize()
to be suspending. -
update
SceneGraph.Node.initialize()
to be suspending. -
rename
Node2D.toWorld
functions totoGlobal
. -
update
Vec2f.rotate
to useAngle
instead of a float.Before:
val vec = MutableVec2f() val angle: Angle = 45.degrees vec.rotate(angle.degrees)
After:
val vec = MutableVec2f() val angle: Angle = 45.degrees vec.rotate(angle)
- add: list of catching keys to prevent default platform functionality from performing on key events
- add:
loadSuspending
toAssetProvider
to load assets as a suspending function instead loading inside a coroutine - add:
onDestroy
open function andonDestroy
signal toNode
whendestroy()
is invoked. - add: contracts to
SceneGraph
DSL to allow usage of assigning objects toval
outside of it. - add: contract to
AssetProvider.prepare()
to allow usage of assigning objects toval
outside of it. - add:
CanvasItem
node as the base node for 2D transformations in theSceneGraph
.Node2D
now inherits directly from this node. - add:
CanvasLayer
node that creates a separateOrthographicCamera
for rendering instead of inheriting the base camera from theSceneGraph
. For example: When rendering certain nodes at a low resolution using aViewport
to render UI at a higher resolution. This contains an instance to aViewport
but isn't used directly to render children. A new node calledViewportCanvasLayer
can be used to render children nodes with a separate viewport. - add:
ViewportCanvasLayer
to use separateViewport
to render children nodes in aSceneGraph
. - add:
FrameBufferNode
which is aCanvasLayer
to allow rendering children nodes directly to aFrameBuffer
. TheFrameBuffer
texture is then available to be rendered in a separate node. - add:
FrameBufferContainer
control node which can be used to help render aFrameBufferNode
. - add:
zoom
,near
, andfar
properties toCamera2D
which will be used to set theCanvasLayer.canvasCamera
properties before rendering. - add:
scale
property to therender
method ofLDtk
andTiled
tile maps. - add:
tmod
andtargetFPS
properties toSceneGraph
to be used as another way to handle frame independent movements. - add: three new lifecycle calls to a
Node
:onPreUpdate
,onPostUpdate
, andonFixedUpdate
as well as their respectiveSignal
types. TheonFixedUpdate
comes with a few more properties to handle changing the fixed time step and as well as an interpolating ratio.SceneGraph.fixedTimesPerSecond
: can be used to set the amount of timesonFixedUpdate
is call per secondSceneGraph.fixedProgressionRatio
: is an interpolation ratio that can be used to render nodes that useonFixedUpdate
for movement / physics.
- add:
input
andunhandledInput
callbacks to allNode
.input
: is called whenever there is anInputEvent
generated and is propagated up the node tree until a node consumes it.unhandledInput
: is called when anInputEvent
isn't consumed byinput
or the UI.
- add:
resizable
,maximize
, andwindowPosition
configuration parameters to JVM. - add:
ppu
andppuInv
properties toSceneGraph
andNode
that allow setting the Pixels per Unit which is used for rendering. - add:
Material
class and property toCanvasItem
that can be used to set and change shaders, blend modes, and depth/stencil modes. - add:
AnimationState
optional state machine stack that can be to register animation states that will be played based on a predicate. - add:
CropType
options toTexturePacker
:NONE
,FLUSH_POSITION
, andKEEP_POSITION
. - add:
ShapeRenderer
class to handle drawing shapes, lines, and paths using aBatch
instance and aTextureSlice
.
- update:
SceneGraph
methodsresize()
,render()
, andinitialize()
asopen
. - update:
AnimationPlayer
to handle the way animations are queued and played back based on a stack.
- fix: clearing signals of all existing nodes when destroyed.
- fix:
LDtk
auto tile maps now only loop through tiles within the view bounds instead of all the tiles.
- add: Full Android support.
- add:
MutableTextureAtlas
class to combine existingTextureAtlas
,Texture
, andTextureSlice
types into a singleTextureAtlas
. - update:
vfsFile.readBitmapFont()
loader to allow passing in a list of existingTextureSlice
, such as from aTextureAtlas
. - update:
core
now includestools
as an api vs just **implementation. Required for the newMutableTextureAtlas
class. - JVM config: add
backgroundColor
option for initially setting background color. - JS config: add
backgroundColor
option for initially setting background color. - add:
Batch
interface. - update:
SpriteBatch
to use new interface. - update: all references to
SpriteBatch
withBatch
. - add: New batch implementation called
TextureArraySpriteBatch
that uses texture arrays to render multiple textures as a single draw call (GL 3+). - add: new helper methods for projecting / un-projecting coordinates on a
Camera
. - update:
GLVersion
to handle parsing version for OpenGL ES. - update:
Pointer
enum to support more than 3 pointers / touches (due to Android support). - update:
Pointer
with anindex
parameter for determine the actual index of the pointer / touch. - update:
Input
with newvibrate()
andcancelVibrate()
methods (Android support). - update
GLSLGenerator
to handle ES versions for mobile platforms. - BREAKING: remove:
getColorHex
andgetColorInt
methods fromLDtkIntGridLayer
. - add:
getColor()
that returns a newColor
instance toLDtkIntGridLayer
. - add:
truncate
string toFont
,FontCache
andGlyphLayout
. - add: ability to focus
Control
nodes and cycle through them with keyboard. - add:
onFocus
andonFocusLost
methods toControl
- BREAKING: move most UI enum classes to the specific Node class such as
SizeFlag
,StretchMode
, andAnchorLayout
- update:
SceneGraph
to trigger ui input events for keyboard - update:
BaseButton
to allow for triggering press signal with keyboard - update
Button
with new focus theme variable drawable - add:
LineEdit
control for editing single lines of text. - add:
Clipboard
support - add: showing/hiding soft keyboard for Android
- BREAKING: rename
InputMultiplexer
toInputMapController
- add: new
InputMapProcessor
interface withonAction
callbacks used withInputMapController
- update:
InputMapController
to handlePointer
types as a binding - update:
InputMapController
to handle key modifiers in a binding (SHIFT, CTRL, and ALT) - update:
SceneGraph
to use anInputMapController
and input actions - update:
SceneGraph
focus key binds to use action bindings - add: helper methods to set default UI input action bindings to for
SceneGraph
- add:
justTouched
andtouchJustReleased
methods toInput
- BREAKING: rename
onKeyTyped
toonCharType
. - add: new
onKeyRepeat
method toInputProcessor
- add: support for
KEY_REPEAT
event inSceneGraph
- BREAKING: move
StretchMode
intoTextureRect
class. - add:
TILE
stretch mode implementation toTextureRect
- add:
TextureProgress
control node - update:
NinePatch
to support setting source rectangle - BREAKING: update:
NinePatchRect
control node to use aTextureSlice
vs using aNinePatch
directly. - BREAKING: update
Scene
to use scoped lifecycle methods withContext
- BREAKING: update
Scene
to no longer inherit fromAssetProvider
- update:
Game
withvfs
andclipboard
properties - add: a return value to
Context
callback methods (onRender
,onPostRender
,onResize
,onDispose
,onPostRunnable
) that can be invoked once to remove the callback from being invoked. - add: new
SizeFlag
value ofNONE
which is the same as creating aSizeFlag(0)
- add: a new parameter to the
resize
method of aSceneGraph
to allow centering of the camera iftrue
. - update:
Context
callbacks (onRender
,onPosRender
,onResize
,onDispose
, andpostRunnable
) to return aRemoveContextCallback
lambda that can be invoked to remove itself from being called by theContext
. - update: the
resize()
method in aSceneGraph
to allow optional centering of camera. - update: LDtk version support to
1.0.0 beta3
- BREAKING: remove
readLDtkLevel
fromVfsLoaders
. - BREAKING: refactor
readLDtkMap
toreadLDtkMapLoader
. This now returns theLDtkMapLoader
which then can be used to callloadMap()
andloadLevel()
. - BREAKING: remove
LDtkWorld
andLDtkLevel
fromAssetProvider
default loaders - add: Passing in optional
TextureAtlas
when reading anLDtkMapLoader
. Requires preloading tileset textures in order to benefit from it. - add: Tiled map support. Includes, orthographic, isometric, and staggered map rendering support.
- update:
Rect
class is now open. - add:
extrude
,bleed
andbleedIterations
toTexturePacker
to prevent atlas bleeding and prevent filtering artifacts when RGB values are sampled for transparent pixels. - add
TexMinFilter
andTexMagFilter
constructor params toFrameBuffer
- fix: remove clearing color buffer in
LwjglContext
. - fix:
PathInfo
to handle./
. - fix:
InputQueueProcessor
from triggering any subsequent input processors if the input has been handled - fix:
InputQueueProcessor
not correctly resetting internal input events to be reused. - fix:
Pool
from freeing an allocated object when using a callback. - fix:
TextureSlice
using incorrect UV coordinates for a 1x1 slice - fix: LWJGL input not resetting the last char when typing
- fix:
TextureRect
not actually using the specified width and height for stretching - fix:
SceneGraph
focusing aControl
node that wasn't enabled - fix:
Node
not updating children nodes whenenable
value was changed. - fix:
Button
sometimes not calculating text size resulting in misplaced text - fix:
Label
sometimes not calculating text size resulting in misplaced text - fix:
GlyphLayoutRun
not correctly calculating next glyphadvance
value. - fix:
Button
text width calculations due toGlyphLayoutRun
glyphadvance
fix - fix:
LWJGL
application defaulting to graphic cardsvSync
setting whenvSync
was set to false. It now will properly turn offvSync
. - fix:
AnimationPlayer
not able to restart a current animation by usingstop()
and thenplay()
without having to swap animations.
Kotlin
from1.6.0
to1.6.10
LWJGL
from3.2.3
to3.3.0
kotlinx-coroutines
from1.6.0-RC
to1.6.0-native-mt
kotlinx-serialization
from1.3.1
to1.3.2
- Add JVM support
- Add JS support
- Add SceneGraph with Node and Node2D implementations
- Add UI built on top of SceneGraph
- Controls:
- Button
- Label
- Panel
- TextureRect
- NinePatchRect
- ProgressBar
- Containers:
- VBoxContainer and HBoxContainer
- PaddedContainer
- PanelContainer
- CenterContainer
- Controls:
- Add Virtual File System
- Add Shader support
- Add GLSL Generator for building shaders with Kotlin
- Add Texture Atlas support
- Add Bitmap Font support
- Add Audio streaming support
- Add Audio clips support
- Add math module
- Vectors
- Matrices
- Angles
- Point
- Bresenham
- Add sprite batching
- Add Scene class
- Add Game class for managing scenes
- Add Asset provider class to help load and prepare assets asynchronously
- Add App and Engine stats
- Add coroutine and async support and utilities
- Add LDtk tilemap support
- Add TTF file font parsing and loading
- Add GPU font rendering
- Add bin packer max rects algorithm
- Add texture packer tool
- Add Input processing with mouse, keyboard, and gamepad
- A Camera and Viewport support
- Add Logger
- Add Frame buffer objects support
- Add Particles support
- Add Animation support
- Add Color class