Skip to content

Commit b38e331

Browse files
Notexe2kpr
andcommitted
Fix bullet generation
Co-authored-by: 2kpr <96332338+2kpr@users.noreply.github.com>
1 parent bd5a88b commit b38e331

File tree

2 files changed

+33
-151
lines changed

2 files changed

+33
-151
lines changed

file_prim/bl_export_prim.py

Lines changed: 31 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1106988
def compare_x_axis(a, b):

file_prim/bl_import_prim.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def load_prim(operator, context, collection, filepath, use_rig, rig_filepath):
6363

6464
def load_prim_coli(prim, prim_name: str, mesh_index: int):
6565
"""Testing class for the prim BoxColi"""
66-
for boxColi in prim.header.object_table[mesh_index].sub_mesh.collision.box_entries:
66+
for b, boxColi in enumerate(prim.header.object_table[mesh_index].sub_mesh.collision.box_entries):
6767
x, y, z = boxColi.min
6868
x1, y1, z1 = boxColi.max
6969

@@ -94,7 +94,7 @@ def load_prim_coli(prim, prim_name: str, mesh_index: int):
9494
)
9595
ob = bpy.context.object
9696
me = ob.data
97-
ob.name = str(prim_name) + "_" + str(mesh_index) + "_Coli"
97+
ob.name = str(prim_name) + "_" + str(mesh_index) + "_Coli_" + str(b)
9898
me.name = "CUBEMESH"
9999

100100

0 commit comments

Comments
 (0)