Changes / Fixes
This release fundamentally changes the implementation used for Endec/Codec interop. Instead of always using EDM as the intermediary format, the framework will now try to determine if a format-appropriate (De)Serializer
/DynamicOps
implementation is available and use it if so. This means that the serialized representation of all data structures should now be both consistent and preserved correctly when in complex nested scenarios, something we hope will alleviate an entire class of bugs. Most of these are related to serialized EDM which turns out unrepresentable in NBT, but other formats might have been affected too
Additions
CursorStyle
now includes the whole range of standard cursors implemented by GLFW (#296, chyzman)
Fixes
- Scissor coordinates are now clamped before passing them to OpenGL in the
ScissorStack
utility - this fixes a bunch of edge-cases with mods like Ok Boomer - Using a cursor style which is unsupported by the host OS no longer causes a crash when trying to dispose the screen (#301)
Additions
- An experimental API for deriving item stack components based on the user-provided components has been added (check
OwoItem#deriveStackComponents
). The current implementation only re-derives components whenItem#postProcessComponents
gets invoked and is subject to change
Changes
- Config screen providers are now registered through the new
ConfigScreenProviders
class to avoid classloading issues (the old methods onConfigScreen
remain but are deprecated for removal). Along with this change, the config screen generated by a provider no longer needs to extend owo'sConfigScreen
Fixes
- The
SyncedProperty
and screen handler messages APIs now properly pass registry context when serializing over the network - Recipe-specific remainders, which were not properly ported to 1.21, work again
Additions
- Minecraft's
ComponentType
s can now have both their codec and packet codec populated by calling.endec(...)
- A new overload for
CodecUtils.toEndec
along withCodecUtils.toEndecWithRegistries
allow creating endecs from both a codec and packetcodec (where the latter one uses a packetcodec ofRegistryByteBuf
) - The new
Surface.panorama(...)
allows using Minecraft's main menu panorama as an owo-ui surface Sizing.Random
Changes
- The
OwoItemSettings
-specific methods are now interface-injected onto all item settings and the previous class deprecated EndecRecipeSerializer
is no longer abstract, making subclassing unnecessary in most cases
Fixes
- A number of changes were made to the endec library and owo's
EdmOps
to alleviate most (hopefully all) problems related to codec <-> endec interop when NBT is involved (Blodhgarm) - Wrapper item groups (which broke during the port 1.21) now work again
MinecraftEndecs.PACKET_BYTE_BUF
no longer moves the reader index when encoding a buffer- A rare crash that could occur when causing input on a screen which failed loading its UI model has been fixed (#263, Zailer43)
- Pressing ctrl+delete in a text field in owo-ui debug mode no longer crashes (#264, Zailer43)
Color.ofDye
, which was improperly ported, now produces correct colors again (#273, Blodhgarm)OverlayContainer
no longer mounts its children incorrectly if it has a non-zero position (#278, kikugie)
This build is primarily a port of 0.12.9 to 1.21. This mandated a few other changes:
Endec changes
The Endec
API is no longer built into owo-lib. Instead, owo now uses and ships the standalone endec library. This entails four major changes:
- Endecs for Minecraft's types are no longer found on
BuiltInEndecs
but instead onMinecraftEndecs
- DFU interop (namely, converting between codecs and endecs) is now handled through
CodecUtils.toCodec/toEndec
and related functions - A number of package changes, primarily
io.wispforest.owo.serialization
->io.wispforest.endec
- All JSON-related implementations are now named after the JSON library they use. In consequence, the previous
JsonSerializer
is nowGsonSerializer
and so on
Further Fixes
EdmOps
no longer usesnull
as its empty value, fixing a number of edge cases with particular types of DFU codecs when doing interop- owo's
ScreenHandler
extensions don't require aHandledScreen
anymore and now also support other screens which implement `ScreenHandlerProvider
Additions
SpriteComponent
now supports sprites in the GUI atlasSpriteComponent
can now enable blending, using the same API asTextureComponent
Changes
- When hovering selectable areas in a
ColorPickerComponent
, the curses now uses theMOVE
style - The owo-config screen has been updated to Minecraft's new design language for option screens
- owo-ui errors which occur during the game's initial loading phase are now logged verbosely to hopefully aid in discovering how they are caused
Fixes
- owo-lib now works with (and requires) Fabric API 0.100.0+
- The owo-config search field now also searches when pressing the numpad's enter key
This release is primarily a (preliminary, hence beta) port of 0.12.6. However, prompted by the game's networking changes and further reliance on attaching registry references to serialization infrastructure, there have been major internal reworks to both the Networking API and Endec. The majority of these changes are transparent to users, with the exception of the occasional requirement to pass a SerializationContext
into Endec methods (the documentation will be updated accordingly).
Additions
- The new
Endec#flatFieldOf
function creates special struct fields which enable merging the fields of aStructEndec
into another one throughStructEndecBuilder.of
Fixes
- Optionals now get serialized properly by the EdmSerializer
- The
EXPAND
sizing method now works correctly in presence of a non-zerogap
when used inside aFlowLayout
(#219)
Additions
EdmElement
instances which hold aMAP
type can now be represented as anEdmMap
(which, importantly, implementsMapCarrier
and can thus be used withKeyedEndec
) usingEdmElement#asMap
(#209, Blodhgarm)- The components of a record used for owo networking (or, more specifically, for which an instance of
RecordEndec
is made) can now be annotated@NullableComponent
to support null serialization (#216, Blodhgarm)
Fixes
- When text with a click event of type
OPEN_URL
is clicked in an owo-ui label component, the resulting link confirmation screen now properly returns to the screen with label on it after the link has been confirmed/rejected by the user (#214) - The error message logged when an owo UI model hot reload fails no longer has mismatched format specifiers
- Hud addition/removal requests are now processed in invocation order at the beginning of every frame rendered while in a world (this solves weird ordering problems with addition/removal and fixes requests not being processed while the Hud is hidden) (#213)
Additions
A new sizing method joins the owo-ui framework - Sizing.expand
. It works mostly the same as Sizing.fill
(and indeed identically in a few cases) with the important difference that it applies after all other sizing types and only takes into account the space that remains after all other components have been inflated according to their sizing.
Along with this, the new Components.spacer
can be used to, for example, easily push two components to opposite ends of their parent
Changes
- The
OverlayContainer
no longer closes itself when its child is clicked inbounds but doesn't consume the event. Further, it prevents the screen from closing when ESC is pressed and instead only closes itself and it consumes all scroll events to avoid scrolling through the overlay(#199) - owo-ui component trees inside one of the screen implementations provided by owo (
BaseOwoScreen
andBaseOwoHandledScreen
) can now process and consume ESC keypresses
Fixes
- Only the most specific tooltip at a given mouse pointer location is now rendered by an owo-ui tree, fixing overlapping tooltips in the config screen (#95) and preventing tooltips from showing on components that are hidden by an overlay (like a color picker)
EntityComponent.RenderablePlayerEntity
now correctly loads skins againBaseComponent.hovered
is now only set totrue
when the component is not obscured by another one (#199)- When moving around the handles of a color picker, which one is affected no longer depends on the cursor position but only on which one was clicked
Additions
The major addition this time around is the Endec serialization framework, an interoperable alternative to Mojang's own Codec. As outlined in the changes section, this supersedes a bunch of older owo APIs as well - notably networking. To get started with endec, check out the newly written documentation: https://docs.wispforest.io/owo/endec/
Changes
NbtKey
and all associated API has been removed entirely in favor of the new, Endec-based and functionally extremely similarKeyedEndec
used in conjunction withMapCarrier
(which is interface-injected onto the same classes asNbtCarrier
used to be)PacketBufSerializer
has been removed in its entirety and all dependent API updated to use Endecs instead. For writing data directly to a network buffer like the old API used to allow, use the equivalent Endec (potentially obtained from theReflectiveEndecBuilder
) together with the interface-injectedPacketByteBuf#write(Endec, Object)
andPacketByteBuf#read(Endec)
- As a consequence of the update to 1.20.3+, the custom text API has been simplified. Because the vanilla changes make them redundant,
CustomTextContent
along withCustomTextContentSerializer
no longer exist - instead, simply implement the vanillaTextContent
interface, create aTextContent.Type
with the appropriate codec and register said type in theCustomTextRegistry
as before
Fixes
ScissorStack
now clamps the width/height passed toglScissor
to prevent causing OpenGL errors in contexts with funky transformations- All buffers in the draw context used for layers are now forcefully flushed before the layer is rendered to stop tooltips going missing due to scissoring in the layer
- Forcefully flush all buffers after drawing an owo-ui tooltip (similar issues as above)
Finally, the following previously deprecated API elements have been removed:
BaseParentComponent#mountChild
, use the new two-argument version instead to prevent unnecessary inflationsParentComponent#collectChildren
, replaced by the more appropriately named but functionally identicalParentComponent#collectDescendants
OwoItemGroup#setSelectedTab
,OwoItemGroup#getSelectedTab
andOwoItemGroup#getSelectedTabIndex
- use the new equivalents which are aware that multiple tabs can be selectedNinePatchRenderer
andOwoNinePatchRenderers
, long-replaced byNinePatchTexture
andOwoNinePatchTextures