示例#1
0
/*!

\brief Clamp point to scene.
\ingroup Render

*/
dmz::Boolean
dmz::isect_clamp_point (
      const Vector Value,
      RenderModuleIsect &isect,
      Vector &point,
      Vector &normal) {

   Boolean result (False);
   Vector offset (0.0, 1.5, 0.0);
   Vector start (Value + offset);

   IsectParameters parameters;
   IsectTestContainer test;
   IsectResultContainer isectResults;

   test.set_test (1, IsectRayTest, start, Down);

   if (isect.do_isect (parameters, test, isectResults)) {

      result = isect_validate_point (Value, Down, isectResults, point, normal);
   }

   if (!result) {

      start = Value - offset;

      test.set_test (1, IsectRayTest, start, Up);

      if (isect.do_isect (parameters, test, isectResults)) {

         result = isect_validate_point (Value, Up, isectResults, point, normal);
      }
   }

   return result;
}
// TimeSlice Interface
void
dmz::WeaponPluginGravityBullet::update_time_slice (const Float64 TimeDelta) {

   ObjectModule *objMod (get_object_module ());

   if (objMod && _isectMod) {

      const Vector GravityVel (0.0, (-_gravity) * TimeDelta, 0.0);

      HashTableHandleIterator it;

      IsectParameters params;
      params.set_test_result_type (IsectClosestPoint);

      Float64 *speedPtr (_objectTable.get_first (it));

      while (speedPtr) {

         Handle obj (it.get_hash_key ());

         Vector pos;
         Matrix ori;
         Vector vel;
         objMod->lookup_position (obj, _defaultHandle, pos);
         objMod->lookup_orientation (obj, _defaultHandle, ori);
         objMod->lookup_velocity (obj, _defaultHandle, vel);
         vel += GravityVel;
         objMod->store_velocity (obj, _defaultHandle, vel);
         const Vector NewPos (pos + (vel * TimeDelta));

         IsectTestContainer test;
         IsectResultContainer isectResults;
         test.set_test (1, IsectSegmentTest, pos, NewPos);

         _isectMod->disable_isect (obj);

         if (_isectMod->do_isect (params, test, isectResults)) {

            if (_eventMod) {

               IsectResult value;
               isectResults.get_first (value);
               Handle target (0);
               value.get_object_handle (target);
               _eventMod->create_detonation_event (obj, target);
            }

            objMod->destroy_object (obj);
         }
         else {

            objMod->store_position (obj, _defaultHandle, NewPos);
            objMod->store_velocity (obj, _defaultHandle, vel);
         }

         _isectMod->enable_isect (obj);
         
         speedPtr = _objectTable.get_next (it);
      }
   }
}