#ifndef PROC_NODES_ZONE_NODES_H
#define PROC_NODES_ZONE_NODES_H
#include "../graph/proc_node.h"
namespace godot {
class RepeatZoneInputNode : public ProcNode {
GDCLASS(RepeatZoneInputNode, ProcNode);
protected:
static void _bind_methods();
// THE ZONE'S STATE ITEMS. Blender keeps one list on the OUTPUT node and
// derives both nodes' sockets from it; each item contributes a socket to
// every one of the pair's four socket lists.
PackedStringArray item_names;
PackedInt32Array item_types; // CD_PROP_*, or -1 for GEOMETRY
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "RepeatZoneInput"; }
String get_node_title() const override { return "Repeat Zone"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
// execute() is a passthrough — actual zone logic is in GraphExecutor::_execute_repeat_zone
void set_item_names(const PackedStringArray &p) { item_names = p; _rebuild_sockets(); }
PackedStringArray get_item_names() const { return item_names; }
void set_item_types(const PackedInt32Array &p) { item_types = p; _rebuild_sockets(); }
PackedInt32Array get_item_types() const { return item_types; }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
RepeatZoneInputNode();
};
class RepeatZoneOutputNode : public ProcNode {
GDCLASS(RepeatZoneOutputNode, ProcNode);
protected:
static void _bind_methods();
// THE ZONE'S STATE ITEMS. Blender keeps one list on the OUTPUT node and
// derives both nodes' sockets from it; each item contributes a socket to
// every one of the pair's four socket lists.
PackedStringArray item_names;
PackedInt32Array item_types; // CD_PROP_*, or -1 for GEOMETRY
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "RepeatZoneOutput"; }
String get_node_title() const override { return "Repeat Zone Output"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
void set_item_names(const PackedStringArray &p) { item_names = p; _rebuild_sockets(); }
PackedStringArray get_item_names() const { return item_names; }
void set_item_types(const PackedInt32Array &p) { item_types = p; _rebuild_sockets(); }
PackedInt32Array get_item_types() const { return item_types; }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
RepeatZoneOutputNode();
};
class ForeachZoneInputNode : public ProcNode {
GDCLASS(ForeachZoneInputNode, ProcNode);
protected:
static void _bind_methods();
// Blender's `input_items`: values sampled per element and made available
// inside the body. Each contributes an input AND an output socket.
PackedStringArray input_item_names;
PackedInt32Array input_item_types;
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "ForeachZoneInput"; }
String get_node_title() const override { return "Foreach Zone"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
void set_input_item_names(const PackedStringArray &p) {
input_item_names = p;
_rebuild_sockets();
}
PackedStringArray get_input_item_names() const { return input_item_names; }
void set_input_item_types(const PackedInt32Array &p) {
input_item_types = p;
_rebuild_sockets();
}
PackedInt32Array get_input_item_types() const { return input_item_types; }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
ForeachZoneInputNode();
};
class ForeachZoneOutputNode : public ProcNode {
GDCLASS(ForeachZoneOutputNode, ProcNode);
protected:
static void _bind_methods();
// TWO lists on this one node. `main_items` are gathered per element and
// come back as FIELDS on the original geometry; `generation_items` are
// produced per element and JOINED, and Blender seeds that list with a
// Geometry item.
PackedStringArray main_item_names;
PackedInt32Array main_item_types;
PackedStringArray generation_item_names;
PackedInt32Array generation_item_types;
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "ForeachZoneOutput"; }
String get_node_title() const override { return "Foreach Zone Output"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
void set_main_item_names(const PackedStringArray &p) {
main_item_names = p;
_rebuild_sockets();
}
PackedStringArray get_main_item_names() const { return main_item_names; }
void set_main_item_types(const PackedInt32Array &p) {
main_item_types = p;
_rebuild_sockets();
}
PackedInt32Array get_main_item_types() const { return main_item_types; }
void set_generation_item_names(const PackedStringArray &p) {
generation_item_names = p;
_rebuild_sockets();
}
PackedStringArray get_generation_item_names() const { return generation_item_names; }
void set_generation_item_types(const PackedInt32Array &p) {
generation_item_types = p;
_rebuild_sockets();
}
PackedInt32Array get_generation_item_types() const { return generation_item_types; }
int get_main_count() const { return main_item_names.size(); }
int get_generation_count() const { return generation_item_names.size(); }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
ForeachZoneOutputNode();
};
class SimulationZoneInputNode : public ProcNode {
GDCLASS(SimulationZoneInputNode, ProcNode);
protected:
static void _bind_methods();
// THE ZONE'S STATE ITEMS. Blender keeps one list on the OUTPUT node and
// derives both nodes' sockets from it; each item contributes a socket to
// every one of the pair's four socket lists.
PackedStringArray item_names;
PackedInt32Array item_types; // CD_PROP_*, or -1 for GEOMETRY
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "SimulationZoneInput"; }
String get_node_title() const override { return "Simulation Zone"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
// Passthrough — actual zone logic is in GraphExecutor::_execute_simulation_zone
void set_item_names(const PackedStringArray &p) { item_names = p; _rebuild_sockets(); }
PackedStringArray get_item_names() const { return item_names; }
void set_item_types(const PackedInt32Array &p) { item_types = p; _rebuild_sockets(); }
PackedInt32Array get_item_types() const { return item_types; }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
SimulationZoneInputNode();
};
class SimulationZoneOutputNode : public ProcNode {
GDCLASS(SimulationZoneOutputNode, ProcNode);
protected:
static void _bind_methods();
// THE ZONE'S STATE ITEMS. Blender keeps one list on the OUTPUT node and
// derives both nodes' sockets from it; each item contributes a socket to
// every one of the pair's four socket lists.
PackedStringArray item_names;
PackedInt32Array item_types; // CD_PROP_*, or -1 for GEOMETRY
void _rebuild_sockets();
int zone_id = 0;
public:
StringName get_node_type() const override { return "SimulationZoneOutput"; }
String get_node_title() const override { return "Simulation Zone Output"; }
String get_node_category() const override { return "Zone"; }
void set_zone_id(int p_id) { zone_id = p_id; }
int get_zone_id() const { return zone_id; }
void set_item_names(const PackedStringArray &p) { item_names = p; _rebuild_sockets(); }
PackedStringArray get_item_names() const { return item_names; }
void set_item_types(const PackedInt32Array &p) { item_types = p; _rebuild_sockets(); }
PackedInt32Array get_item_types() const { return item_types; }
void execute(ProcEvalContext &p_ctx, int p_node_idx) override;
SimulationZoneOutputNode();
};
} // namespace godot
#endif