diff options
Diffstat (limited to 'release/scripts/startup/bl_operators/object_quick_effects.py')
-rw-r--r-- | release/scripts/startup/bl_operators/object_quick_effects.py | 229 |
1 files changed, 177 insertions, 52 deletions
diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index 556d34bb0ac..32688299b76 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -289,6 +289,10 @@ def obj_bb_minmax(obj, min_co, max_co): max_co[0] = max(bb_vec[0], max_co[0]) max_co[1] = max(bb_vec[1], max_co[1]) max_co[2] = max(bb_vec[2], max_co[2]) + + +def grid_location(x, y): + return (x * 200, y * 150) class QuickSmoke(Operator): @@ -298,10 +302,11 @@ class QuickSmoke(Operator): style = EnumProperty( name="Smoke Style", - items=(('STREAM', "Stream", ""), + items=(('SMOKE', "Smoke", ""), ('FIRE', "Fire", ""), + ('BOTH', "Smoke + Fire", ""), ), - default='STREAM', + default='SMOKE', ) show_flows = BoolProperty( @@ -327,8 +332,8 @@ class QuickSmoke(Operator): bpy.ops.object.modifier_add(fake_context, type='SMOKE') obj.modifiers[-1].smoke_type = 'FLOW' - if self.style == 'FIRE': - obj.modifiers[-1].flow_settings.smoke_flow_type = 'FIRE' + # set type + obj.modifiers[-1].flow_settings.smoke_flow_type = self.style if not self.show_flows: obj.draw_type = 'WIRE' @@ -348,57 +353,177 @@ class QuickSmoke(Operator): # setup smoke domain bpy.ops.object.modifier_add(type='SMOKE') obj.modifiers[-1].smoke_type = 'DOMAIN' - if self.style == 'FIRE': + if self.style == 'FIRE' or self.style == 'BOTH': obj.modifiers[-1].domain_settings.use_high_resolution = True - # create a volume material with a voxel data texture for the domain - bpy.ops.object.material_slot_add() + # Setup material + + # Cycles + if context.scene.render.use_shading_nodes: + bpy.ops.object.material_slot_add() + + mat = bpy.data.materials.new("Smoke Domain Material") + obj.material_slots[0].material = mat + + # Make sure we use nodes + mat.use_nodes = True + + # Set node variables and clear the default nodes + tree = mat.node_tree + nodes = tree.nodes + links = tree.links + + nodes.clear() + + # Create shader nodes + + # Material output + node_out = nodes.new(type='ShaderNodeOutputMaterial') + node_out.location = grid_location(6, 1) + + # Add shader 1 + node_add_shader_1 = nodes.new(type='ShaderNodeAddShader') + node_add_shader_1.location = grid_location(5, 1) + links.new(node_add_shader_1.outputs["Shader"], + node_out.inputs["Volume"]) + + # Smoke + + # Add shader 2 + node_add_shader_2 = nodes.new(type='ShaderNodeAddShader') + node_add_shader_2.location = grid_location(4, 2) + links.new(node_add_shader_2.outputs["Shader"], + node_add_shader_1.inputs[0]) + + # Volume scatter + node_scatter = nodes.new(type='ShaderNodeVolumeScatter') + node_scatter.location = grid_location(3, 3) + links.new(node_scatter.outputs["Volume"], + node_add_shader_2.inputs[0]) + + # Volume absorption + node_absorption = nodes.new(type='ShaderNodeVolumeAbsorption') + node_absorption.location = grid_location(3, 2) + links.new(node_absorption.outputs["Volume"], + node_add_shader_2.inputs[1]) + + # Density Multiplier + node_densmult = nodes.new(type='ShaderNodeMath') + node_densmult.location = grid_location(2, 2) + node_densmult.operation = 'MULTIPLY' + node_densmult.inputs[1].default_value = 5.0 + links.new(node_densmult.outputs["Value"], + node_scatter.inputs["Density"]) + links.new(node_densmult.outputs["Value"], + node_absorption.inputs["Density"]) + + # Attribute "density" + node_attrib_density = nodes.new(type='ShaderNodeAttribute') + node_attrib_density.attribute_name = "density" + node_attrib_density.location = grid_location(1, 2) + links.new(node_attrib_density.outputs["Fac"], + node_densmult.inputs[0]) + + # Attribute "color" + node_attrib_color = nodes.new(type='ShaderNodeAttribute') + node_attrib_color.attribute_name = "color" + node_attrib_color.location = grid_location(2, 3) + links.new(node_attrib_color.outputs["Color"], + node_scatter.inputs["Color"]) + links.new(node_attrib_color.outputs["Color"], + node_absorption.inputs["Color"]) + + # Fire + + # Emission + node_emission = nodes.new(type='ShaderNodeEmission') + node_emission.inputs["Color"].default_value = (0.8, 0.1, 0.01, 1.0) + node_emission.location = grid_location(4, 1) + links.new(node_emission.outputs["Emission"], + node_add_shader_1.inputs[1]) + + # Flame strength multiplier + node_flame_strength_mult = nodes.new(type='ShaderNodeMath') + node_flame_strength_mult.location = grid_location(3, 1) + node_flame_strength_mult.operation = 'MULTIPLY' + node_flame_strength_mult.inputs[1].default_value = 2.5 + links.new(node_flame_strength_mult.outputs["Value"], + node_emission.inputs["Strength"]) + + # Color ramp Flame + node_flame_ramp = nodes.new(type='ShaderNodeValToRGB') + node_flame_ramp.location = grid_location(1, 1) + ramp = node_flame_ramp.color_ramp + ramp.interpolation = 'EASE' + + # orange + elem = ramp.elements.new(0.5) + elem.color = (1.0, 0.128, 0.0, 1.0) + + # yellow + elem = ramp.elements.new(0.9) + elem.color = (0.9, 0.6, 0.1, 1.0) + + links.new(node_flame_ramp.outputs["Color"], + node_emission.inputs["Color"]) + + # Attribute "flame" + node_attrib_flame = nodes.new(type='ShaderNodeAttribute') + node_attrib_flame.attribute_name = "flame" + node_attrib_flame.location = grid_location(0, 1) + links.new(node_attrib_flame.outputs["Fac"], + node_flame_ramp.inputs["Fac"]) + links.new(node_attrib_flame.outputs["Fac"], + node_flame_strength_mult.inputs[0]) + + # Blender Internal + else: + # create a volume material with a voxel data texture for the domain + bpy.ops.object.material_slot_add() + + mat = bpy.data.materials.new("Smoke Domain Material") + obj.material_slots[0].material = mat + mat.type = 'VOLUME' + mat.volume.density = 0 + mat.volume.density_scale = 5 + mat.volume.step_size = 0.1 + + tex = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA') + tex.voxel_data.domain_object = obj + tex.voxel_data.interpolation = 'TRICUBIC_BSPLINE' + + tex_slot = mat.texture_slots.add() + tex_slot.texture = tex + tex_slot.texture_coords = 'ORCO' + tex_slot.use_map_color_emission = False + tex_slot.use_map_density = True + tex_slot.use_map_color_reflection = True + + # for fire add a second texture for flame emission + mat.volume.emission_color = Vector((0.0, 0.0, 0.0)) + tex = bpy.data.textures.new("Flame", 'VOXEL_DATA') + tex.voxel_data.domain_object = obj + tex.voxel_data.smoke_data_type = 'SMOKEFLAME' + tex.voxel_data.interpolation = 'TRICUBIC_BSPLINE' + tex.use_color_ramp = True - mat = bpy.data.materials.new("Smoke Domain Material") - obj.material_slots[0].material = mat - mat.type = 'VOLUME' - mat.volume.density = 0 - mat.volume.density_scale = 5 - mat.volume.step_size = 0.1 - - tex = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA') - tex.voxel_data.domain_object = obj - tex.voxel_data.interpolation = 'TRICUBIC_BSPLINE' - - tex_slot = mat.texture_slots.add() - tex_slot.texture = tex - tex_slot.use_map_color_emission = False - tex_slot.use_map_density = True - tex_slot.use_map_color_reflection = True - - # for fire add a second texture for flame emission - mat.volume.emission_color = Vector((0.0, 0.0, 0.0)) - tex = bpy.data.textures.new("Flame", 'VOXEL_DATA') - tex.voxel_data.domain_object = obj - tex.voxel_data.smoke_data_type = 'SMOKEFLAME' - tex.voxel_data.interpolation = 'TRICUBIC_BSPLINE' - tex.use_color_ramp = True - - tex_slot = mat.texture_slots.add() - tex_slot.texture = tex - - # add color ramp for flame color - ramp = tex.color_ramp - # dark orange - elem = ramp.elements.new(0.333) - elem.color[0] = 0.2 - elem.color[1] = 0.03 - elem.color[2] = 0 - elem.color[3] = 1 - # yellow glow - elem = ramp.elements.new(0.666) - elem.color[0] = elem.color[3] = 1 - elem.color[1] = 0.65 - elem.color[2] = 0.25 - - mat.texture_slots[1].use_map_density = True - mat.texture_slots[1].use_map_emission = True - mat.texture_slots[1].emission_factor = 5 + tex_slot = mat.texture_slots.add() + tex_slot.texture = tex + tex_slot.texture_coords = 'ORCO' + + # add color ramp for flame color + ramp = tex.color_ramp + # dark orange + elem = ramp.elements.new(0.333) + elem.color = (0.2, 0.03, 0.0, 1.0) + + # yellow glow + elem = ramp.elements.new(0.666) + elem.color = (1, 0.65, 0.25, 1.0) + + mat.texture_slots[1].use_map_density = True + mat.texture_slots[1].use_map_emission = True + mat.texture_slots[1].emission_factor = 5 return {'FINISHED'} |