From 5ee1ceb532206ff739f898b30d26ccf8e92bae1b Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Wed, 21 Mar 2018 22:49:46 +0000 Subject: [PATCH] Sprites in .obj files are composed of Y null-separated records with a probable type field --- cmd/view-set/main.go | 52 +++++++++++++++++---- doc/formats/img/altar_sprite_0.png | Bin 0 -> 32536 bytes doc/formats/obj.md | 70 ++++++++++++----------------- scripts/try-uncompress | 25 ++++++----- 4 files changed, 88 insertions(+), 59 deletions(-) create mode 100644 doc/formats/img/altar_sprite_0.png diff --git a/cmd/view-set/main.go b/cmd/view-set/main.go index 610dd86..849dc4a 100644 --- a/cmd/view-set/main.go +++ b/cmd/view-set/main.go @@ -1,8 +1,9 @@ package main import ( + "bytes" "flag" -// "image/color" + "image/color" "log" "math" "os" @@ -96,7 +97,7 @@ func (e *env) run() { "new state: numObj=%d object=%d (%s) numFrames=%d sprite=%d zoom=%.2f", state.env.set.Count(), state.objIdx, - state.env.set.Palette[state.objIdx], + state.env.set.Palette[state.objIdx], // FIXME: palette is a confusing name state.curObject().NumSprites, state.spriteIdx, state.zoom, @@ -115,22 +116,57 @@ func (s *state) runStep(pWin *pixelgl.Window) *state { return &newState } +// WIP. Try to convert the pixeldata into a picture. +func spriteToPic(sprite *data.Sprite) *pixel.PictureData { + pic := pixel.MakePictureData(pixel.R(float64(0), float64(0), float64(sprite.Width), float64(sprite.Height))) + + buf := bytes.NewBuffer(sprite.PixelData) + + // The pixeldata seems to be formed of Y null-terminated records, with + // varying numbers of bytes in each row. Probably [type, *data] but ignore + // type for now. + // + // Theory: perhaps the data in each X is centered around the origin? + for y := 0; y < int(sprite.Height); y++ { + rowData, err := buf.ReadBytes(0) + if err != nil { + log.Printf("Error at y=%d: %v", y, err) + continue + } + + leftPad := (int(sprite.Width) - len(rowData)) / 2 + + for x, b := range rowData { + idx := pic.Index(pixel.V(float64(leftPad+x), float64(y))) + pic.Pix[idx] = color.RGBA{ + R: b, + G: b, + B: b, + A: 255, + } + } + } + + return pic +} + func (s *state) present(pWin *pixelgl.Window) { -// obj := s.curObject() -// sprite := obj.Sprites[s.spriteIdx] + obj := s.curObject() + sprite := obj.Sprites[s.spriteIdx] + pic := spriteToPic(sprite) center := pWin.Bounds().Center() cam := pixel.IM -// cam = cam.ScaledXY(pixel.ZV, pixel.Vec{1.0, -1.0}) // invert the Y axis - cam = cam.Scaled(center, s.zoom) // apply current zoom factor + 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.White) -// pixel.NewSprite(pic, pic.Bounds()).Draw(pWin, pixel.IM.Moved(center)) + pWin.Clear(colornames.Black) + pixel.NewSprite(pic, pic.Bounds()).Draw(pWin, pixel.IM.Moved(center)) } func (s *state) handleKeys(pWin *pixelgl.Window) { diff --git a/doc/formats/img/altar_sprite_0.png b/doc/formats/img/altar_sprite_0.png new file mode 100644 index 0000000000000000000000000000000000000000..087a795de9e96bf00ddb1daffb74d085ca503c85 GIT binary patch literal 32536 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 0 + + header! + decompressed.each_with_index do |line, y| + x = line.size + padding = (sprite.header.width - x) / 2 + display((["\x00"]*padding + line.map(&:chr)).join(""), line.size+padding.size) + end end end