diff --git a/data/assets/scene/solarsystem/sun/heliosphere/bastille_day/fluxnodes.asset b/data/assets/scene/solarsystem/sun/heliosphere/bastille_day/fluxnodes.asset index ceefdef81d..d41cbd7068 100644 --- a/data/assets/scene/solarsystem/sun/heliosphere/bastille_day/fluxnodes.asset +++ b/data/assets/scene/solarsystem/sun/heliosphere/bastille_day/fluxnodes.asset @@ -23,8 +23,6 @@ local fluxnodesBinaries = asset.syncedResource({ Version = 1 }) -local sunRadius = 6.957E8 - -- Fluxnodes from binaries local Fluxnodes = { Identifier = "MAS_MHD_FluxNodes", @@ -36,7 +34,6 @@ local Fluxnodes = { Type = "RenderableFluxNodes", --SourceFolder = fluxnodesDirectory, BinarySourceFolder = fluxnodesBinaries, - -- interestingStreamsEnabled = false, -- LineWidth = 1.0; -- AlphaBlendlingEnabled = false, -- InputFileType = "json", diff --git a/modules/space/rendering/renderablefluxnodes.cpp b/modules/space/rendering/renderablefluxnodes.cpp index 29abd05cdd..76962d7198 100644 --- a/modules/space/rendering/renderablefluxnodes.cpp +++ b/modules/space/rendering/renderablefluxnodes.cpp @@ -43,14 +43,10 @@ #include #include #include -#include #include #include #include -// This is a call to use the nlohmann json file -using json = nlohmann::json; - namespace { // log category constexpr const char* _loggerCat = "renderableFluxNodes"; @@ -59,8 +55,6 @@ namespace { constexpr const GLuint VaPosition = 0; // MUST CORRESPOND TO THE SHADER PROGRAM constexpr const GLuint VaColor = 1; // MUST CORRESPOND TO THE SHADER PROGRAM constexpr const GLuint VaFiltering = 2; // MUST CORRESPOND TO THE SHADER PROGRAM - //constexpr const GLuint VaStreamnumber = 3; // MUST CORRESPOND TO THE SHADER PROGRAM - // constexpr const GLuint Arrow = 4; // MUST CORRESPOND TO THE SHADER PROGRAM constexpr int8_t CurrentCacheVersion = 2; @@ -71,7 +65,7 @@ namespace { "nodeSkip", "nodeSkipDefault", "nodeSkipEarth", "nodeSkipMethod", "nodeSkipFluxThreshold", "nodeSkipRadiusThreshold", "fluxColorAlpha", "fluxColorAlphaIlluminance", "earthPos", "distanceThreshold", - "enhanceMethod", "flowColor", "usingParticles", // "activeStreamNumber", + "enhanceMethod", "flowColor", "usingParticles", "usingInterestingStreams","particleSize", "particleSpacing", "particleSpeed" }; constexpr const std::array UniformNames2 = { @@ -86,7 +80,7 @@ namespace { "GoesEnergy", "Goes Energy", "Select which energy bin you want to show. Emin01 is values > 10 Mev," - "Emin03 is values > 100 Mev." + "Default is Emin03 where values > 100 Mev." }; constexpr openspace::properties::Property::PropertyInfo ColorModeInfo = { "colorMode", @@ -176,8 +170,7 @@ namespace { "The value of alpha for the flux color mode." }; constexpr openspace::properties::Property::PropertyInfo - FluxColorAlphaIlluminanceInfo = - { + FluxColorAlphaIlluminanceInfo = { "fluxColorAlphaIlluminance", "Flux Color Alpha for illuminance", "The value of alpha for the flux color mode." @@ -188,8 +181,7 @@ namespace { "Select nodes to skip depending on flux value." }; constexpr openspace::properties::Property::PropertyInfo - RadiusNodeSkipThresholdInfo = - { + RadiusNodeSkipThresholdInfo = { "skippingNodesByRadius", "Skipping Nodes By Radius", "Select nodes to skip depending on Radius." @@ -209,11 +201,6 @@ namespace { "Threshold for distance between planet", "Enhance the size of nodes dependent on distance to planet." }; - //constexpr openspace::properties::Property::PropertyInfo ActiveStreamNumberInfo = { - // "activeStreamNumber", - // "activeStream", - // "The active stream to show" - //}; constexpr openspace::properties::Property::PropertyInfo MisalignedIndexInfo = { "misalignedIndex", "Index to shift sequence number", @@ -265,19 +252,13 @@ namespace { "Max Node Distance Size", "The maximum size of the nodes at a certin distance." }; - /*constexpr openspace::properties::Property::PropertyInfo MinNodeDistanceSizeInfo = { - "minNodeDistanceSize", - "Min Node Distance Size", - "The minimum size of the nodes at a certin distance" - };*/ constexpr openspace::properties::Property::PropertyInfo NodeDistanceThresholdInfo = { "nodeDistanceThreshold", "Node Distance Threshold", "Threshold for where to interpolate between the max and min node distance." }; constexpr openspace::properties::Property::PropertyInfo - CameraPerspectiveEnabledInfo = - { + CameraPerspectiveEnabledInfo = { "cameraPerspectiveEnabled", "Use Camera perspective", "Camera perspective changes the size of the nodes dependent on " @@ -300,16 +281,14 @@ namespace { }; constexpr openspace::properties::Property::PropertyInfo - RadiusPerspectiveEnabledInfo = - { + RadiusPerspectiveEnabledInfo = { "radiusPerspectiveEnabled", "Include radius with cameraperspective", "If false, then nodes closer to the sun will not be larger " "regardless of distance to camera." }; constexpr openspace::properties::Property::PropertyInfo - PerspectiveDistanceFactorInfo = - { + PerspectiveDistanceFactorInfo = { "perspectiveDistanceFactor", "Perspective Distance factor", "This value decides how far away the camera must be to start " @@ -362,6 +341,8 @@ namespace { std::optional> colorTablePaths; // [[codegen::verbatim(LineWidthInfo.description)]] //float lineWidth; + // [[codegen::verbatim(GoesEnergyBinsInfo.description)]] + std::optional energyBin; }; #include "renderablefluxnodes_codegen.cpp" @@ -420,7 +401,6 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) , _pRadiusNodeSkipThreshold(RadiusNodeSkipThresholdInfo, 0.f, 0.f, 5.f) , _pEarthdistGroup({ "Earthfocus" }) , _pDistanceThreshold(DistanceThresholdInfo, 0.0f, 0.0f, 1.0f) - //, _pActiveStreamNumber(ActiveStreamNumberInfo, 0, 0, _numberofStreams) , _pMisalignedIndex(MisalignedIndexInfo, 0, -5, 20) , _pFlowColor( FlowColorInfo, @@ -436,7 +416,6 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) , _pFlowSpeed(FlowSpeedInfo, 20, 0, 1000) , _pUseFlowColor(UseFlowColorInfo, false) , _scaleFactor(TempInfo1, 150.f, 1.f, 500.f) - //, _pMinNodeDistanceSize(MinNodeDistanceSizeInfo, 1.f, 1.f, 7.f) , _pMaxNodeDistanceSize(MaxNodeDistanceSizeInfo, 1.f, 1.f, 10.f) , _pNodeDistanceThreshold(NodeDistanceThresholdInfo, 0.f, 0.f, 40.f) , _pCameraPerspectiveEnabled(CameraPerspectiveEnabledInfo, false) @@ -451,12 +430,12 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) , _pPulseEnabled(pulseEnabledInfo, false) , _pGaussianPulseEnabled(gaussianPulseEnabledInfo, false) , _pPulseAlways(AlwaysPulseInfo, false) - //, _pTestChange(TestChangeInfo, 0.5f, 0.0f, 1.f) { const Parameters p = codegen::bake(dictionary); + if (p.colorTablePaths.has_value()) { _colorTablePaths = p.colorTablePaths.value_or(_colorTablePaths); _transferFunction = std::make_unique(_colorTablePaths[0]); @@ -467,6 +446,7 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) _transferFunctionFlow = std::make_unique(absPath(_colorTablePaths[3]).string()); } + _pColorTablePath = _colorTablePaths[0]; _binarySourceFolderPath = p.binarySourceFolder; if (std::filesystem::is_directory(_binarySourceFolderPath)) { @@ -494,12 +474,52 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) _binarySourceFolderPath )); } - + // --------------------- Add Options to OptionProperties --------------------- // + _pGoesEnergyBins.addOption(static_cast(GoesEnergyBins::Emin01), "Emin01"); + _pGoesEnergyBins.addOption(static_cast(GoesEnergyBins::Emin03), "Emin03"); + _pColorMode.addOption(static_cast(ColorMethod::ByFluxValue), "By Flux Value"); + _pColorMode.addOption(static_cast(ColorMethod::Uniform), "Uniform"); + + _pScalingmethod.addOption(static_cast(ScalingMethod::Flux), "Flux"); + _pScalingmethod.addOption(static_cast(ScalingMethod::RFlux), "Radius * Flux"); + _pScalingmethod.addOption(static_cast(ScalingMethod::R2Flux), "Radius^2 * Flux"); + _pScalingmethod.addOption( + static_cast(ScalingMethod::log10RFlux), "log10(r) * Flux"); + _pScalingmethod.addOption(static_cast(ScalingMethod::lnRFlux), "ln(r) * Flux"); + + _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Uniform), "Uniform"); + _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Flux), "Flux"); + _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Radius), "Radius"); + _pNodeskipMethod.addOption( + static_cast(NodeSkipMethod::Streamnumber), "Streamnumber"); + + _pEnhancemethod.addOption( + static_cast(EnhanceMethod::Sizescaling), "SizeScaling"); + _pEnhancemethod.addOption( + static_cast(EnhanceMethod::Colortables), "ColorTables"); + _pEnhancemethod.addOption( + static_cast(EnhanceMethod::Sizeandcolor), "Sizescaling and colortables"); + _pEnhancemethod.addOption( + static_cast(EnhanceMethod::Illuminance), "Illuminance"); + + if (p.energyBin.has_value()) { + _pGoesEnergyBins.setValue(p.energyBin.value()); + } + else { // default int 1 == Emin03 == MeV>100 + LWARNING("Assuming default value 1, meaning Emin03"); + _pGoesEnergyBins.setValue(1); + } } void RenderableFluxNodes::initialize() { + setModelDependentConstants(); + populateStartTimes(); + + loadNodeData(_pGoesEnergyBins.option().value); + + computeSequenceEndTime(); } void RenderableFluxNodes::initializeGL() { @@ -518,28 +538,12 @@ void RenderableFluxNodes::initializeGL() { _uniformCache.thresholdFlux = _shaderProgram->uniformLocation("thresholdFlux"); ghoul::opengl::updateUniformLocations(*_shaderProgram, _uniformCache, UniformNames); - ghoul::opengl::updateUniformLocations(*_shaderProgram, _uniformCache2, UniformNames2); - - setModelDependentConstants(); - - populateStartTimes(); - - //createStreamnumberVector(); - // Either we load in the data dynamically or statically at the start. - // If we should load in everything to Ram this if statement is true. - if (!_loadingStatesDynamically) { - loadNodeData(); - } - computeSequenceEndTime(); - - // If we are loading in states dynamically we would read new states during runtime, - // parsing json files pretty slowly. + ghoul::opengl::updateUniformLocations(*_shaderProgram, _uniformCache2, UniformNames2); glGenVertexArrays(1, &_vertexArrayObject); glGenBuffers(1, &_vertexPositionBuffer); glGenBuffers(1, &_vertexColorBuffer); glGenBuffers(1, &_vertexFilteringBuffer); - //glGenBuffers(1, &_vertexStreamNumberBuffer); // Needed for alpha transparency setRenderBin(Renderable::RenderBin::PreDeferredTransparent); @@ -555,25 +559,7 @@ void RenderableFluxNodes::definePropertyCallbackFunctions() { }); _pGoesEnergyBins.onChange([this] { - if (_pGoesEnergyBins.option().value == 1) { // 1 == Emin03 == Mev > 100 - if (_shouldreadBinariesDirectly) { - // empty string == emin03 for default - bool success = loadBinaryfilesDirectly(""); - if (success) return; - } - } - else if (_pGoesEnergyBins.option().value == 0) { // 0 == Emin01 == Mev > 10 - if (_shouldreadBinariesDirectly) { - bool success = loadBinaryfilesDirectly("_emin01"); - if (success) return; - } - } - // Emin01 = >10 MeV. Emin03 = >100 Mev - else { - throw ghoul::RuntimeError( - "Error: Unknown EnergyBin. Supports 0=Emin01 and 1=Emin03"); - return; - } + loadNodeData(_pGoesEnergyBins.option().value); }); } @@ -592,228 +578,21 @@ void RenderableFluxNodes::setModelDependentConstants() { _pDomainZ = glm::vec2(limitZMin, limitZMax); } -void RenderableFluxNodes::loadNodeData() { - - if (_shouldreadBinariesDirectly) { - bool success = false; - if(_shouldloademin03directly){ - success = loadBinaryfilesDirectly(""); - //_pGoesEnergyBins.addOption(1,""); - } - else { - success = loadBinaryfilesDirectly("_emin01"); - } - if(success) return; - } - //std::string _file = "StreamnodesCachePositionv3"; - //std::string _file2 = "StreamnodesCacheColorv3"; - //std::string _file3 = "StreamnodesCacheRadiusv3"; - //if (_shouldwritecacheforemin03) { - // _file = "StreamnodesCachePosition_emin03"; - // _file2 = "StreamnodesCacheColor_emin03"; - // _file3 = "StreamnodesCacheRadius_emin03"; - //} - ////if the files doesn't exist we create them, this is just so that we then can - //// cache the actual binary files - //if (!std::filesystem::is_regular_file(_file)) { - // std::ofstream fileStream(_file, std::ofstream::binary); - // std::ofstream fileStream2(_file2, std::ofstream::binary); - // std::ofstream fileStream3(_file3, std::ofstream::binary); - - // fileStream.write( - // reinterpret_cast(&CurrentCacheVersion), - // sizeof(int8_t) - // ); - // fileStream2.write( - // reinterpret_cast(&CurrentCacheVersion), - // sizeof(int8_t) - // ); - // fileStream3.write( - // reinterpret_cast(&CurrentCacheVersion), - // sizeof(int8_t) - // ); - //} - - //std::string cachedFile = FileSys.cacheManager()->cachedFilename(_file); - // //Check if we have a cached binary file for the data - //bool hasCachedFile = std::filesystem::is_regular_file(cachedFile); - - //if (hasCachedFile) { - // LINFO(fmt::format("Cached file '{}' used for Speck file '{}'", - // cachedFile, _file - // )); - // //Read in the data from the cached file - // bool success = loadBinaryfilesDirectly(""); //readCachedFile(cachedfile, "") - // if (!success) { - // // If something went wrong it is probably because we changed - // // the cache version or some file was not found. - // LWARNING("Cache file removed, something went wrong loading it."); - // // If thats the case we want to load in the files from json format - // // and then write new cached files. - // loadFilesIntoRam(); //~40min - // writeCachedFile(); - // } - //} - //else { - // //We could not find the cachedfiles, parse the data statically - // //instead and write it to binary format. - // loadFilesIntoRam(); - // writeCachedFile(); - //} - -} - -//void RenderableFluxNodes::createStreamnumberVector() { -// int nPoints = 1999; -// int lineStartIdx = 0; -// -// for (int i = 0; i < _numberofStreams; ++i) { -// for (int k = 0; k < nPoints; ++k) { -// -// _vertexStreamnumber.push_back(i); -// //lineStartIdx++; -// } -// -// _lineCount.push_back(static_cast(nPoints)); -// _lineStart.push_back(static_cast(lineStartIdx)); -// lineStartIdx += nPoints; -// } -//} - -//bool RenderableFluxNodes::loadFilesIntoRam() { -// LDEBUG("Did not find cached file," -// "loading in data and converting only for this run," -// "this step wont be needed next time you run Openspace "); -// // Loop through all the files dependent on how many states we would like to read in -// for (size_t j = 0; j < _nStates; ++j) { -// -// std::ifstream streamdata(_sourceFiles[j]); -// if (!streamdata.is_open()) -// { -// LDEBUG("did not read the data.json file"); -// return false; -// } -// json jsonobj = json::parse(streamdata); -// -// size_t lineStartIdx = 0; -// //const int _numberofStreams = 383; -// // const int _numberofStreams = 863; -// constexpr const float AuToMeter = 149597870700.f; // Astronomical Units -// -// // Clear all the vectors in order to not have old states information in them -// _vertexPositions.clear(); -// _lineCount.clear(); -// _lineStart.clear(); -// _vertexRadius.clear(); -// _vertexColor.clear(); -// -// const size_t nPoints = 1; -// -// // Loop through all the streams -// for (int i = 0; i < _numberofStreams; ++i) { -// -// // Make an iterator at stream number i, then loop through that stream -// // by iterating forward -// for (json::iterator lineIter = jsonobj["stream" + std::to_string(i)].begin(); -// lineIter != jsonobj["stream" + std::to_string(i)].end(); ++lineIter) { -// -// //get all the nodepositional values and Flux value -// std::string r = (*lineIter)["R"].get(); -// std::string phi = (*lineIter)["Phi"].get(); -// std::string theta = (*lineIter)["Theta"].get(); -// std::string flux = (*lineIter)["Flux"].get(); -// -// // Convert the values to float -// float rValue = stringToFloat(r); -// float phiValue = stringToFloat(phi); -// float thetaValue = stringToFloat(theta); -// float fluxValue = stringToFloat(flux); -// -// // Push back values in order to be able to filter and color nodes -// // by different threshold etc. -// float rTimesFluxValue = fluxValue; -// _vertexColor.push_back(rTimesFluxValue); -// _vertexRadius.push_back(rValue); -// rValue = rValue * AuToMeter; -// -// glm::vec3 sphericalcoordinates = glm::vec3(rValue, phiValue, thetaValue); -// -// // Convert the position from spherical coordinates to cartesian. -// glm::vec3 position = sphericalToCartesianCoord(sphericalcoordinates); -// -// _vertexPositions.push_back(position); -// -// _lineCount.push_back(static_cast(nPoints)); -// _lineStart.push_back(static_cast(lineStartIdx)); -// lineStartIdx += nPoints; -// } -// } -// LDEBUG("Loaded in: " + std::to_string(_statesPos.size()) + -// " frames of nodedata out of " + std::to_string(_nStates) + " total."); -// -// // Push back the vectors into our statesvectors -// _statesPos.push_back(_vertexPositions); -// _statesColor.push_back(_vertexColor); -// _statesRadius.push_back(_vertexRadius); -// } -// return true; -//} - -//void RenderableFluxNodes::writeCachedFile() const { -// // Todo, write all of the vertexobjects into here -// std::string _file = "StreamnodesCachePositionv3"; -// std::string _file2 = "StreamnodesCacheColorv3"; -// std::string _file3 = "StreamnodesCacheRadiusv3"; -// -// if(_shouldwritecacheforemin03){ -// _file = "StreamnodesCachePosition_emin03"; -// _file2 = "StreamnodesCacheColor_emin03"; -// _file3 = "StreamnodesCacheRadius_emin03"; -// } -// std::string cachedFile = FileSys.cacheManager()->cachedFilename(_file); -// std::ofstream fileStream(cachedFile, std::ofstream::binary); -// -// if (!fileStream.good()) { -// LERROR(fmt::format("Error opening file '{}' for save cache file", -// cachedFile -// )); -// return; -// } -// -// fileStream.write( -// reinterpret_cast(&CurrentCacheVersion), -// sizeof(int8_t) -// ); -// -// std::string cachedFile2 = FileSys.cacheManager()->cachedFilename(_file2); -// std::ofstream fileStream2(cachedFile2, std::ofstream::binary); -// -// std::string cachedFile3 = FileSys.cacheManager()->cachedFilename(_file3); -// std::ofstream fileStream3(cachedFile3, std::ofstream::binary); -// -// int32_t nValues = static_cast(_vertexRadius.size()); -// if (nValues == 0) { -// throw ghoul::RuntimeError("Error writing cache: No values were loaded"); -// return; -// } -// -// fileStream.write(reinterpret_cast(&nValues), sizeof(int32_t)); -// -// for(unsigned int i = 0; i < _nStates; ++i){ -// fileStream.write(reinterpret_cast(_statesPos[i].data()), -// nValues * sizeof(glm::vec3)); -// fileStream2.write(reinterpret_cast(_statesColor[i].data()), -// nValues * sizeof(float)); -// fileStream3.write(reinterpret_cast(_statesRadius[i].data()), -// nValues * sizeof(float)); -// } -//} - -bool RenderableFluxNodes::loadBinaryfilesDirectly(const std::string& energybin) { +void RenderableFluxNodes::loadNodeData(const int& energybinOption) { constexpr const float AuToMeter = 149597870700.f; // Astronomical Units LDEBUG("Loading in binary files directly from sync folder"); - + + std::string energybin; + switch (energybinOption) { + case 0: + energybin = "_emin01"; + break; + case 1: + energybin = "_emin03"; + break; + } + std::string _file = _binarySourceFolderPath + "\\positions" + energybin; std::string _file2 = _binarySourceFolderPath + "\\fluxes" + energybin; std::string _file3 = _binarySourceFolderPath + "\\radiuses" + energybin; @@ -823,8 +602,8 @@ bool RenderableFluxNodes::loadBinaryfilesDirectly(const std::string& energybin) std::ifstream fileStream3(_file3, std::ifstream::binary); if (!fileStream.good()) { - _isLoadingNewEnergyBin = false; - return false; + LERROR(fmt::format("Could not read file '{}'", _file)); + return; } uint32_t nNodesPerTimestep = 0; @@ -834,6 +613,12 @@ bool RenderableFluxNodes::loadBinaryfilesDirectly(const std::string& energybin) fileStream.read(reinterpret_cast(&nTimeSteps), sizeof(uint32_t)); _nStates = nTimeSteps; + if (_nStates != _startTimes.size()) { + LERROR("number of states, _nStates, and number of start times, _startTimes, " + "dont match"); + return; + } + _statesColor.clear(); _statesPos.clear(); _statesRadius.clear(); @@ -865,11 +650,6 @@ bool RenderableFluxNodes::loadBinaryfilesDirectly(const std::string& energybin) _statesRadius.push_back(_vertexRadius); _vertexRadius.clear(); } - - _isLoadingNewEnergyBin = false; - bool success = fileStream.good(); - - return success; } void RenderableFluxNodes::setupProperties() { @@ -910,8 +690,6 @@ void RenderableFluxNodes::setupProperties() { _pNodesamountGroup.addProperty(_pNodeSizeLargerFlux); _pNodesamountGroup.addProperty(_pFluxNodeskipThreshold); _pNodesamountGroup.addProperty(_pRadiusNodeSkipThreshold); - //_pNodesamountGroup.addProperty(_pActiveStreamNumber); - //_pNodesamountGroup.addProperty(_pMinNodeDistanceSize); _pNodesamountGroup.addProperty(_pMaxNodeDistanceSize); _pNodesamountGroup.addProperty(_pNodeDistanceThreshold); @@ -926,36 +704,6 @@ void RenderableFluxNodes::setupProperties() { _pFlowGroup.addProperty(_pFlowSpeed); _pFlowGroup.addProperty(_pUseFlowColor); - // _pStreamGroup.addProperty(_pTestChange); - - // --------------------- Add Options to OptionProperties --------------------- // - _pGoesEnergyBins.addOption(static_cast(GoesEnergyBins::Emin01), "Emin01"); - _pGoesEnergyBins.addOption(static_cast(GoesEnergyBins::Emin03), "Emin03"); - _pColorMode.addOption(static_cast(ColorMethod::ByFluxValue), "By Flux Value"); - _pColorMode.addOption(static_cast(ColorMethod::Uniform), "Uniform"); - - _pScalingmethod.addOption(static_cast(ScalingMethod::Flux), "Flux"); - _pScalingmethod.addOption(static_cast(ScalingMethod::RFlux), "Radius * Flux"); - _pScalingmethod.addOption(static_cast(ScalingMethod::R2Flux), "Radius^2 * Flux"); - _pScalingmethod.addOption( - static_cast(ScalingMethod::log10RFlux), "log10(r) * Flux"); - _pScalingmethod.addOption(static_cast(ScalingMethod::lnRFlux), "ln(r) * Flux"); - - _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Uniform), "Uniform"); - _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Flux), "Flux"); - _pNodeskipMethod.addOption(static_cast(NodeSkipMethod::Radius), "Radius"); - _pNodeskipMethod.addOption( - static_cast(NodeSkipMethod::Streamnumber), "Streamnumber"); - - _pEnhancemethod.addOption( - static_cast(EnhanceMethod::Sizescaling), "SizeScaling"); - _pEnhancemethod.addOption( - static_cast(EnhanceMethod::Colortables), "ColorTables"); - _pEnhancemethod.addOption( - static_cast(EnhanceMethod::Sizeandcolor), "Sizescaling and colortables"); - _pEnhancemethod.addOption( - static_cast(EnhanceMethod::Illuminance), "Illuminance"); - _pCameraPerspectiveGroup.addProperty(_pCameraPerspectiveEnabled); _pCameraPerspectiveGroup.addProperty(_pPerspectiveDistanceFactor); _pCameraPerspectiveGroup.addProperty(_pDrawingCircles); @@ -969,8 +717,6 @@ void RenderableFluxNodes::setupProperties() { _pCameraPerspectiveGroup.addProperty(_pPulseAlways); definePropertyCallbackFunctions(); - // Set default - _pColorTablePath = _colorTablePaths[0]; } void RenderableFluxNodes::deinitializeGL() { @@ -986,24 +732,10 @@ void RenderableFluxNodes::deinitializeGL() { glDeleteBuffers(1, &_vertexFilteringBuffer); _vertexFilteringBuffer = 0; - //glDeleteBuffers(1, &_vertexStreamNumberBuffer); - //_vertexStreamNumberBuffer = 0; - if (_shaderProgram) { global::renderEngine->removeRenderProgram(_shaderProgram.get()); _shaderProgram = nullptr; } - - // Stall main thread until thread that's loading states is done! - bool printedWarning = false; - while (_isLoadingStateFromDisk) { - if (!printedWarning) { - LWARNING("Trying to destroy class when an active thread is still using it"); - printedWarning = true; - } - // TODO Replace sleep, (at least this is not during runtime) - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - } } bool RenderableFluxNodes::isReady() const { @@ -1126,7 +858,6 @@ void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) { _shaderProgram->setUniform("modelViewProjection", data.camera.sgctInternal.projectionMatrix() * glm::mat4(modelViewMat)); - //glm::vec3 earthPos = glm::vec3(94499869340, -115427843118, 11212075887.3); SceneGraphNode* earthNode = sceneGraphNode("Earth"); glm::vec3 earthPos = earthNode->worldPosition() * data.modelTransform.rotation; @@ -1155,8 +886,6 @@ void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) { _pFluxColorAlphaIlluminance); _shaderProgram->setUniform(_uniformCache.earthPos, earthPos); _shaderProgram->setUniform(_uniformCache.distanceThreshold, _pDistanceThreshold); - //_shaderProgram->setUniform(_uniformCache.activeStreamNumber, - // _pActiveStreamNumber); _shaderProgram->setUniform(_uniformCache.enhanceMethod, _pEnhancemethod); _shaderProgram->setUniform(_uniformCache.flowColor, _pFlowColor); _shaderProgram->setUniform(_uniformCache.usingParticles, _pFlowEnabled); @@ -1165,14 +894,11 @@ void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) { _shaderProgram->setUniform(_uniformCache.particleSize, _pFlowParticleSize); _shaderProgram->setUniform(_uniformCache.particleSpacing, _pFlowParticleSpacing); _shaderProgram->setUniform(_uniformCache.particleSpeed, _pFlowSpeed); - _shaderProgram->setUniform(_uniformCache2.time, global::windowDelegate->applicationTime() * -1); _shaderProgram->setUniform(_uniformCache2.flowColoring, _pUseFlowColor); - //_shaderProgram->setUniform("minNodeDistanceSize", _pMinNodeDistanceSize); _shaderProgram->setUniform(_uniformCache2.maxNodeDistanceSize, _pMaxNodeDistanceSize); - //_shaderProgram->setUniform("nodeDistanceThreshold", _pNodeDistanceThreshold); _shaderProgram->setUniform(_uniformCache2.usingCameraPerspective, _pCameraPerspectiveEnabled); _shaderProgram->setUniform(_uniformCache2.drawCircles, _pDrawingCircles); @@ -1182,7 +908,6 @@ void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) { _pRadiusPerspectiveEnabled); _shaderProgram->setUniform(_uniformCache2.perspectiveDistanceFactor, _pPerspectiveDistanceFactor); - //_shaderProgram->setUnifor("testChange", _pTestChange); _shaderProgram->setUniform(_uniformCache2.maxNodeSize, _pMaxNodeSize); _shaderProgram->setUniform(_uniformCache2.minNodeSize, _pMinNodeSize); _shaderProgram->setUniform(_uniformCache2.usingPulse, _pPulseEnabled); @@ -1256,6 +981,7 @@ void RenderableFluxNodes::update(const UpdateData& data) { if (_shaderProgram->isDirty()) { _shaderProgram->rebuildFromFile(); } + bool needsUpdate = true; //Everything below is for updating depending on time const double currentTime = data.time.j2000Seconds(); const bool isInInterval = (currentTime >= _startTimes[0]) && @@ -1273,60 +999,28 @@ void RenderableFluxNodes::update(const UpdateData& data) { { updateActiveTriggerTimeIndex(currentTime); - // _mustLoadNewStateFromDisk = true; - - _needsUpdate = true; - _activeStateIndex = _activeTriggerTimeIndex; + needsUpdate = true; } // else {we're still in same state as previous frame (no changes needed)} } else { - //not in interval => set everything to false - //LDEBUG("not in interval"); _activeTriggerTimeIndex = -1; - _needsUpdate = false; + needsUpdate = false; } - if (_needsUpdate) { - if(_loadingStatesDynamically){ - if (!_isLoadingStateFromDisk) { - _isLoadingStateFromDisk = true; - if (_activeTriggerTimeIndex > _pMisalignedIndex) { - _activeTriggerTimeIndex += -_pMisalignedIndex; - } - LDEBUG("triggertime: " + std::to_string(_activeTriggerTimeIndex)); + if (needsUpdate) { - std::string filePath = _binarySourceFiles[_activeTriggerTimeIndex]; - //std::thread readBinaryThread([this, f = std::move(filePath)]{ - // //auto vec = LoadJsonfile(f); - //}); - //readBinaryThread.detach(); - } - - _needsUpdate = false; - - if(_vertexPositions.size() > 5800){ //TODO urgent. - updatePositionBuffer(); - updateVertexColorBuffer(); - updateVertexFilteringBuffer(); - //updateVertexStreamNumberBuffer(); - //updateArrow(); - } - } - // Needs fix, right now it stops cuz it cant find the states - else if(!_statesPos[_activeTriggerTimeIndex].empty()) { - //&& !_isLoadingNewEnergyBin){ - if (_activeTriggerTimeIndex > _pMisalignedIndex) { - _activeTriggerTimeIndex += -_pMisalignedIndex; - } + if(!_statesPos[_activeTriggerTimeIndex].empty()) { + //if (_activeTriggerTimeIndex > _pMisalignedIndex) { + // _activeTriggerTimeIndex += -_pMisalignedIndex; + //} _vertexPositions = _statesPos[_activeTriggerTimeIndex];//TODO urgent. _vertexColor = _statesColor[_activeTriggerTimeIndex]; //access violation _vertexRadius = _statesRadius[_activeTriggerTimeIndex]; - _needsUpdate = false; + needsUpdate = false; updatePositionBuffer(); updateVertexColorBuffer(); updateVertexFilteringBuffer(); - //updateVertexStreamNumberBuffer(); } } @@ -1339,69 +1033,6 @@ void RenderableFluxNodes::update(const UpdateData& data) { } } -//std::vector RenderableFluxNodes::LoadJsonfile(std::string filepath) { -// -// std::ifstream streamdata(filepath); -// if (!streamdata.is_open()) -// { -// LDEBUG("did not read the data.json file"); -// } -// json jsonobj = json::parse(streamdata); -// -// -// size_t lineStartIdx = 0; -// -// //Loop through all the nodes -// constexpr const float AuToMeter = 149597870700.f; -// _vertexPositions.clear(); -// _lineCount.clear(); -// _lineStart.clear(); -// _vertexRadius.clear(); -// _vertexColor.clear(); -// int counter = 0; -// -// const size_t nPoints = 1; -// for (int i = 0; i < _numberofStreams; ++i) { -// -// for (json::iterator lineIter = jsonobj["stream" + std::to_string(i)].begin(); -// lineIter != jsonobj["stream" + std::to_string(i)].end(); ++lineIter) { -// std::string r = (*lineIter)["R"].get(); -// std::string phi = (*lineIter)["Phi"].get(); -// std::string theta = (*lineIter)["Theta"].get(); -// std::string flux = (*lineIter)["Flux"].get(); -// -// float rValue = stringToFloat(r); -// float phiValue = stringToFloat(phi); -// float thetaValue = stringToFloat(theta); -// float fluxValue = stringToFloat(flux); -// const float pi = 3.14159265359f; -// float rTimesFluxValue = fluxValue; -// _vertexColor.push_back(rTimesFluxValue); -// _vertexRadius.push_back(rValue); -// rValue = rValue * AuToMeter; -// -// glm::vec3 sphericalcoordinates = -// glm::vec3(rValue, phiValue, thetaValue); -// -// glm::vec3 position = sphericalToCartesianCoord(sphericalcoordinates); -// -// _vertexPositions.push_back(position); -// ++counter; -// -// -// _lineCount.push_back(static_cast(nPoints)); -// _lineStart.push_back(static_cast(lineStartIdx)); -// lineStartIdx += nPoints; -// -// } -// } -// LDEBUG("vertPos size:" + std::to_string(_vertexPositions.size())); -// LDEBUG("counter for how many times we push back" + std::to_string(counter)); -// -// _isLoadingStateFromDisk = false; -// -// return std::vector(); -//} void RenderableFluxNodes::updatePositionBuffer() { glBindVertexArray(_vertexArrayObject); glBindBuffer(GL_ARRAY_BUFFER, _vertexPositionBuffer); @@ -1457,22 +1088,4 @@ void RenderableFluxNodes::updateVertexFilteringBuffer() { unbindGL(); } -//void RenderableFluxNodes::updateVertexStreamNumberBuffer() { -// glBindVertexArray(_vertexArrayObject); -// glBindBuffer(GL_ARRAY_BUFFER, _vertexStreamNumberBuffer); -// -// const std::vector& vertexStreamnumber = _vertexStreamnumber; -// -// glBufferData( -// GL_ARRAY_BUFFER, -// vertexStreamnumber.size() * sizeof(float), -// vertexStreamnumber.data(), -// GL_STATIC_DRAW -// ); -// -// glEnableVertexAttribArray(VaStreamnumber); -// glVertexAttribPointer(VaStreamnumber, 1, GL_FLOAT, GL_FALSE, 0, 0); -// -// unbindGL(); -//} } // namespace openspace diff --git a/modules/space/rendering/renderablefluxnodes.h b/modules/space/rendering/renderablefluxnodes.h index ad87568c1d..5b264bfc2e 100644 --- a/modules/space/rendering/renderablefluxnodes.h +++ b/modules/space/rendering/renderablefluxnodes.h @@ -91,7 +91,7 @@ private: filterLower, filterUpper, scalingMode, colorTableRange, domainLimZ, nodeSkip, nodeSkipDefault, nodeSkipEarth, nodeSkipMethod, nodeSkipFluxThreshold, nodeSkipRadiusThreshold, fluxColorAlpha, fluxColorAlphaIlluminance, earthPos, - distanceThreshold, enhanceMethod, flowColor, usingParticles, //activeStreamNumber + distanceThreshold, enhanceMethod, flowColor, usingParticles, usingInterestingStreams, particleSize, particleSpacing, particleSpeed) _uniformCache; UniformCache(time, flowColoring, maxNodeDistanceSize, usingCameraPerspective, @@ -102,48 +102,14 @@ private: // ------------------------------------ STRINGS ------------------------------------// std::string _binarySourceFolderPath; - // ------------------------------------- FLAGS -------------------------------------// - // Used for 'runtime-states'. True when loading a new state from disk on another - // thread. - bool _isLoadingStateFromDisk = false; - // False => states are stored in RAM (using 'in-RAM-states'), True => states are - // loaded from disk during runtime (using 'runtime-states') - bool _loadingStatesDynamically = false; - // Used for 'runtime-states': True if new 'runtime-state' must be loaded from disk. - // False => the previous frame's state should still be shown - bool _mustLoadNewStateFromDisk = true; - // Used for 'in-RAM-states' : True if new 'in-RAM-state' must be loaded. - // False => the previous frame's state should still be shown - bool _needsUpdate = false; - - // Used for changing energybins during runtime, as to prevent loading and update issue - // in render. - bool _isLoadingNewEnergyBin = false; - - //can be used when loading in emin03 files for the first time. - bool _shouldwritecacheforemin03 = false; - //Used for reading directly from sync-folder - bool _shouldreadBinariesDirectly = true; - bool _shouldloademin03directly = true; // --------------------------------- NUMERICALS ----------------------------------- // - // Active index of _states. If(==-1)=>no state available for current time. Always the - // same as _activeTriggerTimeIndex if(_loadingStatesDynamically==true), else - // always = 0 - int _activeStateIndex = -1; + // Active index of _startTimes int _activeTriggerTimeIndex = -1; // Number of states in the sequence uint32_t _nStates = 0; - // 383 for lower resolution, 863 for higher resolution. - //const int _numberofStreams = 383; - //const int _numberofStreams = 863; - const int _numberofStreams = 3; - - // In setup it is used to scale JSON coordinates. During runtime it is used to scale - // domain limits. - float _scalingFactor = 1.f; // Estimated end of sequence. double _sequenceEndTime; // OpenGL Vertex Array Object @@ -157,8 +123,6 @@ private: GLuint _vertexFilteringBuffer = 0; // OpenGL Vertex Buffer Object containing the index of nodes GLuint _vertexindexBuffer = 0; - // OpenGL Vertex Buffer Object containing the stream number for every node. - GLuint _vertexStreamNumberBuffer = 0; // ----------------------------------- POINTERS ------------------------------------// // The Lua-Modfile-Dictionary used during initialization @@ -172,16 +136,10 @@ private: std::unique_ptr _transferFunctionEarth; // Transfer function used to color line flow std::unique_ptr _transferFunctionFlow; - // Transfer function used to color illuminance for nodes close to the Earth - //std::unique_ptr _transferFunctionIlluminance; - // Transfer function used to color illuminance for nodes close to the Earth2 - //std::unique_ptr _transferFunctionIlluminance2; // ------------------------------------ VECTORS ----------------------------------- // // Paths to color tables. One for each 'ColorFlux' std::vector _colorTablePaths; - // Values represents min & max values represented in the color table - std::vector _colorTableRanges; // Contains the _triggerTimes for all streams in the sequence std::vector _startTimes; // Contains vertexPositions @@ -196,10 +154,6 @@ private: std::vector> _statesColor; // Stores the states radius std::vector> _statesRadius; - //used to show vertexes dependent on specific streams - std::vector _vertexStreamnumber; - // vector storing "interesting streams", read in by a json file. - std::vector _interestingStreams; // ---------------------------------- Properties ---------------------------------- // // Group to hold properties regarding distance to earth @@ -311,25 +265,17 @@ private: // --------------------- FUNCTIONS USED DURING INITIALIZATION --------------------- // void definePropertyCallbackFunctions(); - //std::vector LoadJsonfile(std::string filepath); void populateStartTimes(); void computeSequenceEndTime(); void setModelDependentConstants(); void setupProperties(); void updateActiveTriggerTimeIndex(double currentTime); - //void writeCachedFile() const; - //bool readCachedFile(const std::string& file, const std::string& energybin); - //bool loadFilesIntoRam(); - void loadNodeData(); - //void createStreamnumberVector(); - bool loadBinaryfilesDirectly(const std::string& energybin); + void loadNodeData(const int& energybinOption); // ------------------------- FUNCTIONS USED DURING RUNTIME ------------------------ // void updatePositionBuffer(); void updateVertexColorBuffer(); void updateVertexFilteringBuffer(); - //void updateVertexStreamNumberBuffer(); - //void updateArrow(); // ----------------------TEMPORARY VARIABLES ------------------ //properties::StringProperty _spriteTexturePath; diff --git a/modules/space/shaders/fluxnodes_vs.glsl b/modules/space/shaders/fluxnodes_vs.glsl index 226bee6428..b917087b0a 100644 --- a/modules/space/shaders/fluxnodes_vs.glsl +++ b/modules/space/shaders/fluxnodes_vs.glsl @@ -25,8 +25,6 @@ #version __CONTEXT__ #include "PowerScaling/powerScalingMath.hglsl" // General Uniforms that's always needed -uniform vec4 lineColor; -//old not in use atm uniform mat4 modelViewProjection; // Uniforms needed to color by quantity @@ -35,8 +33,6 @@ uniform sampler1D colorTable; uniform sampler1D colorTableCMR; uniform sampler1D colorTableEarth; uniform sampler1D colorTableFlow; -//uniform sampler1D colorTableIlluminance; -//uniform sampler1D colorTableIlluminance2; uniform vec2 colorTableRange; // Uniforms needed for Particle Flow @@ -76,11 +72,8 @@ uniform float fluxColorAlpha; uniform float fluxColorAlphaIlluminance; uniform vec3 earthPos; uniform float distanceThreshold; -// uniform int activeStreamNumber; -uniform bool firstRender; uniform int enhanceMethod; uniform double time; -uniform bool usingInterestingStreams; //uniform float interestingStreams[4]; @@ -93,11 +86,6 @@ uniform float nodeDistanceThreshold; //uniform mat4 cameraViewProjectionMatrix; //uniform dmat4 modelMatrix; -uniform float correctionSizeFactor; -//uniform float correctionSizeEndDistance; -//uniform vec3 up; -//uniform vec3 right; -uniform vec3 cameraLookUp; // in world space (no SGCT View was considered) uniform vec3 cameraPos; //uniform vec2 screenSize; uniform bool usingCameraPerspective; @@ -120,18 +108,6 @@ layout(location = 1) in float fluxValue; layout(location = 2) in float rValue; -// The vertex index of every node. Location must correspond to -// _VA_INDEX in renderableFluxNodes.h -//Using built in gl_vertexID in stead. -//layout(location = 3) -//in int nodeIndex; -// The vertex streamnumber of every node. Location must correspond to -// VaStreamnumber in renderableFluxNodes.h -// layout(location = 3) -// in int Streamnumber; -layout(location = 4) -in vec2 in_st; - //layout(location = 5) //in vec2 arrow; @@ -142,7 +118,6 @@ const int uniformColor = 1; const int uniformskip = 0; const int fluxSkip = 1; const int radiusSkip = 2; -// const int streamNumberSkip = 3; const int fluxMode = 0; const int RFlux = 1; @@ -193,8 +168,6 @@ vec4 getTransferFunctionColor(sampler1D InColorTable) { bool CheckvertexIndex(){ int nodeIndex = gl_VertexID; - // nodeIndex = gl_VertexIndex; - //if(enhanceMethod == 3) return false; if(nodeSkipMethod == uniformskip){ if(mod(nodeIndex, nodeSkip) == 0){ @@ -217,12 +190,6 @@ bool CheckvertexIndex(){ return true; } } - // else if(nodeSkipMethod == streamNumberSkip){ - // if(Streamnumber == activeStreamNumber){ - // //vs_color = vec4(0); - // return true; - // } - // } return false; } //todo fix gl_VertexID @@ -240,12 +207,6 @@ void DecidehowtoshowClosetoEarth(){ // vec4 fluxColor = getTransferFunctionColor(colorTable); vec4 fluxColor = getTransferFunctionColor(colorTableCMR); vs_color = vec4(fluxColor.xyz, fluxColor.a); - /* float tempR = rValue + 0.4; - if(tempR > 1.5){ - tempR = 1.5; - } - gl_PointSize = tempR * tempR * tempR * gl_PointSize * 5; - return;*/ } // ColorTables if(enhanceMethod == colorTables){ @@ -265,7 +226,6 @@ void DecidehowtoshowClosetoEarth(){ } // Illuminance if(enhanceMethod == illuminance){ - //vec4 fluxColor1 = getTransferFunctionColor(colorTableIlluminance); vec4 fluxColor1 = getTransferFunctionColor(colorTableCMR); vs_color = vec4(fluxColor1.xyz, fluxColor1.a); } @@ -317,7 +277,6 @@ void CheckdistanceMethod() { } void main() { - //vs_color = streamColor; // Default gl_PointSize if it is not set anywhere else. gl_PointSize = 2; // Checking if we should render the vertex dependent on the vertexindex, @@ -353,31 +312,6 @@ void main() { vs_color = vec4(0); } - if(usingInterestingStreams){ - // Draw every other line grey - //vs_color = vec4(0.18, 0.18, 0.18, 1*fluxColorAlpha); - - vs_color = vec4(0); - - // Close to Earth (384 nodes) - //float interestingStreams[8] = float[](339, 340, 351, 352, 353, 354, 366, 367); - //float interestingStreams[6] = float[](154, 156, 153, 157, 158, 163); - //float interestingStreams[26] = float[](135, 138, 145, 146, 147, 149, 153, 154, 155, 156, 157, 158, 159, 160, 167, 163, 168, 169, 170, 172, 174, 180, 181, 183, 356, 364); - //float interestingStreams[3] = float[](37, 154, 210); - - // Close to Earth (863 nodes) - float interestingStreams[7] = float[](340, 350, 351, 352, 353, 363, 364); - //float interestingStreams[10] = float[](339, 340, 350, 351, 352, 353, 362, 363, 364, 365); - //float interestingStreams[20] = float[](326, 327, 328, 329, 338, 339, 340, 341, 350, 351, 352, 353, 362, 363, 364, 365, 374, 375, 376, 377); - - // for(int i = 0; i < interestingStreams.length(); i++){ - // if(Streamnumber == interestingStreams[i] && CheckvertexIndex()){ - // vec4 fluxColor3 = getTransferFunctionColor(colorTable); - // vs_color = vec4(fluxColor3.xyz, 1*fluxColorAlpha); - // } - // } - } - if(usingParticles && isParticle() && rValue > 0.f){ int modulusResult = int(double(particleSpeed) * time + gl_VertexID) % particleSpacing; @@ -386,11 +320,9 @@ void main() { if(flowColoring){ vec4 fluxColor3 = getTransferFunctionColor(colorTable); vs_color = vec4(fluxColor3.xyz, flowColor.a * 0.8); - //vs_color = vec4(1,1,1,1); } else{ vs_color = vec4(0.9,0.9,0.9,0.5); - //vs_color = flowColor; } } else{ @@ -419,9 +351,7 @@ void main() { } if(distanceVec < maxDistance){ - //vs_closeToEarth = 0; float distScale = 1 - smoothstep(0, maxDistance, distanceVec); - //float distMinScale = 1 - smoothstep(0, nodeDistanceThreshold, distanceVec); float factorS = 1.0; if(usingRadiusPerspective){ factorS = pow(distScale, 9) * 500.0 * pow(rtemp, 2); @@ -431,89 +361,25 @@ void main() { } gl_PointSize = factorS * maxNodeDistanceSize * 0.8; } - // else{ - // gl_PointSize = nodeSize; - // } + // else{ + // gl_PointSize = nodeSize; + // } - if(gl_PointSize > maxNodeSize){ - gl_PointSize = maxNodeSize; - } - - if(gl_PointSize < minNodeSize){ - gl_PointSize = minNodeSize; - } + if(gl_PointSize > maxNodeSize){ + gl_PointSize = maxNodeSize; } - - - - vs_time = time; - vec4 position_in_meters = vec4(in_position, 1); - vec4 positionClipSpace = modelViewProjection * position_in_meters; - //vs_gPosition = vec4(modelViewTransform * dvec4(in_point_position, 1)); - - gl_Position = vec4(positionClipSpace.xy, 0, positionClipSpace.w); - vs_depth = gl_Position.w; - -} - -//------------ OLD CODE, MAYBE USEFUL FOR CAMERAPERSPECTIVE - /* - if(distance(in_position, cameraPos) < 100000000000.f){ - gl_PointSize = nodeSize * 5; - } - else{ - gl_PointSize = nodeSize; + if(gl_PointSize < minNodeSize){ + gl_PointSize = minNodeSize; + } } - */ - //test for camera perspective:: - /* - dvec4 dpos = dvec4(in_position, 1.0); - dpos = modelMatrix * dpos; - float scaleMultiply = exp(scaleFactor * 0.10f); - - //vec3 scaledRight = vec3(0.f); - //vec3 scaledUp = vec3(0.f); - - /////vec3 normal = vec3(normalize(cameraPos - dpos.xyz)); - /////vec3 newRight = normalize(cross(cameraLookUp, normal)); - /////vec3 newUp = cross(normal, newRight); - - double distCamera = length(cameraPos - dpos.xyz); - float expVar = float(-distCamera) / pow(10.f, correctionSizeEndDistance); - float factorVar = pow(10.f, correctionSizeFactor); - scaleMultiply *= 1.f / (1.f + factorVar * exp(expVar)); - */ - //vec2 halfViewSize = vec2(screenSize.x, screenSize.y) * 0.5f; - // vec2 topRight = crossCorner.xy/crossCorner.w; - // vec2 bottomLeft = initialPosition.xy/initialPosition.w; - - // width and height - //vec2 sizes = abs(halfViewSize * (topRight - bottomLeft)); - //float ta = 1.0f; - /* - if (sizes.x < 2.0f * minNodeDistanceSize) { - float maxVar = 2.0f * minNodeDistanceSize; - float minVar = minNodeDistanceSize; - float var = (sizes.y + sizes.x); - ta = ( (var - minVar)/(maxVar - minVar) ); - - if (ta == 0.0f) - return; - } - gl_PointSize = ta; - } - */ - /* - vec3 scaledRight = scaleMultiply * right * 0.5f; - vec3 scaledUp = scaleMultiply * up * 0.5f; - - vec4 dposClip = cameraViewProjectionMatrix * vec4(dpos); - vec4 scaledRightClip = cameraViewProjectionMatrix * vec4(scaledRight, 0.0); - vec4 scaledUpClip = cameraViewProjectionMatrix * vec4(scaledUp, 0.0); - - vec4 initialPosition = z_normalization(dposClip - scaledRightClip - scaledUpClip); - gl_Position = initialPosition; - vs_depth = initialPosition.w; - */ + vs_time = time; + vec4 position_in_meters = vec4(in_position, 1); + vec4 positionClipSpace = modelViewProjection * position_in_meters; + //vs_gPosition = vec4(modelViewTransform * dvec4(in_point_position, 1)); + + gl_Position = vec4(positionClipSpace.xy, 0, positionClipSpace.w); + vs_depth = gl_Position.w; + +}