diff options
Diffstat (limited to 'source/blender/nodes/composite/nodes/node_composite_map_value.cc')
-rw-r--r-- | source/blender/nodes/composite/nodes/node_composite_map_value.cc | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/source/blender/nodes/composite/nodes/node_composite_map_value.cc b/source/blender/nodes/composite/nodes/node_composite_map_value.cc index bb42628ed3d..eacc003378a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_map_value.cc +++ b/source/blender/nodes/composite/nodes/node_composite_map_value.cc @@ -12,24 +12,34 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "GPU_material.h" + +#include "COM_shader_node.hh" + #include "node_composite_util.hh" /* **************** MAP VALUE ******************** */ namespace blender::nodes::node_composite_map_value_cc { +NODE_STORAGE_FUNCS(TexMapping) + static void cmp_node_map_value_declare(NodeDeclarationBuilder &b) { - b.add_input<decl::Float>(N_("Value")).default_value(1.0f).min(0.0f).max(1.0f); + b.add_input<decl::Float>(N_("Value")) + .default_value(1.0f) + .min(0.0f) + .max(1.0f) + .compositor_domain_priority(0); b.add_output<decl::Float>(N_("Value")); } -static void node_composit_init_map_value(bNodeTree *UNUSED(ntree), bNode *node) +static void node_composit_init_map_value(bNodeTree * /*ntree*/, bNode *node) { node->storage = BKE_texture_mapping_add(TEXMAP_TYPE_POINT); } -static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +static void node_composit_buts_map_value(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) { uiLayout *sub, *col; @@ -50,6 +60,51 @@ static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C), uiItemR(sub, ptr, "max", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); } +using namespace blender::realtime_compositor; + +class MapValueShaderNode : public ShaderNode { + public: + using ShaderNode::ShaderNode; + + void compile(GPUMaterial *material) override + { + GPUNodeStack *inputs = get_inputs_array(); + GPUNodeStack *outputs = get_outputs_array(); + + const TexMapping &texture_mapping = node_storage(bnode()); + + const float use_min = get_use_min(); + const float use_max = get_use_max(); + + GPU_stack_link(material, + &bnode(), + "node_composite_map_value", + inputs, + outputs, + GPU_uniform(texture_mapping.loc), + GPU_uniform(texture_mapping.size), + GPU_constant(&use_min), + GPU_uniform(texture_mapping.min), + GPU_constant(&use_max), + GPU_uniform(texture_mapping.max)); + } + + bool get_use_min() + { + return node_storage(bnode()).flag & TEXMAP_CLIP_MIN; + } + + bool get_use_max() + { + return node_storage(bnode()).flag & TEXMAP_CLIP_MAX; + } +}; + +static ShaderNode *get_compositor_shader_node(DNode node) +{ + return new MapValueShaderNode(node); +} + } // namespace blender::nodes::node_composite_map_value_cc void register_node_type_cmp_map_value() @@ -63,6 +118,7 @@ void register_node_type_cmp_map_value() ntype.draw_buttons = file_ns::node_composit_buts_map_value; node_type_init(&ntype, file_ns::node_composit_init_map_value); node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage); + ntype.get_compositor_shader_node = file_ns::get_compositor_shader_node; nodeRegisterType(&ntype); } |