Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Observers and component hooks triggered from is_a out of order #1588

Open
nimble0 opened this issue Feb 25, 2025 · 0 comments
Open

Observers and component hooks triggered from is_a out of order #1588

nimble0 opened this issue Feb 25, 2025 · 0 comments
Labels
bug Something isn't working

Comments

@nimble0
Copy link
Contributor

nimble0 commented Feb 25, 2025

Describe the bug
Observers and component hooks do not trigger in order (as in all component hooks before all observers) when triggered from instantiating a prefab.

To Reproduce
Edited flecs/examples/cpp/prefabs/src/main.cpp

#include <basics.h>
#include <iostream>


struct Defense {
	double value;
};

struct Armour {
	double value;
};

int main() {
	flecs::world ecs;

	ecs.component<Defense>()
		.on_set([](flecs::entity, Defense&)
		{
			std::cout << "Defense on_set hook trigger\n";
		});

	ecs.component<Armour>()
		.on_set([](flecs::entity, Armour&)
		{
			std::cout << "Armour on_set hook trigger\n";
		});

	ecs.observer<const Defense, Armour>("CalculateArmour")
		.event(flecs::OnSet)
		.each([&](flecs::entity, const Defense& defense, Armour& armour)
		{
			armour.value = 1.0 / defense.value;
			std::cout << "observer trigger\n";
		});

	// Create a SpaceShip prefab with a Defense component.
	std::cout << "make prefab\n";
	flecs::entity SpaceShip = ecs.prefab("SpaceShip")
		.set<Defense>({ 50 })
		.set(Armour{});

	// Create a prefab instance
	std::cout << "\nmake prefab instance\n";
	flecs::entity inst = ecs.entity("my_spaceship").is_a(SpaceShip);
}

Expected output

make prefab
Defense on_set hook trigger
Armour on_set hook trigger

make prefab instance
Defense on_set hook trigger
Armour on_set hook trigger
observer trigger

Actual output

make prefab
Defense on_set hook trigger
Armour on_set hook trigger

make prefab instance
Defense on_set hook trigger
observer trigger
Armour on_set hook trigger
@nimble0 nimble0 added the bug Something isn't working label Feb 25, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant