Metahuman_DNA_Calibration/dna_viewer/reader/behavior.py

108 lines
4.0 KiB
Python
Raw Normal View History

2022-10-31 18:15:50 +08:00
from typing import Optional
from dna import BinaryStreamReader
from ..model.behavior import AnimatedMapsData
from ..model.behavior import Behavior as BehaviorModel
from ..model.behavior import BlendShapesData, ConditionalTable, JointGroup, PSDMatrix
class Behavior:
"""
A class used for reading the behavior part of the DNA file
Attributes
----------
@type reader: BinaryStreamReader
@param reader: The stream reader being used
@type behavior: BehaviorModel
@param behavior: The object that holds the behavior data read from the DNA file
"""
def __init__(self, stream_reader: BinaryStreamReader) -> None:
self.reader = stream_reader
self.behavior: Optional[BehaviorModel] = None
def read(self) -> BehaviorModel:
"""
Starts reading in the behavior part of the DNA
@rtype: BehaviorModel
@returns: the instance of the created behavior model
"""
self.behavior = BehaviorModel()
self.add_gui_to_raw()
self.add_psd()
self.add_joints()
self.add_blend_shapes()
self.add_animated_maps()
return self.behavior
def add_gui_to_raw(self) -> None:
"""Reads in the gui to raw mapping"""
self.behavior.gui_to_raw = ConditionalTable(
inputs=self.reader.getGUIToRawInputIndices(),
outputs=self.reader.getGUIToRawOutputIndices(),
from_values=self.reader.getGUIToRawFromValues(),
to_values=self.reader.getGUIToRawToValues(),
slope_values=self.reader.getGUIToRawSlopeValues(),
cut_values=self.reader.getGUIToRawCutValues(),
)
def add_psd(self) -> None:
"""Reads in the PSD part of the behavior"""
self.behavior.psd = PSDMatrix(
count=self.reader.getPSDCount(),
rows=self.reader.getPSDRowIndices(),
columns=self.reader.getPSDColumnIndices(),
values=self.reader.getPSDValues(),
)
def add_joints(self) -> None:
"""Reads in the joints part of the behavior"""
self.behavior.joints.joint_row_count = self.reader.getJointRowCount()
self.behavior.joints.joint_column_count = self.reader.getJointColumnCount()
for lod in range(self.reader.getLODCount()):
self.behavior.joints.joint_variable_attribute_indices.append(
self.reader.getJointVariableAttributeIndices(lod)
)
for joint_group_index in range(self.reader.getJointGroupCount()):
self.behavior.joints.joint_groups.append(
JointGroup(
lods=self.reader.getJointGroupLODs(joint_group_index),
inputs=self.reader.getJointGroupInputIndices(joint_group_index),
outputs=self.reader.getJointGroupOutputIndices(joint_group_index),
values=self.reader.getJointGroupValues(joint_group_index),
joints=self.reader.getJointGroupJointIndices(joint_group_index),
)
)
def add_blend_shapes(self) -> None:
"""Reads in the blend shapes part of the behavior"""
self.behavior.blend_shapes = BlendShapesData(
lods=self.reader.getBlendShapeChannelLODs(),
inputs=self.reader.getBlendShapeChannelInputIndices(),
outputs=self.reader.getBlendShapeChannelOutputIndices(),
)
def add_animated_maps(self) -> None:
"""Reads in the animated maps part of the behavior"""
self.behavior.animated_maps = AnimatedMapsData(
lods=self.reader.getAnimatedMapLODs(),
conditional_table=ConditionalTable(
from_values=self.reader.getAnimatedMapFromValues(),
to_values=self.reader.getAnimatedMapToValues(),
slope_values=self.reader.getAnimatedMapSlopeValues(),
cut_values=self.reader.getAnimatedMapCutValues(),
inputs=self.reader.getAnimatedMapInputIndices(),
outputs=self.reader.getAnimatedMapOutputIndices(),
),
)