@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,315 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from collections.abc import Callable
3
+ from typing import (
4
+ ClassVar,
5
+ Optional,
6
+ Protocol,
7
+ TypeVar,
8
+ Union,
9
+ runtime_checkable,
10
+ )
11
+
12
+ from bpy.app.translations import pgettext
13
+ from bpy.types import (
14
+ AnyType,
15
+ Armature,
16
+ Context,
17
+ Menu,
18
+ Operator,
19
+ Panel,
20
+ UILayout,
21
+ UIList,
22
+ )
23
+
24
+ from ..common import version
25
+ from ..common.preferences import get_preferences
26
+ from . import make_armature, search, validation
27
+ from .extension_accessor import get_armature_extension
28
+ from .ops import layout_operator
29
+ from .validation import is_valid_url
30
+
31
+ __AddOperator = TypeVar("__AddOperator", bound=Operator)
32
+ __RemoveOperator = TypeVar("__RemoveOperator", bound=Operator)
33
+ __MoveUpOperator = TypeVar("__MoveUpOperator", bound=Operator)
34
+ __MoveDownOperator = TypeVar("__MoveDownOperator", bound=Operator)
35
+
36
+
37
+ @runtime_checkable
38
+ class TemplateListCollectionProtocol(Protocol):
39
+ def __len__(self) -> int: ...
40
+ def __getitem__(self, index: int) -> object: ...
41
+
42
+
43
+ def draw_url_warning(layout: UILayout, url: str) -> None:
44
+ if is_valid_url(url, allow_empty_str=True):
45
+ return
46
+ layout.label(
47
+ text=pgettext('"{url}" is not a valid URL.').format(url=url),
48
+ icon="ERROR",
49
+ translate=False,
50
+ )
51
+
52
+
53
+ def draw_template_list(
54
+ layout: UILayout,
55
+ template_list: type[UIList],
56
+ base_object: AnyType,
57
+ collection_attribue_name: str,
58
+ active_index_attribute_name: str,
59
+ add_operator_type: type[__AddOperator],
60
+ remove_operator_type: type[__RemoveOperator],
61
+ move_up_operator_type: type[__MoveUpOperator],
62
+ move_down_operator_type: type[__MoveDownOperator],
63
+ *,
64
+ can_remove: Callable[[int], bool] = lambda _: True,
65
+ can_move: Callable[[int], bool] = lambda _: True,
66
+ compact: bool = False,
67
+ menu_and_context_pointer_set_callback: Optional[
68
+ tuple[type[Menu], Callable[[UILayout], None]]
69
+ ] = None,
70
+ ) -> tuple[
71
+ list[Union[__AddOperator, __RemoveOperator, __MoveUpOperator, __MoveDownOperator]],
72
+ list[Union[__RemoveOperator, __MoveUpOperator, __MoveDownOperator]],
73
+ int,
74
+ object,
75
+ tuple[
76
+ __AddOperator,
77
+ __RemoveOperator,
78
+ Optional[__MoveUpOperator],
79
+ Optional[__MoveDownOperator],
80
+ ],
81
+ ]:
82
+ collection = getattr(base_object, collection_attribue_name, None)
83
+ if not isinstance(collection, TemplateListCollectionProtocol):
84
+ message = (
85
+ f"{collection}.{collection_attribue_name}"
86
+ + " is not a Template List Collection Protocol."
87
+ )
88
+ raise TypeError(message)
89
+
90
+ active_index = getattr(base_object, active_index_attribute_name, None)
91
+ if not isinstance(active_index, int):
92
+ message = f"{base_object}.{active_index_attribute_name} is not an int."
93
+ raise TypeError(message)
94
+
95
+ if 0 <= active_index < len(collection):
96
+ active_object = collection[active_index]
97
+ else:
98
+ active_object = None
99
+
100
+ length = len(collection)
101
+ list_row_len = 4 if length > int(compact) else 2
102
+
103
+ list_row = layout.row()
104
+ list_row.template_list(
105
+ template_list.bl_idname,
106
+ "",
107
+ base_object,
108
+ collection_attribue_name,
109
+ base_object,
110
+ active_index_attribute_name,
111
+ rows=list_row_len,
112
+ )
113
+ list_side_column = list_row.column(align=True)
114
+ add_operator = layout_operator(
115
+ list_side_column, add_operator_type, icon="ADD", text="", translate=False
116
+ )
117
+
118
+ if length >= 1 and 0 <= active_index < length and can_remove(active_index):
119
+ remove_operator_parent = list_side_column
120
+ else:
121
+ remove_operator_parent = list_side_column.column(align=True)
122
+ remove_operator_parent.enabled = False
123
+
124
+ remove_operator = layout_operator(
125
+ remove_operator_parent,
126
+ remove_operator_type,
127
+ icon="REMOVE",
128
+ text="",
129
+ translate=False,
130
+ )
131
+
132
+ if menu_and_context_pointer_set_callback is not None:
133
+ menu, context_pointer_set = menu_and_context_pointer_set_callback
134
+ context_pointer_set(list_side_column)
135
+ list_side_column.separator()
136
+ list_side_column.menu(menu=menu.bl_idname, text="", icon="DOWNARROW_HLT")
137
+
138
+ move_operator_parent = list_side_column.column(align=True)
139
+ # Without separator, the button width changes mysteriously when list elements are 0
140
+ move_operator_parent.separator()
141
+ if length <= 1 or not (0 <= active_index < length) or not can_move(active_index):
142
+ move_operator_parent.enabled = False
143
+
144
+ collection_ops: list[
145
+ Union[__AddOperator, __RemoveOperator, __MoveUpOperator, __MoveDownOperator]
146
+ ] = [add_operator]
147
+ collection_item_ops: list[
148
+ Union[__RemoveOperator, __MoveUpOperator, __MoveDownOperator]
149
+ ] = [remove_operator]
150
+
151
+ if length > int(compact):
152
+ move_up_operator = layout_operator(
153
+ move_operator_parent,
154
+ move_up_operator_type,
155
+ icon="TRIA_UP",
156
+ text="",
157
+ translate=False,
158
+ )
159
+ collection_item_ops.append(move_up_operator)
160
+ move_down_operator = layout_operator(
161
+ move_operator_parent,
162
+ move_down_operator_type,
163
+ icon="TRIA_DOWN",
164
+ text="",
165
+ translate=False,
166
+ )
167
+ collection_item_ops.append(move_down_operator)
168
+ else:
169
+ move_up_operator = None
170
+ move_down_operator = None
171
+
172
+ collection_ops.extend(collection_item_ops)
173
+
174
+ return (
175
+ collection_ops,
176
+ collection_item_ops,
177
+ active_index,
178
+ active_object,
179
+ (add_operator, remove_operator, move_up_operator, move_down_operator),
180
+ )
181
+
182
+
183
+ class VRM_PT_vrm_armature_object_property(Panel):
184
+ bl_idname = "VRM_PT_vrm_armature_object_property"
185
+ bl_label = "VRM"
186
+ bl_space_type = "PROPERTIES"
187
+ bl_region_type = "WINDOW"
188
+ bl_context = "object"
189
+
190
+ @classmethod
191
+ def poll(cls, context: Context) -> bool:
192
+ active_object = context.active_object
193
+ if not active_object:
194
+ return False
195
+ armature_data = active_object.data
196
+ return isinstance(armature_data, Armature)
197
+
198
+ def draw(self, _context: Context) -> None:
199
+ warning_message = version.panel_warning_message()
200
+ if not warning_message:
201
+ return
202
+
203
+ box = self.layout.box()
204
+ warning_column = box.column()
205
+ for index, warning_line in enumerate(warning_message.splitlines()):
206
+ warning_column.label(
207
+ text=warning_line,
208
+ translate=False,
209
+ icon="NONE" if index else "ERROR",
210
+ )
211
+
212
+
213
+ def add_armature(add_armature_op: Operator, _context: Context) -> None:
214
+ layout_operator(
215
+ add_armature_op.layout,
216
+ make_armature.ICYP_OT_make_armature,
217
+ text="VRM Humanoid",
218
+ icon="OUTLINER_OB_ARMATURE",
219
+ ).skip_heavy_armature_setup = True
220
+
221
+
222
+ class VRM_PT_current_selected_armature(Panel):
223
+ bl_idname = "VRM_PT_current_selected_armature"
224
+ bl_label = "Current selected armature"
225
+ bl_space_type = "VIEW_3D"
226
+ bl_region_type = "UI"
227
+ bl_category = "VRM"
228
+ bl_options: ClassVar = {"HIDE_HEADER"}
229
+
230
+ @classmethod
231
+ def poll(cls, context: Context) -> bool:
232
+ return search.multiple_armatures_exist(context)
233
+
234
+ def draw(self, context: Context) -> None:
235
+ armature = search.current_armature(context)
236
+ if not armature:
237
+ return
238
+ layout = self.layout
239
+ layout.label(text=armature.name, icon="ARMATURE_DATA", translate=False)
240
+
241
+
242
+ class VRM_PT_controller(Panel):
243
+ bl_idname = "ICYP_PT_ui_controller"
244
+ bl_label = "Operator"
245
+ bl_space_type = "VIEW_3D"
246
+ bl_region_type = "UI"
247
+ bl_category = "VRM"
248
+
249
+ def draw_header(self, _context: Context) -> None:
250
+ self.layout.label(icon="TOOL_SETTINGS")
251
+
252
+ def draw(self, context: Context) -> None:
253
+ layout = self.layout
254
+ preferences = get_preferences(context)
255
+
256
+ # draw_main
257
+ layout_operator(
258
+ layout,
259
+ make_armature.ICYP_OT_make_armature,
260
+ text=pgettext("Create VRM Model"),
261
+ icon="OUTLINER_OB_ARMATURE",
262
+ ).skip_heavy_armature_setup = True
263
+ vrm_validator_op = layout_operator(
264
+ layout,
265
+ validation.WM_OT_vrm_validator,
266
+ text=pgettext("Check VRM Model"),
267
+ icon="VIEWZOOM",
268
+ )
269
+ vrm_validator_op.show_successful_message = True
270
+ layout.prop(preferences, "export_invisibles")
271
+ layout.prop(preferences, "export_only_selections")
272
+
273
+ armature = search.current_armature(context)
274
+ if armature:
275
+ vrm_validator_op.armature_object_name = armature.name
276
+ armature_data = armature.data
277
+ if isinstance(armature_data, Armature):
278
+ ext = get_armature_extension(armature_data)
279
+ layout.prop(
280
+ ext,
281
+ "spec_version",
282
+ text="",
283
+ translate=False,
284
+ )
285
+ if ext.is_khr_character():
286
+ box = layout.box()
287
+ column = box.column(align=True)
288
+ column.label(icon="ERROR", text="KHR character support is")
289
+ column.label(icon="BLANK1", text="under development")
290
+
291
+
292
+ class VRM_PT_controller_unsupported_blender_version_warning(Panel):
293
+ bl_idname = "VRM_PT_controller_unsupported_blender_version_warning"
294
+ bl_label = "Unsupported Blender Version Warning"
295
+ bl_space_type = "VIEW_3D"
296
+ bl_region_type = "UI"
297
+ bl_category = "VRM"
298
+ bl_options: ClassVar = {"HIDE_HEADER"}
299
+
300
+ @classmethod
301
+ def poll(cls, _context: Context) -> bool:
302
+ return bool(version.panel_warning_message())
303
+
304
+ def draw(self, _context: Context) -> None:
305
+ warning_message = version.panel_warning_message()
306
+ if warning_message is None:
307
+ return
308
+ box = self.layout.box()
309
+ warning_column = box.column()
310
+ for index, warning_line in enumerate(warning_message.splitlines()):
311
+ warning_column.label(
312
+ text=warning_line,
313
+ translate=False,
314
+ icon="NONE" if index else "ERROR",
315
+ )