OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / src / nodes / zone_nodes.h

230 lines · c ref:
#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