Esempio n. 1
0
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();
  }
}
Esempio n. 2
0
void afxEA_PhysicalZone::ea_finish(bool was_stopped)
{
  if (physical_zone)
  {
    set_cons_object(0);
    physical_zone->deleteObject();
    physical_zone = 0;
  }
}
Esempio n. 3
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);
  }
}
Esempio n. 4
0
	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(&center);
      info->appliedForce += pz->getForce(&center);
      /* ORIGINAL CODE
      info->appliedForce += pz->getForce();
      */
      // AFX CODE BLOCK (enhanced-physical-zone) >>
   }
}
Esempio n. 6
0
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();
   }
}