示例#1
0
    def test_eq_false(self):
        ver = Version(major=4, minor=2)
        other = Version(major=2, minor=1)

        self.assertNotEqual(ver, other)
        self.assertNotEqual(ver, 1)
        self.assertNotEqual(ver, "test")
示例#2
0
    def test_write_read(self):
        expected = Version(major=8, minor=2)

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        self.assertEqual(expected, Version.read(io_stream))
    def test_write_read(self):
        expected = Box()
        expected.version = Version(major=5, minor=22)
        expected.box_type = 3
        expected.collision_types = 64
        expected.name = "TestBoxxx"
        expected.color = RGBA(r=125, g=110, b=55, a=244)
        expected.center = Vector((1.0, 2.0, 3.0))
        expected.extend = Vector((4.0, 5.0, 6.0))

        self.assertEqual(68, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, _) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_BOX, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Box.read(io_stream)
        self.assertEqual(expected.version.major, actual.version.major)
        self.assertEqual(expected.version.minor, actual.version.minor)
        self.assertEqual(expected.box_type, actual.box_type)
        self.assertEqual(expected.collision_types, actual.collision_types)
        self.assertEqual(expected.name, actual.name)
        self.assertEqual(expected.color, actual.color)

        self.assertEqual(expected.center.x, actual.center.x)
        self.assertEqual(expected.center.y, actual.center.y)
        self.assertEqual(expected.center.z, actual.center.z)

        self.assertEqual(expected.extend.x, actual.extend.x)
        self.assertEqual(expected.extend.y, actual.extend.y)
        self.assertEqual(expected.extend.z, actual.extend.z)
示例#4
0
    def test_write_read(self):
        expected = HLod()
        expected.header = HLodHeader(version=Version(major=3, minor=2),
                                     lod_count=3,
                                     model_name="TestModelName",
                                     hierarchy_name="TestHieraName")
        expected.lod_array = HLodArray()

        self.assertEqual(40, expected.header.size_in_bytes())

        expected.lod_array.header = HLodArrayHeader(model_count=2,
                                                    max_screen_size=5442)

        self.assertEqual(8, expected.lod_array.header.size_in_bytes())

        sub_object1 = HLodSubObject(bone_index=3, name="SubObjectNumber1")

        self.assertEqual(36, sub_object1.size_in_bytes())

        sub_object2 = HLodSubObject(bone_index=44, name="SubObjectNumber2")

        self.assertEqual(36, sub_object2.size_in_bytes())

        expected.lod_array.sub_objects.append(sub_object1)
        expected.lod_array.sub_objects.append(sub_object2)

        self.assertEqual(160, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HLOD, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = HLod.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.lod_count, actual.header.lod_count)
        self.assertEqual(expected.header.model_name, actual.header.model_name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)

        self.assertEqual(expected.lod_array.header.model_count,
                         actual.lod_array.header.model_count)
        self.assertEqual(expected.lod_array.header.max_screen_size,
                         actual.lod_array.header.max_screen_size)

        self.assertEqual(len(expected.lod_array.sub_objects),
                         len(actual.lod_array.sub_objects))

        self.assertEqual(expected.lod_array.sub_objects[0].bone_index,
                         actual.lod_array.sub_objects[0].bone_index)
        self.assertEqual(expected.lod_array.sub_objects[0].name,
                         actual.lod_array.sub_objects[0].name)

        self.assertEqual(expected.lod_array.sub_objects[1].bone_index,
                         actual.lod_array.sub_objects[1].bone_index)
        self.assertEqual(expected.lod_array.sub_objects[1].name,
                         actual.lod_array.sub_objects[1].name)
