@@ -464,7 +464,7 @@ def save_prim_sub_mesh(
464464 prim_mesh .vertexBuffer .vertices [i ] = vertex
465465
466466 prim_mesh .collision .tri_per_chunk = max_tris_per_chunk
467- # save_prim_hitboxes(mesh, prim_mesh)
467+ save_prim_hitboxes (mesh , prim_mesh )
468468
469469 if export_scene :
470470 if export_materials_textures :
@@ -853,118 +853,6 @@ def save_prim_sub_mesh(
853853 materials [slot .material .name ] = material
854854 material_id = materials [slot .material .name ]["index" ]
855855
856- # automatic collision bounding box generation start
857- triangles = []
858- for i in range (int (len (prim_mesh .indices ) / 3 )):
859- triangles .append (
860- [
861- prim_mesh .vertexBuffer .vertices [prim_mesh .indices [i * 3 ]],
862- prim_mesh .vertexBuffer .vertices [prim_mesh .indices [i * 3 + 1 ]],
863- prim_mesh .vertexBuffer .vertices [prim_mesh .indices [i * 3 + 2 ]],
864- ]
865- )
866- bbox = prim_mesh .calc_bb ()
867- bbox_x = bbox [1 ][0 ] - bbox [0 ][0 ]
868- bbox_y = bbox [1 ][1 ] - bbox [0 ][1 ]
869- bbox_z = bbox [1 ][2 ] - bbox [0 ][2 ]
870- if bbox_x > bbox_y and bbox_x > bbox_z :
871- triangles = sorted (triangles , key = cmp_to_key (compare_x_axis ))
872- elif bbox_y > bbox_z :
873- triangles = sorted (triangles , key = cmp_to_key (compare_y_axis ))
874- else :
875- triangles = sorted (triangles , key = cmp_to_key (compare_z_axis ))
876- coli_bb_max = [- sys .float_info .max ] * 3
877- coli_bb_min = [sys .float_info .max ] * 3
878- count = 0
879- count2 = 0
880- for triangle in reversed (triangles ):
881- for t in range (3 ):
882- for axis in range (3 ):
883- if triangle [t ].position [axis ] > coli_bb_max [axis ]:
884- coli_bb_max [axis ] = triangle [t ].position [axis ]
885- if triangle [t ].position [axis ] < coli_bb_min [axis ]:
886- coli_bb_min [axis ] = triangle [t ].position [axis ]
887- count += 1
888- if count == max_tris_per_chunk :
889- entry = format .BoxColiEntry ()
890- coli_bb_min [0 ] = (
891- 0
892- if bbox_x <= 0.0
893- else int (((coli_bb_min [0 ] - bbox [0 ][0 ]) * 255 ) / (bbox_x ))
894- )
895- coli_bb_min [1 ] = (
896- 0
897- if bbox_y <= 0.0
898- else int (((coli_bb_min [1 ] - bbox [0 ][1 ]) * 255 ) / (bbox_y ))
899- )
900- coli_bb_min [2 ] = (
901- 0
902- if bbox_z <= 0.0
903- else int (((coli_bb_min [2 ] - bbox [0 ][2 ]) * 255 ) / (bbox_z ))
904- )
905- coli_bb_max [0 ] = (
906- 0
907- if bbox_x <= 0.0
908- else int (((coli_bb_max [0 ] - bbox [0 ][0 ]) * 255 ) / (bbox_x ))
909- )
910- coli_bb_max [1 ] = (
911- 0
912- if bbox_y <= 0.0
913- else int (((coli_bb_max [1 ] - bbox [0 ][1 ]) * 255 ) / (bbox_y ))
914- )
915- coli_bb_max [2 ] = (
916- 0
917- if bbox_z <= 0.0
918- else int (((coli_bb_max [2 ] - bbox [0 ][2 ]) * 255 ) / (bbox_z ))
919- )
920- entry .min = coli_bb_min
921- entry .max = coli_bb_max
922- prim_mesh .collision .box_entries .append (entry )
923- count = 0
924- count2 += 1
925- coli_bb_max = [- sys .float_info .max ] * 3
926- coli_bb_min = [sys .float_info .max ] * 3
927- if count % max_tris_per_chunk != 0 :
928- entry = format .BoxColiEntry ()
929- coli_bb_min [0 ] = (
930- 0
931- if bbox_x <= 0.0
932- else int (((coli_bb_min [0 ] - bbox [0 ][0 ]) * 255 ) / (bbox_x ))
933- )
934- coli_bb_min [1 ] = (
935- 0
936- if bbox_y <= 0.0
937- else int (((coli_bb_min [1 ] - bbox [0 ][1 ]) * 255 ) / (bbox_y ))
938- )
939- coli_bb_min [2 ] = (
940- 0
941- if bbox_z <= 0.0
942- else int (((coli_bb_min [2 ] - bbox [0 ][2 ]) * 255 ) / (bbox_z ))
943- )
944- coli_bb_max [0 ] = (
945- 0
946- if bbox_x <= 0.0
947- else int (((coli_bb_max [0 ] - bbox [0 ][0 ]) * 255 ) / (bbox_x ))
948- )
949- coli_bb_max [1 ] = (
950- 0
951- if bbox_y <= 0.0
952- else int (((coli_bb_max [1 ] - bbox [0 ][1 ]) * 255 ) / (bbox_y ))
953- )
954- coli_bb_max [2 ] = (
955- 0
956- if bbox_z <= 0.0
957- else int (((coli_bb_max [2 ] - bbox [0 ][2 ]) * 255 ) / (bbox_z ))
958- )
959- entry .min = coli_bb_min
960- entry .max = coli_bb_max
961- prim_mesh .collision .box_entries .append (entry )
962- count = 0
963- count2 += 1
964- coli_bb_max = [- sys .float_info .max ] * 3
965- coli_bb_min = [sys .float_info .max ] * 3
966- # automatic collision bounding box generation end
967-
968856 return prim_mesh , material_id
969857
970858
@@ -1063,44 +951,38 @@ def triangulate_object(obj):
1063951 bm .free ()
1064952
1065953
1066- def save_prim_hitboxes (bl_mesh , prim_sub_mesh ):
1067- bb_max = [- sys .float_info .max ] * 3
1068- bb_min = [sys .float_info .max ] * 3
1069- for vert in bl_mesh .vertices :
1070- for axis in range (3 ):
1071- if bb_max [axis ] < vert .co [axis ]:
1072- bb_max [axis ] = vert .co [axis ]
1073- if bb_min [axis ] > vert .co [axis ]:
1074- bb_min [axis ] = vert .co [axis ]
1075- triangles = np .array (bl_mesh .loop_triangles )
1076- num_chunks = len (triangles ) / prim_sub_mesh .collision .tri_per_chunk
1077- if len (triangles ) % prim_sub_mesh .collision .tri_per_chunk :
954+ def save_prim_hitboxes (mesh , prim_mesh ):
955+ bb_min = np .array ([sys .float_info .max ] * 3 )
956+ bb_max = np .array ([- sys .float_info .max ] * 3 )
957+ for f in range (len (mesh .loop_triangles )):
958+ for v in range (3 ):
959+ #print(f"Triangle loop {f}: Vertex {v}: Index {mesh.loop_triangles[f].vertices[v]}")
960+ bb_min = np .min ([bb_min , mesh .vertices [mesh .loop_triangles [f ].vertices [v ]].co ], axis = 0 )
961+ bb_max = np .max ([bb_max , mesh .vertices [mesh .loop_triangles [f ].vertices [v ]].co ], axis = 0 )
962+ bb_diff = bb_max - bb_min
963+ num_chunks = int (len (mesh .loop_triangles ) / prim_mesh .collision .tri_per_chunk )
964+ if len (mesh .loop_triangles ) % prim_mesh .collision .tri_per_chunk :
1078965 num_chunks += 1
1079- chunks = np .array_split (triangles , num_chunks )
1080- for chunk in chunks :
1081- h_max = [- sys .float_info .max ] * 3
1082- h_min = [sys .float_info .max ] * 3
1083- for triangle in chunk :
1084- for vert in triangle .vertices :
1085- vert_pos = bl_mesh .vertices [vert ].co
1086- for axis in range (3 ):
1087- if h_max [axis ] < vert_pos [axis ]:
1088- h_max [axis ] = vert_pos [axis ]
1089- if h_min [axis ] > vert_pos [axis ]:
1090- h_min [axis ] = vert_pos [axis ]
1091- bb_x = bb_max [0 ] - bb_min [0 ]
1092- bb_y = bb_max [1 ] - bb_min [1 ]
1093- bb_z = bb_max [2 ] - bb_min [2 ]
1094- h_min [0 ] = 0 if bb_x == 0 else int (round (((h_min [0 ] - bb_min [0 ]) / bb_x ) * 255 ))
1095- h_min [1 ] = 0 if bb_y == 0 else int (round (((h_min [1 ] - bb_min [1 ]) / bb_y ) * 255 ))
1096- h_min [2 ] = 0 if bb_z == 0 else int (round (((h_min [2 ] - bb_min [2 ]) / bb_z ) * 255 ))
1097- h_max [0 ] = 0 if bb_x == 0 else int (round (((h_max [0 ] - bb_min [0 ]) / bb_x ) * 255 ))
1098- h_max [1 ] = 0 if bb_y == 0 else int (round (((h_max [1 ] - bb_min [1 ]) / bb_y ) * 255 ))
1099- h_max [2 ] = 0 if bb_z == 0 else int (round (((h_max [2 ] - bb_min [2 ]) / bb_z ) * 255 ))
966+ for n in range (num_chunks ):
967+ #print(f"chunk: {n}")
968+ #print(f"faces: {n*prim_mesh.collision.tri_per_chunk} to {(n+1)*prim_mesh.collision.tri_per_chunk}")
969+ coli_bb_min = np .array ([sys .float_info .max ] * 3 )
970+ coli_bb_max = np .array ([- sys .float_info .max ] * 3 )
971+ for f in range (n * prim_mesh .collision .tri_per_chunk ,(n + 1 )* prim_mesh .collision .tri_per_chunk ):
972+ if f == len (mesh .loop_triangles ):
973+ break
974+ for v in range (3 ):
975+ coli_bb_min = np .min ([coli_bb_min , mesh .vertices [mesh .loop_triangles [f ].vertices [v ]].co ], axis = 0 )
976+ coli_bb_max = np .max ([coli_bb_max , mesh .vertices [mesh .loop_triangles [f ].vertices [v ]].co ], axis = 0 )
1100977 entry = format .BoxColiEntry ()
1101- entry .min = h_min
1102- entry .max = h_max
1103- prim_sub_mesh .collision .box_entries .append (entry )
978+ coli_min = ((coli_bb_min - bb_min ) * 255 ) / bb_diff
979+ coli_max = ((coli_bb_max - bb_min ) * 255 ) / bb_diff
980+ for i in range (3 ):
981+ entry .min [i ] = int (round (coli_min [i ]))
982+ entry .max [i ] = int (round (coli_max [i ]))
983+ prim_mesh .collision .box_entries .append (entry )
984+ #print(f"coli entry min: {entry.min}")
985+ #print(f"coli entry max: {entry.max}")
1104986
1105987
1106988def compare_x_axis (a , b ):
0 commit comments