Metahuman_DNA_Calibration/dna_viewer/reader/behavior.py
2022-11-29 14:25:24 +01:00

108 lines
4.0 KiB
Python

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(),
),
)