Project
Loading...
Searching...
No Matches
O2Tessellated.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef ALICEO2_BASE_O2TESSELLATED_
13#define ALICEO2_BASE_O2TESSELLATED_
14
15#include "TGeoShape.h"
16#include "TGeoBBox.h"
17#include "TGeoVector3.h"
18#include "TGeoTypedefs.h"
19#include "TGeoTessellated.h"
20
21namespace o2
22{
23namespace base
24{
25
26class O2Tessellated : public TGeoBBox
27{
28
29 public:
30 using Vertex_t = Tessellated::Vertex_t;
31
32 private:
33 int fNfacets = 0; // Number of facets
34 int fNvert = 0; // Number of vertices
35 int fNseg = 0; // Number of segments
36 bool fDefined = false;
37 bool fClosedBody = false; // The faces are making a closed body
38
39 // for now separate vectors but might be better to group per face
40 std::vector<Vertex_t> fVertices; // List of vertices
41 std::vector<TGeoFacet> fFacets; // List of facets
42 std::vector<Vertex_t> fOutwardNormals; // Vector of outward-facing normals (to be streamed !)
43
44 std::multimap<long, int> fVerticesMap;
45 bool fIsClosed = false;
46 void* fBVH = nullptr;
47
48 O2Tessellated(const O2Tessellated&) = delete;
49 O2Tessellated& operator=(const O2Tessellated&) = delete;
50
51 // bvh helper functions
52 void BuildBVH();
53 void CalculateNormals();
54
55 public:
56 // constructors
58 O2Tessellated(const char* name, int nfacets = 0);
59 O2Tessellated(const char* name, const std::vector<Vertex_t>& vertices);
60 // from a TGeoTessellated
61 O2Tessellated(TGeoTessellated const&, bool check = false);
62
63 // destructor
64 ~O2Tessellated() override {}
65
66 void ComputeBBox() override;
67 void CloseShape(bool check = true, bool fixFlipped = true, bool verbose = true);
68
69 bool AddFacet(const Vertex_t& pt0, const Vertex_t& pt1, const Vertex_t& pt2);
70 bool AddFacet(const Vertex_t& pt0, const Vertex_t& pt1, const Vertex_t& pt2, const Vertex_t& pt3);
71 bool AddFacet(int i1, int i2, int i3);
72 bool AddFacet(int i1, int i2, int i3, int i4);
73 int AddVertex(const Vertex_t& vert);
74
75 bool FacetCheck(int ifacet) const;
76 Vertex_t FacetComputeNormal(int ifacet, bool& degenerated) const;
77
78 int GetNfacets() const { return fFacets.size(); }
79 int GetNsegments() const { return fNseg; }
80 int GetNvertices() const { return fNvert; }
81 bool IsClosedBody() const { return fClosedBody; }
82 bool IsDefined() const { return fDefined; }
83
84 const TGeoFacet& GetFacet(int i) const { return fFacets[i]; }
85 const Vertex_t& GetVertex(int i) const { return fVertices[i]; }
86
87 int DistancetoPrimitive(int, int) override { return 99999; }
88 const TBuffer3D& GetBuffer3D(int reqSections, Bool_t localFrame) const override;
89 void GetMeshNumbers(int& nvert, int& nsegs, int& npols) const override;
90 int GetNmeshVertices() const override { return fNvert; }
91 void InspectShape() const override {}
92 TBuffer3D* MakeBuffer3D() const override;
93 void Print(Option_t* option = "") const override;
94 void SavePrimitive(std::ostream&, Option_t*) override {}
95 void SetPoints(double* points) const override;
96 void SetPoints(Float_t* points) const override;
97 void SetSegsAndPols(TBuffer3D& buff) const override;
98 void Sizeof3D() const override {}
99
101 void ResizeCenter(double maxsize);
102
105 {
106 for (auto facet : fFacets)
107 facet.Flip();
108 }
109
110 bool CheckClosure(bool fixFlipped = true, bool verbose = true);
111
113 static O2Tessellated* ImportFromObjFormat(const char* objfile, bool check = false, bool verbose = false);
114
115 // navigation functions used by TGeoNavigator (attention: only the iact == 3 cases implemented for now)
116 Double_t DistFromOutside(const Double_t* point, const Double_t* dir, Int_t iact = 1,
117 Double_t step = TGeoShape::Big(), Double_t* safe = nullptr) const override;
118 Double_t DistFromInside(const Double_t* point, const Double_t* dir, Int_t iact = 1, Double_t step = TGeoShape::Big(),
119 Double_t* safe = nullptr) const override;
120 bool Contains(const Double_t* point) const override;
121 Double_t Safety(const Double_t* point, Bool_t in = kTRUE) const override;
122 void ComputeNormal(const Double_t* point, const Double_t* dir, Double_t* norm) const override;
123
124 // these are trivial implementations, just for debugging
125 Double_t DistFromInside_Loop(const Double_t* point, const Double_t* dir) const;
126 Double_t DistFromOutside_Loop(const Double_t* point, const Double_t* dir) const;
127 bool Contains_Loop(const Double_t* point) const;
128
129 Double_t Capacity() const override;
130
131 private:
132 // a safety kernel used in multiple implementations
133 template <bool closest_facet = false>
134 Double_t SafetyKernel(const Double_t* point, bool in, int* closest_facet_id = nullptr) const;
135
136 ClassDefOverride(O2Tessellated, 1) // tessellated shape class
137};
138
139} // namespace base
140} // namespace o2
141
142#endif
int32_t i
Tessellated::Vertex_t Vertex_t
const TGeoFacet & GetFacet(int i) const
void SetSegsAndPols(TBuffer3D &buff) const override
Fills TBuffer3D structure for segments and polygons.
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
Safety.
bool Contains(const Double_t *point) const override
Contains.
int GetNmeshVertices() const override
void GetMeshNumbers(int &nvert, int &nsegs, int &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
Double_t DistFromOutside_Loop(const Double_t *point, const Double_t *dir) const
trivial (non-BVH) DistFromOutside function
bool AddFacet(const Vertex_t &pt0, const Vertex_t &pt1, const Vertex_t &pt2)
Adding a triangular facet from vertex positions in absolute coordinates.
bool FacetCheck(int ifacet) const
Check validity of facet.
const TBuffer3D & GetBuffer3D(int reqSections, Bool_t localFrame) const override
Fills a static 3D buffer and returns a reference.
Double_t Capacity() const override
Capacity.
void Sizeof3D() const override
void ComputeBBox() override
Compute bounding box.
void InspectShape() const override
void CloseShape(bool check=true, bool fixFlipped=true, bool verbose=true)
Close the shape: calculate bounding box and compact vertices.
void FlipFacets()
Flip all facets.
int DistancetoPrimitive(int, int) override
static O2Tessellated * ImportFromObjFormat(const char *objfile, bool check=false, bool verbose=false)
Reader from .obj format.
Double_t DistFromInside_Loop(const Double_t *point, const Double_t *dir) const
trivial (non-BVH) DistFromInside function
bool CheckClosure(bool fixFlipped=true, bool verbose=true)
Check closure of the solid and check/fix flipped normals.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override
ComputeNormal interface.
void Print(Option_t *option="") const override
Prints basic info.
const Vertex_t & GetVertex(int i) const
void ResizeCenter(double maxsize)
Resize and center the shape in a box of size maxsize.
TBuffer3D * MakeBuffer3D() const override
int AddVertex(const Vertex_t &vert)
Add a vertex checking for duplicates, returning the vertex index.
Vertex_t FacetComputeNormal(int ifacet, bool &degenerated) const
Compute normal for a given facet.
bool Contains_Loop(const Double_t *point) const
trivial (non-BVH) Contains
Tessellated::Vertex_t Vertex_t
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
DistFromOutside.
void SetPoints(double *points) const override
Fill tessellated points to an array.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
DistFromOutside.
void SavePrimitive(std::ostream &, Option_t *) override
GLuint const GLchar * name
Definition glcorearb.h:781
void check(const std::vector< std::string > &arguments, const std::vector< ConfigParamSpec > &workflowOptions, const std::vector< DeviceSpec > &deviceSpecs, CheckMatrix &matrix)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...