Files
blender-vrm/editor/spring_bone1/ops.py
小煜 091ad6a49a feat: Add VRM Blender addon with complete import/export functionality
- Add core VRM addon infrastructure with manifest and registration
- Add common utilities module with file system, logging, and conversion helpers
- Add human bone mapper with support for multiple rigging standards (Mixamo, MMD, Unreal, Rigify, etc.)
- Add VRM 0.x and 1.x format support with property groups and handlers
- Add editor UI panels for VRM metadata, spring bones, and MToon materials
- Add exporter with glTF2 extension support for VRM format serialization
- Add importer with scene reconstruction and armature generation
- Add MToon shader support with auto-setup and material migration
- Add spring bone physics simulation with constraint handling
- Add node constraint editor for advanced rigging control
- Add comprehensive validation and error handling with user dialogs
- Add scene watcher for real-time property synchronization
- Add workspace management and preference system
- Include Python cache files and Blender manifest configuration
- This is the initial commit establishing the complete VRM addon ecosystem for Blender
2026-01-01 14:21:56 +08:00

1602 lines
64 KiB
Python

# SPDX-License-Identifier: MIT OR GPL-3.0-or-later
import uuid
import warnings
from collections.abc import Set as AbstractSet
from sys import float_info
from typing import TYPE_CHECKING
from bpy.props import BoolProperty, FloatProperty, IntProperty, StringProperty
from bpy.types import Armature, Context, Operator
from ...common import safe_removal
from ...common.logger import get_logger
from ..extension import get_armature_extension
from .handler import reset_state, update_pose_bone_rotations
logger = get_logger(__name__)
class VRM_OT_add_spring_bone1_collider(Operator):
bl_idname = "vrm.add_spring_bone1_collider"
bl_label = "Add Collider"
bl_description = "Add VRM 1.0 Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
collider = spring_bone.colliders.add()
collider.uuid = uuid.uuid4().hex
collider.shape.sphere.radius = 0.125
collider.reset_bpy_object(context, armature)
spring_bone.active_collider_index = len(spring_bone.colliders) - 1
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_collider(Operator):
bl_idname = "vrm.remove_spring_bone1_collider"
bl_label = "Remove Collider"
bl_description = "Remove VRM 0.x Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
if len(spring_bone.colliders) <= self.collider_index:
return {"CANCELLED"}
collider = spring_bone.colliders[self.collider_index]
bpy_object = collider.bpy_object
if bpy_object:
collider.bpy_object = None
for unnecessary_object in [*bpy_object.children, bpy_object]:
if not safe_removal.remove_object(context, unnecessary_object):
logger.warning(
'Failed to remove "%s" with %d users'
" while removing spring bone collider object",
unnecessary_object.name,
unnecessary_object.users,
)
bpy_object = None
collider_uuid = spring_bone.colliders[self.collider_index].uuid
spring_bone.colliders.remove(self.collider_index)
for collider_group in spring_bone.collider_groups:
while True:
removed = False
for index, collider in enumerate(list(collider_group.colliders)):
if collider.collider_uuid != collider_uuid:
continue
collider_group.colliders.remove(index)
removed = True
break
if not removed:
break
spring_bone.active_collider_index = min(
spring_bone.active_collider_index,
max(0, len(spring_bone.colliders) - 1),
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_collider_group(Operator):
bl_idname = "vrm.move_up_spring_bone1_collider_group"
bl_label = "Move Up Collider Group"
bl_description = "Move Up VRM 1.0 Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
if len(spring_bone.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
new_index = (self.collider_group_index - 1) % len(spring_bone.collider_groups)
spring_bone.collider_groups.move(self.collider_group_index, new_index)
spring_bone.active_collider_group_index = new_index
for collider_group in spring_bone.collider_groups:
collider_group.fix_index()
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_collider_group(Operator):
bl_idname = "vrm.move_down_spring_bone1_collider_group"
bl_label = "Move Down Collider Group"
bl_description = "Move Down VRM 1.0 Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
if len(spring_bone.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
new_index = (self.collider_group_index + 1) % len(spring_bone.collider_groups)
spring_bone.collider_groups.move(self.collider_group_index, new_index)
spring_bone.active_collider_group_index = new_index
for collider_group in spring_bone.collider_groups:
collider_group.fix_index()
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_add_spring_bone1_spring(Operator):
bl_idname = "vrm.add_spring_bone1_spring"
bl_label = "Add Spring"
bl_description = "Add VRM 1.0 Spring"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
spring = spring_bone1.springs.add()
spring.vrm_name = "Spring"
spring_bone1.active_spring_index = len(spring_bone1.springs) - 1
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_spring(Operator):
bl_idname = "vrm.remove_spring_bone1_spring"
bl_label = "Remove Spring"
bl_description = "Remove VRM 1.0 Spring"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
if len(spring_bone1.springs) <= self.spring_index:
return {"CANCELLED"}
spring_bone1.springs.remove(self.spring_index)
spring_bone1.active_spring_index = min(
spring_bone1.active_spring_index, max(0, len(spring_bone1.springs) - 1)
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_spring(Operator):
bl_idname = "vrm.move_up_spring_bone1_spring"
bl_label = "Move Up Spring"
bl_description = "Move Up VRM 1.0 Spring"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
new_spring_index = (self.spring_index - 1) % len(springs)
springs.move(self.spring_index, new_spring_index)
spring_bone1.active_spring_index = new_spring_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_spring(Operator):
bl_idname = "vrm.move_down_spring_bone1_spring"
bl_label = "Move Down Spring"
bl_description = "Move Down VRM 1.0 Spring"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
new_spring_index = (self.spring_index + 1) % len(springs)
springs.move(self.spring_index, new_spring_index)
spring_bone1.active_spring_index = new_spring_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
class VRM_OT_add_spring_bone1_collider_group(Operator):
bl_idname = "vrm.add_spring_bone1_collider_group"
bl_label = "Add Collider Group"
bl_description = "Add VRM 1.0 Spring Bone Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
collider_group = spring_bone.collider_groups.add()
collider_group.uuid = uuid.uuid4().hex
collider_group.vrm_name = "Collider Group"
spring_bone.active_collider_group_index = len(spring_bone.collider_groups) - 1
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_collider_group(Operator):
bl_idname = "vrm.remove_spring_bone1_collider_group"
bl_label = "Remove Collider Group"
bl_description = "Remove VRM 1.0 Spring Bone Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone = get_armature_extension(armature_data).spring_bone1
collider_groups = spring_bone.collider_groups
if len(collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
collider_group_uuid = collider_groups[self.collider_group_index].uuid
collider_groups.remove(self.collider_group_index)
for spring in spring_bone.springs:
while True:
removed = False
for index, collider_group in enumerate(list(spring.collider_groups)):
if collider_group.collider_group_uuid != collider_group_uuid:
continue
spring.collider_groups.remove(index)
removed = True
break
if not removed:
break
for collider_group in collider_groups:
collider_group.fix_index()
spring_bone.active_collider_group_index = min(
spring_bone.active_collider_group_index,
max(0, len(spring_bone.collider_groups) - 1),
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_collider(Operator):
bl_idname = "vrm.move_up_spring_bone1_collider"
bl_label = "Move Up Collider"
bl_description = "Move Up VRM 1.0 Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
colliders = spring_bone1.colliders
if len(colliders) <= self.collider_index:
return {"CANCELLED"}
new_collider_index = (self.collider_index - 1) % len(colliders)
colliders.move(self.collider_index, new_collider_index)
spring_bone1.active_collider_index = new_collider_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_collider(Operator):
bl_idname = "vrm.move_down_spring_bone1_collider"
bl_label = "Move Down Collider"
bl_description = "Move Down VRM 1.0 Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
colliders = spring_bone1.colliders
if len(colliders) <= self.collider_index:
return {"CANCELLED"}
new_collider_index = (self.collider_index + 1) % len(colliders)
colliders.move(self.collider_index, new_collider_index)
spring_bone1.active_collider_index = new_collider_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_add_spring_bone1_collider_group_collider(Operator):
bl_idname = "vrm.add_spring_bone1_collider_group_collider"
bl_label = "Add Collider"
bl_description = "Add VRM 1.0 Spring Bone Collider Group Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
collider_groups = get_armature_extension(
armature_data
).spring_bone1.collider_groups
if len(collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
collider_group = collider_groups[self.collider_group_index]
collider_group.colliders.add()
collider_group.active_collider_index = len(collider_group.colliders) - 1
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_collider_group_collider(Operator):
bl_idname = "vrm.remove_spring_bone1_collider_group_collider"
bl_label = "Remove Collider"
bl_description = "Remove VRM 1.0 Spring Bone Collider Group Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
collider_groups = get_armature_extension(
armature_data
).spring_bone1.collider_groups
if len(collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
collider_group = collider_groups[self.collider_group_index]
if len(collider_group.colliders) <= self.collider_index:
return {"CANCELLED"}
collider_group.colliders.remove(self.collider_index)
collider_group.active_collider_index = min(
collider_group.active_collider_index,
max(0, len(collider_group.colliders) - 1),
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_collider_group_collider(Operator):
bl_idname = "vrm.move_up_spring_bone1_collider_group_collider"
bl_label = "Move Up Collider"
bl_description = "Move Up VRM 1.0 Collider Group Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
if len(spring_bone1.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
collider_group = spring_bone1.collider_groups[self.collider_group_index]
if len(collider_group.colliders) <= self.collider_index:
return {"CANCELLED"}
new_collider_index = (self.collider_index - 1) % len(collider_group.colliders)
collider_group.colliders.move(self.collider_index, new_collider_index)
collider_group.active_collider_index = new_collider_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_collider_group_collider(Operator):
bl_idname = "vrm.move_down_spring_bone1_collider_group_collider"
bl_label = "Move Down Collider"
bl_description = "Move Down VRM 1.0 Collider Group Collider"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
if len(spring_bone1.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
collider_group = spring_bone1.collider_groups[self.collider_group_index]
if len(collider_group.colliders) <= self.collider_index:
return {"CANCELLED"}
new_collider_index = (self.collider_index + 1) % len(collider_group.colliders)
collider_group.colliders.move(self.collider_index, new_collider_index)
collider_group.active_collider_index = new_collider_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
collider_index: int # type: ignore[no-redef]
class VRM_OT_add_spring_bone1_spring_collider_group(Operator):
bl_idname = "vrm.add_spring_bone1_spring_collider_group"
bl_label = "Add Collider Group"
bl_description = "Add VRM 1.0 Spring Bone Spring Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
springs = get_armature_extension(armature_data).spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
spring.collider_groups.add()
spring.active_collider_group_index = len(spring.collider_groups) - 1
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_spring_collider_group(Operator):
bl_idname = "vrm.remove_spring_bone1_spring_collider_group"
bl_label = "Remove Collider Group"
bl_description = "Remove VRM 1.0 Spring Bone Spring Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
springs = get_armature_extension(armature_data).spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
spring.collider_groups.remove(self.collider_group_index)
spring.active_collider_group_index = min(
spring.active_collider_group_index, max(0, len(spring.collider_groups) - 1)
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_spring_collider_group(Operator):
bl_idname = "vrm.move_up_spring_bone1_spring_collider_group"
bl_label = "Move Up Collider Group"
bl_description = "Move Up VRM 1.0 Spring Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
new_collider_group_index = (self.collider_group_index - 1) % len(
spring.collider_groups
)
spring.collider_groups.move(self.collider_group_index, new_collider_group_index)
spring.active_collider_group_index = new_collider_group_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_spring_collider_group(Operator):
bl_idname = "vrm.move_down_spring_bone1_spring_collider_group"
bl_label = "Move Down Collider Group"
bl_description = "Move Down VRM 1.0 Spring Collider Group"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
collider_group_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.collider_groups) <= self.collider_group_index:
return {"CANCELLED"}
new_collider_group_index = (self.collider_group_index + 1) % len(
spring.collider_groups
)
spring.collider_groups.move(self.collider_group_index, new_collider_group_index)
spring.active_collider_group_index = new_collider_group_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
collider_group_index: int # type: ignore[no-redef]
class VRM_OT_add_spring_bone1_joint(Operator):
bl_idname = "vrm.add_spring_bone1_spring_joint"
bl_label = "Add Joint"
bl_description = "Add VRM 1.0 Spring Bone Spring Joint"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
guess_properties: BoolProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
springs = get_armature_extension(armature_data).spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
spring.joints.add()
spring.active_joint_index = len(spring.joints) - 1
if not self.guess_properties:
return {"FINISHED"}
if len(spring.joints) < 2:
return {"FINISHED"}
parent_joint, joint = spring.joints[-2:]
parent_bone = armature_data.bones.get(parent_joint.node.bone_name)
if parent_bone and parent_bone.children:
joint.node.bone_name = parent_bone.children[0].name
joint.hit_radius = parent_joint.hit_radius
joint.stiffness = parent_joint.stiffness
joint.gravity_power = parent_joint.gravity_power
joint.gravity_dir = list(parent_joint.gravity_dir)
joint.drag_force = parent_joint.drag_force
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
guess_properties: bool # type: ignore[no-redef]
class VRM_OT_remove_spring_bone1_joint(Operator):
bl_idname = "vrm.remove_spring_bone1_spring_joint"
bl_label = "Remove Joint"
bl_description = "Remove VRM 1.0 Spring Bone Spring Joint"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
joint_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
springs = get_armature_extension(armature_data).spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.joints) <= self.joint_index:
return {"CANCELLED"}
spring.joints.remove(self.joint_index)
spring.active_joint_index = min(
spring.active_joint_index, max(0, len(spring.joints) - 1)
)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
joint_index: int # type: ignore[no-redef]
class VRM_OT_move_up_spring_bone1_joint(Operator):
bl_idname = "vrm.move_up_spring_bone1_joint"
bl_label = "Move Up Joint"
bl_description = "Move Up VRM 1.0 Joint"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
joint_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.joints) <= self.joint_index:
return {"CANCELLED"}
new_joint_index = (self.joint_index - 1) % len(spring.joints)
spring.joints.move(self.joint_index, new_joint_index)
spring.active_joint_index = new_joint_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
joint_index: int # type: ignore[no-redef]
class VRM_OT_move_down_spring_bone1_joint(Operator):
bl_idname = "vrm.move_down_spring_bone1_joint"
bl_label = "Move Down Joint"
bl_description = "Move Down VRM 1.0 Joint"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
spring_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
joint_index: IntProperty( # type: ignore[valid-type]
options={"HIDDEN"},
min=0,
)
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
spring_bone1 = get_armature_extension(armature_data).spring_bone1
springs = spring_bone1.springs
if len(springs) <= self.spring_index:
return {"CANCELLED"}
spring = springs[self.spring_index]
if len(spring.joints) <= self.joint_index:
return {"CANCELLED"}
new_joint_index = (self.joint_index + 1) % len(spring.joints)
spring.joints.move(self.joint_index, new_joint_index)
spring.active_joint_index = new_joint_index
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
spring_index: int # type: ignore[no-redef]
joint_index: int # type: ignore[no-redef]
class VRM_OT_reset_spring_bone1_animation_state(Operator):
bl_idname = "vrm.reset_spring_bone1_animation_state"
bl_label = "Reset SpringBone Animation State"
bl_description = "Reset SpringBone Animation State"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
armature_object_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def update_armature_name(self, _context: Context) -> None:
message = (
f"`{type(self).__qualname__}.armature_name` is deprecated"
+ " and will be removed in the next major release."
+ f" `Please use {type(self).__qualname__}.armature_object_name` instead."
)
logger.warning(message)
warnings.warn(message, DeprecationWarning, stacklevel=5)
armature_name: StringProperty( # type: ignore[valid-type]
options={"HIDDEN"},
update=update_armature_name,
)
"""`armature_name` is deprecated and will be removed in the next major release.
Please use `armature_object_name` instead.
"""
def execute(self, context: Context) -> set[str]:
if not self.armature_object_name and self.armature_name:
self.armature_object_name = self.armature_name
armature = context.blend_data.objects.get(self.armature_object_name)
if armature is None or armature.type != "ARMATURE":
return {"CANCELLED"}
armature_data = armature.data
if not isinstance(armature_data, Armature):
return {"CANCELLED"}
for spring in get_armature_extension(armature_data).spring_bone1.springs:
for joint in spring.joints:
joint.animation_state.initialized_as_tail = False
reset_state(context)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
armature_object_name: str # type: ignore[no-redef]
armature_name: str # type: ignore[no-redef]
class VRM_OT_update_spring_bone1_animation(Operator):
bl_idname = "vrm.update_spring_bone1_animation"
bl_label = "Update SpringBone Animation"
bl_description = "Update SpringBone Animation"
bl_options: AbstractSet[str] = {"REGISTER", "UNDO"}
delta_time: FloatProperty( # type: ignore[valid-type]
options={"HIDDEN"},
)
def execute(self, context: Context) -> set[str]:
delta_time = self.delta_time
if abs(delta_time) < float_info.epsilon:
delta_time = context.scene.render.fps_base / float(context.scene.render.fps)
update_pose_bone_rotations(context, delta_time)
return {"FINISHED"}
if TYPE_CHECKING:
# This code is auto generated.
# To regenerate, run the `uv run tools/property_typing.py` command.
delta_time: float # type: ignore[no-redef]