示例#5
0
class AnimationHeader(Struct):
    version = Version()
    name = ""
    hierarchy_name = ""
    num_frames = 0
    frame_rate = 0

    @staticmethod
    def read(io_stream):
        return AnimationHeader(version=Version.read(io_stream),
                               name=read_fixed_string(io_stream),
                               hierarchy_name=read_fixed_string(io_stream),
                               num_frames=read_ulong(io_stream),
                               frame_rate=read_ulong(io_stream))

    @staticmethod
    def size_in_bytes():
        return 44

    def write(self, io_stream):
        write_chunk_head(io_stream, W3D_CHUNK_ANIMATION_HEADER,
                         self.size_in_bytes())
        self.version.write(io_stream)
        write_fixed_string(io_stream, self.name)
        write_fixed_string(io_stream, self.hierarchy_name)
        write_ulong(io_stream, self.num_frames)
        write_ulong(io_stream, self.frame_rate)
示例#6
0
class Box(Struct):
    version = Version()
    box_type = 0
    collision_types = 0
    name = ""
    color = RGBA()
    center = Vector((0.0, 0.0, 0.0))
    extend = Vector((0.0, 0.0, 0.0))

    @staticmethod
    def read(io_stream):
        ver = Version.read(io_stream)
        flags = read_ulong(io_stream)
        return Box(version=ver,
                   box_type=(flags & 0b11),
                   collision_types=(flags & 0xFF0),
                   name=read_long_fixed_string(io_stream),
                   color=RGBA.read(io_stream),
                   center=read_vector(io_stream),
                   extend=read_vector(io_stream))

    @staticmethod
    def size_in_bytes():
        return 68

    def write(self, io_stream):
        write_chunk_head(io_stream, W3D_CHUNK_BOX, self.size_in_bytes())

        self.version.write(io_stream)
        write_ulong(io_stream,
                    (self.collision_types & 0xFF) | (self.box_type & 0b11))
        write_long_fixed_string(io_stream, self.name)
        self.color.write(io_stream)
        write_vector(io_stream, self.center)
        write_vector(io_stream, self.extend)
    def test_write_read_minimal(self):
        expected = Hierarchy(pivots=[], pivot_fixups=[])
        expected.header = HierarchyHeader(version=Version(major=4, minor=1),
                                          name="HieraHeader",
                                          num_pivots=33,
                                          center_pos=Vector((2.0, 3.0, 1.0)))

        self.assertEqual(36, expected.header.size_in_bytes())

        pivot1 = HierarchyPivot(name="Roottransform",
                                parent_id=-1,
                                translation=Vector((22.0, 33.0, 1.0)),
                                euler_angles=Vector((1.0, 12.0, -2.0)),
                                rotation=Quaternion((1.0, -0.1, -0.2, -0.3)))

        self.assertEqual(60, pivot1.size_in_bytes())
        expected.pivots.append(pivot1)

        self.assertEqual(112, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HIERARCHY, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Hierarchy.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.num_pivots, actual.header.num_pivots)
        self.assertEqual(expected.header.center_pos, actual.header.center_pos)

        self.assertEqual(len(expected.pivots), len(actual.pivots))
    def test_write_read(self):
        expected = Hierarchy(pivots=[], pivot_fixups=[])
        expected.header = HierarchyHeader(version=Version(major=4, minor=1),
                                          name="HieraHeader",
                                          num_pivots=33,
                                          center_pos=Vector((2.0, 3.0, 1.0)))

        self.assertEqual(36, expected.header.size_in_bytes())

        pivot1 = HierarchyPivot(name="Roottransform",
                                parent_id=-1,
                                translation=Vector((22.0, 33.0, 1.0)),
                                euler_angles=Vector((1.0, 12.0, -2.0)),
                                rotation=Quaternion((1.0, -0.1, -0.2, -0.3)))

        self.assertEqual(60, pivot1.size_in_bytes())
        expected.pivots.append(pivot1)

        pivot2 = HierarchyPivot(name="Spine",
                                parent_id=0,
                                translation=Vector((-22.0, -33.0, -1.0)),
                                euler_angles=Vector((-1.0, -12.0, 2.0)),
                                rotation=Quaternion((-1.0, 0.1, 0.2, 0.3)))

        self.assertEqual(60, pivot2.size_in_bytes())
        expected.pivots.append(pivot2)

        for _ in range(64):
            expected.pivot_fixups.append(Vector((-1.0, -2.0, -3.0)))

        self.assertEqual(948, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HIERARCHY, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Hierarchy.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.num_pivots, actual.header.num_pivots)
        self.assertEqual(expected.header.center_pos, actual.header.center_pos)

        self.assertEqual(len(expected.pivots), len(actual.pivots))

        for i, piv in enumerate(expected.pivots):
            act = actual.pivots[i]
            self.assertEqual(piv.name, act.name)
            self.assertEqual(piv.parent_id, act.parent_id)
            self.assertEqual(piv.translation, act.translation)
            self.assertEqual(piv.euler_angles, act.euler_angles)
            self.assertEqual(piv.rotation, act.rotation)

        self.assertEqual(len(expected.pivot_fixups), len(actual.pivot_fixups))

        for i, fix in enumerate(expected.pivot_fixups):
            self.assertEqual(fix, actual.pivot_fixups[i])
 def read(io_stream):
     return CompressedAnimationHeader(
         version=Version.read(io_stream),
         name=read_fixed_string(io_stream),
         hierarchy_name=read_fixed_string(io_stream),
         num_frames=read_ulong(io_stream),
         frame_rate=read_ushort(io_stream),
         flavor=read_ushort(io_stream))
