zworld/engine/frame.go

46 lines
937 B
Go
Raw Permalink Normal View History

2024-01-14 22:56:06 +08:00
package engine
import (
osimage "image"
"runtime"
"zworld/engine/object"
"zworld/engine/render/graph"
"zworld/engine/renderapi/image"
"zworld/engine/renderapi/vulkan"
)
// Render a single frame and return it as *image.RGBA
func Frame(args Args, scenefuncs ...SceneFunc) *osimage.RGBA {
runtime.LockOSThread()
backend := vulkan.New("goworld", 0)
defer backend.Destroy()
if args.Renderer == nil {
args.Renderer = graph.Default
}
buffer := vulkan.NewColorTarget(backend.Device(), "output", image.FormatRGBA8Unorm, vulkan.TargetSize{
Width: args.Width,
Height: args.Height,
Frames: 1,
Scale: 1,
})
defer buffer.Destroy()
// create renderer
renderer := args.Renderer(backend, buffer)
defer renderer.Destroy()
// create scene
scene := object.Empty("Scene")
for _, scenefunc := range scenefuncs {
scenefunc(scene)
}
scene.Update(scene, 0)
renderer.Draw(scene, 0, 0)
return renderer.Screengrab()
}