mirror of
https://github.com/blender/blender-addons.git
synced 2025-08-20 12:21:31 +00:00
155 lines
5.3 KiB
Python
155 lines
5.3 KiB
Python
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
"""
|
|
Object / Material Indices Panel
|
|
|
|
When working with ID Masks in the Nodes Editor, is hard to follow track
|
|
of which objects/materials have which ID.
|
|
This adds a panel on the sidebar when an ID Mask node is selected.
|
|
The active object is highlighted between [square brackets] On the Nodes
|
|
Editor's sidebar, when an ID Mask node is selected.
|
|
"""
|
|
|
|
import bpy
|
|
|
|
|
|
class AMTH_NODE_PT_indices(bpy.types.Panel):
|
|
bl_space_type = "NODE_EDITOR"
|
|
bl_region_type = "UI"
|
|
bl_label = "Object / Material Indices"
|
|
bl_options = {"DEFAULT_CLOSED"}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
node = context.active_node
|
|
return node and node.type == "ID_MASK"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
objects = bpy.data.objects
|
|
materials = bpy.data.materials
|
|
node = context.active_node
|
|
|
|
show_ob_id = False
|
|
show_ma_id = False
|
|
matching_ids = False
|
|
|
|
if context.active_object:
|
|
ob_act = context.active_object
|
|
else:
|
|
ob_act = False
|
|
|
|
for ob in objects:
|
|
if ob and ob.pass_index > 0:
|
|
show_ob_id = True
|
|
for ma in materials:
|
|
if ma and ma.pass_index > 0:
|
|
show_ma_id = True
|
|
row = layout.row(align=True)
|
|
row.prop(node, "index", text="Mask Index")
|
|
row.prop(node, "use_matching_indices", text="Only Matching IDs")
|
|
|
|
layout.separator()
|
|
|
|
if not show_ob_id and not show_ma_id:
|
|
layout.label(
|
|
text="No objects or materials indices so far.", icon="INFO")
|
|
|
|
if show_ob_id:
|
|
split = layout.split()
|
|
col = split.column()
|
|
col.label(text="Object Name")
|
|
split.label(text="ID Number")
|
|
row = layout.row()
|
|
for ob in objects:
|
|
icon = "OUTLINER_DATA_" + ob.type
|
|
if ob.library:
|
|
icon = "LIBRARY_DATA_DIRECT"
|
|
elif ob.is_library_indirect:
|
|
icon = "LIBRARY_DATA_INDIRECT"
|
|
|
|
if ob and node.use_matching_indices \
|
|
and ob.pass_index == node.index \
|
|
and ob.pass_index != 0:
|
|
matching_ids = True
|
|
row.label(
|
|
text="[{}]".format(ob.name)
|
|
if ob_act and ob.name == ob_act.name else ob.name,
|
|
icon=icon)
|
|
row.label(text="%s" % ob.pass_index)
|
|
row = layout.row()
|
|
|
|
elif ob and not node.use_matching_indices \
|
|
and ob.pass_index > 0:
|
|
|
|
matching_ids = True
|
|
row.label(
|
|
text="[{}]".format(ob.name)
|
|
if ob_act and ob.name == ob_act.name else ob.name,
|
|
icon=icon)
|
|
row.label(text="%s" % ob.pass_index)
|
|
row = layout.row()
|
|
|
|
if node.use_matching_indices and not matching_ids:
|
|
row.label(text="No objects with ID %s" %
|
|
node.index, icon="INFO")
|
|
|
|
layout.separator()
|
|
|
|
if show_ma_id:
|
|
split = layout.split()
|
|
col = split.column()
|
|
col.label(text="Material Name")
|
|
split.label(text="ID Number")
|
|
row = layout.row()
|
|
|
|
for ma in materials:
|
|
icon = "BLANK1"
|
|
if ma.use_nodes:
|
|
icon = "NODETREE"
|
|
elif ma.library:
|
|
icon = "LIBRARY_DATA_DIRECT"
|
|
if ma.is_library_indirect:
|
|
icon = "LIBRARY_DATA_INDIRECT"
|
|
|
|
if ma and node.use_matching_indices \
|
|
and ma.pass_index == node.index \
|
|
and ma.pass_index != 0:
|
|
matching_ids = True
|
|
row.label(text="%s" % ma.name, icon=icon)
|
|
row.label(text="%s" % ma.pass_index)
|
|
row = layout.row()
|
|
|
|
elif ma and not node.use_matching_indices \
|
|
and ma.pass_index > 0:
|
|
|
|
matching_ids = True
|
|
row.label(text="%s" % ma.name, icon=icon)
|
|
row.label(text="%s" % ma.pass_index)
|
|
row = layout.row()
|
|
|
|
if node.use_matching_indices and not matching_ids:
|
|
row.label(text="No materials with ID %s" %
|
|
node.index, icon="INFO")
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_class(AMTH_NODE_PT_indices)
|
|
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_class(AMTH_NODE_PT_indices)
|