示例#10
0
 def read(io_stream):
     ver = Version.read(io_stream)
     flags = read_ulong(io_stream)
     return Box(version=ver,
                box_type=(flags & 0b11),
                collision_types=(flags & 0xFF0),
                name=read_long_fixed_string(io_stream),
                color=RGBA.read(io_stream),
                center=read_vector(io_stream),
                extend=read_vector(io_stream))
class CompressedAnimationHeader(Struct):
    version = Version()
    name = ""
    hierarchy_name = ""
    num_frames = 0
    frame_rate = 0
    flavor = 0

    @staticmethod
    def read(io_stream):
        return CompressedAnimationHeader(
            version=Version.read(io_stream),
            name=read_fixed_string(io_stream),
            hierarchy_name=read_fixed_string(io_stream),
            num_frames=read_ulong(io_stream),
            frame_rate=read_ushort(io_stream),
            flavor=read_ushort(io_stream))
    def test_write_read_minimal(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=0)

        self.assertEqual(44, expected.header.size_in_bytes())
        self.assertEqual(52, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.time_coded_channels),
                         len(actual.time_coded_channels))
        self.assertEqual(len(expected.adaptive_delta_channels),
                         len(actual.adaptive_delta_channels))
        self.assertEqual(len(expected.time_coded_bit_channels),
                         len(actual.time_coded_bit_channels))
        self.assertEqual(len(expected.motion_channels),
                         len(actual.motion_channels))
 def read(io_stream):
     return MeshHeader(
         version=Version.read(io_stream),
         attrs=read_ulong(io_stream),
         mesh_name=read_fixed_string(io_stream),
         container_name=read_fixed_string(io_stream),
         face_count=read_ulong(io_stream),
         vert_count=read_ulong(io_stream),
         matl_count=read_ulong(io_stream),
         damage_stage_count=read_ulong(io_stream),
         sort_level=read_ulong(io_stream),
         prelit_version=read_ulong(io_stream),
         future_count=read_ulong(io_stream),
         vert_channel_flags=read_ulong(io_stream),
         face_channel_falgs=read_ulong(io_stream),
         # bounding volumes
         min_corner=read_vector(io_stream),
         max_corner=read_vector(io_stream),
         sph_center=read_vector(io_stream),
         sph_radius=read_float(io_stream))
