File indexing completed on 2026-04-17 08:35:32
0001 #ifndef VECGEOM_SURFACE_BOXCONVERTER_H_
0002 #define VECGEOM_SURFACE_BOXCONVERTER_H_
0003
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006
0007 #include <VecGeom/volumes/Box.h>
0008
0009 namespace vgbrep {
0010 namespace conv {
0011
0012
0013
0014
0015
0016
0017 template <typename Real_t>
0018 bool CreateBoxSurfaces(vecgeom::UnplacedBox const &box, int logical_id, bool intersection = false)
0019 {
0020 using Vector3 = vecgeom::Vector3D<vecgeom::Precision>;
0021 int isurf;
0022 LogicExpressionCPU logic;
0023
0024 auto dx = box.x();
0025 auto dy = box.y();
0026 auto dz = box.z();
0027
0028 std::vector<Vector3> corners = {{-dx, -dy, -dz}, {dx, -dy, -dz}, {dx, dy, -dz}, {-dx, dy, -dz},
0029 {-dx, -dy, dz}, {dx, -dy, dz}, {dx, dy, dz}, {-dx, dy, dz}};
0030 auto assertWindow = [](int isurf) {
0031 VECGEOM_ASSERT(isurf >= 0 &&
0032 CPUsurfData<Real_t>::Instance().fLocalSurfaces[isurf].fFrame.type == FrameType::kWindow);
0033 };
0034 std::vector<Vector3> vert;
0035
0036 vert = {corners[3], corners[0], corners[4], corners[7]};
0037 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0038 assertWindow(isurf);
0039 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0040 logic.push_back(isurf);
0041
0042 vert = {corners[1], corners[2], corners[6], corners[5]};
0043 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0044 assertWindow(isurf);
0045 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0046 logic.push_back(land);
0047 logic.push_back(isurf);
0048
0049 vert = {corners[0], corners[1], corners[5], corners[4]};
0050 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0051 assertWindow(isurf);
0052 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0053 logic.push_back(land);
0054 logic.push_back(isurf);
0055
0056 vert = {corners[2], corners[3], corners[7], corners[6]};
0057 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0058 assertWindow(isurf);
0059 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0060 logic.push_back(land);
0061 logic.push_back(isurf);
0062
0063 vert = {corners[0], corners[3], corners[2], corners[1]};
0064 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0065 assertWindow(isurf);
0066 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0067 logic.push_back(land);
0068 logic.push_back(isurf);
0069
0070 vert = {corners[4], corners[5], corners[6], corners[7]};
0071 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0072 assertWindow(isurf);
0073 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0074 logic.push_back(land);
0075 logic.push_back(isurf);
0076 builder::AddLogicToShell<Real_t>(logical_id, logic);
0077 return true;
0078 }
0079
0080 }
0081 }
0082 #endif