diff --git a/include/openspace/rendering/model/wavefrontgeometry.h b/include/openspace/rendering/model/wavefrontgeometry.h index 1a13d8030c..c22c0fc248 100644 --- a/include/openspace/rendering/model/wavefrontgeometry.h +++ b/include/openspace/rendering/model/wavefrontgeometry.h @@ -47,6 +47,7 @@ public: GLfloat location[4]; GLfloat tex[2]; GLfloat normal[3]; + GLfloat padding[7]; //GLubyte padding[4]; // Pads the struct out to 64 bytes for performance increase } Vertex; @@ -60,7 +61,6 @@ private: GLuint _vBufferID = 7; GLuint _iBufferID = 8; - GLenum _mode; unsigned int _isize; unsigned int _vsize; Vertex* _varray; diff --git a/include/openspace/rendering/planets/simplespheregeometry.h b/include/openspace/rendering/planets/simplespheregeometry.h index e1a4f1e4cd..2bbc012261 100644 --- a/include/openspace/rendering/planets/simplespheregeometry.h +++ b/include/openspace/rendering/planets/simplespheregeometry.h @@ -28,11 +28,11 @@ #include #include #include -#include namespace openspace { class RenderablePlanet; +class PowerScaledSphere; namespace planetgeometry { diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index e56f8745dc..b19c501490 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -28,22 +28,25 @@ // openspace #include #include -#include #include -#include - -// ghoul -#include // Forward declare to minimize dependencies namespace ghoul { namespace opengl { class ProgramObject; + class Texture; } + class Dictionary; } namespace openspace { +// Forward declare to minimize dependencies +struct RenderData; +struct UpdateData; +class Camera; +class PowerScaledCoordinate; + class Renderable : public properties::PropertyOwner { public: static Renderable* createFromDictionary(const ghoul::Dictionary& dictionary); @@ -68,7 +71,7 @@ public: protected: std::string findPath(const std::string& path); - void setPscUniforms(ghoul::opengl::ProgramObject* program, const Camera* camera, const psc& position); + void setPscUniforms(ghoul::opengl::ProgramObject* program, const Camera* camera, const PowerScaledCoordinate& position); private: properties::BoolProperty _enabled; diff --git a/include/openspace/rendering/renderablefov.h b/include/openspace/rendering/renderablefov.h index dc09000e9a..7c63f17f63 100644 --- a/include/openspace/rendering/renderablefov.h +++ b/include/openspace/rendering/renderablefov.h @@ -27,13 +27,8 @@ // open space includes #include - #include - -// ghoul includes -#include -#include -//#include +#include namespace openspace { class RenderableFov : public Renderable{ diff --git a/include/openspace/rendering/renderablepath.h b/include/openspace/rendering/renderablepath.h index 3dd6febb53..dc3d12c7c1 100644 --- a/include/openspace/rendering/renderablepath.h +++ b/include/openspace/rendering/renderablepath.h @@ -29,6 +29,7 @@ #include #include +#include // ghoul includes #include @@ -49,9 +50,7 @@ namespace openspace { void render(const RenderData& data) override; void update(const UpdateData& data) override; private: - properties::StringProperty _colorTexturePath; ghoul::opengl::ProgramObject* _programObject; - ghoul::opengl::Texture* _texture; void loadTexture(); void fullYearSweep(); @@ -72,7 +71,6 @@ namespace openspace { void nextIndex(); - GLenum _mode; unsigned int _isize; unsigned int _vsize; unsigned int _vtotal; @@ -80,7 +78,7 @@ namespace openspace { //Vertex* _varray; std::vector _varray; - int* _iarray; + std::vector _iarray; //used for update of trail psc _pscpos, _pscvel; diff --git a/include/openspace/rendering/renderabletrail.h b/include/openspace/rendering/renderabletrail.h index 7dfeacfdbe..54d7a42376 100644 --- a/include/openspace/rendering/renderabletrail.h +++ b/include/openspace/rendering/renderabletrail.h @@ -27,8 +27,8 @@ // open space includes #include - #include +#include // ghoul includes #include diff --git a/include/openspace/rendering/renderablevolume.h b/include/openspace/rendering/renderablevolume.h index f72bab9cfb..4e1839c938 100644 --- a/include/openspace/rendering/renderablevolume.h +++ b/include/openspace/rendering/renderablevolume.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef RENDERABLEVOLUME_H -#define RENDERABLEVOLUME_H +#ifndef __RENDERABLEVOLUME_H__ +#define __RENDERABLEVOLUME_H__ // open space includes #include diff --git a/include/openspace/rendering/renderablevolumegl.h b/include/openspace/rendering/renderablevolumegl.h index df7cb2673a..3b15c18edc 100644 --- a/include/openspace/rendering/renderablevolumegl.h +++ b/include/openspace/rendering/renderablevolumegl.h @@ -70,12 +70,12 @@ private: ghoul::opengl::Texture* _volume; ghoul::opengl::Texture* _transferFunction; - GLuint _boxArray; + GLuint _boxArray; + GLuint _vertexPositionBuffer; ghoul::opengl::ProgramObject *_boxProgram; glm::vec3 _boxScaling; psc _pscOffset; float _w; - GLint _MVPLocation, _modelTransformLocation, _typeLocation; bool _updateTransferfunction; int _id; diff --git a/include/openspace/util/powerscaledsphere.h b/include/openspace/util/powerscaledsphere.h index 3d2feb33a4..a89ea773e5 100644 --- a/include/openspace/util/powerscaledsphere.h +++ b/include/openspace/util/powerscaledsphere.h @@ -30,7 +30,6 @@ #include #include - namespace openspace { class PowerScaledSphere { diff --git a/src/rendering/model/renderablemodel.cpp b/src/rendering/model/renderablemodel.cpp index 91b57b095a..a40f75f1cd 100644 --- a/src/rendering/model/renderablemodel.cpp +++ b/src/rendering/model/renderablemodel.cpp @@ -95,7 +95,10 @@ RenderableModel::~RenderableModel(){ } bool RenderableModel::isReady() const { - return _programObject != nullptr; + bool ready = true; + ready &= (_programObject != nullptr); + ready &= (_texture != nullptr); + return ready; } bool RenderableModel::initialize(){ @@ -112,23 +115,23 @@ bool RenderableModel::initialize(){ } bool RenderableModel::deinitialize(){ - _geometry->deinitialize(); - delete _geometry; + if (_geometry) { + _geometry->deinitialize(); + delete _geometry; + } + if (_texture) + delete _texture; + _geometry = nullptr; - delete _texture; _texture = nullptr; return true; } void RenderableModel::render(const RenderData& data) { - if (!_programObject) return; - if (!_texture) return; - // activate shader _programObject->activate(); - // scale the planet to appropriate size since the planet is a unit sphere glm::mat4 transform = glm::mat4(1); diff --git a/src/rendering/model/wavefrontgeometry.cpp b/src/rendering/model/wavefrontgeometry.cpp index 5b2ee5e5ed..cab1d6f2e6 100644 --- a/src/rendering/model/wavefrontgeometry.cpp +++ b/src/rendering/model/wavefrontgeometry.cpp @@ -37,7 +37,6 @@ namespace modelgeometry { WavefrontGeometry::WavefrontGeometry(const ghoul::Dictionary& dictionary) : ModelGeometry() - , _mode(GL_TRIANGLES) , _isize(0) , _vsize(0) , _varray(nullptr) @@ -268,8 +267,10 @@ bool WavefrontGeometry::initialize(RenderableModel* parent){ } void WavefrontGeometry::deinitialize(){ - delete[] _varray; - delete[] _iarray; + if (_varray) + delete[] _varray; + if (_iarray) + delete[] _iarray; glDeleteBuffers(1, &_vBufferID); glDeleteBuffers(1, &_iBufferID); @@ -281,7 +282,7 @@ void WavefrontGeometry::render(){ // render glBindVertexArray(_vaoID); // select first VAO glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _iBufferID); - glDrawElements(_mode, _isize, GL_UNSIGNED_INT, 0); + glDrawElements(GL_TRIANGLES, _isize, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } diff --git a/src/rendering/planets/simplespheregeometry.cpp b/src/rendering/planets/simplespheregeometry.cpp index db286ed1d1..d57ce7de9d 100644 --- a/src/rendering/planets/simplespheregeometry.cpp +++ b/src/rendering/planets/simplespheregeometry.cpp @@ -24,6 +24,7 @@ #include #include +#include namespace { const std::string _loggerCat = "SimpleSphereGeometry"; @@ -93,7 +94,8 @@ bool SimpleSphereGeometry::initialize(RenderablePlanet* parent) void SimpleSphereGeometry::deinitialize() { - delete _planet; + if (_planet) + delete _planet; _planet = nullptr; } diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 9260a617a8..5a3015401b 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -26,7 +26,10 @@ #include #include #include +#include +// ghoul +#include #include #include @@ -107,7 +110,11 @@ std::string Renderable::findPath(const std::string& path) { return ""; } -void Renderable::setPscUniforms(ghoul::opengl::ProgramObject* program, const Camera* camera, const psc& position) { +void Renderable::setPscUniforms( + ghoul::opengl::ProgramObject* program, + const Camera* camera, + const PowerScaledCoordinate& position) +{ program->setUniform("campos", camera->position().vec4()); program->setUniform("objpos", position.vec4()); program->setUniform("camrot", camera->viewRotationMatrix()); diff --git a/src/rendering/renderablefov.cpp b/src/rendering/renderablefov.cpp index 507b9751d6..481295c59d 100644 --- a/src/rendering/renderablefov.cpp +++ b/src/rendering/renderablefov.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include diff --git a/src/rendering/renderablepath.cpp b/src/rendering/renderablepath.cpp index f59877a40f..588b63a2aa 100644 --- a/src/rendering/renderablepath.cpp +++ b/src/rendering/renderablepath.cpp @@ -45,37 +45,35 @@ namespace { } #define DEBUG namespace openspace{ - RenderablePath::RenderablePath(const ghoul::Dictionary& dictionary) - : Renderable(dictionary) - , _colorTexturePath("colorTexture", "Color Texture") - , _programObject(nullptr) - , _texture(nullptr) - , _vaoID(0) - , _vBufferID(0) - , _iBufferID(0) - , _mode(GL_LINE_STRIP){ +RenderablePath::RenderablePath(const ghoul::Dictionary& dictionary) + : Renderable(dictionary) + , _programObject(nullptr) + , _vaoID(0) + , _vBufferID(0) + , _iBufferID(0) +{ - bool b1 = dictionary.getValue(keyBody, _target); - bool b2 = dictionary.getValue(keyObserver, _observer); - bool b3 = dictionary.getValue(keyFrame, _frame); - assert(b1 == true); - assert(b2 == true); - assert(b3 == true); - /*assert(dictionary.getValue(keyTropicalOrbitPeriod, _tropic)); - assert(dictionary.getValue(keyEarthOrbitRatio, _ratio)); - assert(dictionary.getValue(keyDayLength, _day));//not used now, will be though. - // values in modfiles set from here*/ - // http://nssdc.gsfc.nasa.gov/planetary/factsheet/marsfact.html + bool b1 = dictionary.getValue(keyBody, _target); + bool b2 = dictionary.getValue(keyObserver, _observer); + bool b3 = dictionary.getValue(keyFrame, _frame); + assert(b1 == true); + assert(b2 == true); + assert(b3 == true); + /*assert(dictionary.getValue(keyTropicalOrbitPeriod, _tropic)); + assert(dictionary.getValue(keyEarthOrbitRatio, _ratio)); + assert(dictionary.getValue(keyDayLength, _day));//not used now, will be though. + // values in modfiles set from here*/ + // http://nssdc.gsfc.nasa.gov/planetary/factsheet/marsfact.html - //white is default col - if (!dictionary.getValue(keyColor, _c)){ - _c = glm::vec3(0.0); - } - else{ - _r = 1 / _c[0]; - _g = 1 / _c[1]; - _b = 1 / _c[2]; - } + //white is default col + if (!dictionary.getValue(keyColor, _c)){ + _c = glm::vec3(0.0); + } + else{ + _r = 1 / _c[0]; + _g = 1 / _c[1]; + _b = 1 / _c[2]; + } } void RenderablePath::fullYearSweep(){ double lightTime = 0.0; @@ -94,7 +92,7 @@ void RenderablePath::fullYearSweep(){ _isize = (segments + 2); _vsize = (segments + 2); - _iarray = new int[_isize]; + _iarray.clear(); int indx = 0; for (int i = 0; i < segments + 1; i++){ @@ -120,7 +118,7 @@ void RenderablePath::fullYearSweep(){ _varray.push_back(0.5f); #endif indx++; - _iarray[indx] = indx; + _iarray.push_back(indx); } else{ std::string date; @@ -150,10 +148,6 @@ bool RenderablePath::initialize(){ completeSuccess &= OsEng.ref().configurationManager().getValue("EphemerisProgram", _programObject); - //TEXTURES DISABLED FOR NOW - //loadTexture(); - completeSuccess &= (_texture != nullptr); - fullYearSweep(); // Initialize and upload to graphics card @@ -174,7 +168,7 @@ bool RenderablePath::initialize(){ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, st, (void*)(4 * sizeof(GLfloat))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _iBufferID); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, _isize * sizeof(int), _iarray, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, _isize * sizeof(int), _iarray.data(), GL_STATIC_DRAW); glBindVertexArray(0); @@ -182,13 +176,10 @@ bool RenderablePath::initialize(){ } bool RenderablePath::deinitialize(){ - delete _texture; - _texture = nullptr; return true; } void RenderablePath::render(const RenderData& data){ - assert(_programObject); _programObject->activate(); // fetch data @@ -207,7 +198,7 @@ void RenderablePath::render(const RenderData& data){ setPscUniforms(_programObject, &data.camera, data.position); /* glBindVertexArray(_vaoID); - glDrawArrays(_mode, 0, _vtotal); + glDrawArrays(GL_LINE_STRIP, 0, _vtotal); glBindVertexArray(0); */ glPointSize(2.f); @@ -228,17 +219,5 @@ void RenderablePath::update(const UpdateData& data){ SpiceManager::ref().getTargetState(_target, _observer, _frame, "LT+S", data.time, _pscpos, _pscvel, lightTime); } -void RenderablePath::loadTexture() -{ - delete _texture; - _texture = nullptr; - if (_colorTexturePath.value() != "") { - _texture = ghoul::io::TextureReader::ref().loadTexture(absPath(_colorTexturePath)); - if (_texture) { - LDEBUG("Loaded texture from '" << absPath(_colorTexturePath) << "'"); - _texture->uploadTexture(); - } - } -} } \ No newline at end of file diff --git a/src/rendering/renderablevolumegl.cpp b/src/rendering/renderablevolumegl.cpp index dd9df47c1b..2b343d44b3 100644 --- a/src/rendering/renderablevolumegl.cpp +++ b/src/rendering/renderablevolumegl.cpp @@ -50,6 +50,8 @@ RenderableVolumeGL::RenderableVolumeGL(const ghoul::Dictionary& dictionary) : RenderableVolume(dictionary) , _transferFunctionName("") , _volumeName("") + , _boxArray(0) + , _vertexPositionBuffer(0) , _boxScaling(1.0, 1.0, 1.0) , _w(0.f) , _updateTransferfunction(false) @@ -159,21 +161,18 @@ RenderableVolumeGL::RenderableVolumeGL(const ghoul::Dictionary& dictionary) RenderableVolumeGL::~RenderableVolumeGL() { deinitialize(); - if(_volume) - delete _volume; - if(_transferFunctionFile) - delete _transferFunctionFile; - if(_transferFunction) - delete _transferFunction; } bool RenderableVolumeGL::isReady() const { - // @TODO needs a proper isReady definition --abock - return true; + bool ready = true; + ready &= (_boxProgram != nullptr); + ready &= (_volume != nullptr); + ready &= (_transferFunction != nullptr); + return ready; } bool RenderableVolumeGL::initialize() { - // TODO: fix volume an transferfunction names + // @TODO fix volume and transferfunction names --jonasstrandstedt if(_filename != "") { _volume = loadVolume(_filename, _hintsDictionary); _volume->uploadTexture(); @@ -195,9 +194,6 @@ bool RenderableVolumeGL::initialize() { _id = OsEng.renderEngine().abuffer()->addSamplerfile(_samplerFilename); OsEng.configurationManager().getValue("RaycastProgram", _boxProgram); - _MVPLocation = _boxProgram->uniformLocation("modelViewProjection"); - _modelTransformLocation = _boxProgram->uniformLocation("modelTransform"); - _typeLocation = _boxProgram->uniformLocation("volumeType"); // ============================ // GEOMETRY (box) @@ -247,20 +243,33 @@ bool RenderableVolumeGL::initialize() { size, -size, -size, _w, size, -size, size, _w, }; - GLuint vertexPositionBuffer; + glGenVertexArrays(1, &_boxArray); // generate array glBindVertexArray(_boxArray); // bind array - glGenBuffers(1, &vertexPositionBuffer); // generate buffer - glBindBuffer(GL_ARRAY_BUFFER, vertexPositionBuffer); // bind buffer + glGenBuffers(1, &_vertexPositionBuffer); // generate buffer + glBindBuffer(GL_ARRAY_BUFFER, _vertexPositionBuffer); // bind buffer glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, reinterpret_cast(0)); glEnableVertexAttribArray(0); - return true; + return isReady(); } bool RenderableVolumeGL::deinitialize() { - return true; + if (_volume) + delete _volume; + if (_transferFunctionFile) + delete _transferFunctionFile; + if (_transferFunction) + delete _transferFunction; + _volume = nullptr; + _transferFunctionFile = nullptr; + _transferFunction = nullptr; + + glDeleteVertexArrays(1, &_boxArray); + glGenBuffers(1, &_vertexPositionBuffer); + + return true; } void RenderableVolumeGL::render(const RenderData& data) { @@ -287,7 +296,7 @@ void RenderableVolumeGL::render(const RenderData& data) { currentPosition += _pscOffset; // Move box to model barycenter _boxProgram->activate(); - _boxProgram->setUniform(_typeLocation, _id); + _boxProgram->setUniform("volumeType", _id); _boxProgram->setUniform("modelViewProjection", data.camera.viewProjectionMatrix()); _boxProgram->setUniform("modelTransform", transform); setPscUniforms(_boxProgram, &data.camera, currentPosition); diff --git a/src/rendering/stars/renderableconstellationbounds.cpp b/src/rendering/stars/renderableconstellationbounds.cpp index 40e0faf2c3..7c0d85bd30 100644 --- a/src/rendering/stars/renderableconstellationbounds.cpp +++ b/src/rendering/stars/renderableconstellationbounds.cpp @@ -22,10 +22,15 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +// openspace #include - #include +#include + +// ghoul #include + +// std #include #define _USE_MATH_DEFINES #include diff --git a/src/rendering/stars/renderablestars.cpp b/src/rendering/stars/renderablestars.cpp index bfb913f3d3..35b61f6284 100644 --- a/src/rendering/stars/renderablestars.cpp +++ b/src/rendering/stars/renderablestars.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include diff --git a/src/util/powerscaledsphere.cpp b/src/util/powerscaledsphere.cpp index 0cbb4d401b..ec0a577be8 100644 --- a/src/util/powerscaledsphere.cpp +++ b/src/util/powerscaledsphere.cpp @@ -130,8 +130,13 @@ PowerScaledSphere::PowerScaledSphere(const PowerScaledScalar& radius, int segmen PowerScaledSphere::~PowerScaledSphere() { - delete[] _varray; - delete[] _iarray; + if (_varray) + delete[] _varray; + if (_iarray) + delete[] _iarray; + + _varray = 0; + _iarray = 0; glDeleteBuffers(1, &_vBufferID); glDeleteBuffers(1, &_iBufferID);