From d269eedf77c4d798896f1fa6ef6d40a0ab4dd69f Mon Sep 17 00:00:00 2001 From: Sebastian Piwell Date: Tue, 22 Mar 2016 09:31:17 -0400 Subject: [PATCH] Correct size and position --- ...d_062105_2.3df.007200.cdf => OpenGGCM.cdf} | Bin .../rendering/renderabledataplane.cpp | 57 ++++++++++++------ .../rendering/renderabledataplane.h | 8 ++- modules/datasurface/shaders/dataplane_vs.glsl | 2 +- modules/kameleon/include/kameleonwrapper.h | 2 + modules/kameleon/src/kameleonwrapper.cpp | 40 ++++++++++++ src/rendering/renderengine.cpp | 3 - 7 files changed, 86 insertions(+), 26 deletions(-) rename data/{Alexa_Halford_062105_2.3df.007200.cdf => OpenGGCM.cdf} (100%) diff --git a/data/Alexa_Halford_062105_2.3df.007200.cdf b/data/OpenGGCM.cdf similarity index 100% rename from data/Alexa_Halford_062105_2.3df.007200.cdf rename to data/OpenGGCM.cdf diff --git a/modules/datasurface/rendering/renderabledataplane.cpp b/modules/datasurface/rendering/renderabledataplane.cpp index baaf6bfe8c..b129ec1708 100644 --- a/modules/datasurface/rendering/renderabledataplane.cpp +++ b/modules/datasurface/rendering/renderabledataplane.cpp @@ -24,40 +24,50 @@ #include #include -#include #include #include #include #include #include #include +#include +#include +#include + namespace openspace { RenderableDataPlane::RenderableDataPlane(const ghoul::Dictionary& dictionary) : Renderable(dictionary) ,_texturePath("texture", "Texture", "${OPENSPACE_DATA}/test.png") - ,_size("size", "Size", glm::vec2(0.7,8), glm::vec2(0.f), glm::vec2(10.0f)) - ,_roatation("rotation", "Roatation", glm::vec3(0.3,0.4,0.0), glm::vec3(0), glm::vec3(2*M_PI)) - ,_origin("origin", "Origin", glm::vec2(0.05, 0.001), glm::vec2(-0.1), glm::vec2(0.1)) + ,_roatation("rotation", "Roatation", glm::vec3(0), glm::vec3(0), glm::vec3(2*M_PI)) , _shader(nullptr) , _texture(nullptr) , _quad(0) , _vertexPositionBuffer(0) { - addProperty(_size); + addProperty(_texturePath); addProperty(_roatation); - addProperty(_origin); + _texturePath.onChange(std::bind(&RenderableDataPlane::loadTexture, this)); - _size.onChange([this](){ _planeIsDirty = true; }); } + RenderableDataPlane::~RenderableDataPlane(){ } bool RenderableDataPlane::initialize() { + KameleonWrapper kw(absPath("${OPENSPACE_DATA}/OpenGGCM.cdf")); + _modelScale = kw.getModelScaleScaled(); + _pscOffset = kw.getModelBarycenterOffsetScaled(); + + std::cout << "Scale: " << _modelScale.x << ", " << _modelScale.y << ", " << _modelScale.z << ", " << _modelScale.w << std::endl; + std::cout << "Offset: " << _pscOffset.x << ", " << _pscOffset.y << ", " << _pscOffset.z << ", " << _pscOffset.w << std::endl; + + + glGenVertexArrays(1, &_quad); // generate array glGenBuffers(1, &_vertexPositionBuffer); // generate buffer createPlane(); @@ -105,13 +115,18 @@ bool RenderableDataPlane::isReady() const { void RenderableDataPlane::render(const RenderData& data) { + + auto parent = OsEng.renderEngine().scene()->sceneGraphNode("Earth"); + psc _parentPos = parent->worldPosition(); + glm::dvec4 pos = _parentPos.dvec4(); + // std::cout << pos.x << ", " << pos.y << ", " << pos.z << ", " << pos.w << std::endl; + // std::cout << parent->name() << std::endl; + float w = (float)_texture->width(); float h = (float)_texture->height(); float textureRatio = h/w; glm::mat4 transform = glm::mat4(1.0); - transform = glm::scale(transform, glm::vec3(1.0, textureRatio, 1.0f)); - glm::mat4 translate = glm::translate(glm::mat4(1.0), glm::vec3(_origin.value()[0], _origin.value()[1], 0.0f)); transform = glm::rotate(transform, _roatation.value()[0], glm::vec3(1,0,0)); transform = glm::rotate(transform, _roatation.value()[1], glm::vec3(0,1,0)); transform = glm::rotate(transform, _roatation.value()[2], glm::vec3(0,0,1)); @@ -119,10 +134,13 @@ void RenderableDataPlane::render(const RenderData& data) // Activate shader _shader->activate(); + auto psc = _parentPos; + glm::dvec4 dpc = psc.dvec4(); + psc += glm::vec4(_pscOffset); + _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); _shader->setUniform("ModelTransform", transform); - _shader->setUniform("Translate", translate); - setPscUniforms(_shader.get(), &data.camera, data.position); + setPscUniforms(_shader.get(), &data.camera, psc); ghoul::opengl::TextureUnit unit; unit.activate(); @@ -160,16 +178,17 @@ void RenderableDataPlane::createPlane() { // ============================ // GEOMETRY (quad) // ============================ - const GLfloat size = _size.value()[0]; - const GLfloat w = _size.value()[1]; + const GLfloat x = _modelScale.x; + const GLfloat y = _modelScale.y; + const GLfloat w = _modelScale.w; const GLfloat vertex_data[] = { // square of two triangles (sigh) // x y z w s t - -size, -size, 0.0f, w, 0, 1, - size, size, 0.0f, w, 1, 0, - -size, size, 0.0f, w, 0, 0, - -size, -size, 0.0f, w, 0, 1, - size, -size, 0.0f, w, 1, 1, - size, size, 0.0f, w, 1, 0, + -x, -y, 0.0f, w, 0, 1, + x, y, 0.0f, w, 1, 0, + -x, y, 0.0f, w, 0, 0, + -x, -y, 0.0f, w, 0, 1, + x, -y, 0.0f, w, 1, 1, + x, y, 0.0f, w, 1, 0, }; glBindVertexArray(_quad); // bind array diff --git a/modules/datasurface/rendering/renderabledataplane.h b/modules/datasurface/rendering/renderabledataplane.h index 68deeed237..cfd04fbbcb 100644 --- a/modules/datasurface/rendering/renderabledataplane.h +++ b/modules/datasurface/rendering/renderabledataplane.h @@ -29,6 +29,7 @@ #include #include #include +#include namespace openspace{ @@ -50,14 +51,15 @@ void createPlane(); properties::StringProperty _texturePath; - properties::Vec2Property _size; properties::Vec3Property _roatation; - properties::Vec2Property _origin; - // Origin _origin; std::unique_ptr _shader; std::unique_ptr _texture; + glm::vec4 _pscOffset; + glm::vec4 _modelScale; + psc _parentPos; + GLuint _quad; GLuint _vertexPositionBuffer; diff --git a/modules/datasurface/shaders/dataplane_vs.glsl b/modules/datasurface/shaders/dataplane_vs.glsl index 0cf739232b..dc845c65cd 100644 --- a/modules/datasurface/shaders/dataplane_vs.glsl +++ b/modules/datasurface/shaders/dataplane_vs.glsl @@ -39,7 +39,7 @@ out float s; void main() { - vec4 tmp = Translate*in_position; + vec4 tmp = in_position; vec4 position = pscTransform(tmp, ModelTransform); diff --git a/modules/kameleon/include/kameleonwrapper.h b/modules/kameleon/include/kameleonwrapper.h index f000507196..89342bf543 100644 --- a/modules/kameleon/include/kameleonwrapper.h +++ b/modules/kameleon/include/kameleonwrapper.h @@ -120,7 +120,9 @@ public: float stepsize); glm::vec3 getModelBarycenterOffset(); + glm::vec4 getModelBarycenterOffsetScaled(); glm::vec3 getModelScale(); + glm::vec4 getModelScaleScaled(); glm::vec3 getGridMax(); glm::vec3 getGridMin(); std::string getVariableUnit(const std::string& variable); diff --git a/modules/kameleon/src/kameleonwrapper.cpp b/modules/kameleon/src/kameleonwrapper.cpp index 4d88a1895d..f4165f4177 100644 --- a/modules/kameleon/src/kameleonwrapper.cpp +++ b/modules/kameleon/src/kameleonwrapper.cpp @@ -154,6 +154,15 @@ bool KameleonWrapper::open(const std::string& filename) { LDEBUG("_yValidMax: " << _yValidMax); LDEBUG("_zValidMin: " << _zValidMin); LDEBUG("_zValidMax: " << _zValidMax); + + + std::vector variables = _model->getLoadedVariables(); + + std::tuple < std::string, std::string, std::string > gridUnits = getGridUnits(); + std::cout << std::get<0>(gridUnits) << ", " << std::get<1>(gridUnits) << ", " << std::get<2>(gridUnits) << std::endl; + std::cout << std::endl; + // std::cout << "SIUnit: " << _model->getSIUnit(variables[0]) << std::endl; + return true; } return false; @@ -542,6 +551,19 @@ glm::vec3 KameleonWrapper::getModelBarycenterOffset() { return offset; } +glm::vec4 KameleonWrapper::getModelBarycenterOffsetScaled(){ + std::tuple < std::string, std::string, std::string > gridUnits = getGridUnits(); + glm::vec4 offset = glm::vec4(getModelBarycenterOffset(), 1.0); + if(std::get<0>(gridUnits) == "R" && std::get<1>(gridUnits) == "R" && std::get<2>(gridUnits) == "R"){ + offset.x *= 6.371f; + offset.y *= 6.371f; + offset.z *= 6.371f; + offset.w = 6; + } + // else if(std::get<0>(t) == "m" && std::get<1>(t) == "radian" && std::get<2>(t) == "radian"){} + return offset; +} + glm::vec3 KameleonWrapper::getModelScale() { if (_type == Model::ENLIL) return glm::vec3(1.0f, 1.0f, 1.0f); @@ -553,6 +575,24 @@ glm::vec3 KameleonWrapper::getModelScale() { return scale; } +glm::vec4 KameleonWrapper::getModelScaleScaled(){ + std::tuple < std::string, std::string, std::string > gridUnits = getGridUnits(); + glm::vec4 scale = glm::vec4(getModelScale(), 1.0); + if (std::get<0>(gridUnits) == "R" && std::get<1>(gridUnits) == "R" && std::get<2>(gridUnits) == "R") { + // Earth radius + scale.x *= 6.371f; + scale.y *= 6.371f; + scale.z *= 6.371f; + scale.w = 6; + } + else if (std::get<0>(gridUnits) == "m" && std::get<1>(gridUnits) == "radian" && std::get<2>(gridUnits) == "radian") { + // For spherical coordinate systems the radius is in meter + scale.w = -log10(1.0f/getGridMax().x); + } + + return scale; +} + glm::vec3 KameleonWrapper::getGridMax() { return glm::vec3(_xMax, _yMax, _zMax); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 45f08f3518..2d68a32fce 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -202,9 +202,6 @@ bool RenderEngine::initialize() { #endif // GHOUL_USE_SOIL ghoul::io::TextureReader::ref().addReader(std::make_shared()); - - - return true; } bool RenderEngine::initializeGL() {