@volter/blender-engine 0.1.147 → 0.1.149

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +4 -11
  3. package/browser/addons/vrm/LICENSE_(OPTION1)_MIT.txt +22 -0
  4. package/browser/addons/vrm/LICENSE_(OPTION2)_GPL-3_0.txt +674 -0
  5. package/browser/addons/vrm/LICENSE_MAIN.txt +1 -0
  6. package/browser/addons/vrm/README.txt +3 -0
  7. package/browser/addons/vrm/__init__.py +41 -0
  8. package/browser/addons/vrm/blender_manifest.toml +16 -0
  9. package/browser/addons/vrm/common/__init__.py +1 -0
  10. package/browser/addons/vrm/common/animation.py +58 -0
  11. package/browser/addons/vrm/common/blender_manifest.py +82 -0
  12. package/browser/addons/vrm/common/char.py +16 -0
  13. package/browser/addons/vrm/common/convert.py +287 -0
  14. package/browser/addons/vrm/common/convert_any.py +48 -0
  15. package/browser/addons/vrm/common/debug.py +40 -0
  16. package/browser/addons/vrm/common/deep.py +162 -0
  17. package/browser/addons/vrm/common/error_dialog.py +274 -0
  18. package/browser/addons/vrm/common/fs.py +71 -0
  19. package/browser/addons/vrm/common/gl.py +20 -0
  20. package/browser/addons/vrm/common/gltf.py +1149 -0
  21. package/browser/addons/vrm/common/human_bone_mapper/__init__.py +1 -0
  22. package/browser/addons/vrm/common/human_bone_mapper/biped_mapping.py +84 -0
  23. package/browser/addons/vrm/common/human_bone_mapper/cats_blender_plugin_fix_model_mapping.py +63 -0
  24. package/browser/addons/vrm/common/human_bone_mapper/human_bone_mapper.py +203 -0
  25. package/browser/addons/vrm/common/human_bone_mapper/microsoft_rocketbox_mapping.py +69 -0
  26. package/browser/addons/vrm/common/human_bone_mapper/mixamo_mapping.py +62 -0
  27. package/browser/addons/vrm/common/human_bone_mapper/mmd_mapping.py +115 -0
  28. package/browser/addons/vrm/common/human_bone_mapper/mpfb_mapping.py +120 -0
  29. package/browser/addons/vrm/common/human_bone_mapper/ready_player_me_mapping.py +65 -0
  30. package/browser/addons/vrm/common/human_bone_mapper/reallusion_mapping.py +94 -0
  31. package/browser/addons/vrm/common/human_bone_mapper/rigify_meta_rig_mapping.py +65 -0
  32. package/browser/addons/vrm/common/human_bone_mapper/structure_based_mapping.py +891 -0
  33. package/browser/addons/vrm/common/human_bone_mapper/unreal_mapping.py +62 -0
  34. package/browser/addons/vrm/common/human_bone_mapper/vrm_addon_mapping.py +112 -0
  35. package/browser/addons/vrm/common/human_bone_mapper/vroid_mapping.py +89 -0
  36. package/browser/addons/vrm/common/legacy_gltf.py +16 -0
  37. package/browser/addons/vrm/common/logger.py +84 -0
  38. package/browser/addons/vrm/common/mtoon0.blend +0 -0
  39. package/browser/addons/vrm/common/mtoon1.blend +0 -0
  40. package/browser/addons/vrm/common/mtoon1_outline.blend +0 -0
  41. package/browser/addons/vrm/common/mtoon_auto_setup.blend +0 -0
  42. package/browser/addons/vrm/common/mtoon_unversioned.py +62 -0
  43. package/browser/addons/vrm/common/ops/__init__.py +10 -0
  44. package/browser/addons/vrm/common/ops/export_scene.py +67 -0
  45. package/browser/addons/vrm/common/ops/icyp.py +53 -0
  46. package/browser/addons/vrm/common/ops/import_scene.py +57 -0
  47. package/browser/addons/vrm/common/ops/vrm.py +2380 -0
  48. package/browser/addons/vrm/common/ops/wm.py +167 -0
  49. package/browser/addons/vrm/common/preferences.py +362 -0
  50. package/browser/addons/vrm/common/progress.py +87 -0
  51. package/browser/addons/vrm/common/rotation.py +89 -0
  52. package/browser/addons/vrm/common/safe_removal.py +46 -0
  53. package/browser/addons/vrm/common/scene_watcher.py +230 -0
  54. package/browser/addons/vrm/common/shader.py +2243 -0
  55. package/browser/addons/vrm/common/shape_key_mapper/__init__.py +1 -0
  56. package/browser/addons/vrm/common/shape_key_mapper/arkit_mapping.py +168 -0
  57. package/browser/addons/vrm/common/shape_key_mapper/mmd_mapping.py +62 -0
  58. package/browser/addons/vrm/common/shape_key_mapper/ready_player_me_mapping.py +52 -0
  59. package/browser/addons/vrm/common/shape_key_mapper/vrchat_mapping.py +17 -0
  60. package/browser/addons/vrm/common/third_party_user_extension.py +214 -0
  61. package/browser/addons/vrm/common/transparent_z_write.blend +0 -0
  62. package/browser/addons/vrm/common/version.py +161 -0
  63. package/browser/addons/vrm/common/vrm0/__init__.py +1 -0
  64. package/browser/addons/vrm/common/vrm0/human_bone.py +662 -0
  65. package/browser/addons/vrm/common/vrm0/material_property.py +346 -0
  66. package/browser/addons/vrm/common/vrm1/__init__.py +1 -0
  67. package/browser/addons/vrm/common/vrm1/expression_preset.py +207 -0
  68. package/browser/addons/vrm/common/vrm1/human_bone.py +822 -0
  69. package/browser/addons/vrm/common/workspace.py +227 -0
  70. package/browser/addons/vrm/common/writable_context.py +77 -0
  71. package/browser/addons/vrm/documentation/en-us/animation/index.md +63 -0
  72. package/browser/addons/vrm/documentation/en-us/create-humanoid-vrm-from-scratch/index.md +131 -0
  73. package/browser/addons/vrm/documentation/en-us/create-simple-vrm-from-scratch/index.md +30 -0
  74. package/browser/addons/vrm/documentation/en-us/development/index.md +136 -0
  75. package/browser/addons/vrm/documentation/en-us/index.md +41 -0
  76. package/browser/addons/vrm/documentation/en-us/installation/index.md +152 -0
  77. package/browser/addons/vrm/documentation/en-us/material-mtoon/index.md +122 -0
  78. package/browser/addons/vrm/documentation/en-us/material-pbr/index.md +94 -0
  79. package/browser/addons/vrm/documentation/en-us/scripting-api/index.md +391 -0
  80. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrm/index.md +57 -0
  81. package/browser/addons/vrm/documentation/en-us/ui/export_scene.vrma/index.md +17 -0
  82. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrm/index.md +61 -0
  83. package/browser/addons/vrm/documentation/en-us/ui/import_scene.vrma/index.md +13 -0
  84. package/browser/addons/vrm/documentation/ja-jp/animation/index.md +57 -0
  85. package/browser/addons/vrm/documentation/ja-jp/create-humanoid-vrm-from-scratch/index.md +129 -0
  86. package/browser/addons/vrm/documentation/ja-jp/create-simple-vrm-from-scratch/index.md +29 -0
  87. package/browser/addons/vrm/documentation/ja-jp/development/index.md +137 -0
  88. package/browser/addons/vrm/documentation/ja-jp/index.md +37 -0
  89. package/browser/addons/vrm/documentation/ja-jp/installation/index.md +150 -0
  90. package/browser/addons/vrm/documentation/ja-jp/material-mtoon/index.md +113 -0
  91. package/browser/addons/vrm/documentation/ja-jp/material-pbr/index.md +90 -0
  92. package/browser/addons/vrm/documentation/ja-jp/scripting-api/index.md +389 -0
  93. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrm/index.md +55 -0
  94. package/browser/addons/vrm/documentation/ja-jp/ui/export_scene.vrma/index.md +19 -0
  95. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrm/index.md +56 -0
  96. package/browser/addons/vrm/documentation/ja-jp/ui/import_scene.vrma/index.md +14 -0
  97. package/browser/addons/vrm/editor/__init__.py +1 -0
  98. package/browser/addons/vrm/editor/extension.py +425 -0
  99. package/browser/addons/vrm/editor/extension_accessor.py +75 -0
  100. package/browser/addons/vrm/editor/handler.py +84 -0
  101. package/browser/addons/vrm/editor/khr_character/__init__.py +1 -0
  102. package/browser/addons/vrm/editor/khr_character/panel.py +69 -0
  103. package/browser/addons/vrm/editor/khr_character/property_group.py +27 -0
  104. package/browser/addons/vrm/editor/khr_xmp_json_ld/__init__.py +1 -0
  105. package/browser/addons/vrm/editor/khr_xmp_json_ld/ops.py +464 -0
  106. package/browser/addons/vrm/editor/khr_xmp_json_ld/panel.py +136 -0
  107. package/browser/addons/vrm/editor/khr_xmp_json_ld/property_group.py +83 -0
  108. package/browser/addons/vrm/editor/khr_xmp_json_ld/ui_list.py +198 -0
  109. package/browser/addons/vrm/editor/make_armature.py +709 -0
  110. package/browser/addons/vrm/editor/menu.py +147 -0
  111. package/browser/addons/vrm/editor/migration.py +297 -0
  112. package/browser/addons/vrm/editor/mtoon1/__init__.py +1 -0
  113. package/browser/addons/vrm/editor/mtoon1/handler.py +20 -0
  114. package/browser/addons/vrm/editor/mtoon1/migration.py +536 -0
  115. package/browser/addons/vrm/editor/mtoon1/ops.py +304 -0
  116. package/browser/addons/vrm/editor/mtoon1/panel.py +442 -0
  117. package/browser/addons/vrm/editor/mtoon1/property_group.py +4977 -0
  118. package/browser/addons/vrm/editor/mtoon1/scene_watcher.py +381 -0
  119. package/browser/addons/vrm/editor/node_constraint1/__init__.py +1 -0
  120. package/browser/addons/vrm/editor/node_constraint1/panel.py +317 -0
  121. package/browser/addons/vrm/editor/node_constraint1/property_group.py +25 -0
  122. package/browser/addons/vrm/editor/ops.py +471 -0
  123. package/browser/addons/vrm/editor/panel.py +315 -0
  124. package/browser/addons/vrm/editor/property_group.py +888 -0
  125. package/browser/addons/vrm/editor/search.py +682 -0
  126. package/browser/addons/vrm/editor/spring_bone1/__init__.py +1 -0
  127. package/browser/addons/vrm/editor/spring_bone1/handler.py +994 -0
  128. package/browser/addons/vrm/editor/spring_bone1/menu.py +246 -0
  129. package/browser/addons/vrm/editor/spring_bone1/migration.py +86 -0
  130. package/browser/addons/vrm/editor/spring_bone1/ops.py +1679 -0
  131. package/browser/addons/vrm/editor/spring_bone1/panel.py +605 -0
  132. package/browser/addons/vrm/editor/spring_bone1/property_group.py +1457 -0
  133. package/browser/addons/vrm/editor/spring_bone1/ui_list.py +408 -0
  134. package/browser/addons/vrm/editor/subscription.py +123 -0
  135. package/browser/addons/vrm/editor/t_pose.py +713 -0
  136. package/browser/addons/vrm/editor/validation.py +1271 -0
  137. package/browser/addons/vrm/editor/vrm0/__init__.py +1 -0
  138. package/browser/addons/vrm/editor/vrm0/gizmo_group.py +63 -0
  139. package/browser/addons/vrm/editor/vrm0/handler.py +23 -0
  140. package/browser/addons/vrm/editor/vrm0/menu.py +145 -0
  141. package/browser/addons/vrm/editor/vrm0/migration.py +761 -0
  142. package/browser/addons/vrm/editor/vrm0/ops.py +2145 -0
  143. package/browser/addons/vrm/editor/vrm0/panel.py +1333 -0
  144. package/browser/addons/vrm/editor/vrm0/property_group.py +1818 -0
  145. package/browser/addons/vrm/editor/vrm0/ui_list.py +688 -0
  146. package/browser/addons/vrm/editor/vrm1/__init__.py +1 -0
  147. package/browser/addons/vrm/editor/vrm1/handler.py +28 -0
  148. package/browser/addons/vrm/editor/vrm1/menu.py +76 -0
  149. package/browser/addons/vrm/editor/vrm1/migration.py +321 -0
  150. package/browser/addons/vrm/editor/vrm1/ops.py +2679 -0
  151. package/browser/addons/vrm/editor/vrm1/panel.py +1243 -0
  152. package/browser/addons/vrm/editor/vrm1/property_group.py +2087 -0
  153. package/browser/addons/vrm/editor/vrm1/scene_watcher.py +90 -0
  154. package/browser/addons/vrm/editor/vrm1/ui_list.py +533 -0
  155. package/browser/addons/vrm/exporter/__init__.py +1 -0
  156. package/browser/addons/vrm/exporter/abstract_base_vrm_exporter.py +628 -0
  157. package/browser/addons/vrm/exporter/export_scene.py +930 -0
  158. package/browser/addons/vrm/exporter/gltf2_export_user_extension.py +45 -0
  159. package/browser/addons/vrm/exporter/khr_character_exporter.py +34 -0
  160. package/browser/addons/vrm/exporter/vrm0_exporter.py +4020 -0
  161. package/browser/addons/vrm/exporter/vrm1_exporter.py +3682 -0
  162. package/browser/addons/vrm/exporter/vrm_animation_exporter.py +1035 -0
  163. package/browser/addons/vrm/external/__init__.py +1 -0
  164. package/browser/addons/vrm/external/auto_rig_pro_support.py +3 -0
  165. package/browser/addons/vrm/external/io_scene_gltf2_support.py +418 -0
  166. package/browser/addons/vrm/external/rigify_support.py +1 -0
  167. package/browser/addons/vrm/importer/__init__.py +1 -0
  168. package/browser/addons/vrm/importer/abstract_base_vrm_importer.py +1548 -0
  169. package/browser/addons/vrm/importer/file_handler.py +34 -0
  170. package/browser/addons/vrm/importer/gltf2_import_user_extension.py +268 -0
  171. package/browser/addons/vrm/importer/import_scene.py +646 -0
  172. package/browser/addons/vrm/importer/license_validation.py +198 -0
  173. package/browser/addons/vrm/importer/vrm0_importer.py +1723 -0
  174. package/browser/addons/vrm/importer/vrm1_importer.py +2014 -0
  175. package/browser/addons/vrm/importer/vrm_animation_importer.py +763 -0
  176. package/browser/addons/vrm/importer/vrm_diff.py +316 -0
  177. package/browser/addons/vrm/locale/__init__.py +1 -0
  178. package/browser/addons/vrm/locale/ja_jp.py +826 -0
  179. package/browser/addons/vrm/locale/ruff.toml +8 -0
  180. package/browser/addons/vrm/locale/translation_dictionary.py +10 -0
  181. package/browser/addons/vrm/locale/zh_hans.py +928 -0
  182. package/browser/addons/vrm/registration.py +670 -0
  183. package/browser/addons/vrm.json +18 -0
  184. package/browser/blender-emscripten-engine.mts +60 -128
  185. package/browser/blender-engine.mts +20 -186
  186. package/browser/blender-wali-engine.mts +35 -81
  187. package/browser/describe-thrown.mts +3 -6
  188. package/browser/document-chunks.mts +4 -16
  189. package/browser/gltf_export.py +3161 -0
  190. package/browser/heap-growth.mts +23 -0
  191. package/browser/index.ts +2 -0
  192. package/browser/protocol.ts +119 -35
  193. package/browser/pull-job.mts +2 -10
  194. package/browser/rna.ts +190 -73
  195. package/browser/runtime.ts +197 -82
  196. package/browser/session-addons.mts +33 -0
  197. package/browser/session-frame.mts +5 -24
  198. package/browser/session.py +1338 -1427
  199. package/browser/three/attach-presenter.ts +11 -39
  200. package/browser/three/blender-base64.ts +1 -36
  201. package/browser/three/blender-corner-normals.ts +1 -23
  202. package/browser/three/blender-display-shaders.json +1 -1
  203. package/browser/three/blender-display-shaders.lut +0 -0
  204. package/browser/three/blender-display-transform.ts +2 -1
  205. package/browser/three/blender-frame-columns.ts +5 -13
  206. package/browser/three/blender-graph-material.ts +18 -3
  207. package/browser/three/blender-node-graph.ts +10 -34
  208. package/browser/three/blender-physical-material.ts +2 -31
  209. package/browser/three/blender-runtime-armature.ts +7 -60
  210. package/browser/three/blender-runtime-frame.ts +9 -23
  211. package/browser/three/blender-runtime-geometry.ts +22 -26
  212. package/browser/three/blender-runtime-lighting.ts +48 -178
  213. package/browser/three/blender-runtime-shadows.ts +187 -1
  214. package/browser/three/blender-runtime-skeleton.ts +53 -1
  215. package/browser/three/blender-runtime-view.ts +505 -283
  216. package/browser/three/blender-runtime-weights.ts +9 -72
  217. package/browser/three/blender-sky.ts +13 -33
  218. package/browser/three/blender-triangulate.ts +7 -35
  219. package/browser/three/blender-viewport-sampling.ts +235 -0
  220. package/browser/three/blender-workbench-material.ts +25 -29
  221. package/browser/three/blender-workbench-outline.ts +199 -0
  222. package/browser/three/blender-world-volume.ts +62 -10
  223. package/browser/three/presenter.ts +10 -26
  224. package/browser/three/release.ts +5 -21
  225. package/browser/three/sky-precompute-worker.ts +1 -18
  226. package/browser/three/sky-worker.ts +5 -23
  227. package/browser/three/world-field-sampler.ts +12 -26
  228. package/browser/volter_three.py +9 -105
  229. package/browser/worker.ts +156 -151
  230. package/package.json +5 -2
  231. package/wasm/BUNDLE.json +17 -17
  232. package/wasm/DEPENDENCY-LICENSES.txt +14 -0
  233. package/wasm/blender_browser.data.br +0 -0
  234. package/wasm/blender_browser.js +1 -1
  235. package/wasm/blender_browser.wasm.br +0 -0
  236. package/browser/frame-transfer.mts +0 -19
  237. package/browser/three/agx-base-srgb.lut +0 -0
  238. package/browser/three/agx-look-medium-high-contrast.lut +0 -0
  239. package/browser/three/agx-look-punchy.lut +0 -0
  240. package/browser/three/blender-agx.ts +0 -235
  241. package/browser/three/blender-display-lut.ts +0 -145
  242. package/browser/three/blender-filmic.ts +0 -49
  243. package/browser/three/blender-standard.ts +0 -68
  244. package/browser/three/blender-world-visibility.ts +0 -278
  245. package/browser/three/filmic-srgb.lut +0 -0
