Support proper actuator animation

This commit is contained in:
2025-09-27 01:23:16 +03:00
parent 7e06da700a
commit 25280a9cbe
16 changed files with 528 additions and 103 deletions

View File

@@ -62,7 +62,7 @@ struct DeepPenetrationContactResultCallback : public btManifoldResult {
ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
{
ecs.module<EventTriggerModule>();
ecs.component<EventTriggerExit>();
ecs.component<EventTriggerData>();
ecs.component<TriggerBody>().on_add([](flecs::entity e,
TriggerBody &body) {
bool kinematic = false;
@@ -81,14 +81,6 @@ ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
e.get<EventTrigger>().position,
Ogre::Quaternion(0, 0, 0, 1));
}
/*
Ogre::MeshPtr mesh =
Ogre::MeshManager::getSingleton().createManual(
"trigger", "General");
Ogre::Entity *ent =
ECS::get<EngineData>().mScnMgr->createEntity(mesh);
body.mSceneNode->attachObject(ent);
*/
body.mBody = new btPairCachingGhostObject();
body.mBody->getWorldTransform().setOrigin(Ogre::Bullet::convert(
body.mSceneNode->_getDerivedPosition()));
@@ -102,10 +94,6 @@ ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
if (kinematic)
flags |= btCollisionObject::CF_STATIC_OBJECT;
body.mBody->setCollisionFlags(flags);
/*
ECS::get<EngineData>().mWorld->attachCollisionObject(
body.mBody, ent, 16, 0x1);
*/
ECS::get<EngineData>().mWorld->getBtWorld()->addCollisionObject(
body.mBody, 16, 0x1);
struct EntityCollisionListener {
@@ -142,12 +130,14 @@ ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
ecs.component<EventTrigger>().on_set(
[](flecs::entity e, EventTrigger &ev) {
e.add<TriggerBody>();
e.set<EventTriggerData>({});
});
ecs.system<const EngineData, const EventTrigger, TriggerBody>(
"CheckCollisions")
ecs.system<const EngineData, const EventTrigger, TriggerBody,
EventTriggerData>("CheckCollisions")
.kind(flecs::OnUpdate)
.each([](flecs::entity e, const EngineData &eng,
const EventTrigger &evt, TriggerBody &body) {
const EventTrigger &evt, TriggerBody &body,
EventTriggerData &data) {
btDispatcher *dispatch =
eng.mWorld->getBtWorld()->getDispatcher();
btHashedOverlappingPairCache *cache =
@@ -255,12 +245,33 @@ ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
.end()) {
body.contactBodies
.insert(other);
OgreAssert(
ECS::get<
Body2Entity>()
.entities
.find(const_cast<
btCollisionObject
*>(
other)) !=
ECS::get<
Body2Entity>()
.entities
.end(),
"No body to entity mapping");
ECS::get<
LuaBase>()
.mLua
->call_handler(
evt.event,
e);
evt.event +
"_enter",
e,
ECS::get<
Body2Entity>()
.entities
.at(const_cast<
btCollisionObject
*>(
other)));
}
}
}
@@ -272,18 +283,15 @@ ECS::EventTriggerModule::EventTriggerModule(flecs::world &ecs)
while (it != body.contactBodies.end()) {
if (currentContactBodies.find(*it) ==
currentContactBodies.end()) {
if (e.has<EventTriggerExit>()) {
const Ogre::String &exit_event =
ECS::get<
EventTriggerExit>()
.event;
ECS::get<LuaBase>()
.mLua->call_handler(
exit_event);
} else {
std::cout << "body exited"
<< std::endl;
}
ECS::get<LuaBase>().mLua->call_handler(
evt.event + "_exit", e,
ECS::get<Body2Entity>()
.entities
.at(const_cast<
btCollisionObject
*>(
*it)));
std::cout << "body exited" << std::endl;
it = body.contactBodies.erase(it);
if (it == body.contactBodies.end())
break;