Skip to content

Commit

Permalink
Add tri indices to Parts
Browse files Browse the repository at this point in the history
  • Loading branch information
1r3n33 committed Jul 25, 2020
1 parent efab4ab commit ca31ae1
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 21 deletions.
40 changes: 19 additions & 21 deletions blend2niff/exporter/niff2_part.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""NIFF2 Shape Parts."""

#
# Consts
#
Expand Down Expand Up @@ -58,32 +60,24 @@ def niff2_part_list_header_writer(plh, parts, buf):
# Part Node
#
class Niff2PartNode:
part_tag: int
this_part_index: int
part_size: int
part_name_index: int
mat_index: int
tri_group_index: int
part_tri_num: int
nintendo_extension_block_size: int
user_extension_block_size: int
def __init__(self, index, name_index, tri_group_index, mat_index, tri_indices):
self.part_tag = TAG_PART
self.this_part_index = index
self.part_size = (9*4) + (len(tri_indices)*4)
self.part_name_index = name_index
self.mat_index = mat_index
self.tri_group_index = tri_group_index
self.part_tri_num = len(tri_indices)
self.nintendo_extension_block_size = 0
self.user_extension_block_size = 0
self.tri_indices = tri_indices

def index(self):
return self.this_part_index


def niff2_part_node_builder(part_index, part_name_index, part_tri_group_index, part_mat_index):
part = Niff2PartNode()
part.part_tag = TAG_PART
part.this_part_index = part_index
part.part_size = 9*4
part.part_name_index = part_name_index
part.mat_index = part_mat_index
part.tri_group_index = part_tri_group_index
part.part_tri_num = 0
part.nintendo_extension_block_size = 0
part.user_extension_block_size = 0
return part
def niff2_part_node_builder(index, name_index, tri_group_index, mat_index, tri_indices):
return Niff2PartNode(index, name_index, tri_group_index, mat_index, tri_indices)


def niff2_part_node_writer(part, buf):
Expand All @@ -94,6 +88,10 @@ def niff2_part_node_writer(part, buf):
buf += part.mat_index.to_bytes(4, BYTE_ORDER)
buf += part.tri_group_index.to_bytes(4, BYTE_ORDER)
buf += part.part_tri_num.to_bytes(4, BYTE_ORDER)

for index in part.tri_indices:
buf += index.to_bytes(4, BYTE_ORDER)

buf += part.nintendo_extension_block_size.to_bytes(4, BYTE_ORDER)
buf += part.user_extension_block_size.to_bytes(4, BYTE_ORDER)
return buf
71 changes: 71 additions & 0 deletions tests/test_niff2_part.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"""NIFF2 Shape Parts Tests."""

import unittest

from blend2niff.exporter.niff2_part import (
niff2_part_list_header_builder, niff2_part_list_header_writer,
niff2_part_node_builder, niff2_part_node_writer)


class TestNiff2Part(unittest.TestCase):
def test_niff2_part_list_header_builder(self):
one_tri = niff2_part_node_builder(12, 34, 56, 78, [1])
two_tris = niff2_part_node_builder(12, 34, 56, 78, [1, 2])
parts = [one_tri, two_tris]
part_list_header = niff2_part_list_header_builder(parts)
self.assertEqual(part_list_header.part_list_tag, 0x00090000)
self.assertEqual(part_list_header.part_list_header_size, 32)
self.assertEqual(part_list_header.part_list_size, 116)
self.assertEqual(part_list_header.part_num, 2)
self.assertEqual(part_list_header.nintendo_extension_block_size, 0)
self.assertEqual(part_list_header.user_extension_block_size, 0)

def test_niff2_part_list_header_writer(self):
one_tri = niff2_part_node_builder(12, 34, 56, 78, [1])
two_tris = niff2_part_node_builder(12, 34, 56, 78, [1, 2])
parts = [one_tri, two_tris]
part_list_header = niff2_part_list_header_builder(parts)
buf = niff2_part_list_header_writer(
part_list_header, parts, bytearray())
byte_list = [0x00, 0x09, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20,
0x00, 0x00, 0x00, 0x74,
0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28,
0x00, 0x00, 0x00, 0x2C]
self.assertEqual(list(buf), byte_list)

def test_niff2_part_node_builder(self):
part_node = niff2_part_node_builder(1, 2, 3, 4, [5, 6, 7, 8, 9, 0])
self.assertEqual(part_node.part_tag, 0x00090100)
self.assertEqual(part_node.this_part_index, 1)
self.assertEqual(part_node.part_size, 60)
self.assertEqual(part_node.part_name_index, 2)
self.assertEqual(part_node.mat_index, 4)
self.assertEqual(part_node.tri_group_index, 3)
self.assertEqual(part_node.part_tri_num, 6)
self.assertEqual(part_node.nintendo_extension_block_size, 0)
self.assertEqual(part_node.user_extension_block_size, 0)
self.assertEqual(part_node.tri_indices, [5, 6, 7, 8, 9, 0])

def test_niff2_part_node_writer(self):
part_node = niff2_part_node_builder(1, 2, 3, 4, [5, 6, 7, 8, 9, 0])
buf = niff2_part_node_writer(part_node, bytearray())
byte_list = [0x00, 0x09, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x3C,
0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x03,
0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x05,
0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x07,
0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x09,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]
self.assertEqual(list(buf), byte_list)

0 comments on commit ca31ae1

Please sign in to comment.