Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'space_view3d_brush_menus/texture_menu.py')
-rw-r--r--space_view3d_brush_menus/texture_menu.py344
1 files changed, 197 insertions, 147 deletions
diff --git a/space_view3d_brush_menus/texture_menu.py b/space_view3d_brush_menus/texture_menu.py
index 1f44bc8f..d961410b 100644
--- a/space_view3d_brush_menus/texture_menu.py
+++ b/space_view3d_brush_menus/texture_menu.py
@@ -1,87 +1,98 @@
-from bpy.props import *
-from .Utils.core import *
+# gpl author: Ryan Inch (Imaginer)
+import bpy
+from bpy.types import Menu
+from . import utils_core
-class TextureMenu(bpy.types.Menu):
+
+class TextureMenu(Menu):
bl_label = "Texture Options"
bl_idname = "VIEW3D_MT_sv3_texture_menu"
@classmethod
def poll(self, context):
- if get_mode() in [sculpt, vertex_paint, texture_paint]:
- return True
- else:
- return False
+ return utils_core.get_mode() in (
+ utils_core.sculpt,
+ utils_core.vertex_paint,
+ utils_core.texture_paint
+ )
def draw(self, context):
- menu = Menu(self)
+ menu = utils_core.Menu(self)
- if get_mode() == sculpt:
+ if utils_core.get_mode() == utils_core.sculpt:
self.sculpt(menu, context)
- elif get_mode() == vertex_paint:
+ elif utils_core.get_mode() == utils_core.vertex_paint:
self.vertpaint(menu, context)
else:
self.texpaint(menu, context)
def sculpt(self, menu, context):
- tex_slot = context.tool_settings.sculpt.brush.texture_slot
-
+ has_brush = utils_core.get_brush_link(context, types="brush")
+ tex_slot = has_brush.texture_slot if has_brush else None
+
# Menus
menu.add_item().menu(Textures.bl_idname)
menu.add_item().menu(TextureMapMode.bl_idname)
+ menu.add_item().separator()
# Checkboxes
- if tex_slot.map_mode != '3D':
- if tex_slot.map_mode in ['RANDOM', 'VIEW_PLANE', 'AREA_PLANE']:
- if bpy.app.version >= (2, 75):
+ if tex_slot:
+ if tex_slot.map_mode != '3D':
+ if tex_slot.map_mode in ['RANDOM', 'VIEW_PLANE', 'AREA_PLANE']:
menu.add_item().prop(tex_slot, "use_rake", toggle=True)
menu.add_item().prop(tex_slot, "use_random", toggle=True)
- else:
- menu.add_item().menu(TextureAngleSource.bl_idname)
- # Sliders
- menu.add_item().prop(tex_slot, "angle", text=PIW+"Angle", slider=True)
-
- if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE'] and tex_slot.use_random:
- menu.add_item().prop(tex_slot, "random_angle", text=PIW+"Random Angle", slider=True)
-
- # Operator
- if tex_slot.tex_paint_map_mode == 'STENCIL':
- menu.add_item().operator("brush.stencil_reset_transform")
+ # Sliders
+ menu.add_item().prop(tex_slot, "angle",
+ text=utils_core.PIW + "Angle", slider=True)
+
+ if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE'] and tex_slot.use_random:
+ menu.add_item().prop(tex_slot, "random_angle",
+ text=utils_core.PIW + "Random Angle", slider=True)
+
+ # Operator
+ if tex_slot.tex_paint_map_mode == 'STENCIL':
+ menu.add_item().operator("brush.stencil_reset_transform")
+ else:
+ menu.add_item().label("No Texture Slot available", icon="INFO")
def vertpaint(self, menu, context):
- tex_slot = context.tool_settings.vertex_paint.brush.texture_slot
-
+ has_brush = utils_core.get_brush_link(context, types="brush")
+ tex_slot = has_brush.texture_slot if has_brush else None
+
# Menus
menu.add_item().menu(Textures.bl_idname)
menu.add_item().menu(TextureMapMode.bl_idname)
# Checkboxes
- if tex_slot.tex_paint_map_mode != '3D':
+ if tex_slot and tex_slot.tex_paint_map_mode != '3D':
if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE']:
- if bpy.app.version >= (2, 75):
- menu.add_item().prop(tex_slot, "use_rake", toggle=True)
- menu.add_item().prop(tex_slot, "use_random", toggle=True)
- else:
- menu.add_item().menu(TextureAngleSource.bl_idname)
+ menu.add_item().prop(tex_slot, "use_rake", toggle=True)
+ menu.add_item().prop(tex_slot, "use_random", toggle=True)
# Sliders
- menu.add_item().prop(tex_slot, "angle", text=PIW+"Angle", slider=True)
-
+ menu.add_item().prop(tex_slot, "angle",
+ text=utils_core.PIW + "Angle", slider=True)
+
if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE'] and tex_slot.use_random:
- menu.add_item().prop(tex_slot, "random_angle", text=PIW+"Random Angle", slider=True)
-
+ menu.add_item().prop(tex_slot, "random_angle",
+ text=utils_core.PIW + "Random Angle", slider=True)
+
# Operator
if tex_slot.tex_paint_map_mode == 'STENCIL':
menu.add_item().operator("brush.stencil_reset_transform")
+ else:
+ menu.add_item().label("No Texture Slot available", icon="INFO")
def texpaint(self, menu, context):
- tex_slot = context.tool_settings.image_paint.brush.texture_slot
- mask_tex_slot = context.tool_settings.image_paint.brush.mask_texture_slot
-
+ has_brush = utils_core.get_brush_link(context, types="brush")
+ tex_slot = has_brush.texture_slot if has_brush else None
+ mask_tex_slot = has_brush.mask_texture_slot if has_brush else None
+
# Texture Section
menu.add_item().label(text="Texture", icon='TEXTURE')
@@ -90,20 +101,19 @@ class TextureMenu(bpy.types.Menu):
menu.add_item().menu(TextureMapMode.bl_idname)
# Checkboxes
- if tex_slot.tex_paint_map_mode != '3D':
+ if tex_slot and tex_slot.tex_paint_map_mode != '3D':
if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE']:
- if bpy.app.version >= (2, 75):
- menu.add_item().prop(tex_slot, "use_rake", toggle=True)
- menu.add_item().prop(tex_slot, "use_random", toggle=True)
- else:
- menu.add_item().menu(TextureAngleSource.bl_idname)
+ menu.add_item().prop(tex_slot, "use_rake", toggle=True)
+ menu.add_item().prop(tex_slot, "use_random", toggle=True)
# Sliders
- menu.add_item().prop(tex_slot, "angle", text=PIW+"Angle", slider=True)
+ menu.add_item().prop(tex_slot, "angle",
+ text=utils_core.PIW + "Angle", slider=True)
if tex_slot.tex_paint_map_mode in ['RANDOM', 'VIEW_PLANE'] and tex_slot.use_random:
- menu.add_item().prop(tex_slot, "random_angle", text=PIW+"Random Angle", slider=True)
-
+ menu.add_item().prop(tex_slot, "random_angle",
+ text=utils_core.PIW + "Random Angle", slider=True)
+
# Operator
if tex_slot.tex_paint_map_mode == 'STENCIL':
menu.add_item().operator("brush.stencil_reset_transform")
@@ -118,37 +128,40 @@ class TextureMenu(bpy.types.Menu):
menu.add_item().menu(MaskMapMode.bl_idname)
# Checkboxes
- if mask_tex_slot.mask_map_mode in ['RANDOM', 'VIEW_PLANE']:
- if bpy.app.version >= (2, 75):
+ if mask_tex_slot:
+ if mask_tex_slot.mask_map_mode in ['RANDOM', 'VIEW_PLANE']:
menu.add_item().prop(mask_tex_slot, "use_rake", toggle=True)
menu.add_item().prop(mask_tex_slot, "use_random", toggle=True)
- else:
- menu.add_item().menu(TextureAngleSource.bl_idname)
- # Sliders
- menu.add_item().prop(mask_tex_slot, "angle", text=PIW+"Angle", icon_value=5, slider=True)
+ # Sliders
+ menu.add_item().prop(mask_tex_slot, "angle",
+ text=utils_core.PIW + "Angle", icon_value=5, slider=True)
- if mask_tex_slot.mask_map_mode in ['RANDOM', 'VIEW_PLANE'] and mask_tex_slot.use_random:
- menu.add_item().prop(mask_tex_slot, "random_angle", text=PIW+"Random Angle", slider=True)
-
- # Operator
- if mask_tex_slot.mask_map_mode == 'STENCIL':
- prop = menu.add_item().operator("brush.stencil_reset_transform")
- prop.mask = True
+ if mask_tex_slot.mask_map_mode in ['RANDOM', 'VIEW_PLANE'] and \
+ mask_tex_slot.use_random:
+ menu.add_item().prop(mask_tex_slot, "random_angle",
+ text=utils_core.PIW + "Random Angle", slider=True)
+ # Operator
+ if mask_tex_slot.mask_map_mode == 'STENCIL':
+ prop = menu.add_item().operator("brush.stencil_reset_transform")
+ prop.mask = True
+ else:
+ menu.add_item().label("Mask Texture not available", icon="INFO")
-class Textures(bpy.types.Menu):
+
+class Textures(Menu):
bl_label = "Brush Texture"
bl_idname = "VIEW3D_MT_sv3_texture_list"
def init(self):
- if get_mode() == sculpt:
+ if utils_core.get_mode() == utils_core.sculpt:
datapath = "tool_settings.sculpt.brush.texture"
- elif get_mode() == vertex_paint:
+ elif utils_core.get_mode() == utils_core.vertex_paint:
datapath = "tool_settings.vertex_paint.brush.texture"
- elif get_mode() == texture_paint:
+ elif utils_core.get_mode() == utils_core.texture_paint:
datapath = "tool_settings.image_paint.brush.texture"
else:
@@ -158,8 +171,10 @@ class Textures(bpy.types.Menu):
def draw(self, context):
datapath = self.init()
- current_texture = eval("bpy.context.{}".format(datapath))
- menu = Menu(self)
+ has_brush = utils_core.get_brush_link(context, types="brush")
+ current_texture = eval("bpy.context.{}".format(datapath)) if \
+ has_brush else None
+ menu = utils_core.Menu(self)
# get the current texture's name
if current_texture:
@@ -169,7 +184,7 @@ class Textures(bpy.types.Menu):
menu.add_item().separator()
# add an item to set the texture to None
- menuprop(menu.add_item(), "None", "None",
+ utils_core.menuprop(menu.add_item(), "None", "None",
datapath, icon='RADIOBUT_OFF', disable=True,
disable_icon='RADIOBUT_ON',
custom_disable_exp=[None, current_texture],
@@ -177,7 +192,7 @@ class Textures(bpy.types.Menu):
# add the menu items
for item in bpy.data.textures:
- menuprop(menu.add_item(), item.name,
+ utils_core.menuprop(menu.add_item(), item.name,
'bpy.data.textures["%s"]' % item.name,
datapath, icon='RADIOBUT_OFF',
disable=True,
@@ -186,121 +201,156 @@ class Textures(bpy.types.Menu):
path=True)
-class TextureMapMode(bpy.types.Menu):
+class TextureMapMode(Menu):
bl_label = "Brush Mapping"
bl_idname = "VIEW3D_MT_sv3_texture_map_mode"
def draw(self, context):
- menu = Menu(self)
+ menu = utils_core.Menu(self)
+ has_brush = utils_core.get_brush_link(context, types="brush")
menu.add_item().label(text="Brush Mapping")
menu.add_item().separator()
- if get_mode() == sculpt:
- path = "tool_settings.sculpt.brush.texture_slot.map_mode"
-
- # add the menu items
- for item in context.tool_settings.sculpt.brush.texture_slot.bl_rna.properties['map_mode'].enum_items:
- menuprop(menu.add_item(), item.name, item.identifier, path,
- icon='RADIOBUT_OFF',
- disable=True,
- disable_icon='RADIOBUT_ON')
-
- elif get_mode() == vertex_paint:
- path = "tool_settings.vertex_paint.brush.texture_slot.tex_paint_map_mode"
-
- # add the menu items
- for item in context.tool_settings.vertex_paint.brush.texture_slot.bl_rna.properties['tex_paint_map_mode'].enum_items:
- menuprop(menu.add_item(), item.name, item.identifier, path,
- icon='RADIOBUT_OFF',
- disable=True,
- disable_icon='RADIOBUT_ON')
-
+ if has_brush:
+ if utils_core.get_mode() == utils_core.sculpt:
+ path = "tool_settings.sculpt.brush.texture_slot.map_mode"
+
+ # add the menu items
+ for item in has_brush. \
+ texture_slot.bl_rna.properties['map_mode'].enum_items:
+ utils_core.menuprop(
+ menu.add_item(), item.name, item.identifier, path,
+ icon='RADIOBUT_OFF',
+ disable=True,
+ disable_icon='RADIOBUT_ON'
+ )
+ elif utils_core.get_mode() == utils_core.vertex_paint:
+ path = "tool_settings.vertex_paint.brush.texture_slot.tex_paint_map_mode"
+
+ # add the menu items
+ for item in has_brush. \
+ texture_slot.bl_rna.properties['tex_paint_map_mode'].enum_items:
+ utils_core.menuprop(
+ menu.add_item(), item.name, item.identifier, path,
+ icon='RADIOBUT_OFF',
+ disable=True,
+ disable_icon='RADIOBUT_ON'
+ )
+ else:
+ path = "tool_settings.image_paint.brush.texture_slot.tex_paint_map_mode"
+
+ # add the menu items
+ for item in has_brush. \
+ texture_slot.bl_rna.properties['tex_paint_map_mode'].enum_items:
+ utils_core.menuprop(
+ menu.add_item(), item.name, item.identifier, path,
+ icon='RADIOBUT_OFF',
+ disable=True,
+ disable_icon='RADIOBUT_ON'
+ )
else:
- path = "tool_settings.image_paint.brush.texture_slot.tex_paint_map_mode"
-
- # add the menu items
- for item in context.tool_settings.image_paint.brush.texture_slot.bl_rna.properties['tex_paint_map_mode'].enum_items:
- menuprop(menu.add_item(), item.name, item.identifier, path,
- icon='RADIOBUT_OFF',
- disable=True,
- disable_icon='RADIOBUT_ON')
+ menu.add_item().label("No brushes available", icon="INFO")
-class MaskTextures(bpy.types.Menu):
+class MaskTextures(Menu):
bl_label = "Mask Texture"
bl_idname = "VIEW3D_MT_sv3_mask_texture_list"
def draw(self, context):
- menu = Menu(self)
+ menu = utils_core.Menu(self)
datapath = "tool_settings.image_paint.brush.mask_texture"
- current_texture = eval("bpy.context.{}".format(datapath))
+ has_brush = utils_core.get_brush_link(context, types="brush")
+ current_texture = eval("bpy.context.{}".format(datapath)) if \
+ has_brush else None
menu.add_item().label(text="Mask Texture")
menu.add_item().separator()
- # get the current texture's name
- if current_texture:
- current_texture = current_texture.name
+ if has_brush:
+ # get the current texture's name
+ if current_texture:
+ current_texture = current_texture.name
- # add an item to set the texture to None
- menuprop(menu.add_item(), "None", "None",
- datapath, icon='RADIOBUT_OFF', disable=True,
- disable_icon='RADIOBUT_ON',
- custom_disable_exp=[None, current_texture],
- path=True)
+ # add an item to set the texture to None
+ utils_core.menuprop(
+ menu.add_item(), "None", "None",
+ datapath, icon='RADIOBUT_OFF', disable=True,
+ disable_icon='RADIOBUT_ON',
+ custom_disable_exp=[None, current_texture],
+ path=True
+ )
- # add the menu items
- for item in bpy.data.textures:
- menuprop(menu.add_item(), item.name, 'bpy.data.textures["%s"]' % item.name,
- datapath, icon='RADIOBUT_OFF', disable=True,
- disable_icon='RADIOBUT_ON',
- custom_disable_exp=[item.name, current_texture],
- path=True)
+ # add the menu items
+ for item in bpy.data.textures:
+ utils_core.menuprop(
+ menu.add_item(), item.name, 'bpy.data.textures["%s"]' % item.name,
+ datapath, icon='RADIOBUT_OFF', disable=True,
+ disable_icon='RADIOBUT_ON',
+ custom_disable_exp=[item.name, current_texture],
+ path=True
+ )
+ else:
+ menu.add_item().label("No brushes available", icon="INFO")
-class MaskMapMode(bpy.types.Menu):
+class MaskMapMode(Menu):
bl_label = "Mask Mapping"
bl_idname = "VIEW3D_MT_sv3_mask_map_mode"
def draw(self, context):
- menu = Menu(self)
-
+ menu = utils_core.Menu(self)
path = "tool_settings.image_paint.brush.mask_texture_slot.mask_map_mode"
+ has_brush = utils_core.get_brush_link(context, types="brush")
menu.add_item().label(text="Mask Mapping")
menu.add_item().separator()
-
- # add the menu items
- for item in context.tool_settings.image_paint.brush.mask_texture_slot.bl_rna.properties['mask_map_mode'].enum_items:
- menuprop(menu.add_item(), item.name, item.identifier, path,
- icon='RADIOBUT_OFF',
- disable=True,
- disable_icon='RADIOBUT_ON')
+ if has_brush:
+ items = has_brush. \
+ mask_texture_slot.bl_rna.properties['mask_map_mode'].enum_items
+ # add the menu items
+ for item in items:
+ utils_core.menuprop(
+ menu.add_item(), item.name, item.identifier, path,
+ icon='RADIOBUT_OFF',
+ disable=True,
+ disable_icon='RADIOBUT_ON'
+ )
+ else:
+ menu.add_item().label("No brushes available", icon="INFO")
-class TextureAngleSource(bpy.types.Menu):
+class TextureAngleSource(Menu):
bl_label = "Texture Angle Source"
bl_idname = "VIEW3D_MT_sv3_texture_angle_source"
def draw(self, context):
- menu = Menu(self)
+ menu = utils_core.Menu(self)
+ has_brush = utils_core.get_brush_link(context, types="brush")
- if get_mode() == sculpt:
- items = context.tool_settings.sculpt.brush.bl_rna.properties['texture_angle_source_random'].enum_items
- path = "tool_settings.sculpt.brush.texture_angle_source_random"
+ if has_brush:
+ if utils_core.get_mode() == utils_core.sculpt:
+ items = has_brush. \
+ bl_rna.properties['texture_angle_source_random'].enum_items
+ path = "tool_settings.sculpt.brush.texture_angle_source_random"
- elif get_mode() == vertex_paint:
- items = context.tool_settings.vertex_paint.brush.bl_rna.properties['texture_angle_source_random'].enum_items
- path = "tool_settings.vertex_paint.brush.texture_angle_source_random"
+ elif utils_core.get_mode() == utils_core.vertex_paint:
+ items = has_brush. \
+ bl_rna.properties['texture_angle_source_random'].enum_items
+ path = "tool_settings.vertex_paint.brush.texture_angle_source_random"
- else:
- items = context.tool_settings.image_paint.brush.bl_rna.properties['texture_angle_source_random'].enum_items
- path = "tool_settings.image_paint.brush.texture_angle_source_random"
+ else:
+ items = has_brush. \
+ bl_rna.properties['texture_angle_source_random'].enum_items
+ path = "tool_settings.image_paint.brush.texture_angle_source_random"
- # add the menu items
- for item in items:
- menuprop(menu.add_item(), item[0], item[1], path,
- icon='RADIOBUT_OFF',
- disable=True,
- disable_icon='RADIOBUT_ON')
+ # add the menu items
+ for item in items:
+ utils_core.menuprop(
+ menu.add_item(), item[0], item[1], path,
+ icon='RADIOBUT_OFF',
+ disable=True,
+ disable_icon='RADIOBUT_ON'
+ )
+ else:
+ menu.add_item().label("No brushes available", icon="INFO")