diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2018-06-15 12:03:29 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-06-15 23:16:06 +0300 |
commit | 799779d432309e518922d23e3a1d1b5baaece71d (patch) | |
tree | df190f684ce9b86f412913bc0dc4b8dd07491e57 /intern/cycles/blender | |
parent | 2b9edbc98becb540f1f907b7c31d7971b1603079 (diff) |
Cycles: change Ambient Occlusion shader to output colors.
This means the shader can now be used for procedural texturing. New
settings on the node are Samples, Inside, Local Only and Distance.
Original patch by Lukas with further changes by Brecht.
Differential Revision: https://developer.blender.org/D3479
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r-- | intern/cycles/blender/addon/version_update.py | 53 | ||||
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 7 |
2 files changed, 51 insertions, 9 deletions
diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py index dc28bc647b5..922ea9d9d7f 100644 --- a/intern/cycles/blender/addon/version_update.py +++ b/intern/cycles/blender/addon/version_update.py @@ -271,6 +271,40 @@ def custom_bake_remap(scene): scene.render.bake.use_pass_indirect = False +def ambient_occlusion_node_relink(material, nodetree, traversed): + if nodetree in traversed: + return + traversed.add(nodetree) + + for node in nodetree.nodes: + if node.bl_idname == 'ShaderNodeAmbientOcclusion': + node.samples = 1 + node.only_local = False + node.inputs['Distance'].default_value = 0.0 + elif node.bl_idname == 'ShaderNodeGroup': + ambient_occlusion_node_relink(material, node.node_tree, traversed) + + # Gather links to replace + ao_links = [] + for link in nodetree.links: + if link.from_node.bl_idname == 'ShaderNodeAmbientOcclusion': + ao_links.append(link) + + # Replace links + for link in ao_links: + from_node = link.from_node + to_socket = link.to_socket + + nodetree.links.remove(link) + nodetree.links.new(from_node.outputs['Color'], to_socket) + +def ambient_occlusion_nodes_relink(): + traversed = set() + for material in bpy.data.materials: + if check_is_new_shading_material(material): + ambient_occlusion_node_relink(material, material.node_tree, traversed) + + @persistent def do_versions(self): if bpy.context.user_preferences.version <= (2, 78, 1): @@ -428,11 +462,14 @@ def do_versions(self): # Switch to squared roughness convention square_roughness_nodes_insert() - for world in bpy.data.worlds: - cworld = world.cycles - # World MIS - if not cworld.is_property_set("sampling_method"): - if cworld.get("sample_as_light", False): - cworld.sampling_method = 'MANUAL' - else: - cworld.sampling_method = 'NONE' + if bpy.data.version <= (2, 79, 4): + for world in bpy.data.worlds: + cworld = world.cycles + # World MIS + if not cworld.is_property_set("sampling_method"): + if cworld.get("sample_as_light", False): + cworld.sampling_method = 'MANUAL' + else: + cworld.sampling_method = 'NONE' + + ambient_occlusion_nodes_relink() diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 9896dd1d94f..89612b74c39 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -558,7 +558,12 @@ static ShaderNode *add_node(Scene *scene, node = new EmissionNode(); } else if(b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) { - node = new AmbientOcclusionNode(); + BL::ShaderNodeAmbientOcclusion b_ao_node(b_node); + AmbientOcclusionNode *ao = new AmbientOcclusionNode(); + ao->samples = b_ao_node.samples(); + ao->inside = b_ao_node.inside(); + ao->only_local = b_ao_node.only_local(); + node = ao; } else if(b_node.is_a(&RNA_ShaderNodeVolumeScatter)) { node = new ScatterVolumeNode(); |