Merge branch 'master' into blender2.8
[blender.git] / source / blender / nodes / shader / nodes / node_shader_bsdf_principled.c
index e3b3f0fc9a605b585b022137c47be8cab85b69f2..b4a83c847beef9a00cb975d89fdd1f8712ec3eee 100644 (file)
@@ -64,8 +64,10 @@ static void node_shader_init_principled(bNodeTree *UNUSED(ntree), bNode *node)
        node->custom2 = SHD_SUBSURFACE_BURLEY;
 }
 
-static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
+static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
 {
+       GPUNodeLink *sss_scale;
+#if 0 /* Old 2.7 glsl viewport */
        // normal
        if (!in[17].link)
                in[17].link = GPU_builtin(GPU_VIEW_NORMAL);
@@ -77,8 +79,46 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *UNUSED(node)
                in[18].link = GPU_builtin(GPU_VIEW_NORMAL);
        else
                GPU_link(mat, "direction_transform_m4v3", in[18].link, GPU_builtin(GPU_VIEW_MATRIX), &in[18].link);
+#endif
 
-       return GPU_stack_link(mat, "node_bsdf_principled", in, out, GPU_builtin(GPU_VIEW_POSITION));
+       /* Normals */
+       if (!in[17].link) {
+               GPU_link(mat, "world_normals_get", &in[17].link);
+       }
+
+       /* Clearcoat Normals */
+       if (!in[18].link) {
+               GPU_link(mat, "world_normals_get", &in[18].link);
+       }
+
+       /* Tangents */
+       if (!in[19].link) {
+               GPUNodeLink *orco = GPU_attribute(CD_ORCO, "");
+               GPU_link(mat, "tangent_orco_z", orco, &in[19].link);
+               GPU_link(mat, "node_tangent",
+                       GPU_builtin(GPU_VIEW_NORMAL), in[19].link, GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
+                       &in[19].link);
+       }
+
+       /* SSS Profile */
+       if (node->sss_id == 1) {
+               static short profile = SHD_SUBSURFACE_BURLEY;
+               bNodeSocket *socket = BLI_findlink(&node->original->inputs, 2);
+               bNodeSocketValueRGBA *socket_data = socket->default_value;
+               /* For some reason it seems that the socket value is in ARGB format. */
+               GPU_material_sss_profile_create(mat, &socket_data->value[1], &profile, NULL);
+       }
+
+       if (in[2].link) {
+               sss_scale = in[2].link;
+       }
+       else {
+               float one[3] = {1.0f, 1.0f, 1.0f};
+               GPU_link(mat, "set_rgb", GPU_uniform((float *)one), &sss_scale);
+       }
+
+       return GPU_stack_link(mat, node, "node_bsdf_principled_clearcoat", in, out, GPU_builtin(GPU_VIEW_POSITION),
+                             GPU_uniform(&node->ssr_id), GPU_uniform(&node->sss_id), sss_scale);
 }
 
 static void node_shader_update_principled(bNodeTree *UNUSED(ntree), bNode *node)