[Bf-extensions-cvs] [3a299965] master: glTF exporter: Manage active UVMap correclty, when there is no UVMap used in node tree
Julien Duroure
noreply at git.blender.org
Sun Mar 13 11:44:31 CET 2022
Commit: 3a299965833c65ae76a324a5540bcf5b31a3b669
Author: Julien Duroure
Date: Sun Mar 13 11:44:02 2022 +0100
Branches: master
https://developer.blender.org/rBA3a299965833c65ae76a324a5540bcf5b31a3b669
glTF exporter: Manage active UVMap correclty, when there is no UVMap used in node tree
===================================================================
M io_scene_gltf2/__init__.py
M io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
M io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
M io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py
M io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py
M io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
===================================================================
diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index dcef27b1..fd0687b9 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -4,7 +4,7 @@
bl_info = {
'name': 'glTF 2.0 format',
'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
- "version": (3, 2, 14),
+ "version": (3, 2, 15),
'blender': (3, 1, 0),
'location': 'File > Import-Export',
'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
index 04129996..402e06fa 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2018-2021 The glTF-Blender-IO authors.
+from copy import deepcopy
import bpy
from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached, cached_by_key
@@ -17,14 +18,17 @@ from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extension
from io_scene_gltf2.io.com.gltf2_io_debug import print_console
@cached
-def get_material_cache_key(blender_material, export_settings):
+def get_material_cache_key(blender_material, active_uvmap_index, export_settings):
# Use id of material
# Do not use bpy.types that can be unhashable
# Do not use material name, that can be not unique (when linked)
- return ((id(blender_material),))
+ return (
+ (id(blender_material),),
+ (active_uvmap_index,)
+ )
@cached_by_key(key=get_material_cache_key)
-def gather_material(blender_material, export_settings):
+def gather_material(blender_material, active_uvmap_index, export_settings):
"""
Gather the material used by the blender primitive.
@@ -35,26 +39,79 @@ def gather_material(blender_material, export_settings):
if not __filter_material(blender_material, export_settings):
return None
- mat_unlit = __gather_material_unlit(blender_material, export_settings)
+ mat_unlit = __gather_material_unlit(blender_material, active_uvmap_index, export_settings)
if mat_unlit is not None:
return mat_unlit
orm_texture = __gather_orm_texture(blender_material, export_settings)
- material = gltf2_io.Material(
+ emissive_texture, uvmap_actives_emissive_texture = __gather_emissive_texture(blender_material, export_settings)
+ extensions, uvmap_actives_extensions = __gather_extensions(blender_material, export_settings)
+ normal_texture, uvmap_actives_normal_texture = __gather_normal_texture(blender_material, export_settings)
+ occlusion_texture, uvmap_actives_occlusion_texture = __gather_occlusion_texture(blender_material, orm_texture, export_settings)
+ pbr_metallic_roughness, uvmap_actives_pbr_metallic_roughness = __gather_pbr_metallic_roughness(blender_material, orm_texture, export_settings)
+
+ base_material = gltf2_io.Material(
alpha_cutoff=__gather_alpha_cutoff(blender_material, export_settings),
alpha_mode=__gather_alpha_mode(blender_material, export_settings),
double_sided=__gather_double_sided(blender_material, export_settings),
emissive_factor=__gather_emissive_factor(blender_material, export_settings),
- emissive_texture=__gather_emissive_texture(blender_material, export_settings),
- extensions=__gather_extensions(blender_material, export_settings),
+ emissive_texture=emissive_texture,
+ extensions=extensions,
extras=__gather_extras(blender_material, export_settings),
name=__gather_name(blender_material, export_settings),
- normal_texture=__gather_normal_texture(blender_material, export_settings),
- occlusion_texture=__gather_occlusion_texture(blender_material, orm_texture, export_settings),
- pbr_metallic_roughness=__gather_pbr_metallic_roughness(blender_material, orm_texture, export_settings)
+ normal_texture=normal_texture,
+ occlusion_texture=occlusion_texture,
+ pbr_metallic_roughness=pbr_metallic_roughness
)
+
+ # merge all uvmap_actives
+ uvmap_actives = []
+ if uvmap_actives_emissive_texture:
+ uvmap_actives.extend(uvmap_actives_emissive_texture)
+ if uvmap_actives_extensions:
+ uvmap_actives.extend(uvmap_actives_extensions)
+ if uvmap_actives_normal_texture:
+ uvmap_actives.extend(uvmap_actives_normal_texture)
+ if uvmap_actives_occlusion_texture:
+ uvmap_actives.extend(uvmap_actives_occlusion_texture)
+ if uvmap_actives_pbr_metallic_roughness:
+ uvmap_actives.extend(uvmap_actives_pbr_metallic_roughness)
+
+ # Because some part of material are shared (eg pbr_metallic_roughness), we must copy the material
+ # Texture must be shared, but not TextureInfo
+ material = deepcopy(base_material)
+ __get_new_material_texture_shared(base_material, material)
+
+ active_uvmap_index = active_uvmap_index if active_uvmap_index != 0 else None
+
+ for tex in uvmap_actives:
+ if tex == "emissiveTexture":
+ material.emissive_texture.tex_coord = active_uvmap_index
+ elif tex == "normalTexture":
+ material.normal_texture.tex_coord = active_uvmap_index
+ elif tex == "occlusionTexture":
+ material.occlusion_texture.tex_coord = active_uvmap_index
+ elif tex == "baseColorTexture":
+ material.pbr_metallic_roughness.base_color_texture.tex_coord = active_uvmap_index
+ elif tex == "metallicRoughnessTexture":
+ material.pbr_metallic_roughness.metallic_roughness_texture.tex_coord = active_uvmap_index
+ elif tex == "clearcoatTexture":
+ material.extensions["KHR_materials_clearcoat"].extension['clearcoatTexture'].tex_coord = active_uvmap_index
+ elif tex == "clearcoatRoughnessTexture":
+ material.extensions["KHR_materials_clearcoat"].extension['clearcoatRoughnessTexture'].tex_coord = active_uvmap_index
+ elif tex == "clearcoatNormalTexture": #TODO not tested yet
+ material.extensions["KHR_materials_clearcoat"].extension['clearcoatNormalTexture'].tex_coord = active_uvmap_index
+ elif tex == "transmissionTexture": #TODO not tested yet
+ material.extensions["KHR_materials_transmission"].extension['transmissionTexture'].tex_coord = active_uvmap_index
+
+ # If material is not using active UVMap, we need to return the same material,
+ # Even if multiples meshes are using different active UVMap
+ if len(uvmap_actives) == 0 and active_uvmap_index != -1:
+ material = gather_material(blender_material, -1, export_settings)
+
+
# If emissive is set, from an emissive node (not PBR)
# We need to set manually default values for
# pbr_metallic_roughness.baseColor
@@ -80,6 +137,25 @@ def gather_material(blender_material, export_settings):
# 'material'] + ' not found. Please assign glTF 2.0 material or enable Blinn-Phong material in export.')
+def __get_new_material_texture_shared(base, node):
+ if node is None:
+ return
+ if callable(node) is True:
+ return
+ if node.__str__().startswith('__'):
+ return
+ if type(node) in [gltf2_io.TextureInfo, gltf2_io.MaterialOcclusionTextureInfoClass, gltf2_io.MaterialNormalTextureInfoClass]:
+ node.index = base.index
+ else:
+ if hasattr(node, '__dict__'):
+ for attr, value in node.__dict__.items():
+ __get_new_material_texture_shared(getattr(base, attr), value)
+ else:
+ # For extensions (on a dict)
+ if type(node).__name__ == 'dict':
+ for i in node.keys():
+ __get_new_material_texture_shared(base[i], node[i])
+
def __filter_material(blender_material, export_settings):
return export_settings[gltf2_blender_export_keys.MATERIALS]
@@ -155,17 +231,20 @@ def __gather_emissive_texture(blender_material, export_settings):
emissive = gltf2_blender_get.get_socket(blender_material, "Emissive")
if emissive is None:
emissive = gltf2_blender_get.get_socket_old(blender_material, "Emissive")
- return gltf2_blender_gather_texture_info.gather_texture_info(emissive, (emissive,), export_settings)
+ emissive_texture, use_actives_uvmap_emissive = gltf2_blender_gather_texture_info.gather_texture_info(emissive, (emissive,), export_settings)
+ return emissive_texture, ["emissiveTexture"] if use_actives_uvmap_emissive else None
def __gather_extensions(blender_material, export_settings):
extensions = {}
# KHR_materials_clearcoat
+ actives_uvmaps = []
- clearcoat_extension = __gather_clearcoat_extension(blender_material, export_settings)
+ clearcoat_extension, use_actives_uvmap_clearcoat = __gather_clearcoat_extension(blender_material, export_settings)
if clearcoat_extension:
extensions["KHR_materials_clearcoat"] = clearcoat_extension
+ actives_uvmaps.extend(use_actives_uvmap_clearcoat)
# KHR_materials_transmission
@@ -173,7 +252,7 @@ def __gather_extensions(blender_material, export_settings):
if transmission_extension:
extensions["KHR_materials_transmission"] = transmission_extension
- return extensions if extensions else None
+ return extensions, actives_uvmaps if extensions else None
def __gather_extras(blender_material, export_settings):
@@ -190,10 +269,11 @@ def __gather_normal_texture(blender_material, export_settings):
normal = gltf2_blender_get.get_socket(blender_material, "Normal")
if normal is None:
normal = gltf2_blender_get.get_socket_old(blender_material, "Normal")
- return gltf2_blender_gather_texture_info.gather_material_normal_texture_info_class(
+ normal_texture, use_active_uvmap_normal = gltf2_blender_gather_texture_info.gather_material_normal_texture_info_class(
normal,
(normal,),
export_settings)
+ return normal_texture, ["normalTexture"] if use_a
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list