From 078dc952e7fdbeedfee64974dca23e0a98f08628 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Fri, 9 Oct 2020 16:39:20 +0800 Subject: [PATCH] add triangle face support --- ballance_blender_plugin/add_floor.py | 55 +++++++++++++------- ballance_blender_plugin/json/BasicBlock.json | 16 ++++++ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/ballance_blender_plugin/add_floor.py b/ballance_blender_plugin/add_floor.py index deb0280..3877c6b 100644 --- a/ballance_blender_plugin/add_floor.py +++ b/ballance_blender_plugin/add_floor.py @@ -393,12 +393,13 @@ def load_basic_floor(mesh, floor_type, rotation, height_multiplier, d1, d2, side # now, we can process real mesh # load existed base count global_offset_vec = len(mesh.vertices) - global_offset_face = len(mesh.polygons) - global_offset_facex4 = global_offset_face * 4 + global_offset_polygons = len(mesh.polygons) + global_offset_loops = len(mesh.loops) vecList = [] uvList = [] normalList = [] faceList = [] + faceIndList = [] faceMatList = [] for face_define in needCreatedFaces: base_indices = len(vecList) @@ -411,27 +412,40 @@ def load_basic_floor(mesh, floor_type, rotation, height_multiplier, d1, d2, side uvList.append(solve_uv_data(uv, d1, d2, height_multiplier, block_uvworld_unit)) for face in face_define['Faces']: - vec_indices = ( - face['P1'] + base_indices, - face['P2'] + base_indices, - face['P3'] + base_indices, - face['P4'] + base_indices) + if face['Type'] == 'RECTANGLE': + # rectangle + vec_indices = ( + face['P1'] + base_indices, + face['P2'] + base_indices, + face['P3'] + base_indices, + face['P4'] + base_indices) + indCount = 4 + elif face['Type'] == 'TRIANGLE': + # triangle + vec_indices = ( + face['P1'] + base_indices, + face['P2'] + base_indices, + face['P3'] + base_indices) + indCount = 3 # we need calc normal and push it into list - four_point_normal = solve_normal_data(vecList[vec_indices[0]], vecList[vec_indices[1]], vecList[vec_indices[2]]) - for i in range(4): - normalList.append(four_point_normal) + point_normal = solve_normal_data(vecList[vec_indices[0]], vecList[vec_indices[1]], vecList[vec_indices[2]]) + for i in range(indCount): + normalList.append(point_normal) # push indices into list - for i in range(4): + for i in range(indCount): faceList.append(vec_indices[i] + global_offset_vec) # push material into list faceMatList.append(materialDict[face['Textures']]) + # push face vec count into list + faceIndList.append(indCount) + # push data into blender struct mesh.vertices.add(len(vecList)) - mesh.loops.add(len(faceMatList)*4) # 4 vec face confirm + mesh.loops.add(len(faceList)) mesh.polygons.add(len(faceMatList)) if mesh.uv_layers.active is None: # if no uv, create it @@ -439,15 +453,18 @@ def load_basic_floor(mesh, floor_type, rotation, height_multiplier, d1, d2, side mesh.create_normals_split() virtual_foreach_set(mesh.vertices, "co", global_offset_vec, vecList) - virtual_foreach_set(mesh.loops, "vertex_index", global_offset_facex4, faceList) - virtual_foreach_set(mesh.loops, "normal", global_offset_facex4, normalList) - virtual_foreach_set(mesh.uv_layers[0].data, "uv", global_offset_facex4, uvList) + virtual_foreach_set(mesh.loops, "vertex_index", global_offset_loops, faceList) + virtual_foreach_set(mesh.loops, "normal", global_offset_loops, normalList) + virtual_foreach_set(mesh.uv_layers[0].data, "uv", global_offset_loops, uvList) + cache_counter = 0 for i in range(len(faceMatList)): - mesh.polygons[i + global_offset_face].loop_start = i * 4 + global_offset_facex4 - mesh.polygons[i + global_offset_face].loop_total = 4 - mesh.polygons[i + global_offset_face].material_index = faceMatList[i] - mesh.polygons[i + global_offset_face].use_smooth = True + indCount = faceIndList[i] + mesh.polygons[i + global_offset_polygons].loop_start = global_offset_loops + cache_counter + mesh.polygons[i + global_offset_polygons].loop_total = indCount + mesh.polygons[i + global_offset_polygons].material_index = faceMatList[i] + mesh.polygons[i + global_offset_polygons].use_smooth = True + cache_counter += indCount def load_derived_floor(mesh, floor_type, height_multiplier, d1, d2, sides_struct): diff --git a/ballance_blender_plugin/json/BasicBlock.json b/ballance_blender_plugin/json/BasicBlock.json index 025355e..e88f8a0 100644 --- a/ballance_blender_plugin/json/BasicBlock.json +++ b/ballance_blender_plugin/json/BasicBlock.json @@ -28,6 +28,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -51,6 +52,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -74,6 +76,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -97,6 +100,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -120,6 +124,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -143,6 +148,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -175,6 +181,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 2, "P2": 3, "P3": 4, @@ -182,6 +189,7 @@ "Textures": "FloorTopBorder" }, { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -220,6 +228,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -243,6 +252,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -266,6 +276,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -289,6 +300,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -312,6 +324,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 0, "P2": 1, "P3": 2, @@ -335,6 +348,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1, @@ -367,6 +381,7 @@ ], "Faces": [ { + "Type": "RECTANGLE", "P1": 2, "P2": 3, "P3": 4, @@ -374,6 +389,7 @@ "Textures": "FloorTopBorder" }, { + "Type": "RECTANGLE", "P1": 3, "P2": 2, "P3": 1,