More .obj file diving

This commit is contained in:
2018-03-24 03:00:31 +00:00
parent ab3f053ef9
commit 6ba93486a1
3 changed files with 133 additions and 11 deletions

View File

@@ -19,6 +19,7 @@ module Obj
def self.parse(data)
hdr = new(*data[0..SIZE - 1].unpack("V*"))
pp hdr
hdr.validate!(data.bytes.size)
hdr
end
@@ -81,6 +82,8 @@ module Obj
DirEntry.parse(rel_data.byteslice(rel_offset, DirEntry::SIZE))
end
pp entries
new(entries)
end
@@ -128,18 +131,21 @@ module Obj
end
class Sprite
attr_reader :header, :data, :raw
attr_reader :header, :records, :raw
def self.parse(rel_data)
hdr = SpriteHeader.parse(rel_data)
sprite_pixels = rel_data[hdr.pixel_range]
new(hdr, sprite_pixels, rel_data)
records = sprite_pixels.split("\x00")
records.map { |record| record += "\x00" }
new(hdr, records, rel_data)
end
def initialize(header, data, raw = nil)
def initialize(header, records, raw = nil)
@header = header
@data = data
@records = records
@raw = raw
end
end
@@ -208,12 +214,12 @@ def display(data, blocksize=8, skip=0, header: false)
block.concat([nil]*(blocksize-block.size)) if block.size < blocksize
out = [
# "0x#{hex(i*blocksize, 4)}",
"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
# "",# decimal 2-bytes
# decimal 4-bytes
" | " + block.map { |b| text(b) }.join("") + " |", # ascii
block.map { |b| ascii(b) } ,# decimal bytes
"",# decimal 2-bytes
# decimal 4-bytes
]
puts out.flatten.join(' ')
@@ -231,7 +237,7 @@ def dump(filename, spriteno = -1)
if spriteno == -1
puts "Dumping all sprites for #{filename}"
obj.sprites.each { |sprite| display(sprite.raw, 2, header: true) }
obj.sprites.each_with_index { |sprite, i| puts "Sprite #{i}\n" ; display(sprite.raw, 8, header: true) }
else
puts "Dumping sprite #{spriteno} for #{filename}"
display(obj.sprites[spriteno])
@@ -260,7 +266,7 @@ def decompress(filename)
print "Sprite %02d... x=#{hdr.width} y=#{hdr.height}"%i
decompressed = []
data = sprite.data.bytes
data = sprite.raw[24..-1].bytes
hdr = sprite.header
loop do
@@ -331,6 +337,8 @@ def sprites(filename)
obj.sprites.each_with_index do |spr, i|
hdr = spr.header
px = hdr.width * hdr.height
pp hdr
pp spr
puts "%s %03d: %02x %02x %02x %02x %3d %3d %5d %5d %.2f %02x %02x ... %02x"%[