@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,605 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from typing import ClassVar, Optional
3
+
4
+ from bpy.types import Armature, Context, Object, Panel, UILayout
5
+
6
+ from .. import search
7
+ from ..extension_accessor import get_armature_extension
8
+ from ..menu import VRM_MT_bone_assignment
9
+ from ..migration import defer_migrate
10
+ from ..panel import VRM_PT_vrm_armature_object_property, draw_template_list
11
+ from ..search import active_object_is_vrm1_armature
12
+ from . import ops
13
+ from .handler import sort_spring_bone_joints
14
+ from .menu import VRM_MT_spring_bone1_spring_bones
15
+ from .property_group import (
16
+ SpringBone1ColliderGroupPropertyGroup,
17
+ SpringBone1ColliderPropertyGroup,
18
+ SpringBone1JointPropertyGroup,
19
+ SpringBone1SpringBonePropertyGroup,
20
+ SpringBone1SpringPropertyGroup,
21
+ )
22
+ from .ui_list import (
23
+ VRM_UL_spring_bone1_collider,
24
+ VRM_UL_spring_bone1_collider_group,
25
+ VRM_UL_spring_bone1_collider_group_collider,
26
+ VRM_UL_spring_bone1_joint,
27
+ VRM_UL_spring_bone1_spring,
28
+ VRM_UL_spring_bone1_spring_collider_group,
29
+ )
30
+
31
+
32
+ def _draw_spring_bone1_collider_sphere_layout(
33
+ layout: UILayout,
34
+ collider: SpringBone1ColliderPropertyGroup,
35
+ ) -> None:
36
+ VRM_MT_bone_assignment.draw_input_layout(layout, collider.node, simple=True)
37
+ layout.prop(collider, "ui_collider_type")
38
+ bpy_object = collider.bpy_object
39
+ if bpy_object:
40
+ layout.prop(bpy_object, "name", icon="MESH_UVSPHERE", text="Name")
41
+ layout.prop(collider.shape.sphere, "offset", text="Offset")
42
+ layout.separator(factor=0.5)
43
+ layout.prop(collider.shape.sphere, "radius", slider=True)
44
+ layout.prop(collider.extensions.vrmc_spring_bone_extended_collider, "enabled")
45
+
46
+
47
+ def _draw_spring_bone1_collider_capsule_layout(
48
+ layout: UILayout,
49
+ collider: SpringBone1ColliderPropertyGroup,
50
+ ) -> None:
51
+ VRM_MT_bone_assignment.draw_input_layout(layout, collider.node, simple=True)
52
+ layout.prop(collider, "ui_collider_type")
53
+ bpy_object = collider.bpy_object
54
+ if bpy_object:
55
+ layout.prop(bpy_object, "name", icon="MESH_UVSPHERE", text="Head")
56
+ layout.prop(collider.shape.capsule, "offset", text="")
57
+ layout.separator(factor=0.5)
58
+ layout.prop(collider.shape.capsule, "radius", slider=True)
59
+ layout.separator(factor=0.5)
60
+ if bpy_object and bpy_object.children:
61
+ layout.prop(
62
+ bpy_object.children[0],
63
+ "name",
64
+ icon="MESH_UVSPHERE",
65
+ text="Tail",
66
+ )
67
+ layout.prop(collider.shape.capsule, "tail", text="")
68
+ layout.prop(collider.extensions.vrmc_spring_bone_extended_collider, "enabled")
69
+
70
+
71
+ def _draw_spring_bone1_collider_extended_fallback_layout(
72
+ layout: UILayout,
73
+ collider: SpringBone1ColliderPropertyGroup,
74
+ ) -> None:
75
+ extended = collider.extensions.vrmc_spring_bone_extended_collider
76
+ layout.prop(extended, "automatic_fallback_generation")
77
+ if extended.automatic_fallback_generation:
78
+ return
79
+ layout.prop(collider, "shape_type", text="Fallback")
80
+ if collider.shape_type == collider.SHAPE_TYPE_SPHERE.identifier:
81
+ layout.prop(collider.shape.sphere, "fallback_offset")
82
+ layout.separator(factor=0.5)
83
+ layout.prop(collider.shape.sphere, "fallback_radius", slider=True)
84
+ elif collider.shape_type == collider.SHAPE_TYPE_CAPSULE.identifier:
85
+ layout.prop(collider.shape.capsule, "fallback_offset")
86
+ layout.separator(factor=0.5)
87
+ layout.prop(collider.shape.capsule, "fallback_radius", slider=True)
88
+ layout.separator(factor=0.5)
89
+ layout.prop(collider.shape.capsule, "fallback_tail")
90
+
91
+
92
+ def _draw_spring_bone1_collider_extended_sphere_layout(
93
+ layout: UILayout,
94
+ collider: SpringBone1ColliderPropertyGroup,
95
+ ) -> None:
96
+ extended = collider.extensions.vrmc_spring_bone_extended_collider
97
+ VRM_MT_bone_assignment.draw_input_layout(layout, collider.node, simple=True)
98
+ layout.prop(collider, "ui_collider_type")
99
+ bpy_object = collider.bpy_object
100
+ if bpy_object:
101
+ layout.prop(bpy_object, "name", icon="MESH_UVSPHERE", text="Offset")
102
+ layout.prop(extended.shape.sphere, "offset", text="")
103
+ layout.separator(factor=0.5)
104
+ layout.prop(extended.shape.sphere, "radius", slider=True)
105
+ if not (extended.enabled and extended.shape.sphere.inside):
106
+ layout.prop(extended, "enabled")
107
+ _draw_spring_bone1_collider_extended_fallback_layout(
108
+ layout,
109
+ collider,
110
+ )
111
+
112
+
113
+ def _draw_spring_bone1_collider_extended_capsule_layout(
114
+ layout: UILayout,
115
+ collider: SpringBone1ColliderPropertyGroup,
116
+ ) -> None:
117
+ extended = collider.extensions.vrmc_spring_bone_extended_collider
118
+ VRM_MT_bone_assignment.draw_input_layout(layout, collider.node, simple=True)
119
+ layout.prop(collider, "ui_collider_type")
120
+ bpy_object = collider.bpy_object
121
+ if bpy_object:
122
+ layout.prop(bpy_object, "name", icon="MESH_UVSPHERE", text="Head")
123
+ layout.prop(extended.shape.capsule, "offset", text="")
124
+ layout.separator(factor=0.5)
125
+ layout.prop(extended.shape.capsule, "radius", slider=True)
126
+ layout.separator(factor=0.5)
127
+ if bpy_object and bpy_object.children:
128
+ layout.prop(
129
+ bpy_object.children[0],
130
+ "name",
131
+ icon="MESH_UVSPHERE",
132
+ text="Tail",
133
+ )
134
+ layout.prop(extended.shape.capsule, "tail", text="")
135
+ if not (extended.enabled and extended.shape.capsule.inside):
136
+ layout.prop(extended, "enabled")
137
+ _draw_spring_bone1_collider_extended_fallback_layout(
138
+ layout,
139
+ collider,
140
+ )
141
+
142
+
143
+ def _draw_spring_bone1_collider_extended_plane_layout(
144
+ layout: UILayout,
145
+ collider: SpringBone1ColliderPropertyGroup,
146
+ ) -> None:
147
+ extended = collider.extensions.vrmc_spring_bone_extended_collider
148
+ VRM_MT_bone_assignment.draw_input_layout(layout, collider.node, simple=True)
149
+ layout.prop(collider, "ui_collider_type")
150
+ bpy_object = collider.bpy_object
151
+ if bpy_object:
152
+ layout.prop(bpy_object, "name", icon="MESH_UVSPHERE", text="Offset")
153
+ layout.prop(extended.shape.plane, "offset", text="")
154
+ layout.separator(factor=0.5)
155
+ layout.prop(extended.shape.plane, "normal")
156
+
157
+ _draw_spring_bone1_collider_extended_fallback_layout(
158
+ layout,
159
+ collider,
160
+ )
161
+
162
+
163
+ def _draw_spring_bone1_collider_layout(
164
+ layout: UILayout,
165
+ collider: SpringBone1ColliderPropertyGroup,
166
+ ) -> None:
167
+ extended = collider.extensions.vrmc_spring_bone_extended_collider
168
+ if extended.enabled:
169
+ if extended.shape_type == extended.SHAPE_TYPE_EXTENDED_PLANE.identifier:
170
+ _draw_spring_bone1_collider_extended_plane_layout(layout, collider)
171
+ elif extended.shape_type == extended.SHAPE_TYPE_EXTENDED_SPHERE.identifier:
172
+ _draw_spring_bone1_collider_extended_sphere_layout(layout, collider)
173
+ elif extended.shape_type == extended.SHAPE_TYPE_EXTENDED_CAPSULE.identifier:
174
+ _draw_spring_bone1_collider_extended_capsule_layout(layout, collider)
175
+ elif collider.shape_type == collider.SHAPE_TYPE_SPHERE.identifier:
176
+ _draw_spring_bone1_collider_sphere_layout(layout, collider)
177
+ elif collider.shape_type == collider.SHAPE_TYPE_CAPSULE.identifier:
178
+ _draw_spring_bone1_collider_capsule_layout(layout, collider)
179
+ layout.separator(factor=0.5)
180
+
181
+
182
+ def _draw_spring_bone1_spring_bone_layout(
183
+ armature: Object,
184
+ layout: UILayout,
185
+ spring_bone: SpringBone1SpringBonePropertyGroup,
186
+ ) -> None:
187
+ defer_migrate(armature.name, heavy_migration=True)
188
+
189
+ layout.prop(spring_bone, "enable_animation")
190
+ # layout.operator(ops.VRM_OT_reset_spring_bone1_animation_state.bl_idname)
191
+
192
+ _draw_spring_bone1_colliders_layout(armature, layout, spring_bone)
193
+ _draw_spring_bone1_collider_groups_layout(armature, layout, spring_bone)
194
+ _draw_spring_bone1_springs_layout(armature, layout, spring_bone)
195
+
196
+
197
+ def _draw_spring_bone1_colliders_layout(
198
+ armature: Object,
199
+ layout: UILayout,
200
+ spring_bone: SpringBone1SpringBonePropertyGroup,
201
+ ) -> None:
202
+ colliders_box = layout.box()
203
+ colliders_header_row = colliders_box.row()
204
+ colliders_header_row.alignment = "LEFT"
205
+ colliders_header_row.prop(
206
+ spring_bone,
207
+ "show_expanded_colliders",
208
+ icon="TRIA_DOWN" if spring_bone.show_expanded_colliders else "TRIA_RIGHT",
209
+ emboss=False,
210
+ )
211
+
212
+ if not spring_bone.show_expanded_colliders:
213
+ return
214
+
215
+ (
216
+ collider_collection_ops,
217
+ collider_collection_item_ops,
218
+ collider_index,
219
+ collider,
220
+ _,
221
+ ) = draw_template_list(
222
+ colliders_box,
223
+ VRM_UL_spring_bone1_collider,
224
+ spring_bone,
225
+ "colliders",
226
+ "active_collider_index",
227
+ ops.VRM_OT_add_spring_bone1_collider,
228
+ ops.VRM_OT_remove_spring_bone1_collider,
229
+ ops.VRM_OT_move_up_spring_bone1_collider,
230
+ ops.VRM_OT_move_down_spring_bone1_collider,
231
+ )
232
+
233
+ for collider_collection_op in collider_collection_ops:
234
+ collider_collection_op.armature_object_name = armature.name
235
+
236
+ for collider_collection_item_op in collider_collection_item_ops:
237
+ collider_collection_item_op.collider_index = collider_index
238
+
239
+ if not isinstance(collider, SpringBone1ColliderPropertyGroup):
240
+ return
241
+
242
+ _draw_spring_bone1_collider_layout(colliders_box.column(), collider)
243
+
244
+
245
+ def _draw_spring_bone1_collider_groups_layout(
246
+ armature: Object,
247
+ layout: UILayout,
248
+ spring_bone: SpringBone1SpringBonePropertyGroup,
249
+ ) -> None:
250
+ collider_groups_box = layout.box()
251
+ collider_groups_header_row = collider_groups_box.row()
252
+ collider_groups_header_row.alignment = "LEFT"
253
+ collider_groups_header_row.prop(
254
+ spring_bone,
255
+ "show_expanded_collider_groups",
256
+ icon="TRIA_DOWN" if spring_bone.show_expanded_collider_groups else "TRIA_RIGHT",
257
+ emboss=False,
258
+ )
259
+
260
+ if not spring_bone.show_expanded_collider_groups:
261
+ return
262
+
263
+ (
264
+ collider_group_collection_ops,
265
+ collider_group_collection_item_ops,
266
+ collider_group_index,
267
+ collider_group,
268
+ _,
269
+ ) = draw_template_list(
270
+ collider_groups_box,
271
+ VRM_UL_spring_bone1_collider_group,
272
+ spring_bone,
273
+ "collider_groups",
274
+ "active_collider_group_index",
275
+ ops.VRM_OT_add_spring_bone1_collider_group,
276
+ ops.VRM_OT_remove_spring_bone1_collider_group,
277
+ ops.VRM_OT_move_up_spring_bone1_collider_group,
278
+ ops.VRM_OT_move_down_spring_bone1_collider_group,
279
+ )
280
+
281
+ for collider_group_collection_op in collider_group_collection_ops:
282
+ collider_group_collection_op.armature_object_name = armature.name
283
+
284
+ for collider_group_collection_item_op in collider_group_collection_item_ops:
285
+ collider_group_collection_item_op.collider_group_index = collider_group_index
286
+
287
+ if not isinstance(collider_group, SpringBone1ColliderGroupPropertyGroup):
288
+ return
289
+
290
+ collider_group_column = collider_groups_box.column()
291
+ collider_group_column.prop(
292
+ collider_group,
293
+ "vrm_name",
294
+ )
295
+
296
+ colliders_box = collider_group_column.box()
297
+ colliders_column = colliders_box.column()
298
+ colliders_column.label(text="Colliders:")
299
+
300
+ (
301
+ collider_collection_ops,
302
+ collider_collection_item_ops,
303
+ collider_index,
304
+ _collider,
305
+ _,
306
+ ) = draw_template_list(
307
+ colliders_column,
308
+ VRM_UL_spring_bone1_collider_group_collider,
309
+ collider_group,
310
+ "colliders",
311
+ "active_collider_index",
312
+ ops.VRM_OT_add_spring_bone1_collider_group_collider,
313
+ ops.VRM_OT_remove_spring_bone1_collider_group_collider,
314
+ ops.VRM_OT_move_up_spring_bone1_collider_group_collider,
315
+ ops.VRM_OT_move_down_spring_bone1_collider_group_collider,
316
+ )
317
+
318
+ for collider_collection_op in collider_collection_ops:
319
+ collider_collection_op.armature_object_name = armature.name
320
+ collider_collection_op.collider_group_index = collider_group_index
321
+
322
+ for collider_collection_item_op in collider_collection_item_ops:
323
+ collider_collection_item_op.collider_index = collider_index
324
+
325
+
326
+ def _draw_spring_bone1_springs_layout(
327
+ armature: Object,
328
+ layout: UILayout,
329
+ spring_bone: SpringBone1SpringBonePropertyGroup,
330
+ ) -> None:
331
+ armature_data = armature.data
332
+ if not isinstance(armature_data, Armature):
333
+ return
334
+
335
+ springs_box = layout.box()
336
+ springs_header_row = springs_box.row()
337
+ springs_header_row.alignment = "LEFT"
338
+ springs_header_row.prop(
339
+ spring_bone,
340
+ "show_expanded_springs",
341
+ icon="TRIA_DOWN" if spring_bone.show_expanded_springs else "TRIA_RIGHT",
342
+ emboss=False,
343
+ )
344
+
345
+ if not spring_bone.show_expanded_springs:
346
+ return
347
+
348
+ (
349
+ spring_collection_ops,
350
+ spring_collection_item_ops,
351
+ spring_index,
352
+ spring,
353
+ _,
354
+ ) = draw_template_list(
355
+ springs_box,
356
+ VRM_UL_spring_bone1_spring,
357
+ spring_bone,
358
+ "springs",
359
+ "active_spring_index",
360
+ ops.VRM_OT_add_spring_bone1_spring,
361
+ ops.VRM_OT_remove_spring_bone1_spring,
362
+ ops.VRM_OT_move_up_spring_bone1_spring,
363
+ ops.VRM_OT_move_down_spring_bone1_spring,
364
+ menu_and_context_pointer_set_callback=(
365
+ VRM_MT_spring_bone1_spring_bones,
366
+ VRM_MT_spring_bone1_spring_bones.layout_context_pointer_set(armature),
367
+ ),
368
+ )
369
+
370
+ for spring_collection_op in spring_collection_ops:
371
+ spring_collection_op.armature_object_name = armature.name
372
+
373
+ for spring_collection_item_op in spring_collection_item_ops:
374
+ spring_collection_item_op.spring_index = spring_index
375
+
376
+ if not isinstance(spring, SpringBone1SpringPropertyGroup):
377
+ return
378
+
379
+ spring_column = springs_box.column()
380
+ spring_column.prop(
381
+ spring,
382
+ "vrm_name",
383
+ )
384
+ VRM_MT_bone_assignment.draw_input_layout(
385
+ spring_column,
386
+ spring.center,
387
+ text="Center",
388
+ simple=True,
389
+ )
390
+
391
+ joints_box = spring_column.box()
392
+ joints_column = joints_box.column()
393
+ joints_column.label(text="Joints:")
394
+
395
+ (
396
+ joint_collection_ops,
397
+ joint_collection_item_ops,
398
+ joint_index,
399
+ joint,
400
+ (add_joint_op, _, _, _),
401
+ ) = draw_template_list(
402
+ joints_column,
403
+ VRM_UL_spring_bone1_joint,
404
+ spring,
405
+ "joints",
406
+ "active_joint_index",
407
+ ops.VRM_OT_add_spring_bone1_joint,
408
+ ops.VRM_OT_remove_spring_bone1_joint,
409
+ ops.VRM_OT_move_up_spring_bone1_joint,
410
+ ops.VRM_OT_move_down_spring_bone1_joint,
411
+ )
412
+
413
+ for joint_collection_op in joint_collection_ops:
414
+ joint_collection_op.armature_object_name = armature.name
415
+ joint_collection_op.spring_index = spring_index
416
+
417
+ for joint_collection_item_op in joint_collection_item_ops:
418
+ joint_collection_item_op.joint_index = joint_index
419
+
420
+ add_joint_op.guess_properties = True
421
+
422
+ if isinstance(joint, SpringBone1JointPropertyGroup):
423
+ VRM_MT_bone_assignment.draw_input_layout(joints_column, joint.node, simple=True)
424
+ joints_column.prop(joint, "stiffness", slider=True)
425
+ joints_column.prop(joint, "gravity_power", slider=True)
426
+ joints_column.prop(joint, "gravity_dir")
427
+ joints_column.prop(joint, "drag_force", slider=True)
428
+ joints_column.prop(joint, "hit_radius", slider=True)
429
+
430
+ if any(
431
+ sorted_joint == joint
432
+ for sorted_chain in sort_spring_bone_joints(armature, spring.joints)
433
+ for sorted_joint, _ in list(sorted_chain)[:-1]
434
+ ):
435
+ limit = joint.vrmc_spring_bone_limit
436
+ limit_box = joints_column.box()
437
+ limit_box.label(text="VRMC_springBone_limit (Experimental)")
438
+ limit_box.prop(limit, "limit_type")
439
+ if limit.limit_type == limit.LIMIT_TYPE_CONE.identifier:
440
+ limit_box.prop(limit, "cone_angle")
441
+ limit_box.prop(limit, "rotation")
442
+ elif limit.limit_type == limit.LIMIT_TYPE_HINGE.identifier:
443
+ limit_box.prop(limit, "hinge_angle")
444
+ limit_box.prop(limit, "rotation")
445
+ elif limit.limit_type == limit.LIMIT_TYPE_SPHERICAL.identifier:
446
+ limit_box.prop(limit, "spherical_pitch")
447
+ limit_box.prop(limit, "spherical_yaw")
448
+ limit_box.prop(limit, "rotation")
449
+
450
+ collider_groups_box = spring_column.box()
451
+ collider_groups_column = collider_groups_box.column()
452
+ collider_groups_column.label(text="Collider Groups:")
453
+
454
+ (
455
+ collider_group_collection_ops,
456
+ collider_group_collection_item_ops,
457
+ collider_group_index,
458
+ _collider_group,
459
+ _,
460
+ ) = draw_template_list(
461
+ collider_groups_column,
462
+ VRM_UL_spring_bone1_spring_collider_group,
463
+ spring,
464
+ "collider_groups",
465
+ "active_collider_group_index",
466
+ ops.VRM_OT_add_spring_bone1_spring_collider_group,
467
+ ops.VRM_OT_remove_spring_bone1_spring_collider_group,
468
+ ops.VRM_OT_move_up_spring_bone1_spring_collider_group,
469
+ ops.VRM_OT_move_down_spring_bone1_spring_collider_group,
470
+ )
471
+
472
+ for collider_group_collection_op in collider_group_collection_ops:
473
+ collider_group_collection_op.armature_object_name = armature.name
474
+ collider_group_collection_op.spring_index = spring_index
475
+
476
+ for collider_group_collection_item_op in collider_group_collection_item_ops:
477
+ collider_group_collection_item_op.collider_group_index = collider_group_index
478
+
479
+
480
+ class VRM_PT_spring_bone1_armature_object_property(Panel):
481
+ bl_idname = "VRM_PT_spring_bone1_armature_object_property"
482
+ bl_label = "Spring Bone"
483
+ bl_translation_context = "VRM"
484
+ bl_space_type = "PROPERTIES"
485
+ bl_region_type = "WINDOW"
486
+ bl_context = "object"
487
+ bl_options: ClassVar = {"DEFAULT_CLOSED"}
488
+ bl_parent_id = VRM_PT_vrm_armature_object_property.bl_idname
489
+
490
+ @classmethod
491
+ def poll(cls, context: Context) -> bool:
492
+ return active_object_is_vrm1_armature(context)
493
+
494
+ def draw_header(self, _context: Context) -> None:
495
+ self.layout.label(icon="PHYSICS")
496
+
497
+ def draw(self, context: Context) -> None:
498
+ active_object = context.active_object
499
+ if not active_object:
500
+ return
501
+ armature_data = active_object.data
502
+ if not isinstance(armature_data, Armature):
503
+ return
504
+ _draw_spring_bone1_spring_bone_layout(
505
+ active_object,
506
+ self.layout,
507
+ get_armature_extension(armature_data).spring_bone1,
508
+ )
509
+
510
+
511
+ class VRM_PT_spring_bone1_ui(Panel):
512
+ bl_idname = "VRM_PT_spring_bone1_ui"
513
+ bl_label = "Spring Bone"
514
+ bl_translation_context = "VRM"
515
+ bl_space_type = "VIEW_3D"
516
+ bl_region_type = "UI"
517
+ bl_category = "VRM"
518
+ bl_options: ClassVar = {"DEFAULT_CLOSED"}
519
+
520
+ @classmethod
521
+ def poll(cls, context: Context) -> bool:
522
+ return search.current_armature_is_vrm1(context)
523
+
524
+ def draw_header(self, _context: Context) -> None:
525
+ self.layout.label(icon="PHYSICS")
526
+
527
+ def draw(self, context: Context) -> None:
528
+ armature = search.current_armature(context)
529
+ if not armature:
530
+ return
531
+ armature_data = armature.data
532
+ if not isinstance(armature_data, Armature):
533
+ return
534
+ _draw_spring_bone1_spring_bone_layout(
535
+ armature,
536
+ self.layout,
537
+ get_armature_extension(armature_data).spring_bone1,
538
+ )
539
+
540
+
541
+ class VRM_PT_spring_bone1_collider_property(Panel):
542
+ bl_idname = "VRM_PT_spring_bone1_collider_property"
543
+ bl_label = "VRM Spring Bone Collider"
544
+ bl_space_type = "PROPERTIES"
545
+ bl_region_type = "WINDOW"
546
+ bl_context = "data"
547
+
548
+ @classmethod
549
+ def active_armature_and_collider(
550
+ cls, context: Context
551
+ ) -> Optional[tuple[Object, SpringBone1ColliderPropertyGroup]]:
552
+ active_object = context.active_object
553
+ if not active_object:
554
+ return None
555
+ if active_object.type != "EMPTY":
556
+ return None
557
+ parent = active_object.parent
558
+ if not parent:
559
+ return None
560
+
561
+ if active_object.parent_type == "BONE":
562
+ collider_object = context.active_object
563
+ elif active_object.parent_type == "OBJECT":
564
+ if parent.type == "ARMATURE":
565
+ collider_object = active_object
566
+ elif parent.parent_type == "BONE" or (
567
+ parent.parent_type == "OBJECT"
568
+ and parent.parent
569
+ and parent.parent.type == "ARMATURE"
570
+ ):
571
+ collider_object = parent
572
+ else:
573
+ return None
574
+ else:
575
+ return None
576
+ for obj in context.blend_data.objects:
577
+ if obj.type != "ARMATURE":
578
+ continue
579
+ armature_data = obj.data
580
+ if not isinstance(armature_data, Armature):
581
+ continue
582
+ for collider in get_armature_extension(
583
+ armature_data
584
+ ).spring_bone1.colliders:
585
+ if collider.bpy_object == collider_object:
586
+ return (obj, collider)
587
+ return None
588
+
589
+ @classmethod
590
+ def poll(cls, context: Context) -> bool:
591
+ return cls.active_armature_and_collider(context) is not None
592
+
593
+ def draw(self, context: Context) -> None:
594
+ armature_and_collider = self.active_armature_and_collider(context)
595
+ if armature_and_collider is None:
596
+ return
597
+ armature, collider = armature_and_collider
598
+ armature_data = armature.data
599
+ if not isinstance(armature_data, Armature):
600
+ return
601
+ if get_armature_extension(armature_data).is_vrm1():
602
+ _draw_spring_bone1_collider_layout(self.layout.column(), collider)
603
+ return
604
+
605
+ self.layout.label(text="This is a VRM 1.0 Spring Bone Collider", icon="INFO")