Isis 3 Developer Reference
EmbreeTargetShape.h
Go to the documentation of this file.
1 #ifndef EmbreeTargetShape_h
2 #define EmbreeTargetShape_h
3 
26 #include <QString>
27 
28 // Embree includes
29 #include <embree2/rtcore.h>
30 #include <embree2/rtcore_ray.h>
31 
32 // PointCloudLibrary includes
33 #include <pcl/io/auto_io.h>
34 #include <pcl/point_types.h>
35 #include <pcl/PolygonMesh.h>
36 
37 // WARNING
38 // The following undefes macros set in pcl. They conflict with ISIS's macros.
39 // If pcl tries to use these macros you will get compilation errors.
40 // - JAM
41 #undef DEG2RAD
42 #undef RAD2DEG
43 
44 #include "FileName.h"
45 #include "LinearAlgebra.h"
46 
47 namespace Isis {
48 
49 
50  class Pvl;
51 
62  RTCMultiHitRay(const std::vector<double> &origin,
63  const std::vector<double> &direction);
65  LinearAlgebra::Vector direction);
66 
67 // These are the inheritted members from RTCRay
68 // float org; //!< Ray origin
69 // float dir; //!< Ray direction
70 // float tnear; //!< Start of ray segment
71 // float tfar; //!< End of ray segment
72 // float time; //!< Time of this ray for motion blur.
73 // unsigned mask; //!< used to mask out objects during traversal
74 // float Ng; //!< Geometric normal.
75 // float u; //!< Barycentric u coordinate of hit
76 // float v; //!< Barycentric v coordinate of hit
77 // unsigned geomID; //!< geometry ID
78 // unsigned primID; //!< primitive ID
79 // unsigned instID; //!< instance ID
80 
81  // ray extensions
82  // we remember up to 16 hits to ignore duplicate hits
83  unsigned hitGeomIDs[16];
84  unsigned hitPrimIDs[16];
85  float hitUs[16];
86  float hitVs[16];
87  int lastHit;
88  };
89 
90 
100  RTCOcclusionRay();
101  RTCOcclusionRay(const std::vector<double> &origin,
102  const std::vector<double> &direction);
104  LinearAlgebra::Vector direction);
105 
106 // These are the inheritted members from RTCRay
107 // float org; //!< Ray origin
108 // float dir; //!< Ray direction
109 // float tnear; //!< Start of ray segment
110 // float tfar; //!< End of ray segment
111 // float time; //!< Time of this ray for motion blur.
112 // unsigned mask; //!< used to mask out objects during traversal
113 // float Ng; //!< Geometric normal.
114 // float u; //!< Barycentric u coordinate of hit
115 // float v; //!< Barycentric v coordinate of hit
116 // unsigned geomID; //!< geometry ID
117 // unsigned primID; //!< primitive ID
118 // unsigned instID; //!< instance ID
119 
120  // ray extensions
121  int lastHit;
122  unsigned ignorePrimID;
123  };
124 
125 
137 
140  int primID;
141  };
142 
143 
156  public:
157 
159  EmbreeTargetShape(pcl::PolygonMesh::Ptr mesh, const QString &name = "");
160  EmbreeTargetShape(const QString &dem, const Pvl *conf = 0);
161  virtual ~EmbreeTargetShape();
162 
163  QString name() const;
164  bool isValid() const;
165 
166  int numberOfPolygons() const;
167  int numberOfVertices() const;
168  RTCBounds sceneBounds() const;
169  double maximumSceneDistance() const;
170 
171  void intersectRay(RTCMultiHitRay &ray);
172  bool isOccluded(RTCOcclusionRay &ray);
173 
175 
176  static void multiHitFilter(void* userDataPtr, RTCMultiHitRay& ray);
177  static void occlusionFilter(void* userDataPtr, RTCOcclusionRay& ray);
178 
179  protected:
180  pcl::PolygonMesh::Ptr readDSK(FileName file);
181  pcl::PolygonMesh::Ptr readPC(FileName file);
182  void initMesh(pcl::PolygonMesh::Ptr mesh);
183  void addVertices(int geomID);
184  void addIndices(int geomID);
185 
186  private:
194  struct Vertex {
195  float x;
196  float y;
197  float z;
198  float a;
199  };
200 
209  struct Triangle {
210  int v0;
211  int v1;
212  int v2;
213  };
214 
215  QString m_name;
216  pcl::PolygonMesh::Ptr m_mesh;
219  pcl::PointCloud<pcl::PointXYZ> m_cloud;
224  RTCDevice m_device;
226  RTCScene m_scene;
232  };
233 
234 } // namespace Isis
235 
236 #endif
237 
Container that holds the body fixed intersection point and unit surface normal for a hit...
Definition: EmbreeTargetShape.h:134
unsigned hitGeomIDs[16]
IDs of the geometries (bodies) hit.
Definition: EmbreeTargetShape.h:83
int numberOfVertices() const
Return the number of vertices in the target shape.
Definition: EmbreeTargetShape.cpp:576
File name manipulation and expansion.
Definition: FileName.h:116
RTCMultiHitRay()
Default constructor for RTCMultiHitRay.
Definition: EmbreeTargetShape.cpp:45
RTCOcclusionRay()
Default constructor for RTCOcclussionRay.
Definition: EmbreeTargetShape.cpp:129
int numberOfPolygons() const
Return the number of polygons in the target shape.
Definition: EmbreeTargetShape.cpp:562
int lastHit
Index of the last hit in the hit containers.
Definition: EmbreeTargetShape.h:121
double maximumSceneDistance() const
Return the maximum distance within the scene.
Definition: EmbreeTargetShape.cpp:617
Struct for capturing multiple intersections when using embree::rtcintersectscene. ...
Definition: EmbreeTargetShape.h:60
pcl::PolygonMesh::Ptr readPC(FileName file)
Read a PointCloudLibrary file into a PointCloudLibrary polygon mesh.
Definition: EmbreeTargetShape.cpp:437
unsigned hitPrimIDs[16]
IDs of the primitives (trinagles) hit.
Definition: EmbreeTargetShape.h:84
virtual ~EmbreeTargetShape()
Desctructor.
Definition: EmbreeTargetShape.cpp:550
float hitUs[16]
Barycentric u coordinate of the hits.
Definition: EmbreeTargetShape.h:85
void addIndices(int geomID)
Adds the polygon vertex indices from the internalized polygon mesh to the Embree scene.
Definition: EmbreeTargetShape.cpp:530
LinearAlgebra::Vector surfaceNormal
The unit surface normal vector at the intersection.
Definition: EmbreeTargetShape.h:139
boost::numeric::ublas::vector< double > Vector
Definition for an Isis::LinearAlgebra::Vector of doubles.
Definition: LinearAlgebra.h:135
void initMesh(pcl::PolygonMesh::Ptr mesh)
Internalize a PointCloudLibrary polygon mesh in the target shape.
Definition: EmbreeTargetShape.cpp:466
RayHitInformation()
Default constructor for RayHitInformation.
Definition: EmbreeTargetShape.cpp:213
unsigned ignorePrimID
IDs of the primitives (trinagles) which should be ignored.
Definition: EmbreeTargetShape.h:122
Embree Target Shape for planetary bodies.
Definition: EmbreeTargetShape.h:155
void addVertices(int geomID)
Adds the vertices from the internalized vertex point cloud to the Embree scene.
Definition: EmbreeTargetShape.cpp:505
void intersectRay(RTCMultiHitRay &ray)
Intersect a ray with the target shape.
Definition: EmbreeTargetShape.cpp:656
RTCBounds sceneBounds() const
Returns the bounds of the Embree scene.
Definition: EmbreeTargetShape.cpp:594
Container for cube-like labels.
Definition: Pvl.h:135
float hitVs[16]
Barycentric v coordinate of the hits.
Definition: EmbreeTargetShape.h:86
LinearAlgebra::Vector intersection
The (x, y, z) intersection location.
Definition: EmbreeTargetShape.h:138
RayHitInformation getHitInformation(RTCMultiHitRay &ray, int hitIndex)
Extract the intersection point and unit surface normal from an RTCMultiHitRay that has been intersect...
Definition: EmbreeTargetShape.cpp:700
QString name() const
Return the name of the target shape.
Definition: EmbreeTargetShape.cpp:747
Struct for capturing occluded plates when using embree::rtcintersectscene.
Definition: EmbreeTargetShape.h:99
bool isValid() const
Return if a valid mesh is internalized and ready for use.
Definition: EmbreeTargetShape.cpp:757
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
int primID
The primitive ID of the hit.
Definition: EmbreeTargetShape.h:140
EmbreeTargetShape()
Default empty constructor.
Definition: EmbreeTargetShape.cpp:242
int lastHit
Index of the last hit in the hit containers.
Definition: EmbreeTargetShape.h:87
bool isOccluded(RTCOcclusionRay &ray)
Check if a ray intersects the target body.
Definition: EmbreeTargetShape.cpp:670
static void occlusionFilter(void *userDataPtr, RTCOcclusionRay &ray)
Filter function for collecting multiple primitiveIDs This function is called by the Embree library du...
Definition: EmbreeTargetShape.cpp:796
static void multiHitFilter(void *userDataPtr, RTCMultiHitRay &ray)
Filter function for collecting multiple hits during ray intersection.
Definition: EmbreeTargetShape.cpp:771
pcl::PolygonMesh::Ptr readDSK(FileName file)
Read a NAIF type 2 DSK file into a PointCloudLibrary polygon mesh.
Definition: EmbreeTargetShape.cpp:327