Text + MXL logo pattern
This commit is contained in:
+37
-7
@@ -182,7 +182,7 @@ func flagSetAddFlags(fs *pflag.FlagSet, args *appArgs) {
|
||||
// Video pattern flags
|
||||
fs.Uint8VarP(&args.pattern, "pattern", "p", 0, "Video pattern type [TODO]")
|
||||
fs.BoolVar(&args.listPatterns, "list-patterns", false, "List video available video patterns and exit [TODO]")
|
||||
fs.StringVarP(&args.textOverlay, "text", "t", "", "Text overlay above video pattern [TODO]")
|
||||
fs.StringVarP(&args.textOverlay, "text", "t", "", "Text overlay above video pattern")
|
||||
fs.UintVar(&args.videoWidth, "width", 1920, "Video pattern width")
|
||||
fs.UintVar(&args.videoHeight, "height", 1080, "Video pattern height")
|
||||
fs.StringVar(&args.videoFPS, "fps", "25", "Video pattern FPS")
|
||||
@@ -261,12 +261,37 @@ func main() {
|
||||
// TODO: if init failed -> CPU generator
|
||||
// But before i should create same patterns for both generators
|
||||
// and text overlays
|
||||
gen, err := generator.NewWGPUGenerator(vi.width, vi.height, "kernels/v210_bars_move.wgsl")
|
||||
kernel := "kernels/v210_bars_move.wgsl"
|
||||
// kernel = "kernels/v210_dvd_logo.wgsl"
|
||||
var genOpts []generator.WGPUOption
|
||||
if kernel == "kernels/v210_dvd_logo.wgsl" {
|
||||
plane, err := generator.LoadLogoPNG("assets/mxl.png")
|
||||
if err != nil {
|
||||
log.Fatalf("logo load failed: %v", err)
|
||||
}
|
||||
genOpts = append(genOpts, generator.WithLogo(plane))
|
||||
}
|
||||
gen, err := generator.NewWGPUGenerator(vi.width, vi.height, kernel, genOpts...)
|
||||
if err != nil {
|
||||
log.Fatalf("wgpu init failed: %v", err)
|
||||
}
|
||||
defer gen.Close()
|
||||
|
||||
// Static text overlay: rasterized + pre-packed once, stamped on each
|
||||
// frame after the GPU render (microseconds per frame).
|
||||
var overlay *generator.TextOverlay
|
||||
if args.textOverlay != "" {
|
||||
face, err := generator.LoadFace("assets/fonts/JetBrainsMonoNLNerdFontMono-Regular.ttf", 48)
|
||||
if err != nil {
|
||||
log.Fatalf("text overlay init failed: %v", err)
|
||||
}
|
||||
defer face.Close()
|
||||
overlay, err = generator.NewTextOverlay(args.textOverlay, int(vi.width), int(vi.height), face)
|
||||
if err != nil {
|
||||
log.Fatalf("text overlay init failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
inst, err := mxl.NewInstance(mxlDomain, "")
|
||||
if err != nil {
|
||||
log.Fatalf("MXL Init Failed: %v", err)
|
||||
@@ -291,14 +316,14 @@ func main() {
|
||||
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
// core loop
|
||||
var written int64
|
||||
var grainsWritten int64
|
||||
// animation clock: small counter, not the huge grain index.
|
||||
// Reason: current wgpu shaders limitations
|
||||
var tick uint32
|
||||
for {
|
||||
select {
|
||||
case <-stop:
|
||||
log.Printf("stopping after %d grains", written)
|
||||
log.Printf("stopping after %d grains", grainsWritten)
|
||||
return
|
||||
default:
|
||||
}
|
||||
@@ -310,15 +335,20 @@ func main() {
|
||||
if err := gen.GenerateFrame(gwa.Payload, int(tick)); err != nil {
|
||||
log.Fatalf("GenerateFrame(%d): %v", idx, err)
|
||||
}
|
||||
if overlay != nil {
|
||||
if err := overlay.ApplyV210(gwa.Payload); err != nil {
|
||||
log.Fatalf("text overlay: %v", err)
|
||||
}
|
||||
}
|
||||
if err := gwa.Commit(gwa.TotalSlices, 0); err != nil {
|
||||
log.Fatalf("Commit(%d): %v", idx, err)
|
||||
}
|
||||
|
||||
written++
|
||||
grainsWritten++
|
||||
idx++
|
||||
tick++
|
||||
if written%100 == 0 {
|
||||
log.Printf("grains written=%d, index=%d", written, idx)
|
||||
if grainsWritten%100 == 0 {
|
||||
log.Printf("grains written=%d, index=%d", grainsWritten, idx)
|
||||
}
|
||||
// Pace ourselves to roughly the grain rate
|
||||
mxl.SleepNs(mxl.NsUntilIndex(idx, rate))
|
||||
|
||||
Reference in New Issue
Block a user