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:
Diffstat (limited to 'io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py')
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py72
1 files changed, 36 insertions, 36 deletions
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 30975a3f..6c4acb82 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
@@ -19,6 +19,8 @@ from io_scene_gltf2.io.com import gltf2_io
from io_scene_gltf2.blender.exp import gltf2_blender_gather_texture
from io_scene_gltf2.blender.exp import gltf2_blender_search_node_tree
from io_scene_gltf2.blender.exp import gltf2_blender_get
+from io_scene_gltf2.blender.exp.gltf2_blender_get import previous_node
+from io_scene_gltf2.blender.exp.gltf2_blender_gather_sampler import detect_manual_uv_wrapping
from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions
@@ -47,11 +49,13 @@ def __gather_texture_info_helper(
if not __filter_texture_info(primary_socket, blender_shader_sockets, export_settings):
return None
+ tex_transform, tex_coord = __gather_texture_transform_and_tex_coord(primary_socket, export_settings)
+
fields = {
- 'extensions': __gather_extensions(primary_socket, export_settings),
+ 'extensions': __gather_extensions(tex_transform, export_settings),
'extras': __gather_extras(blender_shader_sockets, export_settings),
'index': __gather_index(blender_shader_sockets, export_settings),
- 'tex_coord': __gather_tex_coord(primary_socket, export_settings),
+ 'tex_coord': tex_coord,
}
if kind == 'DEFAULT':
@@ -89,17 +93,9 @@ def __filter_texture_info(primary_socket, blender_shader_sockets, export_setting
return True
-def __gather_extensions(primary_socket, export_settings):
- if not hasattr(primary_socket, 'links'):
- return None
-
- texture_node = __get_tex_from_socket(primary_socket).shader_node
- if texture_node is None:
- return None
- texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
+def __gather_extensions(texture_transform, export_settings):
if texture_transform is None:
return None
-
extension = Extension("KHR_texture_transform", texture_transform)
return {"KHR_texture_transform": extension}
@@ -144,33 +140,37 @@ def __gather_index(blender_shader_sockets, export_settings):
return gltf2_blender_gather_texture.gather_texture(blender_shader_sockets, export_settings)
-def __gather_tex_coord(primary_socket, export_settings):
+def __gather_texture_transform_and_tex_coord(primary_socket, export_settings):
+ # We're expecting
+ #
+ # [UV Map] => [Mapping] => [UV Wrapping] => [Texture Node] => ... => primary_socket
+ #
+ # The [UV Wrapping] is for wrap modes like MIRROR that use nodes,
+ # [Mapping] is for KHR_texture_transform, and [UV Map] is for texCoord.
blender_shader_node = __get_tex_from_socket(primary_socket).shader_node
- if len(blender_shader_node.inputs['Vector'].links) == 0:
- return 0
-
- input_node = blender_shader_node.inputs['Vector'].links[0].from_node
-
- if isinstance(input_node, bpy.types.ShaderNodeMapping):
-
- if len(input_node.inputs['Vector'].links) == 0:
- return 0
-
- input_node = input_node.inputs['Vector'].links[0].from_node
-
- if not isinstance(input_node, bpy.types.ShaderNodeUVMap):
- return 0
-
- if input_node.uv_map == '':
- return 0
-
- # Try to gather map index.
- for blender_mesh in bpy.data.meshes:
- texCoordIndex = blender_mesh.uv_layers.find(input_node.uv_map)
- if texCoordIndex >= 0:
- return texCoordIndex
- return 0
+ # Skip over UV wrapping stuff (it goes in the sampler)
+ result = detect_manual_uv_wrapping(blender_shader_node)
+ if result:
+ node = previous_node(result['next_socket'])
+ else:
+ node = previous_node(blender_shader_node.inputs['Vector'])
+
+ texture_transform = None
+ if node and node.type == 'MAPPING':
+ texture_transform = gltf2_blender_get.get_texture_transform_from_mapping_node(node)
+ node = previous_node(node.inputs['Vector'])
+
+ texcoord_idx = 0
+ if node and node.type == 'UVMAP' and node.uv_map:
+ # Try to gather map index.
+ for blender_mesh in bpy.data.meshes:
+ i = blender_mesh.uv_layers.find(node.uv_map)
+ if i >= 0:
+ texcoord_idx = i
+ break
+
+ return texture_transform, texcoord_idx or None
def __get_tex_from_socket(socket):