- 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
606 lines
29 KiB
Python
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()
|