@volter/blender-engine 0.1.147 → 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 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
@@ -0,0 +1,63 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+
3
+ from typing import ClassVar
4
+
5
+ from bpy.types import Armature, Context, GizmoGroup
6
+
7
+ from ..extension_accessor import get_armature_extension
8
+
9
+
10
+ # https://gist.github.com/FujiSunflower/09fdabc7ca991f8292657abc4ef001b0
11
+ class Vrm0FirstPersonBoneOffsetGizmoGroup(GizmoGroup):
12
+ bl_idname = "VRM_GGT_vrm0_first_person_bone_offset"
13
+ bl_label = "First Person Bone Offset Gizmo"
14
+ bl_space_type = "VIEW_3D"
15
+ bl_region_type = "WINDOW"
16
+ bl_options: ClassVar = {"3D", "PERSISTENT"}
17
+
18
+ @classmethod
19
+ def poll(cls, context: Context) -> bool:
20
+ active_object = context.active_object
21
+ if not active_object:
22
+ return False
23
+ return active_object.type == "ARMATURE"
24
+
25
+ def setup(self, context: Context) -> None:
26
+ active_object = context.active_object
27
+ if not active_object:
28
+ return
29
+ armature_data = active_object.data
30
+ if not isinstance(armature_data, Armature):
31
+ return
32
+ ext = get_armature_extension(armature_data)
33
+ first_person = ext.vrm0.first_person
34
+ first_person_bone = armature_data.bones[
35
+ first_person.first_person_bone.bone_name
36
+ ]
37
+ gizmo = self.gizmos.new("GIZMO_GT_move_3d")
38
+ gizmo.target_set_prop("offset", first_person, "first_person_bone_offset")
39
+ gizmo.matrix_basis = first_person_bone.matrix_local
40
+ gizmo.draw_style = "CROSS_2D"
41
+ gizmo.draw_options = {"ALIGN_VIEW"}
42
+ gizmo.color = 1.0, 0.5, 0.0
43
+ gizmo.alpha = 0.5
44
+ gizmo.color_highlight = 1.0, 0.5, 1.0
45
+ gizmo.alpha_highlight = 0.5
46
+ gizmo.scale_basis = 0.25
47
+
48
+ # self.first_person_gizmo = gizmo
49
+
50
+ def refresh(self, context: Context) -> None:
51
+ active_object = context.active_object
52
+ if not active_object:
53
+ return
54
+ armature_data = active_object.data
55
+ if not isinstance(armature_data, Armature):
56
+ return
57
+ # ext = get_armature_extension(armature_data)
58
+ # gizmo = self.first_person_gizmo
59
+ # first_person = ext.vrm0.first_person
60
+ # first_person_bone = armature_data.bones[
61
+ # first_person.first_person_bone.bone_name
62
+ # ]
63
+ # gizmo.matrix_basis = first_person_bone.matrix_local
@@ -0,0 +1,23 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ import bpy
3
+ from bpy.app.handlers import persistent
4
+
5
+ from ...common.logger import get_logger
6
+ from ..extension_accessor import get_armature_extension
7
+ from .property_group import Vrm0BlendShapeGroupPropertyGroup
8
+
9
+ _logger = get_logger(__name__)
10
+
11
+
12
+ @persistent
13
+ def frame_change_post(_unused: object) -> None:
14
+ context = bpy.context
15
+ Vrm0BlendShapeGroupPropertyGroup.apply_pending_preview_update_to_armatures(context)
16
+
17
+
18
+ @persistent
19
+ def save_pre(_unused: object) -> None:
20
+ context = bpy.context
21
+ for armature_data in context.blend_data.armatures:
22
+ vrm0 = get_armature_extension(armature_data).vrm0
23
+ vrm0.secondary_animation.fixup(armature_object=None)
@@ -0,0 +1,145 @@
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 ...common.logger import get_logger
8
+ from ..extension_accessor import get_armature_extension
9
+ from ..ops import layout_operator
10
+ from .ops import (
11
+ VRM_OT_assign_vrm0_secondary_animation_group_collider_group,
12
+ VRM_OT_restore_vrm0_blend_shape_group_bind_object,
13
+ VRM_OT_unassign_vrm0_secondary_animation_group_collider_group,
14
+ )
15
+ from .property_group import (
16
+ Vrm0SecondaryAnimationColliderGroupReferencePropertyGroup,
17
+ Vrm0SecondaryAnimationGroupPropertyGroup,
18
+ )
19
+
20
+ _logger = get_logger(__name__)
21
+
22
+
23
+ class VRM_MT_vrm0_blend_shape_master(Menu):
24
+ bl_label = "Blend Shape Proxy Menu"
25
+ bl_idname = "VRM_MT_vrm0_blend_shape_master"
26
+
27
+ CONTEXT_POINTER_ARMATURE: Final = bl_idname + "_armature"
28
+
29
+ @classmethod
30
+ def layout_context_pointer_set(cls, armature: Object) -> Callable[[UILayout], None]:
31
+ return lambda layout: layout.context_pointer_set(
32
+ cls.CONTEXT_POINTER_ARMATURE, armature
33
+ )
34
+
35
+ def draw(self, context: Context) -> None:
36
+ layout = self.layout
37
+
38
+ armature = getattr(context, self.CONTEXT_POINTER_ARMATURE, None)
39
+ if not isinstance(armature, Object):
40
+ return
41
+
42
+ op = layout_operator(layout, VRM_OT_restore_vrm0_blend_shape_group_bind_object)
43
+ op.armature_object_name = armature.name
44
+
45
+
46
+ class VRM_MT_vrm0_secondary_animation_group_collider_group(Menu):
47
+ bl_label = "Collider Group Assignment Menu"
48
+ bl_idname = "VRM_MT_vrm0_secondary_animation_group_collider_group"
49
+
50
+ CONTEXT_POINTER_BONE_GROUP: Final = bl_idname + "_bone_group"
51
+ CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE: Final = (
52
+ bl_idname + "_collider_group_reference"
53
+ )
54
+
55
+ @classmethod
56
+ def draw_input_layout(
57
+ cls,
58
+ layout: UILayout,
59
+ bone_group: Vrm0SecondaryAnimationGroupPropertyGroup,
60
+ collider_group_reference: (
61
+ Vrm0SecondaryAnimationColliderGroupReferencePropertyGroup
62
+ ),
63
+ *,
64
+ icon: str = "PIVOT_INDIVIDUAL",
65
+ ) -> UILayout:
66
+ row = layout.row(align=True)
67
+ row.context_pointer_set(
68
+ cls.CONTEXT_POINTER_BONE_GROUP,
69
+ bone_group,
70
+ )
71
+ row.context_pointer_set(
72
+ cls.CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE,
73
+ collider_group_reference,
74
+ )
75
+ row.menu(
76
+ cls.bl_idname,
77
+ text=collider_group_reference.collider_group_display_name or " ",
78
+ icon=icon,
79
+ translate=False,
80
+ )
81
+ return row
82
+
83
+ def draw(self, context: Context) -> None:
84
+ layout = self.layout
85
+
86
+ bone_group = getattr(context, self.CONTEXT_POINTER_BONE_GROUP, None)
87
+ if not isinstance(
88
+ bone_group,
89
+ Vrm0SecondaryAnimationGroupPropertyGroup,
90
+ ):
91
+ return
92
+
93
+ collider_group_reference = getattr(
94
+ context, self.CONTEXT_POINTER_COLLIDER_GROUP_REFERENCE, None
95
+ )
96
+ if not isinstance(
97
+ collider_group_reference,
98
+ Vrm0SecondaryAnimationColliderGroupReferencePropertyGroup,
99
+ ):
100
+ return
101
+
102
+ armature_data = collider_group_reference.id_data
103
+ if not isinstance(armature_data, Armature):
104
+ return
105
+
106
+ if bone_group.id_data != armature_data:
107
+ return
108
+
109
+ assigned_uuids: set[str] = {
110
+ collider_group_reference.collider_group_uuid
111
+ for collider_group_reference in bone_group.collider_groups
112
+ if collider_group_reference.collider_group_uuid
113
+ }
114
+
115
+ vrm0 = get_armature_extension(armature_data).vrm0
116
+ secondary_animation = vrm0.secondary_animation
117
+ collider_group_reference_path = collider_group_reference.path_from_id()
118
+
119
+ if collider_group_reference.collider_group_uuid:
120
+ unassign_op = layout_operator(
121
+ layout,
122
+ VRM_OT_unassign_vrm0_secondary_animation_group_collider_group,
123
+ text="<Unassign>",
124
+ translate=True,
125
+ icon="REMOVE",
126
+ )
127
+ unassign_op.armature_data_name = armature_data.name
128
+ unassign_op.collider_group_reference_path = collider_group_reference_path
129
+
130
+ for collider_group in secondary_animation.collider_groups:
131
+ if not collider_group.uuid:
132
+ continue
133
+ if collider_group.uuid in assigned_uuids:
134
+ continue
135
+
136
+ assign_op = layout_operator(
137
+ layout,
138
+ VRM_OT_assign_vrm0_secondary_animation_group_collider_group,
139
+ text=collider_group.display_name,
140
+ translate=False,
141
+ icon="PIVOT_INDIVIDUAL",
142
+ )
143
+ assign_op.armature_data_name = armature_data.name
144
+ assign_op.collider_group_reference_path = collider_group_reference_path
145
+ assign_op.collider_group_uuid = collider_group.uuid