ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvGuiParameters.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "ecvGuiParameters.h"
9 
10 // LOCAL
11 #include "ecvBasicTypes.h"
12 #include "ecvDisplayTools.h"
13 #include "ecvSingleton.h"
14 
15 // Qt
16 #include <QSettings>
17 
18 // System
19 #include <string.h>
20 
23 
25  if (!s_gui.instance) {
26  s_gui.instance = new ecvGui();
27  s_gui.instance->params.fromPersistentSettings();
28  }
29 
30  return s_gui.instance->params;
31 }
32 
34  if (s_gui.instance) {
35  s_gui.instance->params.initFontSizesIfNeeded();
36  }
37 }
38 
39 void ecvGui::ReleaseInstance() { s_gui.release(); }
40 
41 void ecvGui::Set(const ParamStruct& params) {
42  if (!s_gui.instance) {
43  s_gui.instance = new ecvGui();
44  s_gui.instance->params.fromPersistentSettings();
45  }
46 
47  s_gui.instance->params = params;
48 }
49 
51 
53  lightAmbientColor = ecvColor::night;
54  lightSpecularColor = ecvColor::darker;
55  lightDiffuseColor = ecvColor::bright;
56  meshFrontDiff = ecvColor::defaultMeshFrontDiff;
57  meshBackDiff = ecvColor::defaultMeshBackDiff;
58  meshSpecular = ecvColor::middle;
59  pointsDefaultCol = ecvColor::defaultColor;
60  textDefaultCol = ecvColor::defaultColor;
61  backgroundCol = ecvColor::defaultBkgColor;
62  labelBackgroundCol = ecvColor::defaultLabelBkgColor;
63  labelMarkerCol = ecvColor::defaultLabelMarkerColor;
64  bbDefaultCol = ecvColor::yellow;
65  showBBOnSelected = true;
66  bbOpacity = 0.5;
67  bbLineWidth = 1;
68 
69  lightDoubleSided = true;
70  drawBackgroundGradient = true;
71  drawRoundedPoints = false;
72  decimateMeshOnMove = true;
73  minLoDMeshSize = 2500000;
74  decimateCloudOnMove = true;
75  minLoDCloudSize = 10000000;
76  useVBOs = true;
77  displayCross = true;
78 
79  labelMarkerSize = 5;
80 
81  colorScaleShowHistogram = true;
82  colorScaleUseShader = false;
83  colorScaleShaderSupported = false;
84  colorScaleRampWidth = 50;
85 
86 #ifdef Q_OS_MAC
87  defaultFontSize = 12;
88  labelFontSize = 24; // Increased to 1.5x (16 * 1.5) for better visibility
89  // on macOS, especially Retina displays
90 #else
91  defaultFontSize = 10;
92  labelFontSize = 8;
93 #endif
94 
95  displayedNumPrecision = 6;
96  labelOpacity = 75;
97 
98  zoomSpeed = 1.0;
99 
100  autoComputeOctree = ASK_USER;
101 }
102 
104  // 只有在QApplication已初始化后才调用
105  defaultFontSize = ecvDisplayTools::GetOptimizedFontSize(12);
106 #ifdef Q_OS_MAC
108  24); // Increased to 1.5x (16 * 1.5) for better visibility on
109  // macOS, especially Retina displays
110 #else
111  labelFontSize = ecvDisplayTools::GetOptimizedFontSize(10);
112 #endif
113 }
114 
115 static int c_fColorArraySize = sizeof(float) * 4;
116 static int c_ubColorArraySize = sizeof(unsigned char) * 3;
117 
119  QSettings settings;
120  settings.beginGroup("OpenGL");
121  lightAmbientColor = ecvColor::Rgbaf(reinterpret_cast<float*>(
122  settings.value("lightAmbientColor",
123  QByteArray::fromRawData(
124  (const char*)ecvColor::darkest.rgba,
126  .toByteArray()
127  .data()));
128  lightSpecularColor = ecvColor::Rgbaf(reinterpret_cast<float*>(
129  settings.value("lightSpecularColor",
130  QByteArray::fromRawData(
131  (const char*)ecvColor::darker.rgba,
133  .toByteArray()
134  .data()));
135  lightDiffuseColor = ecvColor::Rgbaf(reinterpret_cast<float*>(
136  settings.value("lightDiffuseColor",
137  QByteArray::fromRawData(
138  (const char*)ecvColor::bright.rgba,
140  .toByteArray()
141  .data()));
142  meshFrontDiff = ecvColor::Rgbaf(reinterpret_cast<float*>(
143  settings.value("meshFrontDiff",
144  QByteArray::fromRawData(
145  (const char*)
148  .toByteArray()
149  .data()));
150  meshBackDiff = ecvColor::Rgbaf(reinterpret_cast<float*>(
151  settings.value("meshBackDiff",
152  QByteArray::fromRawData(
153  (const char*)
156  .toByteArray()
157  .data()));
158  meshSpecular = ecvColor::Rgbaf(reinterpret_cast<float*>(
159  settings.value("meshSpecular",
160  QByteArray::fromRawData(
161  (const char*)ecvColor::middle.rgba,
163  .toByteArray()
164  .data()));
165  pointsDefaultCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
166  settings.value("pointsDefaultColor",
167  QByteArray::fromRawData(
168  (const char*)ecvColor::defaultColor.rgb,
170  .toByteArray()
171  .data()));
172  textDefaultCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
173  settings.value("textDefaultColor",
174  QByteArray::fromRawData(
175  (const char*)ecvColor::defaultColor.rgb,
177  .toByteArray()
178  .data()));
179  backgroundCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
180  settings.value("backgroundColor",
181  QByteArray::fromRawData(
182  (const char*)ecvColor::defaultBkgColor.rgb,
184  .toByteArray()
185  .data()));
186  labelBackgroundCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
187  settings.value("labelBackgroundColor",
188  QByteArray::fromRawData(
189  (const char*)
192  .toByteArray()
193  .data()));
194  labelMarkerCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
195  settings.value("labelMarkerColor",
196  QByteArray::fromRawData(
197  (const char*)
199  .rgb,
201  .toByteArray()
202  .data()));
203  bbDefaultCol = ecvColor::Rgbaub(reinterpret_cast<unsigned char*>(
204  settings.value("bbDefaultColor",
205  QByteArray::fromRawData(
206  (const char*)ecvColor::yellow.rgb,
208  .toByteArray()
209  .data()));
210  showBBOnSelected = settings.value("showBBOnSelected", true).toBool();
211  bbOpacity = settings.value("bbOpacity", 0.5).toDouble();
212  bbLineWidth = static_cast<unsigned>(
213  std::max(1u, settings.value("bbLineWidth", 1).toUInt()));
214 
215  lightDoubleSided = settings.value("lightDoubleSided", true).toBool();
216  drawBackgroundGradient =
217  settings.value("backgroundGradient", true).toBool();
218  drawRoundedPoints = settings.value("drawRoundedPoints", false).toBool();
219  decimateMeshOnMove = settings.value("meshDecimation", true).toBool();
220  minLoDMeshSize = settings.value("minLoDMeshSize", 2500000).toUInt();
221  decimateCloudOnMove = settings.value("cloudDecimation", true).toBool();
222  minLoDCloudSize = settings.value("minLoDCloudSize", 10000000).toUInt();
223  useVBOs = settings.value("useVBOs", true).toBool();
224  displayCross = settings.value("crossDisplayed", true).toBool();
225  labelMarkerSize = static_cast<unsigned>(
226  std::max(0, settings.value("labelMarkerSize", 5).toInt()));
227  colorScaleShowHistogram =
228  settings.value("colorScaleShowHistogram", true).toBool();
229  colorScaleUseShader = settings.value("colorScaleUseShader", false).toBool();
230  // colorScaleShaderSupported = not saved
231  colorScaleRampWidth = static_cast<unsigned>(
232  std::max(0, settings.value("colorScaleRampWidth", 50).toInt()));
233  defaultFontSize = static_cast<unsigned>(
234  std::max(0, settings.value("defaultFontSize", 10).toInt()));
235  labelFontSize = static_cast<unsigned>(
236  std::max(0, settings.value("labelFontSize", 8).toInt()));
237  displayedNumPrecision = static_cast<unsigned>(
238  std::max(0, settings.value("displayedNumPrecision", 6).toInt()));
239  labelOpacity = static_cast<unsigned>(
240  std::max(0, settings.value("labelOpacity", 75).toInt()));
241  zoomSpeed = settings.value("zoomSpeed", 1.0).toDouble();
242  autoComputeOctree = static_cast<ComputeOctreeForPicking>(
243  settings.value("autoComputeOctree", ASK_USER).toInt());
244 
245  settings.endGroup();
246 }
247 
249  QSettings settings;
250  settings.beginGroup("OpenGL");
251 
252  settings.setValue(
253  "lightDiffuseColor",
254  QByteArray((const char*)lightDiffuseColor.rgba, c_fColorArraySize));
255  settings.setValue(
256  "lightAmbientColor",
257  QByteArray((const char*)lightAmbientColor.rgba, c_fColorArraySize));
258  settings.setValue("lightSpecularColor",
259  QByteArray((const char*)lightSpecularColor.rgba,
261  settings.setValue(
262  "meshFrontDiff",
263  QByteArray((const char*)meshFrontDiff.rgba, c_fColorArraySize));
264  settings.setValue("meshBackDiff", QByteArray((const char*)meshBackDiff.rgba,
266  settings.setValue("meshSpecular", QByteArray((const char*)meshSpecular.rgba,
268  settings.setValue(
269  "pointsDefaultColor",
270  QByteArray((const char*)pointsDefaultCol.rgb, c_ubColorArraySize));
271  settings.setValue(
272  "textDefaultColor",
273  QByteArray((const char*)textDefaultCol.rgb, c_ubColorArraySize));
274  settings.setValue(
275  "backgroundColor",
276  QByteArray((const char*)backgroundCol.rgb, c_ubColorArraySize));
277  settings.setValue("labelBackgroundColor",
278  QByteArray((const char*)labelBackgroundCol.rgb,
280  settings.setValue(
281  "labelMarkerColor",
282  QByteArray((const char*)labelMarkerCol.rgb, c_ubColorArraySize));
283  settings.setValue(
284  "bbDefaultColor",
285  QByteArray((const char*)bbDefaultCol.rgb, c_ubColorArraySize));
286  settings.setValue("showBBOnSelected", showBBOnSelected);
287  settings.setValue("bbOpacity", bbOpacity);
288  settings.setValue("bbLineWidth", bbLineWidth);
289  settings.setValue("backgroundGradient", drawBackgroundGradient);
290  settings.setValue("drawRoundedPoints", drawRoundedPoints);
291  settings.setValue("meshDecimation", decimateMeshOnMove);
292  settings.setValue("minLoDMeshSize", minLoDMeshSize);
293  settings.setValue("cloudDecimation", decimateCloudOnMove);
294  settings.setValue("minLoDCloudSize", minLoDCloudSize);
295  settings.setValue("useVBOs", useVBOs);
296  settings.setValue("crossDisplayed", displayCross);
297  settings.setValue("labelMarkerSize", labelMarkerSize);
298  settings.setValue("colorScaleShowHistogram", colorScaleShowHistogram);
299  settings.setValue("colorScaleUseShader", colorScaleUseShader);
300  // settings.setValue("colorScaleShaderSupported", not saved);
301  settings.setValue("colorScaleRampWidth", colorScaleRampWidth);
302  settings.setValue("defaultFontSize", defaultFontSize);
303  settings.setValue("labelFontSize", labelFontSize);
304  settings.setValue("displayedNumPrecision", displayedNumPrecision);
305  settings.setValue("labelOpacity", labelOpacity);
306  settings.setValue("zoomSpeed", zoomSpeed);
307  settings.setValue("autoComputeOctree", static_cast<int>(autoComputeOctree));
308 
309  settings.endGroup();
310 }
311 
312 bool ecvGui::ParamStruct::isInPersistentSettings(QString paramName) const {
313  QSettings settings;
314  settings.beginGroup("OpenGL");
315  return settings.contains(paramName);
316 }
static int GetOptimizedFontSize(int baseFontSize=12)
This class manages some persistent parameters (mostly for display)
ParamStruct params
Parameters set.
static void Set(const ParamStruct &params)
Sets GUI parameters.
static void ReleaseInstance()
Release unique instance (if any)
static const ParamStruct & Parameters()
Returns the stored values of each parameter.
static void UpdateParameters()
static ecvSingleton< ecvGui > s_gui
Unique instance of ecvGui.
static int c_fColorArraySize
static int c_ubColorArraySize
float
constexpr Rgbub defaultColor(MAX, MAX, MAX)
constexpr Rgbub defaultLabelMarkerColor(MAX, 0, MAX)
RgbaTpl< unsigned char > Rgbaub
4 components, unsigned byte type
constexpr Rgbaf night(0.00f, 0.00f, 0.00f, 1.00F)
RgbaTpl< float > Rgbaf
4 components, float type
constexpr Rgbaf darkest(0.08f, 0.08f, 0.08f, 1.00f)
constexpr Rgbaf bright(1.00f, 1.00f, 1.00f, 1.00f)
constexpr Rgbaf middle(0.50f, 0.50f, 0.50f, 1.00f)
constexpr Rgbaf defaultMeshBackDiff(0.27f, 0.90f, 0.90f, 1.00f)
constexpr Rgbaf darker(0.17f, 0.17f, 0.17f, 1.00f)
constexpr Rgb yellow(MAX, MAX, 0)
constexpr Rgbaf defaultMeshFrontDiff(0.00f, 0.90f, 0.27f, 1.00f)
constexpr Rgbub defaultBkgColor(135, 206, 235)
constexpr Rgbub defaultLabelBkgColor(MAX, MAX, MAX)
GUI parameters.
void reset()
Resets parameters to default values.
ComputeOctreeForPicking
Octree computation (for picking) behaviors.
ParamStruct()
Default constructor.
void toPersistentSettings() const
Saves to persistent DB.
void fromPersistentSettings()
Loads from persistent DB.
bool isInPersistentSettings(QString paramName) const
Generic singleton encapsulation structure.
Definition: ecvSingleton.h:12