@volter/blender-engine 0.1.148 → 0.1.150

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/LICENSE +22 -5
  2. package/README.md +4 -11
  3. package/browser/addons/vrm/LICENSE_(OPTION1)_MIT.txt +22 -0
  4. package/browser/addons/vrm/LICENSE_(OPTION2)_GPL-3_0.txt +674 -0
  5. package/browser/addons/vrm/LICENSE_MAIN.txt +1 -0
  6. package/browser/addons/vrm/README.txt +3 -0
  7. package/browser/addons/vrm/__init__.py +41 -0
  8. package/browser/addons/vrm/blender_manifest.toml +16 -0
  9. package/browser/addons/vrm/common/__init__.py +1 -0
  10. package/browser/addons/vrm/common/animation.py +58 -0
  11. package/browser/addons/vrm/common/blender_manifest.py +82 -0
  12. package/browser/addons/vrm/common/char.py +16 -0
  13. package/browser/addons/vrm/common/convert.py +287 -0
  14. package/browser/addons/vrm/common/convert_any.py +48 -0
  15. package/browser/addons/vrm/common/debug.py +40 -0
  16. package/browser/addons/vrm/common/deep.py +162 -0
  17. package/browser/addons/vrm/common/error_dialog.py +274 -0
  18. package/browser/addons/vrm/common/fs.py +71 -0
  19. package/browser/addons/vrm/common/gl.py +20 -0
  20. package/browser/addons/vrm/common/gltf.py +1149 -0
  21. package/browser/addons/vrm/common/human_bone_mapper/__init__.py +1 -0
  22. package/browser/addons/vrm/common/human_bone_mapper/biped_mapping.py +84 -0
  23. package/browser/addons/vrm/common/human_bone_mapper/cats_blender_plugin_fix_model_mapping.py +63 -0
  24. package/browser/addons/vrm/common/human_bone_mapper/human_bone_mapper.py +203 -0
  25. package/browser/addons/vrm/common/human_bone_mapper/microsoft_rocketbox_mapping.py +69 -0
  26. package/browser/addons/vrm/common/human_bone_mapper/mixamo_mapping.py +62 -0
  27. package/browser/addons/vrm/common/human_bone_mapper/mmd_mapping.py +115 -0
  28. package/browser/addons/vrm/common/human_bone_mapper/mpfb_mapping.py +120 -0
  29. package/browser/addons/vrm/common/human_bone_mapper/ready_player_me_mapping.py +65 -0
  30. package/browser/addons/vrm/common/human_bone_mapper/reallusion_mapping.py +94 -0
  31. package/browser/addons/vrm/common/human_bone_mapper/rigify_meta_rig_mapping.py +65 -0
  32. package/browser/addons/vrm/common/human_bone_mapper/structure_based_mapping.py +891 -0
  33. package/browser/addons/vrm/common/human_bone_mapper/unreal_mapping.py +62 -0
  34. package/browser/addons/vrm/common/human_bone_mapper/vrm_addon_mapping.py +112 -0
  35. package/browser/addons/vrm/common/human_bone_mapper/vroid_mapping.py +89 -0
  36. package/browser/addons/vrm/common/legacy_gltf.py +16 -0
  37. package/browser/addons/vrm/common/logger.py +84 -0
  38. package/browser/addons/vrm/common/mtoon0.blend +0 -0
  39. package/browser/addons/vrm/common/mtoon1.blend +0 -0
  40. package/browser/addons/vrm/common/mtoon1_outline.blend +0 -0
  41. package/browser/addons/vrm/common/mtoon_auto_setup.blend +0 -0
  42. package/browser/addons/vrm/common/mtoon_unversioned.py +62 -0
  43. package/browser/addons/vrm/common/ops/__init__.py +10 -0
  44. package/browser/addons/vrm/common/ops/export_scene.py +67 -0
  45. package/browser/addons/vrm/common/ops/icyp.py +53 -0
  46. package/browser/addons/vrm/common/ops/import_scene.py +57 -0
  47. package/browser/addons/vrm/common/ops/vrm.py +2380 -0
  48. package/browser/addons/vrm/common/ops/wm.py +167 -0
  49. package/browser/addons/vrm/common/preferences.py +362 -0
  50. package/browser/addons/vrm/common/progress.py +87 -0
  51. package/browser/addons/vrm/common/rotation.py +89 -0
  52. package/browser/addons/vrm/common/safe_removal.py +46 -0
  53. package/browser/addons/vrm/common/scene_watcher.py +230 -0
  54. package/browser/addons/vrm/common/shader.py +2243 -0
  55. package/browser/addons/vrm/common/shape_key_mapper/__init__.py +1 -0
  56. package/browser/addons/vrm/common/shape_key_mapper/arkit_mapping.py +168 -0
  57. package/browser/addons/vrm/common/shape_key_mapper/mmd_mapping.py +62 -0
  58. package/browser/addons/vrm/common/shape_key_mapper/ready_player_me_mapping.py +52 -0
  59. package/browser/addons/vrm/common/shape_key_mapper/vrchat_mapping.py +17 -0
  60. package/browser/addons/vrm/common/third_party_user_extension.py +214 -0
  61. package/browser/addons/vrm/common/transparent_z_write.blend +0 -0
  62. package/browser/addons/vrm/common/version.py +161 -0
  63. package/browser/addons/vrm/common/vrm0/__init__.py +1 -0
  64. package/browser/addons/vrm/common/vrm0/human_bone.py +662 -0
  65. package/browser/addons/vrm/common/vrm0/material_property.py +346 -0
  66. package/browser/addons/vrm/common/vrm1/__init__.py +1 -0
  67. package/browser/addons/vrm/common/vrm1/expression_preset.py +207 -0
  68. package/browser/addons/vrm/common/vrm1/human_bone.py +822 -0
  69. package/browser/addons/vrm/common/workspace.py +227 -0
  70. package/browser/addons/vrm/common/writable_context.py +77 -0
  71. package/browser/addons/vrm/documentation/en-us/animation/index.md +63 -0
  72. package/browser/addons/vrm/documentation/en-us/create-humanoid-vrm-from-scratch/index.md +131 -0
  73. package/browser/addons/vrm/documentation/en-us/create-simple-vrm-from-scratch/index.md +30 -0
  74. package/browser/addons/vrm/documentation/en-us/development/index.md +136 -0
  75. package/browser/addons/vrm/documentation/en-us/index.md +41 -0
  76. package/browser/addons/vrm/documentation/en-us/installation/index.md +152 -0
  77. package/browser/addons/vrm/documentation/en-us/material-mtoon/index.md +122 -0
  78. package/browser/addons/vrm/documentation/en-us/material-pbr/index.md +94 -0
  79. package/browser/addons/vrm/documentation/en-us/scripting-api/index.md +391 -0
  80. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrm/index.md +57 -0
  81. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrma/index.md +17 -0
  82. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrm/index.md +61 -0
  83. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrma/index.md +13 -0
  84. package/browser/addons/vrm/documentation/ja-jp/animation/index.md +57 -0
  85. package/browser/addons/vrm/documentation/ja-jp/create-humanoid-vrm-from-scratch/index.md +129 -0
  86. package/browser/addons/vrm/documentation/ja-jp/create-simple-vrm-from-scratch/index.md +29 -0
  87. package/browser/addons/vrm/documentation/ja-jp/development/index.md +137 -0
  88. package/browser/addons/vrm/documentation/ja-jp/index.md +37 -0
  89. package/browser/addons/vrm/documentation/ja-jp/installation/index.md +150 -0
  90. package/browser/addons/vrm/documentation/ja-jp/material-mtoon/index.md +113 -0
  91. package/browser/addons/vrm/documentation/ja-jp/material-pbr/index.md +90 -0
  92. package/browser/addons/vrm/documentation/ja-jp/scripting-api/index.md +389 -0
  93. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrm/index.md +55 -0
  94. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrma/index.md +19 -0
  95. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrm/index.md +56 -0
  96. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrma/index.md +14 -0
  97. package/browser/addons/vrm/editor/__init__.py +1 -0
  98. package/browser/addons/vrm/editor/extension.py +425 -0
  99. package/browser/addons/vrm/editor/extension_accessor.py +75 -0
  100. package/browser/addons/vrm/editor/handler.py +84 -0
  101. package/browser/addons/vrm/editor/khr_character/__init__.py +1 -0
  102. package/browser/addons/vrm/editor/khr_character/panel.py +69 -0
  103. package/browser/addons/vrm/editor/khr_character/property_group.py +27 -0
  104. package/browser/addons/vrm/editor/khr_xmp_json_ld/__init__.py +1 -0
  105. package/browser/addons/vrm/editor/khr_xmp_json_ld/ops.py +464 -0
  106. package/browser/addons/vrm/editor/khr_xmp_json_ld/panel.py +136 -0
  107. package/browser/addons/vrm/editor/khr_xmp_json_ld/property_group.py +83 -0
  108. package/browser/addons/vrm/editor/khr_xmp_json_ld/ui_list.py +198 -0
  109. package/browser/addons/vrm/editor/make_armature.py +709 -0
  110. package/browser/addons/vrm/editor/menu.py +147 -0
  111. package/browser/addons/vrm/editor/migration.py +297 -0
  112. package/browser/addons/vrm/editor/mtoon1/__init__.py +1 -0
  113. package/browser/addons/vrm/editor/mtoon1/handler.py +20 -0
  114. package/browser/addons/vrm/editor/mtoon1/migration.py +536 -0
  115. package/browser/addons/vrm/editor/mtoon1/ops.py +304 -0
  116. package/browser/addons/vrm/editor/mtoon1/panel.py +442 -0
  117. package/browser/addons/vrm/editor/mtoon1/property_group.py +4977 -0
  118. package/browser/addons/vrm/editor/mtoon1/scene_watcher.py +381 -0
  119. package/browser/addons/vrm/editor/node_constraint1/__init__.py +1 -0
  120. package/browser/addons/vrm/editor/node_constraint1/panel.py +317 -0
  121. package/browser/addons/vrm/editor/node_constraint1/property_group.py +25 -0
  122. package/browser/addons/vrm/editor/ops.py +471 -0
  123. package/browser/addons/vrm/editor/panel.py +315 -0
  124. package/browser/addons/vrm/editor/property_group.py +888 -0
  125. package/browser/addons/vrm/editor/search.py +682 -0
  126. package/browser/addons/vrm/editor/spring_bone1/__init__.py +1 -0
  127. package/browser/addons/vrm/editor/spring_bone1/handler.py +994 -0
  128. package/browser/addons/vrm/editor/spring_bone1/menu.py +246 -0
  129. package/browser/addons/vrm/editor/spring_bone1/migration.py +86 -0
  130. package/browser/addons/vrm/editor/spring_bone1/ops.py +1679 -0
  131. package/browser/addons/vrm/editor/spring_bone1/panel.py +605 -0
  132. package/browser/addons/vrm/editor/spring_bone1/property_group.py +1457 -0
  133. package/browser/addons/vrm/editor/spring_bone1/ui_list.py +408 -0
  134. package/browser/addons/vrm/editor/subscription.py +123 -0
  135. package/browser/addons/vrm/editor/t_pose.py +713 -0
  136. package/browser/addons/vrm/editor/validation.py +1271 -0
  137. package/browser/addons/vrm/editor/vrm0/__init__.py +1 -0
  138. package/browser/addons/vrm/editor/vrm0/gizmo_group.py +63 -0
  139. package/browser/addons/vrm/editor/vrm0/handler.py +23 -0
  140. package/browser/addons/vrm/editor/vrm0/menu.py +145 -0
  141. package/browser/addons/vrm/editor/vrm0/migration.py +761 -0
  142. package/browser/addons/vrm/editor/vrm0/ops.py +2145 -0
  143. package/browser/addons/vrm/editor/vrm0/panel.py +1333 -0
  144. package/browser/addons/vrm/editor/vrm0/property_group.py +1818 -0
  145. package/browser/addons/vrm/editor/vrm0/ui_list.py +688 -0
  146. package/browser/addons/vrm/editor/vrm1/__init__.py +1 -0
  147. package/browser/addons/vrm/editor/vrm1/handler.py +28 -0
  148. package/browser/addons/vrm/editor/vrm1/menu.py +76 -0
  149. package/browser/addons/vrm/editor/vrm1/migration.py +321 -0
  150. package/browser/addons/vrm/editor/vrm1/ops.py +2679 -0
  151. package/browser/addons/vrm/editor/vrm1/panel.py +1243 -0
  152. package/browser/addons/vrm/editor/vrm1/property_group.py +2087 -0
  153. package/browser/addons/vrm/editor/vrm1/scene_watcher.py +90 -0
  154. package/browser/addons/vrm/editor/vrm1/ui_list.py +533 -0
  155. package/browser/addons/vrm/exporter/__init__.py +1 -0
  156. package/browser/addons/vrm/exporter/abstract_base_vrm_exporter.py +628 -0
  157. package/browser/addons/vrm/exporter/export_scene.py +930 -0
  158. package/browser/addons/vrm/exporter/gltf2_export_user_extension.py +45 -0
  159. package/browser/addons/vrm/exporter/khr_character_exporter.py +34 -0
  160. package/browser/addons/vrm/exporter/vrm0_exporter.py +4020 -0
  161. package/browser/addons/vrm/exporter/vrm1_exporter.py +3682 -0
  162. package/browser/addons/vrm/exporter/vrm_animation_exporter.py +1035 -0
  163. package/browser/addons/vrm/external/__init__.py +1 -0
  164. package/browser/addons/vrm/external/auto_rig_pro_support.py +3 -0
  165. package/browser/addons/vrm/external/io_scene_gltf2_support.py +418 -0
  166. package/browser/addons/vrm/external/rigify_support.py +1 -0
  167. package/browser/addons/vrm/importer/__init__.py +1 -0
  168. package/browser/addons/vrm/importer/abstract_base_vrm_importer.py +1548 -0
  169. package/browser/addons/vrm/importer/file_handler.py +34 -0
  170. package/browser/addons/vrm/importer/gltf2_import_user_extension.py +268 -0
  171. package/browser/addons/vrm/importer/import_scene.py +646 -0
  172. package/browser/addons/vrm/importer/license_validation.py +198 -0
  173. package/browser/addons/vrm/importer/vrm0_importer.py +1723 -0
  174. package/browser/addons/vrm/importer/vrm1_importer.py +2014 -0
  175. package/browser/addons/vrm/importer/vrm_animation_importer.py +763 -0
  176. package/browser/addons/vrm/importer/vrm_diff.py +316 -0
  177. package/browser/addons/vrm/locale/__init__.py +1 -0
  178. package/browser/addons/vrm/locale/ja_jp.py +826 -0
  179. package/browser/addons/vrm/locale/ruff.toml +8 -0
  180. package/browser/addons/vrm/locale/translation_dictionary.py +10 -0
  181. package/browser/addons/vrm/locale/zh_hans.py +928 -0
  182. package/browser/addons/vrm/registration.py +670 -0
  183. package/browser/addons/vrm.json +18 -0
  184. package/browser/blender-emscripten-engine.mts +66 -129
  185. package/browser/blender-engine.mts +20 -186
  186. package/browser/blender-wali-engine.mts +37 -81
  187. package/browser/describe-thrown.mts +3 -6
  188. package/browser/document-chunks.mts +4 -16
  189. package/browser/gltf_export.py +3161 -0
  190. package/browser/heap-growth.mts +23 -0
  191. package/browser/index.ts +3 -0
  192. package/browser/protocol.ts +130 -43
  193. package/browser/pull-job.mts +2 -10
  194. package/browser/rna.ts +190 -73
  195. package/browser/runtime.ts +271 -106
  196. package/browser/session-addons.mts +33 -0
  197. package/browser/session-frame.mts +5 -24
  198. package/browser/session.py +1389 -1446
  199. package/browser/three/attach-presenter.ts +11 -39
  200. package/browser/three/blender-base64.ts +1 -36
  201. package/browser/three/blender-corner-normals.ts +1 -23
  202. package/browser/three/blender-display-shaders.json +1 -1
  203. package/browser/three/blender-display-shaders.lut +0 -0
  204. package/browser/three/blender-display-transform.ts +2 -1
  205. package/browser/three/blender-frame-columns.ts +5 -13
  206. package/browser/three/blender-graph-material.ts +18 -3
  207. package/browser/three/blender-node-graph.ts +10 -34
  208. package/browser/three/blender-physical-material.ts +2 -31
  209. package/browser/three/blender-runtime-armature.ts +7 -60
  210. package/browser/three/blender-runtime-frame.ts +9 -23
  211. package/browser/three/blender-runtime-geometry.ts +22 -26
  212. package/browser/three/blender-runtime-lighting.ts +48 -178
  213. package/browser/three/blender-runtime-shadows.ts +187 -1
  214. package/browser/three/blender-runtime-skeleton.ts +53 -1
  215. package/browser/three/blender-runtime-view.ts +492 -306
  216. package/browser/three/blender-runtime-weights.ts +9 -72
  217. package/browser/three/blender-sky.ts +13 -33
  218. package/browser/three/blender-triangulate.ts +7 -35
  219. package/browser/three/blender-viewport-sampling.ts +235 -0
  220. package/browser/three/blender-workbench-material.ts +25 -29
  221. package/browser/three/blender-workbench-outline.ts +199 -0
  222. package/browser/three/blender-world-volume.ts +62 -10
  223. package/browser/three/presenter.ts +10 -26
  224. package/browser/three/release.ts +5 -21
  225. package/browser/three/sky-precompute-worker.ts +1 -18
  226. package/browser/three/sky-worker.ts +5 -23
  227. package/browser/three/world-field-sampler.ts +12 -26
  228. package/browser/volter_three.py +9 -105
  229. package/browser/worker.ts +195 -180
  230. package/package.json +5 -2
  231. package/wasm/BUNDLE.json +17 -17
  232. package/wasm/DEPENDENCY-LICENSES.txt +14 -0
  233. package/wasm/blender_browser.data.br +0 -0
  234. package/wasm/blender_browser.js +1 -1
  235. package/wasm/blender_browser.wasm.br +0 -0
  236. package/browser/frame-transfer.mts +0 -19
  237. package/browser/three/agx-base-srgb.lut +0 -0
  238. package/browser/three/agx-look-medium-high-contrast.lut +0 -0
  239. package/browser/three/agx-look-punchy.lut +0 -0
  240. package/browser/three/blender-agx.ts +0 -235
  241. package/browser/three/blender-display-lut.ts +0 -145
  242. package/browser/three/blender-filmic.ts +0 -49
  243. package/browser/three/blender-standard.ts +0 -68
  244. package/browser/three/blender-world-visibility.ts +0 -278
  245. package/browser/three/filmic-srgb.lut +0 -0
