mirror of https://github.com/H-uru/korman.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
5.6 KiB
104 lines
5.6 KiB
# This file is part of Korman. |
|
# |
|
# Korman 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 3 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# Korman 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 Korman. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
import bpy |
|
|
|
from . import modifiers as modifier_draw |
|
|
|
class ModifierButtonsPanel: |
|
bl_space_type = "PROPERTIES" |
|
bl_region_type = "WINDOW" |
|
|
|
# Let me take this opportunity to rant. |
|
# For some STUPID REASON, Blender decides which buttons to show in the C code. This is all well |
|
# and good, EXCEPT THEY DO NOT SHOW THE MODIFIERS BUTTON FOR EMPTIES. This totally breaks the |
|
# Plasma Modifier workflow. As a shim workaround, we're overtaking the physics panel as our |
|
# Plasma Modifier Panel. The Physics, Object, and Constraint Panels' visibility determined by |
|
# the same block of a switch statement in Blender 2.71 (buttons_context_path in buttons_context.c) |
|
bl_context = "physics" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return context.object and context.scene.render.engine == "PLASMA_GAME" |
|
|
|
|
|
class PlasmaModifiersPanel(ModifierButtonsPanel, bpy.types.Panel): |
|
bl_label = "Plasma Modifiers" |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
obj = context.object |
|
|
|
# So, I had to read the doggone Blender source code to figure out how to use this because the |
|
# "documentation" only gives this helpful information about this interesting feature: "operator_menu_enum" |
|
# Bah. For the record: first param is the operator, second is an EnumProperty on that operator. |
|
# You define categories by inserting an enum item with an empty key, empty description, and just a name. |
|
# Any items following that are members of that category, of course... |
|
# ... I hope that my rambling has helped somebody understand more about the undocumented mess |
|
# that is Blender Python. |
|
row = layout.row(align=True) |
|
row.operator_menu_enum("object.plasma_modifier_add", "types") |
|
row.menu("PlasmaModifiersSpecialMenu", icon="DOWNARROW_HLT", text="") |
|
|
|
# First, let's sort the list of modifiers based on their display order |
|
# We don't do this sort in the property itself because this is really just a UI hint. |
|
modifiers = sorted(obj.plasma_modifiers.modifiers, key=lambda x: x.display_order) |
|
|
|
# Inside the modifier_draw module, we have draw callbables for each modifier |
|
# We'll loop through the list of active modifiers and call the drawprocs for the enabled mods |
|
for i in modifiers: |
|
modLayout = self._draw_modifier_template(i) |
|
if i.show_expanded: |
|
getattr(modifier_draw, i.pl_id)(i, modLayout, context) |
|
|
|
def _draw_modifier_template(self, modifier): |
|
"""This draws our lookalike modifier template and returns a UILayout object for each modifier |
|
to consume in order to draw its specific properties""" |
|
layout = self.layout.box() |
|
|
|
# This is the main title row. It mimics the Blender template_modifier, which (unfortunately) |
|
# requires valid Blender Modifier data. It would be nice if the Blender UI code were consistently |
|
# C or Python and not a frankenstein mix. I would probably prefer working in C, just because |
|
# the compiler saves my neck 99.9% of the time...</rant> |
|
row = layout.row(align=True) |
|
exicon = "TRIA_DOWN" if modifier.show_expanded else "TRIA_RIGHT" |
|
row.prop(modifier, "show_expanded", text="", icon=exicon, emboss=False) |
|
row.label(text=modifier.bl_label, icon=getattr(modifier, "bl_icon", "NONE")) |
|
|
|
row.operator("object.plasma_modifier_move_up", text="", icon="TRIA_UP").active_modifier = modifier.display_order |
|
row.operator("object.plasma_modifier_move_down", text="", icon="TRIA_DOWN").active_modifier = modifier.display_order |
|
row.operator("object.plasma_modifier_copy", text="", icon="COPYDOWN").active_modifier = modifier.display_order |
|
row.operator("object.plasma_modifier_reset", text="", icon="FILE_REFRESH").active_modifier = modifier.display_order |
|
row.operator("object.plasma_modifier_remove", text="", icon="X").active_modifier = modifier.display_order |
|
|
|
# Now we return the modifier box, which is populated with the modifier specific properties |
|
# by whatever insanity is in the modifier module. modifier modifier modifier... |
|
# MODDDDDDDDIFIIIIEEEERRRRRRRR!!! |
|
return layout |
|
|
|
|
|
class PlasmaModifiersSpecialMenu(ModifierButtonsPanel, bpy.types.Menu): |
|
bl_label = "Plasma Modifier Specials" |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
layout.operator("object.plasma_modifier_copy_to_selection", icon="PASTEDOWN") |
|
layout.separator() |
|
layout.operator("object.plasma_modifier_copy", icon="COPYDOWN", text="Copy Modifiers").active_modifier = -1 |
|
layout.operator("object.plasma_modifier_paste", icon="PASTEDOWN", text="Paste Modifier(s)") |
|
layout.separator() |
|
layout.operator("object.plasma_modifier_reset", text="Reset Modifiers", icon="FILE_REFRESH").active_modifier = -1 |
|
layout.operator("object.plasma_modifier_remove", text="Remove Modifiers", icon="X").active_modifier = -1
|
|
|