Files
blender-vrm/registration.py
小煜 d70b36fd75 feat(body_mesh): Add body mesh separator module with edge dissolution
- Add body_mesh submodule with VRM_OT_separate_non_skin_faces operator
- Add VRM_PT_body_mesh_separator panel for UI integration
- Add utility functions for mesh operations and edge dissolution logic
- Add comprehensive edge dissolution configuration files for all body parts (head, torso, arms, legs, hands) with UV coordinates
- Add test utilities for validating mesh separation operations
- Add .gitignore to exclude Python cache files and test artifacts
- Register body_mesh module in editor package initialization
- Update registration.py to include new body mesh components
2026-01-01 22:20:31 +08:00

606 lines
29 KiB
Python

# SPDX-License-Identifier: MIT OR GPL-3.0-or-later
# SPDX-FileCopyrightText: 2018 iCyP
import os
from typing import Union
import bpy
from bpy.app.handlers import persistent
from bpy.props import PointerProperty
from bpy.types import (
AddonPreferences,
Armature,
Bone,
Header,
KeyingSetInfo,
Material,
Menu,
NodeTree,
Object,
Operator,
Panel,
PropertyGroup,
RenderEngine,
Scene,
TOPBAR_MT_file_export,
TOPBAR_MT_file_import,
UIList,
VIEW3D_MT_armature_add,
)
from .common import error_dialog, preferences, scene_watcher, shader
from .common.debug import cleanse_modules
from .common.logger import get_logger
from .common.version import trigger_clear_addon_version_cache
from .editor import (
extension,
handler,
make_armature,
migration,
ops,
panel,
property_group,
subscription,
validation,
)
from .editor.body_mesh import ops as body_mesh_ops
from .editor.body_mesh import panel as body_mesh_panel
from .editor.mtoon1 import handler as mtoon1_handler
from .editor.mtoon1 import ops as mtoon1_ops
from .editor.mtoon1 import panel as mtoon1_panel
from .editor.mtoon1 import property_group as mtoon1_property_group
from .editor.node_constraint1 import panel as node_constraint1_panel
from .editor.node_constraint1 import property_group as node_constraint1_property_group
from .editor.spring_bone1 import handler as spring_bone1_handler
from .editor.spring_bone1 import ops as spring_bone1_ops
from .editor.spring_bone1 import panel as spring_bone1_panel
from .editor.spring_bone1 import property_group as spring_bone1_property_group
from .editor.spring_bone1 import ui_list as spring_bone1_ui_list
from .editor.vrm0 import handler as vrm0_handler
from .editor.vrm0 import menu as vrm0_menu
from .editor.vrm0 import ops as vrm0_ops
from .editor.vrm0 import panel as vrm0_panel
from .editor.vrm0 import property_group as vrm0_property_group
from .editor.vrm0 import ui_list as vrm0_ui_list
from .editor.vrm1 import handler as vrm1_handler
from .editor.vrm1 import menu as vrm1_menu
from .editor.vrm1 import ops as vrm1_ops
from .editor.vrm1 import panel as vrm1_panel
from .editor.vrm1 import property_group as vrm1_property_group
from .editor.vrm1 import ui_list as vrm1_ui_list
from .exporter import export_scene
from .external import io_scene_gltf2_support
from .importer import import_scene
from .locale.translation_dictionary import translation_dictionary
logger = get_logger(__name__)
def setup(*, load_post: bool) -> None:
context = bpy.context
if preferences.get_preferences(context).add_mtoon_shader_node_group:
shader.add_mtoon1_auto_setup_shader_node_group(context)
migration.migrate_all_objects(context, show_progress=True)
mtoon1_property_group.setup_drivers(context)
subscription.setup_subscription(load_post=load_post)
scene_watcher.setup()
@persistent
def load_post(_unused: object) -> None:
if (
depsgraph_update_pre_once_if_load_post_is_unavailable
in bpy.app.handlers.depsgraph_update_pre
):
bpy.app.handlers.depsgraph_update_pre.remove(
depsgraph_update_pre_once_if_load_post_is_unavailable
)
setup(load_post=True)
@persistent
def depsgraph_update_pre_once_if_load_post_is_unavailable(_unused: object) -> None:
"""Execute the same routine as load_post() in depsgraph_update_pre().
We want to execute the same routine as load_post() when register() is called.
However, if we execute it directly in register(), an error will occur in the
context of Blender startup; we can avoid the error by executing it in
depsgraph_update_pre().
"""
if (
depsgraph_update_pre_once_if_load_post_is_unavailable
not in bpy.app.handlers.depsgraph_update_pre
):
return
bpy.app.handlers.depsgraph_update_pre.remove(
depsgraph_update_pre_once_if_load_post_is_unavailable
)
setup(load_post=False)
@persistent
def depsgraph_update_pre(_unused: object) -> None:
trigger_clear_addon_version_cache()
@persistent
def save_pre(_unused: object) -> None:
# Apply pending changes before saving.
depsgraph_update_pre_once_if_load_post_is_unavailable(None)
context = bpy.context
migration.migrate_all_objects(context)
extension.update_internal_cache(context)
classes: list[
Union[
type[Panel],
type[UIList],
type[Menu],
type[Header],
type[Operator],
type[KeyingSetInfo],
type[RenderEngine],
type[AddonPreferences],
type[PropertyGroup],
type["bpy.types.FileHandler"], # bpy.app.version >= (4, 1, 0)
]
] = [
io_scene_gltf2_support.WM_OT_vrm_io_scene_gltf2_disabled_warning,
property_group.StringPropertyGroup,
property_group.FloatPropertyGroup,
property_group.BonePropertyGroup,
property_group.MeshObjectPropertyGroup,
property_group.MaterialPropertyGroup,
vrm0_property_group.Vrm0MaterialValueBindPropertyGroup,
vrm0_property_group.Vrm0BlendShapeBindPropertyGroup,
vrm0_property_group.Vrm0BlendShapeGroupPropertyGroup,
vrm0_property_group.Vrm0BlendShapeMasterPropertyGroup,
vrm0_property_group.Vrm0MeshAnnotationPropertyGroup,
vrm0_property_group.Vrm0DegreeMapPropertyGroup,
vrm0_property_group.Vrm0FirstPersonPropertyGroup,
vrm0_property_group.Vrm0HumanoidBonePropertyGroup,
vrm0_property_group.Vrm0HumanoidPropertyGroup,
vrm0_property_group.Vrm0MetaPropertyGroup,
vrm0_property_group.Vrm0SecondaryAnimationColliderPropertyGroup,
vrm0_property_group.Vrm0SecondaryAnimationColliderGroupPropertyGroup,
vrm0_property_group.Vrm0SecondaryAnimationGroupPropertyGroup,
vrm0_property_group.Vrm0SecondaryAnimationPropertyGroup,
vrm0_property_group.Vrm0PropertyGroup,
# vrm0_gizmo_group.Vrm0FirstPersonBoneOffsetGizmoGroup,
vrm1_property_group.Vrm1HumanBonePropertyGroup,
vrm1_property_group.Vrm1HumanBonesPropertyGroup,
vrm1_property_group.Vrm1HumanoidPropertyGroup,
vrm1_property_group.Vrm1LookAtRangeMapPropertyGroup,
vrm1_property_group.Vrm1LookAtPropertyGroup,
vrm1_property_group.Vrm1MeshAnnotationPropertyGroup,
vrm1_property_group.Vrm1FirstPersonPropertyGroup,
vrm1_property_group.Vrm1MorphTargetBindPropertyGroup,
vrm1_property_group.Vrm1MaterialColorBindPropertyGroup,
vrm1_property_group.Vrm1TextureTransformBindPropertyGroup,
vrm1_property_group.Vrm1CustomExpressionPropertyGroup,
vrm1_property_group.Vrm1ExpressionPropertyGroup,
vrm1_property_group.Vrm1ExpressionsPresetPropertyGroup,
vrm1_property_group.Vrm1ExpressionsPropertyGroup,
vrm1_property_group.Vrm1MetaPropertyGroup,
vrm1_property_group.Vrm1PropertyGroup,
node_constraint1_property_group.NodeConstraint1NodeConstraintPropertyGroup,
spring_bone1_property_group.SpringBone1ExtendedColliderShapeSpherePropertyGroup,
spring_bone1_property_group.SpringBone1ExtendedColliderShapeCapsulePropertyGroup,
spring_bone1_property_group.SpringBone1ExtendedColliderShapePlanePropertyGroup,
spring_bone1_property_group.SpringBone1ColliderShapeSpherePropertyGroup,
spring_bone1_property_group.SpringBone1ColliderShapeCapsulePropertyGroup,
spring_bone1_property_group.SpringBone1ExtendedColliderShapePropertyGroup,
spring_bone1_property_group.SpringBone1ColliderShapePropertyGroup,
spring_bone1_property_group.SpringBone1VrmcSpringBoneExtendedColliderPropertyGroup,
spring_bone1_property_group.SpringBone1ColliderExtensionsPropertyGroup,
spring_bone1_property_group.SpringBone1ColliderPropertyGroup,
spring_bone1_property_group.SpringBone1ColliderReferencePropertyGroup,
spring_bone1_property_group.SpringBone1ColliderGroupPropertyGroup,
spring_bone1_property_group.SpringBone1ColliderGroupReferencePropertyGroup,
spring_bone1_property_group.SpringBone1JointAnimationStatePropertyGroup,
spring_bone1_property_group.SpringBone1JointPropertyGroup,
spring_bone1_property_group.SpringBone1SpringAnimationStatePropertyGroup,
spring_bone1_property_group.SpringBone1SpringPropertyGroup,
spring_bone1_property_group.SpringBone1SpringBonePropertyGroup,
mtoon1_property_group.Mtoon1BaseColorSamplerPropertyGroup,
mtoon1_property_group.Mtoon1ShadeMultiplySamplerPropertyGroup,
mtoon1_property_group.Mtoon1NormalSamplerPropertyGroup,
mtoon1_property_group.Mtoon1ShadingShiftSamplerPropertyGroup,
mtoon1_property_group.Mtoon1EmissiveSamplerPropertyGroup,
mtoon1_property_group.Mtoon1RimMultiplySamplerPropertyGroup,
mtoon1_property_group.Mtoon1MatcapSamplerPropertyGroup,
mtoon1_property_group.Mtoon1OutlineWidthMultiplySamplerPropertyGroup,
mtoon1_property_group.Mtoon1UvAnimationMaskSamplerPropertyGroup,
mtoon1_property_group.Mtoon1SamplerPropertyGroup,
mtoon1_property_group.Mtoon1BaseColorKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1ShadeMultiplyKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1NormalKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1ShadingShiftKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1EmissiveKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1RimMultiplyKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1MatcapKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1OutlineWidthMultiplyKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1UvAnimationMaskKhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1KhrTextureTransformPropertyGroup,
mtoon1_property_group.Mtoon1BaseColorTexturePropertyGroup,
mtoon1_property_group.Mtoon1ShadeMultiplyTexturePropertyGroup,
mtoon1_property_group.Mtoon1NormalTexturePropertyGroup,
mtoon1_property_group.Mtoon1ShadingShiftTexturePropertyGroup,
mtoon1_property_group.Mtoon1EmissiveTexturePropertyGroup,
mtoon1_property_group.Mtoon1RimMultiplyTexturePropertyGroup,
mtoon1_property_group.Mtoon1MatcapTexturePropertyGroup,
mtoon1_property_group.Mtoon1OutlineWidthMultiplyTexturePropertyGroup,
mtoon1_property_group.Mtoon1UvAnimationMaskTexturePropertyGroup,
mtoon1_property_group.Mtoon1TexturePropertyGroup,
mtoon1_property_group.Mtoon1BaseColorTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1ShadeMultiplyTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1NormalTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1ShadingShiftTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1EmissiveTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1RimMultiplyTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1MatcapTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1OutlineWidthMultiplyTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1UvAnimationMaskTextureInfoExtensionsPropertyGroup,
mtoon1_property_group.Mtoon1BaseColorTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1ShadeMultiplyTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1NormalTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1ShadingShiftTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1EmissiveTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1RimMultiplyTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1MatcapTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1OutlineWidthMultiplyTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1UvAnimationMaskTextureInfoPropertyGroup,
mtoon1_property_group.Mtoon1PbrMetallicRoughnessPropertyGroup,
mtoon1_property_group.Mtoon1VrmcMaterialsMtoonPropertyGroup,
mtoon1_property_group.Mtoon1KhrMaterialsEmissiveStrengthPropertyGroup,
mtoon1_property_group.Mtoon1MaterialExtensionsPropertyGroup,
mtoon1_property_group.Mtoon0SamplerPropertyGroup,
mtoon1_property_group.Mtoon0TexturePropertyGroup,
mtoon1_property_group.Mtoon0ShadingGradeTexturePropertyGroup,
mtoon1_property_group.Mtoon0ReceiveShadowTexturePropertyGroup,
mtoon1_property_group.Mtoon1MaterialPropertyGroup,
mtoon1_property_group.MaterialTraceablePropertyGroup,
mtoon1_panel.VRM_PT_vrm_material_property,
panel.VRM_PT_current_selected_armature,
panel.VRM_PT_controller_unsupported_blender_version_warning,
panel.VRM_PT_controller,
panel.VRM_PT_vrm_armature_object_property,
body_mesh_panel.VRM_PT_body_mesh_separator,
vrm0_menu.VRM_MT_vrm0_blend_shape_master,
vrm0_ui_list.VRM_UL_vrm0_first_person_mesh_annotation,
vrm0_ui_list.VRM_UL_vrm0_blend_shape_bind,
vrm0_ui_list.VRM_UL_vrm0_blend_shape_group,
vrm0_ui_list.VRM_UL_vrm0_material_value_bind,
vrm0_ui_list.VRM_UL_vrm0_secondary_animation_collider_group,
vrm0_ui_list.VRM_UL_vrm0_secondary_animation_group,
vrm0_ui_list.VRM_UL_vrm0_secondary_animation_group_bone,
vrm0_ui_list.VRM_UL_vrm0_secondary_animation_group_collider_group,
vrm0_ui_list.VRM_UL_vrm0_secondary_animation_collider_group_collider,
vrm0_panel.VRM_PT_vrm0_meta_armature_object_property,
vrm0_panel.VRM_PT_vrm0_meta_ui,
vrm0_panel.VRM_PT_vrm0_humanoid_armature_object_property,
vrm0_panel.VRM_PT_vrm0_humanoid_ui,
vrm0_panel.VRM_PT_vrm0_blend_shape_master_armature_object_property,
vrm0_panel.VRM_PT_vrm0_blend_shape_master_ui,
vrm0_panel.VRM_PT_vrm0_first_person_armature_object_property,
vrm0_panel.VRM_PT_vrm0_first_person_ui,
vrm0_panel.VRM_PT_vrm0_secondary_animation_armature_object_property,
vrm0_panel.VRM_PT_vrm0_secondary_animation_ui,
vrm1_panel.VRM_PT_vrm1_meta_armature_object_property,
vrm1_panel.VRM_PT_vrm1_meta_ui,
vrm1_panel.VRM_PT_vrm1_humanoid_armature_object_property,
vrm1_panel.VRM_PT_vrm1_humanoid_ui,
vrm1_panel.VRM_PT_vrm1_first_person_armature_object_property,
vrm1_panel.VRM_PT_vrm1_first_person_ui,
vrm1_panel.VRM_PT_vrm1_look_at_armature_object_property,
vrm1_panel.VRM_PT_vrm1_look_at_ui,
vrm1_panel.VRM_PT_vrm1_expressions_armature_object_property,
vrm1_panel.VRM_PT_vrm1_expressions_ui,
node_constraint1_panel.VRM_PT_node_constraint1_armature_object_property,
node_constraint1_panel.VRM_PT_node_constraint1_ui,
spring_bone1_ui_list.VRM_UL_spring_bone1_collider,
spring_bone1_ui_list.VRM_UL_spring_bone1_collider_group,
spring_bone1_ui_list.VRM_UL_spring_bone1_collider_group_collider,
spring_bone1_ui_list.VRM_UL_spring_bone1_spring,
spring_bone1_ui_list.VRM_UL_spring_bone1_joint,
spring_bone1_ui_list.VRM_UL_spring_bone1_spring_collider_group,
spring_bone1_panel.VRM_PT_spring_bone1_armature_object_property,
spring_bone1_panel.VRM_PT_spring_bone1_ui,
spring_bone1_panel.VRM_PT_spring_bone1_collider_property,
vrm1_menu.VRM_MT_vrm1_expression,
vrm1_ui_list.VRM_UL_vrm1_meta_author,
vrm1_ui_list.VRM_UL_vrm1_meta_reference,
vrm1_ui_list.VRM_UL_vrm1_first_person_mesh_annotation,
vrm1_ui_list.VRM_UL_vrm1_expression,
vrm1_ui_list.VRM_UL_vrm1_morph_target_bind,
vrm1_ui_list.VRM_UL_vrm1_material_color_bind,
vrm1_ui_list.VRM_UL_vrm1_texture_transform_bind,
vrm0_ops.VRM_OT_add_vrm0_first_person_mesh_annotation,
vrm0_ops.VRM_OT_remove_vrm0_first_person_mesh_annotation,
vrm0_ops.VRM_OT_move_up_vrm0_first_person_mesh_annotation,
vrm0_ops.VRM_OT_move_down_vrm0_first_person_mesh_annotation,
vrm0_ops.VRM_OT_add_vrm0_material_value_bind,
vrm0_ops.VRM_OT_remove_vrm0_material_value_bind,
vrm0_ops.VRM_OT_move_up_vrm0_material_value_bind,
vrm0_ops.VRM_OT_move_down_vrm0_material_value_bind,
vrm0_ops.VRM_OT_add_vrm0_material_value_bind_target_value,
vrm0_ops.VRM_OT_remove_vrm0_material_value_bind_target_value,
vrm0_ops.VRM_OT_add_vrm0_blend_shape_group,
vrm0_ops.VRM_OT_remove_vrm0_blend_shape_group,
vrm0_ops.VRM_OT_move_up_vrm0_blend_shape_group,
vrm0_ops.VRM_OT_move_down_vrm0_blend_shape_group,
vrm0_ops.VRM_OT_add_vrm0_blend_shape_bind,
vrm0_ops.VRM_OT_remove_vrm0_blend_shape_bind,
vrm0_ops.VRM_OT_move_down_vrm0_blend_shape_bind,
vrm0_ops.VRM_OT_move_up_vrm0_blend_shape_bind,
vrm0_ops.VRM_OT_restore_vrm0_blend_shape_group_bind_object,
vrm0_ops.VRM_OT_add_vrm0_secondary_animation_collider_group_collider,
vrm0_ops.VRM_OT_remove_vrm0_secondary_animation_collider_group_collider,
vrm0_ops.VRM_OT_move_up_vrm0_secondary_animation_collider_group_collider,
vrm0_ops.VRM_OT_move_down_vrm0_secondary_animation_collider_group_collider,
vrm0_ops.VRM_OT_add_vrm0_secondary_animation_group_bone,
vrm0_ops.VRM_OT_remove_vrm0_secondary_animation_group_bone,
vrm0_ops.VRM_OT_move_up_vrm0_secondary_animation_group_bone,
vrm0_ops.VRM_OT_move_down_vrm0_secondary_animation_group_bone,
vrm0_ops.VRM_OT_add_vrm0_secondary_animation_group_collider_group,
vrm0_ops.VRM_OT_remove_vrm0_secondary_animation_group_collider_group,
vrm0_ops.VRM_OT_move_up_vrm0_secondary_animation_group_collider_group,
vrm0_ops.VRM_OT_move_down_vrm0_secondary_animation_group_collider_group,
vrm0_ops.VRM_OT_add_vrm0_secondary_animation_group,
vrm0_ops.VRM_OT_remove_vrm0_secondary_animation_group,
vrm0_ops.VRM_OT_move_up_vrm0_secondary_animation_group,
vrm0_ops.VRM_OT_move_down_vrm0_secondary_animation_group,
vrm0_ops.VRM_OT_add_vrm0_secondary_animation_collider_group,
vrm0_ops.VRM_OT_remove_vrm0_secondary_animation_collider_group,
vrm0_ops.VRM_OT_move_up_vrm0_secondary_animation_collider_group,
vrm0_ops.VRM_OT_move_down_vrm0_secondary_animation_collider_group,
vrm0_ops.VRM_OT_assign_vrm0_humanoid_human_bones_automatically,
vrm0_ops.VRM_OT_show_vrm0_bone_assignment_diagnostics,
vrm1_ops.VRM_OT_add_vrm1_meta_author,
vrm1_ops.VRM_OT_remove_vrm1_meta_author,
vrm1_ops.VRM_OT_move_up_vrm1_meta_author,
vrm1_ops.VRM_OT_move_down_vrm1_meta_author,
vrm1_ops.VRM_OT_add_vrm1_meta_reference,
vrm1_ops.VRM_OT_remove_vrm1_meta_reference,
vrm1_ops.VRM_OT_move_up_vrm1_meta_reference,
vrm1_ops.VRM_OT_move_down_vrm1_meta_reference,
vrm1_ops.VRM_OT_add_vrm1_expressions_custom_expression,
vrm1_ops.VRM_OT_remove_vrm1_expressions_custom_expression,
vrm1_ops.VRM_OT_move_up_vrm1_expressions_custom_expression,
vrm1_ops.VRM_OT_move_down_vrm1_expressions_custom_expression,
vrm1_ops.VRM_OT_add_vrm1_expression_morph_target_bind,
vrm1_ops.VRM_OT_remove_vrm1_expression_morph_target_bind,
vrm1_ops.VRM_OT_move_up_vrm1_expression_morph_target_bind,
vrm1_ops.VRM_OT_move_down_vrm1_expression_morph_target_bind,
vrm1_ops.VRM_OT_restore_vrm1_expression_morph_target_bind_object,
vrm1_ops.VRM_OT_add_vrm1_expression_material_color_bind,
vrm1_ops.VRM_OT_remove_vrm1_expression_material_color_bind,
vrm1_ops.VRM_OT_move_up_vrm1_expression_material_color_bind,
vrm1_ops.VRM_OT_move_down_vrm1_expression_material_color_bind,
vrm1_ops.VRM_OT_add_vrm1_expression_texture_transform_bind,
vrm1_ops.VRM_OT_remove_vrm1_expression_texture_transform_bind,
vrm1_ops.VRM_OT_move_up_vrm1_expression_texture_transform_bind,
vrm1_ops.VRM_OT_move_down_vrm1_expression_texture_transform_bind,
vrm1_ops.VRM_OT_add_vrm1_first_person_mesh_annotation,
vrm1_ops.VRM_OT_remove_vrm1_first_person_mesh_annotation,
vrm1_ops.VRM_OT_move_up_vrm1_first_person_mesh_annotation,
vrm1_ops.VRM_OT_move_down_vrm1_first_person_mesh_annotation,
vrm1_ops.VRM_OT_assign_vrm1_humanoid_human_bones_automatically,
vrm1_ops.VRM_OT_update_vrm1_expression_ui_list_elements,
vrm1_ops.VRM_OT_refresh_vrm1_expression_texture_transform_bind_preview,
vrm1_ops.VRM_OT_show_vrm1_bone_assignment_diagnostics,
spring_bone1_ops.VRM_OT_add_spring_bone1_collider,
spring_bone1_ops.VRM_OT_remove_spring_bone1_collider,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_collider,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_collider,
spring_bone1_ops.VRM_OT_add_spring_bone1_collider_group,
spring_bone1_ops.VRM_OT_remove_spring_bone1_collider_group,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_collider_group,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_collider_group,
spring_bone1_ops.VRM_OT_add_spring_bone1_collider_group_collider,
spring_bone1_ops.VRM_OT_remove_spring_bone1_collider_group_collider,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_collider_group_collider,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_collider_group_collider,
spring_bone1_ops.VRM_OT_add_spring_bone1_spring,
spring_bone1_ops.VRM_OT_remove_spring_bone1_spring,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_spring,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_spring,
spring_bone1_ops.VRM_OT_add_spring_bone1_spring_collider_group,
spring_bone1_ops.VRM_OT_remove_spring_bone1_spring_collider_group,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_spring_collider_group,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_spring_collider_group,
spring_bone1_ops.VRM_OT_add_spring_bone1_joint,
spring_bone1_ops.VRM_OT_remove_spring_bone1_joint,
spring_bone1_ops.VRM_OT_move_up_spring_bone1_joint,
spring_bone1_ops.VRM_OT_move_down_spring_bone1_joint,
spring_bone1_ops.VRM_OT_reset_spring_bone1_animation_state,
spring_bone1_ops.VRM_OT_update_spring_bone1_animation,
mtoon1_ops.VRM_OT_convert_material_to_mtoon1,
mtoon1_ops.VRM_OT_convert_mtoon1_to_bsdf_principled,
mtoon1_ops.VRM_OT_reset_mtoon1_material_shader_node_tree,
mtoon1_ops.VRM_OT_import_mtoon1_texture_image_file,
mtoon1_ops.VRM_OT_refresh_mtoon1_outline,
mtoon1_ops.VRM_OT_show_material_blender_4_2_warning,
make_armature.ICYP_OT_make_armature,
ops.VRM_OT_simplify_vroid_bones,
ops.VRM_OT_open_url_in_web_browser,
ops.VRM_OT_save_human_bone_mappings,
ops.VRM_OT_load_human_bone_mappings,
ops.VRM_OT_show_blend_file_compatibility_warning,
ops.VRM_OT_show_blend_file_addon_compatibility_warning,
ops.VRM_OT_make_estimated_humanoid_t_pose,
body_mesh_ops.VRM_OT_separate_non_skin_faces,
validation.VrmValidationError,
validation.WM_OT_vrm_validator,
export_scene.WM_OT_vrm_export_human_bones_assignment,
export_scene.WM_OT_vrm_export_confirmation,
export_scene.WM_OT_vrm_export_armature_selection,
export_scene.WM_OT_vrma_export_prerequisite,
export_scene.VRM_PT_export_file_browser_tool_props,
export_scene.EXPORT_SCENE_OT_vrm,
export_scene.EXPORT_SCENE_OT_vrma,
export_scene.VRM_PT_export_vrma_help,
error_dialog.VrmErrorDialogMessageLine,
error_dialog.VRM_UL_vrm_error_dialog_message,
error_dialog.VRM_OT_save_error_dialog_message,
error_dialog.WM_OT_vrm_error_dialog,
import_scene.LicenseConfirmation,
import_scene.WM_OT_vrm_license_confirmation,
import_scene.WM_OT_vrma_import_prerequisite,
import_scene.VRM_PT_import_file_browser_tool_props,
import_scene.IMPORT_SCENE_OT_vrm,
import_scene.IMPORT_SCENE_OT_vrma,
import_scene.VRM_PT_import_unsupported_blender_version_warning,
preferences.VrmAddonPreferences,
extension.VrmAddonArmatureExtensionPropertyGroup,
extension.VrmAddonBoneExtensionPropertyGroup,
extension.VrmAddonSceneExtensionPropertyGroup,
extension.VrmAddonMaterialExtensionPropertyGroup,
extension.VrmAddonObjectExtensionPropertyGroup,
extension.VrmAddonNodeTreeExtensionPropertyGroup,
]
if bpy.app.version >= (4, 1):
from .importer import file_handler
classes.extend(
[
file_handler.VRM_OT_import_vrm_via_file_handler,
file_handler.VRM_OT_import_vrma_via_file_handler,
file_handler.VRM_FH_vrm_import,
file_handler.VRM_FH_vrma_import,
]
)
def register() -> None:
name = ".".join(__name__.split(".")[:-1])
logger.debug("Registering: %s", name)
bpy.app.translations.register(
preferences.addon_package_name,
translation_dictionary,
)
for cls in classes:
bpy.utils.register_class(cls)
NodeTree.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonNodeTreeExtensionPropertyGroup
)
Material.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonMaterialExtensionPropertyGroup
)
Scene.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonSceneExtensionPropertyGroup
)
Bone.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonBoneExtensionPropertyGroup
)
Armature.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonArmatureExtensionPropertyGroup
)
Object.vrm_addon_extension = PointerProperty( # type: ignore[attr-defined, assignment, unused-ignore]
type=extension.VrmAddonObjectExtensionPropertyGroup
)
TOPBAR_MT_file_import.append(import_scene.menu_import)
TOPBAR_MT_file_export.append(export_scene.menu_export)
VIEW3D_MT_armature_add.append(panel.add_armature)
# VIEW3D_MT_mesh_add.append(panel.make_mesh)
bpy.app.handlers.load_post.append(handler.load_post)
bpy.app.handlers.load_post.append(mtoon1_handler.load_post)
bpy.app.handlers.load_post.append(load_post)
bpy.app.handlers.depsgraph_update_pre.append(
depsgraph_update_pre_once_if_load_post_is_unavailable
)
bpy.app.handlers.depsgraph_update_pre.append(depsgraph_update_pre)
bpy.app.handlers.depsgraph_update_pre.append(vrm1_handler.depsgraph_update_pre)
bpy.app.handlers.depsgraph_update_pre.append(mtoon1_handler.depsgraph_update_pre)
bpy.app.handlers.save_pre.append(save_pre)
bpy.app.handlers.save_pre.append(scene_watcher.save_pre)
bpy.app.handlers.frame_change_pre.append(spring_bone1_handler.frame_change_pre)
bpy.app.handlers.frame_change_pre.append(vrm0_handler.frame_change_pre)
bpy.app.handlers.frame_change_post.append(vrm0_handler.frame_change_post)
bpy.app.handlers.frame_change_pre.append(vrm1_handler.frame_change_pre)
bpy.app.handlers.frame_change_post.append(vrm1_handler.frame_change_post)
bpy.app.handlers.depsgraph_update_pre.append(
spring_bone1_handler.depsgraph_update_pre
)
io_scene_gltf2_support.init_extras_export()
logger.debug("Registered: %s", name)
def unregister() -> None:
subscription.teardown_subscription()
bpy.app.handlers.depsgraph_update_pre.remove(
spring_bone1_handler.depsgraph_update_pre
)
bpy.app.handlers.frame_change_post.remove(vrm1_handler.frame_change_post)
bpy.app.handlers.frame_change_pre.remove(vrm1_handler.frame_change_pre)
bpy.app.handlers.frame_change_post.remove(vrm0_handler.frame_change_post)
bpy.app.handlers.frame_change_pre.remove(vrm0_handler.frame_change_pre)
bpy.app.handlers.frame_change_pre.remove(spring_bone1_handler.frame_change_pre)
bpy.app.handlers.save_pre.remove(scene_watcher.save_pre)
bpy.app.handlers.save_pre.remove(save_pre)
bpy.app.handlers.depsgraph_update_pre.remove(mtoon1_handler.depsgraph_update_pre)
bpy.app.handlers.depsgraph_update_pre.remove(vrm1_handler.depsgraph_update_pre)
bpy.app.handlers.depsgraph_update_pre.remove(depsgraph_update_pre)
if (
depsgraph_update_pre_once_if_load_post_is_unavailable
in bpy.app.handlers.depsgraph_update_pre
):
bpy.app.handlers.depsgraph_update_pre.remove(
depsgraph_update_pre_once_if_load_post_is_unavailable
)
bpy.app.handlers.load_post.remove(load_post)
bpy.app.handlers.load_post.remove(mtoon1_handler.load_post)
bpy.app.handlers.load_post.remove(handler.load_post)
# VIEW3D_MT_mesh_add.remove(panel.make_mesh)
VIEW3D_MT_armature_add.remove(panel.add_armature)
TOPBAR_MT_file_export.remove(export_scene.menu_export)
TOPBAR_MT_file_import.remove(import_scene.menu_import)
if hasattr(Object, "vrm_addon_extension"):
del Object.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
if hasattr(Armature, "vrm_addon_extension"):
del Armature.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
if hasattr(Bone, "vrm_addon_extension"):
del Bone.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
if hasattr(Scene, "vrm_addon_extension"):
del Scene.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
if hasattr(Material, "vrm_addon_extension"):
del Material.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
if hasattr(NodeTree, "vrm_addon_extension"):
del NodeTree.vrm_addon_extension # pyright: ignore [reportAttributeAccessIssue]
for cls in reversed(classes):
try:
bpy.utils.unregister_class(cls)
except RuntimeError:
logger.exception("Failed to unregister %s", cls)
bpy.app.translations.unregister(preferences.addon_package_name)
# https://github.com/saturday06/VRM-Addon-for-Blender/issues/506#issuecomment-2183766778
if os.getenv("BLENDER_VRM_DEVELOPMENT_MODE") == "yes":
cleanse_modules()