@volter/blender-engine 0.1.148 → 0.1.149

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +4 -11
  3. package/browser/addons/vrm/LICENSE_(OPTION1)_MIT.txt +22 -0
  4. package/browser/addons/vrm/LICENSE_(OPTION2)_GPL-3_0.txt +674 -0
  5. package/browser/addons/vrm/LICENSE_MAIN.txt +1 -0
  6. package/browser/addons/vrm/README.txt +3 -0
  7. package/browser/addons/vrm/__init__.py +41 -0
  8. package/browser/addons/vrm/blender_manifest.toml +16 -0
  9. package/browser/addons/vrm/common/__init__.py +1 -0
  10. package/browser/addons/vrm/common/animation.py +58 -0
  11. package/browser/addons/vrm/common/blender_manifest.py +82 -0
  12. package/browser/addons/vrm/common/char.py +16 -0
  13. package/browser/addons/vrm/common/convert.py +287 -0
  14. package/browser/addons/vrm/common/convert_any.py +48 -0
  15. package/browser/addons/vrm/common/debug.py +40 -0
  16. package/browser/addons/vrm/common/deep.py +162 -0
  17. package/browser/addons/vrm/common/error_dialog.py +274 -0
  18. package/browser/addons/vrm/common/fs.py +71 -0
  19. package/browser/addons/vrm/common/gl.py +20 -0
  20. package/browser/addons/vrm/common/gltf.py +1149 -0
  21. package/browser/addons/vrm/common/human_bone_mapper/__init__.py +1 -0
  22. package/browser/addons/vrm/common/human_bone_mapper/biped_mapping.py +84 -0
  23. package/browser/addons/vrm/common/human_bone_mapper/cats_blender_plugin_fix_model_mapping.py +63 -0
  24. package/browser/addons/vrm/common/human_bone_mapper/human_bone_mapper.py +203 -0
  25. package/browser/addons/vrm/common/human_bone_mapper/microsoft_rocketbox_mapping.py +69 -0
  26. package/browser/addons/vrm/common/human_bone_mapper/mixamo_mapping.py +62 -0
  27. package/browser/addons/vrm/common/human_bone_mapper/mmd_mapping.py +115 -0
  28. package/browser/addons/vrm/common/human_bone_mapper/mpfb_mapping.py +120 -0
  29. package/browser/addons/vrm/common/human_bone_mapper/ready_player_me_mapping.py +65 -0
  30. package/browser/addons/vrm/common/human_bone_mapper/reallusion_mapping.py +94 -0
  31. package/browser/addons/vrm/common/human_bone_mapper/rigify_meta_rig_mapping.py +65 -0
  32. package/browser/addons/vrm/common/human_bone_mapper/structure_based_mapping.py +891 -0
  33. package/browser/addons/vrm/common/human_bone_mapper/unreal_mapping.py +62 -0
  34. package/browser/addons/vrm/common/human_bone_mapper/vrm_addon_mapping.py +112 -0
  35. package/browser/addons/vrm/common/human_bone_mapper/vroid_mapping.py +89 -0
  36. package/browser/addons/vrm/common/legacy_gltf.py +16 -0
  37. package/browser/addons/vrm/common/logger.py +84 -0
  38. package/browser/addons/vrm/common/mtoon0.blend +0 -0
  39. package/browser/addons/vrm/common/mtoon1.blend +0 -0
  40. package/browser/addons/vrm/common/mtoon1_outline.blend +0 -0
  41. package/browser/addons/vrm/common/mtoon_auto_setup.blend +0 -0
  42. package/browser/addons/vrm/common/mtoon_unversioned.py +62 -0
  43. package/browser/addons/vrm/common/ops/__init__.py +10 -0
  44. package/browser/addons/vrm/common/ops/export_scene.py +67 -0
  45. package/browser/addons/vrm/common/ops/icyp.py +53 -0
  46. package/browser/addons/vrm/common/ops/import_scene.py +57 -0
  47. package/browser/addons/vrm/common/ops/vrm.py +2380 -0
  48. package/browser/addons/vrm/common/ops/wm.py +167 -0
  49. package/browser/addons/vrm/common/preferences.py +362 -0
  50. package/browser/addons/vrm/common/progress.py +87 -0
  51. package/browser/addons/vrm/common/rotation.py +89 -0
  52. package/browser/addons/vrm/common/safe_removal.py +46 -0
  53. package/browser/addons/vrm/common/scene_watcher.py +230 -0
  54. package/browser/addons/vrm/common/shader.py +2243 -0
  55. package/browser/addons/vrm/common/shape_key_mapper/__init__.py +1 -0
  56. package/browser/addons/vrm/common/shape_key_mapper/arkit_mapping.py +168 -0
  57. package/browser/addons/vrm/common/shape_key_mapper/mmd_mapping.py +62 -0
  58. package/browser/addons/vrm/common/shape_key_mapper/ready_player_me_mapping.py +52 -0
  59. package/browser/addons/vrm/common/shape_key_mapper/vrchat_mapping.py +17 -0
  60. package/browser/addons/vrm/common/third_party_user_extension.py +214 -0
  61. package/browser/addons/vrm/common/transparent_z_write.blend +0 -0
  62. package/browser/addons/vrm/common/version.py +161 -0
  63. package/browser/addons/vrm/common/vrm0/__init__.py +1 -0
  64. package/browser/addons/vrm/common/vrm0/human_bone.py +662 -0
  65. package/browser/addons/vrm/common/vrm0/material_property.py +346 -0
  66. package/browser/addons/vrm/common/vrm1/__init__.py +1 -0
  67. package/browser/addons/vrm/common/vrm1/expression_preset.py +207 -0
  68. package/browser/addons/vrm/common/vrm1/human_bone.py +822 -0
  69. package/browser/addons/vrm/common/workspace.py +227 -0
  70. package/browser/addons/vrm/common/writable_context.py +77 -0
  71. package/browser/addons/vrm/documentation/en-us/animation/index.md +63 -0
  72. package/browser/addons/vrm/documentation/en-us/create-humanoid-vrm-from-scratch/index.md +131 -0
  73. package/browser/addons/vrm/documentation/en-us/create-simple-vrm-from-scratch/index.md +30 -0
  74. package/browser/addons/vrm/documentation/en-us/development/index.md +136 -0
  75. package/browser/addons/vrm/documentation/en-us/index.md +41 -0
  76. package/browser/addons/vrm/documentation/en-us/installation/index.md +152 -0
  77. package/browser/addons/vrm/documentation/en-us/material-mtoon/index.md +122 -0
  78. package/browser/addons/vrm/documentation/en-us/material-pbr/index.md +94 -0
  79. package/browser/addons/vrm/documentation/en-us/scripting-api/index.md +391 -0
  80. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrm/index.md +57 -0
  81. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrma/index.md +17 -0
  82. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrm/index.md +61 -0
  83. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrma/index.md +13 -0
  84. package/browser/addons/vrm/documentation/ja-jp/animation/index.md +57 -0
  85. package/browser/addons/vrm/documentation/ja-jp/create-humanoid-vrm-from-scratch/index.md +129 -0
  86. package/browser/addons/vrm/documentation/ja-jp/create-simple-vrm-from-scratch/index.md +29 -0
  87. package/browser/addons/vrm/documentation/ja-jp/development/index.md +137 -0
  88. package/browser/addons/vrm/documentation/ja-jp/index.md +37 -0
  89. package/browser/addons/vrm/documentation/ja-jp/installation/index.md +150 -0
  90. package/browser/addons/vrm/documentation/ja-jp/material-mtoon/index.md +113 -0
  91. package/browser/addons/vrm/documentation/ja-jp/material-pbr/index.md +90 -0
  92. package/browser/addons/vrm/documentation/ja-jp/scripting-api/index.md +389 -0
  93. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrm/index.md +55 -0
  94. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrma/index.md +19 -0
  95. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrm/index.md +56 -0
  96. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrma/index.md +14 -0
  97. package/browser/addons/vrm/editor/__init__.py +1 -0
  98. package/browser/addons/vrm/editor/extension.py +425 -0
  99. package/browser/addons/vrm/editor/extension_accessor.py +75 -0
  100. package/browser/addons/vrm/editor/handler.py +84 -0
  101. package/browser/addons/vrm/editor/khr_character/__init__.py +1 -0
  102. package/browser/addons/vrm/editor/khr_character/panel.py +69 -0
  103. package/browser/addons/vrm/editor/khr_character/property_group.py +27 -0
  104. package/browser/addons/vrm/editor/khr_xmp_json_ld/__init__.py +1 -0
  105. package/browser/addons/vrm/editor/khr_xmp_json_ld/ops.py +464 -0
  106. package/browser/addons/vrm/editor/khr_xmp_json_ld/panel.py +136 -0
  107. package/browser/addons/vrm/editor/khr_xmp_json_ld/property_group.py +83 -0
  108. package/browser/addons/vrm/editor/khr_xmp_json_ld/ui_list.py +198 -0
  109. package/browser/addons/vrm/editor/make_armature.py +709 -0
  110. package/browser/addons/vrm/editor/menu.py +147 -0
  111. package/browser/addons/vrm/editor/migration.py +297 -0
  112. package/browser/addons/vrm/editor/mtoon1/__init__.py +1 -0
  113. package/browser/addons/vrm/editor/mtoon1/handler.py +20 -0
  114. package/browser/addons/vrm/editor/mtoon1/migration.py +536 -0
  115. package/browser/addons/vrm/editor/mtoon1/ops.py +304 -0
  116. package/browser/addons/vrm/editor/mtoon1/panel.py +442 -0
  117. package/browser/addons/vrm/editor/mtoon1/property_group.py +4977 -0
  118. package/browser/addons/vrm/editor/mtoon1/scene_watcher.py +381 -0
  119. package/browser/addons/vrm/editor/node_constraint1/__init__.py +1 -0
  120. package/browser/addons/vrm/editor/node_constraint1/panel.py +317 -0
  121. package/browser/addons/vrm/editor/node_constraint1/property_group.py +25 -0
  122. package/browser/addons/vrm/editor/ops.py +471 -0
  123. package/browser/addons/vrm/editor/panel.py +315 -0
  124. package/browser/addons/vrm/editor/property_group.py +888 -0
  125. package/browser/addons/vrm/editor/search.py +682 -0
  126. package/browser/addons/vrm/editor/spring_bone1/__init__.py +1 -0
  127. package/browser/addons/vrm/editor/spring_bone1/handler.py +994 -0
  128. package/browser/addons/vrm/editor/spring_bone1/menu.py +246 -0
  129. package/browser/addons/vrm/editor/spring_bone1/migration.py +86 -0
  130. package/browser/addons/vrm/editor/spring_bone1/ops.py +1679 -0
  131. package/browser/addons/vrm/editor/spring_bone1/panel.py +605 -0
  132. package/browser/addons/vrm/editor/spring_bone1/property_group.py +1457 -0
  133. package/browser/addons/vrm/editor/spring_bone1/ui_list.py +408 -0
  134. package/browser/addons/vrm/editor/subscription.py +123 -0
  135. package/browser/addons/vrm/editor/t_pose.py +713 -0
  136. package/browser/addons/vrm/editor/validation.py +1271 -0
  137. package/browser/addons/vrm/editor/vrm0/__init__.py +1 -0
  138. package/browser/addons/vrm/editor/vrm0/gizmo_group.py +63 -0
  139. package/browser/addons/vrm/editor/vrm0/handler.py +23 -0
  140. package/browser/addons/vrm/editor/vrm0/menu.py +145 -0
  141. package/browser/addons/vrm/editor/vrm0/migration.py +761 -0
  142. package/browser/addons/vrm/editor/vrm0/ops.py +2145 -0
  143. package/browser/addons/vrm/editor/vrm0/panel.py +1333 -0
  144. package/browser/addons/vrm/editor/vrm0/property_group.py +1818 -0
  145. package/browser/addons/vrm/editor/vrm0/ui_list.py +688 -0
  146. package/browser/addons/vrm/editor/vrm1/__init__.py +1 -0
  147. package/browser/addons/vrm/editor/vrm1/handler.py +28 -0
  148. package/browser/addons/vrm/editor/vrm1/menu.py +76 -0
  149. package/browser/addons/vrm/editor/vrm1/migration.py +321 -0
  150. package/browser/addons/vrm/editor/vrm1/ops.py +2679 -0
  151. package/browser/addons/vrm/editor/vrm1/panel.py +1243 -0
  152. package/browser/addons/vrm/editor/vrm1/property_group.py +2087 -0
  153. package/browser/addons/vrm/editor/vrm1/scene_watcher.py +90 -0
  154. package/browser/addons/vrm/editor/vrm1/ui_list.py +533 -0
  155. package/browser/addons/vrm/exporter/__init__.py +1 -0
  156. package/browser/addons/vrm/exporter/abstract_base_vrm_exporter.py +628 -0
  157. package/browser/addons/vrm/exporter/export_scene.py +930 -0
  158. package/browser/addons/vrm/exporter/gltf2_export_user_extension.py +45 -0
  159. package/browser/addons/vrm/exporter/khr_character_exporter.py +34 -0
  160. package/browser/addons/vrm/exporter/vrm0_exporter.py +4020 -0
  161. package/browser/addons/vrm/exporter/vrm1_exporter.py +3682 -0
  162. package/browser/addons/vrm/exporter/vrm_animation_exporter.py +1035 -0
  163. package/browser/addons/vrm/external/__init__.py +1 -0
  164. package/browser/addons/vrm/external/auto_rig_pro_support.py +3 -0
  165. package/browser/addons/vrm/external/io_scene_gltf2_support.py +418 -0
  166. package/browser/addons/vrm/external/rigify_support.py +1 -0
  167. package/browser/addons/vrm/importer/__init__.py +1 -0
  168. package/browser/addons/vrm/importer/abstract_base_vrm_importer.py +1548 -0
  169. package/browser/addons/vrm/importer/file_handler.py +34 -0
  170. package/browser/addons/vrm/importer/gltf2_import_user_extension.py +268 -0
  171. package/browser/addons/vrm/importer/import_scene.py +646 -0
  172. package/browser/addons/vrm/importer/license_validation.py +198 -0
  173. package/browser/addons/vrm/importer/vrm0_importer.py +1723 -0
  174. package/browser/addons/vrm/importer/vrm1_importer.py +2014 -0
  175. package/browser/addons/vrm/importer/vrm_animation_importer.py +763 -0
  176. package/browser/addons/vrm/importer/vrm_diff.py +316 -0
  177. package/browser/addons/vrm/locale/__init__.py +1 -0
  178. package/browser/addons/vrm/locale/ja_jp.py +826 -0
  179. package/browser/addons/vrm/locale/ruff.toml +8 -0
  180. package/browser/addons/vrm/locale/translation_dictionary.py +10 -0
  181. package/browser/addons/vrm/locale/zh_hans.py +928 -0
  182. package/browser/addons/vrm/registration.py +670 -0
  183. package/browser/addons/vrm.json +18 -0
  184. package/browser/blender-emscripten-engine.mts +60 -128
  185. package/browser/blender-engine.mts +20 -186
  186. package/browser/blender-wali-engine.mts +35 -81
  187. package/browser/describe-thrown.mts +3 -6
  188. package/browser/document-chunks.mts +4 -16
  189. package/browser/gltf_export.py +3161 -0
  190. package/browser/heap-growth.mts +23 -0
  191. package/browser/index.ts +2 -0
  192. package/browser/protocol.ts +119 -35
  193. package/browser/pull-job.mts +2 -10
  194. package/browser/rna.ts +190 -73
  195. package/browser/runtime.ts +197 -82
  196. package/browser/session-addons.mts +33 -0
  197. package/browser/session-frame.mts +5 -24
  198. package/browser/session.py +1338 -1427
  199. package/browser/three/attach-presenter.ts +11 -39
  200. package/browser/three/blender-base64.ts +1 -36
  201. package/browser/three/blender-corner-normals.ts +1 -23
  202. package/browser/three/blender-display-shaders.json +1 -1
  203. package/browser/three/blender-display-shaders.lut +0 -0
  204. package/browser/three/blender-display-transform.ts +2 -1
  205. package/browser/three/blender-frame-columns.ts +5 -13
  206. package/browser/three/blender-graph-material.ts +18 -3
  207. package/browser/three/blender-node-graph.ts +10 -34
  208. package/browser/three/blender-physical-material.ts +2 -31
  209. package/browser/three/blender-runtime-armature.ts +7 -60
  210. package/browser/three/blender-runtime-frame.ts +9 -23
  211. package/browser/three/blender-runtime-geometry.ts +22 -26
  212. package/browser/three/blender-runtime-lighting.ts +48 -178
  213. package/browser/three/blender-runtime-shadows.ts +187 -1
  214. package/browser/three/blender-runtime-skeleton.ts +53 -1
  215. package/browser/three/blender-runtime-view.ts +505 -283
  216. package/browser/three/blender-runtime-weights.ts +9 -72
  217. package/browser/three/blender-sky.ts +13 -33
  218. package/browser/three/blender-triangulate.ts +7 -35
  219. package/browser/three/blender-viewport-sampling.ts +235 -0
  220. package/browser/three/blender-workbench-material.ts +25 -29
  221. package/browser/three/blender-workbench-outline.ts +199 -0
  222. package/browser/three/blender-world-volume.ts +62 -10
  223. package/browser/three/presenter.ts +10 -26
  224. package/browser/three/release.ts +5 -21
  225. package/browser/three/sky-precompute-worker.ts +1 -18
  226. package/browser/three/sky-worker.ts +5 -23
  227. package/browser/three/world-field-sampler.ts +12 -26
  228. package/browser/volter_three.py +9 -105
  229. package/browser/worker.ts +156 -151
  230. package/package.json +5 -2
  231. package/wasm/BUNDLE.json +17 -17
  232. package/wasm/DEPENDENCY-LICENSES.txt +14 -0
  233. package/wasm/blender_browser.data.br +0 -0
  234. package/wasm/blender_browser.js +1 -1
  235. package/wasm/blender_browser.wasm.br +0 -0
  236. package/browser/frame-transfer.mts +0 -19
  237. package/browser/three/agx-base-srgb.lut +0 -0
  238. package/browser/three/agx-look-medium-high-contrast.lut +0 -0
  239. package/browser/three/agx-look-punchy.lut +0 -0
  240. package/browser/three/blender-agx.ts +0 -235
  241. package/browser/three/blender-display-lut.ts +0 -145
  242. package/browser/three/blender-filmic.ts +0 -49
  243. package/browser/three/blender-standard.ts +0 -68
  244. package/browser/three/blender-world-visibility.ts +0 -278
  245. package/browser/three/filmic-srgb.lut +0 -0
