lazarus/tools/viewer/main.go

144 lines
2.9 KiB
Go
Raw Normal View History

2018-12-18 02:16:52 +00:00
package main
2018-12-22 03:44:19 +00:00
import (
"flag"
"fmt"
2018-12-22 03:44:19 +00:00
"image/color"
"log"
"os"
"path/filepath"
2018-12-18 02:16:52 +00:00
2018-12-30 01:04:37 +00:00
imgui "github.com/FooSoft/imgui-go"
2018-12-22 03:44:19 +00:00
"github.com/FooSoft/lazarus/formats/dat"
"github.com/FooSoft/lazarus/formats/dc6"
"github.com/FooSoft/lazarus/math"
"github.com/FooSoft/lazarus/platform"
2018-12-22 03:44:19 +00:00
)
func loadPalette(path string) (*dat.Palette, error) {
fp, err := os.Open(path)
if err != nil {
return nil, err
}
defer fp.Close()
return dat.NewFromReader(fp)
}
func loadSprite(path string) (*dc6.Sprite, error) {
fp, err := os.Open(path)
if err != nil {
return nil, err
}
defer fp.Close()
return dc6.NewFromReader(fp)
}
type scene struct {
sprite *dc6.Sprite
palette *dat.Palette
texture *platform.Texture
directionIndex int32
frameIndex int32
}
2018-12-18 02:16:52 +00:00
func (s *scene) Init(window *platform.Window) error {
return nil
}
func (s *scene) Shutdown(window *platform.Window) error {
if s.texture == nil {
return nil
}
return s.texture.Destroy()
}
2018-12-22 03:44:19 +00:00
func (s *scene) Advance(window *platform.Window) error {
var (
directionIndex = s.directionIndex
frameIndex = s.frameIndex
)
direction := s.sprite.Directions[directionIndex]
if imgui.SliderInt("Direction", &directionIndex, 0, int32(len(s.sprite.Directions))-1) {
frameIndex = 0
}
frame := direction.Frames[frameIndex]
imgui.SliderInt("Frame", &frameIndex, 0, int32(len(direction.Frames))-1)
if s.texture == nil || directionIndex != s.directionIndex || frameIndex != s.frameIndex {
colors := make([]color.RGBA, frame.Width*frame.Height)
for y := 0; y < frame.Height; y++ {
for x := 0; x < frame.Width; x++ {
colors[y*frame.Width+x] = s.palette.Colors[frame.Data[y*frame.Width+x]]
}
}
var err error
s.texture, err = window.CreateTextureRgba(colors, frame.Width, frame.Height)
if err != nil {
return err
}
}
2018-12-30 01:04:37 +00:00
window.RenderTexture(
s.texture,
math.Rect4i{X: 0, Y: 0, W: 256, H: 256},
math.Rect4i{X: 0, Y: 0, W: 256, H: 256},
)
s.directionIndex = directionIndex
s.frameIndex = frameIndex
return nil
}
2018-12-22 03:44:19 +00:00
func main() {
var (
palettePath = flag.String("palette", "", "path to palette file")
)
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [options] file\n", filepath.Base(os.Args[0]))
fmt.Fprintf(os.Stderr, "Parameters:\n\n")
flag.PrintDefaults()
}
flag.Parse()
if flag.NArg() < 1 {
flag.Usage()
os.Exit(2)
}
sprite, err := loadSprite(flag.Arg(0))
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
palette := new(dat.Palette)
if len(*palettePath) > 0 {
palette, err = loadPalette(*palettePath)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
platform.Init()
defer platform.Shutdown()
scene := &scene{sprite: sprite, palette: palette}
window, err := platform.CreateWindow("Viewer", 1280, 720, scene)
2018-12-18 02:16:52 +00:00
if err != nil {
2018-12-22 03:44:19 +00:00
log.Fatal(err)
2018-12-18 02:16:52 +00:00
}
defer window.Destroy()
2018-12-18 02:16:52 +00:00
if err := platform.ProcessEvents(); err != nil {
log.Fatal(err)
2018-12-18 02:16:52 +00:00
}
}