diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h
index 57c20bf30b..85253b1b24 100644
--- a/include/openspace/util/spicemanager.h
+++ b/include/openspace/util/spicemanager.h
@@ -260,8 +260,9 @@ public:
* \param from The frame to be converted from
* \param to The frame to be converted to
* \param ephemerisTime Time at which to get rotational matrix that transforms vector
+ * \return true if the conversion succeeded, false otherwise
*/
- void frameConversion(glm::dvec3& v, const std::string& from, const std::string& to, double ephemerisTime) const;
+ bool frameConversion(glm::dvec3& v, const std::string& from, const std::string& to, double ephemerisTime) const;
/**
* Finds the projection of one vector onto another vector.
@@ -354,7 +355,8 @@ public:
* \param method Type of shape model used for the target.
* \param referenceFrame Body-fixed, body-centered frame for target body.
* \param targetEpoch Time of the observation (seconds past J2000).
- * \return Visibility flag (SPICETRUE/SPICEFALSE).
+ * \param isVisible true if the target is visible
+ * \return The success of the function
* For further detail, refer to
* http://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/cspice/fovtrg_c.html
*/
@@ -364,7 +366,9 @@ public:
const std::string& method,
const std::string& referenceFrame,
const std::string& aberrationCorrection,
- double& targetEpoch) const;
+ double& targetEpoch,
+ bool& isVisible
+ ) const;
/**
* This method performs the same computation as the function its overloading
* with the exception that in doing so it assumes the inertial bodyfixed frame
@@ -376,7 +380,9 @@ public:
const std::string& observer,
const std::string& method,
const std::string& aberrationCorrection,
- double& targetEpoch) const;
+ double& targetEpoch,
+ bool& isVisible
+ ) const;
/**
* Returns the state vector (position and velocity) of a
diff --git a/openspace-data b/openspace-data
index e32b0c3da7..c0b29e01ee 160000
--- a/openspace-data
+++ b/openspace-data
@@ -1 +1 @@
-Subproject commit e32b0c3da73d5d85dc91477dc37f6171ded4af15
+Subproject commit c0b29e01ee664c1b2aa68afa359c56ddc15c8d47
diff --git a/scripts/default_startup.lua b/scripts/default_startup.lua
index d67632ca3d..6972acc1ce 100644
--- a/scripts/default_startup.lua
+++ b/scripts/default_startup.lua
@@ -1,5 +1,8 @@
openspace.setInvertRoll(true);
+-- openspace.time.setTime("2007 FEB 27 16:30:00")
+-- openspace.time.setDeltaTime(50);
+
openspace.time.setTime("2015-07-14T10:50:00.00") -- PLUTO
-- NH takes series of images from visible to dark side (across terminator)
-- Sequence lasts ~10 mins, (recommended dt = 10)
diff --git a/src/rendering/planets/renderableplanetprojection.cpp b/src/rendering/planets/renderableplanetprojection.cpp
index 027812071b..b11555dab5 100644
--- a/src/rendering/planets/renderableplanetprojection.cpp
+++ b/src/rendering/planets/renderableplanetprojection.cpp
@@ -392,8 +392,8 @@ void RenderablePlanetProjection::update(const UpdateData& data){
std::string _fovTarget = "";
for (int i = 0; i < 2; i++){
- _withinFOV = openspace::SpiceManager::ref().targetWithinFieldOfView(_instrumentID, potential[i], _projectorID, "ELLIPSOID", _aberration, _time[0]);
- if (_withinFOV){
+ bool success = openspace::SpiceManager::ref().targetWithinFieldOfView(_instrumentID, potential[i], _projectorID, "ELLIPSOID", _aberration, _time[0], _withinFOV);
+ if (success && _withinFOV){
_fovTarget = potential[i];
break;
}
diff --git a/src/rendering/renderablefov.cpp b/src/rendering/renderablefov.cpp
index dbf4c96b1f..cf84b46248 100644
--- a/src/rendering/renderablefov.cpp
+++ b/src/rendering/renderablefov.cpp
@@ -443,10 +443,10 @@ void RenderableFov::render(const RenderData& data){
_fovTarget = potential[0]; //default
for (int i = 0; i < 2; i++){
- _withinFOV = openspace::SpiceManager::ref().targetWithinFieldOfView(_instrumentID, potential[i],
+ bool success = openspace::SpiceManager::ref().targetWithinFieldOfView(_instrumentID, potential[i],
_spacecraft, _method,
- _aberrationCorrection, _time);
- if (_withinFOV){
+ _aberrationCorrection, _time, _withinFOV);
+ if (success && _withinFOV){
_fovTarget = potential[i];
break;
}
diff --git a/src/util/spicemanager.cpp b/src/util/spicemanager.cpp
index 1bcfb53c7f..aec7015bcf 100644
--- a/src/util/spicemanager.cpp
+++ b/src/util/spicemanager.cpp
@@ -95,6 +95,7 @@ SpiceManager::KernelIdentifier SpiceManager::loadKernel(const std::string& fileP
}
FileSys.setCurrentDirectory(fileDirectory);
+ LINFO("Loading SPICE kernel '" << path << "'");
// Load the kernel
furnsh_c(path.c_str());
@@ -126,6 +127,7 @@ void SpiceManager::unloadKernel(KernelIdentifier kernelId) {
if (it != _loadedKernels.end()) {
// No need to check for errors as we do not allow empty path names
+ LINFO("Unloading SPICE kernel '" << it->path << "'");
unload_c(it->path.c_str());
_loadedKernels.erase(it);
}
@@ -142,6 +144,7 @@ void SpiceManager::unloadKernel(const std::string& filePath) {
[&path](const KernelInformation& info) { return info.path == path; });
if (it != _loadedKernels.end()) {
+ LINFO("Unloading SPICE kernel '" << path << "'");
unload_c(path.c_str());
_loadedKernels.erase(it);
}
@@ -243,7 +246,8 @@ bool SpiceManager::spacecraftClockToET(const std::string& craftIdCode, double& c
int craftID;
getNaifId(craftIdCode, craftID);
sct2e_c(craftID, craftTicks, &et);
- return true;
+ bool hasError = checkForError("Error transforming spacecraft clock of '" + craftIdCode + "' at time " + std::to_string(craftTicks));
+ return !hasError;
}
bool SpiceManager::getETfromDate(const std::string& timeString,
@@ -321,18 +325,22 @@ bool SpiceManager::getTargetPosition(const std::string& target,
}
// do NOT remove this method.
-void SpiceManager::frameConversion(glm::dvec3& v, const std::string& from, const std::string& to, double ephemerisTime) const{
+bool SpiceManager::frameConversion(glm::dvec3& v, const std::string& from, const std::string& to, double ephemerisTime) const{
glm::dmat3 transform;
// get rotation matrix from frame A - frame B
pxform_c(from.c_str(), to.c_str(), ephemerisTime, (double(*)[3])glm::value_ptr(transform));
+ bool hasError = checkForError("Error converting from frame '" + from +
+ "' to frame '" + to + "' at time " + std::to_string(ephemerisTime));
+ if (hasError)
+ return false;
// re-express vector in new frame
mxv_c((double(*)[3])glm::value_ptr(transform), glm::value_ptr(v), glm::value_ptr(v));
+ return true;
}
glm::dvec3 SpiceManager::orthogonalProjection(glm::dvec3& v1, glm::dvec3& v2){
glm::dvec3 projected;
vproj_c(glm::value_ptr(v1), glm::value_ptr(v2), glm::value_ptr(projected));
-
return projected;
}
@@ -342,9 +350,12 @@ bool SpiceManager::targetWithinFieldOfView(const std::string& instrument,
const std::string& method,
const std::string& referenceFrame,
const std::string& aberrationCorrection,
- double& targetEpoch) const{
+ double& targetEpoch,
+ bool& isVisible
+ ) const
+{
- int visible ;
+ int visible;
fovtrg_c(instrument.c_str(),
target.c_str(),
method.c_str(),
@@ -353,7 +364,12 @@ bool SpiceManager::targetWithinFieldOfView(const std::string& instrument,
observer.c_str(),
&targetEpoch,
&visible);
- return visible;
+ isVisible = (visible == SPICETRUE);
+
+ bool hasError = checkForError("Checking if target '" + target +
+ "' is in view of instrument '" + instrument + "' failed");
+
+ return !hasError;
}
bool SpiceManager::targetWithinFieldOfView(const std::string& instrument,
@@ -361,7 +377,9 @@ bool SpiceManager::targetWithinFieldOfView(const std::string& instrument,
const std::string& observer,
const std::string& method,
const std::string& aberrationCorrection,
- double& targetEpoch) const{
+ double& targetEpoch,
+ bool& isVisible
+ ) const{
int visible;
@@ -376,7 +394,12 @@ bool SpiceManager::targetWithinFieldOfView(const std::string& instrument,
observer.c_str(),
&targetEpoch,
&visible);
- return visible;
+ isVisible = (visible == SPICETRUE);
+
+ bool hasError = checkForError("Checking if target '" + target +
+ "' is in view of instrument '" + instrument + "' failed");
+
+ return !hasError;
}
@@ -512,7 +535,7 @@ bool SpiceManager::getPositionPrimeMeridian(const std::string& fromFrame,
bool hasError = checkForError("Error retrieving position transform matrix from "
"frame '" + fromFrame + "' to frame '" + body +
- "at time '" + std::to_string(ephemerisTime) + "'");
+ "at time '" + std::to_string(ephemerisTime) + "' for prime meridian");
positionMatrix = glm::transpose(positionMatrix);
return !hasError;
@@ -544,7 +567,8 @@ bool SpiceManager::getPositionTransformMatrix(const std::string& fromFrame,
bool hasError = checkForError("Error retrieving position transform matrix from "
"frame '" + fromFrame + "' to frame '" + toFrame +
- "' at time '" + std::to_string(ephemerisTimeTo) + "'");
+ "' from time '" + std::to_string(ephemerisTimeFrom) + " to time '"
+ + std::to_string(ephemerisTimeTo) + "'");
positionMatrix = glm::transpose(positionMatrix);
return !hasError;