@volter/blender-engine 0.1.148 → 0.1.149

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 +16 -0
  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 +60 -128
  185. package/browser/blender-engine.mts +20 -186
  186. package/browser/blender-wali-engine.mts +35 -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 +2 -0
  192. package/browser/protocol.ts +119 -35
  193. package/browser/pull-job.mts +2 -10
  194. package/browser/rna.ts +190 -73
  195. package/browser/runtime.ts +197 -82
  196. package/browser/session-addons.mts +33 -0
  197. package/browser/session-frame.mts +5 -24
  198. package/browser/session.py +1338 -1427
  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 +505 -283
  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 +156 -151
  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,246 @@
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 Armature, Context, Menu, Object, UILayout
6
+
7
+ from ..extension_accessor import get_armature_extension
8
+ from ..ops import layout_operator
9
+ from .ops import (
10
+ VRM_OT_assign_spring_bone1_automatically,
11
+ VRM_OT_assign_spring_bone1_collider_group_collider,
12
+ VRM_OT_assign_spring_bone1_from_mmd,
13
+ VRM_OT_assign_spring_bone1_from_vrm0,
14
+ VRM_OT_assign_spring_bone1_spring_collider_group,
15
+ VRM_OT_unassign_spring_bone1_collider_group_collider,
16
+ VRM_OT_unassign_spring_bone1_spring_collider_group,
17
+ )
18
+ from .property_group import (
19
+ SpringBone1ColliderGroupPropertyGroup,
20
+ SpringBone1ColliderGroupReferencePropertyGroup,
21
+ SpringBone1ColliderReferencePropertyGroup,
22
+ SpringBone1SpringPropertyGroup,
23
+ )
24
+
25
+
26
+ class VRM_MT_spring_bone1_spring_bones(Menu):
27
+ bl_label = "Spring Bone Menu"
28
+ bl_idname = "VRM_MT_spring_bone1_spring_bones"
29
+
30
+ CONTEXT_POINTER_ARMATURE: Final = bl_idname + "_armature"
31
+
32
+ @classmethod
33
+ def layout_context_pointer_set(cls, armature: Object) -> Callable[[UILayout], None]:
34
+ return lambda layout: layout.context_pointer_set(
35
+ cls.CONTEXT_POINTER_ARMATURE, armature
36
+ )
37
+
38
+ def draw(self, context: Context) -> None:
39
+ layout = self.layout
40
+
41
+ armature = getattr(context, self.CONTEXT_POINTER_ARMATURE, None)
42
+ if not isinstance(armature, Object):
43
+ return
44
+
45
+ auto_detection_op = layout_operator(
46
+ layout, VRM_OT_assign_spring_bone1_automatically
47
+ )
48
+ auto_detection_op.armature_object_name = armature.name
49
+
50
+ assign_vrm0_op = layout_operator(layout, VRM_OT_assign_spring_bone1_from_vrm0)
51
+ assign_vrm0_op.armature_object_name = armature.name
52
+
53
+ assign_mmd_op = layout_operator(layout, VRM_OT_assign_spring_bone1_from_mmd)
54
+ assign_mmd_op.armature_object_name = armature.name
55
+
56
+
57
+ class VRM_MT_spring_bone1_collider_group_collider(Menu):
58
+ bl_label = "Collider Assignment Menu"
59
+ bl_idname = "VRM_MT_spring_bone1_collider_group_collider"
60
+
61
+ CONTEXT_POINTER_COLLIDER_GROUP: Final = bl_idname + "_collider_group"
62
+ CONTEXT_POINTER_COLLIDER_REFERENCE: Final = bl_idname + "_collider_reference"
63
+
64
+ @classmethod
65
+ def draw_input_layout(
66
+ cls,
67
+ layout: UILayout,
68
+ collider_group: SpringBone1ColliderGroupPropertyGroup,
69
+ collider_reference: SpringBone1ColliderReferencePropertyGroup,
70
+ *,
71
+ icon: str = "SPHERE",
72
+ ) -> UILayout:
73
+ row = layout.row(align=True)
74
+ row.context_pointer_set(
75
+ cls.CONTEXT_POINTER_COLLIDER_GROUP,
76
+ collider_group,
77
+ )
78
+ row.context_pointer_set(
79
+ cls.CONTEXT_POINTER_COLLIDER_REFERENCE,
80
+ collider_reference,
81
+ )
82
+ row.menu(
83
+ cls.bl_idname,
84
+ text=collider_reference.collider_display_name or " ",
85
+ icon=icon,
86
+ translate=False,
87
+ )
88
+ return row
89
+
90
+ def draw(self, context: Context) -> None:
91
+ layout = self.layout
92
+
93
+ collider_group = getattr(context, self.CONTEXT_POINTER_COLLIDER_GROUP, None)
94
+ if not isinstance(collider_group, SpringBone1ColliderGroupPropertyGroup):
95
+ return
96
+
97
+ collider_reference = getattr(
98
+ context, self.CONTEXT_POINTER_COLLIDER_REFERENCE, None
99
+ )
100
+ if not isinstance(
101
+ collider_reference, SpringBone1ColliderReferencePropertyGroup
102
+ ):
103
+ return
104
+
105
+ armature_data = collider_reference.id_data
106
+ if not isinstance(armature_data, Armature):
107
+ return
108
+
109
+ if collider_group.id_data != armature_data:
110
+ return
111
+
112
+ assigned_collider_uuids: set[str] = {
113
+ collider_reference.collider_uuid
114
+ for collider_reference in collider_group.colliders
115
+ if collider_reference.collider_uuid
116
+ }
117
+
118
+ spring_bone1 = get_armature_extension(armature_data).spring_bone1
119
+ collider_reference_path = collider_reference.path_from_id()
120
+
121
+ if collider_reference.collider_uuid:
122
+ unassign_op = layout_operator(
123
+ layout,
124
+ VRM_OT_unassign_spring_bone1_collider_group_collider,
125
+ text="<Unassign>",
126
+ translate=True,
127
+ icon="REMOVE",
128
+ )
129
+ unassign_op.armature_data_name = armature_data.name
130
+ unassign_op.collider_reference_path = collider_reference_path
131
+
132
+ for collider in spring_bone1.colliders:
133
+ if not collider.uuid:
134
+ continue
135
+ if collider.uuid in assigned_collider_uuids:
136
+ continue
137
+
138
+ assign_op = layout_operator(
139
+ layout,
140
+ VRM_OT_assign_spring_bone1_collider_group_collider,
141
+ text=collider.display_name,
142
+ translate=False,
143
+ icon="SPHERE",
144
+ )
145
+ assign_op.armature_data_name = armature_data.name
146
+ assign_op.collider_reference_path = collider_reference_path
147
+ assign_op.collider_uuid = collider.uuid
148
+
149
+
150
+ class VRM_MT_spring_bone1_spring_collider_group(Menu):
151
+ bl_label = "Collider Group Assignment Menu"
152
+ bl_idname = "VRM_MT_spring_bone1_spring_collider_group"
153
+
154
+ CONTEXT_POINTER_SPRING: Final = bl_idname + "_spring"
155
+ CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE: Final = (
156
+ bl_idname + "_collider_group_reference"
157
+ )
158
+
159
+ @classmethod
160
+ def draw_input_layout(
161
+ cls,
162
+ layout: UILayout,
163
+ spring: SpringBone1SpringPropertyGroup,
164
+ collider_group_reference: SpringBone1ColliderGroupReferencePropertyGroup,
165
+ *,
166
+ icon: str = "PIVOT_INDIVIDUAL",
167
+ ) -> UILayout:
168
+ row = layout.row(align=True)
169
+ row.context_pointer_set(
170
+ cls.CONTEXT_POINTER_SPRING,
171
+ spring,
172
+ )
173
+ row.context_pointer_set(
174
+ cls.CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE,
175
+ collider_group_reference,
176
+ )
177
+ row.menu(
178
+ cls.bl_idname,
179
+ text=collider_group_reference.collider_group_display_name or " ",
180
+ icon=icon,
181
+ translate=False,
182
+ )
183
+ return row
184
+
185
+ def draw(self, context: Context) -> None:
186
+ layout = self.layout
187
+
188
+ spring = getattr(context, self.CONTEXT_POINTER_SPRING, None)
189
+ if not isinstance(
190
+ spring,
191
+ SpringBone1SpringPropertyGroup,
192
+ ):
193
+ return
194
+
195
+ collider_group_reference = getattr(
196
+ context, self.CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE, None
197
+ )
198
+ if not isinstance(
199
+ collider_group_reference,
200
+ SpringBone1ColliderGroupReferencePropertyGroup,
201
+ ):
202
+ return
203
+
204
+ armature_data = collider_group_reference.id_data
205
+ if not isinstance(armature_data, Armature):
206
+ return
207
+
208
+ if spring.id_data != armature_data:
209
+ return
210
+
211
+ assigned_collider_group_uuids: set[str] = {
212
+ collider_group_reference.collider_group_uuid
213
+ for collider_group_reference in spring.collider_groups
214
+ if collider_group_reference.collider_group_uuid
215
+ }
216
+
217
+ spring_bone1 = get_armature_extension(armature_data).spring_bone1
218
+ collider_group_reference_path = collider_group_reference.path_from_id()
219
+
220
+ if collider_group_reference.collider_group_uuid:
221
+ unassign_op = layout_operator(
222
+ layout,
223
+ VRM_OT_unassign_spring_bone1_spring_collider_group,
224
+ text="<Unassign>",
225
+ translate=True,
226
+ icon="REMOVE",
227
+ )
228
+ unassign_op.armature_data_name = armature_data.name
229
+ unassign_op.collider_group_reference_path = collider_group_reference_path
230
+
231
+ for index, collider_group in enumerate(spring_bone1.collider_groups):
232
+ if not collider_group.uuid:
233
+ continue
234
+ if collider_group.uuid in assigned_collider_group_uuids:
235
+ continue
236
+
237
+ assign_op = layout_operator(
238
+ layout,
239
+ VRM_OT_assign_spring_bone1_spring_collider_group,
240
+ text=f"{index + 1}: " + collider_group.vrm_name,
241
+ translate=False,
242
+ icon="PIVOT_INDIVIDUAL",
243
+ )
244
+ assign_op.armature_data_name = armature_data.name
245
+ assign_op.collider_group_reference_path = collider_group_reference_path
246
+ assign_op.collider_group_uuid = collider_group.uuid
@@ -0,0 +1,86 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from bpy.types import Armature, Context, Object
3
+
4
+ from ..extension_accessor import get_armature_extension
5
+ from .ops import (
6
+ assign_spring_bone1_automatically,
7
+ )
8
+ from .property_group import SpringBone1SpringBonePropertyGroup
9
+
10
+
11
+ def _migrate_blender_object(armature: Armature) -> None:
12
+ ext = get_armature_extension(armature)
13
+ if tuple(ext.addon_version) >= (2, 3, 27):
14
+ return
15
+
16
+ for collider in ext.spring_bone1.colliders:
17
+ bpy_object = collider.pop("blender_object", None)
18
+ if isinstance(bpy_object, Object):
19
+ collider.bpy_object = bpy_object
20
+
21
+
22
+ def _fixup_gravity_dir(armature: Armature) -> None:
23
+ ext = get_armature_extension(armature)
24
+ if tuple(ext.addon_version) == ext.UNMANAGED_ADDON_VERSION:
25
+ return
26
+
27
+ if tuple(ext.addon_version) <= (2, 14, 3):
28
+ for spring in ext.spring_bone1.springs:
29
+ for joint in spring.joints:
30
+ joint.gravity_dir = [
31
+ joint.gravity_dir[0],
32
+ joint.gravity_dir[2],
33
+ joint.gravity_dir[1],
34
+ ]
35
+
36
+ if tuple(ext.addon_version) <= (2, 14, 10):
37
+ for spring in ext.spring_bone1.springs:
38
+ for joint in spring.joints:
39
+ joint.gravity_dir = [
40
+ joint.gravity_dir[0],
41
+ -joint.gravity_dir[1],
42
+ joint.gravity_dir[2],
43
+ ]
44
+
45
+ if tuple(ext.addon_version) <= (2, 15, 3):
46
+ for spring in ext.spring_bone1.springs:
47
+ for joint in spring.joints:
48
+ gravity_dir = list(joint.gravity_dir)
49
+ joint.gravity_dir = (gravity_dir[0] + 1, 0, 0) # Make a change
50
+ joint.gravity_dir = gravity_dir
51
+
52
+
53
+ def is_unnecessary(
54
+ spring_bone1: SpringBone1SpringBonePropertyGroup,
55
+ *,
56
+ heavy_migration: bool,
57
+ ) -> bool:
58
+ if not heavy_migration:
59
+ return True
60
+ return not spring_bone1.initial_automatic_spring_bone_assignment
61
+
62
+
63
+ def migrate(
64
+ context: Context,
65
+ armature: Object,
66
+ *,
67
+ heavy_migration: bool,
68
+ ) -> None:
69
+ armature_data = armature.data
70
+ if not isinstance(armature_data, Armature):
71
+ return
72
+ _migrate_blender_object(armature_data)
73
+ _fixup_gravity_dir(armature_data)
74
+
75
+ ext = get_armature_extension(armature_data)
76
+ spring_bone1 = ext.spring_bone1
77
+
78
+ if (
79
+ tuple(ext.addon_version) < (3, 21, 2)
80
+ and tuple(ext.addon_version) != ext.UNMANAGED_ADDON_VERSION
81
+ ):
82
+ spring_bone1.initial_automatic_spring_bone_assignment = False
83
+
84
+ if heavy_migration and spring_bone1.initial_automatic_spring_bone_assignment:
85
+ spring_bone1.initial_automatic_spring_bone_assignment = False
86
+ assign_spring_bone1_automatically(context, armature.name)