Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b7f6632ea | |||
| 24b489f7a2 | |||
| 1e734a518e | |||
| 4b538cb8b2 | |||
| d85231b62b | |||
| b13ca15ece | |||
| 84bacca923 | |||
| 53d2ac10b7 | |||
| 95cb726485 | |||
| cb5b891d0d | |||
| aedd83e078 | |||
| 5719a55ae5 |
@@ -6,9 +6,6 @@ We are aware the wiki is down and are working on a new one, please don't report
|
||||
|
||||
Avatar Toolkit is a modern, Blender addon designed to streamline the process of preparing 3D avatars for virtual platforms including VRChat, ChilloutVR, Resonite, and other similar applications.
|
||||
|
||||
# No longer maintained by neoneko, neoneko has ceased all operations.
|
||||
# This fork is maintained by snipeslow to barely function as is. Good luck if you find this.
|
||||
|
||||
## What is Avatar Toolkit?
|
||||
Avatar Toolkit simplifies the workflow for avatar creation and optimization by providing an all-in-one solution that:
|
||||
- Automates complex optimization processes like mesh joining and vertex merging.
|
||||
@@ -36,8 +33,8 @@ See everything Avatar Toolkit has ot offer [here](https://avatartoolkit.xyz/lega
|
||||
## Requirements
|
||||
|
||||
1) Blender Version
|
||||
- Blender 5.0 or newer is required
|
||||
- Blender 5.0 is the current recommended version
|
||||
- Blender 4.5 or newer is required
|
||||
- Blender 4.5 is the current recommended version
|
||||
|
||||
2) Python Requirements
|
||||
- If using a custom Python installation with Blender, ensure NumPy is installed
|
||||
@@ -45,7 +42,7 @@ See everything Avatar Toolkit has ot offer [here](https://avatartoolkit.xyz/lega
|
||||
|
||||
3) Recommended Setup
|
||||
- Download Blender directly from https://blender.org
|
||||
- Use Blender 5.0 for the best experience
|
||||
- Use Blender 4.5 for the best experience
|
||||
|
||||
#### Unfortunately, due to the increased number of people complaining to me (yes, we get DMs about this) that AT or CATS is broken when it's not, we are going to have to be a bit more strict about which Blender releases we will provide support for.
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
schema_version = "1.0.0"
|
||||
|
||||
id = "avatar_toolkit"
|
||||
version = "0.5.5"
|
||||
version = "0.6.0"
|
||||
name = "Avatar Toolkit"
|
||||
tagline = "A modern tool for importing and optimizing models for VRChat, Resonite, and other similar games."
|
||||
maintainer = "Team NekoNeo"
|
||||
@@ -16,8 +16,10 @@ license = [
|
||||
]
|
||||
|
||||
wheels = [
|
||||
"./wheels/lz4-4.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
|
||||
"./wheels/lz4-4.4.5-cp313-cp313-win_amd64.whl"
|
||||
"./wheels/lz4-4.4.5-cp311-cp311-macosx_11_0_arm64.whl",
|
||||
"./wheels/lz4-4.4.5-cp311-cp311-macosx_10_9_x86_64.whl",
|
||||
"./wheels/lz4-4.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
|
||||
"./wheels/lz4-4.4.5-cp311-cp311-win_amd64.whl"
|
||||
]
|
||||
|
||||
[permissions]
|
||||
|
||||
@@ -174,6 +174,130 @@ physics_names: Dict[str, List[str]] = {
|
||||
"breast_tip": ["胸先", "むねさき", "ブレストティップ", "breasttip"],
|
||||
}
|
||||
|
||||
# MMD bone name patterns (for detection)
|
||||
mmd_bone_patterns: List[str] = [
|
||||
# Japanese bone names
|
||||
'全ての親', 'センター', '上半身', '下半身', '首', '頭',
|
||||
'右腕', '左腕', '右ひじ', '左ひじ', '右手首', '左手首',
|
||||
'右足', '左足', '右ひざ', '左ひざ', '右足首', '左足首',
|
||||
'両目', '左目', '右目', '右肩', '左肩',
|
||||
# English bone names (common in MMD exports)
|
||||
'center', 'groove', 'waist', 'upperbody', 'upperbody2', 'lowerbody',
|
||||
'neck', 'head',
|
||||
'shoulder_r', 'shoulder_l', 'arm_r', 'arm_l',
|
||||
'elbow_r', 'elbow_l', 'wrist_r', 'wrist_l',
|
||||
'leg_r', 'leg_l', 'knee_r', 'knee_l',
|
||||
'ankle_r', 'ankle_l', 'toe_r', 'toe_l',
|
||||
# Mixed/Romanized patterns
|
||||
'센터', 'グルーブ', 'ウエスト',
|
||||
# Common MMD suffixes
|
||||
'_r', '_l', '.r', '.l'
|
||||
]
|
||||
|
||||
# MMD to Unity bone mapping
|
||||
# Maps MMD bone names (after English translation) to Unity humanoid bone names
|
||||
mmd_to_unity_bone_map: Dict[str, Optional[str]] = {
|
||||
# Root and core
|
||||
"ParentNode": None, # Remove this
|
||||
"Center": "Hips",
|
||||
"センター": "Hips",
|
||||
"Groove": None, # Remove this
|
||||
"グルーブ": None,
|
||||
"Waist": None, # Will be merged into Hips
|
||||
|
||||
# Spine chain
|
||||
"LowerBody": "Hips",
|
||||
"下半身": "Hips",
|
||||
"UpperBody": "Spine",
|
||||
"上半身": "Spine",
|
||||
"UpperBody2": "Chest",
|
||||
"上半身2": "Chest",
|
||||
"Neck": "Neck",
|
||||
"首": "Neck",
|
||||
"Head": "Head",
|
||||
"頭": "Head",
|
||||
|
||||
# Right leg
|
||||
"RightLeg": "Right leg",
|
||||
"右足": "Right leg",
|
||||
"RightLegD": None, # Remove D variant
|
||||
"RightKnee": "Right knee",
|
||||
"右ひざ": "Right knee",
|
||||
"RightAnkle": "Right ankle",
|
||||
"右足首": "Right ankle",
|
||||
"RightToe": "Right toe",
|
||||
"右つま先": "Right toe",
|
||||
|
||||
# Left leg
|
||||
"LeftLeg": "Left leg",
|
||||
"左足": "Left leg",
|
||||
"LeftLegD": None, # Remove D variant
|
||||
"LeftKnee": "Left knee",
|
||||
"左ひざ": "Left knee",
|
||||
"LeftAnkle": "Left ankle",
|
||||
"左足首": "Left ankle",
|
||||
"LeftToe": "Left toe",
|
||||
"左つま先": "Left toe",
|
||||
|
||||
# Right arm
|
||||
"RightShoulder": "Right shoulder",
|
||||
"右肩": "Right shoulder",
|
||||
"RightArm": "Right arm",
|
||||
"右腕": "Right arm",
|
||||
"RightElbow": "Right elbow",
|
||||
"右ひじ": "Right elbow",
|
||||
"RightWrist": "Right wrist",
|
||||
"右手首": "Right wrist",
|
||||
|
||||
# Left arm
|
||||
"LeftShoulder": "Left shoulder",
|
||||
"左肩": "Left shoulder",
|
||||
"LeftArm": "Left arm",
|
||||
"左腕": "Left arm",
|
||||
"LeftElbow": "Left elbow",
|
||||
"左ひじ": "Left elbow",
|
||||
"LeftWrist": "Left wrist",
|
||||
"左手首": "Left wrist",
|
||||
|
||||
# Cancel/Helper bones (remove these)
|
||||
"WaistCancelRight": None,
|
||||
"WaistCancelLeft": None,
|
||||
"LegIKParentRight": None,
|
||||
"LegIKParentLeft": None,
|
||||
}
|
||||
|
||||
# Unity humanoid bone hierarchy
|
||||
# Defines parent-child relationships for Unity standard
|
||||
unity_bone_hierarchy: Dict[str, Optional[str]] = {
|
||||
"Hips": None, # Root bone
|
||||
"Spine": "Hips",
|
||||
"Chest": "Spine",
|
||||
"Neck": "Chest",
|
||||
"Head": "Neck",
|
||||
|
||||
# Arms
|
||||
"Left shoulder": "Chest",
|
||||
"Left arm": "Left shoulder",
|
||||
"Left elbow": "Left arm",
|
||||
"Left wrist": "Left elbow",
|
||||
|
||||
"Right shoulder": "Chest",
|
||||
"Right arm": "Right shoulder",
|
||||
"Right elbow": "Right arm",
|
||||
"Right wrist": "Right elbow",
|
||||
|
||||
# Legs
|
||||
"Left leg": "Hips",
|
||||
"Left knee": "Left leg",
|
||||
"Left ankle": "Left knee",
|
||||
"Left toe": "Left ankle",
|
||||
|
||||
"Right leg": "Hips",
|
||||
"Right knee": "Right leg",
|
||||
"Right ankle": "Right knee",
|
||||
"Right toe": "Right ankle",
|
||||
}
|
||||
|
||||
# Create reverse lookup dictionaries
|
||||
reverse_shapekey_lookup: Dict[str, str] = {}
|
||||
reverse_material_lookup: Dict[str, str] = {}
|
||||
|
||||
@@ -735,6 +735,67 @@ class AvatarToolkitSceneProperties(PropertyGroup):
|
||||
default=True
|
||||
)
|
||||
|
||||
# MMD Conversion Properties
|
||||
mmd_make_parent: BoolProperty(
|
||||
name=t("MMD.make_armature_parent"),
|
||||
description="Remove parent Empty object and make armature the main parent",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_rename_armature: BoolProperty(
|
||||
name=t("MMD.rename_to_armature"),
|
||||
description="Rename the armature object to 'Armature'",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_translate_names: BoolProperty(
|
||||
name=t("MMD.translate_names"),
|
||||
description="Translate Japanese names to English using MMD dictionary and translation services",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_translate_bones: BoolProperty(
|
||||
name=t("MMD.translate_bones"),
|
||||
description="Translate bone names",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_translate_materials: BoolProperty(
|
||||
name=t("MMD.translate_materials"),
|
||||
description="Translate material names",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_translate_shapekeys: BoolProperty(
|
||||
name=t("MMD.translate_shapekeys"),
|
||||
description="Translate shape key names",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_translate_objects: BoolProperty(
|
||||
name=t("MMD.translate_objects"),
|
||||
description="Translate object names",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_restructure_bones: BoolProperty(
|
||||
name=t("MMD.restructure_bones"),
|
||||
description="Restructure bone hierarchy to Unity humanoid format (Hips, Spine, Chest, etc.)",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_remove_twist_bones: BoolProperty(
|
||||
name=t("MMD.remove_twist_bones"),
|
||||
description="Remove twist bones",
|
||||
default=True
|
||||
)
|
||||
|
||||
mmd_remove_zero_weight_bones: BoolProperty(
|
||||
name=t("MMD.remove_zero_weight_bones"),
|
||||
description="Remove bones with zero or near-zero vertex weights",
|
||||
default=False
|
||||
)
|
||||
|
||||
# Translation System Properties
|
||||
translation_service: EnumProperty(
|
||||
name=t("Translation.service"),
|
||||
|
||||
+3
-3
@@ -15,12 +15,12 @@ from .addon_preferences import get_preference, get_current_version, save_prefere
|
||||
from ..ui.main_panel import AvatarToolKit_PT_AvatarToolkitPanel, CATEGORY_NAME
|
||||
from typing import Dict, List, Tuple, Optional, Set, Any
|
||||
|
||||
GITHUB_REPO = "snipeslow/Avatar-Toolkit"
|
||||
GITHUB_REPO = "teamneoneko/Avatar-Toolkit"
|
||||
|
||||
# Define which version series this installation can update to
|
||||
# For example: ["0.1"] means only look for 0.1.x updates
|
||||
# ["0.2", "0.3"] would look for both 0.2.x and 0.3.x
|
||||
ALLOWED_VERSION_SERIES = ["0.5"]
|
||||
ALLOWED_VERSION_SERIES = ["0.6"]
|
||||
|
||||
is_checking_for_update: bool = False
|
||||
update_needed: bool = False
|
||||
@@ -158,7 +158,7 @@ def get_github_releases() -> bool:
|
||||
|
||||
try:
|
||||
ssl._create_default_https_context = ssl._create_unverified_context
|
||||
with request.urlopen(f'https://git.snipeslow.dev/api/v1/repos/{GITHUB_REPO}/releases') as url:
|
||||
with request.urlopen(f'https://api.github.com/repos/{GITHUB_REPO}/releases') as url:
|
||||
data = json.loads(url.read().decode())
|
||||
except error.URLError:
|
||||
print('URL ERROR')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"authors": ["Avatar Toolkit Team"],
|
||||
"messages": {
|
||||
"AvatarToolkit.label": "Avatar Toolkit (Alpha 0.5.2)",
|
||||
"AvatarToolkit.label": "Avatar Toolkit (Alpha 0.6.0)",
|
||||
"AvatarToolkit.desc1": "Avatar Toolkit is in Early Access there",
|
||||
"AvatarToolkit.desc2": "will be issues, if you find any issues,",
|
||||
"AvatarToolkit.desc3": "please report it on our Github.",
|
||||
@@ -601,6 +601,79 @@
|
||||
"VRM.remove_root": "Remove Root Bone",
|
||||
"VRM.remove_root_desc": "Remove unnecessary VRM root bone and make Hips the root bone",
|
||||
|
||||
"MMD.panel.label": "MMD Converter",
|
||||
"MMD.converter.title": "MMD Armature Converter",
|
||||
"MMD.no_armature_selected": "No armature selected",
|
||||
"MMD.select_armature_to_convert": "Select an armature to convert",
|
||||
"MMD.armature_name": "Armature: {name}",
|
||||
"MMD.armature_detected": "MMD armature detected",
|
||||
"MMD.no_mmd_bones_detected": "No MMD bones detected",
|
||||
"MMD.not_mmd_armature": "Selected armature does not appear to be MMD format",
|
||||
"MMD.make_armature_parent": "Make Armature Main Parent",
|
||||
"MMD.rename_to_armature": "Rename to 'Armature'",
|
||||
"MMD.translate_names": "Translate Names to English",
|
||||
"MMD.translate_bones": "Bones",
|
||||
"MMD.translate_materials": "Materials",
|
||||
"MMD.translate_shapekeys": "Shape Keys",
|
||||
"MMD.translate_objects": "Objects",
|
||||
"MMD.restructure_bones": "Restructure to Unity Format",
|
||||
"MMD.bone_cleanup": "Bone Cleanup Options:",
|
||||
"MMD.remove_ik_bones": "Remove IK Bones",
|
||||
"MMD.remove_twist_bones": "Remove Twist Bones",
|
||||
"MMD.remove_zero_weight_bones": "Remove Zero Weight Bones",
|
||||
"MMD.translation_options": "Translation Options:",
|
||||
"MMD.convert_armature_button": "Convert MMD Armature",
|
||||
"MMD.convert_armature.label": "Convert MMD Armature",
|
||||
"MMD.convert_armature.desc": "Convert MMD armature to standard Blender format",
|
||||
"MMD.conversion_info.title": "Conversion Info:",
|
||||
"MMD.conversion_info.removes_parent": "• Removes parent Empty object",
|
||||
"MMD.conversion_info.renames_armature": "• Renames armature to 'Armature'",
|
||||
"MMD.conversion_info.restructures_bones": "• Converts to Unity bone structure (Hips/Spine/Chest)",
|
||||
"MMD.conversion_info.removes_ik_bones": "• Removes IK (Inverse Kinematics) bones",
|
||||
"MMD.conversion_info.removes_twist_bones": "• Removes twist bones",
|
||||
"MMD.conversion_info.removes_zero_weight_bones": "• Removes bones with zero vertex weights",
|
||||
"MMD.conversion_info.maintains_hierarchy": "• Maintains object hierarchy",
|
||||
"MMD.conversion_info.translates_names": "• Translates Japanese names to English",
|
||||
"MMD.detection_failed.title": "MMD Detection Failed:",
|
||||
"MMD.detection_failed.not_mmd_format": "• Selected armature is not MMD format",
|
||||
"MMD.detection_failed.need_mmd_bones": "• Need at least 5 MMD bones detected",
|
||||
"MMD.detection_failed.check_bone_names": "• Check armature bone names",
|
||||
"MMD.error.invalid_armature": "Invalid armature object",
|
||||
"MMD.error.not_mmd_armature": "Armature does not appear to be MMD format",
|
||||
"MMD.error.rename_failed": "Failed to rename armature: {error}",
|
||||
"MMD.armature_already_root": "Armature already has no parent",
|
||||
"MMD.armature_already_named": "Armature is already named 'Armature'",
|
||||
"MMD.parent_removed_and_reparented": "Removed parent '{parent_name}' and reparented {count} objects to armature",
|
||||
"MMD.parent_unlinked_and_reparented": "Unlinked from parent '{parent_name}' and reparented {count} objects",
|
||||
"MMD.parent_unlinked": "Unlinked armature from parent '{parent_name}'",
|
||||
"MMD.armature_renamed": "Renamed armature from '{old_name}' to '{new_name}'",
|
||||
"MMD.armature_renamed_with_suffix": "Renamed armature from '{old_name}' to '{new_name}' (name collision)",
|
||||
"MMD.conversion_complete": "MMD armature conversion completed successfully",
|
||||
"MMD.translation_starting": "Starting name translation...",
|
||||
"MMD.bones_translated": "Translated {count} bones",
|
||||
"MMD.bones_failed": "Failed to translate {count} bones",
|
||||
"MMD.materials_translated": "Translated {count} materials",
|
||||
"MMD.materials_failed": "Failed to translate {count} materials",
|
||||
"MMD.shapekeys_translated": "Translated {count} shape keys",
|
||||
"MMD.shapekeys_failed": "Failed to translate {count} shape keys",
|
||||
"MMD.objects_translated": "Translated {count} objects",
|
||||
"MMD.objects_failed": "Failed to translate {count} objects",
|
||||
"MMD.translation_complete": "Translation complete: {total} items translated",
|
||||
"MMD.restructure_starting": "Restructuring bones to Unity format...",
|
||||
"MMD.bones_restructured": "Restructured {count} bones to Unity format",
|
||||
"MMD.bones_removed": "Removed {count} unnecessary bones",
|
||||
"MMD.bones_reparented": "Reparented {count} bones",
|
||||
"MMD.restructure_failed": "Bone restructuring failed: {error}",
|
||||
"MMD.ik_bones_removed": "Removed {count} IK bones",
|
||||
"MMD.no_ik_bones_found": "No IK bones found to remove",
|
||||
"MMD.ik_removal_failed": "IK bone removal failed: {error}",
|
||||
"MMD.twist_bones_removed": "Removed {count} twist bones",
|
||||
"MMD.no_twist_bones_found": "No twist bones found to remove",
|
||||
"MMD.twist_removal_failed": "Twist bone removal failed: {error}",
|
||||
"MMD.zero_weight_bones_removed": "Removed {count} zero weight bones",
|
||||
"MMD.no_zero_weight_bones_found": "No zero weight bones found to remove",
|
||||
"MMD.zero_weight_removal_failed": "Zero weight bone removal failed: {error}",
|
||||
|
||||
"Translation.label": "Translation",
|
||||
"Translation.service": "Translation Service",
|
||||
"Translation.service_desc": "Choose the translation service to use",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"authors": ["Avatar Toolkit Team"],
|
||||
"messages": {
|
||||
"AvatarToolkit.label": "アバターツールキット (アルファ 0.5.2)",
|
||||
"AvatarToolkit.label": "アバターツールキット (アルファ 0.6.0)",
|
||||
"AvatarToolkit.desc1": "アバターツールキットは早期アクセス中であり、",
|
||||
"AvatarToolkit.desc2": "問題が発生する可能性があります。問題を見つけた場合は、",
|
||||
"AvatarToolkit.desc3": "GitHubで報告してください。",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"authors": ["Avatar Toolkit Team"],
|
||||
"messages": {
|
||||
"AvatarToolkit.label": "아바타 툴킷 (알파 0.5.2)",
|
||||
"AvatarToolkit.label": "아바타 툴킷 (알파 0.6.0)",
|
||||
"AvatarToolkit.desc1": "아바타 툴킷은 초기 액세스 단계에 있으므로",
|
||||
"AvatarToolkit.desc2": "문제가 있을 수 있습니다. 문제를 발견하시면",
|
||||
"AvatarToolkit.desc3": "Github에 보고해 주세요.",
|
||||
|
||||
+4
-1
@@ -14,7 +14,8 @@ VISEMES_ORDER = 6
|
||||
EYE_TRACKING_ORDER = 7
|
||||
TEXTURE_ATLAS_ORDER = 8
|
||||
VRM_UNITY_ORDER = 9
|
||||
SETTINGS_ORDER = 10
|
||||
MMD_ORDER = 10
|
||||
SETTINGS_ORDER = 11
|
||||
|
||||
# Panel open/closed by default
|
||||
PANELS_OPEN_BY_DEFAULT = {
|
||||
@@ -27,6 +28,7 @@ PANELS_OPEN_BY_DEFAULT = {
|
||||
'EYE_TRACKING': True,
|
||||
'TEXTURE_ATLAS': True,
|
||||
'VRM_UNITY': True,
|
||||
'MMD': True,
|
||||
'SETTINGS': True,
|
||||
'TRANSLATION': True,
|
||||
}
|
||||
@@ -44,6 +46,7 @@ def get_panel_order(panel_name: str) -> int:
|
||||
'eye_tracking': EYE_TRACKING_ORDER,
|
||||
'texture_atlas': TEXTURE_ATLAS_ORDER,
|
||||
'vrm_unity': VRM_UNITY_ORDER,
|
||||
'mmd': MMD_ORDER,
|
||||
'settings': SETTINGS_ORDER,
|
||||
}
|
||||
return order_map.get(panel_name.lower(), 99)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user