class HierarchyHeader(Struct):
    version = Version()
    name = ""
    num_pivots = 0
    center_pos = Vector((0.0, 0.0, 0.0))

    @staticmethod
    def read(io_stream):
        return HierarchyHeader(
            version=Version.read(io_stream),
            name=read_fixed_string(io_stream),
            num_pivots=read_ulong(io_stream),
            center_pos=read_vector(io_stream))

    @staticmethod
    def size_in_bytes():
        return 36

    def write(self, io_stream):
        write_chunk_head(io_stream, W3D_CHUNK_HIERARCHY_HEADER, self.size_in_bytes())
        self.version.write(io_stream)
        write_fixed_string(io_stream, self.name)
        write_ulong(io_stream, self.num_pivots)
        write_vector(io_stream, self.center_pos)
示例#15
0
class HLodHeader(Struct):
    version = Version()
    lod_count = 1
    model_name = ""
    hierarchy_name = ""

    @staticmethod
    def read(io_stream):
        return HLodHeader(
            version=Version.read(io_stream),
            lod_count=read_ulong(io_stream),
            model_name=read_fixed_string(io_stream),
            hierarchy_name=read_fixed_string(io_stream))

    @staticmethod
    def size_in_bytes():
        return 40

    def write(self, io_stream):
        write_chunk_head(io_stream, W3D_CHUNK_HLOD_HEADER, self.size_in_bytes())
        self.version.write(io_stream)
        write_ulong(io_stream, self.lod_count)
        write_fixed_string(io_stream, self.model_name)
        write_fixed_string(io_stream, self.hierarchy_name)
示例#16
0
 def test_eq_true(self):
     ver = Version(major=3, minor=1)
     self.assertEqual(ver, ver)
 def read(io_stream):
     return HierarchyHeader(
         version=Version.read(io_stream),
         name=read_fixed_string(io_stream),
         num_pivots=read_ulong(io_stream),
         center_pos=read_vector(io_stream))
示例#18
0
 def read(io_stream):
     return AnimationHeader(version=Version.read(io_stream),
                            name=read_fixed_string(io_stream),
                            hierarchy_name=read_fixed_string(io_stream),
                            num_frames=read_ulong(io_stream),
                            frame_rate=read_ulong(io_stream))
    def test_write_read(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=0)

        self.assertEqual(44, expected.header.size_in_bytes())

        # TimeCodedChannels

        tc_channel = TimeCodedAnimationChannel(num_time_codes=55,
                                               pivot=4,
                                               vector_len=4,
                                               type=6,
                                               time_codes=[])

        tc_datum = TimeCodedDatum(time_code=34,
                                  non_interpolated=True,
                                  value=Quaternion((0.1, -2.0, -0.3, 2.0)))

        for _ in range(tc_channel.num_time_codes):
            tc_channel.time_codes.append(tc_datum)

        for _ in range(31):
            expected.time_coded_channels.append(tc_channel)

        # TimeCodedBitChannels

        tcb_channel = TimeCodedBitChannel(num_time_codes=55,
                                          pivot=52,
                                          type=0,
                                          default_value=12,
                                          time_codes=[])

        tcb_datum = TimeCodedBitDatum(time_code=1, value=True)

        for _ in range(tcb_channel.num_time_codes):
            tcb_channel.time_codes.append(tcb_datum)

        for _ in range(31):
            expected.time_coded_bit_channels.append(tcb_channel)

        # MotionChannels

        m_channel_tc = MotionChannel(delta_type=0,
                                     vector_len=1,
                                     type=0,
                                     num_time_codes=55,
                                     pivot=182,
                                     data=[])

        datum = TimeCodedDatum(time_code=3, value=2.0)

        for _ in range(m_channel_tc.num_time_codes):
            m_channel_tc.data.append(datum)

        expected.motion_channels.append(m_channel_tc)

        m_channel_ad_y_4 = MotionChannel(delta_type=1,
                                         vector_len=1,
                                         type=2,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_y_4 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=-1.0,
            data=self.get_adaptive_delta_data(2, 4,
                                              m_channel_ad_y_4.num_time_codes))

        m_channel_ad_y_4.data = m_ad_y_4

        expected.motion_channels.append(m_channel_ad_y_4)

        m_channel_ad_q_4 = MotionChannel(delta_type=1,
                                         vector_len=4,
                                         type=6,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_q_4 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=Quaternion((3.0, 2.0, 0.1, -1.9)),
            data=self.get_adaptive_delta_data(6, 4,
                                              m_channel_ad_q_4.num_time_codes))

        m_channel_ad_q_4.data = m_ad_q_4

        expected.motion_channels.append(m_channel_ad_q_4)

        m_channel_ad_y_8 = MotionChannel(delta_type=2,
                                         vector_len=1,
                                         type=2,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_y_8 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=-1.0,
            data=self.get_adaptive_delta_data(2, 8,
                                              m_channel_ad_y_8.num_time_codes))

        m_channel_ad_y_8.data = m_ad_y_8

        expected.motion_channels.append(m_channel_ad_y_8)

        m_channel_ad_q_8 = MotionChannel(delta_type=2,
                                         vector_len=4,
                                         type=6,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_q_8 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=Quaternion((3.0, 2.0, 0.1, -1.9)),
            data=self.get_adaptive_delta_data(6, 8,
                                              m_channel_ad_q_8.num_time_codes))

        m_channel_ad_q_8.data = m_ad_q_8

        expected.motion_channels.append(m_channel_ad_q_8)

        self.assertEqual(42842, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.time_coded_channels),
                         len(actual.time_coded_channels))
        self.assertEqual(len(expected.time_coded_bit_channels),
                         len(actual.time_coded_bit_channels))

        for i, chan in enumerate(expected.time_coded_channels):
            act = actual.time_coded_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)

            self.assertEqual(len(chan.time_codes), len(act.time_codes))

            for j, time_code in enumerate(chan.time_codes):
                self.assertEqual(time_code.time_code,
                                 act.time_codes[j].time_code)
                self.assertAlmostEqual(time_code.value,
                                       act.time_codes[j].value, 5)

        for i, chan in enumerate(expected.time_coded_bit_channels):
            act = actual.time_coded_bit_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.type, act.type)
            self.assertAlmostEqual(chan.default_value, act.default_value, 5)

            self.assertEqual(len(chan.time_codes), len(act.time_codes))

            for j, time_code in enumerate(chan.time_codes):
                self.assertEqual(time_code.time_code,
                                 act.time_codes[j].time_code)
                self.assertAlmostEqual(time_code.value,
                                       act.time_codes[j].value, 5)
