lattice/docs/getting-started.md
2026-07-10 01:43:19 -04:00

2 KiB

Getting started

Dependency

Publish Lattice to your local Maven repository:

nix-shell --run './gradlew publish'

Then in your mod:

repositories { mavenLocal() }
dependencies {
    implementation "xyz.meowing:lattice-26.1.2-fabric:1.0.0"
}

Declare "lattice": "*" in your fabric.mod.json depends block so the loader orders things correctly.

A first screen

import xyz.meowing.lattice.ui.*
import xyz.meowing.lattice.ui.component.*
import xyz.meowing.lattice.ui.theme.Theme
import xyz.meowing.lattice.ui.widget.Button

class HelloScreen : UIScreen("Hello") {
    override fun afterInitialization() {
        val panel = Rectangle(backgroundColor = Theme.surface, borderRadius = 8f)
            .setSizing(300f, Size.Pixels, 160f, Size.Pixels)
            .setPositioning(Pos.ScreenCenter, Pos.ScreenCenter)
            .childOf(window)

        Text("Hello, Lattice", fontSize = 16f)
            .setPositioning(0f, Pos.ParentCenter, 20f, Pos.ParentPixels)
            .childOf(panel)

        Button(text = "Close")
            .setPositioning(Pos.ParentCenter, Pos.ParentCenter)
            .onClick { onClose(); true }
            .childOf(panel)
    }
}

HelloScreen().display()   // opens on the next tick, thread-safe

afterInitialization runs once; build your element tree there and attach roots with childOf(window). Input, resize, and cleanup are handled by UIScreen. Override onRenderGui() for per-frame drawing after the window renders, onCloseGui() for teardown.

Drawing without a screen (HUDs)

import xyz.meowing.lattice.Lattice.eventBus
import xyz.meowing.lattice.Lattice.renderer
import xyz.meowing.lattice.event.RenderEvent

eventBus.register<RenderEvent.Gui> {
    renderer.text("hud text", 10f, 10f, 12f, 0xFFFFFFFF.toInt())
}

The event fires inside a prepared NanoVG frame every GUI frame; draw with Lattice.renderer directly. Coordinates are window pixels (render.Resolution.windowWidth/Height).