# 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 . import bpy from .base import PlasmaModifierProperties from .anim import * from .avatar import * from .gui import * from .logic import * from .physics import * from .region import * from .render import * from .sound import * from .water import * class PlasmaModifiers(bpy.types.PropertyGroup): def determine_next_id(self): """Gets the ID for the next modifier in the UI""" # This is NOT a property, otherwise the modifiers property would access this... # Which acesses the modifiers property... INFINITE RECURSION! :D ids = [mod.display_order for mod in self.modifiers] if ids: return max(ids) + 1 else: return 0 @property def modifiers(self): """Generates all of the enabled modifiers. NOTE: We do not promise to return modifiers in their display_order! """ for i in dir(self): attr = getattr(self, i, None) # Assumes each modifier is a single pointer to PlasmaModifierProperties if isinstance(attr, PlasmaModifierProperties): if attr.enabled: yield attr @classmethod def register(cls): # Okay, so we have N plasma modifer property groups... # Rather than have (dis)organized chaos on the Blender Object, we will collect all of the # property groups of type PlasmaModifierProperties and generate on-the-fly a PlasmaModifier # property group to rule them all. The class attribute 'pl_id' will determine the name of # the property group in PlasmaModifiers. # Also, just to spite us, Blender doesn't seem to handle PropertyGroup inheritance... at all. # So, we're going to have to create our base properties on all of the PropertyGroups. # It's times like these that make me wonder about life... # Enjoy! for i in PlasmaModifierProperties.__subclasses__(): for name, (prop, kwargs) in PlasmaModifierProperties._subprops.items(): setattr(i, name, prop(**kwargs)) setattr(cls, i.pl_id, bpy.props.PointerProperty(type=i)) bpy.types.Object.plasma_modifiers = bpy.props.PointerProperty(type=cls) def test_property(self, property : str) -> bool: """Tests a property on all enabled Plasma modifiers""" return any((getattr(i, property) for i in self.modifiers)) class PlasmaModifierSpec(bpy.types.PropertyGroup): pass def modifier_mapping(): """This returns a dict mapping Plasma Modifier categories to names""" d = {} sorted_modifiers = sorted(PlasmaModifierProperties.__subclasses__(), key=lambda x: x.bl_label) for i, mod in enumerate(sorted_modifiers): pl_id, category, label, description = mod.pl_id, mod.bl_category, mod.bl_label, mod.bl_description icon = getattr(mod, "bl_icon", "") # The modifier might include the cateogry name in its name, so we'll strip that. if label != category: if label.startswith(category): label = label[len(category)+1:] if label.endswith(category): label = label[:-len(category)-1] tup = (pl_id, label, description, icon, i) d_cat = d.setdefault(category, []) d_cat.append(tup) return d