diff options
author | Jacques Lucke <jacques@blender.org> | 2020-07-16 16:49:56 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-07-16 17:09:19 +0300 |
commit | 72df7c23c4b5a7ac732cc224ded1fc93a0facb8c (patch) | |
tree | d179a4601921fbb2433e75e2fef1eae35d68fa5a /source/blender/nodes | |
parent | c7aa0f9d743ee9cafe91b4a51d9f1ecc5e437d71 (diff) |
Particles: support Color Ramp node
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_valToRgb.cc (renamed from source/blender/nodes/shader/nodes/node_shader_valToRgb.c) | 48 |
2 files changed, 47 insertions, 3 deletions
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index a4b10e955a3..ff512e1ddf7 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -215,7 +215,7 @@ set(SRC shader/nodes/node_shader_tex_white_noise.c shader/nodes/node_shader_uvAlongStroke.c shader/nodes/node_shader_uvmap.c - shader/nodes/node_shader_valToRgb.c + shader/nodes/node_shader_valToRgb.cc shader/nodes/node_shader_value.cc shader/nodes/node_shader_vectTransform.c shader/nodes/node_shader_vector_displacement.c diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc index 20f280d00c3..76409c836d8 100644 --- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc @@ -22,6 +22,11 @@ */ #include "IMB_colormanagement.h" + +#include "DNA_texture_types.h" + +#include "BLI_color.hh" + #include "node_shader_util.h" /* **************** VALTORGB ******************** */ @@ -49,7 +54,7 @@ static void node_shader_exec_valtorgb(void *UNUSED(data), float fac; nodestack_get_vec(&fac, SOCK_FLOAT, in[0]); - BKE_colorband_evaluate(node->storage, fac, out[0]->vec); + BKE_colorband_evaluate((ColorBand *)node->storage, fac, out[0]->vec); out[1]->vec[0] = out[0]->vec[3]; } } @@ -65,7 +70,7 @@ static int gpu_shader_valtorgb(GPUMaterial *mat, GPUNodeStack *in, GPUNodeStack *out) { - struct ColorBand *coba = node->storage; + struct ColorBand *coba = (ColorBand *)node->storage; float *array, layer; int size; @@ -121,6 +126,44 @@ static int gpu_shader_valtorgb(GPUMaterial *mat, } } +class ColorBandFunction : public blender::fn::MultiFunction { + private: + const ColorBand &color_band_; + + public: + ColorBandFunction(const ColorBand &color_band) : color_band_(color_band) + { + blender::fn::MFSignatureBuilder signature = this->get_builder("Color Band"); + signature.single_input<float>("Value"); + signature.single_output<blender::Color4f>("Color"); + signature.single_output<float>("Alpha"); + } + + void call(blender::IndexMask mask, + blender::fn::MFParams params, + blender::fn::MFContext UNUSED(context)) const override + { + blender::fn::VSpan<float> values = params.readonly_single_input<float>(0, "Value"); + blender::MutableSpan<blender::Color4f> colors = + params.uninitialized_single_output<blender::Color4f>(1, "Color"); + blender::MutableSpan<float> alphas = params.uninitialized_single_output<float>(2, "Alpha"); + + for (uint i : mask) { + blender::Color4f color; + BKE_colorband_evaluate(&color_band_, values[i], color); + colors[i] = color; + alphas[i] = color.a; + } + } +}; + +static void sh_node_valtorgb_expand_in_mf_network(blender::bke::NodeMFNetworkBuilder &builder) +{ + bNode &bnode = builder.bnode(); + const ColorBand *color_band = (const ColorBand *)bnode.storage; + builder.construct_and_set_matching_fn<ColorBandFunction>(*color_band); +} + void register_node_type_sh_valtorgb(void) { static bNodeType ntype; @@ -132,6 +175,7 @@ void register_node_type_sh_valtorgb(void) node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage); node_type_exec(&ntype, NULL, NULL, node_shader_exec_valtorgb); node_type_gpu(&ntype, gpu_shader_valtorgb); + ntype.expand_in_mf_network = sh_node_valtorgb_expand_in_mf_network; nodeRegisterType(&ntype); } |