diff --git a/io_import_images_as_planes.py b/io_import_images_as_planes.py index 50a562382cd80c744eb017b0ccc6772cd6c3ebb5..ef63ec5230fc9ffc66de11193bd10f7e3aaefeae 100644 --- a/io_import_images_as_planes.py +++ b/io_import_images_as_planes.py @@ -2,8 +2,8 @@ bl_info = { "name": "Import Images as Planes", - "author": "Florian Meyer (tstscr), mont29, matali, Ted Schundler (SpkyElctrc)", - "version": (3, 4, 0), + "author": "Florian Meyer (tstscr), mont29, matali, Ted Schundler (SpkyElctrc), mrbimax", + "version": (3, 5, 0), "blender": (2, 91, 0), "location": "File > Import > Images as Planes or Add > Mesh > Images as Planes", "description": "Imports images and creates planes with the appropriate aspect ratio. " @@ -718,6 +718,34 @@ class IMPORT_IMAGE_OT_to_plane(Operator, AddObjectHelper): name="Strength", min=0.0, default=1.0, soft_max=10.0, step=100, description="Brightness of Emission Texture") + use_transparency: BoolProperty( + name="Use Alpha", default=True, + description="Use alpha channel for transparency") + + BLEND_METHODS = ( + ('BLEND',"Blend","Render polygon transparent, depending on alpha channel of the texture"), + ('CLIP', "Clip","Use the alpha threshold to clip the visibility (binary visibility)"), + ('HASHED', "Hashed","Use noise to dither the binary visibility (works well with multi-samples)"), + ('OPAQUE', "Opaque","Render surface without transparency"), + ) + blend_method: EnumProperty(name="Blend Mode", items=BLEND_METHODS, default='BLEND', description="Blend Mode for Transparent Faces") + + SHADOW_METHODS = ( + ('CLIP', "Clip","Use the alpha threshold to clip the visibility (binary visibility)"), + ('HASHED', "Hashed","Use noise to dither the binary visibility (works well with multi-samples)"), + ('OPAQUE',"Opaque","Material will cast shadows without transparency"), + ('NONE',"None","Material will cast no shadow"), + ) + shadow_method: EnumProperty(name="Shadow Mode", items=SHADOW_METHODS, default='CLIP', description="Shadow mapping method") + + use_backface_culling: BoolProperty( + name="Backface Culling", default=False, + description="Use back face culling to hide the back side of faces") + + show_transparent_back: BoolProperty( + name="Show Backface", default=True, + description="Render multiple transparent layers (may introduce transparency sorting problems)") + overwrite_material: BoolProperty( name="Overwrite Material", default=True, description="Overwrite existing Material (based on material name)") @@ -729,9 +757,20 @@ class IMPORT_IMAGE_OT_to_plane(Operator, AddObjectHelper): # ------------------ # Properties - Image - use_transparency: BoolProperty( - name="Use Alpha", default=True, - description="Use alpha channel for transparency") + INTERPOLATION_MODES = ( + ('Linear', "Linear", "Linear interpolation"), + ('Closest', "Closest", "No interpolation (sample closest texel)"), + ('Cubic', "Cubic", "Cubic interpolation"), + ('Smart', "Smart", "Bicubic when magnifying, else bilinear (OSL only)"), + ) + interpolation: EnumProperty(name="Interpolation", items=INTERPOLATION_MODES, default='Linear', description="Texture interpolation") + + EXTENSION_MODES = ( + ('CLIP', "Clip", "Clip to image size and set exterior pixels as transparent"), + ('EXTEND', "Extend", "Extend by repeating edge pixels of the image"), + ('REPEAT', "Repeat", "Cause the image to repeat horizontally and vertically"), + ) + extension: EnumProperty(name="Extension", items=EXTENSION_MODES, default='CLIP', description="How the image is extrapolated past its original bounds") t = bpy.types.Image.bl_rna.properties["alpha_mode"] alpha_mode_items = tuple((e.identifier, e.name, e.description) for e in t.enum_items) @@ -766,27 +805,53 @@ class IMPORT_IMAGE_OT_to_plane(Operator, AddObjectHelper): box.label(text="Compositing Nodes:", icon='RENDERLAYERS') box.prop(self, "compositing_nodes") - + layout = self.layout + box = layout.box() box.label(text="Material Settings:", icon='MATERIAL') + box.label(text="Material Type") row = box.row() row.prop(self, 'shader', expand=True) if self.shader == 'EMISSION': box.prop(self, "emit_strength") + box.label(text="Blend Mode") + row = box.row() + row.prop(self, 'blend_method', expand=True) + if self.use_transparency and self.alpha_mode != "NONE" and self.blend_method == "OPAQUE": + box.label(text="'Opaque' does not support alpha", icon="ERROR") + if self.blend_method == 'BLEND': + row = box.row() + row.prop(self, "show_transparent_back") + + box.label(text="Shadow Mode") + row = box.row() + row.prop(self, 'shadow_method', expand=True) + + row = box.row() + row.prop(self, "use_backface_culling") + engine = context.scene.render.engine if engine not in ('CYCLES', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'): box.label(text="%s is not supported" % engine, icon='ERROR') box.prop(self, "overwrite_material") - + layout = self.layout + box = layout.box() box.label(text="Texture Settings:", icon='TEXTURE') + box.label(text="Interpolation") + row = box.row() + row.prop(self, 'interpolation', expand=True) + box.label(text="Extension") + row = box.row() + row.prop(self, 'extension', expand=True) row = box.row() row.prop(self, "use_transparency") - sub = row.row() - sub.active = self.use_transparency - sub.prop(self, "alpha_mode", text="") - box.prop(self, "use_auto_refresh") + if self.use_transparency: + sub = row.row() + sub.prop(self, "alpha_mode", text="") + row = box.row() + row.prop(self, "use_auto_refresh") def draw_spatial_config(self, context): # --- Spatial Properties: Position, Size and Orientation --- # @@ -970,6 +1035,8 @@ class IMPORT_IMAGE_OT_to_plane(Operator, AddObjectHelper): tex_image = node_tree.nodes.new('ShaderNodeTexImage') tex_image.image = img_spec.image tex_image.show_texture = True + tex_image.interpolation = self.interpolation + tex_image.extension = self.extension self.apply_texture_options(tex_image, img_spec) return tex_image @@ -985,8 +1052,13 @@ class IMPORT_IMAGE_OT_to_plane(Operator, AddObjectHelper): material = bpy.data.materials.new(name=name_compat) material.use_nodes = True - if self.use_transparency: - material.blend_method = 'BLEND' + + material.blend_method = self.blend_method + material.shadow_method = self.shadow_method + + material.use_backface_culling = self.use_backface_culling + material.show_transparent_back = self.show_transparent_back + node_tree = material.node_tree out_node = clean_node_tree(node_tree)