LEGUI

repository·develop·Indexed 43 days ago

https://github.com/spinyowl/legui

A 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.

Tokens
1.4K
Snippets
5
Records
9
Agent score
6%

What's inside LEGUI

  1. What is LEGUI?

    develop
    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.
  2. Add LEGUI dependency via Gradle

    develop

    Add 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}";
  3. Add LEGUI dependency via Maven

    develop

    Add 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>
  4. Configure repositories for LEGUI and dependencies

    develop

    To 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
  5. OpenGL state touched by the LEGUI backend

    develop

    The 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_ALIGNMENT
    • GL_UNPACK_ROW_LENGTH
    • GL_UNPACK_SKIP_PIXELS
    • GL_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);
  6. Retrieve renderers from RendererProvider

    develop

    Use the RendererProvider to 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 registered ComponentRenderer instances.
  7. Register custom renderers via RendererProvider

    develop

    A RendererProvider allows 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, or ImageRenderer with a specific class type.

    // Example of adding a custom component renderer
    rendererProvider.addComponentRenderer(MyCustomComponent.class, myCustomComponentRenderer);
  8. Implement a custom RendererProvider

    develop

    To extend LEGUI's rendering capabilities, implement the RendererProvider interface. 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 using RendererProvider.setRendererProvider(RendererProvider provider) to inject your own rendering logic into the system.

    // Example of setting a custom provider
    RendererProvider.setRendererProvider(myCustomRendererProvider);