Skip to content

Commit

Permalink
Add char bone object
Browse files Browse the repository at this point in the history
  • Loading branch information
PikminGuts92 committed Feb 9, 2025
1 parent 9536f8e commit 38c76fe
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 2 deletions.
69 changes: 69 additions & 0 deletions core/grim/src/scene/char_bone/io.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
use crate::io::{BinaryStream, SeekFrom, Stream};
use crate::scene::*;
use crate::SystemInfo;
use grim_traits::scene::*;
use std::collections::HashSet;
use std::error::Error;
use thiserror::Error as ThisError;

#[derive(Debug, ThisError)]
pub enum CharBoneLoadError {
#[error("CharBone version {version} is not supported")]
CharBoneVersionNotSupported {
version: u32
},
}

fn is_version_supported(version: u32) -> bool {
match version {
2 => true, // GH2
3 => true, // GH2 360
8 => true, // TBRB
_ => false
}
}

impl ObjectReadWrite for CharBone {
fn load(&mut self, stream: &mut dyn Stream, info: &SystemInfo) -> Result<(), Box<dyn Error>> {
let mut reader = Box::new(BinaryStream::from_stream_with_endian(stream, info.endian));

let version = reader.read_uint32()?;
if !is_version_supported(version) {
return Err(Box::new(CharBoneLoadError::CharBoneVersionNotSupported {
version
}));
}

load_object(self, &mut reader, info)?;
load_trans(self, &mut reader, info, false)?;

//Ok(())
todo!()
}

fn save(&self, stream: &mut dyn Stream, info: &SystemInfo) -> Result<(), Box<dyn Error>> {
let mut stream = Box::new(BinaryStream::from_stream_with_endian(stream, info.endian));

// TODO: Get version from system info
let version = 3;

stream.write_uint32(version)?;

save_object(self, &mut stream, info)?;
save_trans(self, &mut stream, info, false)?;

stream.write_boolean(self.position)?;
stream.write_boolean(self.scale)?;

stream.write_uint32(self.rotation as u32)?;
if version < 5 {
stream.write_uint32(RotationConstraint::kRotNone as u32)?;
}

if version >= 3 {
stream.write_float32(self.unknown)?;
}

Ok(())
}
}
42 changes: 42 additions & 0 deletions core/grim/src/scene/char_bone/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
mod io;

use grim_macros::*;
use grim_traits::scene::*;
pub use io::*;

#[milo(Trans)]
pub struct CharBone {
pub position: bool,
pub scale: bool,
pub rotation: RotationConstraint,
pub unknown: f32,
}

impl Default for CharBone {
fn default() -> CharBone {
CharBone {
// Base object
name: String::default(),
type2: String::default(),
note: String::default(),

// Trans object
local_xfm: Matrix::default(),
world_xfm: Matrix::default(),

trans_objects: Vec::new(),

constraint: TransConstraint::default(),
target: String::default(),

preserve_scale: false,
parent: String::default(),

// CharBone object
position: true,
scale: true,
rotation: RotationConstraint::kRotFull,
unknown: 1.0,
}
}
}
4 changes: 3 additions & 1 deletion core/grim/src/scene/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ mod anim;
mod band_placer;
mod band_character;
mod cam;
mod char_bone;
mod char_bones_samples;
mod char_clip;
mod char_clip_samples;
Expand Down Expand Up @@ -37,8 +38,9 @@ pub use anim::*;
pub use band_placer::*;
pub use band_character::*;
pub use cam::*;
pub use char_clip::*;
pub use char_bone::*;
pub use char_bones_samples::*;
pub use char_clip::*;
pub use char_clip_samples::*;
pub use char_driver::*;
pub use char_hair::*;
Expand Down
5 changes: 4 additions & 1 deletion core/grim/src/scene/object.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
use crate::{SystemInfo};
use crate::SystemInfo;
use crate::io::MemoryStream;
use crate::scene::*;

pub enum Object {
Anim(AnimObject),
BandPlacer(BandPlacer),
Cam(CamObject),
CharBone(CharBone),
CharClipSamples(CharClipSamples),
CharHair(CharHair),
CharLipSync(CharLipSync),
Expand Down Expand Up @@ -39,6 +40,7 @@ impl Object {
Object::Anim(anim) => &anim.name,
Object::BandPlacer(band_placer) => &band_placer.name,
Object::Cam(cam) => &cam.name,
Object::CharBone(char_bone) => &char_bone.name,
Object::CharClipSamples(ccs) => &ccs.name,
Object::CharHair(ch) => &ch.name,
Object::CharLipSync(cls) => &cls.name,
Expand All @@ -65,6 +67,7 @@ impl Object {
Object::Anim(_) => "Anim",
Object::BandPlacer(_) => "BandPlacer",
Object::Cam(_) => "Cam",
Object::CharBone(_) => "CharBone",
Object::CharClipSamples(_) => "CharClipSamples",
Object::CharHair(_) => "CharHair",
Object::CharLipSync(_) => "CharLipSync",
Expand Down
24 changes: 24 additions & 0 deletions core/grim_traits/src/scene/char_bone.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#[allow(non_camel_case_types)]
#[derive(Clone, Copy)]
#[repr(u32)]
pub enum RotationConstraint {
kRotNone = 9,
kRotFull = 2,
kRotX = 3,
kRotY = 4,
kRotZ = 5
}

impl From<u32> for RotationConstraint {
fn from(num: u32) -> RotationConstraint {
match num {
9 => RotationConstraint::kRotNone,
2 => RotationConstraint::kRotFull,
3 => RotationConstraint::kRotX,
4 => RotationConstraint::kRotY,
5 => RotationConstraint::kRotZ,
// Default
_ => RotationConstraint::kRotNone,
}
}
}
2 changes: 2 additions & 0 deletions core/grim_traits/src/scene/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
mod anim;
mod char_bone;
mod char_clip;
mod common;
mod draw;
Expand All @@ -10,6 +11,7 @@ mod poll;
mod trans;

pub use anim::*;
pub use char_bone::*;
pub use char_clip::*;
pub use common::*;
pub use draw::*;
Expand Down

0 comments on commit 38c76fe

Please sign in to comment.