mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-18 10:59:18 -06:00
Merge
This commit is contained in:
@@ -34,7 +34,18 @@ function preInitialization()
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/lsk/naif0011.tls")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/pck/bennu_SPH250m.tpc")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/pck/bennu_v10.tpc")
|
||||
|
||||
|
||||
-- Low res SPK
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/orx_160917_231024_pgaa3_day15m60_v1.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/orx_160914_231024_pgaa3_day12m60_v1.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/orx_160908_231024_pgaa3_day06m60_v1.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/spk_orx_160908_231024_pgaa2_day06m60_v3.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/orx_160908_231024_pgaa2_day06m60.bsp")
|
||||
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/OREX_20160908_M60_complete.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/OREX_20160904_M45_complete.bsp")
|
||||
|
||||
-- SPK
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/de421.bsp")
|
||||
openspace.spice.loadKernel("${SPICE}/OsirisRexKernels/background/spk/sb-101955-76.bsp")
|
||||
|
||||
@@ -136,7 +147,7 @@ function preInitialization()
|
||||
-- openspace.time.setTime("2015-07-12T22:19:20.00")
|
||||
-- openspace.time.setTime("2015-07-13T20:59:00.00")
|
||||
-- openspace.time.setTime("2015-07-14T02:41:55.00")
|
||||
openspace.time.setTime("2019-01-13T19:18:00.00")
|
||||
openspace.time.setTime("2016-09-08T00:00:00.00")
|
||||
openspace.time.setDeltaTime(0)
|
||||
end
|
||||
|
||||
|
||||
@@ -19,17 +19,12 @@ return {
|
||||
Type = "simple",
|
||||
Color = "textures/osirisTex.png",
|
||||
},
|
||||
Rotation = {
|
||||
Source = "ORX_SPACECRAFT",
|
||||
Destination = "GALACTIC"
|
||||
},
|
||||
Shading = {
|
||||
PerformShading = true,
|
||||
Fadeable = false,
|
||||
Ghosting = false,
|
||||
},
|
||||
},
|
||||
|
||||
Ephemeris = {
|
||||
Type = "Spice",
|
||||
Body = "OSIRIS-REX",
|
||||
@@ -37,12 +32,75 @@ return {
|
||||
Reference = "GALACTIC",
|
||||
Observer = BENNU_BODY,
|
||||
},
|
||||
Rotation = {
|
||||
Source = "ORX_SPACECRAFT",
|
||||
Destination = "GALACTIC"
|
||||
},
|
||||
|
||||
GuiName = "/Solar/OsirisRex"
|
||||
},
|
||||
|
||||
{
|
||||
Name = "ORX_OCAMS_POLYCAM",
|
||||
Parent = "OsirisRex",
|
||||
Renderable = {
|
||||
Type = "RenderableModel",
|
||||
Body = "OSIRIS-REX",
|
||||
Geometry = {
|
||||
Type = "MultiModelGeometry",
|
||||
GeometryFile = "models/Osiris.obj",
|
||||
Magnification = 0,
|
||||
},
|
||||
Textures = {
|
||||
Type = "simple",
|
||||
Color = "textures/osirisTex.png",
|
||||
},
|
||||
Shading = {
|
||||
PerformShading = true,
|
||||
Fadeable = false,
|
||||
Ghosting = false,
|
||||
},
|
||||
},
|
||||
Ephemeris = {
|
||||
Type = "Spice",
|
||||
Body = "OSIRIS-REX",
|
||||
-- Reference = "ECLIPJ2000",
|
||||
Reference = "GALACTIC",
|
||||
Observer = BENNU_BODY,
|
||||
},
|
||||
Rotation = {
|
||||
Source = "ORX_SPACECRAFT",
|
||||
Destination = "GALACTIC"
|
||||
},
|
||||
|
||||
GuiName = "/Solar/OsirisRex"
|
||||
},
|
||||
|
||||
{
|
||||
Name = "OsirisRexPath",
|
||||
Name = "OsirisRexPathSolar",
|
||||
Parent = "SolarSystemBarycenter",
|
||||
Renderable = {
|
||||
Type = "RenderablePath",
|
||||
Body = "OSIRIS-REX",
|
||||
Frame = "GALACTIC",
|
||||
Observer = "SUN",
|
||||
RGB = { 0.0, 1.0, 0.5},
|
||||
TimeSteps = 86400, -- Number of seconds in a day
|
||||
PointSteps = 10, -- Every 10 days
|
||||
Textures = {
|
||||
Type = "simple",
|
||||
Color = "textures/glare_blue.png",
|
||||
-- need to add different texture
|
||||
},
|
||||
DrawLine = true,
|
||||
|
||||
StartTime = "2016 SEP 8 12:00:00",
|
||||
EndTime = "2023 SEP 24 12:00:00"
|
||||
},
|
||||
GuiName = "/Solar/OsirisRexPathSolar"
|
||||
},
|
||||
{
|
||||
Name = "OsirisRexPathLocal",
|
||||
Parent = "Bennu2",
|
||||
Renderable = {
|
||||
Type = "RenderablePath",
|
||||
@@ -60,8 +118,8 @@ return {
|
||||
DrawLine = true,
|
||||
|
||||
StartTime = "2016 SEP 8 12:00:00",
|
||||
EndTime = "2022 OCT 17 12:00:00"
|
||||
EndTime = "2023 SEP 24 12:00:00"
|
||||
},
|
||||
GuiName = "/Solar/OsirisRexTrail"
|
||||
GuiName = "/Solar/OsirisRexPathLocal"
|
||||
},
|
||||
}
|
||||
|
||||
@@ -39,7 +39,6 @@ public:
|
||||
virtual ~Ephemeris();
|
||||
virtual bool initialize();
|
||||
virtual const glm::dvec3& position() const = 0;
|
||||
virtual const glm::dmat3& worldRotationMatrix() const = 0;
|
||||
virtual void update(const UpdateData& data);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -50,8 +50,7 @@ public:
|
||||
long long updateTimeEphemeris; // time in ns
|
||||
};
|
||||
|
||||
static std::string RootNodeName;
|
||||
|
||||
static const std::string RootNodeName;
|
||||
static const std::string KeyName;
|
||||
static const std::string KeyParentName;
|
||||
static const std::string KeyDependencies;
|
||||
@@ -105,11 +104,16 @@ private:
|
||||
bool sphereInsideFrustum(const psc& s_pos, const PowerScaledScalar& s_rad, const Camera* camera);
|
||||
|
||||
glm::dvec3 calculateWorldPosition() const;
|
||||
glm::dmat3 calculateWorldRotation() const;
|
||||
|
||||
std::vector<SceneGraphNode*> _children;
|
||||
SceneGraphNode* _parent;
|
||||
Ephemeris* _ephemeris;
|
||||
|
||||
std::string _rotationSourceFrame;
|
||||
std::string _rotationDestinationFrame;
|
||||
glm::dmat3 _rotationMatrix;
|
||||
|
||||
PerformanceRecord _performanceRecord;
|
||||
|
||||
Renderable* _renderable;
|
||||
@@ -120,6 +124,7 @@ private:
|
||||
|
||||
//psc _worldPositionCached;
|
||||
glm::dvec3 _worldPositionCached;
|
||||
glm::dmat3 _worldRotationCached;
|
||||
};
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
@@ -51,7 +51,7 @@ struct RenderData {
|
||||
psc position;
|
||||
bool doPerformanceMeasurement;
|
||||
glm::dvec3 positionVec3;
|
||||
|
||||
glm::dmat3 rotation;
|
||||
};
|
||||
|
||||
struct RaycasterTask {
|
||||
|
||||
@@ -77,25 +77,14 @@ const glm::dvec3& SpiceEphemeris::position() const {
|
||||
return _position;
|
||||
}
|
||||
|
||||
const glm::dmat3& SpiceEphemeris::worldRotationMatrix() const {
|
||||
return _worldRotationMatrix;
|
||||
}
|
||||
|
||||
void SpiceEphemeris::update(const UpdateData& data) {
|
||||
if (!_kernelsLoadedSuccessfully)
|
||||
return;
|
||||
|
||||
double lightTime = 0.0;
|
||||
glm::dvec3 position = SpiceManager::ref().targetPosition(_targetName, _originName, "GALACTIC", {}, data.time, lightTime);
|
||||
std::string frame = SpiceManager::ref().frameFromBody(_targetName);
|
||||
if (SpiceManager::ref().hasFrameId(frame))
|
||||
{
|
||||
_worldRotationMatrix = SpiceManager::ref().positionTransformMatrix(frame, "GALACTIC", data.time);
|
||||
}
|
||||
else
|
||||
{
|
||||
_worldRotationMatrix = glm::dmat3(1.0);
|
||||
}
|
||||
glm::dvec3 position = SpiceManager::ref().targetPosition(
|
||||
_targetName, _originName, "GALACTIC", {}, data.time, lightTime);
|
||||
|
||||
//double interval = openspace::ImageSequencer::ref().getIntervalLength();
|
||||
//if (_ghosting == "TRUE" && interval > 60){
|
||||
// double _time = openspace::ImageSequencer::ref().getNextCaptureTime();
|
||||
|
||||
@@ -35,14 +35,12 @@ class SpiceEphemeris : public Ephemeris {
|
||||
public:
|
||||
SpiceEphemeris(const ghoul::Dictionary& dictionary);
|
||||
virtual const glm::dvec3& position() const;
|
||||
virtual const glm::dmat3& worldRotationMatrix() const;
|
||||
void update(const UpdateData& data) override;
|
||||
|
||||
private:
|
||||
std::string _targetName;
|
||||
std::string _originName;
|
||||
glm::dvec3 _position;
|
||||
glm::dmat3 _worldRotationMatrix;
|
||||
bool _kernelsLoadedSuccessfully;
|
||||
//std::string _ghosting;
|
||||
std::string _name;
|
||||
|
||||
@@ -47,10 +47,6 @@ const glm::dvec3& StaticEphemeris::position() const {
|
||||
return _position;
|
||||
}
|
||||
|
||||
const glm::dmat3& StaticEphemeris::worldRotationMatrix() const {
|
||||
return glm::dmat3(1.0);
|
||||
}
|
||||
|
||||
void StaticEphemeris::update(const UpdateData&) {}
|
||||
|
||||
} // namespace openspace
|
||||
@@ -35,7 +35,6 @@ public:
|
||||
= ghoul::Dictionary());
|
||||
virtual ~StaticEphemeris();
|
||||
virtual const glm::dvec3& position() const;
|
||||
virtual const glm::dmat3& worldRotationMatrix() const;
|
||||
virtual void update(const UpdateData& data) override;
|
||||
private:
|
||||
glm::dvec3 _position;
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
|
||||
namespace {
|
||||
const std::string _loggerCat = "RenderableModel";
|
||||
const std::string keySource = "Rotation.Source";
|
||||
const std::string keyDestination = "Rotation.Destination";
|
||||
const std::string keyGeometry = "Geometry";
|
||||
const std::string keyBody = "Body";
|
||||
const std::string keyStart = "StartTime";
|
||||
@@ -61,12 +59,12 @@ namespace {
|
||||
|
||||
namespace openspace {
|
||||
|
||||
RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary)
|
||||
RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary)
|
||||
: Renderable(dictionary)
|
||||
, _colorTexturePath("colorTexture", "Color Texture")
|
||||
, _performFade("performFading", "Perform Fading", false)
|
||||
, _debugModelRotation("modelrotation", "Model Rotation", glm::vec3(0.f), glm::vec3(0.f), glm::vec3(360.f))
|
||||
, _fading("fading", "Fade", 0)
|
||||
, _debugModelRotation("modelrotation", "Model Rotation", glm::vec3(0.f), glm::vec3(0.f), glm::vec3(360.f))
|
||||
, _programObject(nullptr)
|
||||
, _texture(nullptr)
|
||||
, _geometry(nullptr)
|
||||
@@ -92,20 +90,21 @@ namespace openspace {
|
||||
_colorTexturePath = absPath(texturePath);
|
||||
|
||||
addPropertySubOwner(_geometry);
|
||||
|
||||
addProperty(_colorTexturePath);
|
||||
_colorTexturePath.onChange(std::bind(&RenderableModel::loadTexture, this));
|
||||
|
||||
addProperty(_debugModelRotation);
|
||||
|
||||
dictionary.getValue(keySource, _source);
|
||||
dictionary.getValue(keyDestination, _destination);
|
||||
//dictionary.getValue(keySource, _source);
|
||||
//dictionary.getValue(keyDestination, _destination);
|
||||
if (dictionary.hasKeyAndValue<glm::dmat3>(keyModelTransform))
|
||||
dictionary.getValue(keyModelTransform, _modelTransform);
|
||||
else
|
||||
_modelTransform = glm::dmat3(1.f);
|
||||
dictionary.getValue(keyBody, _target);
|
||||
|
||||
openspace::SpiceManager::ref().addFrame(_target, _source);
|
||||
//openspace::SpiceManager::ref().addFrame(_target, _source);
|
||||
|
||||
//setBoundingSphere(pss(1.f, 9.f));
|
||||
addProperty(_performShading);
|
||||
@@ -149,8 +148,8 @@ bool RenderableModel::initialize() {
|
||||
|
||||
completeSuccess &= (_texture != nullptr);
|
||||
completeSuccess &= _geometry->initialize(this);
|
||||
completeSuccess &= !_source.empty();
|
||||
completeSuccess &= !_destination.empty();
|
||||
//completeSuccess &= !_source.empty();
|
||||
//completeSuccess &= !_destination.empty();
|
||||
|
||||
return completeSuccess;
|
||||
}
|
||||
@@ -198,7 +197,7 @@ void RenderableModel::render(const RenderData& data) {
|
||||
_fading = _fading + 0.01f;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// debug rotation controlled from GUI
|
||||
glm::mat4 unitMat4(1);
|
||||
@@ -211,7 +210,7 @@ void RenderableModel::render(const RenderData& data) {
|
||||
// Model transform and view transform needs to be in double precision
|
||||
glm::dmat4 modelTransform =
|
||||
glm::translate(glm::dmat4(1.0), data.positionVec3) * // Translation
|
||||
glm::dmat4(_stateMatrix) * // Spice rotation
|
||||
glm::dmat4(data.rotation) * // Spice rotation
|
||||
debugModelRotation; // debug model rotation controlled from GUI
|
||||
glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform;
|
||||
|
||||
@@ -264,11 +263,6 @@ void RenderableModel::update(const UpdateData& data) {
|
||||
|
||||
double lt;
|
||||
_sunPos = openspace::SpiceManager::ref().targetPosition("SUN", "SUN", "GALACTIC", {}, _time, lt);
|
||||
|
||||
// set spice-orientation in accordance to timestamp
|
||||
if (!_source.empty()) {
|
||||
_stateMatrix = SpiceManager::ref().positionTransformMatrix(_source, _destination, _time) * _modelTransform;
|
||||
}
|
||||
}
|
||||
|
||||
void RenderableModel::loadTexture() {
|
||||
|
||||
@@ -67,10 +67,10 @@ private:
|
||||
glm::dmat3 _modelTransform;
|
||||
|
||||
float _alpha;
|
||||
glm::dmat3 _stateMatrix;
|
||||
//glm::dmat3 _stateMatrix;
|
||||
|
||||
std::string _source;
|
||||
std::string _destination;
|
||||
//std::string _source;
|
||||
//std::string _destination;
|
||||
std::string _target;
|
||||
|
||||
//bool _isGhost;
|
||||
|
||||
@@ -51,6 +51,7 @@ namespace {
|
||||
const std::string keyTimeSteps = "TimeSteps";
|
||||
const std::string keyPointSteps = "PointSteps";
|
||||
const std::string keyDrawLine = "DrawLine";
|
||||
const std::string keRenderDistanceInterval = "RenderDistanceInterval";
|
||||
|
||||
}
|
||||
|
||||
@@ -74,8 +75,10 @@ RenderablePath::RenderablePath(const ghoul::Dictionary& dictionary)
|
||||
_successfullDictionaryFetch &= dictionary.getValue(keyFrame, _frame);
|
||||
_successfullDictionaryFetch &= dictionary.getValue(keyTimeSteps, _increment);
|
||||
|
||||
if (!dictionary.getValue(keyPointSteps, _pointSteps))
|
||||
_pointSteps = 4;
|
||||
float fPointSteps; // Dictionary can not pick out ints...
|
||||
if (!dictionary.getValue(keyPointSteps, fPointSteps))
|
||||
fPointSteps = 4;
|
||||
_pointSteps = fPointSteps;
|
||||
|
||||
glm::vec3 color(0.f);
|
||||
if (dictionary.hasKeyAndValue<glm::vec3>(keyColor))
|
||||
|
||||
@@ -790,6 +790,7 @@ void InteractionHandler::postSynchronizationPreDraw() {
|
||||
}
|
||||
else {
|
||||
_currentInteractionMode->updateCameraStateFromMouseStates(*_camera);
|
||||
_camera->setFocusPositionVec3(focusNode()->worldPosition());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
// open space includes
|
||||
#include <openspace/scene/scenegraphnode.h>
|
||||
#include <openspace/query/query.h>
|
||||
#include <openspace/util/spicemanager.h>
|
||||
#include <openspace/util/time.h>
|
||||
|
||||
// ghoul includes
|
||||
#include <ghoul/logging/logmanager.h>
|
||||
@@ -45,11 +47,13 @@ namespace {
|
||||
const std::string _loggerCat = "SceneGraphNode";
|
||||
const std::string KeyRenderable = "Renderable";
|
||||
const std::string KeyEphemeris = "Ephemeris";
|
||||
const std::string keyRotation = "Rotation";
|
||||
}
|
||||
|
||||
namespace openspace {
|
||||
|
||||
std::string SceneGraphNode::RootNodeName = "Root";
|
||||
|
||||
// Constants used outside of this file
|
||||
const std::string SceneGraphNode::RootNodeName = "Root";
|
||||
const std::string SceneGraphNode::KeyName = "Name";
|
||||
const std::string SceneGraphNode::KeyParentName = "Parent";
|
||||
const std::string SceneGraphNode::KeyDependencies = "Dependencies";
|
||||
@@ -81,7 +85,7 @@ SceneGraphNode* SceneGraphNode::createFromDictionary(const ghoul::Dictionary& di
|
||||
return nullptr;
|
||||
}
|
||||
result->addPropertySubOwner(result->_renderable);
|
||||
LDEBUG("Successfully create renderable for '" << result->name() << "'");
|
||||
LDEBUG("Successfully created renderable for '" << result->name() << "'");
|
||||
}
|
||||
|
||||
if (dictionary.hasKey(KeyEphemeris)) {
|
||||
@@ -96,7 +100,30 @@ SceneGraphNode* SceneGraphNode::createFromDictionary(const ghoul::Dictionary& di
|
||||
return nullptr;
|
||||
}
|
||||
//result->addPropertySubOwner(result->_ephemeris);
|
||||
LDEBUG("Successfully create ephemeris for '" << result->name() << "'");
|
||||
LDEBUG("Successfully created ephemeris for '" << result->name() << "'");
|
||||
}
|
||||
|
||||
if (dictionary.hasKey(keyRotation)) {
|
||||
bool rotationSuccess = true;
|
||||
|
||||
ghoul::Dictionary rotationDictionary;
|
||||
rotationSuccess &= dictionary.getValue("Rotation.Source", result->_rotationSourceFrame);
|
||||
rotationSuccess &= dictionary.getValue("Rotation.Destination", result->_rotationDestinationFrame);
|
||||
|
||||
if (!rotationSuccess) {
|
||||
LERROR("Failed to create rotation for SceneGraphNode '"
|
||||
<< result->name() << "'");
|
||||
delete result;
|
||||
return nullptr;
|
||||
}
|
||||
else
|
||||
LDEBUG("Successfully created rotation for SceneGraphNode '" << result->name() << "'");
|
||||
}
|
||||
else {
|
||||
LERROR("Rotation specification not found for SceneGraphNode '"
|
||||
<< result->name() << "'. Using static rotation instead");
|
||||
result->_rotationSourceFrame = "GALACTIC";
|
||||
result->_rotationDestinationFrame = "GALACTIC";
|
||||
}
|
||||
|
||||
//std::string parentName;
|
||||
@@ -122,6 +149,7 @@ SceneGraphNode* SceneGraphNode::createFromDictionary(const ghoul::Dictionary& di
|
||||
SceneGraphNode::SceneGraphNode()
|
||||
: _parent(nullptr)
|
||||
, _ephemeris(new StaticEphemeris)
|
||||
, _rotationMatrix(glm::dmat3(1.0))
|
||||
, _performanceRecord({0, 0, 0})
|
||||
, _renderable(nullptr)
|
||||
, _renderableVisible(false)
|
||||
@@ -201,8 +229,37 @@ void SceneGraphNode::update(const UpdateData& data) {
|
||||
else
|
||||
_renderable->update(newUpdateData);
|
||||
}
|
||||
|
||||
// TODO : Need to be checking for real if the frame is fixed since fixed frames
|
||||
// do not have CK coverage.
|
||||
bool sourceFrameIsFixed = _rotationSourceFrame == "GALACTIC";
|
||||
bool destinationFrameIsFixed = _rotationDestinationFrame == "GALACTIC";
|
||||
|
||||
bool sourceHasCoverage =
|
||||
!_rotationSourceFrame.empty() &&
|
||||
SpiceManager::ref().hasFrameId(_rotationSourceFrame) &&
|
||||
(SpiceManager::ref().hasCkCoverage(_rotationSourceFrame, data.time) ||
|
||||
sourceFrameIsFixed);
|
||||
bool destinationHasCoverage =
|
||||
!_rotationDestinationFrame.empty() &&
|
||||
SpiceManager::ref().hasFrameId(_rotationDestinationFrame) &&
|
||||
(SpiceManager::ref().hasCkCoverage(_rotationDestinationFrame, data.time) ||
|
||||
destinationFrameIsFixed);
|
||||
|
||||
if (sourceHasCoverage && destinationHasCoverage) {
|
||||
_rotationMatrix = SpiceManager::ref().positionTransformMatrix(
|
||||
_rotationSourceFrame,
|
||||
_rotationDestinationFrame,
|
||||
data.time);
|
||||
}
|
||||
else {
|
||||
_rotationMatrix = glm::dmat3(1.0);
|
||||
}
|
||||
|
||||
_worldPositionCached = calculateWorldPosition();
|
||||
newUpdateData.position = worldPosition();
|
||||
|
||||
_worldRotationCached = calculateWorldRotation();
|
||||
}
|
||||
|
||||
void SceneGraphNode::evaluate(const Camera* camera, const psc& parentPosition) {
|
||||
@@ -248,7 +305,12 @@ void SceneGraphNode::evaluate(const Camera* camera, const psc& parentPosition) {
|
||||
void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) {
|
||||
const psc thisPositionPSC = psc::CreatePowerScaledCoordinate(_worldPositionCached.x, _worldPositionCached.y, _worldPositionCached.z);
|
||||
|
||||
RenderData newData = {data.camera, thisPositionPSC, data.doPerformanceMeasurement, _worldPositionCached};
|
||||
RenderData newData = {
|
||||
data.camera,
|
||||
thisPositionPSC,
|
||||
data.doPerformanceMeasurement,
|
||||
_worldPositionCached,
|
||||
_worldRotationCached};
|
||||
|
||||
_performanceRecord.renderTime = 0;
|
||||
if (_renderableVisible && _renderable->isVisible() && _renderable->isReady() && _renderable->isEnabled()) {
|
||||
@@ -326,7 +388,7 @@ glm::dvec3 SceneGraphNode::worldPosition() const
|
||||
|
||||
const glm::dmat3& SceneGraphNode::worldRotationMatrix() const
|
||||
{
|
||||
return _ephemeris->worldRotationMatrix();
|
||||
return _worldRotationCached;
|
||||
}
|
||||
|
||||
glm::dvec3 SceneGraphNode::calculateWorldPosition() const {
|
||||
@@ -339,6 +401,16 @@ glm::dvec3 SceneGraphNode::calculateWorldPosition() const {
|
||||
}
|
||||
}
|
||||
|
||||
glm::dmat3 SceneGraphNode::calculateWorldRotation() const {
|
||||
// recursive up the hierarchy if there are parents available
|
||||
if (_parent) {
|
||||
return _parent->calculateWorldRotation() * _rotationMatrix;
|
||||
}
|
||||
else {
|
||||
return _rotationMatrix;
|
||||
}
|
||||
}
|
||||
|
||||
SceneGraphNode* SceneGraphNode::parent() const
|
||||
{
|
||||
return _parent;
|
||||
|
||||
@@ -80,11 +80,6 @@ namespace openspace {
|
||||
void Camera::setFocusPositionVec3(Vec3 pos) {
|
||||
std::lock_guard<std::mutex> _lock(_mutex);
|
||||
_focusPosition = pos;
|
||||
|
||||
_cachedViewDirection.isDirty = true;
|
||||
_cachedLookupVector.isDirty = true;
|
||||
_cachedViewRotationMatrix.isDirty = true;
|
||||
_cachedCombinedViewMatrix.isDirty = true;
|
||||
}
|
||||
|
||||
void Camera::setRotation(Quat rotation) {
|
||||
|
||||
Reference in New Issue
Block a user