32 if (
object ==
"lh")
return lh;
33 if (
object ==
"rh")
return rh;
34 if (
object ==
"bem_head")
return bemHead;
37 if (
object ==
"sens_meg")
return sensMeg;
39 if (
object ==
"sens_meg_mag")
return sensMegMag;
41 if (
object ==
"sens_eeg")
return sensEeg;
42 if (
object ==
"dig")
return dig;
44 if (
object ==
"dig_hpi")
return digHpi;
45 if (
object ==
"dig_eeg")
return digEeg;
46 if (
object ==
"dig_extra")
return digExtra;
51 if (
object ==
"dipoles")
return dipoles;
53 if (
object ==
"network")
return network;
54 if (
object ==
"mri_slices")
return mriSlices;
62 if (
object ==
"lh")
lh = visible;
63 else if (
object ==
"rh")
rh = visible;
64 else if (
object ==
"bem_head")
bemHead = visible;
65 else if (
object ==
"bem_outer_skull")
bemOuterSkull = visible;
66 else if (
object ==
"bem_inner_skull")
bemInnerSkull = visible;
67 else if (
object ==
"sens_meg")
sensMeg = visible;
68 else if (
object ==
"sens_meg_grad")
sensMegGrad = visible;
69 else if (
object ==
"sens_meg_mag")
sensMegMag = visible;
70 else if (
object ==
"sens_meg_helmet")
sensMegHelmet = visible;
71 else if (
object ==
"sens_eeg")
sensEeg = visible;
72 else if (
object ==
"dig")
dig = visible;
73 else if (
object ==
"dig_cardinal")
digCardinal = visible;
74 else if (
object ==
"dig_hpi")
digHpi = visible;
75 else if (
object ==
"dig_eeg")
digEeg = visible;
76 else if (
object ==
"dig_extra")
digExtra = visible;
77 else if (
object ==
"field_meg")
megFieldMap = visible;
78 else if (
object ==
"field_eeg")
eegFieldMap = visible;
81 else if (
object ==
"dipoles")
dipoles = visible;
82 else if (
object ==
"source_space")
sourceSpace = visible;
83 else if (
object ==
"network")
network = visible;
84 else if (
object ==
"mri_slices")
mriSlices = visible;
91 lh =
isTrue(settings.value(prefix +
"lh"),
lh);
92 rh =
isTrue(settings.value(prefix +
"rh"),
rh);
121 settings.setValue(prefix +
"lh",
lh);
122 settings.setValue(prefix +
"rh",
rh);
123 settings.setValue(prefix +
"bemHead",
bemHead);
126 settings.setValue(prefix +
"sensMeg",
sensMeg);
127 settings.setValue(prefix +
"sensMegGrad",
sensMegGrad);
128 settings.setValue(prefix +
"sensMegMag",
sensMegMag);
130 settings.setValue(prefix +
"sensEeg",
sensEeg);
131 settings.setValue(prefix +
"dig",
dig);
132 settings.setValue(prefix +
"digCardinal",
digCardinal);
133 settings.setValue(prefix +
"digHpi",
digHpi);
134 settings.setValue(prefix +
"digEeg",
digEeg);
135 settings.setValue(prefix +
"digExtra",
digExtra);
136 settings.setValue(prefix +
"megFieldMap",
megFieldMap);
137 settings.setValue(prefix +
"eegFieldMap",
eegFieldMap);
140 settings.setValue(prefix +
"dipoles",
dipoles);
141 settings.setValue(prefix +
"sourceSpace",
sourceSpace);
142 settings.setValue(prefix +
"network",
network);
144 settings.setValue(prefix +
"mriSlices",
mriSlices);
153 if (key.isEmpty())
return false;
154 if (key.startsWith(
"bem_"))
return false;
155 if (key.startsWith(
"sens_"))
return false;
156 if (key.startsWith(
"srcsp_"))
return false;
157 if (key.startsWith(
"dig_"))
return false;
172 if (key.startsWith(
"lh_"))
return visibility.lh;
173 if (key.startsWith(
"rh_"))
return visibility.rh;
175 if (key ==
"bem_head")
return visibility.bemHead;
176 if (key ==
"bem_outer_skull")
return visibility.bemOuterSkull;
177 if (key ==
"bem_inner_skull")
return visibility.bemInnerSkull;
179 if (key.startsWith(
"sens_contour_meg"))
return visibility.megFieldMap &&
visibility.megFieldContours;
180 if (key.startsWith(
"sens_contour_eeg"))
return visibility.eegFieldMap &&
visibility.eegFieldContours;
181 if (key.startsWith(
"sens_surface_meg"))
return visibility.sensMegHelmet;
184 if (key.startsWith(
"sens_meg_"))
return visibility.sensMeg;
185 if (key.startsWith(
"sens_eeg_"))
return visibility.sensEeg;
187 if (key.startsWith(
"dig_live_"))
return true;
188 if (key.startsWith(
"dig_static_"))
return true;
189 if (key.startsWith(
"dig_ray_"))
return true;
190 if (key.startsWith(
"dig_probe_"))
return true;
195 if (key.startsWith(
"dig_"))
return visibility.dig;
197 if (key.startsWith(
"srcsp_"))
return visibility.sourceSpace;
205 QMap<QString, std::shared_ptr<BrainSurface>> &surfaces)
const
207 for (
auto it = surfaces.begin(); it != surfaces.end(); ++it) {
220 return QQuaternion::fromEulerAngles(-45.0f, -40.0f, -130.0f);
228 case 0:
return QStringLiteral(
"Top");
229 case 1:
return QStringLiteral(
"Perspective");
230 case 2:
return QStringLiteral(
"Front");
231 case 3:
return QStringLiteral(
"Left");
232 case 4:
return QStringLiteral(
"Bottom");
233 case 5:
return QStringLiteral(
"Back");
234 case 6:
return QStringLiteral(
"Right");
235 default:
return QStringLiteral(
"Top");
245 return QQuaternion::fromAxisAndAngle(0, 0, 1, 180);
249 return QQuaternion::fromAxisAndAngle(0, 1, 0, 180)
250 * QQuaternion::fromAxisAndAngle(0, 0, 1, 180)
251 * QQuaternion::fromAxisAndAngle(1, 0, 0, 90)
252 * QQuaternion::fromAxisAndAngle(0, 0, 1, 180);
254 return QQuaternion::fromAxisAndAngle(1, 0, 0, 90)
255 * QQuaternion::fromAxisAndAngle(0, 1, 0, -90);
257 return QQuaternion::fromAxisAndAngle(1, 0, 0, 180)
258 * QQuaternion::fromAxisAndAngle(0, 0, 1, 180);
260 return QQuaternion::fromAxisAndAngle(1, 0, 0, 90);
262 return QQuaternion::fromAxisAndAngle(1, 0, 0, 90)
263 * QQuaternion::fromAxisAndAngle(0, 1, 0, 90);
265 return QQuaternion::fromAxisAndAngle(0, 0, 1, 180);
282 static constexpr ShaderMode kShaderCycle[] = {
287 static constexpr int kNumShaders = 3;
288 static constexpr int kNumPresets = 7;
291 sv.
preset = index % kNumPresets;
292 sv.
brainShader = kShaderCycle[index % kNumShaders];
303 return std::clamp(target, -1, maxIndex);
312 if (name ==
"XRay")
return XRay;
320 if (mode ==
Holographic)
return QStringLiteral(
"Holographic");
321 if (mode ==
Anatomical)
return QStringLiteral(
"Anatomical");
322 return QStringLiteral(
"Standard");
342 return QStringLiteral(
"Surface");
351 double x = 2.0 * v - 1.0;
352 x = std::clamp(x, -1.0, 1.0);
354 static constexpr int N = 7;
355 static const double pos[N] = { -1.0, -0.90, -0.30, 0.0, 0.30, 0.90, 1.0 };
356 static const double rr[N] = { 0.0, 0.0, 0.5, 0.5, 0.5, 1.0, 1.0 };
357 static const double gg[N] = { 1.0, 0.0, 0.5, 0.5, 0.5, 0.0, 1.0 };
358 static const double bb[N] = { 1.0, 1.0, 0.5, 0.5, 0.5, 0.0, 0.0 };
361 for (
int i = 0; i < N - 1; ++i) {
362 if (x >= pos[i] && x <= pos[i + 1]) {
367 if (x > pos[N - 1]) seg = N - 2;
369 double t = (pos[seg + 1] != pos[seg])
370 ? (x - pos[seg]) / (pos[seg + 1] - pos[seg])
372 t = std::clamp(t, 0.0, 1.0);
374 int r =
static_cast<int>(std::round((rr[seg] + t * (rr[seg + 1] - rr[seg])) * 255.0));
375 int g =
static_cast<int>(std::round((gg[seg] + t * (gg[seg + 1] - gg[seg])) * 255.0));
376 int b =
static_cast<int>(std::round((bb[seg] + t * (bb[seg + 1] - bb[seg])) * 255.0));
378 return qRgb(std::clamp(r, 0, 255), std::clamp(g, 0, 255), std::clamp(b, 0, 255));
386 const QQuaternion &fallbackRotation)
395 zoom = settings.value(prefix +
"zoom",
zoom).toFloat();
397 settings.value(prefix +
"panX",
pan.x()).toFloat(),
398 settings.value(prefix +
"panY",
pan.y()).toFloat());
399 preset = std::clamp(settings.value(prefix +
"preset",
preset).toInt(), 0, 6);
401 const bool hasQuat = settings.contains(prefix +
"perspRotW")
402 && settings.contains(prefix +
"perspRotX")
403 && settings.contains(prefix +
"perspRotY")
404 && settings.contains(prefix +
"perspRotZ");
406 const float w = settings.value(prefix +
"perspRotW", 1.0f).toFloat();
407 const float x = settings.value(prefix +
"perspRotX", 0.0f).toFloat();
408 const float y = settings.value(prefix +
"perspRotY", 0.0f).toFloat();
409 const float z = settings.value(prefix +
"perspRotZ", 0.0f).toFloat();
425 settings.setValue(prefix +
"surfaceType",
surfaceType);
432 settings.setValue(prefix +
"zoom",
zoom);
433 settings.setValue(prefix +
"panX",
pan.x());
434 settings.setValue(prefix +
"panY",
pan.y());
435 settings.setValue(prefix +
"preset",
preset);
Renderable cortical / BEM mesh with interleaved vertex attributes and Qt-RHI buffer management.
QQuaternion multiViewPresetOffset(int preset)
QString shaderModeName(ShaderMode mode)
VisualizationMode visualizationModeFromName(const QString &name)
QString visualizationModeName(VisualizationMode mode)
bool multiViewPresetIsPerspective(int preset)
QRgb mneAnalyzeColor(double v)
ShaderMode shaderModeFromName(const QString &name)
int normalizedVisualizationTarget(int target, int maxIndex)
QQuaternion perspectivePresetRotation()
QString multiViewPresetName(int preset)
Per-viewport state (camera preset, zoom, pan, visibility filter) and serialisation helpers.
DISP3DSHARED_EXPORT ShaderMode shaderModeFromName(const QString &name)
DISP3DSHARED_EXPORT QString visualizationModeName(VisualizationMode mode)
DISP3DSHARED_EXPORT VisualizationMode visualizationModeFromName(const QString &name)
bool isTrue(const QVariant &value, bool fallback)
DISP3DSHARED_EXPORT QString shaderModeName(ShaderMode mode)
Qt-RHI scene renderer: shader pipelines, lighting, dual render targets and per-frame draw orchestrati...
void save(QSettings &settings, const QString &prefix) const
void load(const QSettings &settings, const QString &prefix)
void setObjectVisible(const QString &object, bool visible)
bool isObjectVisible(const QString &object) const
Viewport subdivision holding its own camera, projection, and scissor rectangle.
void save(QSettings &settings, const QString &prefix) const
void applyOverlayToSurfaces(QMap< QString, std::shared_ptr< BrainSurface > > &surfaces) const
bool matchesSurfaceType(const QString &key) const
ViewVisibilityProfile visibility
static bool isBrainSurfaceKey(const QString &key)
bool shouldRenderSurface(const QString &key) const
QQuaternion perspectiveRotation
VisualizationMode overlayMode
static SubView defaultForIndex(int index)
void load(const QSettings &settings, const QString &prefix, const QQuaternion &fallbackRotation=QQuaternion())