File indexing completed on 2026-04-17 08:35:33
0001 #ifndef VECGEOM_SURFACE_TETCONVERTER_H_
0002 #define VECGEOM_SURFACE_TETCONVERTER_H_
0003
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006
0007 #include <VecGeom/volumes/Tet.h>
0008
0009 namespace vgbrep {
0010 namespace conv {
0011
0012
0013
0014
0015
0016
0017 template <typename Real_t>
0018 bool CreateTetSurfaces(vecgeom::UnplacedTet const &tet, int logical_id, bool intersection = false)
0019 {
0020 using Vector3D = vecgeom::Vector3D<Real_t>;
0021
0022 const auto &tetstr = tet.GetStruct();
0023 int isurf;
0024 LogicExpressionCPU logic;
0025 vecgeom::Transformation3D transf;
0026 std::vector<Vector3D>
0027 vert;
0028
0029
0030 auto const *corners = tetstr.fVertex;
0031 auto assertFace = [](int isurf) {
0032 VECGEOM_ASSERT(isurf >= 0 &&
0033 CPUsurfData<Real_t>::Instance().fLocalSurfaces[isurf].fFrame.type == FrameType::kTriangle);
0034 };
0035
0036
0037 vert = {corners[0], corners[1], corners[2]};
0038 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0039 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0040 assertFace(isurf);
0041 logic.push_back(isurf);
0042
0043
0044 vert = {corners[0], corners[2], corners[3]};
0045 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0046 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0047 assertFace(isurf);
0048 logic.push_back(land);
0049 logic.push_back(isurf);
0050
0051
0052 vert = {corners[0], corners[3], corners[1]};
0053 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0054 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0055 assertFace(isurf);
0056 logic.push_back(land);
0057 logic.push_back(isurf);
0058
0059
0060 vert = {corners[1], corners[3], corners[2]};
0061 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0062 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0063 assertFace(isurf);
0064 logic.push_back(land);
0065 logic.push_back(isurf);
0066
0067 builder::AddLogicToShell<Real_t>(logical_id, logic);
0068 return true;
0069 }
0070
0071 }
0072 }
0073 #endif