0
$\begingroup$

I have been working on a panel that contains a list of textures and additional information. This is for rendering a garment with multiple textures.

The main idea is to facilitate non-3D users to load a file with a garment, camera and lights. The add-on aids in listing the textures and quickly render single views.

So, to focus on user-friendliness, I want to display the textures in the panel. There are two option I found, template_icon and template_preview. I added both to the script to see the different.

template_icon works but display quality is low.
template_preview works with only one display. Having multiple previews either starts flickering or displays only one texture.

template_preview flickering

Below is my Panel Operator. Maybe it is how I setup my panel.

###### Panel for texture list
# ------------------------------------------------------------------------
class CADListPanel(Panel):
    bl_label = "CAD List"
    bl_idname = "VIEW3D_PT_CAD_list"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'CAD List'
    
    def draw(self, context):
        ###For Preffix and Suffix
        render_inputs = bpy.context.scene.NameInputProps
                
        scene = context.scene
        layout = self.layout

        box = layout.box()
        col = box.column(align=True)
        grid = col.grid_flow(columns=1, align=True)
        grid.scale_y = 1.5
        grid.operator('render.cads', text="Render Colorways")
        grid = col.grid_flow(columns=1, align=True)
        grid.scale_y = .75
        grid.prop(context.scene, 'output_path')
        grid.prop(render_inputs, "preffix_render", text="Prefix")
        grid.prop(render_inputs, "suffix_render", text="Suffix")
        

        ###Checkbox generator
        box = layout.box()
        col = box.column(align=True)
        grid = col.grid_flow(columns=1, align=True)
        grid.label(text="Colorways to Render")
        
        split = col.split()
        columns = [split.column() for i in range(5)]
        cad_list = bpy.context.scene.cad_list
        for i in range (len(cad_list)):
            if i >= len(cad_list):
                break
            rendercheck = str(i + 1)
            ###Use scene.cad_list[i] instead of cad_list[i]
            columns[(i) % 5].prop(scene.cad_list[i], "renderbool", text=rendercheck, icon='MATCLOTH')
        
        box = layout.box()
        col = box.column(align=True)
        grid = col.grid_flow(columns=1, align=True)
        grid.label(text="Activate Render Preview to aid in centerline position")
        
        #####CAD info and options
        for idx, cad in enumerate(scene.cad_list):
            try:
                box = layout.box()
                col = box.column(align=True)
                grid = col.grid_flow(columns=3, align=True)
                grid.label(text="")
                grid.label(text=f"CAD {idx + 1}")
                grid.prop(cad, "renderbool")
                
                grid = col.grid_flow(columns=1, align=True)
                grid.prop(cad, "name")

                ###Open and Remove
                grid = col.grid_flow(columns=1, align=True)
                if cad.image is None:
                    open_operator = grid.operator("scene.open_cad", text="Open", icon='FILEBROWSER')
                    open_operator.index = idx  ###Pass the index as a property
                else:
                    remove_operator = grid.operator("scene.remove_cad", text="Remove")
                    remove_operator.cad_index = idx
                     
                grid = col.grid_flow(columns=2, align=True)
                icon = 'TRIA_DOWN' if cad.toggle_options else 'TRIA_RIGHT'
                grid.prop(cad, 'toggle_options', icon=icon, icon_only=True, )
                grid.label(text="Toggle Information")
                if cad.toggle_options:
                    ###Display the texture
                    if cad.image is not None:
                        ###Image input field
                        grid = col.grid_flow(columns=1, align=True)
                        grid.prop(cad, "image", text="")
                        
                        grid = col.grid_flow(columns=2, align=True)
                        ###X and Y positioning
                        grid.prop(cad, "posx")
                        grid.prop(cad, "posy")
                        
#####Comparing texture display options
                        grid = col.grid_flow(columns=1, align=True)
                        ###Preview layout Function 
                        grid.template_preview(bpy.data.textures[cad.name], preview_id=f"cad.preview{idx + 1}")
                        ###Icon layout Function 
                        grid.template_icon(cad.image.preview.icon_id, scale=10)
                        
                        ###DPI and Scale
                        grid = col.grid_flow(columns=2, align=True)
                        row = grid.row()
                        row.alignment = 'CENTER'
                        row.label(text="DPI")
                        grid.prop(cad, "dpi")
                        row = grid.row()
                        row.alignment = 'CENTER'
                        row.label(text="SCALE")
                        grid.prop(cad, "scale")
                        
                        ###Dropdown list
                        grid = col.grid_flow(columns=1, align=True)
                        grid.prop(cad, "matchinglist")

                        ###Color inputs
                        row = grid.row(align=True)
                        row.prop(cad, "colorbutton")
                        row = grid.row(align=True)
                        row.prop(cad, "colorthread")

                        ###Boolean option to hide/unhide Color 3
                        row = grid.row()
                        row.prop(cad, "nocontrast")
                        if not cad.nocontrast:
                            row = grid.row()
                            row.prop(cad, "colorcontrast")

                        grid = col.grid_flow(columns=2, align=True)
                        icon = 'TRIA_DOWN' if cad.toggle_options2 else 'TRIA_RIGHT'
                        grid.prop(cad, 'toggle_options2', icon=icon, icon_only=True,)
                        grid.label(text="Additioanl Options")
                        if cad.toggle_options2:
                            grid = col.grid_flow(columns=1, align=True)
                            grid.prop(cad, "saturation")
                            grid.prop(cad, "weave")
                            grid.prop(cad, "color_variation")
                            grid.prop(cad, "backside")
                else:
                    if cad.image is not None:
                        grid = col.grid_flow(columns=1, align=True)
                        image = cad.image
                        grid.template_icon(image.preview.icon_id, scale=5)
               
            except AttributeError:
                ###Handle the case where the image preview is not available
                layout.label(text="Image preview not available.")
                        
        ###Add texture button
        layout.operator("scene.add_cad")
        
        
    def update(self, context):
        self.report({'INFO'}, "Panel Updated")
        bpy.context.area.tag_redraw()
$\endgroup$
1

1 Answer 1

1
$\begingroup$

I don't Have enough Reputation to leave a Comment, but I am experiencing the same issue and I believe this is a bug in Blender. I created a ticket here for anyone experiencing the same issue: Having Multiple Blender texture previews is broken #112702

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .