diff --git a/modules/softwareintegration/rendering/renderablepointscloud.cpp b/modules/softwareintegration/rendering/renderablepointscloud.cpp index 8a894cb391..ad4503c094 100644 --- a/modules/softwareintegration/rendering/renderablepointscloud.cpp +++ b/modules/softwareintegration/rendering/renderablepointscloud.cpp @@ -49,8 +49,8 @@ const std::string STRING_NOT_SET = ""; namespace { constexpr const char* _loggerCat = "PointsCloud"; - constexpr const std::array UniformNames = { - "color", "size", "modelMatrix", "cameraUp", "screenSize", + constexpr const std::array UniformNames = { + "color", "fade", "size", "modelMatrix", "cameraUp", "screenSize", "cameraViewProjectionMatrix", "eyePosition", "sizeOption", "colormapTexture", "colormapMin", "colormapMax", "colormapNanMode", "colormapNanColor", "colormapEnabled", "linearSizeMin", "linearSizeMax", @@ -74,7 +74,7 @@ namespace { "Identifier", "Identifier used as part of key to access data in centralized central storage." }; - + constexpr openspace::properties::Property::PropertyInfo PointUnitInfo = { "PointUnit", "Point Unit", @@ -146,13 +146,13 @@ namespace { "Velocity Time Unit", "The time unit of the velocity data." }; - + constexpr openspace::properties::Property::PropertyInfo VelocityDateRecordedInfo = { "VelocityDateRecorded", "Velocity Date Recorded", "The date the velocity data was recorded." }; - + constexpr openspace::properties::Property::PropertyInfo VelocityNanModeInfo = { "VelocityNanMode", "Velocity NaN Mode", @@ -222,7 +222,7 @@ namespace { // [[codegen::verbatim(MotionEnabledInfo.description)]] std::optional motionEnabled; - + // [[codegen::verbatim(NameInfo.description)]] std::optional name; @@ -269,7 +269,7 @@ RenderablePointsCloud::RenderablePointsCloud(const ghoul::Dictionary& dictionary const Parameters p = codegen::bake(dictionary); _identifier = p.identifier.value(); - + _name = p.name.value_or(_name); _name.setVisibility(properties::Property::Visibility::Hidden); addProperty(_name); @@ -278,6 +278,8 @@ RenderablePointsCloud::RenderablePointsCloud(const ghoul::Dictionary& dictionary _color.setViewOption(properties::Property::ViewOptions::Color); addProperty(_color); + addProperty(_fade); + _size = p.size.value_or(_size); addProperty(_size); @@ -465,6 +467,7 @@ void RenderablePointsCloud::render(const RenderData& data, RendererTasks&) { ); _shaderProgram->setUniform(_uniformCache.color, _color); + _shaderProgram->setUniform(_uniformCache.fade, _fade); _shaderProgram->setUniform(_uniformCache.size, _size); _shaderProgram->setUniform(_uniformCache.sizeOption, _sizeOption); @@ -571,7 +574,7 @@ void RenderablePointsCloud::update(const UpdateData&) { nullptr ); - if (_hasLoadedColormapAttributeData) { + if (_hasLoadedColormapAttributeData) { GLint colormapScalarsAttribute = _shaderProgram->attributeLocation("in_colormapAttributeScalar"); glEnableVertexAttribArray(colormapScalarsAttribute); glVertexAttribPointer( @@ -584,7 +587,7 @@ void RenderablePointsCloud::update(const UpdateData&) { ); } - if (_hasLoadedLinearSizeAttributeData) { + if (_hasLoadedLinearSizeAttributeData) { GLint linearSizeAttributeScalar = _shaderProgram->attributeLocation("in_linearSizeAttributeScalar"); glEnableVertexAttribArray(linearSizeAttributeScalar); glVertexAttribPointer( @@ -597,7 +600,7 @@ void RenderablePointsCloud::update(const UpdateData&) { ); } - if (_hasLoadedVelocityData) { + if (_hasLoadedVelocityData) { GLint velocityAttribute = _shaderProgram->attributeLocation("in_velocity"); glEnableVertexAttribArray(velocityAttribute); glVertexAttribPointer( @@ -656,7 +659,7 @@ bool RenderablePointsCloud::checkDataStorage() { void RenderablePointsCloud::loadPointData(SoftwareIntegrationModule* softwareIntegrationModule) { // Fetch point data from module's centralized storage - std::vector pointData; + std::vector pointData; if (!softwareIntegrationModule->fetchData(_identifier.value(), storage::Key::DataPoints, pointData)) { LERROR("There was an issue trying to fetch the point data from the centralized storage."); return; @@ -688,7 +691,7 @@ void RenderablePointsCloud::loadPointData(SoftwareIntegrationModule* softwareInt value *= toMeters; } } - + // Assign point data to point data slice auto pointDataSlice = getDataSlice(DataSliceKey::Points); pointDataSlice->clear(); @@ -697,7 +700,7 @@ void RenderablePointsCloud::loadPointData(SoftwareIntegrationModule* softwareInt softwareIntegrationModule->setDataLoaded(_identifier.value(), storage::Key::DataPoints); LINFO(fmt::format( "New point data ({} points) has loaded. {} values are NaN values. " - "Points with at least one NaN value are hidden.", + "Points with at least one NaN value are hidden.", (pointData.size() / 3), nNans )); } @@ -771,7 +774,7 @@ void RenderablePointsCloud::loadVelocityData(SoftwareIntegrationModule* software auto velocityDataSlice = getDataSlice(DataSliceKey::Velocity); velocityDataSlice->clear(); velocityDataSlice->assign(velocityData.begin(), velocityData.end()); - + LINFO( fmt::format( "Viewing {} points with velocity ({} points in total). " @@ -964,7 +967,7 @@ bool RenderablePointsCloud::shouldLoadVelocityData(SoftwareIntegrationModule* so ( _velocityUnitsAreDirty || softwareIntegrationModule->isDataDirty(_identifier.value(), storage::Key::VelocityData) - ) + ) && _velocityDistanceUnit.value() != STRING_NOT_SET && _velocityTimeUnit.value() != STRING_NOT_SET ); diff --git a/modules/softwareintegration/rendering/renderablepointscloud.h b/modules/softwareintegration/rendering/renderablepointscloud.h index cadf6de6d5..bb56563183 100644 --- a/modules/softwareintegration/rendering/renderablepointscloud.h +++ b/modules/softwareintegration/rendering/renderablepointscloud.h @@ -86,7 +86,7 @@ private: std::unique_ptr _shaderProgram = nullptr; UniformCache( - color, size, modelMatrix, cameraUp, screenSize, + color, fade, size, modelMatrix, cameraUp, screenSize, cameraViewProjectionMatrix, eyePosition, sizeOption, colormapTexture, colormapMin, colormapMax, colormapNanMode, colormapNanColor, colormapEnabled, linearSizeMin, linearSizeMax, @@ -115,8 +115,8 @@ private: properties::StringProperty _velocityTimeUnit; properties::IVec3Property _velocityDateRecorded; properties::IntProperty _velocityNanMode; - - + + std::optional _identifier = std::nullopt; bool _pointUnitIsDirty = false; @@ -125,7 +125,7 @@ private: bool _hasLoadedColormap = false; bool _hasLoadedLinearSizeAttributeData = false; - + double _t0 = 0.0; bool _velocityDateIsDirty = false; bool _velocityUnitsAreDirty = false; diff --git a/modules/softwareintegration/shaders/point_fs.glsl b/modules/softwareintegration/shaders/point_fs.glsl index 00cd8ae641..edb413cc80 100644 --- a/modules/softwareintegration/shaders/point_fs.glsl +++ b/modules/softwareintegration/shaders/point_fs.glsl @@ -40,6 +40,7 @@ in float ta; in vec3 ge_velocity; uniform vec4 color; +uniform float fade; uniform float colormapMin; uniform float colormapMax; @@ -67,25 +68,25 @@ Fragment getFragment() { discard; } - // Don't show points with no value for that + // Don't show points with no value for that // attribute, if ColormapNanRenderMode is Hidden if ( - colormapEnabled - && isnan(ge_colormapAttributeScalar) + colormapEnabled + && isnan(ge_colormapAttributeScalar) && colormapNanMode == COLORMAPNANMODE_HIDDEN ) { discard; } - + // ========== Velocity NaN mode ========== - // Don't show points with no value for + // Don't show points with no value for // velocity, if VelocityNanRenderMode is Hidden bool velocityIsNan = (isnan(ge_velocity[0]) || isnan(ge_velocity[1]) || isnan(ge_velocity[2])); - if (motionEnabled && - velocityIsNan && - velocityNanMode == VELOCITYNANMODE_HIDDEN) + if (motionEnabled && + velocityIsNan && + velocityNanMode == VELOCITYNANMODE_HIDDEN) { discard; } // else the point is left static @@ -99,7 +100,7 @@ Fragment getFragment() { vec4 outputColor = color; if (colormapEnabled) { - // Set colormapNanColor if point doesn't have a value for the attribute + // Set colormapNanColor if point doesn't have a value for the attribute if (isnan(ge_colormapAttributeScalar) && colormapNanMode == COLORMAPNANMODE_COLOR) { outputColor = vec4(colormapNanColor.rgb, colormapNanColor.a); } @@ -109,6 +110,8 @@ Fragment getFragment() { } } + outputColor.a *= fade; + Fragment frag; frag.color = outputColor * vec4(circle); frag.depth = ge_screenSpaceDepth;