From 1a590f83e042d575e49b9bda3d12971ea7604a95 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 4 Dec 2014 00:18:37 +0100 Subject: [PATCH] Initial commit of constallation bounds --- .../stars/renderableconstallationbounds.h | 125 ++++ openspace-data | 2 +- shaders/constellationbounds_fs.glsl | 45 ++ shaders/constellationbounds_vs.glsl | 44 ++ .../stars/renderableconstellationbounds.cpp | 670 ++++++++++++++++++ src/util/factorymanager.cpp | 9 +- 6 files changed, 890 insertions(+), 5 deletions(-) create mode 100644 include/openspace/rendering/stars/renderableconstallationbounds.h create mode 100644 shaders/constellationbounds_fs.glsl create mode 100644 shaders/constellationbounds_vs.glsl create mode 100644 src/rendering/stars/renderableconstellationbounds.cpp diff --git a/include/openspace/rendering/stars/renderableconstallationbounds.h b/include/openspace/rendering/stars/renderableconstallationbounds.h new file mode 100644 index 0000000000..34f7368481 --- /dev/null +++ b/include/openspace/rendering/stars/renderableconstallationbounds.h @@ -0,0 +1,125 @@ +/***************************************************************************************** +* * +* OpenSpace * +* * +* Copyright (c) 2014 * +* * +* 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 __RENDERABLECONSTELLATIONBOUNDS_H__ +#define __RENDERABLECONSTELLATIONBOUNDS_H__ + +#include + +#include + +namespace openspace { + +class RenderableConstellationBounds : public Renderable { +public: + RenderableConstellationBounds(const ghoul::Dictionary& dictionary); + + bool initialize() override; + bool deinitialize() override; + + bool isReady() const override; + + void render(const RenderData& data) override; + void update(const UpdateData& data) override; + +private: + std::string _filename; + + ghoul::opengl::ProgramObject* _program; + bool _programIsDirty; + + std::vector _data; + + GLuint _vao; + GLuint _vbo; +}; + + +} // namespace openspace + +#endif // __RENDERABLECONSTELLATIONBOUNDS_H__ + +//#ifndef __RENDERABLESTARS_H__ +//#define __RENDERABLESTARS_H__ +// +//#include +//#include +//#include +// +//#include +//#include +// +//namespace openspace { +// +//class RenderableStars : public Renderable { +//public: +// RenderableStars(const ghoul::Dictionary& dictionary); +// +// bool initialize() override; +// bool deinitialize() override; +// +// bool isReady() const override; +// +// void render(const RenderData& data) override; +// void update(const UpdateData& data) override; +// +//private: +// enum ColorOption { +// Color = 0, +// Velocity = 1, +// Speed = 2 +// }; +// +// void createDataSlice(ColorOption option); +// +// bool loadData(); +// bool readSpeckFile(); +// bool loadCachedFile(const std::string& file); +// bool saveCachedFile(const std::string& file) const; +// +// properties::StringProperty _colorTexturePath; +// ghoul::opengl::Texture* _texture; +// bool _textureIsDirty; +// +// properties::OptionProperty _colorOption; +// bool _dataIsDirty; +// +// properties::FloatProperty _spriteSize; +// +// ghoul::opengl::ProgramObject* _program; +// bool _programIsDirty; +// +// std::string _speckFile; +// +// std::vector _slicedData; +// std::vector _fullData; +// int _nValuesPerStar; +// +// GLuint _vao; +// GLuint _vbo; +//}; +// +//} // namespace openspace +// +//#endif // __RENDERABLESTARS_H__ \ No newline at end of file diff --git a/openspace-data b/openspace-data index 48daa03562..ec8fded580 160000 --- a/openspace-data +++ b/openspace-data @@ -1 +1 @@ -Subproject commit 48daa03562e2bdc42a9088c724792ac57832ab92 +Subproject commit ec8fded58055f279da1f23091f247daa70384a62 diff --git a/shaders/constellationbounds_fs.glsl b/shaders/constellationbounds_fs.glsl new file mode 100644 index 0000000000..803e0bd79b --- /dev/null +++ b/shaders/constellationbounds_fs.glsl @@ -0,0 +1,45 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014 * + * * + * 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. * + ****************************************************************************************/ + +#version __CONTEXT__ + +uniform vec4 campos; +uniform vec4 objpos; +//uniform vec3 camdir; // add this for specular + +in vec4 vs_position; + +#include "ABuffer/abufferStruct.hglsl" +#include "ABuffer/abufferAddToBuffer.hglsl" +#include "PowerScaling/powerScaling_fs.hglsl" + +//#include "PowerScaling/powerScaling_vs.hglsl" +void main() +{ + vec4 position = vs_position; + float depth = pscDepth(position); + + ABufferStruct_t frag = createGeometryFragment(vec4(1.0, 0.0, 0.0, 1.0), position, depth); + addToBuffer(frag); +} \ No newline at end of file diff --git a/shaders/constellationbounds_vs.glsl b/shaders/constellationbounds_vs.glsl new file mode 100644 index 0000000000..d6e1d9d99f --- /dev/null +++ b/shaders/constellationbounds_vs.glsl @@ -0,0 +1,44 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014 * + * * + * 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. * + ****************************************************************************************/ + +#version __CONTEXT__ + +uniform mat4 ViewProjection; +uniform mat4 ModelTransform; + +layout(location = 0) in vec4 in_position; +out vec4 vs_position; + +#include "PowerScaling/powerScaling_vs.hglsl" + +void main() +{ + vs_position = in_position; + vec4 tmp = in_position; + + vec4 position = pscTransform(tmp, ModelTransform); + vs_position = tmp; + position = ViewProjection * position; + gl_Position = z_normalization(position); +} \ No newline at end of file diff --git a/src/rendering/stars/renderableconstellationbounds.cpp b/src/rendering/stars/renderableconstellationbounds.cpp new file mode 100644 index 0000000000..fe4f2b5141 --- /dev/null +++ b/src/rendering/stars/renderableconstellationbounds.cpp @@ -0,0 +1,670 @@ +/***************************************************************************************** +* * +* OpenSpace * +* * +* Copyright (c) 2014 * +* * +* 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. * +****************************************************************************************/ + +#include + +#include +#include + +#define _USE_MATH_DEFINES +#include + +#include + +namespace { + const std::string _loggerCat = "RenderableConstellationBounds"; +} + +namespace openspace { + +RenderableConstellationBounds::RenderableConstellationBounds( + const ghoul::Dictionary& dictionary) + : Renderable(dictionary) + , _programIsDirty(false) + , _vao(0) + , _vbo(0) +{ + dictionary.getValue("File", _filename); +} + +bool RenderableConstellationBounds::initialize() { + struct Point{ + float ra; + float dec; + }; + + _program = ghoul::opengl::ProgramObject::Build("Star", + "${SHADERS}/constellationbounds_vs.glsl", + "${SHADERS}/constellationbounds_fs.glsl"); + _program->setProgramObjectCallback([&](ghoul::opengl::ProgramObject*){ this->_programIsDirty = true; }); + + + std::vector points; + + points.push_back({12.83333f, -53.f}); + points.push_back({22.83333f, -55.f}); + points.push_back({22.83333f, -84.f}); + points.push_back({12.83333f, -84.f}); + points.push_back({12.83333f, -53.f}); + + if (_vao == 0) { + glGenVertexArrays(1, &_vao); + LDEBUG("Generating Vertex Array id '" << _vao << "'"); + } + if (_vbo == 0) { + glGenBuffers(1, &_vbo); + LDEBUG("Generating Vertex Buffer Object id '" << _vbo << "'"); + } + + auto conv = [](float& ra, float& dec) { + ra = ((ra * 15) / 360.f) * 2.f * M_PI; + dec = (dec / 360.f) * 2.f * M_PI; + }; + + //std::vector positions; + for (auto p : points) { + SpiceDouble values[3]; + + conv(p.ra, p.dec); + radrec_c(1.0, p.ra, p.dec, values); + + _data.push_back(values[0]); + _data.push_back(values[1]); + _data.push_back(values[2]); + _data.push_back(15.f); + } + + + glBindVertexArray(_vao); + glBindBuffer(GL_ARRAY_BUFFER, _vbo); + glBufferData(GL_ARRAY_BUFFER, + _data.size() * sizeof(float), + &_data[0], + GL_STATIC_DRAW); + + GLint positionAttrib = _program->attributeLocation("in_position"); + glEnableVertexAttribArray(positionAttrib); + + + glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + return true; +} + +bool RenderableConstellationBounds::deinitialize() { + return true; +} + +bool RenderableConstellationBounds::isReady() const { + return (_vao != 0) && (_vbo != 0); +} + +void RenderableConstellationBounds::render(const RenderData& data) { + _program->activate(); + + // @Check overwriting the scaling from the camera; error as parsec->meter conversion + // is done twice? ---abock + //glm::vec2 scaling = glm::vec2(1, -19); + + glm::mat4 modelMatrix = data.camera.modelMatrix(); + glm::mat4 viewMatrix = data.camera.viewMatrix(); + glm::mat4 projectionMatrix = data.camera.projectionMatrix(); + + _program->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); + _program->setUniform("ModelTransform", glm::mat4(1)); + + //_program->setUniform("ModelTransform", modelMatrix); + //_program->setUniform("view", viewMatrix); + //_program->setUniform("projection", projectionMatrix); + + setPscUniforms(_program, &data.camera, data.position); + //_program->setUniform("scaling", scaling); + + //ghoul::opengl::TextureUnit unit; + //unit.activate(); + //_texture->bind(); + //_program->setIgnoreUniformLocationError(true); + //_program->setUniform("texture1", unit); + //_program->setIgnoreUniformLocationError(false); + + glBindVertexArray(_vao); + //const GLsizei nStars = static_cast(_fullData.size() / _nValuesPerStar); + //glDrawArrays(GL_POINTS, 0, nStars); + glDrawArrays(GL_LINE_STRIP, 0, _data.size() - 1); + glBindVertexArray(0); + _program->deactivate(); +} + +void RenderableConstellationBounds::update(const UpdateData& data) { + if (_programIsDirty) { + _program->rebuildFromFile(); + _programIsDirty = false; + } +} + +} // namespace openspace + +//#include +// +//#include +// +//#include +//#include +//#include +//#include +// +//#include +//#include +//#include +// +//namespace { +// const std::string _loggerCat = "RenderableStars"; +// +// const int8_t CurrentCacheVersion = 1; +// +// struct ColorVBOLayout { +// std::array position; // (x,y,z,e) +// +// float bvColor; // B-V color value +// float luminance; +// float absoluteMagnitude; +// }; +// +// struct VelocityVBOLayout { +// std::array position; // (x,y,z,e) +// +// float bvColor; // B-V color value +// float luminance; +// float absoluteMagnitude; +// +// float vx; // v_x +// float vy; // v_y +// float vz; // v_z +// }; +// +// struct SpeedVBOLayout { +// std::array position; // (x,y,z,e) +// +// float bvColor; // B-V color value +// float luminance; +// float absoluteMagnitude; +// +// float speed; +// }; +//} +// +//namespace openspace { +// +//RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) +// : Renderable(dictionary) +// , _colorTexturePath("colorTexture", "Color Texture") +// , _texture(nullptr) +// , _textureIsDirty(true) +// , _colorOption("colorOption", "Color Option") +// , _dataIsDirty(true) +// , _spriteSize("spriteSize", "Sprite Size", 0.0000005f, 0.f, 1.f) +// , _program(nullptr) +// , _programIsDirty(false) +// , _speckFile("") +// , _nValuesPerStar(0) +// , _vao(0) +// , _vbo(0) +//{ +// std::string texturePath = ""; +// if (dictionary.hasKey(constants::renderablestars::keyTexture)) { +// dictionary.getValue(constants::renderablestars::keyTexture, texturePath); +// _colorTexturePath = absPath(texturePath); +// } +// +// bool success = dictionary.getValue(constants::renderablestars::keyFile, _speckFile); +// if (!success) { +// LERROR("SpeckDataSource did not contain key '" << +// constants::renderablestars::keyFile << "'"); +// return; +// } +// _speckFile = absPath(_speckFile); +// +// _colorOption.addOption({ColorOption::Color, "Color"}); +// _colorOption.addOption({ColorOption::Velocity, "Velocity"}); +// _colorOption.addOption({ColorOption::Speed, "Speed"}); +// addProperty(_colorOption); +// _colorOption.onChange([&]{ _dataIsDirty = true;}); +// +// addProperty(_spriteSize); +// +// addProperty(_colorTexturePath); +// _colorTexturePath.onChange([&]{ _textureIsDirty = true;}); +//} +// +//bool RenderableStars::isReady() const { +// return (_program != nullptr) && (_fullData.size() > 0); +//} +// +//bool RenderableStars::initialize() { +// bool completeSuccess = true; +// +// _program = ghoul::opengl::ProgramObject::Build("Star", +// "${SHADERS}/star_vs.glsl", +// "${SHADERS}/star_fs.glsl", +// "${SHADERS}/star_ge.glsl"); +// completeSuccess = (_program != nullptr); +// _program->setProgramObjectCallback([&](ghoul::opengl::ProgramObject*){ _programIsDirty = true; }); +// completeSuccess &= loadData(); +// completeSuccess &= (_texture != nullptr); +// +// return completeSuccess; +//} +// +//bool RenderableStars::deinitialize() { +// glDeleteBuffers(1, &_vbo); +// _vbo = 0; +// glDeleteVertexArrays(1, &_vao); +// _vao = 0; +// +// delete _texture; +// _texture = nullptr; +// +// delete _program; +// _program = nullptr; +// return true; +//} +// +//void RenderableStars::render(const RenderData& data) { +// _program->activate(); +// +// // @Check overwriting the scaling from the camera; error as parsec->meter conversion +// // is done twice? ---abock +// glm::vec2 scaling = glm::vec2(1, -19); +// +// glm::mat4 modelMatrix = data.camera.modelMatrix(); +// glm::mat4 viewMatrix = data.camera.viewMatrix(); +// glm::mat4 projectionMatrix = data.camera.projectionMatrix(); +// +// _program->setUniform("model", modelMatrix); +// _program->setUniform("view", viewMatrix); +// _program->setUniform("projection", projectionMatrix); +// +// _program->setUniform("colorOption", _colorOption); +// +// setPscUniforms(_program, &data.camera, data.position); +// _program->setUniform("scaling", scaling); +// +// _program->setUniform("spriteSize", _spriteSize); +// +// ghoul::opengl::TextureUnit unit; +// unit.activate(); +// _texture->bind(); +// _program->setIgnoreUniformLocationError(true); +// _program->setUniform("texture1", unit); +// _program->setIgnoreUniformLocationError(false); +// +// glBindVertexArray(_vao); +// const GLsizei nStars = static_cast(_fullData.size() / _nValuesPerStar); +// glDrawArrays(GL_POINTS, 0, nStars); +// glBindVertexArray(0); +// _program->deactivate(); +//} +// +//void RenderableStars::update(const UpdateData& data) { +// if (_programIsDirty) { +// _program->rebuildFromFile(); +// _dataIsDirty = true; +// _programIsDirty = false; +// } +// +// if (_dataIsDirty) { +// const int value = _colorOption; +// LDEBUG("Regenerating data"); +// +// createDataSlice(ColorOption(value)); +// +// int size = static_cast(_slicedData.size()); +// +// if (_vao == 0) { +// glGenVertexArrays(1, &_vao); +// LDEBUG("Generating Vertex Array id '" << _vao << "'"); +// } +// if (_vbo == 0) { +// glGenBuffers(1, &_vbo); +// LDEBUG("Generating Vertex Buffer Object id '" << _vbo << "'"); +// } +// glBindVertexArray(_vao); +// glBindBuffer(GL_ARRAY_BUFFER, _vbo); +// glBufferData(GL_ARRAY_BUFFER, +// size*sizeof(GLfloat), +// &_slicedData[0], +// GL_STATIC_DRAW); +// +// GLint positionAttrib = _program->attributeLocation("in_position"); +// GLint brightnessDataAttrib = _program->attributeLocation("in_brightness"); +// +// const size_t nStars = _fullData.size() / _nValuesPerStar; +// const size_t nValues = _slicedData.size() / nStars; +// +// GLsizei stride = static_cast(sizeof(GLfloat) * nValues); +// +// glEnableVertexAttribArray(positionAttrib); +// glEnableVertexAttribArray(brightnessDataAttrib); +// const int colorOption = _colorOption; +// switch (colorOption) { +// case ColorOption::Color: +// glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(ColorVBOLayout, position))); +// glVertexAttribPointer(brightnessDataAttrib, 3, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(ColorVBOLayout, bvColor))); +// +// break; +// case ColorOption::Velocity: +// { +// glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(VelocityVBOLayout, position))); +// glVertexAttribPointer(brightnessDataAttrib, 3, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(VelocityVBOLayout, bvColor))); +// +// GLint velocityAttrib = _program->attributeLocation("in_velocity"); +// glEnableVertexAttribArray(velocityAttrib); +// glVertexAttribPointer(velocityAttrib, 3, GL_FLOAT, GL_TRUE, stride, +// reinterpret_cast(offsetof(VelocityVBOLayout, vx))); +// +// break; +// } +// case ColorOption::Speed: +// { +// glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(SpeedVBOLayout, position))); +// glVertexAttribPointer(brightnessDataAttrib, 3, GL_FLOAT, GL_FALSE, stride, +// reinterpret_cast(offsetof(SpeedVBOLayout, bvColor))); +// +// GLint speedAttrib = _program->attributeLocation("in_speed"); +// glEnableVertexAttribArray(speedAttrib); +// glVertexAttribPointer(speedAttrib, 1, GL_FLOAT, GL_TRUE, stride, +// reinterpret_cast(offsetof(SpeedVBOLayout, speed))); +// +// } +// } +// +// glBindBuffer(GL_ARRAY_BUFFER, 0); +// glBindVertexArray(0); +// +// _dataIsDirty = false; +// } +// +// if (_textureIsDirty) { +// LDEBUG("Reloading texture"); +// delete _texture; +// _texture = nullptr; +// if (_colorTexturePath.value() != "") { +// _texture = ghoul::opengl::loadTexture(absPath(_colorTexturePath)); +// if (_texture) { +// LDEBUG("Loaded texture from '" << absPath(_colorTexturePath) << "'"); +// _texture->uploadTexture(); +// } +// } +// _textureIsDirty = false; +// } +//} +// +//bool RenderableStars::loadData() { +// std::string _file = _speckFile; +// std::string cachedFile = ""; +// FileSys.cacheManager()->getCachedFile(_file, cachedFile, true); +// +// bool hasCachedFile = FileSys.fileExists(cachedFile); +// if (hasCachedFile) { +// LINFO("Cached file '" << cachedFile << "' used for Speck file '" << _file << "'"); +// +// bool success = loadCachedFile(cachedFile); +// if (success) +// return true; +// else +// FileSys.cacheManager()->removeCacheFile(_file); +// // Intentional fall-through to the 'else' computation to generate the cache +// // file for the next run +// } +// else { +// LINFO("Cache for Speck file '" << _file << "' not found"); +// } +// LINFO("Loading Speck file '" << _file << "'"); +// +// bool success = readSpeckFile(); +// if (!success) +// return false; +// +// LINFO("Saving cache"); +// success = saveCachedFile(cachedFile); +// +// return success; +//} +// +//bool RenderableStars::readSpeckFile() { +// std::string _file = _speckFile; +// std::ifstream file(_file); +// if (!file.good()) { +// LERROR("Failed to open Speck file '" << _file << "'"); +// return false; +// } +// +// _nValuesPerStar = 0; +// +// // The beginning of the speck file has a header that either contains comments +// // (signaled by a preceding '#') or information about the structure of the file +// // (signaled by the keywords 'datavar', 'texturevar', and 'texture') +// std::string line = ""; +// while (true) { +// std::ifstream::streampos position = file.tellg(); +// std::getline(file, line); +// +// if (line[0] == '#') +// continue; +// +// if (line.substr(0, 7) != "datavar" && +// line.substr(0, 10) != "texturevar" && +// line.substr(0, 7) != "texture") +// { +// // we read a line that doesn't belong to the header, so we have to jump back +// // before the beginning of the current line +// file.seekg(position); +// break; +// } +// +// if (line.substr(0, 7) == "datavar") { +// // datavar lines are structured as follows: +// // datavar # description +// // where # is the index of the data variable; so if we repeatedly overwrite +// // the 'nValues' variable with the latest index, we will end up with the total +// // number of values (+3 since X Y Z are not counted in the Speck file index) +// std::stringstream str(line); +// +// std::string dummy; +// str >> dummy; +// str >> _nValuesPerStar; +// _nValuesPerStar += 1; // We want the number, but the index is 0 based +// } +// } +// +// _nValuesPerStar += 3; // X Y Z are not counted in the Speck file indices +// +// do { +// std::vector values(_nValuesPerStar); +// +// std::getline(file, line); +// std::stringstream str(line); +// +// for (int i = 0; i < _nValuesPerStar; ++i) +// str >> values[i]; +// +// _fullData.insert(_fullData.end(), values.begin(), values.end()); +// } while (!file.eof()); +// +// return true; +//} +// +//bool RenderableStars::loadCachedFile(const std::string& file) { +// std::ifstream fileStream(file, std::ifstream::binary); +// if (fileStream.good()) { +// int8_t version = 0; +// fileStream.read(reinterpret_cast(&version), sizeof(int8_t)); +// if (version != CurrentCacheVersion) { +// LINFO("The format of the cached file has changed, deleted old cache"); +// fileStream.close(); +// FileSys.deleteFile(file); +// return false; +// } +// +// int32_t nValues = 0; +// fileStream.read(reinterpret_cast(&nValues), sizeof(int32_t)); +// fileStream.read(reinterpret_cast(&_nValuesPerStar), sizeof(int32_t)); +// +// _fullData.resize(nValues); +// fileStream.read(reinterpret_cast(&_fullData[0]), +// nValues * sizeof(_fullData[0])); +// +// bool success = fileStream.good(); +// return success; +// } +// else { +// LERROR("Error opening file '" << file << "' for loading cache file"); +// return false; +// } +//} +// +//bool RenderableStars::saveCachedFile(const std::string& file) const { +// std::ofstream fileStream(file, std::ofstream::binary); +// if (fileStream.good()) { +// fileStream.write(reinterpret_cast(&CurrentCacheVersion), +// sizeof(int8_t)); +// +// int32_t nValues = static_cast(_fullData.size()); +// if (nValues == 0) { +// LERROR("Error writing cache: No values were loaded"); +// return false; +// } +// fileStream.write(reinterpret_cast(&nValues), sizeof(int32_t)); +// +// int32_t nValuesPerStar = static_cast(_nValuesPerStar); +// fileStream.write(reinterpret_cast(&nValuesPerStar), sizeof(int32_t)); +// +// size_t nBytes = nValues * sizeof(_fullData[0]); +// fileStream.write(reinterpret_cast(&_fullData[0]), nBytes); +// +// bool success = fileStream.good(); +// return success; +// } +// else { +// LERROR("Error opening file '" << file << "' for save cache file"); +// return false; +// } +//} +// +//void RenderableStars::createDataSlice(ColorOption option) { +// _slicedData.clear(); +// for (size_t i = 0; i < _fullData.size(); i+=_nValuesPerStar) { +// psc position = PowerScaledCoordinate::CreatePowerScaledCoordinate( +// _fullData[i + 0], +// _fullData[i + 1], +// _fullData[i + 2] +// ); +// // Convert parsecs -> meter +// PowerScaledScalar parsecsToMetersFactor = PowerScaledScalar(0.308567758f, 17.f); +// position[0] *= parsecsToMetersFactor[0]; +// position[1] *= parsecsToMetersFactor[0]; +// position[2] *= parsecsToMetersFactor[0]; +// position[3] += parsecsToMetersFactor[1]; +// +// switch (option) { +// case ColorOption::Color: +// { +// union { +// ColorVBOLayout value; +// std::array data; +// } layout; +// +// layout.value.position = { { +// position[0], position[1], position[2], position[3] +// } }; +// +// layout.value.bvColor = _fullData[i + 3]; +// layout.value.luminance = _fullData[i + 4]; +// layout.value.absoluteMagnitude = _fullData[i + 5]; +// +// _slicedData.insert(_slicedData.end(), +// layout.data.begin(), +// layout.data.end()); +// +// break; +// } +// case ColorOption::Velocity: +// { +// union { +// VelocityVBOLayout value; +// std::array data; +// } layout; +// +// layout.value.position = { { +// position[0], position[1], position[2], position[3] +// } }; +// +// layout.value.bvColor = _fullData[i + 3]; +// layout.value.luminance = _fullData[i + 4]; +// layout.value.absoluteMagnitude = _fullData[i + 5]; +// +// layout.value.vx = _fullData[i + 12]; +// layout.value.vy = _fullData[i + 13]; +// layout.value.vz = _fullData[i + 14]; +// +// _slicedData.insert(_slicedData.end(), +// layout.data.begin(), +// layout.data.end()); +// break; +// } +// case ColorOption::Speed: +// { +// union { +// SpeedVBOLayout value; +// std::array data; +// } layout; +// +// layout.value.position = { { +// position[0], position[1], position[2], position[3] +// } }; +// +// layout.value.bvColor = _fullData[i + 3]; +// layout.value.luminance = _fullData[i + 4]; +// layout.value.absoluteMagnitude = _fullData[i + 5]; +// +// layout.value.speed = _fullData[i + 15]; +// +// _slicedData.insert(_slicedData.end(), +// layout.data.begin(), +// layout.data.end()); +// break; +// } +// } +// } +//} +// +//} // namespace openspace diff --git a/src/util/factorymanager.cpp b/src/util/factorymanager.cpp index f169fa226c..c225a29efc 100644 --- a/src/util/factorymanager.cpp +++ b/src/util/factorymanager.cpp @@ -26,6 +26,7 @@ // renderables #include +#include #include #include #include @@ -62,10 +63,10 @@ void FactoryManager::initialize() // TODO: This has to be moved into a sort of module structure (ab) // Add Renderables _manager->addFactory(new ghoul::TemplateFactory); - _manager->factory()->registerClass( - "RenderablePlanet"); - _manager->factory()->registerClass( - "RenderableStars"); + _manager->factory()->registerClass("RenderablePlanet"); + _manager->factory()->registerClass("RenderableStars"); + _manager->factory()->registerClass + ("RenderableConstellationBounds"); _manager->factory()->registerClass( "RenderableEphemeris"); //will replace ephemeris class soon...