diff options
author | Adam Dominec <adominec@gmail.com> | 2017-12-08 13:34:51 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-01-01 18:25:05 +0300 |
commit | 594221f39f2d14b93e2bd659aba5792041dd5c8e (patch) | |
tree | 2578e18dffa6420278b3956c72afaa45bd484c6a | |
parent | f7f2e1490971eac1be4ccd802a2d600fcb86fdab (diff) |
io_export_paper_model: update to upstream 7fe2553
fix baking in both Cycles and BI
-rw-r--r-- | io_export_paper_model.py | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/io_export_paper_model.py b/io_export_paper_model.py index 1203d18f..5ddcc11c 100644 --- a/io_export_paper_model.py +++ b/io_export_paper_model.py @@ -167,19 +167,16 @@ def bake(face_indices, uvmap, image): # please excuse the following mess. Cycles baking API does not seem to allow better. ob = bpy.context.active_object me = ob.data - mat = bpy.data.materials.new("unfolder dummy") - mat.use_nodes = True - img = mat.node_tree.nodes.new('ShaderNodeTexImage') - img.image = image - mat.node_tree.nodes.active = img - uv = mat.node_tree.nodes.new('ShaderNodeUVMap') - uv.uv_map = uvmap.name - mat.node_tree.links.new(uv.outputs['UV'], img.inputs['Vector']) - uvmap.active = True - recall_object_slots, recall_mesh_slots = [slot.material for slot in ob.material_slots], me.materials[:] - for i, slot in enumerate(ob.material_slots): - slot.material = me.materials[i] = mat - me.materials.append(mat) + # add a disconnected image node that defines the bake target + temp_nodes = dict() + for mat in me.materials: + mat.use_nodes = True + img = mat.node_tree.nodes.new('ShaderNodeTexImage') + img.image = image + temp_nodes[mat] = img + mat.node_tree.nodes.active = img + uvmap.active = True + # move all excess faces to negative numbers (that is the only way to disable them) loop = me.uv_layers[me.uv_layers.active_index].data face_indices = set(face_indices) ignored_uvs = [ @@ -187,8 +184,7 @@ def bake(face_indices, uvmap, image): for face in me.polygons if face.index not in face_indices for i, v in enumerate(face.vertices)] for vid in ignored_uvs: - loop[vid].uv[0] *= -1 - loop[vid].uv[1] *= -1 + loop[vid].uv *= -1 bake_type = bpy.context.scene.cycles.bake_type sta = bpy.context.scene.render.bake.use_selected_to_active try: @@ -196,15 +192,10 @@ def bake(face_indices, uvmap, image): except RuntimeError as e: raise UnfoldError(*e.args) finally: - me.materials.pop() - for slot, recall in zip(ob.material_slots, recall_object_slots): - slot.material = recall - for i, recall in enumerate(recall_mesh_slots): - me.materials[i] = recall - bpy.data.materials.remove(mat) + for mat, node in temp_nodes.items(): + mat.node_tree.nodes.remove(node) for vid in ignored_uvs: - loop[vid].uv[0] *= -1 - loop[vid].uv[1] *= -1 + loop[vid].uv *= -1 else: texfaces = uvmap.data for fid in face_indices: @@ -293,9 +284,11 @@ class Unfolder: rd = sce.render bk = rd.bake if rd.engine == 'CYCLES': - recall = sce.cycles.bake_type, bk.use_selected_to_active, bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear + recall = sce.cycles.bake_type, bk.use_selected_to_active, bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear, bk.use_pass_direct, bk.use_pass_indirect + # recall use_pass... lookup = {'TEXTURE': 'DIFFUSE', 'AMBIENT_OCCLUSION': 'AO', 'RENDER': 'COMBINED', 'SELECTED_TO_ACTIVE': 'COMBINED'} sce.cycles.bake_type = lookup[properties.output_type] + bk.use_pass_direct = bk.use_pass_indirect = (properties.output_type != 'TEXTURE') bk.use_selected_to_active = (properties.output_type == 'SELECTED_TO_ACTIVE') bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear = 0, 10, False, False else: @@ -316,7 +309,7 @@ class Unfolder: # revoke settings if rd.engine == 'CYCLES': - sce.cycles.bake_type, bk.use_selected_to_active, bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear = recall + sce.cycles.bake_type, bk.use_selected_to_active, bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear, bk.use_pass_direct, bk.use_pass_indirect = recall else: rd.engine, rd.bake_type, rd.use_bake_to_vertex_color, rd.use_bake_selected_to_active, rd.bake_distance, rd.bake_bias, rd.bake_margin, rd.use_bake_clear = recall if not properties.do_create_uvmap: @@ -371,7 +364,7 @@ class Mesh: face.select = (face.index in null_faces or face.index in twisted_faces) cure = ("Remove Doubles and Triangulate" if (null_edges or null_faces) and twisted_faces else "Triangulate" if twisted_faces - else"Remove Doubles") + else "Remove Doubles") raise UnfoldError( "The model contains:\n" + (" {} zero-length edge(s)\n".format(len(null_edges)) if null_edges else "") + @@ -662,6 +655,10 @@ class Mesh: bpy.data.images.remove(image) def save_separate_images(self, tex, scale, filepath, embed=None): + # omitting this may cause a "Circular reference in texture stack" error + recall = {texface: texface.image for texface in tex.data} + for texface in tex.data: + texface.image = None for i, island in enumerate(self.islands, 1): image_name = "{} isl{}".format(self.data.name[:15], i) image = create_blank_image(image_name, island.bounding_box * scale, alpha=0) @@ -678,6 +675,8 @@ class Mesh: island.image_path = image_path image.user_clear() bpy.data.images.remove(image) + for texface, img in recall.items(): + texface.image = img class Vertex: |