OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / src / core / proc_instances.cpp

57 lines · cpp ref:
#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