#ifndef PROC_NODES_PROC_GEOMETRY_H
#define PROC_NODES_PROC_GEOMETRY_H
#include "proc_curves.h"
#include "proc_instances.h"
#include "proc_mesh.h"
#include "proc_pointcloud.h"
#include "proc_volume.h"
#include <godot_cpp/classes/ref_counted.hpp>
namespace godot {
// Main geometry container — holds mesh, curves, pointcloud, instances.
// Any slot can be null (absent).
class ProcGeometry : public RefCounted {
GDCLASS(ProcGeometry, RefCounted);
protected:
static void _bind_methods();
Ref<ProcMesh> mesh;
Ref<ProcCurves> curves;
Ref<ProcPointCloud> pointcloud;
Ref<ProcInstances> instances;
Ref<ProcVolume> volume;
public:
// Getters
Ref<ProcMesh> get_mesh() const { return mesh; }
Ref<ProcCurves> get_curves() const { return curves; }
Ref<ProcPointCloud> get_pointcloud() const { return pointcloud; }
Ref<ProcInstances> get_instances() const { return instances; }
Ref<ProcVolume> get_volume() const { return volume; }
// Setters
void set_mesh(const Ref<ProcMesh> &p_mesh) { mesh = p_mesh; }
void set_curves(const Ref<ProcCurves> &p_curves) { curves = p_curves; }
void set_pointcloud(const Ref<ProcPointCloud> &p_pc) { pointcloud = p_pc; }
void set_instances(const Ref<ProcInstances> &p_inst) { instances = p_inst; }
void set_volume(const Ref<ProcVolume> &p_vol) { volume = p_vol; }
// Convenience: does this geometry have any data?
bool is_empty() const;
// Get domain size across all components
int domain_size(AttrDomain p_domain) const;
// Ensure mesh component exists (creates if null)
Ref<ProcMesh> ensure_mesh();
Ref<ProcCurves> ensure_curves();
Ref<ProcPointCloud> ensure_pointcloud();
Ref<ProcInstances> ensure_instances();
Ref<ProcVolume> ensure_volume();
// Deep copy (all components duplicated)
Ref<ProcGeometry> duplicate_geometry() const;
// Join another geometry into this one
void join(const Ref<ProcGeometry> &p_other);
ProcGeometry() = default;
};
} // namespace godot
#endif // PROC_NODES_PROC_GEOMETRY_H