LEGUI
repository·develop·Indexed 43 days ago
https://github.com/spinyowl/leguiA Java/Kotlin GUI library for LWJGL3-based OpenGL applications. It provides a Swing-like API for integrating user interfaces into high-performance graphics applications and requires Java 11 or higher. The default renderer is built on NanoVG and allows for custom rendering logic via the RendererProvider interface.
What's inside LEGUI
- LEGUI is a GUI implementation designed for use with LWJGL3. It allows developers to quickly and easily integrate user interfaces into OpenGL applications written in Java or Kotlin. The API is designed to be similar to the Swing API, making it familiar to Java developers.
Add LEGUI dependency via Gradle
developAdd the following line to your Gradle build script. Ensure you replace
${legui_version}with the desired version.// LEGUI - https://github.com/SpinyOwl/legui compile group: 'com.spinyowl', name: 'legui', version: "${legui_version}";Add LEGUI dependency via Maven
developAdd the following dependency to your
pom.xml. Ensure you replace${legui_version}with the desired version.<!-- LEGUI - https://github.com/SpinyOwl/legui --> <dependency> <groupId>com.spinyowl</groupId> <artifactId>legui</artifactId> <version>${legui_version}</version> </dependency>Configure repositories for LEGUI and dependencies
developTo use LEGUI, you must configure your build tool to include the following repositories:
For LWJGL and JOML
https://oss.sonatype.org/content/repositories/snapshots/(for snapshots)https://oss.sonatype.org/content/repositories/releases/(for releases)
For LEGUI and CBCHAIN
https://raw.github.com/SpinyOwl/repo/releases
System requirements for LEGUI
developLEGUI requires Java 11 or higher.OpenGL state touched by the LEGUI backend
developThe default renderer is built on top of NanoVG. Developers should be aware that the backend modifies several OpenGL states:
Pixel Store States
When textures are uploaded or updated (e.g., loading images or adding new font glyphs), the following pixel store settings are reset to defaults:
GL_UNPACK_ALIGNMENTGL_UNPACK_ROW_LENGTHGL_UNPACK_SKIP_PIXELSGL_UNPACK_SKIP_ROWS
Texture binding is also affected.
Rendering Lifecycle
Glyphs are added as needed at the start and end of the
render()method. The data for the entire frame is buffered and flushed at the end of rendering.Affected OpenGL Commands
The rendering code utilizes the following state changes:
glUseProgram(prog); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDisable(GL_SCISSOR_TEST); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilMask(0xffffffff); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc(GL_ALWAYS, 0, 0xffffffff); glActiveTexture(GL_TEXTURE0); glBindBuffer(GL_UNIFORM_BUFFER, buf); glBindVertexArray(arr); glBindBuffer(GL_ARRAY_BUFFER, buf); glBindTexture(GL_TEXTURE_2D, tex); glUniformBlockBinding(... , GLNVG_FRAG_BINDING);Retrieve renderers from RendererProvider
developUse the
RendererProviderto look up the appropriate renderer for a given class. This is useful when the system needs to determine how to draw a specific object type at runtime.Available lookup methods:
getComponentRenderer(Class<C> componentClass)getBorderRenderer(Class<C> borderClass)getIconRenderer(Class<I> iconClass)getImageRenderer(Class<I> imageClass)getComponentRenderers(): Returns a list of all registeredComponentRendererinstances.
Register custom renderers via RendererProvider
developA
RendererProviderallows you to register specific renderers for different types of LEGUI objects. You can add renderers for components, borders, icons, and images using the following methods:addComponentRenderer(Class<C> componentClass, R renderer)addBorderRenderer(Class<C> borderClass, R renderer)addIconRenderer(Class<I> iconClass, R renderer)addImageRenderer(Class<I> imageClass, R renderer)
These methods allow you to associate a specific implementation of a
ComponentRenderer,BorderRenderer,IconRenderer, orImageRendererwith a specific class type.// Example of adding a custom component renderer rendererProvider.addComponentRenderer(MyCustomComponent.class, myCustomComponentRenderer);Implement a custom RendererProvider
developTo extend LEGUI's rendering capabilities, implement the
RendererProviderinterface. This interface allows you to map specific component, border, icon, or image classes to their respective specialized renderers.By default, the system uses
NvgRendererProvider. You can override this global provider usingRendererProvider.setRendererProvider(RendererProvider provider)to inject your own rendering logic into the system.// Example of setting a custom provider RendererProvider.setRendererProvider(myCustomRendererProvider);