@@ -0,0 +1 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
@@ -0,0 +1,3 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+
3
+ # https://www.lucky3d.fr/auto-rig-pro/doc/ge_export_doc.html#export-by-script
@@ -0,0 +1,418 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ import contextlib
3
+ import datetime as dt
4
+ import hashlib
5
+ import inspect
6
+ import logging
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import ClassVar, Optional
10
+
11
+ import bpy
12
+ from bpy.types import Context, Event, Image, Material, Operator
13
+ from io_scene_gltf2.io.com import gltf2_io
14
+
15
+ from ..common.logger import get_logger
16
+
17
+ _logger = get_logger(__name__)
18
+
19
+
20
+ class WM_OT_vrm_io_scene_gltf2_disabled_warning(Operator):
21
+ bl_label = "glTF 2.0 add-on is disabled"
22
+ bl_idname = "wm.vrm_gltf2_addon_disabled_warning"
23
+ bl_options: ClassVar = {"REGISTER"}
24
+
25
+ def execute(self, _context: Context) -> set[str]:
26
+ return {"FINISHED"}
27
+
28
+ def invoke(self, context: Context, _event: Event) -> set[str]:
29
+ return context.window_manager.invoke_props_dialog(self, width=500)
30
+
31
+ def draw(self, _context: Context) -> None:
32
+ self.layout.label(
33
+ text='Official add-on "glTF 2.0 format" is required. Please enable it.'
34
+ )
35
+
36
+
37
+ def image_to_image_bytes(
38
+ image: Image, export_settings: dict[str, object]
39
+ ) -> tuple[bytes, str]:
40
+ mime_type = "image/jpeg" if image.file_format == "JPEG" else "image/png"
41
+
42
+ if bpy.app.version < (3, 6, 0):
43
+ from io_scene_gltf2.blender.exp.gltf2_blender_image import (
44
+ ExportImage as ExportImage_Before_3_6,
45
+ )
46
+
47
+ export_image_before_3_6 = ExportImage_Before_3_6.from_blender_image(image)
48
+
49
+ if bpy.app.version < (3, 5, 0):
50
+ encoded = export_image_before_3_6.encode(mime_type)
51
+ if isinstance(encoded, bytes):
52
+ # bpy.app.version < (3, 3, 0)
53
+ return encoded, mime_type
54
+ image_bytes, _specular_color_factor = encoded
55
+ return image_bytes, mime_type
56
+
57
+ image_bytes, _specular_color_factor = export_image_before_3_6.encode(
58
+ mime_type, export_settings
59
+ )
60
+ return image_bytes, mime_type
61
+
62
+ if bpy.app.version < (4, 3):
63
+ from io_scene_gltf2.blender.exp.material.extensions.gltf2_blender_image import (
64
+ ExportImage as ExportImage_Before_4_3,
65
+ )
66
+
67
+ export_image_before_4_3 = ExportImage_Before_4_3.from_blender_image(image)
68
+ image_bytes, _specular_color_factor = export_image_before_4_3.encode(
69
+ mime_type, export_settings
70
+ )
71
+ return image_bytes, mime_type
72
+
73
+ from io_scene_gltf2.blender.exp.material.encode_image import ExportImage
74
+
75
+ export_image = ExportImage.from_blender_image(image)
76
+ image_bytes, _specular_color_factor = export_image.encode(
77
+ mime_type, export_settings
78
+ )
79
+ return image_bytes, mime_type
80
+
81
+
82
+ def init_extras_export() -> None:
83
+ try:
84
+ if bpy.app.version < (4, 5):
85
+ from io_scene_gltf2.blender.com.gltf2_blender_extras import BLACK_LIST
86
+ else:
87
+ from io_scene_gltf2.blender.com.extras import BLACK_LIST
88
+ except ImportError:
89
+ return
90
+ key = "vrm_addon_extension"
91
+ if key not in BLACK_LIST:
92
+ BLACK_LIST.append(key)
93
+
94
+
95
+ def create_export_settings() -> dict[str, object]:
96
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/b9bdc358ebf41e5f14be397d0d612cc8d645a09e/addons/io_scene_gltf2/__init__.py#L1054
97
+ loglevel = logging.INFO
98
+
99
+ export_settings: dict[str, object] = {
100
+ "loglevel": loglevel,
101
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L522
102
+ "timestamp": dt.datetime.now(dt.timezone.utc),
103
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L258-L268
104
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L552
105
+ "gltf_materials": True,
106
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L120-L137
107
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L532
108
+ "gltf_format": "GLB",
109
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L154-L168
110
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L533
111
+ "gltf_image_format": "AUTO",
112
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L329-L333
113
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L569
114
+ "gltf_extras": True,
115
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L611-L633
116
+ "gltf_user_extensions": [],
117
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L606
118
+ "gltf_binary": bytearray(),
119
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L176-L184
120
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/67b2ed150b0eba08129b970dbe1116c633a77d24/addons/io_scene_gltf2/__init__.py#L530
121
+ "gltf_keep_original_textures": False,
122
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/bfe4ff8b1b5c26ba17b0531b67798376147d9fa7/addons/io_scene_gltf2/__init__.py#L273-L279
123
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/bfe4ff8b1b5c26ba17b0531b67798376147d9fa7/addons/io_scene_gltf2/__init__.py#L579
124
+ "gltf_original_specular": False,
125
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/e662c281fc830d7ad3ea918d38c6a1881ee143c5/addons/io_scene_gltf2/__init__.py#L208-L214
126
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/e662c281fc830d7ad3ea918d38c6a1881ee143c5/addons/io_scene_gltf2/__init__.py#L617
127
+ "gltf_jpeg_quality": 75,
128
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/a2eac6c4b4ef957b654b61970dc554e3803a642e/addons/io_scene_gltf2/__init__.py#L233-L240
129
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/a2eac6c4b4ef957b654b61970dc554e3803a642e/addons/io_scene_gltf2/__init__.py#L787
130
+ "gltf_image_quality": 75,
131
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/765c1bd8f59ce34d6e346147f379af191969777f/addons/io_scene_gltf2/__init__.py#L785
132
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/765c1bd8f59ce34d6e346147f379af191969777f/addons/io_scene_gltf2/__init__.py#L201-L208
133
+ "gltf_add_webp": False,
134
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/765c1bd8f59ce34d6e346147f379af191969777f/addons/io_scene_gltf2/__init__.py#L786
135
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/765c1bd8f59ce34d6e346147f379af191969777f/addons/io_scene_gltf2/__init__.py#L210-L216
136
+ "gltf_webp_fallback": True,
137
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/2debd75ace303f3a3b00a43e9d7a9507af32f194/addons/io_scene_gltf2/__init__.py#L941
138
+ "exported_images": {},
139
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/2debd75ace303f3a3b00a43e9d7a9507af32f194/addons/io_scene_gltf2/__init__.py#L942
140
+ "exported_texture_nodes": [],
141
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/2debd75ace303f3a3b00a43e9d7a9507af32f194/addons/io_scene_gltf2/__init__.py#L943
142
+ "additional_texture_export": [],
143
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/2debd75ace303f3a3b00a43e9d7a9507af32f194/addons/io_scene_gltf2/__init__.py#L944
144
+ "additional_texture_export_current_idx": 0,
145
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/2debd75ace303f3a3b00a43e9d7a9507af32f194/addons/io_scene_gltf2/__init__.py#L985-L986
146
+ "gltf_unused_textures": False,
147
+ "gltf_unused_images": False,
148
+ # for https://github.com/KhronosGroup/glTF-Blender-IO/blob/06f0f908e883add2767fde828f52a013086a17c3/addons/io_scene_gltf2/blender/exp/material/extensions/gltf2_blender_gather_materials_emission.py#L72
149
+ "current_paths": {},
150
+ # for https://github.com/KhronosGroup/glTF-Blender-IO/blob/06f0f908e883add2767fde828f52a013086a17c3/addons/io_scene_gltf2/blender/exp/material/gltf2_blender_gather_materials.py#L171
151
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/06f0f908e883add2767fde828f52a013086a17c3/addons/io_scene_gltf2/blender/exp/gltf2_blender_gather.py#L62-L66
152
+ "KHR_animation_pointer": {"materials": {}, "lights": {}, "cameras": {}},
153
+ # https://github.com/KhronosGroup/glTF-Blender-IO/blob/53959a0f2b83c8090cb4ff2b2815417d38cfe2b2/addons/io_scene_gltf2/__init__.py#L1257-L1273
154
+ "gltf_animation_mode": "ACTIONS",
155
+ "gltf_anim_scene_split_object": False,
156
+ "gltf_trs_w_animation_pointer": False,
157
+ "gltf_export_anim_pointer": False,
158
+ }
159
+
160
+ if bpy.app.version < (4, 2):
161
+ return export_settings
162
+
163
+ if bpy.app.version < (4, 3):
164
+ from io_scene_gltf2.io.com.gltf2_io_debug import Log as Log_Before_4_3
165
+
166
+ export_settings["log"] = Log_Before_4_3(loglevel)
167
+ else:
168
+ from io_scene_gltf2.io.com.debug import Log
169
+
170
+ export_settings["log"] = Log(loglevel)
171
+
172
+ return export_settings
173
+
174
+
175
+ @dataclass
176
+ class ImportSceneGltfArguments:
177
+ filepath: str
178
+ import_pack_images: bool
179
+ bone_heuristic: str
180
+ guess_original_bind_pose: bool
181
+ disable_bone_shape: bool
182
+ import_scene_as_collection: bool
183
+
184
+
185
+ def import_scene_gltf(arguments: ImportSceneGltfArguments) -> set[str]:
186
+ if bpy.app.version < (4, 2):
187
+ return bpy.ops.import_scene.gltf(
188
+ filepath=arguments.filepath,
189
+ import_pack_images=arguments.import_pack_images,
190
+ bone_heuristic=arguments.bone_heuristic,
191
+ guess_original_bind_pose=arguments.guess_original_bind_pose,
192
+ )
193
+
194
+ if bpy.app.version < (4, 5):
195
+ return bpy.ops.import_scene.gltf(
196
+ filepath=arguments.filepath,
197
+ import_pack_images=arguments.import_pack_images,
198
+ bone_heuristic=arguments.bone_heuristic,
199
+ guess_original_bind_pose=arguments.guess_original_bind_pose,
200
+ disable_bone_shape=arguments.disable_bone_shape,
201
+ )
202
+
203
+ return bpy.ops.import_scene.gltf(
204
+ filepath=arguments.filepath,
205
+ import_pack_images=arguments.import_pack_images,
206
+ bone_heuristic=arguments.bone_heuristic,
207
+ guess_original_bind_pose=arguments.guess_original_bind_pose,
208
+ disable_bone_shape=arguments.disable_bone_shape,
209
+ import_scene_as_collection=arguments.import_scene_as_collection,
210
+ )
211
+
212
+
213
+ @dataclass
214
+ class ExportSceneGltfArguments:
215
+ filepath: str
216
+ check_existing: bool
217
+ export_format: str
218
+ export_extras: bool
219
+ export_def_bones: bool
220
+ export_current_frame: bool
221
+ use_selection: bool
222
+ use_active_scene: bool
223
+ export_animations: bool
224
+ export_armature_object_remove: bool
225
+ export_rest_position_armature: bool
226
+ export_all_influences: bool
227
+ export_vertex_color: str
228
+ export_lights: bool
229
+ export_try_sparse_sk: bool
230
+ export_apply: bool
231
+
232
+
233
+ def _invoke_export_scene_gltf(arguments: ExportSceneGltfArguments) -> set[str]:
234
+ if bpy.app.version < (3, 2):
235
+ return bpy.ops.export_scene.gltf(
236
+ filepath=arguments.filepath,
237
+ check_existing=arguments.check_existing,
238
+ export_format=arguments.export_format,
239
+ export_extras=arguments.export_extras,
240
+ export_def_bones=False,
241
+ export_current_frame=arguments.export_current_frame,
242
+ use_selection=arguments.use_selection,
243
+ export_animations=arguments.export_animations,
244
+ export_all_influences=arguments.export_all_influences,
245
+ export_lights=arguments.export_lights,
246
+ export_apply=arguments.export_apply,
247
+ )
248
+
249
+ if bpy.app.version < (3, 6):
250
+ return bpy.ops.export_scene.gltf(
251
+ filepath=arguments.filepath,
252
+ check_existing=arguments.check_existing,
253
+ export_format=arguments.export_format,
254
+ export_extras=arguments.export_extras,
255
+ export_def_bones=(bpy.app.version >= (3, 3)) and arguments.export_def_bones,
256
+ export_current_frame=arguments.export_current_frame,
257
+ use_selection=arguments.use_selection,
258
+ use_active_scene=arguments.use_active_scene,
259
+ export_animations=arguments.export_animations,
260
+ export_all_influences=arguments.export_all_influences,
261
+ export_lights=arguments.export_lights,
262
+ export_apply=arguments.export_apply,
263
+ )
264
+
265
+ if bpy.app.version < (4,):
266
+ return bpy.ops.export_scene.gltf(
267
+ filepath=arguments.filepath,
268
+ check_existing=arguments.check_existing,
269
+ export_format=arguments.export_format,
270
+ export_extras=arguments.export_extras,
271
+ export_def_bones=arguments.export_def_bones,
272
+ export_current_frame=arguments.export_current_frame,
273
+ use_selection=arguments.use_selection,
274
+ use_active_scene=arguments.use_active_scene,
275
+ export_animations=arguments.export_animations,
276
+ export_rest_position_armature=arguments.export_rest_position_armature,
277
+ export_all_influences=arguments.export_all_influences,
278
+ export_lights=arguments.export_lights,
279
+ export_apply=arguments.export_apply,
280
+ )
281
+
282
+ if bpy.app.version < (4, 2):
283
+ return bpy.ops.export_scene.gltf(
284
+ filepath=arguments.filepath,
285
+ check_existing=arguments.check_existing,
286
+ export_format=arguments.export_format,
287
+ export_extras=arguments.export_extras,
288
+ export_def_bones=arguments.export_def_bones,
289
+ export_current_frame=arguments.export_current_frame,
290
+ use_selection=arguments.use_selection,
291
+ use_active_scene=arguments.use_active_scene,
292
+ export_animations=arguments.export_animations,
293
+ export_rest_position_armature=arguments.export_rest_position_armature,
294
+ export_try_sparse_sk=arguments.export_try_sparse_sk,
295
+ export_all_influences=arguments.export_all_influences,
296
+ export_lights=arguments.export_lights,
297
+ export_apply=arguments.export_apply,
298
+ )
299
+
300
+ return bpy.ops.export_scene.gltf(
301
+ filepath=arguments.filepath,
302
+ check_existing=arguments.check_existing,
303
+ export_format=arguments.export_format,
304
+ export_extras=arguments.export_extras,
305
+ export_def_bones=arguments.export_def_bones,
306
+ export_current_frame=arguments.export_current_frame,
307
+ use_selection=arguments.use_selection,
308
+ use_active_scene=arguments.use_active_scene,
309
+ export_animations=arguments.export_animations,
310
+ export_armature_object_remove=arguments.export_armature_object_remove,
311
+ export_rest_position_armature=arguments.export_rest_position_armature,
312
+ export_vertex_color=arguments.export_vertex_color,
313
+ export_try_sparse_sk=arguments.export_try_sparse_sk,
314
+ export_all_influences=arguments.export_all_influences,
315
+ export_lights=arguments.export_lights,
316
+ export_apply=arguments.export_apply,
317
+ )
318
+
319
+
320
+ def export_scene_gltf(arguments: ExportSceneGltfArguments) -> set[str]:
321
+ last_exception: Optional[Exception] = None
322
+ try:
323
+ return _invoke_export_scene_gltf(arguments)
324
+ except RuntimeError as exception:
325
+ last_exception = exception
326
+
327
+ # export_armature_object_remove is unstable, and the conditions under which it
328
+ # fails are very complex, so I cannot fully grasp all of them.
329
+ # https://github.com/KhronosGroup/glTF-Blender-IO/issues/2436
330
+ # https://github.com/saturday06/VRM-Addon-for-Blender/issues/1033
331
+ if arguments.export_armature_object_remove:
332
+ arguments.export_armature_object_remove = False
333
+ _logger.warning("retrying with `export_armature_object_remove = False`")
334
+ try:
335
+ return _invoke_export_scene_gltf(arguments)
336
+ except RuntimeError as exception:
337
+ last_exception = exception
338
+
339
+ # https://github.com/saturday06/VRM-Addon-for-Blender/commit/26f566d43b15c7a403c0f007b0290f9aef569114
340
+ if arguments.export_animations:
341
+ arguments.export_animations = False
342
+ _logger.warning("retrying with `export_animations = False`")
343
+ try:
344
+ return _invoke_export_scene_gltf(arguments)
345
+ except RuntimeError as exception:
346
+ last_exception = exception
347
+
348
+ raise last_exception
349
+
350
+
351
+ def gather_gltf2_io_material(
352
+ material: Material, export_settings: dict[str, object]
353
+ ) -> Optional[gltf2_io.Material]:
354
+ if bpy.app.version < (3, 2):
355
+ from io_scene_gltf2.blender.exp.gltf2_blender_gather_materials import (
356
+ gather_material as gather_material_before_3_2,
357
+ )
358
+
359
+ return gather_material_before_3_2(material, export_settings)
360
+
361
+ if bpy.app.version < (3, 6):
362
+ from io_scene_gltf2.blender.exp.gltf2_blender_gather_materials import (
363
+ gather_material as gather_material_before_3_6,
364
+ )
365
+
366
+ return gather_material_before_3_6(material, 0, export_settings)
367
+
368
+ if bpy.app.version < (4, 0):
369
+ from io_scene_gltf2.blender.exp.material.gltf2_blender_gather_materials import (
370
+ gather_material as gather_material_before_4_0,
371
+ )
372
+
373
+ return gather_material_before_4_0(material, 0, export_settings)
374
+
375
+ if bpy.app.version < (4, 3):
376
+ from io_scene_gltf2.blender.exp.material.gltf2_blender_gather_materials import (
377
+ gather_material as gather_material_before_4_3,
378
+ )
379
+
380
+ gltf2_io_material, _ = gather_material_before_4_3(material, export_settings)
381
+ return gltf2_io_material
382
+
383
+ from io_scene_gltf2.blender.exp.material.materials import gather_material
384
+
385
+ gltf2_io_material, _ = gather_material(material, export_settings)
386
+ return gltf2_io_material
387
+
388
+
389
+ def read_addon_diagnostics() -> list[str]:
390
+ gltf2_addon = bpy.context.preferences.addons.get("io_scene_gltf2")
391
+ if gltf2_addon is None:
392
+ return ["glTF 2.0: Not Found"]
393
+ gltf2_preferences = getattr(gltf2_addon, "preferences", None)
394
+ if gltf2_preferences is None:
395
+ return ["glTF 2.0: No Preferences Found"]
396
+
397
+ c = gltf2_preferences.__class__
398
+ try:
399
+ path = inspect.getsourcefile(c)
400
+ except (OSError, TypeError):
401
+ try:
402
+ path = inspect.getfile(c)
403
+ except (OSError, TypeError):
404
+ path = None
405
+ if not isinstance(path, str):
406
+ return [f"glTF 2.0: Not Inspectable (path={path})"]
407
+
408
+ diagnostics = [f'glTF 2.0: "{path}"']
409
+ source_bytes = None
410
+ with contextlib.suppress(OSError):
411
+ source_bytes = Path(path).read_bytes()
412
+ if source_bytes is not None:
413
+ diagnostics.append(
414
+ f" (SHA256: {hashlib.sha256(source_bytes).hexdigest()})"
415
+ )
416
+ else:
417
+ diagnostics.append(" (Not Readable)")
418
+ return diagnostics
@@ -0,0 +1 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
@@ -0,0 +1 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later