Skip to content

Any example on gogpu/ui integration? #5

Description

@striter-no

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)
	}
}

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions