@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,464 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from typing import TYPE_CHECKING, ClassVar
3
+
4
+ from bpy.props import IntProperty, StringProperty
5
+ from bpy.types import (
6
+ Armature,
7
+ Context,
8
+ Operator,
9
+ )
10
+
11
+ from ...common.logger import get_logger
12
+ from ..extension_accessor import get_armature_extension
13
+
14
+ _logger = get_logger(__name__)
15
+
16
+
17
+ class VRM_OT_add_khr_xmp_json_ld_packet_dc_creator(Operator):
18
+ bl_idname = "vrm.add_khr_xmp_json_ld_packet_dc_creator"
19
+ bl_label = "Add Creator"
20
+ bl_description = "Add Creator"
21
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
22
+
23
+ armature_object_name: StringProperty( # type: ignore[valid-type]
24
+ options={"HIDDEN"},
25
+ )
26
+
27
+ def execute(self, context: Context) -> set[str]:
28
+ armature = context.blend_data.objects.get(self.armature_object_name)
29
+ if armature is None or armature.type != "ARMATURE":
30
+ return {"CANCELLED"}
31
+ armature_data = armature.data
32
+ if not isinstance(armature_data, Armature):
33
+ return {"CANCELLED"}
34
+ packet = get_armature_extension(
35
+ armature_data
36
+ ).khr_character.khr_xmp_json_ld_packet
37
+ dc_creator = packet.dc_creator.add()
38
+ dc_creator.value = ""
39
+ packet.active_dc_creator_index = len(packet.dc_creator) - 1
40
+ return {"FINISHED"}
41
+
42
+ if TYPE_CHECKING:
43
+ # This code is auto generated.
44
+ # To regenerate, run the `uv run tools/property_typing.py` command.
45
+ armature_object_name: str # type: ignore[no-redef]
46
+
47
+
48
+ class VRM_OT_remove_khr_xmp_json_ld_packet_dc_creator(Operator):
49
+ bl_idname = "vrm.remove_khr_xmp_json_ld_packet_dc_creator"
50
+ bl_label = "Remove Creator"
51
+ bl_description = "Remove Creator"
52
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
53
+
54
+ armature_object_name: StringProperty( # type: ignore[valid-type]
55
+ options={"HIDDEN"},
56
+ )
57
+
58
+ dc_creator_index: IntProperty( # type: ignore[valid-type]
59
+ options={"HIDDEN"},
60
+ min=0,
61
+ )
62
+
63
+ def execute(self, context: Context) -> set[str]:
64
+ armature = context.blend_data.objects.get(self.armature_object_name)
65
+ if armature is None or armature.type != "ARMATURE":
66
+ return {"CANCELLED"}
67
+ armature_data = armature.data
68
+ if not isinstance(armature_data, Armature):
69
+ return {"CANCELLED"}
70
+ packet = get_armature_extension(
71
+ armature_data
72
+ ).khr_character.khr_xmp_json_ld_packet
73
+ if len(packet.dc_creator) <= self.dc_creator_index:
74
+ return {"CANCELLED"}
75
+ packet.dc_creator.remove(self.dc_creator_index)
76
+ packet.active_dc_creator_index = min(
77
+ packet.active_dc_creator_index,
78
+ max(0, len(packet.dc_creator) - 1),
79
+ )
80
+ return {"FINISHED"}
81
+
82
+ if TYPE_CHECKING:
83
+ # This code is auto generated.
84
+ # To regenerate, run the `uv run tools/property_typing.py` command.
85
+ armature_object_name: str # type: ignore[no-redef]
86
+ dc_creator_index: int # type: ignore[no-redef]
87
+
88
+
89
+ class VRM_OT_move_up_khr_xmp_json_ld_packet_dc_creator(Operator):
90
+ bl_idname = "vrm.move_up_khr_xmp_json_ld_packet_dc_creator"
91
+ bl_label = "Move Up Creator"
92
+ bl_description = "Move Up Creator"
93
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
94
+
95
+ armature_object_name: StringProperty( # type: ignore[valid-type]
96
+ options={"HIDDEN"},
97
+ )
98
+
99
+ dc_creator_index: IntProperty( # type: ignore[valid-type]
100
+ options={"HIDDEN"},
101
+ min=0,
102
+ )
103
+
104
+ def execute(self, context: Context) -> set[str]:
105
+ armature = context.blend_data.objects.get(self.armature_object_name)
106
+ if armature is None or armature.type != "ARMATURE":
107
+ return {"CANCELLED"}
108
+ armature_data = armature.data
109
+ if not isinstance(armature_data, Armature):
110
+ return {"CANCELLED"}
111
+ packet = get_armature_extension(
112
+ armature_data
113
+ ).khr_character.khr_xmp_json_ld_packet
114
+ if len(packet.dc_creator) <= self.dc_creator_index:
115
+ return {"CANCELLED"}
116
+ new_index = (self.dc_creator_index - 1) % len(packet.dc_creator)
117
+ packet.dc_creator.move(self.dc_creator_index, new_index)
118
+ packet.active_dc_creator_index = new_index
119
+ return {"FINISHED"}
120
+
121
+ if TYPE_CHECKING:
122
+ # This code is auto generated.
123
+ # To regenerate, run the `uv run tools/property_typing.py` command.
124
+ armature_object_name: str # type: ignore[no-redef]
125
+ dc_creator_index: int # type: ignore[no-redef]
126
+
127
+
128
+ class VRM_OT_move_down_khr_xmp_json_ld_packet_dc_creator(Operator):
129
+ bl_idname = "vrm.move_down_khr_xmp_json_ld_packet_dc_creator"
130
+ bl_label = "Move Down Creator"
131
+ bl_description = "Move Down Creator"
132
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
133
+
134
+ armature_object_name: StringProperty( # type: ignore[valid-type]
135
+ options={"HIDDEN"},
136
+ )
137
+
138
+ dc_creator_index: IntProperty( # type: ignore[valid-type]
139
+ options={"HIDDEN"},
140
+ min=0,
141
+ )
142
+
143
+ def execute(self, context: Context) -> set[str]:
144
+ armature = context.blend_data.objects.get(self.armature_object_name)
145
+ if armature is None or armature.type != "ARMATURE":
146
+ return {"CANCELLED"}
147
+ armature_data = armature.data
148
+ if not isinstance(armature_data, Armature):
149
+ return {"CANCELLED"}
150
+ packet = get_armature_extension(
151
+ armature_data
152
+ ).khr_character.khr_xmp_json_ld_packet
153
+ if len(packet.dc_creator) <= self.dc_creator_index:
154
+ return {"CANCELLED"}
155
+ new_index = (self.dc_creator_index + 1) % len(packet.dc_creator)
156
+ packet.dc_creator.move(self.dc_creator_index, new_index)
157
+ packet.active_dc_creator_index = new_index
158
+ return {"FINISHED"}
159
+
160
+ if TYPE_CHECKING:
161
+ # This code is auto generated.
162
+ # To regenerate, run the `uv run tools/property_typing.py` command.
163
+ armature_object_name: str # type: ignore[no-redef]
164
+ dc_creator_index: int # type: ignore[no-redef]
165
+
166
+
167
+ class VRM_OT_add_khr_xmp_json_ld_packet_dc_license(Operator):
168
+ bl_idname = "vrm.add_khr_xmp_json_ld_packet_dc_license"
169
+ bl_label = "Add License"
170
+ bl_description = "Add License"
171
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
172
+
173
+ armature_object_name: StringProperty( # type: ignore[valid-type]
174
+ options={"HIDDEN"},
175
+ )
176
+
177
+ def execute(self, context: Context) -> set[str]:
178
+ armature = context.blend_data.objects.get(self.armature_object_name)
179
+ if armature is None or armature.type != "ARMATURE":
180
+ return {"CANCELLED"}
181
+ armature_data = armature.data
182
+ if not isinstance(armature_data, Armature):
183
+ return {"CANCELLED"}
184
+ packet = get_armature_extension(
185
+ armature_data
186
+ ).khr_character.khr_xmp_json_ld_packet
187
+ dc_license = packet.dc_license.add()
188
+ dc_license.value = ""
189
+ packet.active_dc_license_index = len(packet.dc_license) - 1
190
+ return {"FINISHED"}
191
+
192
+ if TYPE_CHECKING:
193
+ # This code is auto generated.
194
+ # To regenerate, run the `uv run tools/property_typing.py` command.
195
+ armature_object_name: str # type: ignore[no-redef]
196
+
197
+
198
+ class VRM_OT_remove_khr_xmp_json_ld_packet_dc_license(Operator):
199
+ bl_idname = "vrm.remove_khr_xmp_json_ld_packet_dc_license"
200
+ bl_label = "Remove License"
201
+ bl_description = "Remove License"
202
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
203
+
204
+ armature_object_name: StringProperty( # type: ignore[valid-type]
205
+ options={"HIDDEN"},
206
+ )
207
+
208
+ dc_license_index: IntProperty( # type: ignore[valid-type]
209
+ options={"HIDDEN"},
210
+ min=0,
211
+ )
212
+
213
+ def execute(self, context: Context) -> set[str]:
214
+ armature = context.blend_data.objects.get(self.armature_object_name)
215
+ if armature is None or armature.type != "ARMATURE":
216
+ return {"CANCELLED"}
217
+ armature_data = armature.data
218
+ if not isinstance(armature_data, Armature):
219
+ return {"CANCELLED"}
220
+ packet = get_armature_extension(
221
+ armature_data
222
+ ).khr_character.khr_xmp_json_ld_packet
223
+ if len(packet.dc_license) <= self.dc_license_index:
224
+ return {"CANCELLED"}
225
+ packet.dc_license.remove(self.dc_license_index)
226
+ packet.active_dc_license_index = min(
227
+ packet.active_dc_license_index,
228
+ max(0, len(packet.dc_license) - 1),
229
+ )
230
+ return {"FINISHED"}
231
+
232
+ if TYPE_CHECKING:
233
+ # This code is auto generated.
234
+ # To regenerate, run the `uv run tools/property_typing.py` command.
235
+ armature_object_name: str # type: ignore[no-redef]
236
+ dc_license_index: int # type: ignore[no-redef]
237
+
238
+
239
+ class VRM_OT_move_up_khr_xmp_json_ld_packet_dc_license(Operator):
240
+ bl_idname = "vrm.move_up_khr_xmp_json_ld_packet_dc_license"
241
+ bl_label = "Move Up License"
242
+ bl_description = "Move Up License"
243
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
244
+
245
+ armature_object_name: StringProperty( # type: ignore[valid-type]
246
+ options={"HIDDEN"},
247
+ )
248
+
249
+ dc_license_index: IntProperty( # type: ignore[valid-type]
250
+ options={"HIDDEN"},
251
+ min=0,
252
+ )
253
+
254
+ def execute(self, context: Context) -> set[str]:
255
+ armature = context.blend_data.objects.get(self.armature_object_name)
256
+ if armature is None or armature.type != "ARMATURE":
257
+ return {"CANCELLED"}
258
+ armature_data = armature.data
259
+ if not isinstance(armature_data, Armature):
260
+ return {"CANCELLED"}
261
+ packet = get_armature_extension(
262
+ armature_data
263
+ ).khr_character.khr_xmp_json_ld_packet
264
+ if len(packet.dc_license) <= self.dc_license_index:
265
+ return {"CANCELLED"}
266
+ new_index = (self.dc_license_index - 1) % len(packet.dc_license)
267
+ packet.dc_license.move(self.dc_license_index, new_index)
268
+ packet.active_dc_license_index = new_index
269
+ return {"FINISHED"}
270
+
271
+ if TYPE_CHECKING:
272
+ # This code is auto generated.
273
+ # To regenerate, run the `uv run tools/property_typing.py` command.
274
+ armature_object_name: str # type: ignore[no-redef]
275
+ dc_license_index: int # type: ignore[no-redef]
276
+
277
+
278
+ class VRM_OT_move_down_khr_xmp_json_ld_packet_dc_license(Operator):
279
+ bl_idname = "vrm.move_down_khr_xmp_json_ld_packet_dc_license"
280
+ bl_label = "Move Down License"
281
+ bl_description = "Move Down License"
282
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
283
+
284
+ armature_object_name: StringProperty( # type: ignore[valid-type]
285
+ options={"HIDDEN"},
286
+ )
287
+
288
+ dc_license_index: IntProperty( # type: ignore[valid-type]
289
+ options={"HIDDEN"},
290
+ min=0,
291
+ )
292
+
293
+ def execute(self, context: Context) -> set[str]:
294
+ armature = context.blend_data.objects.get(self.armature_object_name)
295
+ if armature is None or armature.type != "ARMATURE":
296
+ return {"CANCELLED"}
297
+ armature_data = armature.data
298
+ if not isinstance(armature_data, Armature):
299
+ return {"CANCELLED"}
300
+ packet = get_armature_extension(
301
+ armature_data
302
+ ).khr_character.khr_xmp_json_ld_packet
303
+ if len(packet.dc_license) <= self.dc_license_index:
304
+ return {"CANCELLED"}
305
+ new_index = (self.dc_license_index + 1) % len(packet.dc_license)
306
+ packet.dc_license.move(self.dc_license_index, new_index)
307
+ packet.active_dc_license_index = new_index
308
+ return {"FINISHED"}
309
+
310
+ if TYPE_CHECKING:
311
+ # This code is auto generated.
312
+ # To regenerate, run the `uv run tools/property_typing.py` command.
313
+ armature_object_name: str # type: ignore[no-redef]
314
+ dc_license_index: int # type: ignore[no-redef]
315
+
316
+
317
+ class VRM_OT_add_khr_xmp_json_ld_packet_dc_subject(Operator):
318
+ bl_idname = "vrm.add_khr_xmp_json_ld_packet_dc_subject"
319
+ bl_label = "Add Subject"
320
+ bl_description = "Add Subject"
321
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
322
+
323
+ armature_object_name: StringProperty( # type: ignore[valid-type]
324
+ options={"HIDDEN"},
325
+ )
326
+
327
+ def execute(self, context: Context) -> set[str]:
328
+ armature = context.blend_data.objects.get(self.armature_object_name)
329
+ if armature is None or armature.type != "ARMATURE":
330
+ return {"CANCELLED"}
331
+ armature_data = armature.data
332
+ if not isinstance(armature_data, Armature):
333
+ return {"CANCELLED"}
334
+ packet = get_armature_extension(
335
+ armature_data
336
+ ).khr_character.khr_xmp_json_ld_packet
337
+ dc_subject = packet.dc_subject.add()
338
+ dc_subject.value = ""
339
+ packet.active_dc_subject_index = len(packet.dc_subject) - 1
340
+ return {"FINISHED"}
341
+
342
+ if TYPE_CHECKING:
343
+ # This code is auto generated.
344
+ # To regenerate, run the `uv run tools/property_typing.py` command.
345
+ armature_object_name: str # type: ignore[no-redef]
346
+
347
+
348
+ class VRM_OT_remove_khr_xmp_json_ld_packet_dc_subject(Operator):
349
+ bl_idname = "vrm.remove_khr_xmp_json_ld_packet_dc_subject"
350
+ bl_label = "Remove Subject"
351
+ bl_description = "Remove Subject"
352
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
353
+
354
+ armature_object_name: StringProperty( # type: ignore[valid-type]
355
+ options={"HIDDEN"},
356
+ )
357
+
358
+ dc_subject_index: IntProperty( # type: ignore[valid-type]
359
+ options={"HIDDEN"},
360
+ min=0,
361
+ )
362
+
363
+ def execute(self, context: Context) -> set[str]:
364
+ armature = context.blend_data.objects.get(self.armature_object_name)
365
+ if armature is None or armature.type != "ARMATURE":
366
+ return {"CANCELLED"}
367
+ armature_data = armature.data
368
+ if not isinstance(armature_data, Armature):
369
+ return {"CANCELLED"}
370
+ packet = get_armature_extension(
371
+ armature_data
372
+ ).khr_character.khr_xmp_json_ld_packet
373
+ if len(packet.dc_subject) <= self.dc_subject_index:
374
+ return {"CANCELLED"}
375
+ packet.dc_subject.remove(self.dc_subject_index)
376
+ packet.active_dc_subject_index = min(
377
+ packet.active_dc_subject_index,
378
+ max(0, len(packet.dc_subject) - 1),
379
+ )
380
+ return {"FINISHED"}
381
+
382
+ if TYPE_CHECKING:
383
+ # This code is auto generated.
384
+ # To regenerate, run the `uv run tools/property_typing.py` command.
385
+ armature_object_name: str # type: ignore[no-redef]
386
+ dc_subject_index: int # type: ignore[no-redef]
387
+
388
+
389
+ class VRM_OT_move_up_khr_xmp_json_ld_packet_dc_subject(Operator):
390
+ bl_idname = "vrm.move_up_khr_xmp_json_ld_packet_dc_subject"
391
+ bl_label = "Move Up Subject"
392
+ bl_description = "Move Up Subject"
393
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
394
+
395
+ armature_object_name: StringProperty( # type: ignore[valid-type]
396
+ options={"HIDDEN"},
397
+ )
398
+
399
+ dc_subject_index: IntProperty( # type: ignore[valid-type]
400
+ options={"HIDDEN"},
401
+ min=0,
402
+ )
403
+
404
+ def execute(self, context: Context) -> set[str]:
405
+ armature = context.blend_data.objects.get(self.armature_object_name)
406
+ if armature is None or armature.type != "ARMATURE":
407
+ return {"CANCELLED"}
408
+ armature_data = armature.data
409
+ if not isinstance(armature_data, Armature):
410
+ return {"CANCELLED"}
411
+ packet = get_armature_extension(
412
+ armature_data
413
+ ).khr_character.khr_xmp_json_ld_packet
414
+ if len(packet.dc_subject) <= self.dc_subject_index:
415
+ return {"CANCELLED"}
416
+ new_index = (self.dc_subject_index - 1) % len(packet.dc_subject)
417
+ packet.dc_subject.move(self.dc_subject_index, new_index)
418
+ packet.active_dc_subject_index = new_index
419
+ return {"FINISHED"}
420
+
421
+ if TYPE_CHECKING:
422
+ # This code is auto generated.
423
+ # To regenerate, run the `uv run tools/property_typing.py` command.
424
+ armature_object_name: str # type: ignore[no-redef]
425
+ dc_subject_index: int # type: ignore[no-redef]
426
+
427
+
428
+ class VRM_OT_move_down_khr_xmp_json_ld_packet_dc_subject(Operator):
429
+ bl_idname = "vrm.move_down_khr_xmp_json_ld_packet_dc_subject"
430
+ bl_label = "Move Down Subject"
431
+ bl_description = "Move Down Subject"
432
+ bl_options: ClassVar = {"REGISTER", "UNDO"}
433
+
434
+ armature_object_name: StringProperty( # type: ignore[valid-type]
435
+ options={"HIDDEN"},
436
+ )
437
+
438
+ dc_subject_index: IntProperty( # type: ignore[valid-type]
439
+ options={"HIDDEN"},
440
+ min=0,
441
+ )
442
+
443
+ def execute(self, context: Context) -> set[str]:
444
+ armature = context.blend_data.objects.get(self.armature_object_name)
445
+ if armature is None or armature.type != "ARMATURE":
446
+ return {"CANCELLED"}
447
+ armature_data = armature.data
448
+ if not isinstance(armature_data, Armature):
449
+ return {"CANCELLED"}
450
+ packet = get_armature_extension(
451
+ armature_data
452
+ ).khr_character.khr_xmp_json_ld_packet
453
+ if len(packet.dc_subject) <= self.dc_subject_index:
454
+ return {"CANCELLED"}
455
+ new_index = (self.dc_subject_index + 1) % len(packet.dc_subject)
456
+ packet.dc_subject.move(self.dc_subject_index, new_index)
457
+ packet.active_dc_subject_index = new_index
458
+ return {"FINISHED"}
459
+
460
+ if TYPE_CHECKING:
461
+ # This code is auto generated.
462
+ # To regenerate, run the `uv run tools/property_typing.py` command.
463
+ armature_object_name: str # type: ignore[no-redef]
464
+ dc_subject_index: int # type: ignore[no-redef]
@@ -0,0 +1,136 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
3
+
4
+ from bpy.types import Context, Object, UILayout
5
+
6
+ from ...common.logger import get_logger
7
+ from ..migration import defer_migrate
8
+ from ..panel import draw_template_list
9
+ from .ops import (
10
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_creator,
11
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_license,
12
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_subject,
13
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_creator,
14
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_license,
15
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_subject,
16
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_creator,
17
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_license,
18
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_subject,
19
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_creator,
20
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_license,
21
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_subject,
22
+ )
23
+ from .property_group import (
24
+ KhrXmpJsonLdKhrCharacterPacketPropertyGroup,
25
+ )
26
+ from .ui_list import (
27
+ VRM_UL_khr_xmp_json_ld_packet_dc_creator,
28
+ VRM_UL_khr_xmp_json_ld_packet_dc_license,
29
+ VRM_UL_khr_xmp_json_ld_packet_dc_subject,
30
+ )
31
+
32
+ _logger = get_logger(__name__)
33
+
34
+
35
+ def draw_khr_xmp_json_ld_packet_layout(
36
+ _context: Context,
37
+ armature: Object,
38
+ layout: UILayout,
39
+ packet: KhrXmpJsonLdKhrCharacterPacketPropertyGroup,
40
+ ) -> None:
41
+ defer_migrate(armature.name, heavy_migration=False)
42
+
43
+ thumbnail_image_column = layout.column()
44
+ thumbnail_image_column.label(text="Thumbnail Image:")
45
+ thumbnail_image_column.template_ID_preview(packet, "khr_thumbnail_image")
46
+
47
+ layout.prop(packet, "dc_title", icon="FILE_BLEND")
48
+
49
+ dc_creator_column = layout.column()
50
+ dc_creator_column.label(text="Creator:")
51
+ (
52
+ dc_creator_collection_ops,
53
+ dc_creator_collection_item_ops,
54
+ dc_creator_index,
55
+ _,
56
+ _,
57
+ ) = draw_template_list(
58
+ dc_creator_column,
59
+ VRM_UL_khr_xmp_json_ld_packet_dc_creator,
60
+ packet,
61
+ "dc_creator",
62
+ "active_dc_creator_index",
63
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_creator,
64
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_creator,
65
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_creator,
66
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_creator,
67
+ can_remove=lambda _: len(packet.dc_creator) >= 2,
68
+ compact=True,
69
+ )
70
+ for dc_creator_collection_op in dc_creator_collection_ops:
71
+ dc_creator_collection_op.armature_object_name = armature.name
72
+
73
+ for dc_creator_collection_item_op in dc_creator_collection_item_ops:
74
+ dc_creator_collection_item_op.dc_creator_index = dc_creator_index
75
+
76
+ dc_license_column = layout.column()
77
+ dc_license_column.label(text="License:")
78
+ (
79
+ dc_license_collection_ops,
80
+ dc_license_collection_item_ops,
81
+ dc_license_index,
82
+ _,
83
+ _,
84
+ ) = draw_template_list(
85
+ dc_license_column,
86
+ VRM_UL_khr_xmp_json_ld_packet_dc_license,
87
+ packet,
88
+ "dc_license",
89
+ "active_dc_license_index",
90
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_license,
91
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_license,
92
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_license,
93
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_license,
94
+ can_remove=lambda _: len(packet.dc_license) >= 2,
95
+ compact=True,
96
+ )
97
+ for dc_license_collection_op in dc_license_collection_ops:
98
+ dc_license_collection_op.armature_object_name = armature.name
99
+
100
+ for dc_license_collection_item_op in dc_license_collection_item_ops:
101
+ dc_license_collection_item_op.dc_license_index = dc_license_index
102
+
103
+ layout.prop(packet, "dc_created", icon="FILE_BLEND")
104
+ layout.prop(packet, "dc_rights", icon="FILE_BLEND")
105
+ layout.prop(packet, "dc_publisher", icon="FILE_BLEND")
106
+ layout.prop(packet, "dc_description", icon="FILE_BLEND")
107
+
108
+ dc_subject_column = layout.column()
109
+ dc_subject_column.label(text="Subject:")
110
+ (
111
+ dc_subject_collection_ops,
112
+ dc_subject_collection_item_ops,
113
+ dc_subject_index,
114
+ _,
115
+ _,
116
+ ) = draw_template_list(
117
+ dc_subject_column,
118
+ VRM_UL_khr_xmp_json_ld_packet_dc_subject,
119
+ packet,
120
+ "dc_subject",
121
+ "active_dc_subject_index",
122
+ VRM_OT_add_khr_xmp_json_ld_packet_dc_subject,
123
+ VRM_OT_remove_khr_xmp_json_ld_packet_dc_subject,
124
+ VRM_OT_move_up_khr_xmp_json_ld_packet_dc_subject,
125
+ VRM_OT_move_down_khr_xmp_json_ld_packet_dc_subject,
126
+ can_remove=lambda _: len(packet.dc_subject) >= 2,
127
+ compact=True,
128
+ )
129
+ for dc_subject_collection_op in dc_subject_collection_ops:
130
+ dc_subject_collection_op.armature_object_name = armature.name
131
+
132
+ for dc_subject_collection_item_op in dc_subject_collection_item_ops:
133
+ dc_subject_collection_item_op.dc_subject_index = dc_subject_index
134
+
135
+ layout.prop(packet, "dc_source", icon="FILE_BLEND")
136
+ layout.prop(packet, "khr_version", icon="FILE_BLEND")
@@ -0,0 +1,83 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ from typing import TYPE_CHECKING, Optional
3
+
4
+ from bpy.props import (
5
+ CollectionProperty,
6
+ IntProperty,
7
+ PointerProperty,
8
+ StringProperty,
9
+ )
10
+ from bpy.types import (
11
+ Image,
12
+ PropertyGroup,
13
+ )
14
+
15
+ from ..property_group import StringPropertyGroup
16
+
17
+ if TYPE_CHECKING:
18
+ from ..property_group import CollectionPropertyProtocol
19
+
20
+
21
+ class KhrXmpJsonLdKhrCharacterPacketPropertyGroup(PropertyGroup):
22
+ dc_title: StringProperty( # type: ignore[valid-type]
23
+ name="Title"
24
+ )
25
+ dc_creator: CollectionProperty( # type: ignore[valid-type]
26
+ type=StringPropertyGroup
27
+ )
28
+ dc_license: CollectionProperty( # type: ignore[valid-type]
29
+ type=StringPropertyGroup
30
+ )
31
+ dc_created: StringProperty( # type: ignore[valid-type]
32
+ name="Created Date"
33
+ )
34
+ dc_rights: StringProperty( # type: ignore[valid-type]
35
+ name="Rights"
36
+ )
37
+ dc_publisher: StringProperty( # type: ignore[valid-type]
38
+ name="Publisher"
39
+ )
40
+ dc_description: StringProperty( # type: ignore[valid-type]
41
+ name="Description"
42
+ )
43
+ dc_subject: CollectionProperty( # type: ignore[valid-type]
44
+ type=StringPropertyGroup
45
+ )
46
+ dc_source: StringProperty( # type: ignore[valid-type]
47
+ name="Source"
48
+ )
49
+ khr_version: StringProperty( # type: ignore[valid-type]
50
+ name="Version"
51
+ )
52
+ khr_thumbnail_image: PointerProperty( # type: ignore[valid-type]
53
+ type=Image
54
+ )
55
+
56
+ # for UI
57
+ active_dc_creator_index: IntProperty(min=0) # type: ignore[valid-type]
58
+ active_dc_license_index: IntProperty(min=0) # type: ignore[valid-type]
59
+ active_dc_subject_index: IntProperty(min=0) # type: ignore[valid-type]
60
+
61
+ if TYPE_CHECKING:
62
+ # This code is auto generated.
63
+ # To regenerate, run the `uv run tools/property_typing.py` command.
64
+ dc_title: str # type: ignore[no-redef]
65
+ dc_creator: CollectionPropertyProtocol[ # type: ignore[no-redef]
66
+ StringPropertyGroup
67
+ ]
68
+ dc_license: CollectionPropertyProtocol[ # type: ignore[no-redef]
69
+ StringPropertyGroup
70
+ ]
71
+ dc_created: str # type: ignore[no-redef]
72
+ dc_rights: str # type: ignore[no-redef]
73
+ dc_publisher: str # type: ignore[no-redef]
74
+ dc_description: str # type: ignore[no-redef]
75
+ dc_subject: CollectionPropertyProtocol[ # type: ignore[no-redef]
76
+ StringPropertyGroup
77
+ ]
78
+ dc_source: str # type: ignore[no-redef]
79
+ khr_version: str # type: ignore[no-redef]
80
+ khr_thumbnail_image: Optional[Image] # type: ignore[no-redef]
81
+ active_dc_creator_index: int # type: ignore[no-redef]
82
+ active_dc_license_index: int # type: ignore[no-redef]
83
+ active_dc_subject_index: int # type: ignore[no-redef]