tornavis/source/blender/nodes/intern/node_register.cc

116 lines
3.6 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BLI_string.h"
#include "NOD_geometry.hh"
#include "NOD_register.hh"
#include "NOD_socket.hh"
#include "BKE_node.hh"
#include "BLT_translation.hh"
#include "UI_resources.hh"
static bool node_undefined_poll(const bNodeType * /*ntype*/,
const bNodeTree * /*nodetree*/,
const char ** /*r_disabled_hint*/)
{
/* this type can not be added deliberately, it's just a placeholder */
return false;
}
/* register fallback types used for undefined tree, nodes, sockets */
static void register_undefined_types()
{
/* NOTE: these types are not registered in the type hashes,
* they are just used as placeholders in case the actual types are not registered.
*/
blender::bke::NodeTreeTypeUndefined.type = NTREE_UNDEFINED;
STRNCPY(blender::bke::NodeTreeTypeUndefined.idname, "NodeTreeUndefined");
STRNCPY(blender::bke::NodeTreeTypeUndefined.ui_name, N_("Undefined"));
STRNCPY(blender::bke::NodeTreeTypeUndefined.ui_description, N_("Undefined Node Tree Type"));
node_type_base_custom(
&blender::bke::NodeTypeUndefined, "NodeUndefined", "Undefined", "UNDEFINED", 0);
blender::bke::NodeTypeUndefined.poll = node_undefined_poll;
STRNCPY(blender::bke::NodeSocketTypeUndefined.idname, "NodeSocketUndefined");
/* extra type info for standard socket types */
blender::bke::NodeSocketTypeUndefined.type = SOCK_CUSTOM;
blender::bke::NodeSocketTypeUndefined.subtype = PROP_NONE;
blender::bke::NodeSocketTypeUndefined.use_link_limits_of_type = true;
blender::bke::NodeSocketTypeUndefined.input_link_limit = 0xFFF;
blender::bke::NodeSocketTypeUndefined.output_link_limit = 0xFFF;
}
class SimulationZoneType : public blender::bke::bNodeZoneType {
public:
SimulationZoneType()
{
this->input_idname = "GeometryNodeSimulationInput";
this->output_idname = "GeometryNodeSimulationOutput";
this->input_type = GEO_NODE_SIMULATION_INPUT;
this->output_type = GEO_NODE_SIMULATION_OUTPUT;
this->theme_id = TH_NODE_ZONE_SIMULATION;
}
const int &get_corresponding_output_id(const bNode &input_bnode) const override
{
BLI_assert(input_bnode.type == this->input_type);
return static_cast<NodeGeometrySimulationInput *>(input_bnode.storage)->output_node_id;
}
};
class RepeatZoneType : public blender::bke::bNodeZoneType {
public:
RepeatZoneType()
{
this->input_idname = "GeometryNodeRepeatInput";
this->output_idname = "GeometryNodeRepeatOutput";
this->input_type = GEO_NODE_REPEAT_INPUT;
this->output_type = GEO_NODE_REPEAT_OUTPUT;
this->theme_id = TH_NODE_ZONE_REPEAT;
}
const int &get_corresponding_output_id(const bNode &input_bnode) const override
{
BLI_assert(input_bnode.type == this->input_type);
return static_cast<NodeGeometryRepeatInput *>(input_bnode.storage)->output_node_id;
}
};
static void register_zone_types()
{
static SimulationZoneType simulation_zone_type;
static RepeatZoneType repeat_zone_type;
blender::bke::register_node_zone_type(simulation_zone_type);
blender::bke::register_node_zone_type(repeat_zone_type);
}
void register_nodes()
{
register_zone_types();
register_undefined_types();
register_standard_node_socket_types();
register_node_tree_type_geo();
register_node_type_frame();
register_node_type_reroute();
register_node_type_group_input();
register_node_type_group_output();
register_composite_nodes();
register_shader_nodes();
register_texture_nodes();
register_geometry_nodes();
register_function_nodes();
}