@@ -8,6 +8,8 @@ template <typename QuantityT>
88ScalarQuantity<QuantityT>::ScalarQuantity(QuantityT& quantity_, const std::vector<float >& values_, DataType dataType_)
99 : quantity(quantity_), values(&quantity, quantity.uniquePrefix() + " values" , valuesData), valuesData(values_),
1010 dataType (dataType_), dataRange(robustMinMax(values.data, 1e-5 )),
11+ vizRangeMin(quantity.uniquePrefix() + "vizRangeMin", -777.), // set later,
12+ vizRangeMax(quantity.uniquePrefix() + "vizRangeMax", -777.), // including clearing cache
1113 cMap(quantity.uniquePrefix() + "cmap", defaultColorMap(dataType)),
1214 isolinesEnabled(quantity.uniquePrefix() + "isolinesEnabled", false),
1315 isolineWidth(quantity.uniquePrefix() + "isolineWidth",
@@ -17,7 +19,12 @@ ScalarQuantity<QuantityT>::ScalarQuantity(QuantityT& quantity_, const std::vecto
1719{
1820 hist.updateColormap (cMap.get ());
1921 hist.buildHistogram (values.data );
20- resetMapRange ();
22+
23+ if (vizRangeMin.holdsDefaultValue ()) { // min and max should always have same cache state
24+ // dynamically compute a viz range from the data min/max
25+ // note that this also clears the persistent value's cahce, so it's like it was never set
26+ resetMapRange ();
27+ }
2128}
2229
2330template <typename QuantityT>
@@ -62,7 +69,7 @@ void ScalarQuantity<QuantityT>::buildScalarUI() {
6269
6370
6471 // Draw the histogram of values
65- hist.colormapRange = vizRange ;
72+ hist.colormapRange = std::pair< float , float >(vizRangeMin. get (), vizRangeMax. get ()) ;
6673 float windowWidth = ImGui::GetWindowWidth ();
6774 float histWidth = 0.75 * windowWidth;
6875 hist.buildUI (histWidth);
@@ -77,36 +84,47 @@ void ScalarQuantity<QuantityT>::buildScalarUI() {
7784 float imPad = ImGui::GetStyle ().ItemSpacing .x ;
7885 ImGui::PushItemWidth ((histWidth - imPad) / 2 );
7986 float speed = (dataRange.second - dataRange.first ) / 100 .;
87+ bool changed = false ;
8088
8189 switch (dataType) {
8290 case DataType::STANDARD: {
8391
84- ImGui::DragFloat (" ##min" , &vizRange. first , speed, dataRange.first , vizRange. second , " %.5g " ,
85- ImGuiSliderFlags_NoRoundToFormat);
92+ changed = changed || ImGui::DragFloat (" ##min" , &vizRangeMin. get () , speed, dataRange.first , vizRangeMax. get () ,
93+ " %.5g " , ImGuiSliderFlags_NoRoundToFormat);
8694 ImGui::SameLine ();
87- ImGui::DragFloat (" ##max" , &vizRange. second , speed, vizRange. first , dataRange.second , " %.5g " ,
88- ImGuiSliderFlags_NoRoundToFormat);
95+ changed = changed || ImGui::DragFloat (" ##max" , &vizRangeMax. get () , speed, vizRangeMin. get () , dataRange.second ,
96+ " %.5g " , ImGuiSliderFlags_NoRoundToFormat);
8997
9098 } break ;
9199 case DataType::SYMMETRIC: {
92100 float absRange = std::max (std::abs (dataRange.first ), std::abs (dataRange.second ));
93101
94- if (ImGui::DragFloat (" ##min" , &vizRange.first , speed, -absRange, 0 .f , " %.5g" , ImGuiSliderFlags_NoRoundToFormat)) {
95- vizRange.second = -vizRange.first ;
102+ if (ImGui::DragFloat (" ##min" , &vizRangeMin.get (), speed, -absRange, 0 .f , " %.5g" ,
103+ ImGuiSliderFlags_NoRoundToFormat)) {
104+ vizRangeMax.get () = -vizRangeMin.get ();
105+ changed = true ;
96106 }
97107 ImGui::SameLine ();
98- if (ImGui::DragFloat (" ##max" , &vizRange.second , speed, 0 .f , absRange, " %.5g" , ImGuiSliderFlags_NoRoundToFormat)) {
99- vizRange.first = -vizRange.second ;
108+ if (ImGui::DragFloat (" ##max" , &vizRangeMax.get (), speed, 0 .f , absRange, " %.5g" ,
109+ ImGuiSliderFlags_NoRoundToFormat)) {
110+ vizRangeMin.get () = -vizRangeMax.get ();
111+ changed = true ;
100112 }
101113
102114 } break ;
103115 case DataType::MAGNITUDE: {
104- ImGui::DragFloat (" ##max" , &vizRange. second , speed, 0 .f , dataRange.second , " %.5g" ,
105- ImGuiSliderFlags_NoRoundToFormat);
116+ changed = changed || ImGui::DragFloat (" ##max" , &vizRangeMax. get () , speed, 0 .f , dataRange.second , " %.5g" ,
117+ ImGuiSliderFlags_NoRoundToFormat);
106118
107119 } break ;
108120 }
109121
122+ if (changed) {
123+ vizRangeMin.manuallyChanged ();
124+ vizRangeMax.manuallyChanged ();
125+ requestRedraw ();
126+ }
127+
110128 ImGui::PopItemWidth ();
111129 }
112130
@@ -162,8 +180,8 @@ std::vector<std::string> ScalarQuantity<QuantityT>::addScalarRules(std::vector<s
162180
163181template <typename QuantityT>
164182void ScalarQuantity<QuantityT>::setScalarUniforms(render::ShaderProgram& p) {
165- p.setUniform (" u_rangeLow" , vizRange. first );
166- p.setUniform (" u_rangeHigh" , vizRange. second );
183+ p.setUniform (" u_rangeLow" , vizRangeMin. get () );
184+ p.setUniform (" u_rangeHigh" , vizRangeMax. get () );
167185
168186 if (isolinesEnabled.get ()) {
169187 p.setUniform (" u_modLen" , getIsolineWidth ());
@@ -175,17 +193,23 @@ template <typename QuantityT>
175193QuantityT* ScalarQuantity<QuantityT>::resetMapRange() {
176194 switch (dataType) {
177195 case DataType::STANDARD:
178- vizRange = dataRange;
196+ vizRangeMin = dataRange.first ;
197+ vizRangeMax = dataRange.second ;
179198 break ;
180199 case DataType::SYMMETRIC: {
181200 double absRange = std::max (std::abs (dataRange.first ), std::abs (dataRange.second ));
182- vizRange = std::make_pair (-absRange, absRange);
201+ vizRangeMin = -absRange;
202+ vizRangeMax = absRange;
183203 } break ;
184204 case DataType::MAGNITUDE:
185- vizRange = std::make_pair (0 ., dataRange.second );
205+ vizRangeMin = 0 .;
206+ vizRangeMax = dataRange.second ;
186207 break ;
187208 }
188209
210+ vizRangeMin.clearCache ();
211+ vizRangeMax.clearCache ();
212+
189213 requestRedraw ();
190214 return &quantity;
191215}
@@ -214,13 +238,14 @@ std::string ScalarQuantity<QuantityT>::getColorMap() {
214238
215239template <typename QuantityT>
216240QuantityT* ScalarQuantity<QuantityT>::setMapRange(std::pair<double , double > val) {
217- vizRange = val;
241+ vizRangeMin = val.first ;
242+ vizRangeMax = val.second ;
218243 requestRedraw ();
219244 return &quantity;
220245}
221246template <typename QuantityT>
222247std::pair<double , double > ScalarQuantity<QuantityT>::getMapRange() {
223- return vizRange ;
248+ return std::pair< float , float >(vizRangeMin. get (), vizRangeMax. get ()) ;
224249}
225250template <typename QuantityT>
226251std::pair<double , double > ScalarQuantity<QuantityT>::getDataRange() {
0 commit comments