72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
import os
|
|
import unittest
|
|
|
|
from hippolyzer.lib.base.mesh import LLMeshSerializer, MeshAsset
|
|
import hippolyzer.lib.base.serialization as se
|
|
|
|
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
class TestMesh(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
# Use a rigged cube SLM from the upload process as a test file
|
|
slm_file = os.path.join(BASE_PATH, "test_resources", "testslm.slm")
|
|
with open(slm_file, "rb") as f:
|
|
cls.slm_bytes = f.read()
|
|
|
|
def _get_test_mesh_reader(self):
|
|
return se.BufferReader("!", self.slm_bytes)
|
|
|
|
def _parse_test_mesh(self):
|
|
reader = self._get_test_mesh_reader()
|
|
mesh: MeshAsset = reader.read(LLMeshSerializer(parse_segment_contents=True))
|
|
return mesh
|
|
|
|
def test_basic(self):
|
|
mesh = self._parse_test_mesh()
|
|
self.assertEqual(mesh.header["lowest_lod"]["offset"], 211)
|
|
self.assertSequenceEqual(mesh.segments["skin"]["joint_names"], ["mPelvis"])
|
|
|
|
def test_round_trip(self):
|
|
serializer = LLMeshSerializer()
|
|
writer = se.BufferWriter("!")
|
|
writer.write(serializer, self._parse_test_mesh())
|
|
# Write it at least once on this machine in case the gzip impl changes
|
|
first_buf = writer.copy_buffer()
|
|
writer.clear()
|
|
reader = se.BufferReader("!", first_buf)
|
|
writer.write(serializer, reader.read(serializer))
|
|
second_buf = writer.copy_buffer()
|
|
self.assertEqual(first_buf, second_buf)
|
|
# Dates may not round-trip correctly, but length should always be the same
|
|
self.assertEqual(len(first_buf), len(self.slm_bytes))
|
|
|
|
def test_serialize_raw_segments(self):
|
|
serializer = LLMeshSerializer(include_raw_segments=True)
|
|
reader = se.BufferReader("!", self.slm_bytes)
|
|
mesh: MeshAsset = reader.read(serializer)
|
|
mesh.raw_segments['high_lod'] += b"foobar"
|
|
expected_high = mesh.raw_segments['high_lod']
|
|
mesh.segments.pop("high_lod")
|
|
writer = se.BufferWriter("!")
|
|
writer.write(serializer, mesh)
|
|
reader = se.BufferReader("!", writer.copy_buffer())
|
|
mesh: MeshAsset = reader.read(serializer)
|
|
self.assertEqual(mesh.raw_segments['high_lod'], expected_high)
|
|
|
|
def test_iter_materials(self):
|
|
mesh = self._parse_test_mesh()
|
|
lod_list = list(mesh.iter_lods())
|
|
self.assertEqual(4, len(lod_list))
|
|
self.assertIsInstance(lod_list[0], list)
|
|
mat_list = list(mesh.iter_lod_materials())
|
|
self.assertEqual(4, len(mat_list))
|
|
self.assertIsInstance(mat_list[0], dict)
|
|
|
|
def test_make_default_triangle(self):
|
|
tri = MeshAsset.make_triangle()
|
|
self.assertEqual(0.5, tri.segments['high_lod'][0]['Position'][2].X)
|
|
self.assertEqual(1, tri.header['version'])
|