# Spearfish: Workbench renders with the wireframe drawn over the shading (exec'd in Blender), to check the topology. # Temporary wireframe copies live in "_wire" and are removed afterwards. SHOTS / NAME may be set before exec. import bpy, os from mathutils import Vector OUTD = r"D:\HADAL - The Descent\models\tender-spearfish\previews" sc = bpy.context.scene name = globals().get("NAME", "topo") shots = globals().get("SHOTS", { "side": (Vector((7.5, -0.6, 0.6)), Vector((0, -0.6, 0.2)), 30), "front_q": (Vector((5.0, -8.5, 2.8)), Vector((0, -2.0, 0.1)), 40), "rear_q": (Vector((-5.2, 8.6, 2.6)), Vector((0, 2.0, 0.3)), 40), "top": (Vector((0.4, -0.2, 11.0)), Vector((0, -0.2, 0.0)), 40), }) wc = bpy.data.collections.get("_wire") or bpy.data.collections.new("_wire") if wc.name not in sc.collection.children: sc.collection.children.link(wc) wm = bpy.data.materials.get("_wire_ink") or bpy.data.materials.new("_wire_ink") wm.diffuse_color = (0.02, 0.02, 0.03, 1) temps = [] for o in bpy.data.collections["SPEARFISH | Tender (exported)"].all_objects: if o.type != 'MESH' or o.name == "SM_Spearfish_Cabin": continue t = o.copy(); t.data = o.data.copy(); t.name = "_w_" + o.name t.data.materials.clear(); t.data.materials.append(wm) wc.objects.link(t) md = t.modifiers.new("w", 'WIREFRAME'); md.thickness = 0.0035; md.use_relative_offset = False; md.use_even_offset = False temps.append(t) sc.render.engine = 'BLENDER_WORKBENCH' sh = sc.display.shading sh.light = 'STUDIO'; sh.color_type = 'MATERIAL'; sh.show_object_outline = False; sh.show_cavity = False sc.render.film_transparent = False sc.render.resolution_x, sc.render.resolution_y, sc.render.resolution_percentage = 1800, 1000, 100 cam = bpy.data.objects.get("_pv_cam") prev = sc.camera sc.camera = cam done = [] for o in bpy.data.objects: if o.name.startswith("UCX_"): o.hide_render = True for nm, (loc, tgt, lens) in shots.items(): cam.location = loc cam.rotation_euler = (tgt - loc).normalized().to_track_quat('-Z', 'Y').to_euler() cam.data.lens = lens sc.render.filepath = os.path.join(OUTD, "%s_%s.png" % (name, nm)) bpy.ops.render.render(write_still=True) done.append(sc.render.filepath) sc.camera = prev for t in temps: me = t.data bpy.data.objects.remove(t) bpy.data.meshes.remove(me) bpy.data.collections.remove(wc) # leave nothing behind in the file if wm.users == 0: bpy.data.materials.remove(wm) result = done