More .obj investigating. 0x80 seems to be a special value

This commit is contained in:
2018-03-24 21:47:34 +00:00
parent 6ba93486a1
commit 4d4c4da892
10 changed files with 269 additions and 99 deletions

View File

@@ -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)