Compare commits
6 Commits
temp_bmesh
...
temp-socke
Author | SHA1 | Date | |
---|---|---|---|
b25697b884 | |||
608c4d40a1 | |||
d021d633ff | |||
0c2c2af0aa | |||
2ffa956983 | |||
19d2f7d9cf |
@@ -27,12 +27,19 @@ namespace blender::nodes {
|
|||||||
|
|
||||||
class NodeDeclarationBuilder;
|
class NodeDeclarationBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes a single input or output socket. This is subclassed for different socket types.
|
||||||
|
*/
|
||||||
class SocketDeclaration {
|
class SocketDeclaration {
|
||||||
protected:
|
protected:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
std::string identifier_;
|
std::string identifier_;
|
||||||
|
bool hide_label_ = false;
|
||||||
|
bool hide_value_ = false;
|
||||||
|
bool is_multi_input_ = false;
|
||||||
|
|
||||||
friend NodeDeclarationBuilder;
|
friend NodeDeclarationBuilder;
|
||||||
|
template<typename SocketDecl> friend class SocketDeclarationBuilder;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~SocketDeclaration() = default;
|
virtual ~SocketDeclaration() = default;
|
||||||
@@ -43,6 +50,49 @@ class SocketDeclaration {
|
|||||||
|
|
||||||
StringRefNull name() const;
|
StringRefNull name() const;
|
||||||
StringRefNull identifier() const;
|
StringRefNull identifier() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void set_common_flags(bNodeSocket &socket) const;
|
||||||
|
bool matches_common_data(const bNodeSocket &socket) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BaseSocketDeclarationBuilder {
|
||||||
|
public:
|
||||||
|
virtual ~BaseSocketDeclarationBuilder() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps a #SocketDeclaration and provides methods to set it up correctly.
|
||||||
|
* This is separate from #SocketDeclaration, because it allows separating the API used by nodes to
|
||||||
|
* declare themselves from how the declaration is stored internally.
|
||||||
|
*/
|
||||||
|
template<typename SocketDecl>
|
||||||
|
class SocketDeclarationBuilder : public BaseSocketDeclarationBuilder {
|
||||||
|
protected:
|
||||||
|
using Self = typename SocketDecl::Builder;
|
||||||
|
static_assert(std::is_base_of_v<SocketDeclaration, SocketDecl>);
|
||||||
|
SocketDecl *decl_;
|
||||||
|
|
||||||
|
friend class NodeDeclarationBuilder;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Self &hide_label(bool value)
|
||||||
|
{
|
||||||
|
decl_->hide_label_ = value;
|
||||||
|
return *(Self *)this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self &hide_value(bool value)
|
||||||
|
{
|
||||||
|
decl_->hide_value_ = value;
|
||||||
|
return *(Self *)this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self &multi_input(bool value)
|
||||||
|
{
|
||||||
|
decl_->is_multi_input_ = value;
|
||||||
|
return *(Self *)this;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using SocketDeclarationPtr = std::unique_ptr<SocketDeclaration>;
|
using SocketDeclarationPtr = std::unique_ptr<SocketDeclaration>;
|
||||||
@@ -67,12 +117,21 @@ class NodeDeclaration {
|
|||||||
class NodeDeclarationBuilder {
|
class NodeDeclarationBuilder {
|
||||||
private:
|
private:
|
||||||
NodeDeclaration &declaration_;
|
NodeDeclaration &declaration_;
|
||||||
|
Vector<std::unique_ptr<BaseSocketDeclarationBuilder>> builders_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NodeDeclarationBuilder(NodeDeclaration &declaration);
|
NodeDeclarationBuilder(NodeDeclaration &declaration);
|
||||||
|
|
||||||
template<typename DeclType> DeclType &add_input(StringRef name, StringRef identifier = "");
|
template<typename DeclType>
|
||||||
template<typename DeclType> DeclType &add_output(StringRef name, StringRef identifier = "");
|
typename DeclType::Builder &add_input(StringRef name, StringRef identifier = "");
|
||||||
|
template<typename DeclType>
|
||||||
|
typename DeclType::Builder &add_output(StringRef name, StringRef identifier = "");
|
||||||
|
|
||||||
|
private:
|
||||||
|
template<typename DeclType>
|
||||||
|
typename DeclType::Builder &add_socket(StringRef name,
|
||||||
|
StringRef identifier,
|
||||||
|
Vector<SocketDeclarationPtr> &r_decls);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
@@ -99,27 +158,34 @@ inline NodeDeclarationBuilder::NodeDeclarationBuilder(NodeDeclaration &declarati
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename DeclType>
|
template<typename DeclType>
|
||||||
inline DeclType &NodeDeclarationBuilder::add_input(StringRef name, StringRef identifier)
|
inline typename DeclType::Builder &NodeDeclarationBuilder::add_input(StringRef name,
|
||||||
|
StringRef identifier)
|
||||||
{
|
{
|
||||||
static_assert(std::is_base_of_v<SocketDeclaration, DeclType>);
|
return this->add_socket<DeclType>(name, identifier, declaration_.inputs_);
|
||||||
std::unique_ptr<DeclType> socket_decl = std::make_unique<DeclType>();
|
|
||||||
DeclType &ref = *socket_decl;
|
|
||||||
ref.name_ = name;
|
|
||||||
ref.identifier_ = identifier.is_empty() ? name : identifier;
|
|
||||||
declaration_.inputs_.append(std::move(socket_decl));
|
|
||||||
return ref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename DeclType>
|
template<typename DeclType>
|
||||||
inline DeclType &NodeDeclarationBuilder::add_output(StringRef name, StringRef identifier)
|
inline typename DeclType::Builder &NodeDeclarationBuilder::add_output(StringRef name,
|
||||||
|
StringRef identifier)
|
||||||
|
{
|
||||||
|
return this->add_socket<DeclType>(name, identifier, declaration_.outputs_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DeclType>
|
||||||
|
inline typename DeclType::Builder &NodeDeclarationBuilder::add_socket(
|
||||||
|
StringRef name, StringRef identifier, Vector<SocketDeclarationPtr> &r_decls)
|
||||||
{
|
{
|
||||||
static_assert(std::is_base_of_v<SocketDeclaration, DeclType>);
|
static_assert(std::is_base_of_v<SocketDeclaration, DeclType>);
|
||||||
|
using Builder = typename DeclType::Builder;
|
||||||
std::unique_ptr<DeclType> socket_decl = std::make_unique<DeclType>();
|
std::unique_ptr<DeclType> socket_decl = std::make_unique<DeclType>();
|
||||||
DeclType &ref = *socket_decl;
|
std::unique_ptr<Builder> socket_decl_builder = std::make_unique<Builder>();
|
||||||
ref.name_ = name;
|
socket_decl_builder->decl_ = &*socket_decl;
|
||||||
ref.identifier_ = identifier.is_empty() ? name : identifier;
|
socket_decl->name_ = name;
|
||||||
declaration_.outputs_.append(std::move(socket_decl));
|
socket_decl->identifier_ = identifier.is_empty() ? name : identifier;
|
||||||
return ref;
|
r_decls.append(std::move(socket_decl));
|
||||||
|
Builder &socket_decl_builder_ref = *socket_decl_builder;
|
||||||
|
builders_.append(std::move(socket_decl_builder));
|
||||||
|
return socket_decl_builder_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
|
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
namespace blender::nodes::decl {
|
namespace blender::nodes::decl {
|
||||||
|
|
||||||
|
class FloatBuilder;
|
||||||
|
|
||||||
class Float : public SocketDeclaration {
|
class Float : public SocketDeclaration {
|
||||||
private:
|
private:
|
||||||
float default_value_ = 0.0f;
|
float default_value_ = 0.0f;
|
||||||
@@ -32,36 +34,45 @@ class Float : public SocketDeclaration {
|
|||||||
float soft_max_value_ = FLT_MAX;
|
float soft_max_value_ = FLT_MAX;
|
||||||
PropertySubType subtype_ = PROP_NONE;
|
PropertySubType subtype_ = PROP_NONE;
|
||||||
|
|
||||||
|
friend FloatBuilder;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Float &min(const float value)
|
using Builder = FloatBuilder;
|
||||||
{
|
|
||||||
soft_min_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Float &max(const float value)
|
|
||||||
{
|
|
||||||
soft_max_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Float &default_value(const float value)
|
|
||||||
{
|
|
||||||
default_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Float &subtype(PropertySubType subtype)
|
|
||||||
{
|
|
||||||
subtype_ = subtype;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
bool matches(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 &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class FloatBuilder : public SocketDeclarationBuilder<Float> {
|
||||||
|
public:
|
||||||
|
FloatBuilder &min(const float value)
|
||||||
|
{
|
||||||
|
decl_->soft_min_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
FloatBuilder &max(const float value)
|
||||||
|
{
|
||||||
|
decl_->soft_max_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
FloatBuilder &default_value(const float value)
|
||||||
|
{
|
||||||
|
decl_->default_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
FloatBuilder &subtype(PropertySubType subtype)
|
||||||
|
{
|
||||||
|
decl_->subtype_ = subtype;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class IntBuilder;
|
||||||
|
|
||||||
class Int : public SocketDeclaration {
|
class Int : public SocketDeclaration {
|
||||||
private:
|
private:
|
||||||
int default_value_ = 0;
|
int default_value_ = 0;
|
||||||
@@ -69,36 +80,45 @@ class Int : public SocketDeclaration {
|
|||||||
int soft_max_value_ = INT32_MAX;
|
int soft_max_value_ = INT32_MAX;
|
||||||
PropertySubType subtype_ = PROP_NONE;
|
PropertySubType subtype_ = PROP_NONE;
|
||||||
|
|
||||||
|
friend IntBuilder;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Int &min(const int value)
|
using Builder = IntBuilder;
|
||||||
{
|
|
||||||
soft_min_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Int &max(const int value)
|
|
||||||
{
|
|
||||||
soft_max_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Int &default_value(const int value)
|
|
||||||
{
|
|
||||||
default_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Int &subtype(PropertySubType subtype)
|
|
||||||
{
|
|
||||||
subtype_ = subtype;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
bool matches(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 &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IntBuilder : public SocketDeclarationBuilder<Int> {
|
||||||
|
public:
|
||||||
|
IntBuilder &min(const int value)
|
||||||
|
{
|
||||||
|
decl_->soft_min_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntBuilder &max(const int value)
|
||||||
|
{
|
||||||
|
decl_->soft_max_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntBuilder &default_value(const int value)
|
||||||
|
{
|
||||||
|
decl_->default_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntBuilder &subtype(PropertySubType subtype)
|
||||||
|
{
|
||||||
|
decl_->subtype_ = subtype;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class VectorBuilder;
|
||||||
|
|
||||||
class Vector : public SocketDeclaration {
|
class Vector : public SocketDeclaration {
|
||||||
private:
|
private:
|
||||||
float3 default_value_ = {0, 0, 0};
|
float3 default_value_ = {0, 0, 0};
|
||||||
@@ -106,160 +126,152 @@ class Vector : public SocketDeclaration {
|
|||||||
float soft_max_value_ = FLT_MAX;
|
float soft_max_value_ = FLT_MAX;
|
||||||
PropertySubType subtype_ = PROP_NONE;
|
PropertySubType subtype_ = PROP_NONE;
|
||||||
|
|
||||||
|
friend VectorBuilder;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Vector &default_value(const float3 value)
|
using Builder = VectorBuilder;
|
||||||
|
|
||||||
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
|
bool matches(const bNodeSocket &socket) const override;
|
||||||
|
bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class VectorBuilder : public SocketDeclarationBuilder<Vector> {
|
||||||
|
public:
|
||||||
|
VectorBuilder &default_value(const float3 value)
|
||||||
{
|
{
|
||||||
default_value_ = value;
|
decl_->default_value_ = value;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector &subtype(PropertySubType subtype)
|
VectorBuilder &subtype(PropertySubType subtype)
|
||||||
{
|
{
|
||||||
subtype_ = subtype;
|
decl_->subtype_ = subtype;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector &min(const float min)
|
VectorBuilder &min(const float min)
|
||||||
{
|
{
|
||||||
soft_min_value_ = min;
|
decl_->soft_min_value_ = min;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector &max(const float max)
|
VectorBuilder &max(const float max)
|
||||||
{
|
{
|
||||||
soft_max_value_ = max;
|
decl_->soft_max_value_ = max;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class BoolBuilder;
|
||||||
|
|
||||||
|
class Bool : public SocketDeclaration {
|
||||||
|
private:
|
||||||
|
bool default_value_ = false;
|
||||||
|
friend BoolBuilder;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Builder = BoolBuilder;
|
||||||
|
|
||||||
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
|
bool matches(const bNodeSocket &socket) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BoolBuilder : public SocketDeclarationBuilder<Bool> {
|
||||||
|
public:
|
||||||
|
BoolBuilder &default_value(const bool value)
|
||||||
|
{
|
||||||
|
decl_->default_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ColorBuilder;
|
||||||
|
|
||||||
|
class Color : public SocketDeclaration {
|
||||||
|
private:
|
||||||
|
ColorGeometry4f default_value_;
|
||||||
|
|
||||||
|
friend ColorBuilder;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Builder = ColorBuilder;
|
||||||
|
|
||||||
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
|
bool matches(const bNodeSocket &socket) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ColorBuilder : public SocketDeclarationBuilder<Color> {
|
||||||
|
public:
|
||||||
|
ColorBuilder &default_value(const ColorGeometry4f value)
|
||||||
|
{
|
||||||
|
decl_->default_value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class String : public SocketDeclaration {
|
||||||
|
public:
|
||||||
|
using Builder = SocketDeclarationBuilder<String>;
|
||||||
|
|
||||||
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
|
bool matches(const bNodeSocket &socket) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IDSocketDeclaration : public SocketDeclaration {
|
||||||
|
private:
|
||||||
|
const char *idname_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
IDSocketDeclaration(const char *idname) : idname_(idname)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
bool matches(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 &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Bool : public SocketDeclaration {
|
class Object : public IDSocketDeclaration {
|
||||||
private:
|
|
||||||
bool default_value_ = false;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bool &default_value(const bool value)
|
using Builder = SocketDeclarationBuilder<Object>;
|
||||||
{
|
|
||||||
default_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
Object() : IDSocketDeclaration("NodeSocketObject")
|
||||||
bool matches(const bNodeSocket &socket) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Color : public SocketDeclaration {
|
|
||||||
private:
|
|
||||||
ColorGeometry4f default_value_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Color &default_value(const ColorGeometry4f value)
|
|
||||||
{
|
|
||||||
default_value_ = value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
|
||||||
bool matches(const bNodeSocket &socket) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class String : public SocketDeclaration {
|
|
||||||
public:
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
|
||||||
bool matches(const bNodeSocket &socket) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
struct CommonIDSocketData {
|
|
||||||
const char *idname;
|
|
||||||
bool hide_label = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
bNodeSocket &build_id_socket(bNodeTree &ntree,
|
|
||||||
bNode &node,
|
|
||||||
eNodeSocketInOut in_out,
|
|
||||||
const CommonIDSocketData &data,
|
|
||||||
StringRefNull name,
|
|
||||||
StringRefNull identifier);
|
|
||||||
bool matches_id_socket(const bNodeSocket &socket,
|
|
||||||
const CommonIDSocketData &data,
|
|
||||||
StringRefNull name,
|
|
||||||
StringRefNull identifier);
|
|
||||||
|
|
||||||
template<typename Subtype> class IDSocketDeclaration : public SocketDeclaration {
|
|
||||||
private:
|
|
||||||
CommonIDSocketData data_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
IDSocketDeclaration(const char *idname) : data_({idname})
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Subtype &hide_label(bool value)
|
|
||||||
{
|
|
||||||
data_.hide_label = value;
|
|
||||||
return *(Subtype *)this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override
|
|
||||||
{
|
|
||||||
return build_id_socket(ntree, node, in_out, data_, name_, identifier_);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool matches(const bNodeSocket &socket) const override
|
|
||||||
{
|
|
||||||
return matches_id_socket(socket, data_, name_, identifier_);
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
|
|
||||||
{
|
|
||||||
if (StringRef(socket.idname) != data_.idname) {
|
|
||||||
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
|
|
||||||
}
|
|
||||||
if (data_.hide_label) {
|
|
||||||
socket.flag |= SOCK_HIDE_LABEL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
socket.flag &= ~SOCK_HIDE_LABEL;
|
|
||||||
}
|
|
||||||
return socket;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
class Object : public detail::IDSocketDeclaration<Object> {
|
|
||||||
public:
|
|
||||||
Object() : detail::IDSocketDeclaration<Object>("NodeSocketObject")
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Material : public detail::IDSocketDeclaration<Material> {
|
class Material : public IDSocketDeclaration {
|
||||||
public:
|
public:
|
||||||
Material() : detail::IDSocketDeclaration<Material>("NodeSocketMaterial")
|
using Builder = SocketDeclarationBuilder<Material>;
|
||||||
|
|
||||||
|
Material() : IDSocketDeclaration("NodeSocketMaterial")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Collection : public detail::IDSocketDeclaration<Collection> {
|
class Collection : public IDSocketDeclaration {
|
||||||
public:
|
public:
|
||||||
Collection() : detail::IDSocketDeclaration<Collection>("NodeSocketCollection")
|
using Builder = SocketDeclarationBuilder<Collection>;
|
||||||
|
|
||||||
|
Collection() : IDSocketDeclaration("NodeSocketCollection")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Texture : public detail::IDSocketDeclaration<Texture> {
|
class Texture : public IDSocketDeclaration {
|
||||||
public:
|
public:
|
||||||
Texture() : detail::IDSocketDeclaration<Texture>("NodeSocketTexture")
|
using Builder = SocketDeclarationBuilder<Texture>;
|
||||||
|
|
||||||
|
Texture() : IDSocketDeclaration("NodeSocketTexture")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Geometry : public SocketDeclaration {
|
class Geometry : public SocketDeclaration {
|
||||||
public:
|
public:
|
||||||
|
using Builder = SocketDeclarationBuilder<Geometry>;
|
||||||
|
|
||||||
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
|
||||||
bool matches(const bNodeSocket &socket) const override;
|
bool matches(const bNodeSocket &socket) const override;
|
||||||
};
|
};
|
||||||
|
@@ -16,28 +16,15 @@
|
|||||||
|
|
||||||
#include "node_geometry_util.hh"
|
#include "node_geometry_util.hh"
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_attribute_remove_in[] = {
|
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
|
||||||
{SOCK_STRING,
|
|
||||||
N_("Attribute"),
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
1.0f,
|
|
||||||
-1.0f,
|
|
||||||
1.0f,
|
|
||||||
PROP_NONE,
|
|
||||||
SOCK_MULTI_INPUT},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_attribute_remove_out[] = {
|
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace blender::nodes {
|
namespace blender::nodes {
|
||||||
|
|
||||||
|
static void geo_node_attribute_remove_declare(NodeDeclarationBuilder &b)
|
||||||
|
{
|
||||||
|
b.add_input<decl::Geometry>("Geometry");
|
||||||
|
b.add_input<decl::String>("Attribute").multi_input(true);
|
||||||
|
b.add_output<decl::Geometry>("Geometry");
|
||||||
|
}
|
||||||
|
|
||||||
static void remove_attribute(GeometryComponent &component,
|
static void remove_attribute(GeometryComponent &component,
|
||||||
GeoNodeExecParams ¶ms,
|
GeoNodeExecParams ¶ms,
|
||||||
Span<std::string> attribute_names)
|
Span<std::string> attribute_names)
|
||||||
@@ -85,7 +72,7 @@ void register_node_type_geo_attribute_remove()
|
|||||||
|
|
||||||
geo_node_type_base(
|
geo_node_type_base(
|
||||||
&ntype, GEO_NODE_ATTRIBUTE_REMOVE, "Attribute Remove", NODE_CLASS_ATTRIBUTE, 0);
|
&ntype, GEO_NODE_ATTRIBUTE_REMOVE, "Attribute Remove", NODE_CLASS_ATTRIBUTE, 0);
|
||||||
node_type_socket_templates(&ntype, geo_node_attribute_remove_in, geo_node_attribute_remove_out);
|
|
||||||
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_remove_exec;
|
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_remove_exec;
|
||||||
|
ntype.declare = blender::nodes::geo_node_attribute_remove_declare;
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
}
|
}
|
||||||
|
@@ -21,27 +21,26 @@
|
|||||||
#include "UI_interface.h"
|
#include "UI_interface.h"
|
||||||
#include "UI_resources.h"
|
#include "UI_resources.h"
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_attribute_vector_rotate_in[] = {
|
namespace blender::nodes {
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
|
||||||
{SOCK_STRING, N_("Vector")},
|
|
||||||
{SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
|
||||||
{SOCK_STRING, N_("Center")},
|
|
||||||
{SOCK_VECTOR, N_("Center"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_XYZ},
|
|
||||||
{SOCK_STRING, N_("Axis")},
|
|
||||||
{SOCK_VECTOR, N_("Axis"), 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_XYZ, PROP_NONE},
|
|
||||||
{SOCK_STRING, N_("Angle")},
|
|
||||||
{SOCK_FLOAT, N_("Angle"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_ANGLE, PROP_NONE},
|
|
||||||
{SOCK_STRING, N_("Rotation")},
|
|
||||||
{SOCK_VECTOR, N_("Rotation"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_EULER},
|
|
||||||
{SOCK_BOOLEAN, N_("Invert")},
|
|
||||||
{SOCK_STRING, N_("Result")},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_attribute_vector_rotate_out[] = {
|
static void geo_node_attribute_vector_rotate_declare(NodeDeclarationBuilder &b)
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
{
|
||||||
{-1, ""},
|
b.add_input<decl::Geometry>("Geometry");
|
||||||
};
|
b.add_input<decl::String>("Vector");
|
||||||
|
b.add_input<decl::Vector>("Vector", "Vector_001").min(0.0f).max(1.0f).hide_value(true);
|
||||||
|
b.add_input<decl::String>("Center");
|
||||||
|
b.add_input<decl::Vector>("Center", "Center_001").subtype(PROP_XYZ);
|
||||||
|
b.add_input<decl::String>("Axis");
|
||||||
|
b.add_input<decl::Vector>("Axis", "Axis_001").min(-1.0f).max(1.0f).subtype(PROP_XYZ);
|
||||||
|
b.add_input<decl::String>("Angle");
|
||||||
|
b.add_input<decl::Float>("Angle", "Angle_001").subtype(PROP_ANGLE);
|
||||||
|
b.add_input<decl::String>("Rotation");
|
||||||
|
b.add_input<decl::Vector>("Rotation", "Rotation_001").subtype(PROP_EULER);
|
||||||
|
b.add_input<decl::Bool>("Invert");
|
||||||
|
b.add_input<decl::String>("Result");
|
||||||
|
|
||||||
|
b.add_output<decl::Geometry>("Geometry");
|
||||||
|
}
|
||||||
|
|
||||||
static void geo_node_attribute_vector_rotate_layout(uiLayout *layout,
|
static void geo_node_attribute_vector_rotate_layout(uiLayout *layout,
|
||||||
bContext *UNUSED(C),
|
bContext *UNUSED(C),
|
||||||
@@ -71,8 +70,6 @@ static void geo_node_attribute_vector_rotate_layout(uiLayout *layout,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace blender::nodes {
|
|
||||||
|
|
||||||
static void geo_node_attribute_vector_rotate_update(bNodeTree *UNUSED(ntree), bNode *node)
|
static void geo_node_attribute_vector_rotate_update(bNodeTree *UNUSED(ntree), bNode *node)
|
||||||
{
|
{
|
||||||
const NodeAttributeVectorRotate *node_storage = (NodeAttributeVectorRotate *)node->storage;
|
const NodeAttributeVectorRotate *node_storage = (NodeAttributeVectorRotate *)node->storage;
|
||||||
@@ -339,14 +336,13 @@ void register_node_type_geo_attribute_vector_rotate()
|
|||||||
"Attribute Vector Rotate",
|
"Attribute Vector Rotate",
|
||||||
NODE_CLASS_ATTRIBUTE,
|
NODE_CLASS_ATTRIBUTE,
|
||||||
0);
|
0);
|
||||||
node_type_socket_templates(
|
|
||||||
&ntype, geo_node_attribute_vector_rotate_in, geo_node_attribute_vector_rotate_out);
|
|
||||||
node_type_update(&ntype, blender::nodes::geo_node_attribute_vector_rotate_update);
|
node_type_update(&ntype, blender::nodes::geo_node_attribute_vector_rotate_update);
|
||||||
node_type_init(&ntype, blender::nodes::geo_node_attribute_vector_rotate_init);
|
node_type_init(&ntype, blender::nodes::geo_node_attribute_vector_rotate_init);
|
||||||
node_type_size(&ntype, 165, 100, 600);
|
node_type_size(&ntype, 165, 100, 600);
|
||||||
node_type_storage(
|
node_type_storage(
|
||||||
&ntype, "NodeAttributeVectorRotate", node_free_standard_storage, node_copy_standard_storage);
|
&ntype, "NodeAttributeVectorRotate", node_free_standard_storage, node_copy_standard_storage);
|
||||||
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_vector_rotate_exec;
|
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_vector_rotate_exec;
|
||||||
ntype.draw_buttons = geo_node_attribute_vector_rotate_layout;
|
ntype.draw_buttons = blender::nodes::geo_node_attribute_vector_rotate_layout;
|
||||||
|
ntype.declare = blender::nodes::geo_node_attribute_vector_rotate_declare;
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
}
|
}
|
||||||
|
@@ -23,27 +23,16 @@
|
|||||||
|
|
||||||
#include "node_geometry_util.hh"
|
#include "node_geometry_util.hh"
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_boolean_in[] = {
|
namespace blender::nodes {
|
||||||
{SOCK_GEOMETRY, N_("Geometry 1")},
|
|
||||||
{SOCK_GEOMETRY,
|
|
||||||
N_("Geometry 2"),
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
PROP_NONE,
|
|
||||||
SOCK_MULTI_INPUT},
|
|
||||||
{SOCK_BOOLEAN, N_("Self Intersection")},
|
|
||||||
{SOCK_BOOLEAN, N_("Hole Tolerant")},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_boolean_out[] = {
|
static void geo_node_boolean_declare(NodeDeclarationBuilder &b)
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
{
|
||||||
{-1, ""},
|
b.add_input<decl::Geometry>("Geometry 1");
|
||||||
};
|
b.add_input<decl::Geometry>("Geometry 2").multi_input(true);
|
||||||
|
b.add_input<decl::Bool>("Self Intersection");
|
||||||
|
b.add_input<decl::Bool>("Hole Tolerant");
|
||||||
|
b.add_output<decl::Geometry>("Geometry");
|
||||||
|
}
|
||||||
|
|
||||||
static void geo_node_boolean_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
static void geo_node_boolean_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
||||||
{
|
{
|
||||||
@@ -77,8 +66,6 @@ static void geo_node_boolean_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||||||
node->custom1 = GEO_NODE_BOOLEAN_DIFFERENCE;
|
node->custom1 = GEO_NODE_BOOLEAN_DIFFERENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace blender::nodes {
|
|
||||||
|
|
||||||
static void geo_node_boolean_exec(GeoNodeExecParams params)
|
static void geo_node_boolean_exec(GeoNodeExecParams params)
|
||||||
{
|
{
|
||||||
GeometryNodeBooleanOperation operation = (GeometryNodeBooleanOperation)params.node().custom1;
|
GeometryNodeBooleanOperation operation = (GeometryNodeBooleanOperation)params.node().custom1;
|
||||||
@@ -138,10 +125,10 @@ void register_node_type_geo_boolean()
|
|||||||
static bNodeType ntype;
|
static bNodeType ntype;
|
||||||
|
|
||||||
geo_node_type_base(&ntype, GEO_NODE_BOOLEAN, "Boolean", NODE_CLASS_GEOMETRY, 0);
|
geo_node_type_base(&ntype, GEO_NODE_BOOLEAN, "Boolean", NODE_CLASS_GEOMETRY, 0);
|
||||||
node_type_socket_templates(&ntype, geo_node_boolean_in, geo_node_boolean_out);
|
ntype.declare = blender::nodes::geo_node_boolean_declare;
|
||||||
ntype.draw_buttons = geo_node_boolean_layout;
|
ntype.draw_buttons = blender::nodes::geo_node_boolean_layout;
|
||||||
ntype.updatefunc = geo_node_boolean_update;
|
ntype.updatefunc = blender::nodes::geo_node_boolean_update;
|
||||||
node_type_init(&ntype, geo_node_boolean_init);
|
node_type_init(&ntype, blender::nodes::geo_node_boolean_init);
|
||||||
ntype.geometry_node_execute = blender::nodes::geo_node_boolean_exec;
|
ntype.geometry_node_execute = blender::nodes::geo_node_boolean_exec;
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
}
|
}
|
||||||
|
@@ -29,27 +29,14 @@
|
|||||||
|
|
||||||
using blender::fn::GVArray_For_GSpan;
|
using blender::fn::GVArray_For_GSpan;
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_join_geometry_in[] = {
|
|
||||||
{SOCK_GEOMETRY,
|
|
||||||
N_("Geometry"),
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
1.0f,
|
|
||||||
-1.0f,
|
|
||||||
1.0f,
|
|
||||||
PROP_NONE,
|
|
||||||
SOCK_MULTI_INPUT},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static bNodeSocketTemplate geo_node_join_geometry_out[] = {
|
|
||||||
{SOCK_GEOMETRY, N_("Geometry")},
|
|
||||||
{-1, ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace blender::nodes {
|
namespace blender::nodes {
|
||||||
|
|
||||||
|
static void geo_node_join_geometry_declare(NodeDeclarationBuilder &b)
|
||||||
|
{
|
||||||
|
b.add_input<decl::Geometry>("Geometry").multi_input(true);
|
||||||
|
b.add_output<decl::Geometry>("Geometry");
|
||||||
|
}
|
||||||
|
|
||||||
static Mesh *join_mesh_topology_and_builtin_attributes(Span<const MeshComponent *> src_components)
|
static Mesh *join_mesh_topology_and_builtin_attributes(Span<const MeshComponent *> src_components)
|
||||||
{
|
{
|
||||||
int totverts = 0;
|
int totverts = 0;
|
||||||
@@ -508,7 +495,7 @@ void register_node_type_geo_join_geometry()
|
|||||||
static bNodeType ntype;
|
static bNodeType ntype;
|
||||||
|
|
||||||
geo_node_type_base(&ntype, GEO_NODE_JOIN_GEOMETRY, "Join Geometry", NODE_CLASS_GEOMETRY, 0);
|
geo_node_type_base(&ntype, GEO_NODE_JOIN_GEOMETRY, "Join Geometry", NODE_CLASS_GEOMETRY, 0);
|
||||||
node_type_socket_templates(&ntype, geo_node_join_geometry_in, geo_node_join_geometry_out);
|
|
||||||
ntype.geometry_node_execute = blender::nodes::geo_node_join_geometry_exec;
|
ntype.geometry_node_execute = blender::nodes::geo_node_join_geometry_exec;
|
||||||
|
ntype.declare = blender::nodes::geo_node_join_geometry_declare;
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#include "NOD_node_declaration.hh"
|
#include "NOD_node_declaration.hh"
|
||||||
|
|
||||||
|
#include "BKE_node.h"
|
||||||
|
|
||||||
namespace blender::nodes {
|
namespace blender::nodes {
|
||||||
|
|
||||||
void NodeDeclaration::build(bNodeTree &ntree, bNode &node) const
|
void NodeDeclaration::build(bNodeTree &ntree, bNode &node) const
|
||||||
@@ -62,4 +64,31 @@ bNodeSocket &SocketDeclaration::update_or_build(bNodeTree &ntree,
|
|||||||
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
|
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SocketDeclaration::set_common_flags(bNodeSocket &socket) const
|
||||||
|
{
|
||||||
|
SET_FLAG_FROM_TEST(socket.flag, hide_value_, SOCK_HIDE_VALUE);
|
||||||
|
SET_FLAG_FROM_TEST(socket.flag, hide_label_, SOCK_HIDE_LABEL);
|
||||||
|
SET_FLAG_FROM_TEST(socket.flag, is_multi_input_, SOCK_MULTI_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SocketDeclaration::matches_common_data(const bNodeSocket &socket) const
|
||||||
|
{
|
||||||
|
if (socket.name != name_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (socket.identifier != identifier_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (((socket.flag & SOCK_HIDE_VALUE) != 0) != hide_value_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (((socket.flag & SOCK_HIDE_LABEL) != 0) != hide_label_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (((socket.flag & SOCK_MULTI_INPUT) != 0) != is_multi_input_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace blender::nodes
|
} // namespace blender::nodes
|
||||||
|
@@ -38,6 +38,7 @@ bNodeSocket &Float::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_FLOAT, subtype_, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_FLOAT, subtype_, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
||||||
value.min = soft_min_value_;
|
value.min = soft_min_value_;
|
||||||
value.max = soft_max_value_;
|
value.max = soft_max_value_;
|
||||||
@@ -47,18 +48,15 @@ bNodeSocket &Float::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out
|
|||||||
|
|
||||||
bool Float::matches(const bNodeSocket &socket) const
|
bool Float::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_FLOAT) {
|
if (socket.type != SOCK_FLOAT) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
||||||
if (value.min != soft_min_value_) {
|
if (value.min != soft_min_value_) {
|
||||||
return false;
|
return false;
|
||||||
@@ -77,6 +75,7 @@ bNodeSocket &Float::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &
|
|||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
modify_subtype_except_for_storage(socket, subtype_);
|
modify_subtype_except_for_storage(socket, subtype_);
|
||||||
}
|
}
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
bNodeSocketValueFloat &value = *(bNodeSocketValueFloat *)socket.default_value;
|
||||||
value.min = soft_min_value_;
|
value.min = soft_min_value_;
|
||||||
value.max = soft_max_value_;
|
value.max = soft_max_value_;
|
||||||
@@ -92,6 +91,7 @@ bNodeSocket &Int::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_INT, subtype_, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_INT, subtype_, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
||||||
value.min = soft_min_value_;
|
value.min = soft_min_value_;
|
||||||
value.max = soft_max_value_;
|
value.max = soft_max_value_;
|
||||||
@@ -101,18 +101,15 @@ bNodeSocket &Int::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
|
|||||||
|
|
||||||
bool Int::matches(const bNodeSocket &socket) const
|
bool Int::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_INT) {
|
if (socket.type != SOCK_INT) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
||||||
if (value.min != soft_min_value_) {
|
if (value.min != soft_min_value_) {
|
||||||
return false;
|
return false;
|
||||||
@@ -131,6 +128,7 @@ bNodeSocket &Int::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &so
|
|||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
modify_subtype_except_for_storage(socket, subtype_);
|
modify_subtype_except_for_storage(socket, subtype_);
|
||||||
}
|
}
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
bNodeSocketValueInt &value = *(bNodeSocketValueInt *)socket.default_value;
|
||||||
value.min = soft_min_value_;
|
value.min = soft_min_value_;
|
||||||
value.max = soft_max_value_;
|
value.max = soft_max_value_;
|
||||||
@@ -146,6 +144,7 @@ bNodeSocket &Vector::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_ou
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_VECTOR, subtype_, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_VECTOR, subtype_, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueVector &value = *(bNodeSocketValueVector *)socket.default_value;
|
bNodeSocketValueVector &value = *(bNodeSocketValueVector *)socket.default_value;
|
||||||
copy_v3_v3(value.value, default_value_);
|
copy_v3_v3(value.value, default_value_);
|
||||||
value.min = soft_min_value_;
|
value.min = soft_min_value_;
|
||||||
@@ -155,18 +154,15 @@ bNodeSocket &Vector::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_ou
|
|||||||
|
|
||||||
bool Vector::matches(const bNodeSocket &socket) const
|
bool Vector::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_VECTOR) {
|
if (socket.type != SOCK_VECTOR) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,6 +174,7 @@ bNodeSocket &Vector::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket
|
|||||||
if (socket.typeinfo->subtype != subtype_) {
|
if (socket.typeinfo->subtype != subtype_) {
|
||||||
modify_subtype_except_for_storage(socket, subtype_);
|
modify_subtype_except_for_storage(socket, subtype_);
|
||||||
}
|
}
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueVector &value = *(bNodeSocketValueVector *)socket.default_value;
|
bNodeSocketValueVector &value = *(bNodeSocketValueVector *)socket.default_value;
|
||||||
value.subtype = subtype_;
|
value.subtype = subtype_;
|
||||||
STRNCPY(socket.name, name_.c_str());
|
STRNCPY(socket.name, name_.c_str());
|
||||||
@@ -192,6 +189,7 @@ bNodeSocket &Bool::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_BOOLEAN, PROP_NONE, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_BOOLEAN, PROP_NONE, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueBoolean &value = *(bNodeSocketValueBoolean *)socket.default_value;
|
bNodeSocketValueBoolean &value = *(bNodeSocketValueBoolean *)socket.default_value;
|
||||||
value.value = default_value_;
|
value.value = default_value_;
|
||||||
return socket;
|
return socket;
|
||||||
@@ -199,15 +197,12 @@ bNodeSocket &Bool::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
|
|||||||
|
|
||||||
bool Bool::matches(const bNodeSocket &socket) const
|
bool Bool::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_BOOLEAN) {
|
if (socket.type != SOCK_BOOLEAN) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,6 +214,7 @@ bNodeSocket &Color::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_RGBA, PROP_NONE, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_RGBA, PROP_NONE, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
bNodeSocketValueRGBA &value = *(bNodeSocketValueRGBA *)socket.default_value;
|
bNodeSocketValueRGBA &value = *(bNodeSocketValueRGBA *)socket.default_value;
|
||||||
copy_v4_v4(value.value, default_value_);
|
copy_v4_v4(value.value, default_value_);
|
||||||
return socket;
|
return socket;
|
||||||
@@ -226,15 +222,17 @@ bNodeSocket &Color::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out
|
|||||||
|
|
||||||
bool Color::matches(const bNodeSocket &socket) const
|
bool Color::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
if (socket.name != name_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (socket.identifier != identifier_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (socket.type != SOCK_RGBA) {
|
if (socket.type != SOCK_RGBA) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,20 +244,18 @@ bNodeSocket &String::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_ou
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddStaticSocket(
|
bNodeSocket &socket = *nodeAddStaticSocket(
|
||||||
&ntree, &node, in_out, SOCK_STRING, PROP_NONE, identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, SOCK_STRING, PROP_NONE, identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool String::matches(const bNodeSocket &socket) const
|
bool String::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_STRING) {
|
if (socket.type != SOCK_STRING) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,42 +263,37 @@ bool String::matches(const bNodeSocket &socket) const
|
|||||||
* IDSocketDeclaration.
|
* IDSocketDeclaration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace detail {
|
bNodeSocket &IDSocketDeclaration::build(bNodeTree &ntree,
|
||||||
bNodeSocket &build_id_socket(bNodeTree &ntree,
|
bNode &node,
|
||||||
bNode &node,
|
eNodeSocketInOut in_out) const
|
||||||
eNodeSocketInOut in_out,
|
|
||||||
const CommonIDSocketData &data,
|
|
||||||
StringRefNull name,
|
|
||||||
StringRefNull identifier)
|
|
||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddSocket(
|
bNodeSocket &socket = *nodeAddSocket(
|
||||||
&ntree, &node, in_out, data.idname, identifier.c_str(), name.c_str());
|
&ntree, &node, in_out, idname_, identifier_.c_str(), name_.c_str());
|
||||||
if (data.hide_label) {
|
this->set_common_flags(socket);
|
||||||
socket.flag |= SOCK_HIDE_LABEL;
|
|
||||||
}
|
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool matches_id_socket(const bNodeSocket &socket,
|
bool IDSocketDeclaration::matches(const bNodeSocket &socket) const
|
||||||
const CommonIDSocketData &data,
|
|
||||||
StringRefNull name,
|
|
||||||
StringRefNull identifier)
|
|
||||||
{
|
{
|
||||||
if (!STREQ(socket.idname, data.idname)) {
|
if (!this->matches_common_data(socket)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (data.hide_label != ((socket.flag & SOCK_HIDE_LABEL) != 0)) {
|
if (!STREQ(socket.idname, idname_)) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.name != name) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} // namespace detail
|
|
||||||
|
bNodeSocket &IDSocketDeclaration::update_or_build(bNodeTree &ntree,
|
||||||
|
bNode &node,
|
||||||
|
bNodeSocket &socket) const
|
||||||
|
{
|
||||||
|
if (StringRef(socket.idname) != idname_) {
|
||||||
|
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
|
||||||
|
}
|
||||||
|
this->set_common_flags(socket);
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* Geometry.
|
* Geometry.
|
||||||
@@ -312,20 +303,18 @@ bNodeSocket &Geometry::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_
|
|||||||
{
|
{
|
||||||
bNodeSocket &socket = *nodeAddSocket(
|
bNodeSocket &socket = *nodeAddSocket(
|
||||||
&ntree, &node, in_out, "NodeSocketGeometry", identifier_.c_str(), name_.c_str());
|
&ntree, &node, in_out, "NodeSocketGeometry", identifier_.c_str(), name_.c_str());
|
||||||
|
this->set_common_flags(socket);
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Geometry::matches(const bNodeSocket &socket) const
|
bool Geometry::matches(const bNodeSocket &socket) const
|
||||||
{
|
{
|
||||||
|
if (!this->matches_common_data(socket)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (socket.type != SOCK_GEOMETRY) {
|
if (socket.type != SOCK_GEOMETRY) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (socket.name != name_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (socket.identifier != identifier_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user