completed Shapes code

png-branch
an 2019-02-12 06:32:10 -05:00
parent 8c6543030c
commit 92a845c02e
2 changed files with 118 additions and 60 deletions

View File

@ -74,9 +74,11 @@ fn process_shp(b: &[u8]) -> ResultS<()>
for (i, cl) in shp::testfn_replaceme(b)?.iter().enumerate() {
if let Some(cl) = &cl.0 {
shp::testfn_dump_bitmaps(cl, i)?;
eprintln!("<{} lo> {:#?}\n{:#?}", i, cl.frms, cl.seqs);
}
if let Some(cl) = &cl.1 {
shp::testfn_dump_bitmaps(cl, i + 100)?;
eprintln!("<{} hi> {:#?}\n{:#?}", i, cl.frms, cl.seqs);
}
}

View File

@ -95,12 +95,12 @@ fn bitmap(b: &[u8]) -> ResultS<Bitmap>
Ok(bmp)
}
fn bmp_coll(b: &[u8], bmp_ofs: usize, bmp_num: usize) -> ResultS<Vec<Bitmap>>
fn bmp_coll(b: &[u8], ofs: usize, num: usize) -> ResultS<Vec<Bitmap>>
{
let mut bmps = Vec::with_capacity(bmp_num);
let mut p = bmp_ofs;
let mut bmps = Vec::with_capacity(num);
let mut p = ofs;
for _ in 0..bmp_num {
for _ in 0..num {
let ofs = c_u32b(b, p)? as usize;
bmps.push(bitmap(c_data(b, ofs..)?)?);
p += 4;
@ -109,39 +109,42 @@ fn bmp_coll(b: &[u8], bmp_ofs: usize, bmp_num: usize) -> ResultS<Vec<Bitmap>>
Ok(bmps)
}
/*
fn frame(b: &[u8]) -> ResultS<()>
fn frame(b: &[u8]) -> ResultS<Frame>
{
let flags = c_u16b(b, 0)?;
let minlight = c_u32b(b, 2)?;
let bmp_ind = c_u16b(b, 6)?;
// orig_x = c_i16b(b, 8)?;
// orig_y = c_i16b(b, 10)?;
// key_x = c_i16b(b, 12)?;
// key_y = c_i16b(b, 14)?;
let wrl_l = c_i16b(b, 16)?;
let wrl_r = c_i16b(b, 18)?;
let wrl_t = c_i16b(b, 20)?;
let wrl_b = c_i16b(b, 22)?;
let wrl_x = c_i16b(b, 24)?;
let wrl_y = c_i16b(b, 26)?;
let flags = ok!(FrameFlags::from_bits(flags), "bad flag")?;
let minlight = Fx32::from_bits(minlight);
let flags = c_u16b(b, 0)?;
let min_lt = c_u32b(b, 2)?;
let bmp_ind = c_u16b(b, 6)? as usize;
// orig_x = c_i16b(b, 8)?;
// orig_y = c_i16b(b, 10)?;
// key_x = c_i16b(b, 12)?;
// key_y = c_i16b(b, 14)?;
let wrl_l = c_i16b(b, 16)?;
let wrl_r = c_i16b(b, 18)?;
let wrl_t = c_i16b(b, 20)?;
let wrl_b = c_i16b(b, 22)?;
let wrl_x = c_i16b(b, 24)?;
let wrl_y = c_i16b(b, 26)?;
let flags = ok!(FrameFlags::from_bits(flags), "bad flag")?;
let min_lt = Fx32::from_bits(min_lt);
dbg!(flags);
dbg!(minlight);
dbg!(bmp_ind);
dbg!(wrl_l);
dbg!(wrl_r);
dbg!(wrl_t);
dbg!(wrl_b);
dbg!(wrl_x);
dbg!(wrl_y);
Ok(())
Ok(Frame{flags, min_lt, bmp_ind, wrl_l, wrl_r, wrl_t, wrl_b, wrl_x, wrl_y})
}
fn sequence(b: &[u8]) -> ResultS<()>
fn frm_coll(b: &[u8], ofs: usize, num: usize) -> ResultS<Vec<Frame>>
{
let mut frms = Vec::with_capacity(num);
let mut p = ofs;
for _ in 0..num {
let ofs = c_u32b(b, p)? as usize;
frms.push(frame(c_data(b, ofs..)?)?);
p += 4;
}
Ok(frms)
}
fn sequence(b: &[u8]) -> ResultS<Sequence>
{
// sq_type = c_u16b(b, 0)?;
// flags = c_u16b(b, 2)?;
@ -158,25 +161,28 @@ fn sequence(b: &[u8]) -> ResultS<()>
// xform = c_u16b(b, 56)?;
let loop_f = c_u16b(b, 58)?;
let name = mac_roman_conv(ok!(pascal_str(name), "bad string")?);
let v_type = ViewType::from_repr(v_type)?;
let snd_beg = ObjID::from_repr(snd_beg);
let snd_key = ObjID::from_repr(snd_key);
let snd_end = ObjID::from_repr(snd_end);
dbg!(name);
dbg!(v_type);
dbg!(frames);
dbg!(ticks);
dbg!(key);
dbg!(xfer);
dbg!(xfer_pd);
dbg!(snd_beg);
dbg!(snd_key);
dbg!(snd_end);
dbg!(loop_f);
Ok(())
Ok(Sequence{name, v_type, frames, ticks, key, xfer, xfer_pd, snd_beg,
snd_key, snd_end, loop_f})
}
fn seq_coll(b: &[u8], ofs: usize, num: usize) -> ResultS<Vec<Sequence>>
{
let mut seqs = Vec::with_capacity(num);
let mut p = ofs;
for _ in 0..num {
let ofs = c_u32b(b, p)? as usize;
seqs.push(sequence(c_data(b, ofs..)?)?);
p += 4;
}
Ok(seqs)
}
*/
fn collection(b: &[u8]) -> ResultS<Collection>
{
@ -202,21 +208,23 @@ fn collection(b: &[u8]) -> ResultS<Collection>
let tabs = tab_coll(c_data(b, tab_ofs..)?, tab_num, clr_num)?;
let bmps = bmp_coll(b, bmp_ofs, bmp_num)?;
// frms = frm_coll(c_data(b, frm_ofs..)?, frm_num)?;
// seqs = seq_coll(c_data(b, seq_ofs..)?, seq_num)?;
let frms = frm_coll(b, frm_ofs, frm_num)?;
let seqs = seq_coll(b, seq_ofs, seq_num)?;
Ok(Collection{tabs, bmps /*, frms, seqs*/})
Ok(Collection{ctyp: cl_type, tabs, bmps, frms, seqs})
}
pub fn testfn_dump_bitmaps(c: &Collection, i: usize) -> ResultS<()>
{
use std::{fs, io};
// TODO: output with all CLUTs too
for (j, bmp) in c.bmps.iter().enumerate() {
let out = fs::File::create(&format!("out/shape{}_{}.tga", i, j))?;
let mut out = io::BufWriter::new(out);
write_tga(&mut out, &ImageShp{bmp: bmp.clone(), clut: &c.tabs[0]})?;
for (k, tab) in c.tabs.iter().enumerate() {
let fname = format!("out/shape{}_{}_{}.tga", i, j, k);
let out = fs::File::create(&fname)?;
let mut out = io::BufWriter::new(out);
write_tga(&mut out, &ImageShp{bmp, clut: &tab})?;
}
}
Ok(())
@ -263,7 +271,7 @@ impl Bitmap
}
}
impl Image for ImageShp<'_>
impl Image for ImageShp<'_, '_>
{
type Output = ColorShp;
@ -336,7 +344,7 @@ pub enum ColorShp
},
}
#[derive(Clone, Debug)]
#[derive(Debug)]
pub struct Bitmap
{
w: usize,
@ -346,18 +354,50 @@ pub struct Bitmap
cmajr: bool,
}
#[derive(Debug)]
pub struct ImageShp<'a>
pub struct ImageShp<'a, 'b>
{
bmp: Bitmap,
clut: &'a [ColorShp],
bmp: &'a Bitmap,
clut: &'b [ColorShp],
}
#[derive(Debug)]
pub struct Frame
{
flags: FrameFlags,
min_lt: Fx32,
bmp_ind: usize,
wrl_l: i16,
wrl_r: i16,
wrl_t: i16,
wrl_b: i16,
wrl_x: i16,
wrl_y: i16,
}
#[derive(Debug)]
pub struct Sequence
{
name: String,
v_type: ViewType,
frames: u16,
ticks: u16,
key: u16,
xfer: u16,
xfer_pd: u16,
snd_beg: ObjID,
snd_key: ObjID,
snd_end: ObjID,
loop_f: u16,
}
#[derive(Debug)]
pub struct Collection
{
pub ctyp: CollectionType,
pub tabs: Vec<Vec<ColorShp>>,
pub bmps: Vec<Bitmap>,
pub frms: Vec<Frame>,
pub seqs: Vec<Sequence>,
}
pub type CollectionDef = (Option<Collection>, Option<Collection>);
@ -391,4 +431,20 @@ c_enum! {
}
}
c_enum! {
#[derive(Debug)]
pub enum ViewType: u16
{
1 => Anim,
3 => Anim4from3,
4 => Anim4,
9 => Anim5from3,
11 => Anim5,
2 => Anim8from2,
5 => Anim8from5,
8 => Anim8,
10 => Still,
}
}
// EOF