Support proper actuator animation
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user