Better anim abstraction
This commit is contained in:
parent
791a033d08
commit
a83c74ebf7
|
@ -27,19 +27,23 @@ def extract_anim(armature: bpy.types.Armature) -> Animation:
|
||||||
|
|
||||||
anim.end_index = num_frames - 1
|
anim.end_index = num_frames - 1
|
||||||
|
|
||||||
anim.bone_transforms["DummyRoot"] = []
|
anim.bone_frames["DummyRoot"] = ([], [])
|
||||||
for bone in armature.data.bones:
|
for bone in armature.data.bones:
|
||||||
anim.bone_transforms[bone.name] = []
|
anim.bone_frames[bone.name] = ([], [])
|
||||||
|
|
||||||
for frame in range(num_frames):
|
for frame in range(num_frames):
|
||||||
|
|
||||||
#if frame % 10 == 0:
|
|
||||||
# print("Sample frame {}:".format(frame))
|
|
||||||
|
|
||||||
frame_time = framerange.x + frame * increment
|
frame_time = framerange.x + frame * increment
|
||||||
bpy.context.scene.frame_set(frame_time)
|
bpy.context.scene.frame_set(frame_time)
|
||||||
|
|
||||||
anim.bone_transforms["DummyRoot"].append(ModelTransform())
|
|
||||||
|
rframe_dummy = RotationFrame(frame, convert_rotation_space(Quaternion()))
|
||||||
|
tframe_dummy = TranslationFrame(frame, Vector((0.0,0.0,0.0)))
|
||||||
|
|
||||||
|
anim.bone_frames["DummyRoot"][0].append(tframe_dummy)
|
||||||
|
anim.bone_frames["DummyRoot"][1].append(rframe_dummy)
|
||||||
|
|
||||||
|
|
||||||
for bone in armature.pose.bones:
|
for bone in armature.pose.bones:
|
||||||
|
|
||||||
transform = bone.matrix
|
transform = bone.matrix
|
||||||
|
@ -49,13 +53,11 @@ def extract_anim(armature: bpy.types.Armature) -> Animation:
|
||||||
|
|
||||||
loc, rot, _ = transform.decompose()
|
loc, rot, _ = transform.decompose()
|
||||||
|
|
||||||
xform = ModelTransform()
|
rframe = RotationFrame(frame, convert_rotation_space(rot))
|
||||||
xform.rotation = convert_rotation_space(rot)
|
tframe = TranslationFrame(frame, convert_vector_space(loc))
|
||||||
xform.translation = convert_vector_space(loc)
|
|
||||||
|
|
||||||
#if frame % 10 == 0:
|
anim.bone_frames[bone.name][0].append(tframe)
|
||||||
# print("\t{:10}: loc {:15} rot {:15}".format(bone.name, vec_to_str(xform.translation), quat_to_str(xform.rotation)))
|
anim.bone_frames[bone.name][1].append(rframe)
|
||||||
|
|
||||||
anim.bone_transforms[bone.name].append(xform)
|
|
||||||
|
|
||||||
return anim
|
return anim
|
||||||
|
|
|
@ -76,14 +76,28 @@ class Model:
|
||||||
geometry: List[GeometrySegment] = None
|
geometry: List[GeometrySegment] = None
|
||||||
collisionprimitive: CollisionPrimitive = None
|
collisionprimitive: CollisionPrimitive = None
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RotationFrame:
|
||||||
|
|
||||||
|
index : int = 0
|
||||||
|
rotation : Quaternion = field(default_factory=Quaternion)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TranslationFrame:
|
||||||
|
|
||||||
|
index : int = 0
|
||||||
|
translation : Vector = field(default_factory=Vector)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Animation:
|
class Animation:
|
||||||
""" Class representing 'CYCL' + 'KFR3' sections in a .msh file """
|
""" Class representing 'CYCL' + 'KFR3' sections in a .msh file """
|
||||||
|
|
||||||
name: str = "fullanimation"
|
name: str = "fullanimation"
|
||||||
bone_transforms: Dict[str, List[ModelTransform]] = field(default_factory=dict)
|
bone_frames: Dict[str, Tuple[List[TranslationFrame], List[RotationFrame]]] = field(default_factory=dict)
|
||||||
|
|
||||||
framerate: float = 29.97
|
framerate: float = 29.97
|
||||||
start_index : int = 0
|
start_index : int = 0
|
||||||
end_index : int = 0
|
end_index : int = 0
|
||||||
|
|
||||||
|
|
|
@ -248,14 +248,14 @@ def _write_envl(envl: Writer, model: Model, model_index: Dict[str, int]):
|
||||||
SKELETON CHUNKS
|
SKELETON CHUNKS
|
||||||
'''
|
'''
|
||||||
def _write_bln2(bln2: Writer, scene: Scene):
|
def _write_bln2(bln2: Writer, scene: Scene):
|
||||||
bones = scene.anims[0].bone_transforms.keys()
|
bones = scene.anims[0].bone_frames.keys()
|
||||||
bln2.write_u32(len(bones))
|
bln2.write_u32(len(bones))
|
||||||
|
|
||||||
for boneName in bones:
|
for boneName in bones:
|
||||||
bln2.write_u32(crc(boneName), 0)
|
bln2.write_u32(crc(boneName), 0)
|
||||||
|
|
||||||
def _write_skl2(skl2: Writer, scene: Scene):
|
def _write_skl2(skl2: Writer, scene: Scene):
|
||||||
bones = scene.anims[0].bone_transforms.keys()
|
bones = scene.anims[0].bone_frames.keys()
|
||||||
skl2.write_u32(len(bones))
|
skl2.write_u32(len(bones))
|
||||||
|
|
||||||
for boneName in bones:
|
for boneName in bones:
|
||||||
|
@ -282,22 +282,20 @@ def _write_anm2(anm2: Writer, anim: Animation):
|
||||||
|
|
||||||
with anm2.create_child("KFR3") as kfr3:
|
with anm2.create_child("KFR3") as kfr3:
|
||||||
|
|
||||||
kfr3.write_u32(len(anim.bone_transforms.keys()))
|
kfr3.write_u32(len(anim.bone_frames))
|
||||||
|
|
||||||
for boneName in anim.bone_transforms.keys():
|
for boneName in anim.bone_frames:
|
||||||
kfr3.write_u32(crc(boneName))
|
kfr3.write_u32(crc(boneName))
|
||||||
kfr3.write_u32(0) #what is keyframe type?
|
kfr3.write_u32(0) #what is keyframe type?
|
||||||
|
|
||||||
num_frames = 1 + anim.end_index - anim.start_index
|
translation_frames, rotation_frames = anim.bone_frames[boneName]
|
||||||
kfr3.write_u32(num_frames, num_frames) #basic testing
|
|
||||||
|
|
||||||
for i, xform in enumerate(anim.bone_transforms[boneName]):
|
|
||||||
kfr3.write_u32(i)
|
|
||||||
kfr3.write_f32(xform.translation.x, xform.translation.y, xform.translation.z)
|
|
||||||
|
|
||||||
for i, xform in enumerate(anim.bone_transforms[boneName]):
|
|
||||||
kfr3.write_u32(i)
|
|
||||||
kfr3.write_f32(xform.rotation.x, xform.rotation.y, xform.rotation.z, xform.rotation.w)
|
|
||||||
|
|
||||||
|
kfr3.write_u32(len(translation_frames), len(rotation_frames))
|
||||||
|
|
||||||
|
for frame in translation_frames:
|
||||||
|
kfr3.write_u32(frame.index)
|
||||||
|
kfr3.write_f32(frame.translation.x, frame.translation.y, frame.translation.z)
|
||||||
|
|
||||||
|
for frame in rotation_frames:
|
||||||
|
kfr3.write_u32(frame.index)
|
||||||
|
kfr3.write_f32(frame.rotation.x, frame.rotation.y, frame.rotation.z, frame.rotation.w)
|
||||||
|
|
Loading…
Reference in New Issue