Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/shaders/node_normal_map.osl
| Show All 20 Lines | shader node_normal_map( | ||||
| float Strength = 1.0, | float Strength = 1.0, | ||||
| color Color = color(0.5, 0.5, 1.0), | color Color = color(0.5, 0.5, 1.0), | ||||
| string space = "tangent", | string space = "tangent", | ||||
| string attr_name = "geom:tangent", | string attr_name = "geom:tangent", | ||||
| string attr_sign_name = "geom:tangent_sign", | string attr_sign_name = "geom:tangent_sign", | ||||
| output normal Normal = NormalIn) | output normal Normal = NormalIn) | ||||
| { | { | ||||
| color mcolor = 2.0 * color(Color[0] - 0.5, Color[1] - 0.5, Color[2] - 0.5); | color mcolor = 2.0 * color(Color[0] - 0.5, Color[1] - 0.5, Color[2] - 0.5); | ||||
| int is_backfacing = backfacing(); | |||||
| if (space == "tangent") { | if (space == "tangent") { | ||||
| vector tangent; | vector tangent; | ||||
| vector ninterp; | vector ninterp; | ||||
| float tangent_sign; | float tangent_sign; | ||||
| float is_smooth; | float is_smooth; | ||||
| getattribute("geom:is_smooth", is_smooth); | getattribute("geom:is_smooth", is_smooth); | ||||
| if (!is_smooth) | if (!is_smooth) { | ||||
| ninterp = normalize(transform("world", "object", Ng)); | ninterp = normalize(transform("world", "object", Ng)); | ||||
| /* the normal is already inverted, which is too soon here */ | |||||
| if (is_backfacing) { | |||||
| ninterp = -ninterp; | |||||
| } | |||||
| } | |||||
| // get _unnormalized_ interpolated normal and tangent | // get _unnormalized_ interpolated normal and tangent | ||||
| if (getattribute(attr_name, tangent) && | if (getattribute(attr_name, tangent) && | ||||
| getattribute(attr_sign_name, tangent_sign) && | getattribute(attr_sign_name, tangent_sign) && | ||||
| (!is_smooth || getattribute("geom:N", ninterp))) | (!is_smooth || getattribute("geom:N", ninterp))) | ||||
| { | { | ||||
| // apply normal map | // apply normal map | ||||
| vector B = tangent_sign * cross(ninterp, tangent); | vector B = tangent_sign * cross(ninterp, tangent); | ||||
| Normal = normalize(mcolor[0] * tangent + mcolor[1] * B + mcolor[2] * ninterp); | Normal = normalize(mcolor[0] * tangent + mcolor[1] * B + mcolor[2] * ninterp); | ||||
| Show All 20 Lines | shader node_normal_map( | ||||
| } | } | ||||
| else if (space == "blender_world") { | else if (space == "blender_world") { | ||||
| /* strange blender convention */ | /* strange blender convention */ | ||||
| mcolor[1] = -mcolor[1]; | mcolor[1] = -mcolor[1]; | ||||
| mcolor[2] = -mcolor[2]; | mcolor[2] = -mcolor[2]; | ||||
| Normal = normalize(vector(mcolor)); | Normal = normalize(vector(mcolor)); | ||||
| } | } | ||||
| /* invert normal for backfacing polygons */ | |||||
| if (is_backfacing) { | |||||
| Normal = -Normal; | |||||
| } | |||||
| if (Strength != 1.0) | if (Strength != 1.0) | ||||
| Normal = normalize(NormalIn + (Normal - NormalIn) * max(Strength, 0.0)); | Normal = normalize(NormalIn + (Normal - NormalIn) * max(Strength, 0.0)); | ||||
| } | } | ||||