Blender V5.0
NOD_socket_declarations.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <cfloat>
8
9#include "NOD_menu_value.hh"
11
12#include "RNA_types.hh"
13
14#include "BKE_node_enum.hh"
15
16#include "BLI_color_types.hh"
20
21namespace blender::nodes::decl {
22
23class FloatBuilder;
24
25class Float : public SocketDeclaration {
26 public:
28
29 float default_value = 0.0f;
33
35
37
38 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
39 bool matches(const bNodeSocket &socket) const override;
40 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
41 bool can_connect(const bNodeSocket &socket) const override;
42};
43
45 public:
46 FloatBuilder &min(float value);
47 FloatBuilder &max(float value);
48 FloatBuilder &default_value(float value);
50};
51
52class IntBuilder;
53
54class Int : public SocketDeclaration {
55 public:
57
62
63 friend IntBuilder;
64
66
67 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
68 bool matches(const bNodeSocket &socket) const override;
69 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
70 bool can_connect(const bNodeSocket &socket) const override;
71};
72
74 public:
75 IntBuilder &min(int value);
76 IntBuilder &max(int value);
77 IntBuilder &default_value(int value);
79};
80
81class VectorBuilder;
82
83class Vector : public SocketDeclaration {
84 public:
86
87 float4 default_value = {0, 0, 0, 0};
90 int dimensions = 3;
92
94
96
97 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
98 bool matches(const bNodeSocket &socket) const override;
99 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
100 bool can_connect(const bNodeSocket &socket) const override;
101};
102
114
115class BoolBuilder;
116
117class Bool : public SocketDeclaration {
118 public:
120
121 bool default_value = false;
123
125
126 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
127 bool matches(const bNodeSocket &socket) const override;
128 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
129 bool can_connect(const bNodeSocket &socket) const override;
130};
131
133 public:
134 BoolBuilder &default_value(bool value);
135};
136
137class ColorBuilder;
138
139class Color : public SocketDeclaration {
140 public:
142
143 ColorGeometry4f default_value{0.8f, 0.8f, 0.8f, 1.0f};
144
146
148
149 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
150 bool matches(const bNodeSocket &socket) const override;
151 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
152 bool can_connect(const bNodeSocket &socket) const override;
153};
154
156 public:
158};
159
160class RotationBuilder;
161
163 public:
165
167
169
171
172 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
173 bool matches(const bNodeSocket &socket) const override;
174 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
175 bool can_connect(const bNodeSocket &socket) const override;
176};
177
179 public:
181};
182
183class MatrixBuilder;
184
185class Matrix : public SocketDeclaration {
186 public:
188
190
192
193 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
194 bool matches(const bNodeSocket &socket) const override;
195 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
196 bool can_connect(const bNodeSocket &socket) const override;
197};
198
199class MatrixBuilder : public SocketDeclarationBuilder<Matrix> {};
200
201class StringBuilder;
202
203class String : public SocketDeclaration {
204 public:
206
207 std::string default_value;
209 std::optional<std::string> path_filter;
210
212
214
215 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
216 bool matches(const bNodeSocket &socket) const override;
217 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
218 bool can_connect(const bNodeSocket &socket) const override;
219};
220
222 public:
223 StringBuilder &default_value(const std::string value);
225 StringBuilder &path_filter(std::optional<std::string> filter);
226};
227
228class MenuBuilder;
229
230class Menu : public SocketDeclaration {
231 public:
233
235 bool is_expanded = false;
237
239
241
242 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
243 bool matches(const bNodeSocket &socket) const override;
244 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
245 bool can_connect(const bNodeSocket &socket) const override;
246};
247
249 public:
251
253 MenuBuilder &expanded(bool value = true);
254
257};
258
259class BundleBuilder;
260
261class Bundle : public SocketDeclaration {
262 public:
268 std::optional<int> pass_through_input_index;
269
271
273
274 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
275 bool matches(const bNodeSocket &socket) const override;
276 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
277 bool can_connect(const bNodeSocket &socket) const override;
278};
279
281 public:
283 BundleBuilder &pass_through_input_index(std::optional<int> index);
284};
285
286class ClosureBuilder;
287
289 public:
291
293
295
296 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
297 bool matches(const bNodeSocket &socket) const override;
298 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
299 bool can_connect(const bNodeSocket &socket) const override;
300};
301
302class ClosureBuilder : public SocketDeclarationBuilder<Closure> {};
303
305 public:
306 const char *idname;
312 std::function<ID *(const bNode &node)> default_value_fn;
313
314 IDSocketDeclaration(const char *idname);
315
316 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
317 bool matches(const bNodeSocket &socket) const override;
318 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
319 bool can_connect(const bNodeSocket &socket) const override;
320};
321
322template<typename T> class IDSocketDeclarationBuilder : public SocketDeclarationBuilder<T> {
323 public:
324 IDSocketDeclarationBuilder &default_value_fn(std::function<ID *(const bNode &node)> fn)
325 {
326 this->decl_->default_value_fn = std::move(fn);
327 return *this;
328 }
329};
330
339
348
357
366
368 public:
370
372
373 Image();
374};
375
376class ShaderBuilder;
377
378class Shader : public SocketDeclaration {
379 public:
381
383
385
386 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
387 bool matches(const bNodeSocket &socket) const override;
388 bool can_connect(const bNodeSocket &socket) const override;
389};
390
391class ShaderBuilder : public SocketDeclarationBuilder<Shader> {};
392
393class ExtendBuilder;
394
395class Extend : public SocketDeclaration {
396 private:
397 friend ExtendBuilder;
398
399 public:
401
402 using Builder = ExtendBuilder;
403
404 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
405 bool matches(const bNodeSocket &socket) const override;
406 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
407 bool can_connect(const bNodeSocket &socket) const override;
408};
409
410class ExtendBuilder : public SocketDeclarationBuilder<Extend> {};
411
413
414class Custom : public SocketDeclaration {
415 public:
417
419
421
422 const char *idname_;
423 std::function<void(bNode &node, bNodeSocket &socket, const char *data_path)> init_socket_fn;
424
425 bNodeSocket &build(bNodeTree &ntree, bNode &node) const override;
426 bool matches(const bNodeSocket &socket) const override;
427 bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
428 bool can_connect(const bNodeSocket &socket) const override;
429};
430
432 public:
433 CustomTypeBuilder &idname(const char *idname);
434
436 std::function<void(bNode &node, bNodeSocket &socket, const char *data_path)> fn)
437 {
438 decl_->init_socket_fn = std::move(fn);
439 return *this;
440 }
441};
442
443/* -------------------------------------------------------------------- */
446
447inline FloatBuilder &FloatBuilder::min(const float value)
448{
449 decl_->soft_min_value = value;
450 return *this;
451}
452
453inline FloatBuilder &FloatBuilder::max(const float value)
454{
455 decl_->soft_max_value = value;
456 return *this;
457}
458
460{
461 decl_->default_value = value;
462 return *this;
463}
464
466{
467 decl_->subtype = subtype;
468 return *this;
469}
470
472
473/* -------------------------------------------------------------------- */
476
477inline IntBuilder &IntBuilder::min(const int value)
478{
479 decl_->soft_min_value = value;
480 return *this;
481}
482
483inline IntBuilder &IntBuilder::max(const int value)
484{
485 decl_->soft_max_value = value;
486 return *this;
487}
488
489inline IntBuilder &IntBuilder::default_value(const int value)
490{
491 decl_->default_value = value;
492 return *this;
493}
494
496{
497 decl_->subtype = subtype;
498 return *this;
499}
500
502
503/* -------------------------------------------------------------------- */
506
508{
509 decl_->default_value = float4(value, 0.0f, 0.0f);
510 return *this;
511}
512
514{
515 decl_->default_value = float4(value, 0.0f);
516 return *this;
517}
518
520{
521 decl_->default_value = value;
522 return *this;
523}
524
526{
527 decl_->subtype = subtype;
528 return *this;
529}
530
532{
533 BLI_assert(dimensions >= 2 && dimensions <= 4);
534 decl_->dimensions = dimensions;
535 return *this;
536}
537
539{
540 decl_->soft_min_value = min;
541 return *this;
542}
543
545{
546 decl_->soft_max_value = max;
547 return *this;
548}
549
551{
552 decl_->compact = true;
553 return *this;
554}
555
557
558/* -------------------------------------------------------------------- */
561
563{
564 decl_->default_value = value;
565 return *this;
566}
567
569
570/* -------------------------------------------------------------------- */
573
575{
576 decl_->default_value = value;
577 return *this;
578}
579
581
582/* -------------------------------------------------------------------- */
585
587{
588 decl_->default_value = std::move(value);
589 return *this;
590}
591
593{
594 decl_->subtype = subtype;
595 return *this;
596}
597
599
600/* -------------------------------------------------------------------- */
603
605{
606 decl_->default_value = value;
607 return *this;
608}
609
610inline MenuBuilder &MenuBuilder::expanded(const bool value)
611{
612 decl_->is_expanded = value;
613 return *this;
614}
615
617
618/* -------------------------------------------------------------------- */
621
623{
624 decl_->default_value = value;
625 return *this;
626}
627
629
630/* -------------------------------------------------------------------- */
633
635
636inline Object::Object() : IDSocketDeclaration("NodeSocketObject") {}
637
638inline Material::Material() : IDSocketDeclaration("NodeSocketMaterial") {}
639
640inline Collection::Collection() : IDSocketDeclaration("NodeSocketCollection") {}
641
642inline Texture::Texture() : IDSocketDeclaration("NodeSocketTexture") {}
643
644inline Image::Image() : IDSocketDeclaration("NodeSocketImage") {}
645
647
648/* -------------------------------------------------------------------- */
651
653{
654 decl_->idname_ = idname;
655 return *this;
656}
657
659
660} // namespace blender::nodes::decl
#define BLI_assert(a)
Definition BLI_assert.h:46
eNodeSocketDatatype
@ SOCK_INT
@ SOCK_TEXTURE
@ SOCK_VECTOR
@ SOCK_CLOSURE
@ SOCK_BOOLEAN
@ SOCK_MATERIAL
@ SOCK_SHADER
@ SOCK_MATRIX
@ SOCK_FLOAT
@ SOCK_IMAGE
@ SOCK_COLLECTION
@ SOCK_CUSTOM
@ SOCK_BUNDLE
@ SOCK_ROTATION
@ SOCK_OBJECT
@ SOCK_STRING
@ SOCK_RGBA
@ SOCK_MENU
PropertySubType
Definition RNA_types.hh:232
@ PROP_NONE
Definition RNA_types.hh:233
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool can_connect(const bNodeSocket &socket) const override
BundleBuilder & pass_through_input_index(std::optional< int > index)
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool can_connect(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
std::optional< int > pass_through_input_index
bool matches(const bNodeSocket &socket) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
bool can_connect(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
IDSocketDeclarationBuilder< Collection > Builder
static constexpr eNodeSocketDatatype static_socket_type
ColorBuilder & default_value(const ColorGeometry4f value)
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
static constexpr eNodeSocketDatatype static_socket_type
bool matches(const bNodeSocket &socket) const override
CustomTypeBuilder & idname(const char *idname)
CustomTypeBuilder & init_socket_fn(std::function< void(bNode &node, bNodeSocket &socket, const char *data_path)> fn)
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
std::function< void(bNode &node, bNodeSocket &socket, const char *data_path)> init_socket_fn
bool can_connect(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bool can_connect(const bNodeSocket &socket) const override
bool matches(const bNodeSocket &socket) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
FloatBuilder & subtype(PropertySubType subtype)
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
static constexpr eNodeSocketDatatype static_socket_type
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool matches(const bNodeSocket &socket) const override
IDSocketDeclarationBuilder & default_value_fn(std::function< ID *(const bNode &node)> fn)
std::function< ID *(const bNode &node)> default_value_fn
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool matches(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
IDSocketDeclarationBuilder< Image > Builder
IntBuilder & subtype(PropertySubType subtype)
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
static constexpr eNodeSocketDatatype static_socket_type
IDSocketDeclarationBuilder< Material > Builder
static constexpr eNodeSocketDatatype static_socket_type
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool matches(const bNodeSocket &socket) const override
MenuBuilder & expanded(bool value=true)
MenuBuilder & default_value(MenuValue value)
MenuBuilder & static_items(const EnumPropertyItem *items)
ImplicitSharingPtr< bke::RuntimeNodeEnumItems > items
bool can_connect(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bool matches(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
IDSocketDeclarationBuilder< Object > Builder
static constexpr eNodeSocketDatatype static_socket_type
RotationBuilder & default_value(const math::EulerXYZ &value)
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
bool can_connect(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
bool can_connect(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bool matches(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
StringBuilder & subtype(PropertySubType subtype)
StringBuilder & path_filter(std::optional< std::string > filter)
StringBuilder & default_value(const std::string value)
bool can_connect(const bNodeSocket &socket) const override
std::optional< std::string > path_filter
bool matches(const bNodeSocket &socket) const override
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
static constexpr eNodeSocketDatatype static_socket_type
IDSocketDeclarationBuilder< Texture > Builder
VectorBuilder & subtype(PropertySubType subtype)
VectorBuilder & default_value(const float2 value)
VectorBuilder & dimensions(int dimensions)
bool can_connect(const bNodeSocket &socket) const override
bool matches(const bNodeSocket &socket) const override
static constexpr eNodeSocketDatatype static_socket_type
bNodeSocket & build(bNodeTree &ntree, bNode &node) const override
bNodeSocket & update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
#define INT32_MAX
#define INT32_MIN
#define filter
EulerXYZBase< float > EulerXYZ
VecBase< float, 4 > float4
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
#define min(a, b)
Definition sort.cc:36
#define FLT_MAX
Definition stdcycles.h:14
Definition DNA_ID.h:414
max
Definition text_draw.cc:251