diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..7bde284 --- /dev/null +++ b/__init__.py @@ -0,0 +1,15 @@ +import bpy +from . import ui +from .core.register import order_classes + +def register(): + print("Registering Avatar Toolkit") + # Order the classes before registration + order_classes() + # Register the UI classes + ui.register() + +def unregister(): + print("Unregistering Avatar Toolkit") + # Unregister the UI classes + ui.unregister() diff --git a/blender_manifest.toml b/blender_manifest.toml new file mode 100644 index 0000000..3187313 --- /dev/null +++ b/blender_manifest.toml @@ -0,0 +1,16 @@ +# blender_manifest.toml + +schema_version = "1.0.0" + +id = "avatar_toolkit" +version = "0.0.1" +name = "Avatar Toolkit" +tagline = "A modern tool for importing and optimizing models for VRChat, Resonite, and other similar games." +maintainer = "Your Name " +type = "add-on" + +blender_version_min = "4.3.0" + +license = [ + "SPDX:GPL-3.0-or-later", +] diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..8f5256c --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,3 @@ +# core/__init__.py + +from .register import register_wrap diff --git a/core/register.py b/core/register.py new file mode 100644 index 0000000..7c532e2 --- /dev/null +++ b/core/register.py @@ -0,0 +1,24 @@ +import bpy +import typing + +# List to store the classes to register +__bl_classes = [] +# List to store the ordered classes for registration +__bl_ordered_classes = [] + +def register_wrap(cls): + # Check if the class has a 'bl_rna' attribute (indicating it's a Blender class) + if hasattr(cls, 'bl_rna'): + # Add the class to the list of classes to register + __bl_classes.append(cls) + return cls + +def order_classes(): + global __bl_ordered_classes + # Create a copy of the classes list to store the ordered classes + __bl_ordered_classes = __bl_classes.copy() + +def iter_classes_to_register(): + # Iterate over the ordered classes and yield each class for registration + for cls in __bl_ordered_classes: + yield cls diff --git a/ui/__init__.py b/ui/__init__.py new file mode 100644 index 0000000..592220a --- /dev/null +++ b/ui/__init__.py @@ -0,0 +1,23 @@ +if "bpy" not in locals(): + import bpy + from . import panel, quick_access, optimization +else: + import importlib + # Reload the modules to reflect changes during development + importlib.reload(panel) + importlib.reload(quick_access) + importlib.reload(optimization) + +def register(): + print("UI register called") + from ..core.register import iter_classes_to_register + # Iterate over the classes to register and register them + for cls in iter_classes_to_register(): + bpy.utils.register_class(cls) + +def unregister(): + print("UI unregister called") + from ..core.register import iter_classes_to_register + # Iterate over the classes to unregister in reverse order and unregister them + for cls in reversed(list(iter_classes_to_register())): + bpy.utils.unregister_class(cls) diff --git a/ui/optimization.py b/ui/optimization.py new file mode 100644 index 0000000..d695505 --- /dev/null +++ b/ui/optimization.py @@ -0,0 +1,16 @@ +import bpy +from ..core.register import register_wrap + +@register_wrap +class AvatarToolkitOptimizationPanel(bpy.types.Panel): + bl_label = "Optimization" + bl_idname = "OBJECT_PT_avatar_toolkit_optimization" + bl_space_type = 'VIEW_3D' + bl_region_type = 'UI' + bl_category = "Avatar Toolkit" + bl_parent_id = "OBJECT_PT_avatar_toolkit" + + def draw(self, context): + layout = self.layout + layout.label(text="Optimization Options") + # Add optimization options here diff --git a/ui/panel.py b/ui/panel.py new file mode 100644 index 0000000..c83fb44 --- /dev/null +++ b/ui/panel.py @@ -0,0 +1,15 @@ +import bpy +from ..core.register import register_wrap + +@register_wrap +class AvatarToolkitPanel(bpy.types.Panel): + bl_label = "Avatar Toolkit" + bl_idname = "OBJECT_PT_avatar_toolkit" + bl_space_type = 'VIEW_3D' + bl_region_type = 'UI' + bl_category = "Avatar Toolkit" + + def draw(self, context): + layout = self.layout + layout.label(text="Welcome to Avatar Toolkit!") + print("Avatar Toolkit Panel is being drawn") diff --git a/ui/quick_access.py b/ui/quick_access.py new file mode 100644 index 0000000..ff627d1 --- /dev/null +++ b/ui/quick_access.py @@ -0,0 +1,16 @@ +import bpy +from ..core.register import register_wrap + +@register_wrap +class AvatarToolkitQuickAccessPanel(bpy.types.Panel): + bl_label = "Quick Access" + bl_idname = "OBJECT_PT_avatar_toolkit_quick_access" + bl_space_type = 'VIEW_3D' + bl_region_type = 'UI' + bl_category = "Avatar Toolkit" + bl_parent_id = "OBJECT_PT_avatar_toolkit" + + def draw(self, context): + layout = self.layout + layout.label(text="Quick Access Options") + # Add quick access options here