snode = hair;
}
else if(string_iequals(node.name(), "emission")) {
- EmissionNode *emission = new EmissionNode();
- xml_read_bool(&emission->total_power, node, "total_power");
- snode = emission;
+ snode = new EmissionNode();
}
else if(string_iequals(node.name(), "ambient_occlusion")) {
snode = new AmbientOcclusionNode();
#include "stdosl.h"
shader node_emission(
- int TotalPower = 0,
color Color = 0.8,
float Strength = 1.0,
output closure color Emission = 0)
{
- if (TotalPower)
- Emission = ((Strength / surfacearea()) * Color) * emission();
- else
- Emission = (Strength * Color) * emission();
+ Emission = (Strength * Color) * emission();
}
break;
case NODE_CLOSURE_SET_NORMAL:
svm_node_set_normal(kg, sd, stack, node.y, node.z );
- break;
-#endif
- case NODE_EMISSION_SET_WEIGHT_TOTAL:
- svm_node_emission_set_weight_total(kg, sd, node.y, node.z, node.w);
break;
-#ifdef __EXTRA_NODES__
case NODE_RGB_RAMP:
svm_node_rgb_ramp(kg, sd, stack, node, &offset);
break;
svm_node_closure_store_weight(sd, weight);
}
-ccl_device void svm_node_emission_set_weight_total(KernelGlobals *kg, ShaderData *sd, uint r, uint g, uint b)
-{
- float3 weight = make_float3(__uint_as_float(r), __uint_as_float(g), __uint_as_float(b));
-
- if(sd->object != OBJECT_NONE)
- weight /= object_surface_area(kg, sd->object);
-
- svm_node_closure_store_weight(sd, weight);
-}
-
ccl_device void svm_node_closure_weight(ShaderData *sd, float *stack, uint weight_offset)
{
float3 weight = stack_load_float3(stack, weight_offset);
{
uint color_offset = node.y;
uint strength_offset = node.z;
- uint total_power = node.w;
float strength = stack_load_float(stack, strength_offset);
float3 weight = stack_load_float3(stack, color_offset)*strength;
- if(total_power && sd->object != OBJECT_NONE)
- weight /= object_surface_area(kg, sd->object);
-
svm_node_closure_store_weight(sd, weight);
}
NODE_TEX_COORD,
NODE_TEX_COORD_BUMP_DX,
NODE_TEX_COORD_BUMP_DY,
- NODE_EMISSION_SET_WEIGHT_TOTAL,
NODE_ATTR_BUMP_DX,
NODE_ATTR_BUMP_DY,
NODE_TEX_ENVIRONMENT,
EmissionNode::EmissionNode()
: ShaderNode("emission")
{
- total_power = false;
-
add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
add_input("Strength", SHADER_SOCKET_FLOAT, 10.0f);
add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM);
if(color_in->link || strength_in->link) {
compiler.stack_assign(color_in);
compiler.stack_assign(strength_in);
- compiler.add_node(NODE_EMISSION_WEIGHT, color_in->stack_offset, strength_in->stack_offset, total_power? 1: 0);
+ compiler.add_node(NODE_EMISSION_WEIGHT, color_in->stack_offset, strength_in->stack_offset);
}
- else if(total_power)
- compiler.add_node(NODE_EMISSION_SET_WEIGHT_TOTAL, color_in->value * strength_in->value.x);
else
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value * strength_in->value.x);
void EmissionNode::compile(OSLCompiler& compiler)
{
- compiler.parameter("TotalPower", (total_power)? 1: 0);
compiler.add(this, "node_emission");
}
bool has_surface_emission() { return true; }
bool has_spatial_varying() { return true; }
-
- bool total_power;
};
class BackgroundNode : public ShaderNode {