#include "proc_instances.h"
#include "proc_geometry.h"
namespace godot {
void ProcInstances::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_instance_count"), &ProcInstances::instance_count);
}
int ProcInstances::domain_size(AttrDomain p_domain) const {
switch (p_domain) {
case AttrDomain::Instance: return instance_count();
default: return 0;
}
}
Ref<MultiMesh> ProcInstances::to_multimesh() const {
if (transforms.size() == 0 || references.size() == 0) {
return Ref<MultiMesh>();
}
// Use the first reference's mesh
Ref<ProcGeometry> first_ref = references[0];
if (first_ref.is_null() || first_ref->get_mesh().is_null()) {
return Ref<MultiMesh>();
}
Ref<ArrayMesh> base_mesh = first_ref->get_mesh()->to_array_mesh();
if (base_mesh.is_null()) {
return Ref<MultiMesh>();
}
Ref<MultiMesh> mm;
mm.instantiate();
mm->set_transform_format(MultiMesh::TRANSFORM_3D);
mm->set_mesh(base_mesh);
mm->set_instance_count(transforms.size());
for (int i = 0; i < transforms.size(); i++) {
mm->set_instance_transform(i, transforms[i]);
}
return mm;
}
Ref<ProcInstances> ProcInstances::duplicate_instances() const {
Ref<ProcInstances> dup;
dup.instantiate();
dup->references = references;
dup->reference_indices = reference_indices;
dup->transforms = transforms;
dup->instance_attrs.propagate_from(instance_attrs);
return dup;
}
} // namespace godot