Created
January 29, 2022 01:56
-
-
Save Hexlord/be6282c04b3f6b217f1bbd413c603d10 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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