Skip to content

Commit 77482d8

Browse files
committed
Merge branch 'objloader' into main
2 parents 49514f9 + 193ff0a commit 77482d8

File tree

4 files changed

+73
-18
lines changed

4 files changed

+73
-18
lines changed

additional_file_formats/mzd.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def readMZD_to_meshio(filepath):
2222

2323
with open(filepath, 'rb') as file:
2424
byte = file.read(24)
25+
# check if mzd file is empty
2526
if byte != head:
2627
return -4
2728
while 1:
@@ -49,7 +50,7 @@ def readMZD_to_meshio(filepath):
4950
if out_numVertices < 0:
5051
return -127
5152
if out_numVertices == 0:
52-
break
53+
return meshio.Mesh(points=np.array([]), cells={})
5354

5455
byte = file.read(12 * out_numVertices)
5556
out_vertPositions = np.frombuffer(byte, dtype=np.float32)

bseq/importer.py

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ def apply_transformation(meshio_mesh, obj, depsgraph):
8080

8181
# evaluate the rigid body transformations (only relevant for .bin format)
8282
rigid_body_transformation = mathutils.Matrix.Identity(4)
83-
if meshio_mesh.field_data.get("transformation_matrix") is not None:
84-
rigid_body_transformation = meshio_mesh.field_data["transformation_matrix"]
83+
if meshio_mesh is not None:
84+
if meshio_mesh.field_data.get("transformation_matrix") is not None:
85+
rigid_body_transformation = meshio_mesh.field_data["transformation_matrix"]
8586

8687
# multiply everything together (with custom transform matrix)
8788
obj.matrix_world = rigid_body_transformation @ eval_transform_matrix
@@ -94,6 +95,9 @@ def update_mesh(meshio_mesh, mesh):
9495
n_loop = 0
9596
n_verts = len(mesh_vertices)
9697
if n_verts == 0:
98+
mesh.clear_geometry()
99+
mesh.update()
100+
mesh.validate()
97101
return
98102
faces_loop_start = np.array([], dtype=np.uint64)
99103
faces_loop_total = np.array([], dtype=np.uint64)
@@ -115,7 +119,7 @@ def update_mesh(meshio_mesh, mesh):
115119
# Add a zero as first entry
116120
faces_loop_start = np.roll(faces_loop_start, 1)
117121
faces_loop_start[0] = 0
118-
122+
119123
if len(mesh.vertices) == n_verts and len(mesh.polygons) == n_poly and len(mesh.loops) == n_loop:
120124
pass
121125
else:
@@ -130,6 +134,10 @@ def update_mesh(meshio_mesh, mesh):
130134
mesh.polygons.foreach_set("loop_total", faces_loop_total)
131135
mesh.polygons.foreach_set("use_smooth", [shade_scheme] * len(faces_loop_total))
132136

137+
# newer function but is about 4 times slower
138+
# mesh.clear_geometry()
139+
# mesh.from_pydata(mesh_vertices, [], data)
140+
133141
mesh.update()
134142
mesh.validate()
135143

@@ -180,7 +188,13 @@ def create_meshio_obj(filepath):
180188
show_message_box("Error when reading: " + filepath + ",\n" + traceback.format_exc(),
181189
"Meshio Loading Error" + str(e),
182190
icon="ERROR")
183-
191+
192+
# Do I need this for multi-loading?
193+
if filepath.endswith(".obj"):
194+
bpy.ops.import_scene.obj(filepath=filepath)
195+
obj = bpy.context.selected_objects[0]
196+
obj.name = os.path.basename(filepath)
197+
return
184198
# create the object
185199
name = os.path.basename(filepath)
186200
mesh = bpy.data.meshes.new(name)
@@ -196,20 +210,36 @@ def create_obj(fileseq, use_relative, root_path, transform_matrix=Matrix([[1, 0,
196210
current_frame = bpy.context.scene.frame_current
197211
filepath = fileseq[current_frame % len(fileseq)]
198212

199-
meshio_mesh = None
200-
enabled = True
201-
try:
202-
meshio_mesh = meshio.read(filepath)
203-
except Exception as e:
204-
show_message_box("Error when reading: " + filepath + ",\n" + traceback.format_exc(),
205-
"Meshio Loading Error" + str(e),
206-
icon="ERROR")
207-
enabled = False
213+
#.obj sequences have to be handled differently
214+
is_obj_seq = filepath.endswith(".obj")
215+
if is_obj_seq and bpy.context.scene.BSEQ.use_blender_obj_import:
216+
bpy.ops.import_scene.obj(filepath=filepath)
217+
enabled = True
218+
219+
tmp_obj = bpy.context.selected_objects[-1]
220+
221+
name = fileseq.basename() + "@" + fileseq.extension()
222+
object = bpy.data.objects.new(name, tmp_obj.data)
223+
224+
tmp_obj.select_set(True)
225+
bpy.ops.object.delete()
226+
227+
else:
228+
meshio_mesh = None
229+
enabled = True
230+
try:
231+
meshio_mesh = meshio.read(filepath)
232+
except Exception as e:
233+
show_message_box("Error when reading: " + filepath + ",\n" + traceback.format_exc(),
234+
"Meshio Loading Error" + str(e),
235+
icon="ERROR")
236+
enabled = False
237+
238+
name = fileseq.basename() + "@" + fileseq.extension()
239+
mesh = bpy.data.meshes.new(name)
240+
object = bpy.data.objects.new(name, mesh)
208241

209242
# create the object
210-
name = fileseq.basename() + "@" + fileseq.extension()
211-
mesh = bpy.data.meshes.new(name)
212-
object = bpy.data.objects.new(name, mesh)
213243
object.BSEQ.use_relative = use_relative
214244
if use_relative:
215245
if root_path != "":
@@ -224,7 +254,7 @@ def create_obj(fileseq, use_relative, root_path, transform_matrix=Matrix([[1, 0,
224254
object.matrix_world = transform_matrix
225255
driver = object.driver_add("BSEQ.frame")
226256
driver.driver.expression = 'frame'
227-
if enabled:
257+
if enabled and not is_obj_seq:
228258
update_mesh(meshio_mesh, object.data)
229259
bpy.context.collection.objects.link(object)
230260
bpy.ops.object.select_all(action="DESELECT")
@@ -260,6 +290,23 @@ def update_obj(scene, depsgraph=None):
260290
pattern = bpy.path.native_pathsep(pattern)
261291
fs = fileseq.FileSequence(pattern)
262292

293+
if pattern.endswith(".obj") and scene.BSEQ.use_blender_obj_import:
294+
filepath = fs[current_frame % len(fs)]
295+
296+
# Reload the object
297+
bpy.ops.import_scene.obj(filepath=filepath)
298+
tmp_obj = bpy.context.selected_objects[-1]
299+
300+
obj.data = tmp_obj.data
301+
tmp_obj.select_set(True)
302+
bpy.ops.object.delete()
303+
304+
apply_transformation(meshio_mesh, obj, depsgraph)
305+
306+
end_time = time.perf_counter()
307+
obj.BSEQ.last_benchmark = (end_time - start_time) * 1000
308+
continue
309+
263310
if obj.BSEQ.use_advance and obj.BSEQ.script_name:
264311
script = bpy.data.texts[obj.BSEQ.script_name]
265312
try:

bseq/panels.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ def draw(self, context):
207207
col1.label(text="Root Directory")
208208
col2.prop(importer_prop, "root_path", text="")
209209

210+
col1.label(text="Use Blender .obj Importer")
211+
col2.prop(importer_prop, "use_blender_obj_import", text="")
212+
210213
layout.operator("sequence.load")
211214

212215
layout.operator("wm.seq_import_batch")

bseq/properties.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ class BSEQ_scene_property(bpy.types.PropertyGroup):
7373
size=3,
7474
subtype="COORDINATES",
7575
default=[1,1,1])
76+
77+
use_blender_obj_import: bpy.props.BoolProperty(name='Use Blender Object Import',
78+
description="Whether or not to use Blender's built-in object import function",
79+
default=True)
7680

7781
class BSEQ_obj_property(bpy.types.PropertyGroup):
7882
init: bpy.props.BoolProperty(default=False)

0 commit comments

Comments
 (0)