diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 35b60d6037..59c4a8b89c 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -55,6 +55,7 @@ public: static Renderable* createFromDictionary(const ghoul::Dictionary& dictionary); // constructors & destructor + Renderable(); Renderable(const ghoul::Dictionary& dictionary); virtual ~Renderable(); diff --git a/include/openspace/util/powerscaledscalar.h b/include/openspace/util/powerscaledscalar.h index b3c5300075..d8f07935a7 100644 --- a/include/openspace/util/powerscaledscalar.h +++ b/include/openspace/util/powerscaledscalar.h @@ -44,6 +44,7 @@ public: const glm::vec2& vec2() const; float lengthf() const; + double lengthd() const; // operator overloading PowerScaledScalar& operator=(const PowerScaledScalar& rhs); diff --git a/modules/planetbrowsing/CMakeLists.txt b/modules/planetbrowsing/CMakeLists.txt index cffa695374..5402965d89 100644 --- a/modules/planetbrowsing/CMakeLists.txt +++ b/modules/planetbrowsing/CMakeLists.txt @@ -26,11 +26,13 @@ include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/planet.h + ${CMAKE_CURRENT_SOURCE_DIR}/rendering/distanceswitch.h ) source_group("Header Files" FILES ${HEADER_FILES}) set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/planet.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/rendering/distanceswitch.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/planetbrowsing/planetbrowsingmodule.cpp b/modules/planetbrowsing/planetbrowsingmodule.cpp index 9799f0cdd6..9616a26499 100644 --- a/modules/planetbrowsing/planetbrowsingmodule.cpp +++ b/modules/planetbrowsing/planetbrowsingmodule.cpp @@ -24,7 +24,8 @@ #include -#include +#include +#include #include #include @@ -44,6 +45,7 @@ void PlanetBrowsingModule::internalInitialize() { ghoul_assert(fRenderable, "Renderable factory was not created"); fRenderable->registerClass("Planet"); + fRenderable->registerClass("DistanceSwitch"); } } // namespace openspace diff --git a/modules/planetbrowsing/rendering/distanceswitch.cpp b/modules/planetbrowsing/rendering/distanceswitch.cpp new file mode 100644 index 0000000000..42fe4e8ebd --- /dev/null +++ b/modules/planetbrowsing/rendering/distanceswitch.cpp @@ -0,0 +1,84 @@ +/***************************************************************************************** +* * +* OpenSpace * +* * +* Copyright (c) 2014-2016 * +* * +* Permission is hereby granted, free of charge, to any person obtaining a copy of this * +* software and associated documentation files (the "Software"), to deal in the Software * +* without restriction, including without limitation the rights to use, copy, modify, * +* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * +* permit persons to whom the Software is furnished to do so, subject to the following * +* conditions: * +* * +* The above copyright notice and this permission notice shall be included in all copies * +* or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +****************************************************************************************/ + +// open space includes +#include + +namespace { + const std::string _loggerCat = "DistanceSwitch"; +} + +namespace openspace { + +DistanceSwitch::DistanceSwitch(){ + +} + +DistanceSwitch::~DistanceSwitch() { + +} + +bool DistanceSwitch::initialize() { + return true; +} + +bool DistanceSwitch::deinitialize() { + return true; +} + +bool DistanceSwitch::isReady() const { + return true; +} + +void DistanceSwitch::render(const RenderData& data) { + pss pssDistanceToCamera = (data.camera.position() - data.position).length(); + double distanceToCamera = pssDistanceToCamera.lengthd(); + + if (distanceToCamera > _maxDistances.back()) { + return; + } + + // linear search through nodes to find which Renderable to render + for (int i = 0; i < _renderables.size(); ++i) { + if (distanceToCamera < _maxDistances[i]) { + _renderables[i]->render(data); + return; + } + } +} + +void DistanceSwitch::update(const UpdateData& data) { + +} + + +void DistanceSwitch::addSwitchValue(std::shared_ptr renderable, double maxDistance) { + ghoul_assert(maxDistance > _maxDistances.back(), "Renderables must be inserted in ascending order wrt distance"); + + _renderables.push_back(renderable); + _maxDistances.push_back(maxDistance); +} + +} // namespace openspace + diff --git a/modules/planetbrowsing/rendering/distanceswitch.h b/modules/planetbrowsing/rendering/distanceswitch.h new file mode 100644 index 0000000000..366bebcaa1 --- /dev/null +++ b/modules/planetbrowsing/rendering/distanceswitch.h @@ -0,0 +1,75 @@ +/***************************************************************************************** +* * +* OpenSpace * +* * +* Copyright (c) 2014-2016 * +* * +* Permission is hereby granted, free of charge, to any person obtaining a copy of this * +* software and associated documentation files (the "Software"), to deal in the Software * +* without restriction, including without limitation the rights to use, copy, modify, * +* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * +* permit persons to whom the Software is furnished to do so, subject to the following * +* conditions: * +* * +* The above copyright notice and this permission notice shall be included in all copies * +* or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +****************************************************************************************/ + +#ifndef __DDLODSWITCH_H__ +#define __DDLODSWITCH_H__ + +// open space includes +#include +#include +#include +#include +#include + +#include + +namespace openspace { + + +/** + Selects a specific Renderable to be used for rendering, based on distance to the + camera +*/ +class DistanceSwitch : public Renderable { +public: + + DistanceSwitch(); + ~DistanceSwitch(); + + bool initialize() override; + bool deinitialize() override; + bool isReady() const override; + + /** + Picks the first Renderable with the associated maxDistance greater than the + current distance to the camera + */ + void render(const RenderData& data) override; + void update(const UpdateData& data) override; + + /** + Adds a new renderable (first argument) which may be rendered only if the distance + to the camera is less than maxDistance (second argument) + */ + void addSwitchValue(std::shared_ptr renderable, double maxDistance); + +private: + + + std::vector> _renderables; + std::vector _distanceThresholds; + +}; +} // openspace +#endif //__DDLODSWITCH_H__ diff --git a/modules/planetbrowsing/rendering/planet.cpp b/modules/planetbrowsing/rendering/planet.cpp index 26076597cd..a72a042693 100644 --- a/modules/planetbrowsing/rendering/planet.cpp +++ b/modules/planetbrowsing/rendering/planet.cpp @@ -33,8 +33,7 @@ namespace { namespace openspace { -Planet::Planet(const ghoul::Dictionary& dictionary) - : Renderable(dictionary) { +Planet::Planet(const ghoul::Dictionary& dictionary){ std::string name; bool success = dictionary.getValue(SceneGraphNode::KeyName, name); @@ -61,10 +60,6 @@ bool Planet::isReady() const { return true; } -void Planet::render(const RenderData& data) { - -} - void Planet::update(const UpdateData& data) { } diff --git a/modules/planetbrowsing/rendering/planet.h b/modules/planetbrowsing/rendering/planet.h index 7d75ef1c2b..cdc516a7fa 100644 --- a/modules/planetbrowsing/rendering/planet.h +++ b/modules/planetbrowsing/rendering/planet.h @@ -28,12 +28,16 @@ // open space includes #include +#include +#include + + //#include //#include namespace openspace { -class Planet : public Renderable { +class Planet : public DistanceSwitch { public: Planet(const ghoul::Dictionary& dictionary); ~Planet(); @@ -42,7 +46,6 @@ public: bool deinitialize() override; bool isReady() const override; - void render(const RenderData& data) override; void update(const UpdateData& data) override; private: diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 00f3950e14..4608a3de02 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -69,6 +69,17 @@ Renderable* Renderable::createFromDictionary(const ghoul::Dictionary& dictionary return result; } +Renderable::Renderable() + : _enabled("enabled", "Is Enabled", true) + , _startTime("") + , _endTime("") + , _targetBody("") + , _hasBody(false) + , _hasTimeInterval(false) +{ + +} + Renderable::Renderable(const ghoul::Dictionary& dictionary) : _enabled("enabled", "Is Enabled", true) , _startTime("") diff --git a/src/util/powerscaledscalar.cpp b/src/util/powerscaledscalar.cpp index 8ffe681b7b..5b41a7dab0 100644 --- a/src/util/powerscaledscalar.cpp +++ b/src/util/powerscaledscalar.cpp @@ -76,6 +76,10 @@ float PowerScaledScalar::lengthf() const { return static_cast(_data[0] * pow(k,_data[1])); } +double PowerScaledScalar::lengthd() const { + return static_cast(_data[0]) * pow(k, static_cast(_data[1])); +} + PowerScaledScalar& PowerScaledScalar::operator=(const PowerScaledScalar &rhs) { if (this != &rhs){ this->_data = rhs._data;