From 92a845c02e1564c776e30027f5ed6b1f1d589356 Mon Sep 17 00:00:00 2001 From: Marrub Date: Tue, 12 Feb 2019 06:32:10 -0500 Subject: [PATCH] completed Shapes code --- src/main.rs | 2 + src/marathon/shp.rs | 176 +++++++++++++++++++++++++++++--------------- 2 files changed, 118 insertions(+), 60 deletions(-) diff --git a/src/main.rs b/src/main.rs index ed098c5..039c368 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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); } } diff --git a/src/marathon/shp.rs b/src/marathon/shp.rs index d9c7b5c..0dfd709 100644 --- a/src/marathon/shp.rs +++ b/src/marathon/shp.rs @@ -95,12 +95,12 @@ fn bitmap(b: &[u8]) -> ResultS Ok(bmp) } -fn bmp_coll(b: &[u8], bmp_ofs: usize, bmp_num: usize) -> ResultS> +fn bmp_coll(b: &[u8], ofs: usize, num: usize) -> ResultS> { - 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> Ok(bmps) } -/* -fn frame(b: &[u8]) -> ResultS<()> +fn frame(b: &[u8]) -> ResultS { - 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> +{ + 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 { // 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> +{ + 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 { @@ -202,21 +208,23 @@ fn collection(b: &[u8]) -> ResultS 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>, pub bmps: Vec, + pub frms: Vec, + pub seqs: Vec, } pub type CollectionDef = (Option, Option); @@ -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