More .obj investigating. 0x80 seems to be a special value
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user