diff options
author | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2019-10-22 00:07:59 +0300 |
---|---|---|
committer | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2019-10-22 09:11:25 +0300 |
commit | b0e3ae4b4dacedd58f7045c81e430a744de9b8cb (patch) | |
tree | 752d6a60a56f2c654bc30b9d8b86524c42733e27 /render_povray | |
parent | 144995939a62d148285b5369cb424dbc53831c9e (diff) |
render_povray: 2.8 texture API fix
Second step fixing texture API broken by 2.8 thanks to Lanuhum patch
Diffstat (limited to 'render_povray')
-rw-r--r-- | render_povray/__init__.py | 56 | ||||
-rw-r--r-- | render_povray/ui.py | 100 |
2 files changed, 146 insertions, 10 deletions
diff --git a/render_povray/__init__.py b/render_povray/__init__.py index 69f58022..09ac5454 100644 --- a/render_povray/__init__.py +++ b/render_povray/__init__.py @@ -69,6 +69,28 @@ else: def string_strip_hyphen(name): return name.replace("-", "") + +def active_texture_name_from_uilist(self,context): + mat = context.scene.view_layers["View Layer"].objects.active.active_material + index = mat.pov.active_texture_index + name = mat.pov_texture_slots[index].name + newname = mat.pov_texture_slots[index].texture + tex = bpy.data.textures[name] + tex.name = newname + mat.pov_texture_slots[index].name = newname + + +def active_texture_name_from_search(self,context): + mat = context.scene.view_layers["View Layer"].objects.active.active_material + index = mat.pov.active_texture_index + name = mat.pov_texture_slots[index].texture_search + try: + tex = bpy.data.textures[name] + mat.pov_texture_slots[index].name = name + mat.pov_texture_slots[index].texture = name + except: + pass + ############################################################################### # Scene POV properties. ############################################################################### @@ -558,6 +580,11 @@ class RenderPovSettingsScene(PropertyGroup): # Material POV properties. ############################################################################### class MaterialTextureSlot(PropertyGroup): + bl_idname="povray_texture_slots", + bl_description="Texture_slots from Blender-2.79", + + texture : StringProperty(update=active_texture_name_from_uilist) + texture_search : StringProperty(update=active_texture_name_from_search) alpha_factor: FloatProperty( name="Alpha", @@ -4294,6 +4321,29 @@ for i in range(18): # length of world texture slots world.texture_slots.add() ''' +class MATERIAL_TEXTURE_SLOTS_UL_layerlist(bpy.types.UIList): +# texture_slots: + index = bpy.props.IntProperty(name='index') + #foo = random prop + def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + ob = data + slot = item + #ma = slot.name + # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code. + if self.layout_type in {'DEFAULT', 'COMPACT'}: + # You should always start your row layout by a label (icon + text), or a non-embossed text field, + # this will also make the row easily selectable in the list! The later also enables ctrl-click rename. + # We use icon_value of label, as our given icon is an integer value, not an enum ID. + # Note "data" names should never be translated! + if slot: + layout.prop(item, "texture", text="", emboss=False, icon='TEXTURE') + else: + layout.label(text="New", translate=False, icon_value=icon) + # 'GRID' layout type should be as compact as possible (typically a single icon!). + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label(text="", icon_value=icon) + ############################################################################### # Text POV properties. @@ -4345,6 +4395,7 @@ classes = ( RenderPovSettingsCamera, RenderPovSettingsLight, RenderPovSettingsWorld, + MATERIAL_TEXTURE_SLOTS_UL_layerlist, MaterialTextureSlot, WorldTextureSlot, RenderPovSettingsMaterial, @@ -4398,7 +4449,7 @@ def register(): bpy.types.Camera.pov = PointerProperty(type=RenderPovSettingsCamera) bpy.types.Light.pov = PointerProperty(type=RenderPovSettingsLight) bpy.types.World.pov = PointerProperty(type=RenderPovSettingsWorld) - bpy.types.Material.texture_slots = CollectionProperty(type = MaterialTextureSlot) + bpy.types.Material.pov_texture_slots = CollectionProperty(type=MaterialTextureSlot) bpy.types.World.texture_slots = CollectionProperty(type = WorldTextureSlot) bpy.types.Text.pov = PointerProperty(type=RenderPovSettingsText) @@ -4416,7 +4467,8 @@ def unregister(): del bpy.types.Object.pov del bpy.types.Camera.pov del bpy.types.Light.pov - del bpy.types.World.pov + del bpy.types.World.pov + del bpy.types.Material.pov_texture_slots del bpy.types.Text.pov nodeitems_utils.unregister_node_categories("POVRAYNODES") diff --git a/render_povray/ui.py b/render_povray/ui.py index aedccf77..711bc3d4 100644 --- a/render_povray/ui.py +++ b/render_povray/ui.py @@ -1794,6 +1794,27 @@ class TEXTURE_MT_specials(bpy.types.Menu): layout.operator("texture.slot_copy", icon='COPYDOWN') layout.operator("texture.slot_paste", icon='PASTEDOWN') +class TEXTURE_UL_texture_slots(bpy.types.UIList): + COMPAT_ENGINES = {'POVRAY_RENDER'} + def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + ob = data + slot = item + #ma = slot.name + # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code. + if self.layout_type in {'DEFAULT', 'COMPACT'}: + # You should always start your row layout by a label (icon + text), or a non-embossed text field, + # this will also make the row easily selectable in the list! The later also enables ctrl-click rename. + # We use icon_value of label, as our given icon is an integer value, not an enum ID. + # Note "data" names should never be translated! + if slot: + layout.prop(item, "texture", text="", emboss=False, icon='TEXTURE') + else: + layout.label(text="New", translate=False, icon_value=icon) + # 'GRID' layout type should be as compact as possible (typically a single icon!). + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label(text="", icon_value=icon) +''' class MATERIAL_TEXTURE_SLOTS_UL_List(UIList): """Texture Slots UIList.""" @@ -1815,7 +1836,7 @@ class MATERIAL_TEXTURE_SLOTS_UL_List(UIList): elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' layout.label("", icon = custom_icon) - +''' class WORLD_TEXTURE_SLOTS_UL_List(UIList): """Texture Slots UIList.""" @@ -1846,6 +1867,7 @@ class TEXTURE_PT_POV_context_texture(TextureButtonsPanel, Panel): @classmethod def poll(cls, context): engine = context.scene.render.engine + return (engine in cls.COMPAT_ENGINES) # if not (hasattr(context, "texture_slot") or hasattr(context, "texture_node")): # return False return ((context.material or @@ -1860,7 +1882,30 @@ class TEXTURE_PT_POV_context_texture(TextureButtonsPanel, Panel): def draw(self, context): layout = self.layout - + + scene = context.scene + layout.prop(scene, "texture_context", expand=True) + if scene.texture_context == 'MATERIAL': + mat = context.scene.view_layers["View Layer"].objects.active.active_material + row = layout.row() + row.template_list("MATERIAL_TEXTURE_SLOTS_UL_layerlist", "", mat, "pov_texture_slots", mat.pov, "active_texture_index") + col = row.column(align=True) + col.operator("pov.textureslotadd",icon='ADD',text='') + col.operator("pov.textureslotremove",icon='REMOVE',text='') + col.separator() + + if mat.pov_texture_slots: + index = mat.pov.active_texture_index + slot = mat.pov_texture_slots[index] + povtex = slot.name + tex = bpy.data.textures[povtex] + col.prop(tex,'use_fake_user',text = '') + layout.label(text='Find texture:') + layout.prop_search(slot,'texture_search',bpy.data,'textures',text='') + # else: + # for i in range(18): # length of material texture slots + # mat.pov_texture_slots.add() +''' slot = getattr(context, "texture_slot", None) node = getattr(context, "texture_node", None) space = context.space_data @@ -1965,7 +2010,7 @@ class TEXTURE_PT_POV_context_texture(TextureButtonsPanel, Panel): split.prop(slot, "output_node", text="") else: split.label(text="Type:") - +''' class TEXTURE_PT_colors(TextureButtonsPanel, Panel): bl_label = "Colors" bl_options = {'DEFAULT_CLOSED'} @@ -2001,12 +2046,46 @@ class TEXTURE_PT_colors(TextureButtonsPanel, Panel): # Texture Slot Panels # +class POV_OT_texture_slot_add(Operator): + bl_idname = "pov.textureslotadd" + bl_label = "Add" + bl_description = "Add texture_slot" + bl_options = {'REGISTER', 'UNDO'} + COMPAT_ENGINES = {'POVRAY_RENDER'} + + def execute(self,context): + + tex = bpy.data.textures.new(name = 'Texture',type = 'IMAGE') + tex.use_fake_user = True + ob = context.scene.view_layers["View Layer"].objects.active + slot = ob.active_material.pov_texture_slots.add() + slot.name = tex.name + slot.texture = tex.name + + return {'FINISHED'} + + +class POV_OT_texture_slot_remove(Operator): + bl_idname = "pov.textureslotremove" + bl_label = "Remove" + bl_description = "Remove texture_slot" + bl_options = {'REGISTER', 'UNDO'} + COMPAT_ENGINES = {'POVRAY_RENDER'} + + def execute(self,context): + pass + # tex = bpy.data.textures.new() + # tex_slot = context.object.active_material.pov_texture_slots.add() + # tex_slot.name = tex.name + + return {'FINISHED'} + class TextureSlotPanel(TextureButtonsPanel): COMPAT_ENGINES = {'POVRAY_RENDER'} @classmethod def poll(cls, context): - if not hasattr(context, "texture_slot"): + if not hasattr(context, "pov_texture_slot"): return False engine = context.scene.render.engine @@ -2039,7 +2118,7 @@ class TEXTURE_PT_povray_preview(TextureButtonsPanel, Panel): @classmethod def poll(cls, context): engine = context.scene.render.engine - if not hasattr(context, "texture_slot"): + if not hasattr(context, "pov_texture_slot"): return False tex=context.texture mat=context.material @@ -2047,7 +2126,7 @@ class TEXTURE_PT_povray_preview(TextureButtonsPanel, Panel): def draw(self, context): tex = context.texture - slot = getattr(context, "texture_slot", None) + slot = getattr(context, "pov_texture_slot", None) idblock = context_tex_datablock(context) layout = self.layout # if idblock: @@ -2276,7 +2355,7 @@ class TEXTURE_PT_influence(TextureSlotPanel, Panel): if isinstance(idblock, Brush): return False - if not getattr(context, "texture_slot", None): + if not getattr(context, "pov_texture_slot", None): return False engine = context.scene.render.engine @@ -3243,7 +3322,12 @@ classes = ( TEXT_OT_povray_insert, TEXT_MT_insert, TEXT_PT_povray_custom_code, - TEXT_MT_templates_pov + TEXT_MT_templates_pov, + # TEXTURE_PT_context, + #TEXTURE_PT_POV_povray_texture_slots, + TEXTURE_UL_texture_slots, + POV_OT_texture_slot_add, + POV_OT_texture_slot_remove ) |