Compare commits

...

11 Commits

Author SHA1 Message Date
snipeslow 1f6b33c2a1 Update blender_manifest.toml 2026-05-20 23:31:24 -05:00
snipeslow f4593f6846 Windows and Linux only Wheels. 2026-05-20 23:28:03 -05:00
snipeslow 4106ff2c94 Update README.md 2026-05-20 18:20:02 -05:00
snipeslow 2ffb8fb1f1 Update blender_manifest.toml 2026-05-20 18:13:36 -05:00
snipeslow 78200ab935 Update blender_manifest.toml 2026-05-20 18:13:13 -05:00
snipeslow 0881ed3831 Upload files to "wheels" 2026-05-20 18:12:48 -05:00
snipeslow 3ce1bc2ab3 Update core/updater.py 2026-05-20 17:51:34 -05:00
RinaDev 63460cf5a2 Update README.md 2026-02-07 23:03:58 +01:00
Yusarina cde0457ee1 Bump version to 0.5.3 in blender_manifest.toml 2025-12-09 02:52:17 +00:00
Yusarina 4ff17a66fe Update Blender version requirements to 5.0 2025-12-09 02:33:04 +00:00
Yusarina 8222f8b24c Delete CHANGELOG_NON_ASCII_FIX.md 2025-12-09 02:31:02 +00:00
10 changed files with 11 additions and 89 deletions
-79
View File
@@ -1,79 +0,0 @@
# Fix for Garbled Japanese/Non-ASCII Text in Dropdowns
## Problem
Japanese, Korean, Chinese, and other non-ASCII characters were displaying as garbled/corrupted text in dropdown menus for:
- Armature selection in Quick Access panel
- Mesh selection in Visemes panel
This is a known issue with Blender's EnumProperty system when using dynamic callbacks that return Unicode strings.
## Root Cause
Blender's EnumProperty RNA system can have encoding issues when:
1. The enum items function is called multiple times with changing data
2. Unicode strings in display names aren't properly cached
3. The internal C API receives the same Python string object in different states
## Solution
Implemented proper caching with invalidation for EnumProperty items:
### Changes Made
1. **core/common.py** - Enhanced `get_armature_list()` function
- Added cache key based on (name, pointer) tuples
- Cache is invalidated only when actual objects change
- Prevents Blender from re-encoding strings on every access
- Added `clear_enum_caches()` helper function
2. **core/properties.py** - Enhanced `get_mesh_objects()` function
- Added same caching mechanism as armature list
- Cache key based on mesh objects (name, pointer)
- Stable cache prevents encoding corruption
3. **core/common.py** - `get_mesh_from_identifier()` helper
- Converts safe identifier back to mesh object
- Handles both new format (`MESH_{pointer}`) and legacy format
- Returns None if mesh not found
4. **ui/visemes_panel.py** - Updated mesh retrieval
- Uses `get_mesh_from_identifier()` instead of direct lookup
5. **functions/visemes.py** - Updated all mesh access points
- All operators now use the helper function consistently
## Technical Details
### ASCII-Safe Identifiers
- Dropdown identifier: `ARM_{memory_pointer}` or `MESH_{memory_pointer}` (ASCII-safe, unique)
- Dropdown display: Original object name (preserves Unicode characters)
- Backwards compatibility: Falls back to direct name lookup
### Caching Strategy
The cache uses function attributes to store:
- `_cache_key`: Tuple of (name, pointer) for all relevant objects
- `_cached_items`: The actual list of enum items
Cache is invalidated when:
- Objects are added/removed
- Objects are renamed
- Object pointers change (object recreated)
This ensures Blender's RNA system receives the exact same Python string objects on subsequent calls, preventing encoding corruption.
## Testing
To verify the fix works:
1. Create armature/mesh objects with Japanese/Korean/Chinese names (e.g., "アバター", "아바타", "化身")
2. Open Quick Access panel - armature dropdown should display correctly
3. Open Visemes panel - mesh dropdown should display correctly
4. Select items - operations should work with the selected objects
5. Rename objects - dropdowns should update and still display correctly
## Related Files
- `core/properties.py` - Property definitions and mesh enumeration
- `core/common.py` - Common utility functions and armature enumeration
- `ui/visemes_panel.py` - Visemes UI panel
- `ui/quick_access_panel.py` - Quick Access UI panel
- `functions/visemes.py` - Viseme operators
## Note on prop_search
The `prop_search` widget used for shape key/bone selection inherently handles non-ASCII characters correctly since it searches Blender's internal data structures directly, not custom enum properties.
+6 -3
View File
@@ -6,6 +6,9 @@ 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. 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? ## What is Avatar Toolkit?
Avatar Toolkit simplifies the workflow for avatar creation and optimization by providing an all-in-one solution that: 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. - Automates complex optimization processes like mesh joining and vertex merging.
@@ -33,8 +36,8 @@ See everything Avatar Toolkit has ot offer [here](https://avatartoolkit.xyz/lega
## Requirements ## Requirements
1) Blender Version 1) Blender Version
- Blender 4.5 or newer is required - Blender 5.0 or newer is required
- Blender 4.5 is the current recommended version - Blender 5.0 is the current recommended version
2) Python Requirements 2) Python Requirements
- If using a custom Python installation with Blender, ensure NumPy is installed - If using a custom Python installation with Blender, ensure NumPy is installed
@@ -42,7 +45,7 @@ See everything Avatar Toolkit has ot offer [here](https://avatartoolkit.xyz/lega
3) Recommended Setup 3) Recommended Setup
- Download Blender directly from https://blender.org - Download Blender directly from https://blender.org
- Use Blender 4.5 for the best experience - Use Blender 5.0 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. #### 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 -5
View File
@@ -3,7 +3,7 @@
schema_version = "1.0.0" schema_version = "1.0.0"
id = "avatar_toolkit" id = "avatar_toolkit"
version = "0.5.2" version = "0.5.5"
name = "Avatar Toolkit" name = "Avatar Toolkit"
tagline = "A modern tool for importing and optimizing models for VRChat, Resonite, and other similar games." tagline = "A modern tool for importing and optimizing models for VRChat, Resonite, and other similar games."
maintainer = "Team NekoNeo" maintainer = "Team NekoNeo"
@@ -16,10 +16,8 @@ license = [
] ]
wheels = [ wheels = [
"./wheels/lz4-4.4.5-cp311-cp311-macosx_11_0_arm64.whl", "./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-cp311-cp311-macosx_10_9_x86_64.whl", "./wheels/lz4-4.4.5-cp313-cp313-win_amd64.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] [permissions]
+2 -2
View File
@@ -15,7 +15,7 @@ from .addon_preferences import get_preference, get_current_version, save_prefere
from ..ui.main_panel import AvatarToolKit_PT_AvatarToolkitPanel, CATEGORY_NAME from ..ui.main_panel import AvatarToolKit_PT_AvatarToolkitPanel, CATEGORY_NAME
from typing import Dict, List, Tuple, Optional, Set, Any from typing import Dict, List, Tuple, Optional, Set, Any
GITHUB_REPO = "teamneoneko/Avatar-Toolkit" GITHUB_REPO = "snipeslow/Avatar-Toolkit"
# Define which version series this installation can update to # Define which version series this installation can update to
# For example: ["0.1"] means only look for 0.1.x updates # For example: ["0.1"] means only look for 0.1.x updates
@@ -158,7 +158,7 @@ def get_github_releases() -> bool:
try: try:
ssl._create_default_https_context = ssl._create_unverified_context ssl._create_default_https_context = ssl._create_unverified_context
with request.urlopen(f'https://api.github.com/repos/{GITHUB_REPO}/releases') as url: with request.urlopen(f'https://git.snipeslow.dev/api/v1/repos/{GITHUB_REPO}/releases') as url:
data = json.loads(url.read().decode()) data = json.loads(url.read().decode())
except error.URLError: except error.URLError:
print('URL ERROR') print('URL ERROR')
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.