Eevee: Fix default texture coord for procedural texture in world tree
authorClément Foucault <foucault.clem@gmail.com>
Thu, 18 Oct 2018 13:30:06 +0000 (15:30 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Thu, 18 Oct 2018 13:30:16 +0000 (15:30 +0200)
source/blender/gpu/shaders/gpu_shader_material.glsl
source/blender/nodes/shader/nodes/node_shader_tex_brick.c
source/blender/nodes/shader/nodes/node_shader_tex_checker.c
source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
source/blender/nodes/shader/nodes/node_shader_tex_magic.c
source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
source/blender/nodes/shader/nodes/node_shader_tex_noise.c
source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
source/blender/nodes/shader/nodes/node_shader_tex_wave.c

index 7b4748056a79c2f8c74b8bf3d7c776b0f170547d..e24cf8da989b9cecc961cb627150ec44c3b6c16b 100644 (file)
@@ -1749,6 +1749,19 @@ void node_geometry(
        pointiness = 0.5;
 }
 
+void generated_texco(vec3 I, vec3 attr_orco, out vec3 generated)
+{
+       vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(I, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
+       vec4 co_homogenous = (ProjectionMatrixInverse * v);
+       vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
+       co.xyz = normalize(co.xyz);
+#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
+       generated = (ViewMatrixInverse * co).xyz;
+#else
+       generated_from_orco(attr_orco, generated);
+#endif
+}
+
 void node_tex_coord(
         vec3 I, vec3 N, mat4 viewinvmat, mat4 obinvmat, vec4 camerafac,
         vec3 attr_orco, vec3 attr_uv,
index 2002e3c14c9f3ea8c22a989dce1a39de6d9e2ead..4f488025a994bd32c68c8fa38ff454cc086a6505 100644 (file)
@@ -73,7 +73,7 @@ static int node_shader_gpu_tex_brick(GPUMaterial *mat, bNode *node, bNodeExecDat
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index 4e065ffde231bdc9908361b940a947e114bf05c7..52aa33c033e1fb682ea632df9a2abea9b5168e1c 100644 (file)
@@ -56,7 +56,7 @@ static int node_shader_gpu_tex_checker(GPUMaterial *mat, bNode *node, bNodeExecD
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index 750ce60e84d1e707432d5879e58dada0eacc5c11..404463a8fbe4e16376f379ad7200e4e116dce6d9 100644 (file)
@@ -54,7 +54,7 @@ static int node_shader_gpu_tex_gradient(GPUMaterial *mat, bNode *node, bNodeExec
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index fb3012e1d2b24d880f3dc9601fe71d28f839f4f2..e24ef04bc574588bb1f4b450d71022742963e8d9 100644 (file)
@@ -59,7 +59,7 @@ static int node_shader_gpu_tex_magic(GPUMaterial *mat, bNode *node, bNodeExecDat
 
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index 30171eea9e2b4d6c384f8989dadfb76b199aa291..5d4f6b7c5783460325ce6dc2514d938ae725a27b 100644 (file)
@@ -60,7 +60,7 @@ static int node_shader_gpu_tex_musgrave(GPUMaterial *mat, bNode *node, bNodeExec
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index e2879528a5f4e30060f621ee24b63b74ab5e2a45..310e82d2d6bd3f076b24cb7a6099001d4342fee9 100644 (file)
@@ -56,7 +56,7 @@ static int node_shader_gpu_tex_noise(GPUMaterial *mat, bNode *node, bNodeExecDat
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index a4145a350d2bdd6dc0756bce55990f4e49680eb3..059d634847314b1eb70cc1e9c687fbfeec35a237 100644 (file)
@@ -58,7 +58,7 @@ static int node_shader_gpu_tex_voronoi(GPUMaterial *mat, bNode *node, bNodeExecD
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);
index ac955b29808b648a39b6312e23c906e2e662d432..db33be2bcb75488964d4b9ef71f0b1afce901039 100644 (file)
@@ -58,7 +58,7 @@ static int node_shader_gpu_tex_wave(GPUMaterial *mat, bNode *node, bNodeExecData
 {
        if (!in[0].link) {
                in[0].link = GPU_attribute(CD_ORCO, "");
-               GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+               GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
        }
 
        node_shader_gpu_tex_mapping(mat, node, in, out);