class MeshHeader(Struct):
    version = Version()
    attrs = 0
    mesh_name = ""
    container_name = ""
    face_count = 0
    vert_count = 0
    matl_count = 0
    damage_stage_count = 0
    sort_level = 0
    prelit_version = 0
    future_count = 0
    vert_channel_flags = 3
    face_channel_falgs = 1
    min_corner = Vector((0.0, 0.0, 0.0))
    max_corner = Vector((0.0, 0.0, 0.0))
    sph_center = Vector((0.0, 0.0, 0.0))
    sph_radius = 0.0

    @staticmethod
    def read(io_stream):
        return MeshHeader(
            version=Version.read(io_stream),
            attrs=read_ulong(io_stream),
            mesh_name=read_fixed_string(io_stream),
            container_name=read_fixed_string(io_stream),
            face_count=read_ulong(io_stream),
            vert_count=read_ulong(io_stream),
            matl_count=read_ulong(io_stream),
            damage_stage_count=read_ulong(io_stream),
            sort_level=read_ulong(io_stream),
            prelit_version=read_ulong(io_stream),
            future_count=read_ulong(io_stream),
            vert_channel_flags=read_ulong(io_stream),
            face_channel_falgs=read_ulong(io_stream),
            # bounding volumes
            min_corner=read_vector(io_stream),
            max_corner=read_vector(io_stream),
            sph_center=read_vector(io_stream),
            sph_radius=read_float(io_stream))

    @staticmethod
    def size_in_bytes():
        return 116

    def write(self, io_stream):
        write_chunk_head(io_stream, W3D_CHUNK_MESH_HEADER,
                         self.size_in_bytes())
        self.version.write(io_stream)
        write_ulong(io_stream, self.attrs)
        write_fixed_string(io_stream, self.mesh_name)
        write_fixed_string(io_stream, self.container_name)
        write_ulong(io_stream, self.face_count)
        write_ulong(io_stream, self.vert_count)
        write_ulong(io_stream, self.matl_count)
        write_ulong(io_stream, self.damage_stage_count)
        write_ulong(io_stream, self.sort_level)
        write_ulong(io_stream, self.prelit_version)
        write_ulong(io_stream, self.future_count)
        write_ulong(io_stream, self.vert_channel_flags)
        write_ulong(io_stream, self.face_channel_falgs)
        write_vector(io_stream, self.min_corner)
        write_vector(io_stream, self.max_corner)
        write_vector(io_stream, self.sph_center)
        write_float(io_stream, self.sph_radius)
    def test_write_read_adaptive_delta(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=1)

        self.assertEqual(44, expected.header.size_in_bytes())

        (ad_y_channel,
         ad_q_channel) = self.get_adaptive_delta_channels(num_bits=4)

        for _ in range(46):
            expected.adaptive_delta_channels.append(ad_y_channel)
            expected.adaptive_delta_channels.append(ad_q_channel)

        self.assertEqual(4974, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        self.assertEqual(4982, io_stream.tell())
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.adaptive_delta_channels),
                         len(actual.adaptive_delta_channels))

        for i, chan in enumerate(expected.adaptive_delta_channels):
            act = actual.adaptive_delta_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)
            self.assertEqual(chan.scale, act.scale)

            self.assertEqual(chan.data.initial_value, act.data.initial_value)
            self.assertEqual(chan.data.bit_count, act.data.bit_count)

            self.assertEqual(len(chan.data.delta_blocks),
                             len(act.data.delta_blocks))

            for j, block in enumerate(chan.data.delta_blocks):
                current = act.data.delta_blocks[j]
                self.assertEqual(block.vector_index, current.vector_index)
                self.assertEqual(block.block_index, current.block_index)

                self.assertEqual(len(block.delta_bytes),
                                 len(current.delta_bytes))
                for k, byt in enumerate(block.delta_bytes):
                    self.assertEqual(int(byt), int(current.delta_bytes[k]))
