From 088dd3e5fb0fd7281d8160033a814ca2aeaec6df Mon Sep 17 00:00:00 2001 From: Chris Clyne Date: Fri, 9 Jun 2023 22:30:36 +0100 Subject: [PATCH] GooEngine: Set Depth node --- scripts/startup/nodeitems_builtins.py | 1 + source/blender/blenkernel/BKE_node.h | 2 + source/blender/gpu/CMakeLists.txt | 1 + .../gpu_shader_material_set_depth.glsl | 21 +++++++++ source/blender/nodes/NOD_static_types.h | 1 + source/blender/nodes/shader/CMakeLists.txt | 1 + .../nodes/shader/node_shader_register.cc | 1 + .../nodes/shader/node_shader_register.hh | 1 + .../blender/nodes/shader/node_shader_tree.cc | 6 ++- .../shader/nodes/node_shader_set_depth.cc | 44 +++++++++++++++++++ 10 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 source/blender/gpu/shaders/material/gpu_shader_material_set_depth.glsl create mode 100644 source/blender/nodes/shader/nodes/node_shader_set_depth.cc diff --git a/scripts/startup/nodeitems_builtins.py b/scripts/startup/nodeitems_builtins.py index 55d7d6326c0..21e285e7cc7 100644 --- a/scripts/startup/nodeitems_builtins.py +++ b/scripts/startup/nodeitems_builtins.py @@ -274,6 +274,7 @@ shader_node_categories = [ ShaderNodeCategory("SH_NEW_GOO", "Goo Nodes", items=[ NodeItem("ShaderNodeShaderInfo"), NodeItem("ShaderNodeScreenspaceInfo"), + NodeItem("ShaderNodeSetDepth"), ]), ] diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 02ed6c45551..4a5c070f360 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -976,6 +976,8 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i #define SH_NODE_SDF_PRIMITIVE 802 #define SH_NODE_SDF_OP 803 #define SH_NODE_SDF_VECTOR_OP 804 +#define SH_NODE_SET_DEPTH 806 + /** \} */ diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index a616025833e..4bd7ad3a9d6 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -513,6 +513,7 @@ set(GLSL_SRC shaders/material/gpu_shader_material_refraction.glsl shaders/material/gpu_shader_material_rgb_to_bw.glsl shaders/material/gpu_shader_material_screenspace_info.glsl + shaders/material/gpu_shader_material_set_depth.glsl shaders/material/gpu_shader_material_sdf_util.glsl shaders/material/gpu_shader_material_sdf_primitive.glsl shaders/material/gpu_shader_material_sdf_op.glsl diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_set_depth.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_set_depth.glsl new file mode 100644 index 00000000000..42d17544a0d --- /dev/null +++ b/source/blender/gpu/shaders/material/gpu_shader_material_set_depth.glsl @@ -0,0 +1,21 @@ +#ifdef GPU_VERTEX_SHADER + #define FRAG_DEPTH float _frag_depth +#else + #define FRAG_DEPTH gl_FragDepth +#endif + +void view_z_get(out float z) +{ + z = abs(viewPosition.z); +} + +void node_set_depth(in Closure _in, in float z_in, out Closure _out) +{ + _out = _in; + float viewNear = get_view_z_from_depth(0.0f); + float viewFar = get_view_z_from_depth(1.0f); + float z_clipped = max(min(-z_in, viewNear), viewFar); + FRAG_DEPTH = get_depth_from_view_z(z_clipped); +} + +#undef FRAG_DEPTH diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 432387e4a6e..b89da8c87dd 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -128,6 +128,7 @@ DefNode(ShaderNode, SH_NODE_SEPARATE_COLOR, def_sh_combsep_color, "SEP DefNode(ShaderNode, SH_NODE_MIX, def_sh_mix, "MIX", Mix, "Mix", "Mix values by a factor") DefNode(ShaderNode, SH_NODE_SHADER_INFO, def_sh_shader_info, "SHADERINFO", ShaderInfo, "Shader Info", "Separate internal lighting into multiple outputs, and allow for per-node light-groups.") DefNode(ShaderNode, SH_NODE_SCREENSPACE_INFO, 0, "SCREENSPACEINFO", ScreenspaceInfo, "Screenspace Info", "Sample internal colour and depth buffers") +DefNode(ShaderNode, SH_NODE_SET_DEPTH, 0, "SET_DEPTH", SetDepth, "Set Depth", "Pixel depth offset") DefNode(CompositorNode, CMP_NODE_VIEWER, def_cmp_viewer, "VIEWER", Viewer, "Viewer", "" ) DefNode(CompositorNode, CMP_NODE_RGB, 0, "RGB", RGB, "RGB", "" ) diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index f5aa54245cc..6eb4640c4c6 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -91,6 +91,7 @@ set(SRC nodes/node_shader_sepcomb_hsv.cc nodes/node_shader_sepcomb_rgb.cc nodes/node_shader_sepcomb_xyz.cc + nodes/node_shader_set_depth.cc nodes/node_shader_shader_to_rgb.cc nodes/node_shader_shader_info.cc nodes/node_shader_squeeze.cc diff --git a/source/blender/nodes/shader/node_shader_register.cc b/source/blender/nodes/shader/node_shader_register.cc index 0dc155a1184..ff51154d0d3 100644 --- a/source/blender/nodes/shader/node_shader_register.cc +++ b/source/blender/nodes/shader/node_shader_register.cc @@ -76,6 +76,7 @@ void register_shader_nodes() register_node_type_sh_sephsv(); register_node_type_sh_seprgb(); register_node_type_sh_sepxyz(); + register_node_type_sh_set_depth(); register_node_type_sh_shader_info(); register_node_type_sh_shadertorgb(); register_node_type_sh_squeeze(); diff --git a/source/blender/nodes/shader/node_shader_register.hh b/source/blender/nodes/shader/node_shader_register.hh index 9e1a87f2fbe..fc3c1142283 100644 --- a/source/blender/nodes/shader/node_shader_register.hh +++ b/source/blender/nodes/shader/node_shader_register.hh @@ -75,6 +75,7 @@ void register_node_type_sh_sepcolor(); void register_node_type_sh_sephsv(); void register_node_type_sh_seprgb(); void register_node_type_sh_sepxyz(); +void register_node_type_sh_set_depth(); void register_node_type_sh_shader_info(); void register_node_type_sh_shadertorgb(); void register_node_type_sh_squeeze(); diff --git a/source/blender/nodes/shader/node_shader_tree.cc b/source/blender/nodes/shader/node_shader_tree.cc index b9672f59c18..67c5a1a8b83 100644 --- a/source/blender/nodes/shader/node_shader_tree.cc +++ b/source/blender/nodes/shader/node_shader_tree.cc @@ -681,7 +681,8 @@ static bool ntree_weight_tree_tag_nodes(bNode *fromnode, bNode *tonode, void *us SH_NODE_MIX_SHADER, SH_NODE_OUTPUT_WORLD, SH_NODE_OUTPUT_MATERIAL, - SH_NODE_SHADERTORGB); + SH_NODE_SHADERTORGB, + SH_NODE_SET_DEPTH); if (tonode->runtime->tmp_flag == -1 && to_node_from_weight_tree) { tonode->runtime->tmp_flag = *node_count; *node_count += (tonode->type == SH_NODE_MIX_SHADER) ? 4 : 1; @@ -732,7 +733,8 @@ static void ntree_shader_weight_tree_invert(bNodeTree *ntree, bNode *output_node case SH_NODE_SHADERTORGB: case SH_NODE_OUTPUT_LIGHT: case SH_NODE_OUTPUT_WORLD: - case SH_NODE_OUTPUT_MATERIAL: { + case SH_NODE_OUTPUT_MATERIAL: + case SH_NODE_SET_DEPTH: { /* Start the tree with full weight. */ nodes_copy[id] = nodeAddStaticNode(nullptr, ntree, SH_NODE_VALUE); nodes_copy[id]->runtime->tmp_flag = -2; /* Copy */ diff --git a/source/blender/nodes/shader/nodes/node_shader_set_depth.cc b/source/blender/nodes/shader/nodes/node_shader_set_depth.cc new file mode 100644 index 00000000000..687cf06b6c3 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_set_depth.cc @@ -0,0 +1,44 @@ +/* SPDX-FileCopyrightText: 2005 Blender Foundation +* +* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "../node_shader_util.hh" + +namespace blender::nodes::node_shader_set_depth_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.add_input(N_("Shader")); + b.add_input(N_("View Depth")) + .hide_value(true); + b.add_output(N_("Shader")); +} + +static int node_shader_gpu_add_shader(GPUMaterial *mat, + bNode *node, + bNodeExecData * /* execdata */, + GPUNodeStack *in, + GPUNodeStack *out) +{ + if (!in[1].link) { + GPU_link(mat, "view_z_get", &in[1].link); + } + + return GPU_stack_link(mat, node, "node_set_depth", in, out); +} + +} // blender::nodes::node_shader_set_depth_cc + +/* node type definition */ +void register_node_type_sh_set_depth(void) +{ + namespace file_ns = blender::nodes::node_shader_set_depth_cc; + static bNodeType ntype; + + sh_node_type_base(&ntype, SH_NODE_SET_DEPTH, "Set Depth", NODE_CLASS_SHADER); + + ntype.declare = file_ns::node_declare; + ntype.gpu_fn = file_ns::node_shader_gpu_add_shader; + + nodeRegisterType(&ntype); +}