GooEngine: Set Depth node
This commit is contained in:
@@ -274,6 +274,7 @@ shader_node_categories = [
|
||||
ShaderNodeCategory("SH_NEW_GOO", "Goo Nodes", items=[
|
||||
NodeItem("ShaderNodeShaderInfo"),
|
||||
NodeItem("ShaderNodeScreenspaceInfo"),
|
||||
NodeItem("ShaderNodeSetDepth"),
|
||||
]),
|
||||
]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
/** \} */
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user