@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,90 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from dataclasses import dataclass
3
+
4
+ from bpy.types import Armature, Context
5
+
6
+ from ...common import ops
7
+ from ...common.logger import get_logger
8
+ from ...common.scene_watcher import RunState, SceneWatcher
9
+ from ..extension_accessor import get_armature_extension
10
+ from .property_group import Vrm1LookAtPropertyGroup
11
+
12
+ _logger = get_logger(__name__)
13
+
14
+
15
+ @dataclass
16
+ class LookAtPreviewUpdater(SceneWatcher):
17
+ object_index: int = 0
18
+
19
+ def reset_run_progress(self) -> None:
20
+ self.object_index = 0
21
+
22
+ def run(self, context: Context) -> RunState:
23
+ """Detect updates to the target object of Look At and update the state."""
24
+ # If this value becomes zero, return PREEMPT and interrupt the process.
25
+ # If a change is detected, update previews and return FINISH.
26
+ preempt_countdown = 50
27
+
28
+ if not context.blend_data.armatures:
29
+ return RunState.FINISH
30
+ objects = context.visible_objects
31
+ if not objects:
32
+ return RunState.FINISH
33
+
34
+ objects_len = len(objects)
35
+ if self.object_index >= objects_len:
36
+ self.object_index = 0
37
+
38
+ next_object_index = self.object_index
39
+ for obj in objects[self.object_index : objects_len]:
40
+ self.object_index = next_object_index
41
+ next_object_index += 1
42
+
43
+ preempt_countdown -= 1
44
+ if preempt_countdown <= 0:
45
+ return RunState.PREEMPT
46
+
47
+ if obj.type != "ARMATURE":
48
+ continue
49
+ armature_data = obj.data
50
+ if not isinstance(armature_data, Armature):
51
+ continue
52
+ ext = get_armature_extension(armature_data)
53
+ if not ext.is_vrm1():
54
+ continue
55
+ look_at = ext.vrm1.look_at
56
+ if look_at.update_preview(context, obj, ext.vrm1, check_only=True):
57
+ Vrm1LookAtPropertyGroup.update_all_previews(context)
58
+ return RunState.FINISH
59
+
60
+ preempt_countdown -= 10
61
+
62
+ return RunState.FINISH
63
+
64
+ def create_fast_path_performance_test_objects(self, context: Context) -> None:
65
+ blend_data = context.blend_data
66
+
67
+ for i in range(300):
68
+ if i % 3 != 0:
69
+ mesh = blend_data.meshes.new(f"Mesh#{i}")
70
+ obj = blend_data.objects.new(f"Object#{i}", mesh)
71
+ context.scene.collection.objects.link(obj)
72
+ continue
73
+
74
+ ops.icyp.make_basic_armature()
75
+ active_object = context.active_object
76
+ if not active_object:
77
+ message = f"Not an armature: {active_object}"
78
+ raise ValueError(message)
79
+ armature = active_object.data
80
+ if not isinstance(armature, Armature):
81
+ raise TypeError
82
+
83
+ ext = get_armature_extension(armature)
84
+ ext.spec_version = ext.SPEC_VERSION_VRM1
85
+ look_at = ext.vrm1.look_at
86
+ look_at.type = ext.vrm1.look_at.TYPE_BONE.identifier
87
+ look_at.preview_target_bpy_object = blend_data.objects[
88
+ i * 5 % len(blend_data.objects)
89
+ ]
90
+ ext.vrm1.look_at.enable_preview = True
@@ -0,0 +1,533 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from bpy.app.translations import pgettext
3
+ from bpy.types import Context, Mesh, UILayout, UIList
4
+
5
+ from ...common import convert
6
+ from ...common.logger import get_logger
7
+ from ..property_group import StringPropertyGroup
8
+ from .property_group import (
9
+ Vrm1ExpressionsPropertyGroup,
10
+ Vrm1FirstPersonPropertyGroup,
11
+ Vrm1MaterialColorBindPropertyGroup,
12
+ Vrm1MeshAnnotationPropertyGroup,
13
+ Vrm1MetaPropertyGroup,
14
+ Vrm1MorphTargetBindPropertyGroup,
15
+ Vrm1TextureTransformBindPropertyGroup,
16
+ )
17
+
18
+ _logger = get_logger(__name__)
19
+
20
+
21
+ class VRM_UL_vrm1_meta_author(UIList):
22
+ bl_idname = "VRM_UL_vrm1_meta_author"
23
+
24
+ def filter_items(
25
+ self,
26
+ _context: Context,
27
+ data: object,
28
+ propname: str,
29
+ ) -> tuple[list[int], list[int]]:
30
+ items = convert.sequence_or_none(getattr(data, propname, None))
31
+ if items is None:
32
+ return ([], [])
33
+
34
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
35
+ flt_neworder: list[int] = []
36
+
37
+ filter_name: str = self.filter_name.casefold()
38
+ if not filter_name:
39
+ return (flt_flags, flt_neworder)
40
+
41
+ for index, item in enumerate(items):
42
+ if (
43
+ isinstance(item, StringPropertyGroup)
44
+ and filter_name in item.value.casefold()
45
+ ):
46
+ continue
47
+ flt_flags[index] = 0
48
+
49
+ return (flt_flags, flt_neworder)
50
+
51
+ def draw_item(
52
+ self,
53
+ _context: Context,
54
+ layout: UILayout,
55
+ meta: object,
56
+ author: object,
57
+ _icon: int,
58
+ _active_data: object,
59
+ _active_prop_name: str,
60
+ index: int,
61
+ _flt_flag: int,
62
+ ) -> None:
63
+ if not isinstance(meta, Vrm1MetaPropertyGroup):
64
+ return
65
+ if not isinstance(author, StringPropertyGroup):
66
+ return
67
+
68
+ icon = "USER"
69
+
70
+ if self.layout_type == "GRID":
71
+ layout.alignment = "CENTER"
72
+ layout.label(text="", translate=False, icon=icon)
73
+ return
74
+
75
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
76
+ return
77
+
78
+ if index == meta.active_author_index:
79
+ layout.prop(author, "value", icon=icon, text="", translate=False)
80
+ else:
81
+ layout.label(text=author.value, icon=icon, translate=False)
82
+
83
+
84
+ class VRM_UL_vrm1_meta_reference(UIList):
85
+ bl_idname = "VRM_UL_vrm1_meta_reference"
86
+
87
+ def filter_items(
88
+ self,
89
+ _context: Context,
90
+ data: object,
91
+ propname: str,
92
+ ) -> tuple[list[int], list[int]]:
93
+ items = convert.sequence_or_none(getattr(data, propname, None))
94
+ if items is None:
95
+ return ([], [])
96
+
97
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
98
+ flt_neworder: list[int] = []
99
+
100
+ filter_name: str = self.filter_name.casefold()
101
+ if not filter_name:
102
+ return (flt_flags, flt_neworder)
103
+
104
+ for index, item in enumerate(items):
105
+ if (
106
+ isinstance(item, StringPropertyGroup)
107
+ and filter_name in item.value.casefold()
108
+ ):
109
+ continue
110
+ flt_flags[index] = 0
111
+
112
+ return (flt_flags, flt_neworder)
113
+
114
+ def draw_item(
115
+ self,
116
+ _context: Context,
117
+ layout: UILayout,
118
+ meta: object,
119
+ reference: object,
120
+ _icon: int,
121
+ _active_data: object,
122
+ _active_prop_name: str,
123
+ index: int,
124
+ _flt_flag: int,
125
+ ) -> None:
126
+ if not isinstance(meta, Vrm1MetaPropertyGroup):
127
+ return
128
+ if not isinstance(reference, StringPropertyGroup):
129
+ return
130
+
131
+ icon = "URL"
132
+
133
+ if self.layout_type == "GRID":
134
+ layout.alignment = "CENTER"
135
+ layout.label(text="", translate=False, icon=icon)
136
+ return
137
+
138
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
139
+ return
140
+
141
+ if index == meta.active_reference_index:
142
+ layout.prop(reference, "value", icon=icon, text="", translate=False)
143
+ else:
144
+ layout.label(text=reference.value, icon=icon, translate=False)
145
+
146
+
147
+ class VRM_UL_vrm1_first_person_mesh_annotation(UIList):
148
+ bl_idname = "VRM_UL_vrm1_first_person_mesh_annotation"
149
+
150
+ def filter_items(
151
+ self,
152
+ _context: Context,
153
+ data: object,
154
+ propname: str,
155
+ ) -> tuple[list[int], list[int]]:
156
+ items = convert.sequence_or_none(getattr(data, propname, None))
157
+ if items is None:
158
+ return ([], [])
159
+
160
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
161
+ flt_neworder: list[int] = []
162
+
163
+ filter_name: str = self.filter_name.casefold()
164
+ if not filter_name:
165
+ return (flt_flags, flt_neworder)
166
+
167
+ for index, item in enumerate(items):
168
+ if (
169
+ isinstance(item, Vrm1MeshAnnotationPropertyGroup)
170
+ and filter_name in item.node.mesh_object_name.casefold()
171
+ ):
172
+ continue
173
+ flt_flags[index] = 0
174
+
175
+ return (flt_flags, flt_neworder)
176
+
177
+ def draw_item(
178
+ self,
179
+ _context: Context,
180
+ layout: UILayout,
181
+ first_person: object,
182
+ mesh_annotation: object,
183
+ _icon: int,
184
+ _active_data: object,
185
+ _active_prop_name: str,
186
+ index: int,
187
+ _flt_flag: int,
188
+ ) -> None:
189
+ if not isinstance(first_person, Vrm1FirstPersonPropertyGroup):
190
+ return
191
+ if not isinstance(mesh_annotation, Vrm1MeshAnnotationPropertyGroup):
192
+ return
193
+
194
+ icon = "OUTLINER_OB_MESH"
195
+
196
+ if self.layout_type == "GRID":
197
+ layout.alignment = "CENTER"
198
+ layout.label(text="", translate=False, icon=icon)
199
+ return
200
+
201
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
202
+ return
203
+
204
+ row = layout.split(factor=0.6, align=True)
205
+ if index == first_person.active_mesh_annotation_index:
206
+ row.prop(
207
+ mesh_annotation.node,
208
+ "bpy_object",
209
+ text="",
210
+ translate=False,
211
+ icon=icon,
212
+ )
213
+ else:
214
+ row.label(
215
+ text=mesh_annotation.node.mesh_object_name,
216
+ translate=False,
217
+ icon=icon,
218
+ )
219
+ row.prop(mesh_annotation, "type", text="", translate=False)
220
+
221
+
222
+ class VRM_UL_vrm1_expression(UIList):
223
+ bl_idname = "VRM_UL_vrm1_expression"
224
+
225
+ def filter_items(
226
+ self,
227
+ _context: Context,
228
+ expressions: object,
229
+ _propname: str,
230
+ ) -> tuple[list[int], list[int]]:
231
+ if not isinstance(expressions, Vrm1ExpressionsPropertyGroup):
232
+ return ([], [])
233
+
234
+ expression_ui_list_elements = expressions.expression_ui_list_elements
235
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(
236
+ expression_ui_list_elements
237
+ )
238
+ flt_neworder: list[int] = []
239
+
240
+ filter_name: str = self.filter_name.casefold()
241
+ if not filter_name:
242
+ return (flt_flags, flt_neworder)
243
+
244
+ preset_expression_items = list(
245
+ expressions.preset.name_to_expression_dict().items()
246
+ )
247
+ preset_len = len(preset_expression_items)
248
+ custom_expressions = expressions.custom
249
+
250
+ for index in range(len(expression_ui_list_elements)):
251
+ if index < preset_len:
252
+ name, _ = preset_expression_items[index]
253
+ else:
254
+ custom_index = index - preset_len
255
+ if custom_index >= len(custom_expressions):
256
+ flt_flags[index] = 0
257
+ continue
258
+ name = custom_expressions[custom_index].custom_name
259
+
260
+ if filter_name not in name.casefold():
261
+ flt_flags[index] = 0
262
+
263
+ return (flt_flags, flt_neworder)
264
+
265
+ def draw_item(
266
+ self,
267
+ _context: Context,
268
+ layout: UILayout,
269
+ expressions: object,
270
+ _item: object,
271
+ _icon: int,
272
+ _active_data: object,
273
+ _active_prop_name: str,
274
+ index: int,
275
+ _flt_flag: int,
276
+ ) -> None:
277
+ if not isinstance(expressions, Vrm1ExpressionsPropertyGroup):
278
+ return
279
+ preset_expression_items = list(
280
+ expressions.preset.name_to_expression_dict().items()
281
+ )
282
+ if index < len(preset_expression_items):
283
+ name, expression = preset_expression_items[index]
284
+ icon = expressions.preset.get_icon(name)
285
+ if not icon:
286
+ _logger.error("Unknown preset expression: %s", name)
287
+ icon = "SHAPEKEY_DATA"
288
+ else:
289
+ custom_expressions = expressions.custom
290
+ custom_index = index - len(preset_expression_items)
291
+ if custom_index >= len(custom_expressions):
292
+ return
293
+ expression = custom_expressions[custom_index]
294
+ name = expression.custom_name
295
+ icon = "SHAPEKEY_DATA"
296
+
297
+ if self.layout_type == "GRID":
298
+ layout.alignment = "CENTER"
299
+ layout.label(text="", translate=False, icon=icon)
300
+ return
301
+
302
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
303
+ return
304
+
305
+ split = layout.split(align=True, factor=0.55)
306
+ split.label(text=name, translate=False, icon=icon)
307
+ split.prop(expression, "preview", text="Preview")
308
+
309
+
310
+ class VRM_UL_vrm1_morph_target_bind(UIList):
311
+ bl_idname = "VRM_UL_vrm1_morph_target_bind"
312
+
313
+ def format_label_text(
314
+ self, context: Context, morph_target_bind: Vrm1MorphTargetBindPropertyGroup
315
+ ) -> str:
316
+ text = morph_target_bind.node.mesh_object_name
317
+ mesh_object = context.blend_data.objects.get(
318
+ morph_target_bind.node.mesh_object_name
319
+ )
320
+ if mesh_object:
321
+ mesh_data = mesh_object.data
322
+ if isinstance(mesh_data, Mesh):
323
+ shape_keys = mesh_data.shape_keys
324
+ if shape_keys:
325
+ keys = shape_keys.key_blocks.keys()
326
+ if morph_target_bind.index in keys:
327
+ text += " / " + morph_target_bind.index
328
+ return text
329
+
330
+ def filter_items(
331
+ self,
332
+ context: Context,
333
+ data: object,
334
+ propname: str,
335
+ ) -> tuple[list[int], list[int]]:
336
+ items = convert.sequence_or_none(getattr(data, propname, None))
337
+ if items is None:
338
+ return ([], [])
339
+
340
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
341
+ flt_neworder: list[int] = []
342
+
343
+ filter_name: str = self.filter_name.casefold()
344
+ if not filter_name:
345
+ return (flt_flags, flt_neworder)
346
+
347
+ for index, item in enumerate(items):
348
+ if (
349
+ isinstance(item, Vrm1MorphTargetBindPropertyGroup)
350
+ and filter_name in self.format_label_text(context, item).casefold()
351
+ ):
352
+ continue
353
+ flt_flags[index] = 0
354
+
355
+ return (flt_flags, flt_neworder)
356
+
357
+ def draw_item(
358
+ self,
359
+ context: Context,
360
+ layout: UILayout,
361
+ _data: object,
362
+ morph_target_bind: object,
363
+ icon: int,
364
+ _active_data: object,
365
+ _active_prop_name: str,
366
+ _index: int,
367
+ _flt_flag: int,
368
+ ) -> None:
369
+ if not isinstance(morph_target_bind, Vrm1MorphTargetBindPropertyGroup):
370
+ return
371
+
372
+ if self.layout_type == "GRID":
373
+ layout.alignment = "CENTER"
374
+ layout.label(text="", icon_value=icon)
375
+ return
376
+
377
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
378
+ return
379
+
380
+ layout.label(
381
+ text=self.format_label_text(context, morph_target_bind),
382
+ translate=False,
383
+ icon="MESH_DATA",
384
+ )
385
+
386
+
387
+ class VRM_UL_vrm1_material_color_bind(UIList):
388
+ bl_idname = "VRM_UL_vrm1_material_color_bind"
389
+
390
+ def format_label_text(
391
+ self, material_color_bind: Vrm1MaterialColorBindPropertyGroup
392
+ ) -> str:
393
+ text = ""
394
+ material = material_color_bind.material
395
+ if material:
396
+ text = material.name
397
+ type_name = next(
398
+ (
399
+ enum.name
400
+ for enum in Vrm1MaterialColorBindPropertyGroup.type_enum
401
+ if enum.identifier == material_color_bind.type
402
+ ),
403
+ None,
404
+ )
405
+ if type_name:
406
+ text += " / " + pgettext(type_name)
407
+ return text
408
+
409
+ def filter_items(
410
+ self,
411
+ _context: Context,
412
+ data: object,
413
+ propname: str,
414
+ ) -> tuple[list[int], list[int]]:
415
+ items = convert.sequence_or_none(getattr(data, propname, None))
416
+ if items is None:
417
+ return ([], [])
418
+
419
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
420
+ flt_neworder: list[int] = []
421
+
422
+ filter_name: str = self.filter_name.casefold()
423
+ if not filter_name:
424
+ return (flt_flags, flt_neworder)
425
+
426
+ for index, item in enumerate(items):
427
+ if (
428
+ isinstance(item, Vrm1MaterialColorBindPropertyGroup)
429
+ and filter_name in self.format_label_text(item).casefold()
430
+ ):
431
+ continue
432
+ flt_flags[index] = 0
433
+
434
+ return (flt_flags, flt_neworder)
435
+
436
+ def draw_item(
437
+ self,
438
+ _context: Context,
439
+ layout: UILayout,
440
+ _data: object,
441
+ material_color_bind: object,
442
+ icon: int,
443
+ _active_data: object,
444
+ _active_prop_name: str,
445
+ _index: int,
446
+ _flt_flag: int,
447
+ ) -> None:
448
+ if not isinstance(material_color_bind, Vrm1MaterialColorBindPropertyGroup):
449
+ return
450
+
451
+ if self.layout_type == "GRID":
452
+ layout.alignment = "CENTER"
453
+ layout.label(text="", translate=False, icon_value=icon)
454
+ return
455
+
456
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
457
+ return
458
+
459
+ layout.label(
460
+ text=self.format_label_text(material_color_bind),
461
+ translate=False,
462
+ icon="MATERIAL",
463
+ )
464
+
465
+
466
+ class VRM_UL_vrm1_texture_transform_bind(UIList):
467
+ bl_idname = "VRM_UL_vrm1_texture_transform_bind"
468
+
469
+ def format_label_text(
470
+ self, texture_transform_bind: Vrm1TextureTransformBindPropertyGroup
471
+ ) -> str:
472
+ material = texture_transform_bind.material
473
+ if not material:
474
+ return ""
475
+ return material.name
476
+
477
+ def filter_items(
478
+ self,
479
+ _context: Context,
480
+ data: object,
481
+ propname: str,
482
+ ) -> tuple[list[int], list[int]]:
483
+ items = convert.sequence_or_none(getattr(data, propname, None))
484
+ if items is None:
485
+ return ([], [])
486
+
487
+ flt_flags: list[int] = [self.bitflag_filter_item] * len(items)
488
+ flt_neworder: list[int] = []
489
+
490
+ filter_name: str = self.filter_name.casefold()
491
+ if not filter_name:
492
+ return (flt_flags, flt_neworder)
493
+
494
+ for index, item in enumerate(items):
495
+ if (
496
+ isinstance(item, Vrm1TextureTransformBindPropertyGroup)
497
+ and filter_name in self.format_label_text(item).casefold()
498
+ ):
499
+ continue
500
+ flt_flags[index] = 0
501
+
502
+ return (flt_flags, flt_neworder)
503
+
504
+ def draw_item(
505
+ self,
506
+ _context: Context,
507
+ layout: UILayout,
508
+ _data: object,
509
+ texture_transform_bind: object,
510
+ icon: int,
511
+ _active_data: object,
512
+ _active_prop_name: str,
513
+ _index: int,
514
+ _flt_flag: int,
515
+ ) -> None:
516
+ if not isinstance(
517
+ texture_transform_bind, Vrm1TextureTransformBindPropertyGroup
518
+ ):
519
+ return
520
+
521
+ if self.layout_type == "GRID":
522
+ layout.alignment = "CENTER"
523
+ layout.label(text="", translate=False, icon_value=icon)
524
+ return
525
+
526
+ if self.layout_type not in {"DEFAULT", "COMPACT"}:
527
+ return
528
+
529
+ layout.label(
530
+ text=self.format_label_text(texture_transform_bind),
531
+ translate=False,
532
+ icon="MATERIAL",
533
+ )
@@ -0,0 +1 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later