Skip to content

Instantly share code, notes, and snippets.

@Hexlord
Created January 29, 2022 01:56
Show Gist options
  • Save Hexlord/be6282c04b3f6b217f1bbd413c603d10 to your computer and use it in GitHub Desktop.
Save Hexlord/be6282c04b3f6b217f1bbd413c603d10 to your computer and use it in GitHub Desktop.
if constexpr (TermCount == 1) {
auto Builder = ECS.observer();
ConstructObserver<TArgs...>(Builder).event(Event);
if constexpr (FuncArgCount > 0) {
if constexpr (FuncArgCount == 1) {
// Callback only receives one parameter: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
auto Trigger = Builder.iter([TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback(Entity);
Mutations.End();
}
Mutations.EndIter();
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
auto Trigger = Builder.iter([TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
FatalCheck(Iter.count() == 1);
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
Callback(Iter);
Mutations.End();
} else {
Callback(Iter);
}
Mutations.EndIter();
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
} else {
// Callback receives all the parameters, starting with: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
auto Trigger = Builder.iter([TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
TTermGenerator<TArgs...> Generator(Iter);
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback(Entity, Generator.template Get<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>(Index)...);
Mutations.End();
}
Mutations.EndIter();
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
auto Trigger = Builder.iter([TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
FatalCheck(Iter.count() == 1);
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
TTermGenerator<TArgs...> Generator(Iter);
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
Mutations.End();
} else {
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
}
Mutations.EndIter();
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
}
} else {
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback();
Mutations.End();
}
Mutations.EndIter();
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
} else {
if (AnyOrder) {
// We need an intermediate event inside an entity to have a separate merge per each invoked trigger.
entity_index CustomEvent = CreateEntity(ECS);
FFrameString CustomEventName = View("AnyOrder Event ");
CustomEventName += String::ToString(CustomEvent);
CustomEventName += View(" for ");
CustomEventName += Name;
auto CustomEventTrigger =
ECS.trigger()
.id(CustomEvent)
.event(CustomEvent)
.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
FatalCheck(Iter.count() == 1);
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
if constexpr (FuncArgCount > 0) {
if constexpr (FuncArgCount == 1) {
// Callback only receives one parameter: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback(Entity);
Mutations.End();
}
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
Callback(Iter);
Mutations.End();
} else {
Callback(Iter);
}
}
} else {
// Callback receives all the parameters, starting with: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
TMutGenerator<TArgs...> Generator(Iter, Index);
Callback(Entity, Generator.template Get<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
Mutations.End();
}
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
TMutGenerator<TArgs...> Generator(Iter, 0);
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
Mutations.End();
} else {
TMutGenerator<TArgs...> Generator(Iter, 0);
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
}
}
}
} else {
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback();
Mutations.End();
}
}
Mutations.EndIter();
});
FFrameString CustomEventTriggerName = View("AnyOrder CustomEventTrigger ");
CustomEventTriggerName += String::ToString(CustomEventTrigger.id());
CustomEventTriggerName += View(" for ");
CustomEventTriggerName += Name;
CustomEventTrigger.template set<CName>({View(CustomEventTriggerName)});
auto Builder = ECS.observer();
ConstructObserver<TArgs...>(Builder).event(flecs::OnAdd);
auto Trigger = Builder.iter([EventComponent, CustomEvent](iter &Iter) {
if (Iter.event_id() != EventComponent) {
auto ECS = Iter.world();
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Impl::EventEntity(ECS).set<Impl::CSimpleEventEmitter>({CustomEvent, Entity});
}
}
});
FFrameString TriggerName = View("AnyOrder OnAddObserver ");
TriggerName += String::ToString(Trigger.id());
TriggerName += View("for ");
TriggerName += Name;
Trigger.template set<CName>({View(TriggerName)});
}
auto Builder = ECS.observer();
ConstructObserver<TArgs...>(Builder).event(Event);
if constexpr (FuncArgCount > 0) {
if constexpr (FuncArgCount == 1) {
// Callback only receives one parameter: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
if (Iter.event_id() == EventComponent) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback(Entity);
Mutations.End();
}
Mutations.EndIter();
}
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
if (Iter.event_id() == EventComponent) {
FatalCheck(Iter.count() == 1);
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
Callback(Iter);
Mutations.End();
} else {
Callback(Iter);
}
Mutations.EndIter();
}
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
} else {
// Callback receives all the parameters, starting with: entity / iter &
if constexpr (Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, entity>) {
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
if (Iter.event_id() == EventComponent) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
TTermGenerator<TArgs...> Generator(Iter);
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback(Entity, Generator.template Get<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>(Index)...);
Mutations.End();
}
Mutations.EndIter();
}
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
} else {
StaticCheck((Meta::IsSame<Meta::TParameterPackFirstType<TFuncParams>, iter &>));
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
if (Iter.event_id() == EventComponent) {
FatalCheck(Iter.count() == 1);
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
TTermGenerator<TArgs...> Generator(Iter);
if constexpr (SE_DEBUG) {
auto Entity = Iter.entity(0);
Mutations.Begin(Entity);
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
Mutations.End();
} else {
Callback(Iter, Generator.template IterGet<Meta::ParameterPackTypeIndex<TArgs, TArgs...>>()...);
}
Mutations.EndIter();
}
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
}
} else {
auto Trigger = Builder.iter([EventComponent, TermComponentIds, Callback = Meta::Forward<TFunc>(Func)](iter &Iter) {
if (Iter.event_id() == EventComponent) {
Mutations.BeginIter(EIterationType::Observer, View(TermComponentIds));
for (auto Index : Iter) {
auto Entity = Iter.entity(Index);
Mutations.Begin(Entity);
Callback();
Mutations.End();
}
Mutations.EndIter();
}
});
Name += String::ToString(Trigger.id());
Trigger.template set<CName>({View(Name)});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment