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-02-01 00:31:45 +0300
committerJulien Duroure <julien.duroure@gmail.com>2019-02-01 00:31:45 +0300
commitcd7ffdb8441f0a547fb0ab7169d361a3b441198d (patch)
tree16ee61f92206a81c2cb08ee8e3e20fba63848c81
parent429599d668d6f9b40208d7ad4d16b35ce0fe172d (diff)
glTF importer: fix emissive factor without emissive texture
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_map_emissive.py92
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_material.py4
2 files changed, 55 insertions, 41 deletions
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_map_emissive.py b/io_scene_gltf2/blender/imp/gltf2_blender_map_emissive.py
index 79cc93cd..1b56be2e 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_map_emissive.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_map_emissive.py
@@ -23,22 +23,23 @@ class BlenderEmissiveMap():
raise RuntimeError("%s should not be instantiated" % cls)
@staticmethod
- def create(gltf, material_idx, vertex_color):
+ def create(gltf, material_idx, vertex_color, factor_only=False):
"""Create emissive map."""
engine = bpy.context.scene.render.engine
if engine in ['CYCLES', 'BLENDER_EEVEE']:
- BlenderEmissiveMap.create_nodetree(gltf, material_idx, vertex_color)
+ BlenderEmissiveMap.create_nodetree(gltf, material_idx, vertex_color, factor_only)
- def create_nodetree(gltf, material_idx, vertex_color):
+ def create_nodetree(gltf, material_idx, vertex_color, factor_only=False):
"""Create node tree."""
pymaterial = gltf.data.materials[material_idx]
material = bpy.data.materials[pymaterial.blender_material[vertex_color]]
node_tree = material.node_tree
- BlenderTextureInfo.create(gltf, pymaterial.emissive_texture.index)
+ if factor_only is False:
+ BlenderTextureInfo.create(gltf, pymaterial.emissive_texture.index)
- # check if there is some emssive_factor on material
+ # check if there is some emissive_factor on material
if pymaterial.emissive_factor is None:
# Default in glTF specification is 0/0/0 --> No emission
pymaterial.emissive_factor = [0.0, 0.0, 0.0]
@@ -50,46 +51,55 @@ class BlenderEmissiveMap():
# add nodes
emit = node_tree.nodes.new('ShaderNodeEmission')
emit.location = 0, 1000
- if pymaterial.emissive_factor != [1.0, 1.0, 1.0]:
- mult_node = node_tree.nodes.new('ShaderNodeMixRGB')
- mult_node.blend_type = 'MULTIPLY'
- mult_node.inputs['Fac'].default_value = 1.0
- mult_node.location = -500, 1000
- mult_node.inputs['Color2'].default_value = [
- pymaterial.emissive_factor[0],
- pymaterial.emissive_factor[1],
- pymaterial.emissive_factor[2],
- 1.0,
- ]
- mapping = node_tree.nodes.new('ShaderNodeMapping')
- mapping.location = -1500, 1000
- uvmap = node_tree.nodes.new('ShaderNodeUVMap')
- uvmap.location = -2000, 1000
- if pymaterial.emissive_texture.tex_coord is not None:
- uvmap["gltf2_texcoord"] = pymaterial.emissive_texture.tex_coord # Set custom flag to retrieve TexCoord
- else:
- uvmap["gltf2_texcoord"] = 0 # TODO: set in precompute instead of here?
- text = node_tree.nodes.new('ShaderNodeTexImage')
- if gltf.data.images[
- gltf.data.textures[pymaterial.emissive_texture.index].source
- ].blender_image_name is not None:
- text.image = bpy.data.images[gltf.data.images[
+ if factor_only is False:
+ if pymaterial.emissive_factor != [1.0, 1.0, 1.0]:
+ mult_node = node_tree.nodes.new('ShaderNodeMixRGB')
+ mult_node.blend_type = 'MULTIPLY'
+ mult_node.inputs['Fac'].default_value = 1.0
+ mult_node.location = -500, 1000
+ mult_node.inputs['Color2'].default_value = [
+ pymaterial.emissive_factor[0],
+ pymaterial.emissive_factor[1],
+ pymaterial.emissive_factor[2],
+ 1.0,
+ ]
+ mapping = node_tree.nodes.new('ShaderNodeMapping')
+ mapping.location = -1500, 1000
+ uvmap = node_tree.nodes.new('ShaderNodeUVMap')
+ uvmap.location = -2000, 1000
+ if pymaterial.emissive_texture.tex_coord is not None:
+ uvmap["gltf2_texcoord"] = pymaterial.emissive_texture.tex_coord # Set custom flag to retrieve TexCoord
+ else:
+ uvmap["gltf2_texcoord"] = 0 # TODO: set in precompute instead of here?
+
+ text = node_tree.nodes.new('ShaderNodeTexImage')
+ if gltf.data.images[
gltf.data.textures[pymaterial.emissive_texture.index].source
- ].blender_image_name]
- text.label = 'EMISSIVE'
- text.location = -1000, 1000
- add = node_tree.nodes.new('ShaderNodeAddShader')
- add.location = 500, 500
+ ].blender_image_name is not None:
+ text.image = bpy.data.images[gltf.data.images[
+ gltf.data.textures[pymaterial.emissive_texture.index].source
+ ].blender_image_name]
+ text.label = 'EMISSIVE'
+ text.location = -1000, 1000
+
+ # create links
+ node_tree.links.new(mapping.inputs[0], uvmap.outputs[0])
+ node_tree.links.new(text.inputs[0], mapping.outputs[0])
+ if pymaterial.emissive_factor != [1.0, 1.0, 1.0]:
+ node_tree.links.new(mult_node.inputs[1], text.outputs[0])
+ node_tree.links.new(emit.inputs[0], mult_node.outputs[0])
+ else:
+ node_tree.links.new(emit.inputs[0], text.outputs[0])
- # create links
- node_tree.links.new(mapping.inputs[0], uvmap.outputs[0])
- node_tree.links.new(text.inputs[0], mapping.outputs[0])
- if pymaterial.emissive_factor != [1.0, 1.0, 1.0]:
- node_tree.links.new(mult_node.inputs[1], text.outputs[0])
- node_tree.links.new(emit.inputs[0], mult_node.outputs[0])
else:
- node_tree.links.new(emit.inputs[0], text.outputs[0])
+ emissive_color = pymaterial.emissive_factor
+ emissive_color.append(1.0) # add alpha
+ emit.inputs[0].default_value = emissive_color
+
+
+ add = node_tree.nodes.new('ShaderNodeAddShader')
+ add.location = 500, 500
# following links will modify PBR node tree
node_tree.links.new(add.inputs[0], emit.outputs[0])
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_material.py b/io_scene_gltf2/blender/imp/gltf2_blender_material.py
index fcd7c7d2..c3a28077 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_material.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_material.py
@@ -82,6 +82,10 @@ class BlenderMaterial():
# add emission map if needed
if pymaterial.emissive_texture is not None:
BlenderEmissiveMap.create(gltf, material_idx, vertex_color)
+ elif pymaterial.emissive_factor is not None:
+ # add emissive factor only if there is not emissive texture
+ BlenderEmissiveMap.create(gltf, material_idx, vertex_color, factor_only=True)
+
# add normal map if needed
if pymaterial.normal_texture is not None: