Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Duroure <julien.duroure@gmail.com>2019-05-07 10:59:14 +0300
committerJulien Duroure <julien.duroure@gmail.com>2019-05-07 10:59:14 +0300
commit447abeb9be69dcef24ea9c47bb2bde4488f9cb83 (patch)
tree1bb1318fb212e1371febde3e5410e1bc15efda86 /io_scene_gltf2
parentae8d56888683894676f924232b1f66c879c8a82c (diff)
glTF exporter: image texture: manage rough without metal, metal without rough
Diffstat (limited to 'io_scene_gltf2')
-rwxr-xr-xio_scene_gltf2/__init__.py2
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_image.py2
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py23
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py23
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py2
5 files changed, 40 insertions, 12 deletions
diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 1c8c5db0..6b14b8e9 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
bl_info = {
'name': 'glTF 2.0 format',
'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
- "version": (0, 9, 4),
+ "version": (0, 9, 5),
'blender': (2, 80, 0),
'location': 'File > Import-Export',
'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
index 85985e41..8550610f 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
@@ -168,7 +168,7 @@ def __get_image_data(sockets_or_slots, export_settings) -> gltf2_blender_image.E
composed_image[2] = image[source_channel]
elif socket.name == 'Roughness':
composed_image[1] = image[source_channel]
- elif socket.name == 'Occlusion' and len(sockets_or_slots) > 2:
+ elif socket.name == 'Occlusion' and len(sockets_or_slots) > 1 and sockets_or_slots[1] is not None:
composed_image[0] = image[source_channel]
else:
composed_image.update(image)
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 1242c08d..1eccdeeb 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
@@ -165,15 +165,28 @@ def __gather_orm_texture(blender_material, export_settings):
metallic_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Metallic")
roughness_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Roughness")
- if metallic_socket is None or roughness_socket is None\
- or not __has_image_node_from_socket(metallic_socket)\
- or not __has_image_node_from_socket(roughness_socket):
+
+ hasMetal = metallic_socket is not None and __has_image_node_from_socket(metallic_socket)
+ hasRough = roughness_socket is not None and __has_image_node_from_socket(roughness_socket)
+
+ if not hasMetal and not hasRough:
metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
if metallic_roughness is None or not __has_image_node_from_socket(metallic_roughness):
return None
- return (occlusion, metallic_roughness, metallic_roughness)
+ result = (occlusion, metallic_roughness)
+ elif not hasMetal:
+ result = (occlusion, roughness_socket)
+ elif not hasRough:
+ result = (occlusion, metallic_socket)
+ else:
+ result = (occlusion, roughness_socket, metallic_socket)
+
+ # Double-check this will past the filter in texture_info (otherwise there are different resolutions or other problems).
+ info = gltf2_blender_gather_texture_info.gather_texture_info(result, export_settings)
+ if info is None:
+ return None
- return (occlusion, roughness_socket, metallic_socket)
+ return result
def __gather_occlusion_texture(blender_material, orm_texture, export_settings):
if orm_texture is not None:
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
index ffbf9914..26ef0f0a 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
@@ -130,11 +130,18 @@ def __gather_metallic_roughness_texture(blender_material, orm_texture, export_se
metallic_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Metallic")
roughness_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Roughness")
- if metallic_socket is None and roughness_socket is None:
- metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "MetallicRoughness")
- if metallic_roughness is None:
- metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
+ hasMetal = metallic_socket is not None and __has_image_node_from_socket(metallic_socket)
+ hasRough = roughness_socket is not None and __has_image_node_from_socket(roughness_socket)
+
+ if not hasMetal and not hasRough:
+ metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
+ if metallic_roughness is None or not __has_image_node_from_socket(metallic_roughness):
+ return None
texture_input = (metallic_roughness,)
+ elif not hasMetal:
+ texture_input = (roughness_socket,)
+ elif not hasRough:
+ texture_input = (metallic_socket,)
else:
texture_input = (metallic_socket, roughness_socket)
@@ -149,3 +156,11 @@ def __gather_roughness_factor(blender_material, export_settings):
return roughness_socket.default_value
return None
+def __has_image_node_from_socket(socket):
+ result = gltf2_blender_search_node_tree.from_socket(
+ socket,
+ gltf2_blender_search_node_tree.FilterByType(bpy.types.ShaderNodeTexImage))
+ if not result:
+ return False
+ return True
+
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
index 06cfaaed..354ddf2c 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
@@ -57,7 +57,7 @@ def __filter_texture_info(blender_shader_sockets_or_texture_slots, export_settin
if any(any(a != b for a, b in zip(__get_tex_from_socket(elem).shader_node.image.size, resolution))
for elem in blender_shader_sockets_or_texture_slots):
def format_image(image_node):
- return "{} ({}x{})".format(image_node.name, image_node.image.size[0], image_node.image.size[1])
+ return "{} ({}x{})".format(image_node.image.name, image_node.image.size[0], image_node.image.size[1])
images = [format_image(__get_tex_from_socket(elem).shader_node) for elem in
blender_shader_sockets_or_texture_slots]