@@ -0,0 +1,76 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from collections.abc import Callable
3
+ from typing import Final
4
+
5
+ from bpy.types import Context, Menu, Object, UILayout
6
+
7
+ from ...common.logger import get_logger
8
+ from ..ops import layout_operator
9
+ from .ops import (
10
+ VRM_OT_assign_vrm1_expressions_automatically,
11
+ VRM_OT_assign_vrm1_expressions_from_arkit,
12
+ VRM_OT_assign_vrm1_expressions_from_mmd,
13
+ VRM_OT_assign_vrm1_expressions_from_ready_player_me,
14
+ VRM_OT_assign_vrm1_expressions_from_vrchat,
15
+ VRM_OT_assign_vrm1_expressions_from_vrm0,
16
+ VRM_OT_restore_vrm1_expression_morph_target_bind_object,
17
+ )
18
+
19
+ _logger = get_logger(__name__)
20
+
21
+
22
+ class VRM_MT_vrm1_expression(Menu):
23
+ bl_label = "Expression Menu"
24
+ bl_idname = "VRM_MT_vrm1_expression"
25
+
26
+ CONTEXT_POINTER_ARMATURE: Final = bl_idname + "_armature"
27
+
28
+ @classmethod
29
+ def layout_context_pointer_set(cls, armature: Object) -> Callable[[UILayout], None]:
30
+ return lambda layout: layout.context_pointer_set(
31
+ cls.CONTEXT_POINTER_ARMATURE, armature
32
+ )
33
+
34
+ def draw(self, context: Context) -> None:
35
+ layout = self.layout
36
+
37
+ armature = getattr(context, self.CONTEXT_POINTER_ARMATURE, None)
38
+ if not isinstance(armature, Object):
39
+ return
40
+
41
+ restore_vrm1_expression_morph_target_bind_object_op = layout_operator(
42
+ layout, VRM_OT_restore_vrm1_expression_morph_target_bind_object
43
+ )
44
+ restore_vrm1_expression_morph_target_bind_object_op.armature_object_name = (
45
+ armature.name
46
+ )
47
+
48
+ auto_detection_op = layout_operator(
49
+ layout, VRM_OT_assign_vrm1_expressions_automatically
50
+ )
51
+ auto_detection_op.armature_object_name = armature.name
52
+
53
+ vrchat_expressions_op = layout_operator(
54
+ layout, VRM_OT_assign_vrm1_expressions_from_vrchat
55
+ )
56
+ vrchat_expressions_op.armature_object_name = armature.name
57
+
58
+ mmd_expressions_op = layout_operator(
59
+ layout, VRM_OT_assign_vrm1_expressions_from_mmd
60
+ )
61
+ mmd_expressions_op.armature_object_name = armature.name
62
+
63
+ ready_player_me_expressions_op = layout_operator(
64
+ layout, VRM_OT_assign_vrm1_expressions_from_ready_player_me
65
+ )
66
+ ready_player_me_expressions_op.armature_object_name = armature.name
67
+
68
+ vrm0_blend_shapes_expressions_op = layout_operator(
69
+ layout, VRM_OT_assign_vrm1_expressions_from_vrm0
70
+ )
71
+ vrm0_blend_shapes_expressions_op.armature_object_name = armature.name
72
+
73
+ arkit_expressions_op = layout_operator(
74
+ layout, VRM_OT_assign_vrm1_expressions_from_arkit
75
+ )
76
+ arkit_expressions_op.armature_object_name = armature.name
@@ -0,0 +1,321 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from bpy.types import Armature, Context, Material, Object
3
+ from idprop.types import IDPropertyGroup
4
+ from mathutils import Vector
5
+
6
+ from ...common import convert, shader
7
+ from ..extension_accessor import get_armature_extension
8
+ from .ops import (
9
+ assign_vrm1_expressions_automatically,
10
+ assign_vrm1_humanoid_human_bones_automatically,
11
+ update_vrm1_expression_ui_list_elements,
12
+ )
13
+ from .property_group import (
14
+ Vrm1ExpressionPropertyGroup,
15
+ Vrm1ExpressionsPropertyGroup,
16
+ Vrm1HumanBonesPropertyGroup,
17
+ Vrm1MaterialColorBindPropertyGroup,
18
+ Vrm1PropertyGroup,
19
+ )
20
+
21
+
22
+ def _migrate_old_expression_layout(
23
+ old_expression: object, expression: Vrm1ExpressionPropertyGroup
24
+ ) -> None:
25
+ if not isinstance(old_expression, IDPropertyGroup):
26
+ return
27
+
28
+ old_morph_target_binds = convert.iterator_or_none(
29
+ old_expression.get("morph_target_binds")
30
+ )
31
+ if old_morph_target_binds is not None:
32
+ for old_morph_target_bind in old_morph_target_binds:
33
+ if not isinstance(old_morph_target_bind, IDPropertyGroup):
34
+ continue
35
+
36
+ morph_target_bind = expression.morph_target_binds.add()
37
+ old_node = old_morph_target_bind.get("node")
38
+ if isinstance(old_node, IDPropertyGroup):
39
+ old_bpy_object = old_node.get("bpy_object")
40
+ if isinstance(old_bpy_object, Object) and old_bpy_object.type == "MESH":
41
+ morph_target_bind.node.mesh_object_name = old_bpy_object.name
42
+ old_node.clear()
43
+
44
+ old_index = old_morph_target_bind.get("index")
45
+ if isinstance(old_index, str):
46
+ morph_target_bind.index = old_index
47
+
48
+ old_weight = old_morph_target_bind.get("weight")
49
+ if isinstance(old_weight, (float, int)):
50
+ morph_target_bind.weight = old_weight
51
+
52
+ old_morph_target_bind.clear()
53
+
54
+ old_material_color_binds = convert.iterator_or_none(
55
+ old_expression.get("material_color_binds")
56
+ )
57
+ if old_material_color_binds is not None:
58
+ for old_material_color_bind in old_material_color_binds:
59
+ if not isinstance(old_material_color_bind, IDPropertyGroup):
60
+ continue
61
+
62
+ material_color_bind = expression.material_color_binds.add()
63
+ old_material = old_material_color_bind.get("material")
64
+ if isinstance(old_material, Material):
65
+ material_color_bind.material = old_material
66
+
67
+ old_type = next(
68
+ (
69
+ enum.identifier
70
+ for enum in Vrm1MaterialColorBindPropertyGroup.type_enum
71
+ if old_material_color_bind.get("type") == enum.value
72
+ ),
73
+ None,
74
+ )
75
+ if old_type is not None:
76
+ material_color_bind.type = old_type
77
+
78
+ old_target_value = shader.rgba_or_none(
79
+ old_material_color_bind.get("target_value"), 0.0, 1.0
80
+ )
81
+ if old_target_value:
82
+ material_color_bind.target_value = old_target_value
83
+
84
+ old_material_color_bind.clear()
85
+
86
+ old_texture_transform_binds = convert.iterator_or_none(
87
+ old_expression.get("texture_transform_binds")
88
+ )
89
+ if old_texture_transform_binds is not None:
90
+ for old_texture_transform_bind in old_texture_transform_binds:
91
+ if not isinstance(old_texture_transform_bind, IDPropertyGroup):
92
+ continue
93
+
94
+ texture_transform_bind = expression.texture_transform_binds.add()
95
+ old_material = old_texture_transform_bind.get("material")
96
+ if isinstance(old_material, Material):
97
+ texture_transform_bind.material = old_material
98
+
99
+ old_scale = convert.float2_or_none(old_texture_transform_bind.get("scale"))
100
+ if old_scale:
101
+ texture_transform_bind.scale = old_scale
102
+
103
+ old_offset = convert.float2_or_none(
104
+ old_texture_transform_bind.get("offset")
105
+ )
106
+ if old_offset:
107
+ texture_transform_bind.offset = old_offset
108
+
109
+ old_texture_transform_bind.clear()
110
+
111
+ old_is_binary = old_expression.get("is_binary")
112
+ if isinstance(old_is_binary, int):
113
+ expression.is_binary = bool(old_is_binary)
114
+
115
+ old_override_blink = next(
116
+ (
117
+ enum.identifier
118
+ for enum in Vrm1ExpressionPropertyGroup.expression_override_type_enum
119
+ if old_expression.get("override_blink") == enum.value
120
+ ),
121
+ None,
122
+ )
123
+ if old_override_blink is not None:
124
+ expression.override_blink = old_override_blink
125
+
126
+ old_override_look_at = next(
127
+ (
128
+ enum.identifier
129
+ for enum in Vrm1ExpressionPropertyGroup.expression_override_type_enum
130
+ if old_expression.get("override_look_at") == enum.value
131
+ ),
132
+ None,
133
+ )
134
+ if old_override_look_at is not None:
135
+ expression.override_look_at = old_override_look_at
136
+
137
+ old_override_mouth = next(
138
+ (
139
+ enum.identifier
140
+ for enum in Vrm1ExpressionPropertyGroup.expression_override_type_enum
141
+ if old_expression.get("override_mouth") == enum.value
142
+ ),
143
+ None,
144
+ )
145
+ if old_override_mouth is not None:
146
+ expression.override_mouth = old_override_mouth
147
+
148
+
149
+ def _migrate_old_expressions_layout(expressions: Vrm1ExpressionsPropertyGroup) -> None:
150
+ for name, expression in expressions.preset.name_to_expression_dict().items():
151
+ property_name = {
152
+ "blinkLeft": "blink_left",
153
+ "blinkRight": "blink_right",
154
+ "lookUp": "look_up",
155
+ "lookDown": "look_down",
156
+ "lookLeft": "look_left",
157
+ "lookRight": "look_right",
158
+ }.get(name)
159
+ if property_name is None:
160
+ property_name = name
161
+ old_expression = expressions.get(property_name)
162
+ _migrate_old_expression_layout(old_expression, expression)
163
+ expression.name = name
164
+ for expression in expressions.custom:
165
+ old_expression = expression.get("expression")
166
+ _migrate_old_expression_layout(old_expression, expression)
167
+
168
+
169
+ def _migrate_pose(context: Context, _armature: Object, armature_data: Armature) -> None:
170
+ ext = get_armature_extension(armature_data)
171
+ if tuple(ext.addon_version) >= (2, 20, 34):
172
+ return
173
+
174
+ humanoid = ext.vrm1.humanoid
175
+ if isinstance(humanoid.get("pose"), int):
176
+ return
177
+
178
+ if tuple(ext.addon_version) == ext.UNMANAGED_ADDON_VERSION:
179
+ return
180
+
181
+ if tuple(ext.addon_version) <= (2, 0, 1):
182
+ humanoid.pose = humanoid.POSE_CURRENT_POSE.identifier
183
+ return
184
+
185
+ action = humanoid.pose_library
186
+ if action and action.name in context.blend_data.actions:
187
+ humanoid.pose = humanoid.POSE_CUSTOM_POSE.identifier
188
+ elif armature_data.pose_position == "REST":
189
+ humanoid.pose = humanoid.POSE_REST_POSITION_POSE.identifier
190
+ else:
191
+ humanoid.pose = humanoid.POSE_CURRENT_POSE.identifier
192
+
193
+
194
+ def _migrate_auto_pose(_context: Context, armature_data: Armature) -> None:
195
+ ext = get_armature_extension(armature_data)
196
+ if (
197
+ tuple(ext.addon_version) >= (2, 20, 81)
198
+ or tuple(ext.addon_version) == ext.UNMANAGED_ADDON_VERSION
199
+ ):
200
+ return
201
+
202
+ humanoid = ext.vrm1.humanoid
203
+ if not isinstance(humanoid.get("pose"), int):
204
+ humanoid.pose = humanoid.POSE_CURRENT_POSE.identifier
205
+
206
+
207
+ def is_unnecessary(vrm1: Vrm1PropertyGroup, *, heavy_migration: bool) -> bool:
208
+ if not heavy_migration:
209
+ return True
210
+ return (
211
+ not vrm1.humanoid.human_bones.initial_automatic_bone_assignment
212
+ and not vrm1.expressions.initial_automatic_expression_assignment
213
+ )
214
+
215
+
216
+ def migrate(
217
+ context: Context,
218
+ vrm1: Vrm1PropertyGroup,
219
+ armature: Object,
220
+ *,
221
+ heavy_migration: bool,
222
+ ) -> None:
223
+ armature_data = armature.data
224
+ if not isinstance(armature_data, Armature):
225
+ return
226
+
227
+ human_bones = vrm1.humanoid.human_bones
228
+ human_bones.pop("last_bone_names", None)
229
+ human_bones.pop("last_bone_names_str", None)
230
+ Vrm1HumanBonesPropertyGroup.fixup_human_bones(armature)
231
+ if heavy_migration:
232
+ Vrm1HumanBonesPropertyGroup.update_all_bone_name_candidates(
233
+ context, armature_data.name
234
+ )
235
+
236
+ if heavy_migration and human_bones.initial_automatic_bone_assignment:
237
+ human_bones.initial_automatic_bone_assignment = False
238
+ human_bone_name_to_human_bone = human_bones.human_bone_name_to_human_bone()
239
+ if all(not b.node.bone_name for b in human_bone_name_to_human_bone.values()):
240
+ assign_vrm1_humanoid_human_bones_automatically(context, armature)
241
+
242
+ if tuple(get_armature_extension(armature_data).addon_version) <= (2, 14, 10):
243
+ ext = get_armature_extension(armature_data)
244
+ head_bone_name = ext.vrm1.humanoid.human_bones.head.node.bone_name
245
+ head_bone = armature_data.bones.get(head_bone_name)
246
+ if head_bone:
247
+ look_at = get_armature_extension(armature_data).vrm1.look_at
248
+ world_translation = (
249
+ armature.matrix_world @ head_bone.matrix_local
250
+ ).to_quaternion() @ Vector(look_at.offset_from_head_bone)
251
+ look_at.offset_from_head_bone = list(world_translation)
252
+
253
+ if tuple(get_armature_extension(armature_data).addon_version) <= (2, 15, 5):
254
+ # Apply lower limit value
255
+ look_at = get_armature_extension(armature_data).vrm1.look_at
256
+ look_at.range_map_horizontal_inner.input_max_value = (
257
+ look_at.range_map_horizontal_inner.input_max_value
258
+ )
259
+ look_at.range_map_horizontal_outer.input_max_value = (
260
+ look_at.range_map_horizontal_outer.input_max_value
261
+ )
262
+ look_at.range_map_vertical_down.input_max_value = (
263
+ look_at.range_map_vertical_down.input_max_value
264
+ )
265
+ look_at.range_map_vertical_up.input_max_value = (
266
+ look_at.range_map_vertical_up.input_max_value
267
+ )
268
+
269
+ if tuple(get_armature_extension(armature_data).addon_version) < (2, 18, 0):
270
+ _migrate_old_expressions_layout(
271
+ get_armature_extension(armature_data).vrm1.expressions
272
+ )
273
+
274
+ if tuple(get_armature_extension(armature_data).addon_version) < (2, 20, 0):
275
+ look_at = get_armature_extension(armature_data).vrm1.look_at
276
+ look_at.offset_from_head_bone = (
277
+ look_at.offset_from_head_bone[0],
278
+ look_at.offset_from_head_bone[2],
279
+ -look_at.offset_from_head_bone[1],
280
+ )
281
+
282
+ _migrate_pose(context, armature, armature_data)
283
+ _migrate_auto_pose(context, armature_data)
284
+
285
+ expressions = get_armature_extension(armature_data).vrm1.expressions
286
+ expressions.fill_missing_expression_names()
287
+
288
+ if tuple(get_armature_extension(armature_data).addon_version) < (3, 9, 0):
289
+ for expression in expressions.preset.name_to_expression_dict().values():
290
+ for morph_target_bind in expression.morph_target_binds:
291
+ morph_target_bind.node.saved_mesh_object_name_to_restore = (
292
+ morph_target_bind.node.mesh_object_name
293
+ )
294
+
295
+ if (
296
+ (ext := get_armature_extension(armature_data))
297
+ and tuple(ext.addon_version) < (3, 18)
298
+ and tuple(ext.addon_version) != ext.UNMANAGED_ADDON_VERSION
299
+ ):
300
+ expressions.initial_automatic_expression_assignment = False
301
+
302
+ if expressions.initial_automatic_expression_assignment:
303
+ expressions.initial_automatic_expression_assignment = False
304
+ assign_vrm1_expressions_automatically(context, armature.name)
305
+ expression_preset_and_expressions = (
306
+ expressions.preset.expression_preset_and_expressions()
307
+ )
308
+ if any(
309
+ preset.look_at and expression.morph_target_binds
310
+ for preset, expression in expression_preset_and_expressions
311
+ ):
312
+ look_at = get_armature_extension(armature_data).vrm1.look_at
313
+ look_at.type = look_at.TYPE_EXPRESSION.identifier
314
+
315
+ if heavy_migration:
316
+ Vrm1HumanBonesPropertyGroup.update_all_bone_name_candidates(
317
+ context,
318
+ armature_data.name,
319
+ force=True,
320
+ )
321
+ update_vrm1_expression_ui_list_elements(context)