void afxEA_PhysicalZone::ea_set_scope_status(bool in_scope) { if (physical_zone) { if (in_scope && !physical_zone->isActive()) physical_zone->activate(); else if (!in_scope && physical_zone->isActive()) physical_zone->deactivate(); } }
void afxEA_PhysicalZone::ea_finish(bool was_stopped) { if (physical_zone) { set_cons_object(0); physical_zone->deleteObject(); physical_zone = 0; } }
void afxEA_PhysicalZone::set_cons_object(SceneObject* new_obj) { if (cons_obj == new_obj) return; if (cons_obj) { physical_zone->unregisterExcludedObject(cons_obj); //clearNotify(shape); } cons_obj = new_obj; if (cons_obj) { //deleteNotify(shape); physical_zone->registerExcludedObject(cons_obj); } }
virtual bool needsCollision(btBroadphaseProxy* proxy0) const { if ( proxy0->m_clientObject == mMe ) return false; //.logicking >> behavior of Physical Zone as invisible wall btCollisionObject* colObj = (btCollisionObject*)(proxy0->m_clientObject); SceneObject* sceneObj = PhysicsUserData::getObject(colObj->getUserPointer()); if (sceneObj && (sceneObj->getTypeMask() & PhysicalZoneObjectType)) { SceneObject* playerObject = PhysicsUserData::getObject(mMe->getUserPointer()); PhysicalZone* pZone = static_cast<PhysicalZone*>(sceneObj); if (pZone->isActive() && pZone->isInvisibleWall(playerObject)) return true; } if ( !colObj->hasContactResponse() ) return false; //.logicking << return Parent::needsCollision( proxy0 ); }
void physicalZoneFind(SceneObject* obj, void *key) { PROFILE_SCOPE( physicalZoneFind ); ContainerQueryInfo *info = static_cast<ContainerQueryInfo*>(key); PhysicalZone* pz = dynamic_cast<PhysicalZone*>(obj); AssertFatal(pz != NULL, "Error, not a physical zone!"); if (pz == NULL || pz->testBox(info->box) == false) return; if (pz->isActive()) { info->gravityScale *= pz->getGravityMod(); // AFX CODE BLOCK (enhanced-physical-zone) << Point3F center; info->box.getCenter(¢er); info->appliedForce += pz->getForce(¢er); /* ORIGINAL CODE info->appliedForce += pz->getForce(); */ // AFX CODE BLOCK (enhanced-physical-zone) >> } }
bool afxEA_PhysicalZone::ea_update(F32 dt) { if (!physical_zone) { // create and register effect physical_zone = new PhysicalZone(); physical_zone->mVelocityMod = zone_data->mVelocityMod; physical_zone->mGravityMod = zone_data->mGravityMod; physical_zone->mAppliedForce = zone_data->mAppliedForce; physical_zone->force_type = zone_data->force_type; physical_zone->orient_force = zone_data->orient_force; physical_zone->setField("polyhedron", zone_data->mPolyhedron); if (!physical_zone->registerObject()) { delete physical_zone; physical_zone = 0; Con::errorf("afxEA_PhysicalZone::ea_update() -- effect failed to register."); return false; } deleteNotify(physical_zone); physical_zone->activate(); } if (physical_zone) { if (zone_data->exclude_cons_obj) { afxConstraint* pos_constraint = getPosConstraint(); set_cons_object((pos_constraint) ? pos_constraint->getSceneObject() : 0); } if (do_fades) physical_zone->setFadeAmount(fade_value); physical_zone->setTransform(updated_xfm); } return true; }
void physicalZoneFind(SceneObject* obj, void *key) { PROFILE_SCOPE( physicalZoneFind ); ContainerQueryInfo *info = static_cast<ContainerQueryInfo*>(key); PhysicalZone* pz = dynamic_cast<PhysicalZone*>(obj); AssertFatal(pz != NULL, "Error, not a physical zone!"); if (pz == NULL || pz->testBox(info->box) == false) return; if (pz->isActive()) { info->gravityScale *= pz->getGravityMod(); info->airResistanceScale *= pz->getAirResistanceMod(); info->appliedForce += pz->getForce(); } }