52 const G4double proposedStepLength, G4double& newSafety)
55 mLastDirection = direction;
56 mHaveNextState =
false;
58 auto const*
top = mCurState.Top();
60 mWouldEnter = mWouldExit =
false;
63 auto const* navigator =
top->GetLogicalVolume()->GetNavigator();
65 double limit = proposedStepLength *
kG4ToVG;
66 if (!(limit < vecgeom::kInfLength)) {
67 limit = vecgeom::kInfLength;
76 const bool block = mExitBlockPending && globalPoint.diff2(mLocatedPoint) < 1.e-20 &&
78 mExitBlockPending =
false;
80 mCurState.SetLastExited(mEmptyState.GetLastExitedState());
84 const double vgStep = navigator->ComputeStepAndSafetyAndPropagatedState(
85 toVG(globalPoint),
toDir(direction), limit, mCurState, mNextState, !mOnBoundary && !mZeroSafety, vgSafety);
87 newSafety = (vgSafety > 0. && !mZeroSafety) ? vgSafety *
kVGToG4 : 0.;
89 G4double step = vgStep *
kVGToG4;
90 if (mNextState.IsOnBoundary()) {
93 mWouldEnter = mNextState.GetCurrentLevel() > mCurState.GetCurrentLevel();
94 mWouldExit = !mWouldEnter;
95 mNextPoint = globalPoint + step * direction;
96 mHaveNextState =
true;
98 mWouldEnter = mWouldExit =
false;
106 mHaveNextState =
false;
112 if (++mZeroSteps > 4) {
114 mHaveNextState =
false;
119 mForceReInit =
false;
145 const G4ThreeVector*,
146 const G4bool relativeSearch,
const G4bool)
148 bool onBoundary = fWasLimitedByGeometry;
149 if (mHaveNextState && point.diff2(mNextPoint) < 1.e-16) {
153 mPrevState = mCurState;
154 mLocatedPoint = point;
155 mExitBlockPending =
false;
157 if (!mForceReInit && relativeSearch && onBoundary && mHaveNextState) {
160 mCurState = mNextState;
161 mExitBlockPending = mWouldExit;
162 }
else if (mForceReInit || !relativeSearch || onBoundary) {
164 vecgeom::GlobalLocator::LocateGlobalPoint(vecgeom::GeoManager::Instance().GetWorld(),
toVG(point), mCurState,
true);
165 mForceReInit =
false;
171 mCrossed = onBoundary;
173 fExitedMother = mWouldExit;
174 fEnteredDaughter = mWouldEnter;
177 mHaveNextState =
false;
210 auto const&
state = mWouldExit ? mPrevState : mCurState;
211 auto const* volume =
state.Top();
212 if (volume ==
nullptr) {
214 return G4ThreeVector(0., 0., 1.);
217 vecgeom::Transformation3D
m;
220 volume->Normal(
m.Transform(
toVG(point)), normal);
221 V3 global =
m.InverseTransformDirection(normal);
224 const V3 dir =
toDir(mLastDirection);
225 if (global.Dot(dir) < 0.) {
230 const double mag2 = global.Mag2();
231 *
valid = std::isfinite(mag2) && mag2 > 0.25;
232 return G4ThreeVector(global[0], global[1], global[2]);