oωo (owo-lib)

oωo (owo-lib)

Mod

A general utility, GUI and config library for modding on Fabric and Quilt

Client or server Library

242.0k downloads
374 followers
Created2 years ago
Updateda day ago

Filter loader...
Filter versions...
Filter channels...

Additions

  • Multiple tabs can now be selected simultaneously in a single OwoItemGroup (this behavior can be disabled for each group individually if not desired)
  • The new panelWithInset(...) surface allows building interfaces in the style of the Social Interactions screen
  • Sizing with different methods (for instance, content and fixed sizing) can now be animated between (there are no immediate API changes as a result of this, merely one less runtime warning and a new feature)
  • The base point (for layout calculations) and visual position (for rendering and interaction) of an owo-ui cmponent are now two separate concepts (this again comes without any breaking API changes, merely two new methods that should be called in the appropriate places)
  • Items can now automatically have their usage statistic tracked by owo through setting OwoItemSettings#trackUsageStat()
  • [Experimental] Screens can now implement the DisposableScreen interface if they need to be notified when the player actually closes all screens (that is, returns to the game) instead of immediately when navigating to a different screen (which might then later navigate back to the first screen)

Changes

  • Methods on owo-ui components which accept a collection of components now use upper-bounded generics instead of an explicit type to allow more specific collections at the call site
  • Sizing.fill() can now be called with zero arguments to indicate 100% fill
  • UIParsing.registerFactory(...) can and should now be called with an indentifier instead of a plain string for the element name
  • ParentComponent#childById(...) is no longer @Nullable, as it is generally expected to return a component in its most common use-case (querying the constituents of a UI model)

