/*! \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); } } }