Cleanup: Add macro and functions for node storage
The `node_storage` functions to retrieve const and mutable structs from a node are generated by a short macro that can be placed at the top of each relevant file. I use this in D8286 to make code snippets in the socket declarations much shorter, but I thought it would be good to use it consistently everywhere else too. The functions are also useful to avoid copy and paste errors, like the one corrected in the cylinder node in this commit. Differential Revision: https://developer.blender.org/D13491
This commit is contained in:
parent
6a9775ec6f
commit
2309fa20af
|
@ -1759,3 +1759,13 @@ extern struct bNodeSocketType NodeSocketTypeUndefined;
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define NODE_STORAGE_FUNCS(StorageT) \
|
||||
[[maybe_unused]] static StorageT &node_storage(bNode &node) \
|
||||
{ \
|
||||
return *static_cast<StorageT *>(node.storage); \
|
||||
} \
|
||||
[[maybe_unused]] static const StorageT &node_storage(const bNode &node) \
|
||||
{ \
|
||||
return *static_cast<const StorageT *>(node.storage); \
|
||||
}
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
|
||||
namespace blender::nodes {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeRandomValue)
|
||||
|
||||
static void fn_node_random_value_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Vector>(N_("Min")).supports_field();
|
||||
|
@ -65,7 +67,7 @@ static void fn_node_random_value_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void fn_node_random_value_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeRandomValue &storage = *(const NodeRandomValue *)node->storage;
|
||||
const NodeRandomValue &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
|
||||
bNodeSocket *sock_min_vector = (bNodeSocket *)node->inputs.first;
|
||||
|
@ -251,7 +253,7 @@ class RandomBoolFunction : public fn::MultiFunction {
|
|||
|
||||
static void fn_node_random_value_build_multi_function(NodeMultiFunctionBuilder &builder)
|
||||
{
|
||||
const NodeRandomValue &storage = *(const NodeRandomValue *)builder.node().storage;
|
||||
const NodeRandomValue &storage = node_storage(builder.node());
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
|
||||
switch (data_type) {
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_attribute_capture_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryAttributeCapture)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Geometry"));
|
||||
|
@ -60,8 +62,7 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryAttributeCapture &storage = *(const NodeGeometryAttributeCapture *)
|
||||
node->storage;
|
||||
const NodeGeometryAttributeCapture &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
|
||||
bNodeSocket *socket_value_geometry = (bNodeSocket *)node->inputs.first;
|
||||
|
@ -115,9 +116,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
{
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
|
||||
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryAttributeCapture &storage = *(const NodeGeometryAttributeCapture *)
|
||||
node.storage;
|
||||
const NodeGeometryAttributeCapture &storage = node_storage(params.node());
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain);
|
||||
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_collection_info_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCollectionInfo)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Collection>(N_("Collection")).hide_label();
|
||||
|
@ -78,9 +80,8 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
const bNode &bnode = params.node();
|
||||
NodeGeometryCollectionInfo *node_storage = (NodeGeometryCollectionInfo *)bnode.storage;
|
||||
const bool use_relative_transform = (node_storage->transform_space ==
|
||||
const NodeGeometryCollectionInfo &storage = node_storage(params.node());
|
||||
const bool use_relative_transform = (storage.transform_space ==
|
||||
GEO_NODE_TRANSFORM_SPACE_RELATIVE);
|
||||
|
||||
GeometrySet geometry_set_out;
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_fill_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveFill)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -151,7 +153,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
{
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
|
||||
const NodeGeometryCurveFill &storage = *(const NodeGeometryCurveFill *)params.node().storage;
|
||||
const NodeGeometryCurveFill &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveFillMode mode = (GeometryNodeCurveFillMode)storage.mode;
|
||||
|
||||
geometry_set.modify_geometry_sets(
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_fillet_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveFillet)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -78,8 +80,8 @@ struct FilletData {
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryCurveFillet &node_storage = *(NodeGeometryCurveFillet *)node->storage;
|
||||
const GeometryNodeCurveFilletMode mode = (GeometryNodeCurveFilletMode)node_storage.mode;
|
||||
const NodeGeometryCurveFillet &storage = node_storage(*node);
|
||||
const GeometryNodeCurveFilletMode mode = (GeometryNodeCurveFilletMode)storage.mode;
|
||||
|
||||
bNodeSocket *poly_socket = ((bNodeSocket *)node->inputs.first)->next;
|
||||
|
||||
|
@ -614,8 +616,8 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
{
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
|
||||
NodeGeometryCurveFillet &node_storage = *(NodeGeometryCurveFillet *)params.node().storage;
|
||||
const GeometryNodeCurveFilletMode mode = (GeometryNodeCurveFilletMode)node_storage.mode;
|
||||
const NodeGeometryCurveFillet &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveFilletMode mode = (GeometryNodeCurveFilletMode)storage.mode;
|
||||
|
||||
Field<float> radius_field = params.extract_input<Field<float>>("Radius");
|
||||
const bool limit_radius = params.extract_input<bool>("Limit Radius");
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_handle_type_selection_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveSelectHandles)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_output<decl::Bool>(N_("Selection")).field_source();
|
||||
|
@ -136,11 +138,10 @@ class HandleTypeFieldInput final : public GeometryFieldInput {
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurveSelectHandles *storage =
|
||||
(const NodeGeometryCurveSelectHandles *)params.node().storage;
|
||||
const NodeGeometryCurveSelectHandles &storage = node_storage(params.node());
|
||||
const BezierSpline::HandleType handle_type = handle_type_from_input_type(
|
||||
(GeometryNodeCurveHandleType)storage->handle_type);
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)storage->mode;
|
||||
(GeometryNodeCurveHandleType)storage.handle_type);
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)storage.mode;
|
||||
|
||||
Field<bool> selection_field{std::make_shared<HandleTypeFieldInput>(handle_type, mode)};
|
||||
params.set_output("Selection", std::move(selection_field));
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_primitive_bezier_segment_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurvePrimitiveBezierSegment)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Resolution"))
|
||||
|
@ -120,10 +122,9 @@ static std::unique_ptr<CurveEval> create_bezier_segment_curve(
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurvePrimitiveBezierSegment *node_storage =
|
||||
(NodeGeometryCurvePrimitiveBezierSegment *)params.node().storage;
|
||||
const NodeGeometryCurvePrimitiveBezierSegment &storage = node_storage(params.node());
|
||||
const GeometryNodeCurvePrimitiveBezierSegmentMode mode =
|
||||
(const GeometryNodeCurvePrimitiveBezierSegmentMode)node_storage->mode;
|
||||
(const GeometryNodeCurvePrimitiveBezierSegmentMode)storage.mode;
|
||||
|
||||
std::unique_ptr<CurveEval> curve = create_bezier_segment_curve(
|
||||
params.extract_input<float3>("Start"),
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_primitive_circle_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurvePrimitiveCircle)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Resolution"))
|
||||
|
@ -73,10 +75,9 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryCurvePrimitiveCircle *node_storage = (NodeGeometryCurvePrimitiveCircle *)
|
||||
node->storage;
|
||||
const GeometryNodeCurvePrimitiveCircleMode mode = (const GeometryNodeCurvePrimitiveCircleMode)
|
||||
node_storage->mode;
|
||||
const NodeGeometryCurvePrimitiveCircle &storage = node_storage(*node);
|
||||
const GeometryNodeCurvePrimitiveCircleMode mode = (GeometryNodeCurvePrimitiveCircleMode)
|
||||
storage.mode;
|
||||
|
||||
bNodeSocket *start_socket = ((bNodeSocket *)node->inputs.first)->next;
|
||||
bNodeSocket *middle_socket = start_socket->next;
|
||||
|
@ -195,11 +196,9 @@ static std::unique_ptr<CurveEval> create_radius_circle_curve(const int resolutio
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurvePrimitiveCircle *node_storage =
|
||||
(NodeGeometryCurvePrimitiveCircle *)params.node().storage;
|
||||
|
||||
const NodeGeometryCurvePrimitiveCircle &storage = node_storage(params.node());
|
||||
const GeometryNodeCurvePrimitiveCircleMode mode = (GeometryNodeCurvePrimitiveCircleMode)
|
||||
node_storage->mode;
|
||||
storage.mode;
|
||||
|
||||
std::unique_ptr<CurveEval> curve;
|
||||
if (mode == GEO_NODE_CURVE_PRIMITIVE_CIRCLE_TYPE_POINTS) {
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_primitive_line_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurvePrimitiveLine)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Vector>(N_("Start"))
|
||||
|
@ -59,10 +61,8 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryCurvePrimitiveLine *node_storage = (NodeGeometryCurvePrimitiveLine *)
|
||||
node->storage;
|
||||
const GeometryNodeCurvePrimitiveLineMode mode = (const GeometryNodeCurvePrimitiveLineMode)
|
||||
node_storage->mode;
|
||||
const NodeGeometryCurvePrimitiveLine &storage = node_storage(*node);
|
||||
const GeometryNodeCurvePrimitiveLineMode mode = (GeometryNodeCurvePrimitiveLineMode)storage.mode;
|
||||
|
||||
bNodeSocket *p2_socket = ((bNodeSocket *)node->inputs.first)->next;
|
||||
bNodeSocket *direction_socket = p2_socket->next;
|
||||
|
@ -112,11 +112,8 @@ static std::unique_ptr<CurveEval> create_direction_line_curve(const float3 start
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
|
||||
const NodeGeometryCurvePrimitiveLine *node_storage =
|
||||
(NodeGeometryCurvePrimitiveLine *)params.node().storage;
|
||||
|
||||
GeometryNodeCurvePrimitiveLineMode mode = (GeometryNodeCurvePrimitiveLineMode)node_storage->mode;
|
||||
const NodeGeometryCurvePrimitiveLine &storage = node_storage(params.node());
|
||||
const GeometryNodeCurvePrimitiveLineMode mode = (GeometryNodeCurvePrimitiveLineMode)storage.mode;
|
||||
|
||||
std::unique_ptr<CurveEval> curve;
|
||||
if (mode == GEO_NODE_CURVE_PRIMITIVE_LINE_MODE_POINTS) {
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_primitive_quadrilaterial_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurvePrimitiveQuad)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Float>(N_("Width"))
|
||||
|
@ -92,9 +94,9 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryCurvePrimitiveQuad &node_storage = *(NodeGeometryCurvePrimitiveQuad *)node->storage;
|
||||
const NodeGeometryCurvePrimitiveQuad &storage = node_storage(*node);
|
||||
GeometryNodeCurvePrimitiveQuadMode mode = static_cast<GeometryNodeCurvePrimitiveQuadMode>(
|
||||
node_storage.mode);
|
||||
storage.mode);
|
||||
|
||||
bNodeSocket *width = ((bNodeSocket *)node->inputs.first);
|
||||
bNodeSocket *height = width->next;
|
||||
|
@ -197,10 +199,8 @@ static void create_kite_curve(MutableSpan<float3> positions,
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurvePrimitiveQuad &node_storage =
|
||||
*(NodeGeometryCurvePrimitiveQuad *)(params.node()).storage;
|
||||
const GeometryNodeCurvePrimitiveQuadMode mode = static_cast<GeometryNodeCurvePrimitiveQuadMode>(
|
||||
node_storage.mode);
|
||||
const NodeGeometryCurvePrimitiveQuad &storage = node_storage(params.node());
|
||||
const GeometryNodeCurvePrimitiveQuadMode mode = (GeometryNodeCurvePrimitiveQuadMode)storage.mode;
|
||||
|
||||
std::unique_ptr<CurveEval> curve = std::make_unique<CurveEval>();
|
||||
std::unique_ptr<PolySpline> spline = std::make_unique<PolySpline>();
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_resample_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveResample)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -57,8 +59,8 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryCurveResample &node_storage = *(NodeGeometryCurveResample *)node->storage;
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveResample &storage = node_storage(*node);
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)storage.mode;
|
||||
|
||||
bNodeSocket *count_socket = ((bNodeSocket *)node->inputs.first)->next->next;
|
||||
bNodeSocket *length_socket = count_socket->next;
|
||||
|
@ -259,8 +261,8 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
{
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
|
||||
NodeGeometryCurveResample &node_storage = *(NodeGeometryCurveResample *)params.node().storage;
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveResample &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)storage.mode;
|
||||
|
||||
SampleModeParam mode_param;
|
||||
mode_param.mode = mode;
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_sample_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveSample)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve"))
|
||||
|
@ -53,8 +55,8 @@ static void node_type_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryCurveSample &node_storage = *(NodeGeometryCurveSample *)node->storage;
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveSample &storage = node_storage(*node);
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
|
||||
|
||||
bNodeSocket *factor = ((bNodeSocket *)node->inputs.first)->next;
|
||||
bNodeSocket *length = factor->next;
|
||||
|
@ -200,8 +202,8 @@ class SampleCurveFunction : public fn::MultiFunction {
|
|||
static Field<float> get_length_input_field(const GeoNodeExecParams ¶ms,
|
||||
const float curve_total_length)
|
||||
{
|
||||
const NodeGeometryCurveSample &node_storage = *(NodeGeometryCurveSample *)params.node().storage;
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveSample &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
|
||||
|
||||
if (mode == GEO_NODE_CURVE_SAMPLE_LENGTH) {
|
||||
/* Just make sure the length is in bounds of the curve. */
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_set_handles_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveSetHandles)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -64,10 +66,9 @@ static BezierSpline::HandleType handle_type_from_input_type(GeometryNodeCurveHan
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurveSetHandles *node_storage =
|
||||
(NodeGeometryCurveSetHandles *)params.node().storage;
|
||||
const GeometryNodeCurveHandleType type = (GeometryNodeCurveHandleType)node_storage->handle_type;
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)node_storage->mode;
|
||||
const NodeGeometryCurveSetHandles &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveHandleType type = (GeometryNodeCurveHandleType)storage.handle_type;
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)storage.mode;
|
||||
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_curve_spline_type_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveSplineType)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -238,9 +240,8 @@ static SplinePtr convert_to_nurbs(const Spline &input)
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurveSplineType *storage =
|
||||
(const NodeGeometryCurveSplineType *)params.node().storage;
|
||||
const GeometryNodeSplineType output_type = (const GeometryNodeSplineType)storage->spline_type;
|
||||
const NodeGeometryCurveSplineType &storage = node_storage(params.node());
|
||||
const GeometryNodeSplineType output_type = (const GeometryNodeSplineType)storage.spline_type;
|
||||
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
|
||||
|
|
|
@ -42,6 +42,8 @@ void curve_create_default_rotation_attribute(Span<float3> tangents,
|
|||
|
||||
namespace blender::nodes::node_geo_curve_to_points_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveToPoints)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -69,8 +71,8 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryCurveToPoints &node_storage = *(NodeGeometryCurveToPoints *)node->storage;
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveToPoints &storage = node_storage(*node);
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)storage.mode;
|
||||
|
||||
bNodeSocket *count_socket = ((bNodeSocket *)node->inputs.first)->next;
|
||||
bNodeSocket *length_socket = count_socket->next;
|
||||
|
@ -305,8 +307,8 @@ static void copy_spline_domain_attributes(const CurveEval &curve,
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
NodeGeometryCurveToPoints &node_storage = *(NodeGeometryCurveToPoints *)params.node().storage;
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveToPoints &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)storage.mode;
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
|
||||
AnonymousAttributeIDs attribute_outputs;
|
||||
|
|
|
@ -26,6 +26,8 @@ namespace blender::nodes::node_geo_curve_trim_cc {
|
|||
|
||||
using blender::attribute_math::mix2;
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryCurveTrim)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -64,8 +66,8 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryCurveTrim &node_storage = *(NodeGeometryCurveTrim *)node->storage;
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveTrim &storage = node_storage(*node);
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
|
||||
|
||||
bNodeSocket *start_fac = ((bNodeSocket *)node->inputs.first)->next;
|
||||
bNodeSocket *end_fac = start_fac->next;
|
||||
|
@ -534,8 +536,8 @@ static void geometry_set_curve_trim(GeometrySet &geometry_set,
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryCurveTrim &node_storage = *(NodeGeometryCurveTrim *)params.node().storage;
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode;
|
||||
const NodeGeometryCurveTrim &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
|
||||
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
|
||||
|
|
|
@ -1279,6 +1279,8 @@ void separate_geometry(GeometrySet &geometry_set,
|
|||
|
||||
namespace blender::nodes::node_geo_delete_geometry_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryDeleteGeometry)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Geometry"));
|
||||
|
@ -1293,7 +1295,7 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
||||
{
|
||||
const bNode *node = static_cast<bNode *>(ptr->data);
|
||||
const NodeGeometryDeleteGeometry &storage = *(const NodeGeometryDeleteGeometry *)node->storage;
|
||||
const NodeGeometryDeleteGeometry &storage = node_storage(*node);
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain);
|
||||
|
||||
uiItemR(layout, ptr, "domain", 0, "", ICON_NONE);
|
||||
|
@ -1319,11 +1321,9 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
|
||||
const Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
|
||||
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryDeleteGeometry &storage = *(const NodeGeometryDeleteGeometry *)node.storage;
|
||||
const NodeGeometryDeleteGeometry &storage = node_storage(params.node());
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain);
|
||||
const GeometryNodeDeleteGeometryMode mode = static_cast<GeometryNodeDeleteGeometryMode>(
|
||||
storage.mode);
|
||||
const GeometryNodeDeleteGeometryMode mode = (GeometryNodeDeleteGeometryMode)storage.mode;
|
||||
|
||||
bool all_is_error = false;
|
||||
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_image_texture_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryImageTexture)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Image>(N_("Image")).hide_label();
|
||||
|
@ -378,8 +380,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
const bNode &node = params.node();
|
||||
NodeGeometryImageTexture *data = (NodeGeometryImageTexture *)node.storage;
|
||||
const NodeGeometryImageTexture &storage = node_storage(params.node());
|
||||
|
||||
ImageUser image_user;
|
||||
BKE_imageuser_default(&image_user);
|
||||
|
@ -391,7 +392,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
std::unique_ptr<ImageFieldsFunction> image_fn;
|
||||
try {
|
||||
image_fn = std::make_unique<ImageFieldsFunction>(
|
||||
data->interpolation, data->extension, *image, image_user);
|
||||
storage.interpolation, storage.extension, *image, image_user);
|
||||
}
|
||||
catch (const std::runtime_error &) {
|
||||
params.set_default_remaining_outputs();
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_mesh_primitive_circle_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryMeshCircle)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Vertices"))
|
||||
|
@ -199,11 +201,8 @@ static Mesh *create_circle_mesh(const float radius,
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryMeshCircle &storage = *(const NodeGeometryMeshCircle *)node.storage;
|
||||
|
||||
const GeometryNodeMeshCircleFillType fill_type = (const GeometryNodeMeshCircleFillType)
|
||||
storage.fill_type;
|
||||
const NodeGeometryMeshCircle &storage = node_storage(params.node());
|
||||
const GeometryNodeMeshCircleFillType fill = (GeometryNodeMeshCircleFillType)storage.fill_type;
|
||||
|
||||
const float radius = params.extract_input<float>("Radius");
|
||||
const int verts_num = params.extract_input<int>("Vertices");
|
||||
|
@ -213,7 +212,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
Mesh *mesh = create_circle_mesh(radius, verts_num, fill_type);
|
||||
Mesh *mesh = create_circle_mesh(radius, verts_num, fill);
|
||||
|
||||
BLI_assert(BKE_mesh_is_valid(mesh));
|
||||
|
||||
|
|
|
@ -729,6 +729,8 @@ Mesh *create_cylinder_or_cone_mesh(const float radius_top,
|
|||
|
||||
namespace blender::nodes::node_geo_mesh_primitive_cone_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryMeshCone)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Vertices"))
|
||||
|
@ -782,10 +784,9 @@ static void node_update(bNodeTree *ntree, bNode *node)
|
|||
bNodeSocket *rings_socket = vertices_socket->next;
|
||||
bNodeSocket *fill_subdiv_socket = rings_socket->next;
|
||||
|
||||
const NodeGeometryMeshCone &storage = *(const NodeGeometryMeshCone *)node->storage;
|
||||
const GeometryNodeMeshCircleFillType fill_type =
|
||||
static_cast<const GeometryNodeMeshCircleFillType>(storage.fill_type);
|
||||
const bool has_fill = fill_type != GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const NodeGeometryMeshCone &storage = node_storage(*node);
|
||||
const GeometryNodeMeshCircleFillType fill = (GeometryNodeMeshCircleFillType)storage.fill_type;
|
||||
const bool has_fill = fill != GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
nodeSetSocketAvailability(ntree, fill_subdiv_socket, has_fill);
|
||||
}
|
||||
|
||||
|
@ -798,10 +799,8 @@ static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryMeshCone &storage = *(const NodeGeometryMeshCone *)node.storage;
|
||||
const GeometryNodeMeshCircleFillType fill_type = (const GeometryNodeMeshCircleFillType)
|
||||
storage.fill_type;
|
||||
const NodeGeometryMeshCone &storage = node_storage(params.node());
|
||||
const GeometryNodeMeshCircleFillType fill = (GeometryNodeMeshCircleFillType)storage.fill_type;
|
||||
|
||||
const int circle_segments = params.extract_input<int>("Vertices");
|
||||
if (circle_segments < 3) {
|
||||
|
@ -817,7 +816,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
const bool no_fill = fill_type == GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const bool no_fill = fill == GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const int fill_segments = no_fill ? 1 : params.extract_input<int>("Fill Segments");
|
||||
if (fill_segments < 1) {
|
||||
params.error_message_add(NodeWarningType::Info, TIP_("Fill Segments must be at least 1"));
|
||||
|
@ -846,7 +845,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
circle_segments,
|
||||
side_segments,
|
||||
fill_segments,
|
||||
fill_type,
|
||||
fill,
|
||||
attribute_outputs);
|
||||
|
||||
/* Transform the mesh so that the base of the cone is at the origin. */
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_mesh_primitive_cylinder_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryMeshCylinder)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Vertices"))
|
||||
|
@ -83,20 +85,16 @@ static void node_update(bNodeTree *ntree, bNode *node)
|
|||
bNodeSocket *rings_socket = vertices_socket->next;
|
||||
bNodeSocket *fill_subdiv_socket = rings_socket->next;
|
||||
|
||||
const NodeGeometryMeshCone &storage = *(const NodeGeometryMeshCone *)node->storage;
|
||||
const GeometryNodeMeshCircleFillType fill_type =
|
||||
static_cast<const GeometryNodeMeshCircleFillType>(storage.fill_type);
|
||||
const bool has_fill = fill_type != GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const NodeGeometryMeshCylinder &storage = node_storage(*node);
|
||||
const GeometryNodeMeshCircleFillType fill = (GeometryNodeMeshCircleFillType)storage.fill_type;
|
||||
const bool has_fill = fill != GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
nodeSetSocketAvailability(ntree, fill_subdiv_socket, has_fill);
|
||||
}
|
||||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryMeshCylinder &storage = *(const NodeGeometryMeshCylinder *)node.storage;
|
||||
|
||||
const GeometryNodeMeshCircleFillType fill_type = (const GeometryNodeMeshCircleFillType)
|
||||
storage.fill_type;
|
||||
const NodeGeometryMeshCylinder &storage = node_storage(params.node());
|
||||
const GeometryNodeMeshCircleFillType fill = (GeometryNodeMeshCircleFillType)storage.fill_type;
|
||||
|
||||
const float radius = params.extract_input<float>("Radius");
|
||||
const float depth = params.extract_input<float>("Depth");
|
||||
|
@ -114,7 +112,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
const bool no_fill = fill_type == GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const bool no_fill = fill == GEO_NODE_MESH_CIRCLE_FILL_NONE;
|
||||
const int fill_segments = no_fill ? 1 : params.extract_input<int>("Fill Segments");
|
||||
if (fill_segments < 1) {
|
||||
params.error_message_add(NodeWarningType::Info, TIP_("Fill Segments must be at least 1"));
|
||||
|
@ -140,7 +138,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
circle_segments,
|
||||
side_segments,
|
||||
fill_segments,
|
||||
fill_type,
|
||||
fill,
|
||||
attribute_outputs);
|
||||
|
||||
if (attribute_outputs.top_id) {
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_mesh_primitive_line_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryMeshLine)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Int>(N_("Count"))
|
||||
|
@ -79,9 +81,9 @@ static void node_update(bNodeTree *ntree, bNode *node)
|
|||
bNodeSocket *start_socket = resolution_socket->next;
|
||||
bNodeSocket *end_and_offset_socket = start_socket->next;
|
||||
|
||||
const NodeGeometryMeshLine &storage = *(const NodeGeometryMeshLine *)node->storage;
|
||||
const GeometryNodeMeshLineMode mode = (const GeometryNodeMeshLineMode)storage.mode;
|
||||
const GeometryNodeMeshLineCountMode count_mode = (const GeometryNodeMeshLineCountMode)
|
||||
const NodeGeometryMeshLine &storage = node_storage(*node);
|
||||
const GeometryNodeMeshLineMode mode = (GeometryNodeMeshLineMode)storage.mode;
|
||||
const GeometryNodeMeshLineCountMode count_mode = (GeometryNodeMeshLineCountMode)
|
||||
storage.count_mode;
|
||||
|
||||
node_sock_label(end_and_offset_socket,
|
||||
|
@ -100,9 +102,9 @@ static void node_update(bNodeTree *ntree, bNode *node)
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometryMeshLine &storage = *(const NodeGeometryMeshLine *)params.node().storage;
|
||||
const GeometryNodeMeshLineMode mode = (const GeometryNodeMeshLineMode)storage.mode;
|
||||
const GeometryNodeMeshLineCountMode count_mode = (const GeometryNodeMeshLineCountMode)
|
||||
const NodeGeometryMeshLine &storage = node_storage(params.node());
|
||||
const GeometryNodeMeshLineMode mode = (GeometryNodeMeshLineMode)storage.mode;
|
||||
const GeometryNodeMeshLineCountMode count_mode = (GeometryNodeMeshLineCountMode)
|
||||
storage.count_mode;
|
||||
|
||||
Mesh *mesh = nullptr;
|
||||
|
|
|
@ -28,6 +28,8 @@ using blender::Array;
|
|||
|
||||
namespace blender::nodes::node_geo_mesh_to_points_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryMeshToPoints)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Mesh")).supported_type(GEO_COMPONENT_TYPE_MESH);
|
||||
|
@ -144,8 +146,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
FieldOperation(max_zero_fn, {std::move(radius)}));
|
||||
Field<float> positive_radius(std::move(max_zero_op), 0);
|
||||
|
||||
const NodeGeometryMeshToPoints &storage =
|
||||
*(const NodeGeometryMeshToPoints *)params.node().storage;
|
||||
const NodeGeometryMeshToPoints &storage = node_storage(params.node());
|
||||
const GeometryNodeMeshToPointsMode mode = (GeometryNodeMeshToPointsMode)storage.mode;
|
||||
|
||||
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_object_info_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryObjectInfo)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Object>(N_("Object")).hide_label();
|
||||
|
@ -42,9 +44,8 @@ static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const bNode &bnode = params.node();
|
||||
NodeGeometryObjectInfo *node_storage = (NodeGeometryObjectInfo *)bnode.storage;
|
||||
const bool transform_space_relative = (node_storage->transform_space ==
|
||||
const NodeGeometryObjectInfo &storage = node_storage(params.node());
|
||||
const bool transform_space_relative = (storage.transform_space ==
|
||||
GEO_NODE_TRANSFORM_SPACE_RELATIVE);
|
||||
|
||||
Object *object = params.get_input<Object *>("Object");
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_points_to_volume_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryPointsToVolume)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Points"));
|
||||
|
@ -61,16 +63,16 @@ static void node_init(bNodeTree *UNUSED(ntree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryPointsToVolume *data = (NodeGeometryPointsToVolume *)node->storage;
|
||||
const NodeGeometryPointsToVolume &storage = node_storage(*node);
|
||||
bNodeSocket *voxel_size_socket = nodeFindSocket(node, SOCK_IN, "Voxel Size");
|
||||
bNodeSocket *voxel_amount_socket = nodeFindSocket(node, SOCK_IN, "Voxel Amount");
|
||||
nodeSetSocketAvailability(ntree,
|
||||
voxel_amount_socket,
|
||||
data->resolution_mode ==
|
||||
storage.resolution_mode ==
|
||||
GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_AMOUNT);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
voxel_size_socket,
|
||||
data->resolution_mode ==
|
||||
storage.resolution_mode ==
|
||||
GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE);
|
||||
}
|
||||
|
||||
|
@ -134,8 +136,7 @@ static float compute_voxel_size(const GeoNodeExecParams ¶ms,
|
|||
Span<float3> positions,
|
||||
const float radius)
|
||||
{
|
||||
const NodeGeometryPointsToVolume &storage =
|
||||
*(const NodeGeometryPointsToVolume *)params.node().storage;
|
||||
const NodeGeometryPointsToVolume &storage = node_storage(params.node());
|
||||
|
||||
if (storage.resolution_mode == GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE) {
|
||||
return params.get_input<float>("Voxel Size");
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_proximity_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryProximity)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Target"))
|
||||
|
@ -216,7 +218,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
return;
|
||||
}
|
||||
|
||||
const NodeGeometryProximity &storage = *(const NodeGeometryProximity *)params.node().storage;
|
||||
const NodeGeometryProximity &storage = node_storage(params.node());
|
||||
Field<float3> position_field = params.extract_input<Field<float3>>("Source Position");
|
||||
|
||||
auto proximity_fn = std::make_unique<ProximityFunction>(
|
||||
|
|
|
@ -29,6 +29,8 @@ namespace blender::nodes::node_geo_raycast_cc {
|
|||
|
||||
using namespace blender::bke::mesh_surface_sample;
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryRaycast)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Target Geometry"))
|
||||
|
@ -80,8 +82,8 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryRaycast &data = *(const NodeGeometryRaycast *)node->storage;
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(data.data_type);
|
||||
const NodeGeometryRaycast &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
|
||||
bNodeSocket *socket_vector = (bNodeSocket *)BLI_findlink(&node->inputs, 1);
|
||||
bNodeSocket *socket_float = socket_vector->next;
|
||||
|
@ -378,9 +380,9 @@ static void output_attribute_field(GeoNodeExecParams ¶ms, GField field)
|
|||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
GeometrySet target = params.extract_input<GeometrySet>("Target Geometry");
|
||||
const NodeGeometryRaycast &data = *(const NodeGeometryRaycast *)params.node().storage;
|
||||
const GeometryNodeRaycastMapMode mapping = static_cast<GeometryNodeRaycastMapMode>(data.mapping);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(data.data_type);
|
||||
const NodeGeometryRaycast &storage = node_storage(params.node());
|
||||
const GeometryNodeRaycastMapMode mapping = (GeometryNodeRaycastMapMode)storage.mapping;
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
|
||||
if (target.is_empty()) {
|
||||
params.set_default_remaining_outputs();
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_separate_geometry_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometrySeparateGeometry)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Geometry"));
|
||||
|
@ -55,8 +57,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
|
||||
const Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
|
||||
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryDeleteGeometry &storage = *(const NodeGeometryDeleteGeometry *)node.storage;
|
||||
const NodeGeometrySeparateGeometry &storage = node_storage(params.node());
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain);
|
||||
|
||||
bool all_is_error = false;
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_set_curve_handles_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometrySetCurveHandlePositions)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
|
||||
|
@ -132,9 +134,8 @@ static void set_position_in_component(const GeometryNodeCurveHandleMode mode,
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeGeometrySetCurveHandlePositions *node_storage =
|
||||
(NodeGeometrySetCurveHandlePositions *)params.node().storage;
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)node_storage->mode;
|
||||
const NodeGeometrySetCurveHandlePositions &storage = node_storage(params.node());
|
||||
const GeometryNodeCurveHandleMode mode = (GeometryNodeCurveHandleMode)storage.mode;
|
||||
|
||||
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
|
||||
Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_string_to_curves_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryStringToCurves)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::String>(N_("String"));
|
||||
|
@ -93,9 +95,9 @@ static void node_init(bNodeTree *UNUSED(ntree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryStringToCurves *storage = (const NodeGeometryStringToCurves *)node->storage;
|
||||
const NodeGeometryStringToCurves &storage = node_storage(*node);
|
||||
const GeometryNodeStringToCurvesOverflowMode overflow = (GeometryNodeStringToCurvesOverflowMode)
|
||||
storage->overflow;
|
||||
storage.overflow;
|
||||
bNodeSocket *socket_remainder = ((bNodeSocket *)node->outputs.first)->next;
|
||||
nodeSetSocketAvailability(
|
||||
ntree, socket_remainder, overflow == GEO_NODE_STRING_TO_CURVES_MODE_TRUNCATE);
|
||||
|
@ -131,8 +133,7 @@ static TextLayout get_text_layout(GeoNodeExecParams ¶ms)
|
|||
return {};
|
||||
}
|
||||
|
||||
const NodeGeometryStringToCurves &storage =
|
||||
*(const NodeGeometryStringToCurves *)params.node().storage;
|
||||
const NodeGeometryStringToCurves &storage = node_storage(params.node());
|
||||
const GeometryNodeStringToCurvesOverflowMode overflow = (GeometryNodeStringToCurvesOverflowMode)
|
||||
storage.overflow;
|
||||
const GeometryNodeStringToCurvesAlignXMode align_x = (GeometryNodeStringToCurvesAlignXMode)
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_subdivision_surface_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometrySubdivisionSurface)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Mesh")).supported_type(GEO_COMPONENT_TYPE_MESH);
|
||||
|
@ -66,8 +68,7 @@ static void node_geo_exec(GeoNodeExecParams params)
|
|||
#else
|
||||
Field<float> crease_field = params.extract_input<Field<float>>("Crease");
|
||||
|
||||
const NodeGeometrySubdivisionSurface &storage =
|
||||
*(const NodeGeometrySubdivisionSurface *)params.node().storage;
|
||||
const NodeGeometrySubdivisionSurface &storage = node_storage(params.node());
|
||||
const int uv_smooth = storage.uv_smooth;
|
||||
const int boundary_smooth = storage.boundary_smooth;
|
||||
const int subdiv_level = clamp_i(params.extract_input<int>("Level"), 0, 30);
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_switch_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeSwitch)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Bool>(N_("Switch")).default_value(false).supports_field();
|
||||
|
@ -97,18 +99,13 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeSwitch *node_storage = (NodeSwitch *)node->storage;
|
||||
const NodeSwitch &storage = node_storage(*node);
|
||||
int index = 0;
|
||||
bNodeSocket *field_switch = (bNodeSocket *)node->inputs.first;
|
||||
bNodeSocket *non_field_switch = (bNodeSocket *)field_switch->next;
|
||||
|
||||
const bool fields_type = ELEM((eNodeSocketDatatype)node_storage->input_type,
|
||||
SOCK_FLOAT,
|
||||
SOCK_INT,
|
||||
SOCK_BOOLEAN,
|
||||
SOCK_VECTOR,
|
||||
SOCK_RGBA,
|
||||
SOCK_STRING);
|
||||
const bool fields_type = ELEM(
|
||||
storage.input_type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_STRING);
|
||||
|
||||
nodeSetSocketAvailability(ntree, field_switch, fields_type);
|
||||
nodeSetSocketAvailability(ntree, non_field_switch, !fields_type);
|
||||
|
@ -117,13 +114,11 @@ static void node_update(bNodeTree *ntree, bNode *node)
|
|||
if (index <= 1) {
|
||||
continue;
|
||||
}
|
||||
nodeSetSocketAvailability(
|
||||
ntree, socket, socket->type == (eNodeSocketDatatype)node_storage->input_type);
|
||||
nodeSetSocketAvailability(ntree, socket, socket->type == storage.input_type);
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
|
||||
nodeSetSocketAvailability(
|
||||
ntree, socket, socket->type == (eNodeSocketDatatype)node_storage->input_type);
|
||||
nodeSetSocketAvailability(ntree, socket, socket->type == storage.input_type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -234,7 +229,7 @@ template<typename T> void switch_no_fields(GeoNodeExecParams ¶ms, const Stri
|
|||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const NodeSwitch &storage = *(const NodeSwitch *)params.node().storage;
|
||||
const NodeSwitch &storage = node_storage(params.node());
|
||||
const eNodeSocketDatatype data_type = static_cast<eNodeSocketDatatype>(storage.input_type);
|
||||
|
||||
switch (data_type) {
|
||||
|
|
|
@ -38,6 +38,8 @@ namespace blender::nodes::node_geo_transfer_attribute_cc {
|
|||
using namespace blender::bke::mesh_surface_sample;
|
||||
using blender::fn::GArray;
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryTransferAttribute)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Target"))
|
||||
|
@ -65,9 +67,9 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
|
||||
{
|
||||
const bNode &node = *static_cast<const bNode *>(ptr->data);
|
||||
const NodeGeometryTransferAttribute &data = *static_cast<const NodeGeometryTransferAttribute *>(
|
||||
node.storage);
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)data.mode;
|
||||
const NodeGeometryTransferAttribute &storage = node_storage(node);
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)
|
||||
storage.mode;
|
||||
|
||||
uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE);
|
||||
uiItemR(layout, ptr, "mapping", 0, "", ICON_NONE);
|
||||
|
@ -87,10 +89,10 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryTransferAttribute &data = *(const NodeGeometryTransferAttribute *)
|
||||
node->storage;
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(data.data_type);
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)data.mode;
|
||||
const NodeGeometryTransferAttribute &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)
|
||||
storage.mode;
|
||||
|
||||
bNodeSocket *socket_geometry = (bNodeSocket *)node->inputs.first;
|
||||
bNodeSocket *socket_vector = socket_geometry->next;
|
||||
|
@ -723,11 +725,11 @@ static void output_attribute_field(GeoNodeExecParams ¶ms, GField field)
|
|||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
GeometrySet geometry = params.extract_input<GeometrySet>("Target");
|
||||
const bNode &node = params.node();
|
||||
const NodeGeometryTransferAttribute &data = *(const NodeGeometryTransferAttribute *)node.storage;
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)data.mode;
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(data.data_type);
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(data.domain);
|
||||
const NodeGeometryTransferAttribute &storage = node_storage(params.node());
|
||||
const GeometryNodeAttributeTransferMode mapping = (GeometryNodeAttributeTransferMode)
|
||||
storage.mode;
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain);
|
||||
|
||||
GField field = get_input_attribute_field(params, data_type);
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_viewer_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryViewer)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Geometry"));
|
||||
|
@ -66,7 +68,7 @@ static eNodeSocketDatatype custom_data_type_to_socket_type(const CustomDataType
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeGeometryViewer &storage = *(const NodeGeometryViewer *)node->storage;
|
||||
const NodeGeometryViewer &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
const eNodeSocketDatatype socket_type = custom_data_type_to_socket_type(data_type);
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
|
||||
namespace blender::nodes::node_geo_volume_to_mesh_cc {
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeGeometryVolumeToMesh)
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Volume")).supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
|
@ -64,24 +66,24 @@ static void node_init(bNodeTree *UNUSED(ntree), bNode *node)
|
|||
|
||||
static void node_update(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeGeometryVolumeToMesh *data = (NodeGeometryVolumeToMesh *)node->storage;
|
||||
const NodeGeometryVolumeToMesh &storage = node_storage(*node);
|
||||
|
||||
bNodeSocket *voxel_size_socket = nodeFindSocket(node, SOCK_IN, "Voxel Size");
|
||||
bNodeSocket *voxel_amount_socket = nodeFindSocket(node, SOCK_IN, "Voxel Amount");
|
||||
nodeSetSocketAvailability(ntree,
|
||||
voxel_amount_socket,
|
||||
data->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT);
|
||||
storage.resolution_mode ==
|
||||
VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
voxel_size_socket,
|
||||
data->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE);
|
||||
storage.resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE);
|
||||
}
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
|
||||
static bke::VolumeToMeshResolution get_resolution_param(const GeoNodeExecParams ¶ms)
|
||||
{
|
||||
const NodeGeometryVolumeToMesh &storage =
|
||||
*(const NodeGeometryVolumeToMesh *)params.node().storage;
|
||||
const NodeGeometryVolumeToMesh &storage = node_storage(params.node());
|
||||
|
||||
bke::VolumeToMeshResolution resolution;
|
||||
resolution.mode = (VolumeToMeshResolutionMode)storage.resolution_mode;
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include "BLI_noise.hh"
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeTexMusgrave)
|
||||
|
||||
namespace blender::nodes {
|
||||
|
||||
static void sh_node_tex_musgrave_declare(NodeDeclarationBuilder &b)
|
||||
|
@ -106,23 +108,23 @@ static int node_shader_gpu_tex_musgrave(GPUMaterial *mat,
|
|||
|
||||
static void node_shader_update_tex_musgrave(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
NodeTexMusgrave *tex = (NodeTexMusgrave *)node->storage;
|
||||
const NodeTexMusgrave &storage = node_storage(*node);
|
||||
|
||||
bNodeSocket *inVectorSock = nodeFindSocket(node, SOCK_IN, "Vector");
|
||||
bNodeSocket *inWSock = nodeFindSocket(node, SOCK_IN, "W");
|
||||
bNodeSocket *inOffsetSock = nodeFindSocket(node, SOCK_IN, "Offset");
|
||||
bNodeSocket *inGainSock = nodeFindSocket(node, SOCK_IN, "Gain");
|
||||
|
||||
nodeSetSocketAvailability(ntree, inVectorSock, tex->dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree, inWSock, tex->dimensions == 1 || tex->dimensions == 4);
|
||||
nodeSetSocketAvailability(ntree, inVectorSock, storage.dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree, inWSock, storage.dimensions == 1 || storage.dimensions == 4);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
inOffsetSock,
|
||||
tex->musgrave_type != SHD_MUSGRAVE_MULTIFRACTAL &&
|
||||
tex->musgrave_type != SHD_MUSGRAVE_FBM);
|
||||
storage.musgrave_type != SHD_MUSGRAVE_MULTIFRACTAL &&
|
||||
storage.musgrave_type != SHD_MUSGRAVE_FBM);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
inGainSock,
|
||||
tex->musgrave_type == SHD_MUSGRAVE_HYBRID_MULTIFRACTAL ||
|
||||
tex->musgrave_type == SHD_MUSGRAVE_RIDGED_MULTIFRACTAL);
|
||||
storage.musgrave_type == SHD_MUSGRAVE_HYBRID_MULTIFRACTAL ||
|
||||
storage.musgrave_type == SHD_MUSGRAVE_RIDGED_MULTIFRACTAL);
|
||||
|
||||
bNodeSocket *outFacSock = nodeFindSocket(node, SOCK_OUT, "Fac");
|
||||
node_sock_label(outFacSock, "Height");
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include "BLI_noise.hh"
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeTexNoise)
|
||||
|
||||
namespace blender::nodes {
|
||||
|
||||
static void sh_node_tex_noise_declare(NodeDeclarationBuilder &b)
|
||||
|
@ -71,8 +73,8 @@ static int node_shader_gpu_tex_noise(GPUMaterial *mat,
|
|||
node_shader_gpu_default_tex_coord(mat, node, &in[0].link);
|
||||
node_shader_gpu_tex_mapping(mat, node, in, out);
|
||||
|
||||
NodeTexNoise *tex = (NodeTexNoise *)node->storage;
|
||||
const char *name = gpu_shader_get_name(tex->dimensions);
|
||||
const NodeTexNoise &storage = node_storage(*node);
|
||||
const char *name = gpu_shader_get_name(storage.dimensions);
|
||||
return GPU_stack_link(mat, node, name, in, out);
|
||||
}
|
||||
|
||||
|
@ -81,9 +83,9 @@ static void node_shader_update_tex_noise(bNodeTree *ntree, bNode *node)
|
|||
bNodeSocket *sockVector = nodeFindSocket(node, SOCK_IN, "Vector");
|
||||
bNodeSocket *sockW = nodeFindSocket(node, SOCK_IN, "W");
|
||||
|
||||
NodeTexNoise *tex = (NodeTexNoise *)node->storage;
|
||||
nodeSetSocketAvailability(ntree, sockVector, tex->dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree, sockW, tex->dimensions == 1 || tex->dimensions == 4);
|
||||
const NodeTexNoise &storage = node_storage(*node);
|
||||
nodeSetSocketAvailability(ntree, sockVector, storage.dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree, sockW, storage.dimensions == 1 || storage.dimensions == 4);
|
||||
}
|
||||
|
||||
namespace blender::nodes {
|
||||
|
@ -241,9 +243,8 @@ class NoiseFunction : public fn::MultiFunction {
|
|||
|
||||
static void sh_node_noise_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder)
|
||||
{
|
||||
bNode &node = builder.node();
|
||||
NodeTexNoise *tex = (NodeTexNoise *)node.storage;
|
||||
builder.construct_and_set_matching_fn<NoiseFunction>(tex->dimensions);
|
||||
const NodeTexNoise &storage = node_storage(builder.node());
|
||||
builder.construct_and_set_matching_fn<NoiseFunction>(storage.dimensions);
|
||||
}
|
||||
|
||||
} // namespace blender::nodes
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include "BLI_noise.hh"
|
||||
|
||||
NODE_STORAGE_FUNCS(NodeTexVoronoi)
|
||||
|
||||
namespace blender::nodes {
|
||||
|
||||
static void sh_node_tex_voronoi_declare(NodeDeclarationBuilder &b)
|
||||
|
@ -136,33 +138,34 @@ static void node_shader_update_tex_voronoi(bNodeTree *ntree, bNode *node)
|
|||
bNodeSocket *outWSock = nodeFindSocket(node, SOCK_OUT, "W");
|
||||
bNodeSocket *outRadiusSock = nodeFindSocket(node, SOCK_OUT, "Radius");
|
||||
|
||||
NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
|
||||
const NodeTexVoronoi &storage = node_storage(*node);
|
||||
|
||||
nodeSetSocketAvailability(ntree, inWSock, tex->dimensions == 1 || tex->dimensions == 4);
|
||||
nodeSetSocketAvailability(ntree, inVectorSock, tex->dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree, inWSock, storage.dimensions == 1 || storage.dimensions == 4);
|
||||
nodeSetSocketAvailability(ntree, inVectorSock, storage.dimensions != 1);
|
||||
nodeSetSocketAvailability(
|
||||
ntree,
|
||||
inExponentSock,
|
||||
tex->distance == SHD_VORONOI_MINKOWSKI && tex->dimensions != 1 &&
|
||||
!ELEM(tex->feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS));
|
||||
nodeSetSocketAvailability(ntree, inSmoothnessSock, tex->feature == SHD_VORONOI_SMOOTH_F1);
|
||||
storage.distance == SHD_VORONOI_MINKOWSKI && storage.dimensions != 1 &&
|
||||
!ELEM(storage.feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS));
|
||||
nodeSetSocketAvailability(ntree, inSmoothnessSock, storage.feature == SHD_VORONOI_SMOOTH_F1);
|
||||
|
||||
nodeSetSocketAvailability(ntree, outDistanceSock, tex->feature != SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
nodeSetSocketAvailability(
|
||||
ntree, outDistanceSock, storage.feature != SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
outColorSock,
|
||||
tex->feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
tex->feature != SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
storage.feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
storage.feature != SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
outPositionSock,
|
||||
tex->feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
tex->feature != SHD_VORONOI_N_SPHERE_RADIUS &&
|
||||
tex->dimensions != 1);
|
||||
storage.feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
storage.feature != SHD_VORONOI_N_SPHERE_RADIUS &&
|
||||
storage.dimensions != 1);
|
||||
nodeSetSocketAvailability(ntree,
|
||||
outWSock,
|
||||
tex->feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
tex->feature != SHD_VORONOI_N_SPHERE_RADIUS &&
|
||||
(ELEM(tex->dimensions, 1, 4)));
|
||||
nodeSetSocketAvailability(ntree, outRadiusSock, tex->feature == SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
storage.feature != SHD_VORONOI_DISTANCE_TO_EDGE &&
|
||||
storage.feature != SHD_VORONOI_N_SPHERE_RADIUS &&
|
||||
(ELEM(storage.dimensions, 1, 4)));
|
||||
nodeSetSocketAvailability(ntree, outRadiusSock, storage.feature == SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
}
|
||||
|
||||
namespace blender::nodes {
|
||||
|
@ -1304,20 +1307,23 @@ class VoronoiEdgeFunction : public fn::MultiFunction {
|
|||
|
||||
static void sh_node_voronoi_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder)
|
||||
{
|
||||
bNode &node = builder.node();
|
||||
NodeTexVoronoi *tex = (NodeTexVoronoi *)node.storage;
|
||||
bool minowski = (tex->distance == SHD_VORONOI_MINKOWSKI && tex->dimensions != 1 &&
|
||||
!ELEM(tex->feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS));
|
||||
bool dist_radius = ELEM(tex->feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
const NodeTexVoronoi &storage = node_storage(builder.node());
|
||||
bool minowski =
|
||||
(storage.distance == SHD_VORONOI_MINKOWSKI && storage.dimensions != 1 &&
|
||||
!ELEM(storage.feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS));
|
||||
bool dist_radius = ELEM(
|
||||
storage.feature, SHD_VORONOI_DISTANCE_TO_EDGE, SHD_VORONOI_N_SPHERE_RADIUS);
|
||||
if (dist_radius) {
|
||||
builder.construct_and_set_matching_fn<VoronoiEdgeFunction>(tex->dimensions, tex->feature);
|
||||
builder.construct_and_set_matching_fn<VoronoiEdgeFunction>(storage.dimensions,
|
||||
storage.feature);
|
||||
}
|
||||
else if (minowski) {
|
||||
builder.construct_and_set_matching_fn<VoronoiMinowskiFunction>(tex->dimensions, tex->feature);
|
||||
builder.construct_and_set_matching_fn<VoronoiMinowskiFunction>(storage.dimensions,
|
||||
storage.feature);
|
||||
}
|
||||
else {
|
||||
builder.construct_and_set_matching_fn<VoronoiMetricFunction>(
|
||||
tex->dimensions, tex->feature, tex->distance);
|
||||
storage.dimensions, storage.feature, storage.distance);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue