From 4d4c4da89270dd6ea7eb29c3e701cf85c38ae58a Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Sat, 24 Mar 2018 21:47:34 +0000 Subject: [PATCH] More .obj investigating. 0x80 seems to be a special value --- .gitignore | 1 + Makefile | 6 +- cmd/view-map/main.go | 4 +- cmd/view-obj/main.go | 134 ++++++++++++++++++++ doc/formats/img/altar_sprite_0.png | Bin 32536 -> 0 bytes doc/formats/img/altar_sprite_0_paletted.png | Bin 43411 -> 0 bytes doc/formats/obj.md | 52 +++----- internal/conv/object.go | 104 +++++++++------ internal/data/object.go | 34 +++-- scripts/try-uncompress | 33 ++++- 10 files changed, 269 insertions(+), 99 deletions(-) create mode 100644 cmd/view-obj/main.go delete mode 100644 doc/formats/img/altar_sprite_0.png delete mode 100644 doc/formats/img/altar_sprite_0_paletted.png diff --git a/.gitignore b/.gitignore index 20486e9..584d3f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /investigation /loader /orig +/view-obj /view-map /view-minimap /view-set diff --git a/Makefile b/Makefile index 1224b0a..151e65e 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,12 @@ srcfiles = $(shell find . -iname *.go) -all: loader view-map view-minimap view-set +all: loader view-obj view-map view-minimap view-set loader: $(srcfiles) go build -o loader ur.gs/ordoor/cmd/loader +view-obj: $(srcfiles) + go build -o view-obj ur.gs/ordoor/cmd/view-obj view-map: $(srcfiles) go build -o view-map ur.gs/ordoor/cmd/view-map @@ -16,6 +18,6 @@ view-set: $(srcfiles) go build -o view-set ur.gs/ordoor/cmd/view-set clean: - rm -f loader view-map view-minimap view-set + rm -f loader view-obj view-map view-minimap view-set .PHONY: all clean diff --git a/cmd/view-map/main.go b/cmd/view-map/main.go index 5a1ee2b..ea39a8d 100644 --- a/cmd/view-map/main.go +++ b/cmd/view-map/main.go @@ -158,8 +158,8 @@ func (s *state) present(pWin *pixelgl.Window) { // TODO: bounds clipping z := int(s.zIdx) - for y := int(gameMap.MaxLength - 1); y >= int(gameMap.MinLength); y-- { - for x := int(gameMap.MaxWidth - 1); x >= int(gameMap.MinWidth); x-- { + for y := int(gameMap.MinLength); y < int(gameMap.MaxLength); y++ { + for x := int(gameMap.MinWidth); x < int(gameMap.MaxWidth); x++ { cell := gameMap.Cells.At(x, y, z) diff --git a/cmd/view-obj/main.go b/cmd/view-obj/main.go new file mode 100644 index 0000000..1d2e3db --- /dev/null +++ b/cmd/view-obj/main.go @@ -0,0 +1,134 @@ +package main + +import ( + "flag" + "log" + "math" + "os" + "path/filepath" + + "github.com/faiface/pixel" + "github.com/faiface/pixel/pixelgl" + "golang.org/x/image/colornames" + + "ur.gs/ordoor/internal/conv" + "ur.gs/ordoor/internal/data" + "ur.gs/ordoor/internal/ui" +) + +var ( + gamePath = flag.String("game-path", "./orig", "Path to a WH40K: Chaos Gate installation") + objFile = flag.String("obj", "", "Path to a .obj file, e.g. ./orig/Obj/TZEENTCH.OBJ") +) + +type env struct { + obj *conv.Object +} + +type state struct { + env *env + + step int + spriteIdx int + + zoom float64 + + cam pixel.Matrix + camPos pixel.Vec +} + +func main() { + flag.Parse() + + if *gamePath == "" || *objFile == "" { + flag.Usage() + os.Exit(1) + } + + rawObj, err := data.LoadObject(*objFile) + if err != nil { + log.Fatalf("Failed to load %s: %v", *objFile, err) + } + obj := conv.ConvertObject(rawObj, filepath.Base(*objFile)) + + env := &env{obj: obj} + + // The main thread now belongs to pixelgl + pixelgl.Run(env.run) +} + +func (e *env) run() { + win, err := ui.NewWindow("View Object: " + *objFile) + if err != nil { + log.Fatal("Couldn't create window: %v", err) + } + + pWin := win.PixelWindow + state := &state{ + env: e, + camPos: pixel.V(0, float64(-pWin.Bounds().Size().Y)), + zoom: 8.0, + } + + // For now, just try to display the various objects + // left + right to change object, up + down to change frame + win.Run(func() { + oldState := *state + state = state.runStep(pWin) + + if oldState != *state || oldState.step == 0 { + log.Printf( + "new state: numSprites=%d sprite=%d zoom=%.2f", + len(state.env.obj.Sprites), + state.spriteIdx, + state.zoom, + ) + state.present(pWin) + } + + state.step += 1 + }) +} + +func (s *state) runStep(pWin *pixelgl.Window) *state { + newState := *s + newState.handleKeys(pWin) + + return &newState +} + +func (s *state) present(pWin *pixelgl.Window) { + obj := s.env.obj + sprite := obj.Sprites[s.spriteIdx] + + center := pWin.Bounds().Center() + + cam := pixel.IM + cam = cam.ScaledXY(center, pixel.Vec{1.0, -1.0}) // invert the Y axis + cam = cam.Scaled(center, s.zoom) // apply current zoom factor + //cam = cam.Moved(center.Sub(s.camPos)) // Make it central + //cam = cam.Rotated(center, -0.785) // Apply isometric angle + s.cam = cam + pWin.SetMatrix(s.cam) + + pWin.Clear(colornames.Black) + pixel.NewSprite(sprite.Pic, sprite.Pic.Bounds()).Draw(pWin, pixel.IM.Moved(center)) +} + +func (s *state) handleKeys(pWin *pixelgl.Window) { + + if pWin.JustPressed(pixelgl.KeyMinus) { + if s.spriteIdx > 0 { + s.spriteIdx -= 1 + } + } + + if pWin.JustPressed(pixelgl.KeyEqual) { + if s.spriteIdx < len(s.env.obj.Sprites)-1 { + s.spriteIdx += 1 + } + } + + // Zoom in and out with the mouse wheel + s.zoom *= math.Pow(1.2, pWin.MouseScroll().Y) +} diff --git a/doc/formats/img/altar_sprite_0.png b/doc/formats/img/altar_sprite_0.png deleted file mode 100644 index 087a795de9e96bf00ddb1daffb74d085ca503c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32536 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 z

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 3 { + + // For tiles, this has an inverse relationship with u0. Seems to add + // up to 0x42 in all cases, which matches byte 3 of the header? + //_ = int(pixels[0]) + + pixels = pixels[1:len(pixels)] + + // On tiles, this removes some junk around the edge, but doesn't + // seem to be reasonable in-general? + pixels = pixels[0 : len(pixels)-2] + } } - // Ignore the record separator - rowData = rowData[0 : len(rowData)-1] - leftPad := (int(sprite.Width) - len(rowData)) / 2 + log.Printf( + "%v %d: len(row)=%v, len(pixels)=%v sprWidth=%v u0=%v xOffset=%v", + name, idx, len(row), len(pixels), sprite.Width, u0, xOffset, + ) - // Set all bytes to be transparent by default - for allX := 0; allX < int(sprite.Width); allX++ { - idx := pic.Index(pixel.V(float64(allX), float64(y))) - pic.Pix[idx] = transparent - } - - for x, b := range rowData { - idx := pic.Index(pixel.V(float64(leftPad+x), float64(y))) - r, g, b, a := data.ColorPalette[int(b)].RGBA() - pic.Pix[idx] = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)} + for x, b := range pixels { + vec := pixel.V(float64(xOffset+x), float64(y)) + if err := setPaletteColor(pic, vec, b); err != nil { + log.Printf("%s %d: %d,%d: %v", name, idx, x, y, err) + } } } return pic } + +func setPaletteColor(pic *pixel.PictureData, point pixel.Vec, colorIdx byte) error { + idx := pic.Index(point) + + if idx > len(pic.Pix)-1 { + return fmt.Errorf("Got index %v which exceeds bounds", idx) + } + + r, g, b, a := data.ColorPalette[int(colorIdx)].RGBA() + color := color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)} + + pic.Pix[idx] = color + return nil +} diff --git a/internal/data/object.go b/internal/data/object.go index 4566886..0469533 100644 --- a/internal/data/object.go +++ b/internal/data/object.go @@ -1,7 +1,7 @@ package data import ( - "bytes" + "bufio" "encoding/binary" "fmt" "io" @@ -36,7 +36,7 @@ func (s SpriteHeader) Check(expectedSize uint32) error { type Sprite struct { SpriteHeader - PixelData []byte + Rows [][]byte } type dirEntry struct { @@ -113,27 +113,18 @@ func LoadObject(filename string) (*Object, error) { return nil, err } - // FIXME: this might - *might* - load interstitial data we don't really - // need, so wasting memory. - data, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - buf := bytes.NewReader(data) - for _, dirEntry := range dir { if err := dirEntry.Check(); err != nil { return nil, err } - if _, err := buf.Seek(int64(dirEntry.Offset), io.SeekStart); err != nil { + if _, err := f.Seek(int64(out.DataOffset+dirEntry.Offset), io.SeekStart); err != nil { return nil, err } sprite := &Sprite{} - if err := binary.Read(buf, binary.LittleEndian, &sprite.SpriteHeader); err != nil { + if err := binary.Read(f, binary.LittleEndian, &sprite.SpriteHeader); err != nil { return nil, err } @@ -141,11 +132,18 @@ func LoadObject(filename string) (*Object, error) { return nil, err } - // It's safe to assume that a `bytes.Reader` will always satisfy the - // requested read size. - sprite.PixelData = make([]byte, sprite.PixelSize) - if _, err := buf.Read(sprite.PixelData); err != nil { - return nil, err + // The pixeldata seems to be formed of Y null-terminated records, with + // varying numbers of bytes in each row. I don't know the internal + // structure yet, but there's definitely working pixel data in there + buf := bufio.NewReader(io.LimitReader(f, int64(sprite.PixelSize))) + sprite.Rows = make([][]byte, sprite.Height) + + for y := 0; y < int(sprite.Height); y++ { + if row, err := buf.ReadBytes(0x00); err != nil { + return nil, err + } else { + sprite.Rows[y] = row + } } out.Sprites = append(out.Sprites, sprite) diff --git a/scripts/try-uncompress b/scripts/try-uncompress index 1da8289..ddfcaf5 100755 --- a/scripts/try-uncompress +++ b/scripts/try-uncompress @@ -138,7 +138,7 @@ module Obj sprite_pixels = rel_data[hdr.pixel_range] records = sprite_pixels.split("\x00") - records.map { |record| record += "\x00" } + records.map! { |record| record += "\x00" } new(hdr, records, rel_data) end @@ -216,8 +216,8 @@ def display(data, blocksize=8, skip=0, header: false) out = [ "0x#{hex(i*blocksize, 4)}", block.map { |b| hex(b, 2) }, # hex - " | " + block.map { |b| text(b) }.join("") + " |", # ascii - block.map { |b| ascii(b) } ,# decimal bytes + # " | " + block.map { |b| text(b) }.join("") + " |", # ascii +# block.map { |b| ascii(b) } ,# decimal bytes "",# decimal 2-bytes # decimal 4-bytes ] @@ -273,7 +273,6 @@ def decompress(filename) break if data.empty? right = data.index(0) - if right.nil? print "error! end of chunk not found" @@ -360,9 +359,35 @@ def sprites(filename) end end +def sprite(filename, i) + obj = load_obj(filename) + + puts filename + ":" + spr = obj.sprites[i] + raise "No sprite #{i}" unless spr + + # Show the header + display(spr.raw[0...24], 4, header: true) + + spr.records.each_with_index do |record, i| + str = + if record.size > 40 + record[0...20].bytes.map { |b| hex(b, 2) }.join(" ") + + " ... " + + record[-20..-1].bytes.map { |b| hex(b, 2) }.join(" ") + else + record.bytes.map { |b| hex(b, 2) }.join(" ") + end + + puts "%4d: %4d bytes: %s"%[i,record.size, str] + end +end + case command = ARGV.shift when "sprites" then ARGV.each { |filename| sprites(filename) } +when "sprite" then + sprite(ARGV[0], ARGV[1].to_i) when "dump" then ARGV.each { |filename| dump(filename) } when "compare" then