completed Shapes code
parent
8c6543030c
commit
92a845c02e
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue