GooEngine: Set Depth node

This commit is contained in:
2023-06-09 22:30:36 +01:00
parent dcb02f59bb
commit 088dd3e5fb
10 changed files with 77 additions and 2 deletions
+1
View File
@@ -274,6 +274,7 @@ shader_node_categories = [
ShaderNodeCategory("SH_NEW_GOO", "Goo Nodes", items=[
NodeItem("ShaderNodeShaderInfo"),
NodeItem("ShaderNodeScreenspaceInfo"),
NodeItem("ShaderNodeSetDepth"),
]),
]
+2
View File
@@ -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
/** \} */
+1
View File
@@ -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
@@ -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
+1
View File
@@ -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", "" )
@@ -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
@@ -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();
@@ -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();
@@ -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 */
@@ -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<decl::Shader>(N_("Shader"));
b.add_input<decl::Float>(N_("View Depth"))
.hide_value(true);
b.add_output<decl::Shader>(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);
}