[Bf-extensions-cvs] [c90525d7] blender2.8: glTF exporter: Manage texture transforms

Julien Duroure noreply at git.blender.org
Fri Dec 7 20:09:41 CET 2018


Commit: c90525d7bd77b8d5a5375dc7a031228dc72f90ba
Author: Julien Duroure
Date:   Fri Dec 7 20:08:53 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBAc90525d7bd77b8d5a5375dc7a031228dc72f90ba

glTF exporter: Manage texture transforms

===================================================================

M	io_scene_gltf2/blender/exp/gltf2_blender_gather_material_normal_texture_info_class.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
M	io_scene_gltf2/blender/exp/gltf2_blender_get.py

===================================================================

diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_material_normal_texture_info_class.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_material_normal_texture_info_class.py
index 4599c7dc..3d78a478 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_material_normal_texture_info_class.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_material_normal_texture_info_class.py
@@ -18,6 +18,9 @@ from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached
 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_export_keys
+from io_scene_gltf2.blender.exp import gltf2_blender_get
+from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
 
 
 @cached
@@ -51,7 +54,22 @@ def __filter_texture_info(blender_shader_sockets_or_texture_slots, export_settin
 
 
 def __gather_extensions(blender_shader_sockets_or_texture_slots, export_settings):
-    return None
+    if not export_settings[gltf2_blender_export_keys.TEXTURE_TRANSFORM]:
+        return None
+
+    normal_map_node = blender_shader_sockets_or_texture_slots[0].links[0].from_node
+    if not isinstance(normal_map_node, bpy.types.ShaderNodeNormalMap):
+        return None
+
+    texture_socket = normal_map_node.inputs["Color"]
+    if len(texture_socket.links) == 0:
+        return None
+
+    texture_node = texture_socket.links[0].from_node
+    texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
+
+    extension = Extension("KHR_texture_transform", texture_transform)
+    return {"KHR_texture_transform": extension}
 
 
 def __gather_extras(blender_shader_sockets_or_texture_slots, export_settings):
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 225e686b..600bf81e 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
@@ -18,6 +18,9 @@ from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached
 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_export_keys
+from io_scene_gltf2.blender.exp import gltf2_blender_get
+from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
 
 
 @cached
@@ -50,7 +53,16 @@ def __filter_texture_info(blender_shader_sockets_or_texture_slots, export_settin
 
 
 def __gather_extensions(blender_shader_sockets_or_texture_slots, export_settings):
-    return None
+    if not export_settings[gltf2_blender_export_keys.TEXTURE_TRANSFORM]:
+        return None
+
+    texture_node = blender_shader_sockets_or_texture_slots[0].links[0].from_node
+    texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
+    if texture_transform is None:
+        return None
+
+    extension = Extension("KHR_texture_transform", texture_transform)
+    return {"KHR_texture_transform": extension}
 
 
 def __gather_extras(blender_shader_sockets_or_texture_slots, export_settings):
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_get.py b/io_scene_gltf2/blender/exp/gltf2_blender_get.py
index 03078225..6d025980 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_get.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_get.py
@@ -322,6 +322,38 @@ def get_texcoord_index_from_shader_node(glTF, name, shader_node):
     return 0
 
 
+def get_texture_transform_from_texture_node(texture_node):
+    if not isinstance(texture_node, bpy.types.ShaderNodeTexImage):
+        return None
+
+    mapping_socket = texture_node.inputs["Vector"]
+    if len(mapping_socket.links) == 0:
+        return None
+
+    mapping_node = mapping_socket.links[0].from_node
+    if not isinstance(mapping_node, bpy.types.ShaderNodeMapping):
+        return None
+
+    texture_transform = {}
+    if mapping_node.vector_type == 'TEXTURE':
+        texture_transform["offset"] = [-mapping_node.translation[0], -mapping_node.translation[1]]
+        texture_transform["rotation"] = -mapping_node.rotation[2]
+        texture_transform["scale"] = [1.0 / mapping_node.scale[0], 1.0 / mapping_node.scale[1]]
+    elif mapping_node.vector_type == 'POINT':
+        texture_transform["offset"] = [mapping_node.translation[0], mapping_node.translation[1]]
+        texture_transform["rotation"] = mapping_node.rotation[2]
+        texture_transform["scale"] = [mapping_node.scale[0], mapping_node.scale[1]]
+
+    if all([component == 0 for component in texture_transform["offset"]]):
+        del(texture_transform["offset"])
+    if all([component == 1 for component in texture_transform["scale"]]):
+        del(texture_transform["scale"])
+    if texture_transform["rotation"] == 0:
+        del(texture_transform["rotation"])
+
+    return texture_transform
+
+
 def get_image_uri(export_settings, blender_image):
     """Return the final URI depending on a file path."""
     file_format = get_image_format(export_settings, blender_image)



More information about the Bf-extensions-cvs mailing list