108 lines
4.0 KiB
Python
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(),
|
|
),
|
|
)
|