@@ -0,0 +1,536 @@
1
+ # SPDX-License-Identifier: MIT OR GPL-3.0-or-later
2
+ import functools
3
+ from dataclasses import dataclass
4
+ from typing import Final, Optional
5
+
6
+ import bpy
7
+ from bpy.types import (
8
+ Context,
9
+ Image,
10
+ Material,
11
+ NodeReroute,
12
+ PropertyGroup,
13
+ ShaderNodeGroup,
14
+ ShaderNodeTexImage,
15
+ )
16
+
17
+ from ...common import convert, ops, shader, version
18
+ from ...common.gl import GL_LINEAR, GL_NEAREST
19
+ from ...common.logger import get_logger
20
+ from ...common.progress import create_progress
21
+ from ...common.shader import LegacyAddonMaterial
22
+ from ..extension_accessor import get_material_extension
23
+ from .property_group import (
24
+ GL_LINEAR_IMAGE_INTERPOLATIONS,
25
+ IMAGE_INTERPOLATION_CLOSEST,
26
+ IMAGE_INTERPOLATION_LINEAR,
27
+ Mtoon1MaterialPropertyGroup,
28
+ Mtoon1SamplerPropertyGroup,
29
+ Mtoon1TextureInfoPropertyGroup,
30
+ Mtoon1VrmcMaterialsMtoonPropertyGroup,
31
+ reset_shader_node_group,
32
+ )
33
+
34
+ TextureInfoBackup = Mtoon1TextureInfoPropertyGroup.TextureInfoBackup
35
+
36
+ _logger = get_logger(__name__)
37
+
38
+
39
+ @dataclass
40
+ class State:
41
+ material_blender_4_2_warning_shown: bool = False
42
+
43
+
44
+ _state: Final = State()
45
+
46
+
47
+ def _show_material_blender_4_2_warning_delay(material_name_lines: str) -> None:
48
+ ops.vrm.show_material_blender_4_2_warning(
49
+ "INVOKE_DEFAULT",
50
+ material_name_lines=material_name_lines,
51
+ )
52
+
53
+
54
+ def migrate(context: Context, *, show_progress: bool = False) -> None:
55
+ blender_4_2_migrated_material_names: list[str] = []
56
+
57
+ with create_progress(context, show_progress=show_progress) as progress:
58
+ for material_index, material in enumerate(context.blend_data.materials):
59
+ if not material:
60
+ continue
61
+ _migrate_material(context, material, blender_4_2_migrated_material_names)
62
+ progress.update(float(material_index) / len(context.blend_data.materials))
63
+ progress.update(1)
64
+
65
+ if (
66
+ blender_4_2_migrated_material_names
67
+ and tuple(context.blend_data.version) < (4, 2)
68
+ and bpy.app.version >= (4, 2)
69
+ ):
70
+ _logger.warning(
71
+ "Migrating Materials from blender version data=%s app=%s",
72
+ context.blend_data.version,
73
+ bpy.app.version,
74
+ )
75
+
76
+ if not _state.material_blender_4_2_warning_shown:
77
+ _state.material_blender_4_2_warning_shown = True
78
+ # In Blender 4.2.0, if you don't run it with a timer, the dialog will
79
+ # disappear automatically.
80
+ bpy.app.timers.register(
81
+ functools.partial(
82
+ _show_material_blender_4_2_warning_delay,
83
+ "\n".join(blender_4_2_migrated_material_names),
84
+ ),
85
+ first_interval=0.1,
86
+ )
87
+
88
+
89
+ def _migrate_material(
90
+ context: Context,
91
+ material: Material,
92
+ blender_4_2_migrated_material_names: list[str],
93
+ ) -> None:
94
+ if (
95
+ legacy_addon_material := LegacyAddonMaterial.try_parse(material)
96
+ ) and legacy_addon_material.shader_name in shader.LEGACY_SHADER_NAMES:
97
+ # Since old shader node groups are not compatible with Blender 4.2 as they are,
98
+ # always warn when upgrading to Blender 4.2 or later.
99
+ blender_4_2_migrated_material_names.append(material.name)
100
+ return
101
+
102
+ if bpy.app.version < (5, 0, 0) and not material.use_nodes:
103
+ return
104
+ node_tree = material.node_tree
105
+ if not node_tree:
106
+ return
107
+
108
+ mtoon1 = get_material_extension(material).mtoon1
109
+ if not mtoon1.get("enabled"):
110
+ return
111
+
112
+ vrmc_materials_mtoon = mtoon1.extensions.vrmc_materials_mtoon
113
+ if vrmc_materials_mtoon.get("is_outline_material"):
114
+ return
115
+
116
+ addon_version = convert.float3_or(mtoon1.get("addon_version"), (0, 0, 0))
117
+ if addon_version < (2, 16, 4):
118
+ # https://github.com/saturday06/VRM-Addon-for-Blender/blob/2_10_0/io_scene_vrm/editor/mtoon1/property_group.py#L1658-L1683
119
+ surface_node_name = "Mtoon1Material.MaterialOutputSurfaceIn"
120
+ surface_node = node_tree.nodes.get(surface_node_name)
121
+ if not isinstance(surface_node, NodeReroute):
122
+ return
123
+
124
+ connected = False
125
+ surface_socket = surface_node.outputs[0]
126
+ for link in node_tree.links:
127
+ if (
128
+ link.from_socket == surface_socket
129
+ and link.to_socket
130
+ and link.to_socket.node
131
+ and link.to_socket.node.type == "OUTPUT_MATERIAL"
132
+ ):
133
+ connected = True
134
+ break
135
+ if not connected:
136
+ return
137
+ else:
138
+ # https://github.com/saturday06/VRM-Addon-for-Blender/blob/2_16_4/io_scene_vrm/editor/mtoon1/property_group.py#L1913-L1929
139
+ group_node = node_tree.nodes.get("Mtoon1Material.Mtoon1Output")
140
+ if not isinstance(group_node, ShaderNodeGroup):
141
+ return
142
+ if not group_node.node_tree:
143
+ return
144
+ if group_node.node_tree.name != "VRM Add-on MToon 1.0 Output Revision 1":
145
+ return
146
+
147
+ if addon_version < (2, 20, 50):
148
+ _migrate_sampler_filter_node(material)
149
+
150
+ alpha_mode: Optional[str] = None
151
+ alpha_cutoff: Optional[float] = None
152
+ if addon_version < (2, 20, 55):
153
+ blender_4_2_migrated_material_names.append(material.name)
154
+ alpha_cutoff = material.alpha_threshold
155
+ blend_method = material.blend_method
156
+ if blend_method in {"BLEND", "HASHED"}:
157
+ alpha_mode = Mtoon1MaterialPropertyGroup.ALPHA_MODE_BLEND.identifier
158
+ elif blend_method == "CLIP":
159
+ alpha_mode = Mtoon1MaterialPropertyGroup.ALPHA_MODE_MASK.identifier
160
+ else:
161
+ alpha_mode = Mtoon1MaterialPropertyGroup.ALPHA_MODE_OPAQUE.identifier
162
+
163
+ base_color_factor: Optional[tuple[float, float, float, float]] = None
164
+ base_color_texture_backup: Optional[TextureInfoBackup] = None
165
+ normal_texture_backup: Optional[TextureInfoBackup] = None
166
+ normal_texture_scale: Optional[float] = None
167
+ emissive_texture_backup: Optional[TextureInfoBackup] = None
168
+ emissive_factor: Optional[tuple[float, float, float]] = None
169
+ emissive_strength: Optional[float] = None
170
+
171
+ transparent_with_z_write: Optional[bool] = None
172
+ render_queue_offset_number: Optional[int] = None
173
+ shade_multiply_texture_backup: Optional[TextureInfoBackup] = None
174
+ shade_color_factor: Optional[tuple[float, float, float]] = None
175
+ shading_shift_texture_backup: Optional[TextureInfoBackup] = None
176
+ shading_shift_texture_scale: Optional[float] = None
177
+ shading_shift_factor: Optional[float] = None
178
+ shading_toony_factor: Optional[float] = None
179
+ gi_equalization_factor: Optional[float] = None
180
+ matcap_factor: Optional[tuple[float, float, float]] = None
181
+ matcap_texture_backup: Optional[TextureInfoBackup] = None
182
+ parametric_rim_color_factor: Optional[tuple[float, float, float]] = None
183
+ rim_multiply_texture_backup: Optional[TextureInfoBackup] = None
184
+ rim_lighting_mix_factor: Optional[float] = None
185
+ parametric_rim_fresnel_power_factor: Optional[float] = None
186
+ parametric_rim_lift_factor: Optional[float] = None
187
+ outline_width_mode: Optional[str] = None
188
+ outline_width_factor: Optional[float] = None
189
+ outline_width_multiply_texture_backup: Optional[TextureInfoBackup] = None
190
+ outline_color_factor: Optional[tuple[float, float, float]] = None
191
+ outline_lighting_mix_factor: Optional[float] = None
192
+ uv_animation_mask_texture_backup: Optional[TextureInfoBackup] = None
193
+ uv_animation_scroll_x_speed_factor: Optional[float] = None
194
+ uv_animation_scroll_y_speed_factor: Optional[float] = None
195
+ uv_animation_rotation_speed_factor: Optional[float] = None
196
+ if addon_version < (2, 20, 62):
197
+ pbr_metallic_roughness = mtoon1.pbr_metallic_roughness
198
+ base_color_factor = convert.float4_or_none(
199
+ pbr_metallic_roughness.get("base_color_factor")
200
+ )
201
+ base_color_texture_backup = _backup_texture_info(
202
+ pbr_metallic_roughness.base_color_texture
203
+ )
204
+ normal_texture = mtoon1.normal_texture
205
+ normal_texture_backup = _backup_texture_info(normal_texture)
206
+ normal_texture_scale = convert.float_or_none(normal_texture.get("scale"))
207
+ emissive_factor = convert.float3_or_none(mtoon1.get("emissive_factor"))
208
+ emissive_texture_backup = _backup_texture_info(mtoon1.emissive_texture)
209
+ emissive_strength = convert.float_or_none(
210
+ mtoon1.extensions.khr_materials_emissive_strength.get("emissive_strength")
211
+ )
212
+
213
+ transparent_with_z_write_object = vrmc_materials_mtoon.get(
214
+ "transparent_with_z_write"
215
+ )
216
+ if isinstance(transparent_with_z_write_object, int):
217
+ transparent_with_z_write = bool(transparent_with_z_write_object)
218
+
219
+ render_queue_offset_number_object = vrmc_materials_mtoon.get(
220
+ "render_queue_offset_number"
221
+ )
222
+ if isinstance(render_queue_offset_number_object, int):
223
+ render_queue_offset_number = render_queue_offset_number_object
224
+
225
+ shade_multiply_texture_backup = _backup_texture_info(
226
+ vrmc_materials_mtoon.shade_multiply_texture
227
+ )
228
+ shade_color_factor = convert.float3_or_none(
229
+ vrmc_materials_mtoon.get("shade_color_factor")
230
+ )
231
+
232
+ shading_shift_texture = vrmc_materials_mtoon.shading_shift_texture
233
+ shading_shift_texture_backup = _backup_texture_info(shading_shift_texture)
234
+ shading_shift_texture_scale = convert.float_or_none(
235
+ shading_shift_texture.get("scale")
236
+ )
237
+
238
+ shading_shift_factor = convert.float_or_none(
239
+ vrmc_materials_mtoon.get("shading_shift_factor")
240
+ )
241
+ shading_toony_factor = convert.float_or_none(
242
+ vrmc_materials_mtoon.get("shading_toony_factor")
243
+ )
244
+ matcap_factor = convert.float3_or_none(
245
+ vrmc_materials_mtoon.get("matcap_factor")
246
+ )
247
+ matcap_texture_backup = _backup_texture_info(
248
+ vrmc_materials_mtoon.matcap_texture
249
+ )
250
+ gi_equalization_factor = convert.float_or_none(
251
+ vrmc_materials_mtoon.get("gi_equalization_factor")
252
+ )
253
+ parametric_rim_color_factor = convert.float3_or_none(
254
+ vrmc_materials_mtoon.get("parametric_rim_color_factor")
255
+ )
256
+ rim_multiply_texture_backup = _backup_texture_info(
257
+ vrmc_materials_mtoon.rim_multiply_texture
258
+ )
259
+ rim_lighting_mix_factor = convert.float_or_none(
260
+ vrmc_materials_mtoon.get("rim_lighting_mix_factor")
261
+ )
262
+ parametric_rim_fresnel_power_factor = convert.float_or_none(
263
+ vrmc_materials_mtoon.get("parametric_rim_fresnel_power_factor")
264
+ )
265
+ parametric_rim_lift_factor = convert.float_or_none(
266
+ vrmc_materials_mtoon.get("parametric_rim_lift_factor")
267
+ )
268
+ outline_width_mode_number = vrmc_materials_mtoon.get("outline_width_mode")
269
+ if isinstance(outline_width_mode_number, int):
270
+ outline_width_mode_item = (
271
+ Mtoon1VrmcMaterialsMtoonPropertyGroup.outline_width_mode_enum
272
+ )
273
+ outline_width_mode = outline_width_mode_item.value_to_identifier(
274
+ outline_width_mode_number,
275
+ Mtoon1VrmcMaterialsMtoonPropertyGroup.OUTLINE_WIDTH_MODE_NONE.identifier,
276
+ )
277
+ outline_width_factor = convert.float_or_none(
278
+ vrmc_materials_mtoon.get("outline_width_factor")
279
+ )
280
+ outline_width_multiply_texture_backup = _backup_texture_info(
281
+ vrmc_materials_mtoon.outline_width_multiply_texture
282
+ )
283
+ outline_color_factor = convert.float3_or_none(
284
+ vrmc_materials_mtoon.get("outline_color_factor")
285
+ )
286
+ outline_lighting_mix_factor = convert.float_or_none(
287
+ vrmc_materials_mtoon.get("outline_lighting_mix_factor")
288
+ )
289
+ uv_animation_mask_texture_backup = _backup_texture_info(
290
+ vrmc_materials_mtoon.uv_animation_mask_texture
291
+ )
292
+ uv_animation_scroll_x_speed_factor = convert.float_or_none(
293
+ vrmc_materials_mtoon.get("uv_animation_scroll_x_speed_factor")
294
+ )
295
+ uv_animation_scroll_y_speed_factor = convert.float_or_none(
296
+ vrmc_materials_mtoon.get("uv_animation_scroll_y_speed_factor")
297
+ )
298
+ uv_animation_rotation_speed_factor = convert.float_or_none(
299
+ vrmc_materials_mtoon.get("uv_animation_rotation_speed_factor")
300
+ )
301
+
302
+ if (
303
+ addon_version < shader.LAST_MODIFIED_VERSION
304
+ # Blender 4.2 has a node specification change, so it will be forcibly reset.
305
+ or (bpy.app.version >= (4, 2) and tuple(context.blend_data.version) < (4, 2))
306
+ ):
307
+ reset_shader_node_group(
308
+ context, material, reset_material_node_tree=True, reset_node_groups=False
309
+ )
310
+
311
+ # From this point on, you can write code that assumes the shader node is up to date.
312
+ vrmc_materials_mtoon = mtoon1.extensions.vrmc_materials_mtoon
313
+ if alpha_mode is not None:
314
+ mtoon1.alpha_mode = alpha_mode
315
+ if alpha_cutoff is not None:
316
+ mtoon1.alpha_cutoff = alpha_cutoff
317
+ if base_color_factor is not None:
318
+ mtoon1.pbr_metallic_roughness.base_color_factor = base_color_factor
319
+ if base_color_texture_backup is not None:
320
+ mtoon1.pbr_metallic_roughness.base_color_texture.restore(
321
+ base_color_texture_backup
322
+ )
323
+ if normal_texture_backup is not None:
324
+ mtoon1.normal_texture.restore(normal_texture_backup)
325
+ if normal_texture_scale is not None:
326
+ mtoon1.normal_texture.scale = normal_texture_scale
327
+ if emissive_texture_backup is not None:
328
+ mtoon1.emissive_texture.restore(emissive_texture_backup)
329
+ if emissive_factor is not None:
330
+ mtoon1.emissive_factor = emissive_factor
331
+ if emissive_strength is not None:
332
+ mtoon1.extensions.khr_materials_emissive_strength.emissive_strength = (
333
+ emissive_strength
334
+ )
335
+
336
+ if transparent_with_z_write is not None:
337
+ vrmc_materials_mtoon.transparent_with_z_write = transparent_with_z_write
338
+ if render_queue_offset_number is not None:
339
+ vrmc_materials_mtoon.render_queue_offset_number = render_queue_offset_number
340
+ if shade_multiply_texture_backup is not None:
341
+ vrmc_materials_mtoon.shade_multiply_texture.restore(
342
+ shade_multiply_texture_backup
343
+ )
344
+ if shade_color_factor is not None:
345
+ vrmc_materials_mtoon.shade_color_factor = shade_color_factor
346
+ if shading_shift_texture_backup is not None:
347
+ vrmc_materials_mtoon.shading_shift_texture.restore(shading_shift_texture_backup)
348
+ if shading_shift_factor is not None:
349
+ vrmc_materials_mtoon.shading_shift_factor = shading_shift_factor
350
+ if shading_shift_texture_scale is not None:
351
+ vrmc_materials_mtoon.shading_shift_texture.scale = shading_shift_texture_scale
352
+ if shading_toony_factor is not None:
353
+ vrmc_materials_mtoon.shading_toony_factor = shading_toony_factor
354
+ if gi_equalization_factor is not None:
355
+ vrmc_materials_mtoon.gi_equalization_factor = gi_equalization_factor
356
+ if matcap_factor is not None:
357
+ vrmc_materials_mtoon.matcap_factor = matcap_factor
358
+ if matcap_texture_backup is not None:
359
+ vrmc_materials_mtoon.matcap_texture.restore(matcap_texture_backup)
360
+ if parametric_rim_color_factor is not None:
361
+ vrmc_materials_mtoon.parametric_rim_color_factor = parametric_rim_color_factor
362
+ if rim_multiply_texture_backup is not None:
363
+ vrmc_materials_mtoon.rim_multiply_texture.restore(rim_multiply_texture_backup)
364
+ if rim_lighting_mix_factor is not None:
365
+ vrmc_materials_mtoon.rim_lighting_mix_factor = rim_lighting_mix_factor
366
+ if parametric_rim_fresnel_power_factor is not None:
367
+ vrmc_materials_mtoon.parametric_rim_fresnel_power_factor = (
368
+ parametric_rim_fresnel_power_factor
369
+ )
370
+ if parametric_rim_lift_factor is not None:
371
+ vrmc_materials_mtoon.parametric_rim_lift_factor = parametric_rim_lift_factor
372
+ if outline_width_mode is not None:
373
+ vrmc_materials_mtoon.outline_width_mode = outline_width_mode
374
+ if outline_width_factor is not None:
375
+ vrmc_materials_mtoon.outline_width_factor = outline_width_factor
376
+ if outline_width_multiply_texture_backup is not None:
377
+ vrmc_materials_mtoon.outline_width_multiply_texture.restore(
378
+ outline_width_multiply_texture_backup
379
+ )
380
+ if outline_color_factor is not None:
381
+ vrmc_materials_mtoon.outline_color_factor = outline_color_factor
382
+ if outline_lighting_mix_factor is not None:
383
+ vrmc_materials_mtoon.outline_lighting_mix_factor = outline_lighting_mix_factor
384
+ if uv_animation_mask_texture_backup is not None:
385
+ vrmc_materials_mtoon.uv_animation_mask_texture.restore(
386
+ uv_animation_mask_texture_backup
387
+ )
388
+ if uv_animation_scroll_x_speed_factor is not None:
389
+ vrmc_materials_mtoon.uv_animation_scroll_x_speed_factor = (
390
+ uv_animation_scroll_x_speed_factor
391
+ )
392
+ if uv_animation_scroll_y_speed_factor is not None:
393
+ vrmc_materials_mtoon.uv_animation_scroll_y_speed_factor = (
394
+ uv_animation_scroll_y_speed_factor
395
+ )
396
+ if uv_animation_rotation_speed_factor is not None:
397
+ vrmc_materials_mtoon.uv_animation_rotation_speed_factor = (
398
+ uv_animation_rotation_speed_factor
399
+ )
400
+
401
+ mtoon1.setup_drivers()
402
+ updated_addon_version = version.get_addon_version()
403
+ if tuple(mtoon1.addon_version) != updated_addon_version:
404
+ mtoon1.addon_version = updated_addon_version
405
+
406
+
407
+ def _backup_texture_info(texture_info: object) -> Optional[TextureInfoBackup]:
408
+ if not isinstance(texture_info, PropertyGroup):
409
+ return None
410
+
411
+ source: Optional[Image] = None
412
+ wrap_s = Mtoon1SamplerPropertyGroup.WRAP_DEFAULT.identifier
413
+ wrap_t = Mtoon1SamplerPropertyGroup.WRAP_DEFAULT.identifier
414
+ offset_x = 0.0
415
+ offset_y = 0.0
416
+ scale_x = 1.0
417
+ scale_y = 1.0
418
+
419
+ index = getattr(texture_info, "index", None)
420
+ if isinstance(index, PropertyGroup):
421
+ source_object = index.get("source")
422
+ if isinstance(source_object, Image):
423
+ source = source_object
424
+ sampler = getattr(index, "sampler", None)
425
+ if isinstance(sampler, PropertyGroup):
426
+ wrap_s_number = sampler.get("wrap_s")
427
+ if isinstance(wrap_s_number, int):
428
+ wrap_s = Mtoon1SamplerPropertyGroup.wrap_enum.value_to_identifier(
429
+ wrap_s_number,
430
+ wrap_s,
431
+ )
432
+ wrap_t_number = sampler.get("wrap_t")
433
+ if isinstance(wrap_t_number, int):
434
+ wrap_t = Mtoon1SamplerPropertyGroup.wrap_enum.value_to_identifier(
435
+ wrap_t_number,
436
+ wrap_t,
437
+ )
438
+
439
+ extensions = getattr(texture_info, "extensions", None)
440
+ if isinstance(extensions, PropertyGroup):
441
+ khr_texture_transform = getattr(extensions, "khr_texture_transform", None)
442
+ if isinstance(khr_texture_transform, PropertyGroup):
443
+ offset = convert.float2_or_none(khr_texture_transform.get("offset"))
444
+ if offset is not None:
445
+ offset_x, offset_y = offset
446
+ scale = convert.float2_or_none(khr_texture_transform.get("scale"))
447
+ if scale is not None:
448
+ scale_x, scale_y = scale
449
+
450
+ return TextureInfoBackup(
451
+ source=source,
452
+ mag_filter=None,
453
+ min_filter=None,
454
+ wrap_s=wrap_s,
455
+ wrap_t=wrap_t,
456
+ offset=(offset_x, offset_y),
457
+ scale=(scale_x, scale_y),
458
+ )
459
+
460
+
461
+ def _migrate_sampler_filter_node(material: Material) -> None:
462
+ node_tree = material.node_tree
463
+ if not node_tree:
464
+ return
465
+
466
+ mtoon1 = get_material_extension(material).mtoon1
467
+
468
+ for node_name, attrs in (
469
+ (
470
+ "Mtoon1BaseColorTexture.Image",
471
+ ("pbr_metallic_roughness", "base_color_texture"),
472
+ ),
473
+ ("Mtoon1EmissiveTexture.Image", ("emissive_texture",)),
474
+ ("Mtoon1NormalTexture.Image", ("normal_texture",)),
475
+ (
476
+ "Mtoon1ShadeMultiplyTexture.Image",
477
+ ("extensions", "vrmc_materials_mtoon", "shade_multiply_texture"),
478
+ ),
479
+ (
480
+ "Mtoon1ShadingShiftTexture.Image",
481
+ ("extensions", "vrmc_materials_mtoon", "shading_shift_texture"),
482
+ ),
483
+ (
484
+ "Mtoon1OutlineWidthMultiplyTexture.Image",
485
+ (
486
+ "extensions",
487
+ "vrmc_materials_mtoon",
488
+ "outline_width_multiply_texture",
489
+ ),
490
+ ),
491
+ (
492
+ "Mtoon1UvAnimationMaskTexture.Image",
493
+ ("extensions", "vrmc_materials_mtoon", "uv_animation_mask_texture"),
494
+ ),
495
+ (
496
+ "Mtoon1MatcapTexture.Image",
497
+ ("extensions", "vrmc_materials_mtoon", "matcap_texture"),
498
+ ),
499
+ (
500
+ "Mtoon1RimMultiplyTexture.Image",
501
+ ("extensions", "vrmc_materials_mtoon", "rim_multiply_texture"),
502
+ ),
503
+ ):
504
+ sampler = functools.reduce(
505
+ lambda prop, attr: getattr(prop, attr, None),
506
+ (*attrs, "index", "sampler"),
507
+ mtoon1,
508
+ )
509
+ if not isinstance(sampler, PropertyGroup):
510
+ continue
511
+
512
+ mag_filter = sampler.get("mag_filter")
513
+ if (
514
+ not isinstance(mag_filter, int)
515
+ or mag_filter not in Mtoon1SamplerPropertyGroup.mag_filter_enum.values()
516
+ ):
517
+ continue
518
+
519
+ node = node_tree.nodes.get(node_name)
520
+ if not isinstance(node, ShaderNodeTexImage):
521
+ continue
522
+
523
+ if (
524
+ mag_filter == GL_NEAREST
525
+ and node.interpolation != IMAGE_INTERPOLATION_CLOSEST
526
+ ):
527
+ node.interpolation = IMAGE_INTERPOLATION_CLOSEST
528
+ if (
529
+ mag_filter == GL_LINEAR
530
+ and node.interpolation not in GL_LINEAR_IMAGE_INTERPOLATIONS
531
+ ):
532
+ node.interpolation = IMAGE_INTERPOLATION_LINEAR
533
+
534
+
535
+ def clear_global_variables() -> None:
536
+ _state.material_blender_4_2_warning_shown = False