46 lines
937 B
Go
46 lines
937 B
Go
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()
|
|
}
|