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_materials_volume.py')
-rw-r--r--io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_volume.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_volume.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_volume.py
new file mode 100644
index 00000000..8a69e3f6
--- /dev/null
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_volume.py
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2018-2022 The glTF-Blender-IO authors.
+
+import bpy
+from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
+from io_scene_gltf2.blender.exp import gltf2_blender_get
+from io_scene_gltf2.blender.exp import gltf2_blender_gather_texture_info
+
+
+def export_volume(blender_material, export_settings):
+ # Implementation based on https://github.com/KhronosGroup/glTF-Blender-IO/issues/1454#issuecomment-928319444
+
+ # If no transmission --> No volume
+ transmission_enabled = False
+ transmission_socket = gltf2_blender_get.get_socket(blender_material, 'Transmission')
+ if isinstance(transmission_socket, bpy.types.NodeSocket) and not transmission_socket.is_linked:
+ transmission_enabled = transmission_socket.default_value > 0
+ elif gltf2_blender_get.has_image_node_from_socket(transmission_socket):
+ transmission_enabled = True
+
+ if transmission_enabled is False:
+ return None, None
+
+ volume_extension = {}
+ has_thickness_texture = False
+ thickness_slots = ()
+
+ thicknesss_socket = gltf2_blender_get.get_socket_old(blender_material, 'Thickness')
+ if thicknesss_socket is None:
+ # If no thickness (here because there is no glTF Material Output node), no volume extension export
+ return None, None
+
+ density_socket = gltf2_blender_get.get_socket(blender_material, 'Density', volume=True)
+ attenuation_color_socket = gltf2_blender_get.get_socket(blender_material, 'Color', volume=True)
+ # Even if density or attenuation are not set, we export volume extension
+
+ if isinstance(attenuation_color_socket, bpy.types.NodeSocket):
+ rgb = gltf2_blender_get.get_const_from_default_value_socket(attenuation_color_socket, kind='RGB')
+ volume_extension['attenuationColor'] = rgb
+
+ if isinstance(density_socket, bpy.types.NodeSocket):
+ density = gltf2_blender_get.get_const_from_default_value_socket(density_socket, kind='VALUE')
+ volume_extension['attenuationDistance'] = 1.0 / density if density != 0 else None # infinity (Using None as glTF default)
+
+
+ if isinstance(thicknesss_socket, bpy.types.NodeSocket) and not thicknesss_socket.is_linked:
+ val = thicknesss_socket.default_value
+ if val == 0.0:
+ # If no thickness, no volume extension export
+ return None, None
+ volume_extension['thicknessFactor'] = val
+ elif gltf2_blender_get.has_image_node_from_socket(thicknesss_socket):
+ fac = gltf2_blender_get.get_factor_from_socket(thicknesss_socket, kind='VALUE')
+ # default value in glTF is 0.0, but if there is a texture without factor, use 1
+ volume_extension['thicknessFactor'] = fac if fac != None else 1.0
+ has_thickness_texture = True
+
+ # Pack thickness channel (R).
+ if has_thickness_texture:
+ thickness_slots = (thicknesss_socket,)
+
+ use_actives_uvmaps = []
+
+ if len(thickness_slots) > 0:
+ combined_texture, use_active_uvmap, _ = gltf2_blender_gather_texture_info.gather_texture_info(
+ thicknesss_socket,
+ thickness_slots,
+ export_settings,
+ )
+ if has_thickness_texture:
+ volume_extension['thicknessTexture'] = combined_texture
+ if use_active_uvmap:
+ use_actives_uvmaps.append("thicknessTexture")
+
+ return Extension('KHR_materials_volume', volume_extension, False), use_actives_uvmaps \ No newline at end of file