Isis 3 Programmer Reference
EmbreeShapeModel.h
1#ifndef EmbreeShapeModel_h
2#define EmbreeShapeModel_h
8/* SPDX-License-Identifier: CC0-1.0 */
9#include "ShapeModel.h"
10
11#include <vector>
12
13#include <embree3/rtcore.h>
14
15#include <QMap>
16#include <QVector>
17
18#include "Distance.h"
19#include "EmbreeTargetShape.h"
20#include "EmbreeTargetManager.h"
21#include "SurfacePoint.h"
22#include "Target.h"
23
24namespace Isis {
25 class Target;
26
38 public:
39 // Constructors
41 EmbreeShapeModel(Target *target, Pvl &pvl,
42 EmbreeTargetManager *targetManager);
43 EmbreeShapeModel(Target *target, const QString &shapefile,
44 EmbreeTargetManager *targetManager);
45
46 // Destructor
47 virtual ~EmbreeShapeModel();
48
49 // Intersect the shape model
50 virtual bool intersectSurface(std::vector<double> observerPos,
51 std::vector<double> lookDirection);
52 virtual bool intersectSurface(const Latitude &lat, const Longitude &lon,
53 const std::vector<double> &observerPos,
54 const bool &backCheck = true);
55 virtual bool intersectSurface(const SurfacePoint &surfpt,
56 const std::vector<double> &observerPos,
57 const bool &backCheck = true);
58
59 virtual void clearSurfacePoint();
60
61 virtual bool isDEM() const;
62
63 double getTolerance() const;
64 void setTolerance(const double &tolerance);
65
66 // Calculate the default normal of the current intersection point
67 virtual void calculateDefaultNormal();
68 // Calculate the surface normal of the current intersection point
69 virtual void calculateLocalNormal(QVector<double *> cornerNeighborPoints);
70 virtual void calculateSurfaceNormal();
71 QVector<double> ellipsoidNormal();
72
73 virtual double incidenceAngle(const std::vector<double> &uB);
74
75 virtual Distance localRadius(const Latitude &lat, const Longitude &lon);
76
77 // Determine if the internal intercept is occluded from the observer/lookdir
78 virtual bool isVisibleFrom(const std::vector<double> observerPos,
79 const std::vector<double> lookDirection);
80
81 private:
82 // Disallow copying because ShapeModel is not copyable
83 Q_DISABLE_COPY(EmbreeShapeModel)
84
85 void updateIntersection(const RayHitInformation hitInfo);
86 RTCMultiHitRay latlonToRay(const Latitude &lat, const Longitude &lon) const;
87 RTCMultiHitRay pointToRay(const SurfacePoint &point) const;
88 QVector< RayHitInformation > sortHits(RTCMultiHitRay &ray,
89 LinearAlgebra::Vector &observer);
90
91 EmbreeTargetShape *m_targetShape;
99 double m_tolerance;
100 QString m_shapeFile;
102 };
103};
104
105#endif
Distance measurement, usually in meters.
Definition Distance.h:34
General purpose Embree ray tracing model.
EmbreeTargetManager * m_targetManager
!< The target body and Embree objects for intersection.
QVector< double > ellipsoidNormal()
Compute the true surface normal vector of an ellipsoid.
virtual bool isVisibleFrom(const std::vector< double > observerPos, const std::vector< double > lookDirection)
Check if the current internalized surface point is visible from an observer position and look directi...
RTCMultiHitRay pointToRay(const SurfacePoint &point) const
Given a surface point, create a ray that goes from the origin of the target to the surface point.
virtual bool intersectSurface(std::vector< double > observerPos, std::vector< double > lookDirection)
This method computes an intercept point given an observer location and look direction using the Embre...
virtual Distance localRadius(const Latitude &lat, const Longitude &lon)
Determine radius at a given lat/lon grid point.
virtual void calculateDefaultNormal()
Return the surface normal of the ellipsoid as the default.
virtual void clearSurfacePoint()
Flag that the ShapeModel does not have a surface point or normal.
void setTolerance(const double &tolerance)
Set the tolerance used when checking if the stored surface point is visible.
QString m_shapeFile
!< Tolerance for checking visibility.
virtual void calculateSurfaceNormal()
Return the surface normal of the ellipsoid.
RTCMultiHitRay latlonToRay(const Latitude &lat, const Longitude &lon) const
Given a latitude and longitude, create a ray that goes from the origin of the target through that lat...
virtual ~EmbreeShapeModel()
Destructor that notifies the target shape manager that the target shape is no longer in use.
void updateIntersection(const RayHitInformation hitInfo)
Update the ShapeModel given an intersection and normal.
double getTolerance() const
Get the tolerance used when checking if the stored surface point is visible.
double m_tolerance
!< This manages EmbreeTargetShapes to allow for sharing of them between EmbreeShapeModels and deletes...
virtual double incidenceAngle(const std::vector< double > &uB)
Computes and returns incidence angle, in degrees, given the illuminator position.
virtual bool isDEM() const
Indicates that this shape model is not from a DEM.
QVector< RayHitInformation > sortHits(RTCMultiHitRay &ray, LinearAlgebra::Vector &observer)
Sort all intersections by a ray based on distance to a point.
virtual void calculateLocalNormal(QVector< double * > cornerNeighborPoints)
Compute the normal for a local region of surface points.
EmbreeShapeModel()
Default constructor sets type to a TIN.
Class for managing the construction and destruction of EmbreeTargetShapes.
Embree Target Shape for planetary bodies.
This class is designed to encapsulate the concept of a Latitude.
Definition Latitude.h:51
boost::numeric::ublas::vector< double > Vector
Definition for an Isis::LinearAlgebra::Vector of doubles.
This class is designed to encapsulate the concept of a Longitude.
Definition Longitude.h:40
Container for cube-like labels.
Definition Pvl.h:119
Define shapes and provide utilities for Isis targets.
Definition ShapeModel.h:66
This class defines a body-fixed surface point.
This class is used to create and store valid Isis targets.
Definition Target.h:63
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
Struct for capturing multiple intersections when using embree::rtcintersectscene.
Container that holds the body fixed intersection point and unit surface normal for a hit.