Fixes

  • Trimmed armor in an ItemComponent now renders properly (#152, Zailer43)
  • Explicitly positioned owo-ui components are no longer inflated twice for each single layout pass

Fixes

  • Component stacking is now properly undone to prevent messing with the global z-offset (#142)
  • owo-ui HUD components are now rendered with a z-offset of 100 by default to prevent overdraw by the chat overlay (#143)
  • The EULA reader now properly works in conjunction with YesCheat (#138)

Fixes

  • The ltr-text-flow algorithm for flow layouts no longer miscalculates its columns in some situations (#137)
  • Clearing the text field of a color config option no longer crashes the game (#128)
  • The owo-config annotation processor should now generate type interfaces in a deterministic order every time its ran (#139)

Changes

  • OwoUIDrawContext.of(...) now inherits the matrix- and scissor-stacks of the source context - this is more intuitive given how the method is named and used & fixes a few transform-related problems in owo-ui
  • The ReiUIAdapter now flushes the draw buffer when its finished rendering to prevent mysteriously empty tooltips
  • Item insertion order when transferring container->player inventory using ScreenUtils.handleSlotTransfer(...) has been reversed to match vanilla behavior

Additions

  • A set of new interface-injected methods on DrawContext enable easy, fluent matrix-stack manipulation directly on the associated draw context (#136, Blodhgarm)
  • owo-ui now also provides exclusion zones to EMI (#103, Abbie5)
  • ItemOps.decrementPlayerHandItem(...) and .emptyAwareDecrement(...) gained new overloads which accept a count instead of always decrementing by 1 (#141, chyzman)

Additions

Cross-referencing in UI models

When instantiating templates in a UI model, you can use the new <template-name>@<ui-model-id> syntax to reference a template from a different UI model. This allows much greater flexibility than before in modularizing and re-using templates across different screens.

Along with this change, the <components> element in UI model definitions is no longer required.

UI

  • The blur() surface now supports parsing from UI models
  • BaseOwo*Screen implementations now provide the component(...) shorthand for this.adapter.rootComponent.childById(...)
  • Layers can now align their components relative to Minecraft's handled screen coordinates using alignComponentToHandledScreenCoordinates(...) on the instance
  • Surface.PANEL_INSET was added, which renders an inset area to be used inside Surface.PANEL - this looks very similar to the vanilla recipe book panel
  • Two new components, smallCheckbox(...) and slimSlider(...), were added - they function mostly identically to the already existing counterparts, but (as the name implies) take up less space and offer more customizability
  • TextAreaComponent, a third new component, is an extension of vanilla's new EditBoxWidget for general-purpose use and optimized to play nicely within an owo-ui context
  • ItemComponent offers a new property, setTooltipFromStack, which always keeps the component's tooltip in sync with the item stack it's displaying
  • The height of each line a LabelComponent can now be configured using the new lineHeight property, which allows properly supporting non-standard fonts
  • Components can now be placed at fixed percentage across their parent without respecting the components own size using Positioning.across()
  • StackLayout respects much the same layout rules as FlowLayout, but doesn't place components next to each other - instead it places them on top of each other, thus creating a stack of components
  • Containers.ltrTextFlow(...) creates a new type of FlowLayout, which works just like Components.horizontalFlow(...) but wraps when it exceeds its own width - just like how left-to-right text is laid out in a document
  • Block, item, and entity components now support NBT (and in the case of blocks, block state data) when being parsed from a UI model

Config

Server-sided retrieval of a client's config options has been made more ergonomic. For this purpose, the generated config wrapper now exposes the key of each individual option through the .keys object. Further, ConfigSynchronizer.getClientOptions received a new override which directly accepts the config wrapper, enabling the following API:

var optionValue = ConfigSynchronizer.getClientOptions(player, MyMod.CONFIG).get(MyMod.CONFIG.keys.someOption);

Misc

  • owo-sentinel now lists the mod which included it in addition to all mods that depend on owo, in an effort to reduce confusion when mod authors don't declare their dependency (BasiqueEvangelist, #123)
  • AutoRegistryContainer provides two new convenience functions:
    • .register(...), which is simply an alias for FieldRegistrationHandler.register(...)
    • .conform(...), which forcefully casts a Class<?> to a Class<T> for implementing getTargetFieldType() for parametrized classes

Changes

UI

  • HUD now processes removal requests before add requests, allowing HUD components to be properly reloaded within the same frame
  • When the inspector draws slot indices in a handled screen, it now uses H: to denote the slot index in the handler and I: to indicate that slot's index into its respective inventory
  • The file(...) UI model data source is now deprecated in favor of a new, configurable hot reload system which is only active in development. This way, you cannot accidentally ship your mod with the file data source enabled, causing it to crash in production
  • NinePatchRenderer was renamed to NinePatchTexture and reworked to function in a data-driven manner. No old functionality has been removed yet, it was however deprecated. More details on how to use the new implementation will be added to the documentation shortly

Fixes

UI

  • ItemComponents once again use correct lighting on side-lit models and apply lighting properly when non-side-lit models are scaled down
  • LabelComponent now properly fetches the text style under the cursor when determining which hover and click events to execute
  • TextFieldWidget and EditBoxWidget now have their tick() function called when wrapped by owo-ui, making their cursors blink properly
  • ScrollContainer.scrollTo(...) now works properly on horizontal containers and has a new overload for directly specifying the target scroll offset without supplying a component

Config

  • owo-config screen providers are now once again properly listed in Mod Menu

Misc

  • ParticleSystemControllers no longer forcefully require handshaking when merely mentioned, fixing optional handshaking (BasiqueEvangelist, #123)
  • By utilizing new API within Roughly Enough Items, handled screens built with owo-ui now properly layer with the REI overlay - there should be no more over- and underdraw

Finally, the following previously deprecated API elements have been removed:

  • VerticalFlowLayout and HorizontalFlowLayout, which have been replaced by instantiating FlowLayout with the respective Algorithm
  • OptionComponent and OptionComponents.createSlider, which were replaced by OptionValueProvider and OptionComponents.createRangeControls respectivel
  • SliderComponent#onChanged, replaced by the respective event stream

Continuing the spirit of the last two releases, this build brings another very important fix - this time to config synchronization. The previous implementation had a bug where all synced options would be lost upon death of the player, which caused crashes specifically in conjunction with YIGD and Numismatic Overhaul

This should ideally be the last build that backports fixes from the 0.11 prereleases and therefor the last release for 1.19.4 before we move onto 1.20

Just like 0.10.4, this is another round of small fixes:

  • Fabric API fixed their implementation of the screen render event, leading to owo's workaround now breaking rendering of owo-ui layers
  • Lighting orientation on owo-ui item components was fixed, as proposed in #119

Similarly to 0.10.3, this build contains more changes to the core shader loading system.

The immediate effect of this is proper compatibility with the QSL implementation of Fabric's Core Shader API, although it should also make such incompatibilities much more unlikely to occur in the future

This build is indentical feature-wise to 0.10.3 for 1.19.3

This release primarily fixes compatibility with Fabric API's latest core shader registry addition. As such, Fabric API >=0.76.0 is now required.

Along with this, parsing order in owo-ui's text-box has been corrected to set max-length before reading text (#110)

Changes

The vertical and horizontal layout algorithms that were previously implemented in the respective subclasses of FlowLayout have been factored out into two implementations of the new Algorithm interface. The subclasses are temporarily preserved for backwards-compatibility but are deprecated and will be removed in the next major version.

Ideally you should already migrate your code to use the generic FlowLayout class to prepare for the move

Fixes

  • The injections into ShaderProgram are no longer required, which should fix compatibility with Satin on Quilt (#83)
  • Entity name tags are now rendered by default again, whereas before they would only appear after seeing an owo-ui entity component for the first time (#84)
  • Vanilla text fields (and thereby owo text boxes) are once again GreedyInputComponents
  • Yet another situation in which a scroll container could achieve a scroll value of NaN has been resolved

This build fixes a crash that would occur when Satin is installed alongside owo by allowing Satin's shader identifier fixin to take precedence of owo's very similar implementation

Additions

UI

  • The new ColorPickerComponent presents an easy-to-use, self-contained way to choose a color. It visually presents a standard HSV picker, with a hue (and optionally alpha) slider and picker for value and saturation. The picker itself shows neither a color preview nor hex field - these can easily be added externally via the color selection event stream supplied by the picker
  • UI overlays like popup dialogs can now be easily realized via the new OverlayContainer, accessible via Containers.overlay(...). This component, when added to some parent (in most cases the root), renders an overlay covering the entire parent and places its child in the center. By default, it automatically closes itself when a click event is received outside the child
  • ItemComponent features the new tooltipFromItem utility method, which can be used to gather the full tooltip of an item stack, including extra tooltip data
  • Rendering of nametags in EntityComponent can now be toggled on a per-component basis
  • The new openAsContextMenu function on DropdownComponent enables easy integration of context menus into any screen
  • Animations on component properties now provide the finished() event stream which emits every time the animation finishes a full run in either direction
  • RenderEffectWrapper, accessible via Containers.renderEffect offers a hassle-free way to apply arbitrary rendering effects to its children. Check out the component's javadoc for a more complete overview

Config

  • owo-ui's Color type is now supported in configs. This means it will be properly serialized as a string representing the color in #AARRGGBB format and displayed that way in the config screen. With this also comes an optional color picker, allowing your users to easily pick a color (optionally with alpha as well)
  • The Jankson serializer instance used by any given config wrapper can now be customized through the new, optional constructor parameter. This enables non-standard serialization of existing types and also allows serializing completely custom types
  • The @RangeConstraint annotation has gained the new decimalPlaces parameter which controls how many decimal places are shown when this option is edited as a slider

Rendering

The Drawer class has gained a few new rendering functions to fill in missing functionality:

  • drawCircle and drawRing can be used to draw either a filled circle or ring with specific inner and outer radius respectively
  • drawLine draws an arbitrary line as a quad instead of using OpenGL's line mode, which allows more correct control over thickness

Additionally, the new GlProgram class and corresponding infrastructure enables usage of custom core shaders from mod namespaces. Two default programs are provided, although they are not currently part of stable public API:

  • OwoClient.BLUR_PROGRAM applies an approximate gaussian blur to the area it draws over
  • OwoClient.HSV_PROGRAM works much the same as the standard position-color program, but accepts the color attribute in HSVA format instead of RGBA

Changes

UI

  • The HSV interface of Color has been improved: Constructing a color with a hue of 1 no longer causes it to become yellow instead of red and the new hsv() getter can be used to convert from RGB to HSV easily
  • The REI exclusion zone provider now gathers the components directly from the UI adapter instead of simply assuming that it's available as the first drawable child of the screen - this should fix some edge cases in which the exclusion zones were broken due to a different widget somehow being inserted into the screen before the UI adapter
  • The RenderablePlayerEntity inner class of EntityComponent is now publically accessible - this makes it easier to call methods on such entities and allows easily extending the class if so desired
  • DropdownComponent.requiresHover has been renamed to closeWhenNotHovered to more clearly communicate its purpose. The entire dropdown system has been slightly overhauled in general to be more visually pleasing and easier to use

Config

  • OptionComponentFactory.Result now features two type parameters to more cleanly carry information about the contained components
  • All numeric, range-constrained config options can now be edited with either a slider or text field, at the discretion of the user

Fixes

UI

  • Sprite components with ticked sprites should now properly animate with Sodium's "Only animate visible textures" option enabled (BasiqueEvangelist, #78)
  • When cycling UI component focus with the Tab key, the first component no longer get skipped and the children of a grid layout are no longer focused in reverse order (#77)
  • Fire and the nametags of entities are now properly aligned in EntityComponent
  • Buttons and checkboxes in dropdown can now be properly clicked on the entire width of the dropdown
  • Layers now handle event parameters in a different way that works around a memory present in Fabric API's event system. This previously caused owo screen instances to be leaked, which is no longer the case (#81)

Misc

  • Items from OwoItemGroup sub-tabs which are not the first one are now properly indexed for search in the creative inventory
  • owo-sentinel now one again has full functionality when running on the Quilt Loader

Refer to 0.9.3+1.19.3

This build primarily constitutes the first public release for 1.19.3. It also fixes a bug introduced in 0.9 which caused text field event listeners to break in production.

This build reverts a change made to the Item Group API when porting to 1.19.3 which caused the creative tabs of mods which use an owo Item Group without owo item settings to be empty. This affected primarily Conjuring (for which a separate update was released) and Numismatic Overhaul

This build fixes an NPE that would occur when config search focuses an option inside 2+ collapsed containers

Additions

UI

  • Cursor styling functionality from OwoUIAdapter is now available globally via the new CursorAdapter abstraction, which also provides the implementation for owo-ui
  • The new configure method on Component enables inline configuration of component properties which don't return the component itself. Due to limitations with Java's generic parameters, it is required to manually specify the type of component you're configuring when calling this method, like so: Components.label(...).<LabelComponent>configure(label -> label.mouseDown().subscribe(...)).
    Additionally, any state change events emitted during execution of such a configuration closure are delayed until the closure has completed - this enables large performance improvements when configuring multiple properties of a mounted component, including adding/removing children, as everything is consolidated into a single layout pass
  • The flow layout has gained the new gap property, which adds the specified amount of dead space between each child
  • Collapsible containers now expose the onToggled event stream as well as their current state
  • All components can now easily look up the root component in their respective tree using the new root() method
  • Text box max length can now be defined in XML with the max-length element
  • The new popFramesAndDraw method on ScissorStack, allows escaping up to the given amount of clipping frames and execute the supplied draw call
  • owo-ui colors can now generate a hex color string via the asHexString method
  • Entity components can now have an additional dynamic transform applied before rendering the entity
  • Components#textBox(...) no longer creates and returns a TextFieldWidget, instead it creates a TextBoxComponent. This is owo-ui's extension of the vanilla text field, which properly sizes itself if the background is disabled and provides the onChanged event stream. This stream only emits events when the text in the box actually changes, unlike the vanilla change listener

Config

  • The config screen now includes a search bar which allows searching through all options and sections by name and value. This search function acts like search in a text editor - you enter your query, then press enter, after which you can inspect all matches individually by pressing enter again
  • The new client-side /owo-config command can open all config screens for which a provider is registered, even when modmenu is not installed
  • Set<T> is now a supported type for config options

UI - Layers

Built on top of owo-ui, a new system called Layers has been introduced. This generic API allows adding, or layering if you will, owo-ui components onto arbitrary existing screens. It comes with a helper system that allows easily locating existing vanilla widgets on the screen, as well as the option to align your own components relative to them

Screen Handler Properties and Messages

The new createProperty along with addServerboundMessage and addClientboundMessage methods injected into ScreenHandler allow for a significant simplification of screen networking. Everything owo can serialize by default is supported out of the box for properties, which automatically get synchronized to the client, and for messages the same rules apply as for standard packets in an OwoNetChannel. As always, if a serializer is missing you can add your own via PacketBufSerializer.register(...)

This system should completely eliminate the need for externally defined networking, everything can be done directly inside the screen handler

Changes

ItemGroup API

  • Existing item groups can now be extended with additional sub-tabs and buttons via mod data
  • The name of a sub-tab is now displayed after the name of the item group, given that the tab does not have the new primary attribute
  • Each sub-tab can now declare its contained items more rigorously, as they now define a callback which gets executed to populate the group
  • [1.19.3 only] OwoItemGroups now define their icon in terms of an owo Icon, meaning you are no longer restricted to just item stacks

UI

  • Sliders have been migrated to use event streams just like other input events and gained the new slideEnd event stream which gets invoked when the user releases the slider handle
  • apply_ContentSizing in BaseComponent has been replaced by determnine_ContentSizing which now returns the content size instead of applying it directly

Moreover, the layout algorithm has received a major optimization that improves layout times in complex screens by up to 560%

Config

  • Additionally to the existing method, enum config options can now be translated on a per-config instead of a per-option level
  • When adding a new entry to a list config option while it isn't expanded, the list now opens itself and focuses the new entry (#68)
  • The previously private mechanism for registering config screen providers used by the @Modmenu annotation has been made public as ConfigScreen#registerProvider. This means that any potential custom config screen implementations can now be easily registered without needing an additional dependency on modmenu

Misc

  • The owo.forceDisableDebug system property is now deprecated and superseded by simply setting owo.debug to false

Fixes

UI

  • Scrollbars can no longer exceed the size of the container
  • When dragging the scrollbar in a precisely filled scroll container, the content no longer becomes invisible
  • All button renderers now properly draw with depth testing enabled
  • Text boxes, more specifically TextFieldWidget, now properly respond to focus events
  • The UI Interaction sound event is no longer added to the respective registry, which means that client-side mods which use owo no longer cause registry sync to fail (#72)
  • Animations on parent components no longer update twice per frame

Config

  • Section headers applied to @Nest options now show up properly
  • The config screen no longer attempts to apply constraints placed on List config options to that lists elements (#69)
  • owo is inherently funny

Misc

  • owo no longer crashes when run on a dev server

Removed deprecated elements

  • TexturedButtonComponent, superseded by ButtonComponent.Renderer#texture(...)
  • All methods in Components which returned ButtonWidget, superseded by ButtonComponent
  • ScreenUtils#generateSlotGrid and ScreenUtils#generatePlayerSlots, superseded by SlotGenerator
  • ScrollContainer.scrollbarColor, superseded by ScrollContainer.Scrollbar#color(...)

Changes

  • The slot management methods on BaseOwoHandledScreen now have overloads which directly accept a slot instance instead of just and ID
  • The Z-Offset of the inspector can now be customized in OwoUIAdapter
  • The new ReiUIAdapter#wrap(WidgetWithBounds) allows embedding most if not all of REI's existing Widgets in an owo-ui-based REI display category

Fixes

  • Mouse coordinates are now passed with proper offsets when propagating mouse events to the focused component

Changes

  • Texture components have a new property - blend. When this is enabled, OpenGL alpha blending is properly set up and you can use translucent textures
  • All synced config options are now synced in INFORM_SERVER fashion even when playing singleplayer

Fixes

  • The client-only renderdoc command is no longer registered on the server, allowing you to start servers with owo in debug mode again
  • The visible-area declaration in the UI Model XML schema no longer requires all values to be specified
  • The intersection comparisons used for mouse events and component visibility checks no longer over-account by one pixel
  • String config options can now contain backslashes (#59)

Changes

Component customization

  • Button rendering can now be completely customized, with a new flat renderer available among the defaults. This also means TexturedButtonComponent is now deprecated and superseded by the texture button renderer
  • Scrollbar rendering is now fully customizable as well. By default, this includes the two types of vanilla scrollbar used in game menus and the creative inventory screen as well as the default flat owo-ui scrollbar. Scroll containers can now also define an increment by which they are scrolled and the length of the scrollbar can be set to a fixed value
  • owo-ui now features the NinePatchRenderer utility, which can draw a nine-patch style texture in both tiled and stretched mode with next to no performance impact. This is used to enable the new scrollbar rendering and also allows buttons to scale to arbitrary sizes, contrary to the vanilla implementation. As it is also used to draw the panel surface, performance on all screens that use panels should be improved

RenderDoc integration

When RenderDoc is injected into a game instance with owo installed, you can now take advantage of comprehensive bindings to RenderDoc API. In-game this enables the new /renderdoc client command which opens a screen that lets you configure the RenderDoc overlay as well as take captures and launch the Replay UI. Additionally, when in an owo screen, CTRL+ALT+R can create a capture of only the draw calls relevant to screen - check out the docs over at https://docs.wispforest.io/owo/renderdoc/

Fixes

owo-ui

  • Scroll containers now properly account for their child's margins and mount it with the current scroll position already applied
  • Named text colors no longer need to be intentionally misspelled to get parsed properly
  • The inspector can no longer go offscreen
  • Vanilla widgets now properly propagate the focus events
  • Component visiblity is now checked with the model view transform applied
  • Labels no longer cause unnecessary state updates
  • Tooltips now properly respect overflow clipping and component visibility
  • Checkboxes now properly emit all checked/unchecked events

Other

  • @Nest config entries can now have the same name as their class (#52)
  • sentinel now always runs in console-mode on macOS (#51)

External resources



Project members

glisco

Owner

BasiqueEvangelist

Member


Technical information

License
MIT
Client side
optional
Server side
optional
Project ID