This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/nodes/NOD_socket_declarations.hh
Jacques Lucke 0f48b37aae Revert moving all shader nodes to c++
This reverts to following commits:
* rB5cad004d716da02f511bd34983ac7da820308676
* rB97e3a2d935ba9b21b127eda7ca104d4bcf4e48bd
* rBf60b95b5320f8d6abe6a629fe8fc4f1b94d0d91c
* rB0bd3cad04edf4bf9b9d3b1353f955534aa5e6740
* rBf72cc47d8edf849af98e196f721022bacf86a5e7
* rB3f7014ecc9d523997062eadd62888af5fc70a2b6
* rB0578921063fbb081239439062215f2538a31af4b
* rBc20098e6ec6adee874a12e510aa4a56d89f92838
* rBd5efda72f501ad95679d7ac554086a1fb18c1ac0

The original move to c++ that the other commits depended upon had some issues
that should be fixed before committing it again. The issues were reported in
T93797, T93809 and T93798.

We should also find a better rule for not using c-style casts going forward,
although that wouldn't have been reason enough to revert the commits.
Introducing something like a `MEM_new<T>` and `MEM_delete<T>`
function might help with the the most common case of casting the return
type of `MEM_malloc`.

Going forward, I recommend first committing the changes that don't
require converting files to c++. Then convert the shading node files
in smaller chunks. Especially don't mix fairly low risk changes like
moving some simple nodes, with higher risk changes.
2021-12-07 13:26:39 +01:00

379 lines
8.8 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#pragma once
#include "NOD_node_declaration.hh"
#include "RNA_types.h"
#include "BLI_color.hh"
#include "BLI_float3.hh"
namespace blender::nodes::decl {
class FloatBuilder;
class Float : public SocketDeclaration {
private:
float default_value_ = 0.0f;
float soft_min_value_ = -FLT_MAX;
float soft_max_value_ = FLT_MAX;
PropertySubType subtype_ = PROP_NONE;
friend FloatBuilder;
public:
using Builder = FloatBuilder;
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 FloatBuilder : public SocketDeclarationBuilder<Float> {
public:
FloatBuilder &min(const float value);
FloatBuilder &max(const float value);
FloatBuilder &default_value(const float value);
FloatBuilder &subtype(PropertySubType subtype);
};
class IntBuilder;
class Int : public SocketDeclaration {
private:
int default_value_ = 0;
int soft_min_value_ = INT32_MIN;
int soft_max_value_ = INT32_MAX;
PropertySubType subtype_ = PROP_NONE;
friend IntBuilder;
public:
using Builder = IntBuilder;
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 IntBuilder : public SocketDeclarationBuilder<Int> {
public:
IntBuilder &min(const int value);
IntBuilder &max(const int value);
IntBuilder &default_value(const int value);
IntBuilder &subtype(PropertySubType subtype);
};
class VectorBuilder;
class Vector : public SocketDeclaration {
private:
float3 default_value_ = {0, 0, 0};
float soft_min_value_ = -FLT_MAX;
float soft_max_value_ = FLT_MAX;
PropertySubType subtype_ = PROP_NONE;
friend VectorBuilder;
public:
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);
VectorBuilder &subtype(PropertySubType subtype);
VectorBuilder &min(const float min);
VectorBuilder &max(const float max);
VectorBuilder &compact();
};
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);
};
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);
};
class StringBuilder;
class String : public SocketDeclaration {
private:
std::string default_value_;
friend StringBuilder;
public:
using Builder = StringBuilder;
bNodeSocket &build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) const override;
bool matches(const bNodeSocket &socket) const override;
};
class StringBuilder : public SocketDeclarationBuilder<String> {
public:
StringBuilder &default_value(const std::string value);
};
class IDSocketDeclaration : public SocketDeclaration {
private:
const char *idname_;
public:
IDSocketDeclaration(const char *idname);
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 Object : public IDSocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Object>;
Object();
};
class Material : public IDSocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Material>;
Material();
};
class Collection : public IDSocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Collection>;
Collection();
};
class Texture : public IDSocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Texture>;
Texture();
};
class Image : public IDSocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Image>;
Image();
};
/* -------------------------------------------------------------------- */
/** \name #FloatBuilder Inline Methods
* \{ */
inline FloatBuilder &FloatBuilder::min(const float value)
{
decl_->soft_min_value_ = value;
return *this;
}
inline FloatBuilder &FloatBuilder::max(const float value)
{
decl_->soft_max_value_ = value;
return *this;
}
inline FloatBuilder &FloatBuilder::default_value(const float value)
{
decl_->default_value_ = value;
return *this;
}
inline FloatBuilder &FloatBuilder::subtype(PropertySubType subtype)
{
decl_->subtype_ = subtype;
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #IntBuilder Inline Methods
* \{ */
inline IntBuilder &IntBuilder::min(const int value)
{
decl_->soft_min_value_ = value;
return *this;
}
inline IntBuilder &IntBuilder::max(const int value)
{
decl_->soft_max_value_ = value;
return *this;
}
inline IntBuilder &IntBuilder::default_value(const int value)
{
decl_->default_value_ = value;
return *this;
}
inline IntBuilder &IntBuilder::subtype(PropertySubType subtype)
{
decl_->subtype_ = subtype;
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #VectorBuilder Inline Methods
* \{ */
inline VectorBuilder &VectorBuilder::default_value(const float3 value)
{
decl_->default_value_ = value;
return *this;
}
inline VectorBuilder &VectorBuilder::subtype(PropertySubType subtype)
{
decl_->subtype_ = subtype;
return *this;
}
inline VectorBuilder &VectorBuilder::min(const float min)
{
decl_->soft_min_value_ = min;
return *this;
}
inline VectorBuilder &VectorBuilder::max(const float max)
{
decl_->soft_max_value_ = max;
return *this;
}
inline VectorBuilder &VectorBuilder::compact()
{
decl_->compact_ = true;
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #BoolBuilder Inline Methods
* \{ */
inline BoolBuilder &BoolBuilder::default_value(const bool value)
{
decl_->default_value_ = value;
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #ColorBuilder Inline Methods
* \{ */
inline ColorBuilder &ColorBuilder::default_value(const ColorGeometry4f value)
{
decl_->default_value_ = value;
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #StringBuilder Inline Methods
* \{ */
inline StringBuilder &StringBuilder::default_value(std::string value)
{
decl_->default_value_ = std::move(value);
return *this;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #IDSocketDeclaration and Children Inline Methods
* \{ */
inline IDSocketDeclaration::IDSocketDeclaration(const char *idname) : idname_(idname)
{
}
inline Object::Object() : IDSocketDeclaration("NodeSocketObject")
{
}
inline Material::Material() : IDSocketDeclaration("NodeSocketMaterial")
{
}
inline Collection::Collection() : IDSocketDeclaration("NodeSocketCollection")
{
}
inline Texture::Texture() : IDSocketDeclaration("NodeSocketTexture")
{
}
inline Image::Image() : IDSocketDeclaration("NodeSocketImage")
{
}
/** \} */
} // namespace blender::nodes::decl