diff --git a/modules/iswa/rendering/dataplane.cpp b/modules/iswa/rendering/dataplane.cpp index a32174ef62..b1c3f2a6ec 100644 --- a/modules/iswa/rendering/dataplane.cpp +++ b/modules/iswa/rendering/dataplane.cpp @@ -23,7 +23,7 @@ // ****************************************************************************************/ #include -#include +//#include #include #include #include @@ -142,80 +142,82 @@ bool DataPlane::deinitialize(){ void DataPlane::render(const RenderData& data){ - if(_texture){ - psc position = data.position; - glm::mat4 transform = glm::mat4(1.0); + + if(!_texture) return; + + psc position = data.position; + glm::mat4 transform = glm::mat4(1.0); - glm::mat4 rotx = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(1, 0, 0)); - glm::mat4 roty = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, -1, 0)); - glm::mat4 rotz = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, 0, 1)); + glm::mat4 rotx = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(1, 0, 0)); + glm::mat4 roty = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, -1, 0)); + glm::mat4 rotz = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, 0, 1)); - glm::mat4 rot = glm::mat4(1.0); - for (int i = 0; i < 3; i++){ - for (int j = 0; j < 3; j++){ - transform[i][j] = static_cast(_stateMatrix[i][j]); - } + glm::mat4 rot = glm::mat4(1.0); + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 3; j++){ + transform[i][j] = static_cast(_stateMatrix[i][j]); } - - transform = transform * rotz * roty; //BATSRUS - - if(_data->frame == "GSM"){ - glm::vec4 v(1,0,0,1); - glm::vec3 xVec = glm::vec3(transform*v); - xVec = glm::normalize(xVec); - - double lt; - glm::vec3 sunVec = - SpiceManager::ref().targetPosition("SUN", "Earth", "GALACTIC", {}, _time, lt); - sunVec = glm::normalize(sunVec); - - float angle = acos(glm::dot(xVec, sunVec)); - glm::vec3 ref = glm::cross(xVec, sunVec); - - glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), angle, ref); - transform = rotation * transform; - } - - position += transform*glm::vec4(_data->spatialScale.x*_data->offset, _data->spatialScale.y); - - // Activate shader - _shader->activate(); - glEnable(GL_ALPHA_TEST); - glDisable(GL_CULL_FACE); - - _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); - _shader->setUniform("ModelTransform", transform); - - // _shader->setUniform("top", _topColor.value()); - // _shader->setUniform("mid", _midColor.value()); - // _shader->setUniform("bot", _botColor.value()); - // _shader->setUniform("tfValues", _tfValues.value()); - - setPscUniforms(*_shader.get(), data.camera, position); - - ghoul::opengl::TextureUnit unit; - unit.activate(); - _texture->bind(); - _shader->setUniform("texture1", unit); - - glBindVertexArray(_quad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glEnable(GL_CULL_FACE); - _shader->deactivate(); - - // position += transform*(glm::vec4(0.5f*_data->scale.x+100.0f ,-0.5f*_data->scale.y, 0.0f, _data->scale.w)); - // // RenderData data = { *_camera, psc(), doPerformanceMeasurements }; - // ColorBarData cbdata = { data.camera, - // position, - // transform, - // _topColor.value(), - // _midColor.value(), - // _botColor.value(), - // _tfValues.value() - // // transform - // }; - // _colorbar->render(cbdata); } + + transform = transform * rotz * roty; //BATSRUS + + if(_data->frame == "GSM"){ + glm::vec4 v(1,0,0,1); + glm::vec3 xVec = glm::vec3(transform*v); + xVec = glm::normalize(xVec); + + double lt; + glm::vec3 sunVec = + SpiceManager::ref().targetPosition("SUN", "Earth", "GALACTIC", {}, _time, lt); + sunVec = glm::normalize(sunVec); + + float angle = acos(glm::dot(xVec, sunVec)); + glm::vec3 ref = glm::cross(xVec, sunVec); + + glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), angle, ref); + transform = rotation * transform; + } + + position += transform*glm::vec4(_data->spatialScale.x*_data->offset, _data->spatialScale.y); + + + // Activate shader + _shader->activate(); + glEnable(GL_ALPHA_TEST); + glDisable(GL_CULL_FACE); + + _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); + _shader->setUniform("ModelTransform", transform); + + // _shader->setUniform("top", _topColor.value()); + // _shader->setUniform("mid", _midColor.value()); + // _shader->setUniform("bot", _botColor.value()); + // _shader->setUniform("tfValues", _tfValues.value()); + + setPscUniforms(*_shader.get(), data.camera, position); + + ghoul::opengl::TextureUnit unit; + unit.activate(); + _texture->bind(); + _shader->setUniform("texture1", unit); + + glBindVertexArray(_quad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glEnable(GL_CULL_FACE); + _shader->deactivate(); + + // position += transform*(glm::vec4(0.5f*_data->scale.x+100.0f ,-0.5f*_data->scale.y, 0.0f, _data->scale.w)); + // // RenderData data = { *_camera, psc(), doPerformanceMeasurements }; + // ColorBarData cbdata = { data.camera, + // position, + // transform, + // _topColor.value(), + // _midColor.value(), + // _botColor.value(), + // _tfValues.value() + // // transform + // }; + // _colorbar->render(cbdata); } void DataPlane::update(const UpdateData& data){ @@ -413,7 +415,7 @@ bool DataPlane::loadTexture() { bool DataPlane::updateTexture(){ _memorybuffer = ""; - std::shared_ptr future = ISWAManager::ref().downloadDataToMemory(-_data->id, _memorybuffer); + std::shared_ptr future = ISWAManager::ref().downloadDataToMemory(_data->id, _memorybuffer); if(future){ _futureData = future; diff --git a/modules/iswa/rendering/textureplane.cpp b/modules/iswa/rendering/textureplane.cpp index b425312022..af3a378fcc 100644 --- a/modules/iswa/rendering/textureplane.cpp +++ b/modules/iswa/rendering/textureplane.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +//#include #include #include #include @@ -60,6 +60,7 @@ bool TexturePlane::initialize(){ createPlane(); createShader(); updateTexture(); + return isReady(); } @@ -73,63 +74,65 @@ bool TexturePlane::deinitialize(){ } void TexturePlane::render(const RenderData& data){ - if(_texture){ - psc position = data.position; - glm::mat4 transform = glm::mat4(1.0); + + if(!_texture) return; + + psc position = data.position; + glm::mat4 transform = glm::mat4(1.0); - glm::mat4 rotx = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(1, 0, 0)); - glm::mat4 roty = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, -1, 0)); - glm::mat4 rotz = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, 0, 1)); + glm::mat4 rotx = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(1, 0, 0)); + glm::mat4 roty = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, -1, 0)); + glm::mat4 rotz = glm::rotate(transform, static_cast(M_PI_2), glm::vec3(0, 0, 1)); - glm::mat4 rot = glm::mat4(1.0); - for (int i = 0; i < 3; i++){ - for (int j = 0; j < 3; j++){ - transform[i][j] = static_cast(_stateMatrix[i][j]); - } + glm::mat4 rot = glm::mat4(1.0); + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 3; j++){ + transform[i][j] = static_cast(_stateMatrix[i][j]); } + } - transform = transform * rotz * roty; //BATSRUS + transform = transform * rotz * roty; //BATSRUS - if(_data->frame == "GSM"){ - glm::vec4 v(1,0,0,1); - glm::vec3 xVec = glm::vec3(transform*v); - xVec = glm::normalize(xVec); + // Correct for the small error of x-axis not pointing directly at the sun + if(_data->frame == "GSM"){ + glm::vec4 v(1,0,0,1); + glm::vec3 xVec = glm::vec3(transform*v); + xVec = glm::normalize(xVec); - double lt; - glm::vec3 sunVec = - SpiceManager::ref().targetPosition("SUN", "Earth", "GALACTIC", {}, _time, lt); - sunVec = glm::normalize(sunVec); + double lt; + glm::vec3 sunVec = + SpiceManager::ref().targetPosition("SUN", "Earth", "GALACTIC", {}, _time, lt); + sunVec = glm::normalize(sunVec); - float angle = acos(glm::dot(xVec, sunVec)); - glm::vec3 ref = glm::cross(xVec, sunVec); + float angle = acos(glm::dot(xVec, sunVec)); + glm::vec3 ref = glm::cross(xVec, sunVec); - glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), angle, ref); - transform = rotation * transform; - } + glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), angle, ref); + transform = rotation * transform; + } - // position += transform*glm::vec4(_data->offset.x, _data->offset.z, _data->offset.y, _data->offset.w); - position += transform*glm::vec4(_data->spatialScale.x*_data->offset, _data->spatialScale.y); + // position += transform*glm::vec4(_data->offset.x, _data->offset.z, _data->offset.y, _data->offset.w); + position += transform*glm::vec4(_data->spatialScale.x*_data->offset, _data->spatialScale.y); - // Activate shader - _shader->activate(); - glEnable(GL_ALPHA_TEST); - glDisable(GL_CULL_FACE); - _shader->setUniform("ViewProjection", OsEng.renderEngine().camera()->viewProjectionMatrix()); - _shader->setUniform("ModelTransform", transform); - setPscUniforms(*_shader.get(), *OsEng.renderEngine().camera(), position); + // Activate shader + _shader->activate(); + glEnable(GL_ALPHA_TEST); + glDisable(GL_CULL_FACE); + _shader->setUniform("ViewProjection", OsEng.renderEngine().camera()->viewProjectionMatrix()); + _shader->setUniform("ModelTransform", transform); + setPscUniforms(*_shader.get(), *OsEng.renderEngine().camera(), position); - ghoul::opengl::TextureUnit unit; - unit.activate(); - _texture->bind(); - _shader->setUniform("texture1", unit); + ghoul::opengl::TextureUnit unit; + unit.activate(); + _texture->bind(); + _shader->setUniform("texture1", unit); - glBindVertexArray(_quad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glEnable(GL_CULL_FACE); + glBindVertexArray(_quad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glEnable(GL_CULL_FACE); - _shader->deactivate(); - } + _shader->deactivate(); } void TexturePlane::update(const UpdateData& data){ diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index 8b0e6507b5..270ff5acbe 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -63,10 +63,17 @@ namespace openspace{ std::stringstream ss(info); getline(ss,token,','); int cygnetId = std::stoi(token); - - getline(ss,token,','); - std::string data = token; - addISWACygnet(cygnetId, data); + + if(!ss.eof()){ + getline(ss,token,','); + std::string data = token; + addISWACygnet(cygnetId, data); + } else{ + addISWACygnet(cygnetId); + } + /*if(data == "") + else*/ + } void ISWAManager::addISWACygnet(int id, std::string info){ @@ -79,12 +86,6 @@ namespace openspace{ metaFuture->id = id; _metaFutures.push_back(metaFuture); } -/* else { - std::shared_ptr metaFuture = downloadMetadata(-2); - metaFuture->type = "DATA"; - metaFuture->id = -2; - _metaFutures.push_back(metaFuture); - }*/ } void ISWAManager::deleteISWACygnet(std::string name){ @@ -104,17 +105,17 @@ namespace openspace{ std::shared_ptr ISWAManager::downloadImageToMemory(int id, std::string& buffer){ return DlManager.downloadToMemory( - iSWAurl(id), - buffer, - [](const DownloadManager::FileFuture& f){ - LDEBUG("Download to memory finished"); - } - ); + iSWAurl(id, "image"), + buffer, + [](const DownloadManager::FileFuture& f){ + LDEBUG("Download to memory finished"); + } + ); } std::shared_ptr ISWAManager::downloadDataToMemory(int id, std::string& buffer){ return DlManager.downloadToMemory( - iSWADataUrl(id), + iSWAurl(id, "data"), buffer, [](const DownloadManager::FileFuture& f){ LDEBUG("Download data finished"); @@ -149,6 +150,7 @@ namespace openspace{ std::string token; std::getline(ss, token, '/'); std::getline(ss, token); + std::string ext = "."+token; extFuture->extension = ext; @@ -170,36 +172,14 @@ namespace openspace{ return nullptr; } - std::string ISWAManager::iSWAurl(int id){ + std::string ISWAManager::iSWAurl(int id, std::string type){ std::string url; - if(id < 0){ - url = "http://128.183.168.116:3000/image/" + std::to_string(-id) + "/"; - } else { + url = "http://128.183.168.116:3000/"+type+"/" + std::to_string(-id) + "/"; + } else{ url = "http://iswa2.ccmc.gsfc.nasa.gov/IswaSystemWebApp/iSWACygnetStreamer?window=-1&cygnetId="+ std::to_string(id) +"×tamp="; - } - - std::string t = Time::ref().currentTimeUTC(); - std::stringstream ss(t); - std::string token; + } - std::getline(ss, token, ' '); - url += token + "-"; - std::getline(ss, token, ' '); - url += _month[token] + "-"; - std::getline(ss, token, 'T'); - url += token + "%20"; - std::getline(ss, token, '.'); - url += token; - - //std::cout << url << std::endl; - - return url; - } - - std::string ISWAManager::iSWADataUrl(int id){ - std::string url = "http://128.183.168.116:3000/data/" + std::to_string(id) + "/"; - // /2996-01-23%2000:44:00 std::string t = Time::ref().currentTimeUTC(); std::stringstream ss(t); std::string token; @@ -219,11 +199,12 @@ namespace openspace{ void ISWAManager::update(){ for (auto it = _metaFutures.begin(); it != _metaFutures.end(); ){ if((*it)->isFinished) { - if((*it)->type == "DATA"){ - createPlane((*it)->id,(*it)->json,std::string("DataPlane")); - }else{ + if((*it)->type == "TEXTURE"){ createPlane((*it)->id,(*it)->json,std::string("TexturePlane")); - + }else if ((*it)->type == "DATA"){ + createPlane((*it)->id,(*it)->json,std::string("DataPlane")); + } else { + LERROR("\""+ (*it)->type + "\" is not a valid type"); } it = _metaFutures.erase( it ); }else{ @@ -339,6 +320,14 @@ namespace openspace{ // } void ISWAManager::createPlane(int id, std::string json, std::string type){ + + // check if this plane already exist + std::string name = type + std::to_string(id); + if( OsEng.renderEngine().scene()->sceneGraphNode(name) ){ + LERROR("A node with name \"" + name +"\" already exist"); + return; + } + std::string luaTable = parseJSONToLuaTable(id, json, type); if(luaTable != ""){ std::string script = "openspace.addSceneGraphNode(" + luaTable + ");"; diff --git a/modules/iswa/util/iswamanager.h b/modules/iswa/util/iswamanager.h index cf2760b412..f6e1f13712 100644 --- a/modules/iswa/util/iswamanager.h +++ b/modules/iswa/util/iswamanager.h @@ -38,9 +38,9 @@ class ISWACygnet; class ISWAContainer; struct ExtensionFuture { - std::string extension; - bool isFinished; - int id; + std::string extension; + bool isFinished; + int id; std::string parent; }; @@ -57,53 +57,53 @@ struct Metadata { }; struct MetadataFuture { - int id; - std::string type; - std::string json; - bool isFinished; + int id; + std::string type; + std::string json; + bool isFinished; }; class ISWAManager : public ghoul::Singleton { - friend class ghoul::Singleton; + friend class ghoul::Singleton; public: - ISWAManager(); - ~ISWAManager(); + ISWAManager(); + ~ISWAManager(); - // std::shared_ptr createISWACygnet(std::shared_ptr metadata); - void addISWACygnet(std::string info); - void addISWACygnet(int id, std::string info = "TEXTURE"); - void deleteISWACygnet(std::string); + // std::shared_ptr createISWACygnet(std::shared_ptr metadata); + void addISWACygnet(std::string info); + void addISWACygnet(int id, std::string info = "TEXTURE"); + void deleteISWACygnet(std::string); - std::shared_ptr downloadImage(int, std::string); - std::shared_ptr downloadImageToMemory(int id, std::string& buffer); - std::shared_ptr downloadDataToMemory(int id, std::string& buffer); - std::shared_ptr fileExtension(int); + std::shared_ptr downloadImage(int, std::string); + std::shared_ptr downloadImageToMemory(int id, std::string& buffer); + std::shared_ptr downloadDataToMemory(int id, std::string& buffer); + std::shared_ptr fileExtension(int); - void setContainer(ISWAContainer*); - std::shared_ptr iSWACygnet(std::string); + void setContainer(ISWAContainer*); + std::shared_ptr iSWACygnet(std::string); + + void update(); - void update(); private: - std::string iSWAurl(int id); - std::string iSWADataUrl(int id); - std::shared_ptr downloadMetadata(int id); - std::string getDictionaryTable(int id, std::string path); - std::string parseJSONToLuaTable(int id, std::string json, std::string type); - std::string parseKWToLuaTable(std::string kwPath); + std::string iSWAurl(int id, std::string type = "image"); + std::shared_ptr downloadMetadata(int id); + std::string getDictionaryTable(int id, std::string path); + std::string parseJSONToLuaTable(int id, std::string json, std::string type); + std::string parseKWToLuaTable(std::string kwPath); - // void createDataPlane(std::string kwPath); - // void createTexturePlane(int id, std::string json); - void createPlane(int id, std::string json, std::string type); - void createScreenSpace(int id); + // void createDataPlane(std::string kwPath); + // void createTexturePlane(int id, std::string json); + void createPlane(int id, std::string json, std::string type); + void createScreenSpace(int id); - std::map _month; - ISWAContainer* _container; - std::vector> _extFutures; - std::vector> _metaFutures; + std::map _month; + ISWAContainer* _container; + std::vector> _extFutures; + std::vector> _metaFutures; }; } //namespace openspace