bool ClampLineInMap(float3& start, float3& end) { const float3 dir = end - start; const std::pair<float, float>& interp = GetMapBoundaryIntersectionPoints(start, dir); const float& near = interp.first; const float& far = interp.second; if (far < 0.0f) { //! outside of map! start = -OnesVector; end = -OnesVector; return true; } if (far < 1.0f || near > 0.0f) { end = start + dir * std::min(far, 1.0f); start = start + dir * std::max(near, 0.0f); //! precision of near,far are limited, so better clamp it afterwards end.ClampInMap(); start.ClampInMap(); return true; } return false; }