示例#22
0
    def test_write_read(self):
        expected = Animation()
        expected.header = AnimationHeader(version=Version(major=4, minor=1),
                                          name="AniHeader",
                                          hierarchy_name="HieraName",
                                          num_frames=155,
                                          frame_rate=300)

        self.assertEqual(44, expected.header.size_in_bytes())

        x_channel = AnimationChannel(first_frame=1,
                                     last_frame=33,
                                     vector_len=1,
                                     type=3,
                                     pivot=33,
                                     unknown=123,
                                     data=[])

        for i in range(55):
            x_channel.data.append(2.0)

        expected.channels.append(x_channel)

        q_channel = AnimationChannel(first_frame=1,
                                     last_frame=33,
                                     vector_len=4,
                                     type=6,
                                     pivot=33,
                                     unknown=123,
                                     data=[])

        for i in range(55):
            q_channel.data.append(Quaternion((1.0, 2.0, 3.0, 4.0)))

        expected.channels.append(q_channel)

        self.assertEqual(1192, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Animation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)

        self.assertEqual(len(expected.channels), len(actual.channels))

        for i, chan in enumerate(expected.channels):
            act = actual.channels[i]
            self.assertEqual(chan.first_frame, act.first_frame)
            self.assertEqual(chan.last_frame, act.last_frame)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.unknown, act.unknown)

            self.assertEqual(len(chan.data), len(act.data))

            for j, d in enumerate(chan.data):
                self.assertEqual(d, act.data[j])
示例#23
0
 def read(io_stream):
     return HLodHeader(
         version=Version.read(io_stream),
         lod_count=read_ulong(io_stream),
         model_name=read_fixed_string(io_stream),
         hierarchy_name=read_fixed_string(io_stream))