Tried to use gogpu/ui with gogpu/g3d, seems it needs some additional work to make them work together. This naive approach does not work:
package main
import (
"log"
"github.com/gogpu/g3d"
"github.com/gogpu/gogpu"
uapp "github.com/gogpu/ui/app"
"github.com/gogpu/ui/desktop"
"github.com/gogpu/ui/primitives"
"github.com/gogpu/ui/theme/material3"
"github.com/gogpu/ui/widget"
)
func main() {
m3 := material3.New(widget.Hex(0x6750A4))
app := gogpu.NewApp(gogpu.DefaultConfig().
WithTitle("g3d Hello Cube").
WithSize(800, 600))
ui := uapp.New(
uapp.WithWindowProvider(app),
uapp.WithPlatformProvider(app),
uapp.WithEventSource(app.EventSource()),
uapp.WithTheme(m3.AsTheme()),
)
ui.SetRoot(primitives.Box(
primitives.Text("Test of the UI in 3D").
FontSize(12).
Bold().
Color(widget.RGBA8(33, 33, 33, 255)),
).Background(widget.RGBA8(255, 255, 255, 0)))
scene := g3d.NewScene()
scene.SetBackground(g3d.RGB(0.1, 0.1, 0.15))
// Ambient light (no spatial properties — attached via UserData on a container node)
ambient := g3d.NewAmbientLight(g3d.WithLightColor(g3d.White), g3d.WithLightIntensity(0.3))
ambientNode := g3d.NewNode()
ambientNode.SetUserData(ambient)
scene.Add(ambientNode)
// Directional light (sun-like, from upper-right)
sun := g3d.NewDirectionalLight(g3d.WithLightColor(g3d.White), g3d.WithLightIntensity(1.0))
sun.LightNode().SetRotation(g3d.Euler{X: g3d.Radians(-45), Y: g3d.Radians(30)})
scene.Add(sun.LightNode())
// Cube mesh with PBR material
cube := g3d.NewMesh(
g3d.NewBoxGeometry(1, 1, 1),
g3d.NewStandardMaterial(
g3d.WithColor(g3d.RGB(0.4, 0.7, 1.0)),
g3d.WithRoughness(0.6),
),
)
scene.Add(cube.MeshNode())
// Camera
camera := g3d.NewPerspectiveCamera(75, 800.0/600.0, 0.1, 1000)
camera.CameraNode().SetPosition(g3d.Vec3{X: 0, Y: 0.5, Z: 3})
var renderer *g3d.Renderer
app.OnUpdate(func(dt float64) {
r := cube.MeshNode().Rotation
r.Y += float32(dt)
cube.MeshNode().SetRotation(r)
})
app.OnDraw(func(ctx *gogpu.Context) {
if renderer == nil {
var err error
renderer, err = g3d.NewRenderer(app.GPUContextProvider())
if err != nil {
log.Fatal(err)
}
}
fbW, fbH := ctx.FramebufferSize()
renderer.SetSize(uint32(fbW), uint32(fbH))
if view := ctx.SurfaceView(); view != nil {
_ = renderer.Render(scene, camera, view)
}
})
app.OnClose(func() {
if renderer != nil {
renderer.Release()
}
})
// if err := app.Run(); err != nil {
// log.Fatal(err)
// }
if err := desktop.Run(app, ui); err != nil {
log.Fatal(err)
}
}
Tried to use
gogpu/uiwithgogpu/g3d, seems it needs some additional work to make them work together. This naive approach does not work: