v2.0.0
Loading...
Searching...
No Matches
brainview.h
Go to the documentation of this file.
1//=============================================================================================================
25
26#ifndef BRAINVIEW_H
27#define BRAINVIEW_H
28
29//=============================================================================================================
30// INCLUDES
31//=============================================================================================================
32
33#include "../disp3D_global.h"
34
35#include "../core/rendertypes.h"
36#include "multiviewlayout.h"
37#include "core/viewstate.h"
42
44#include <fiff/fiff_dig_point.h>
45#include <QRhiWidget>
46#include <QMap>
47#include <QElapsedTimer>
48#include <memory>
49#include <QQuaternion>
50#include <Eigen/Core>
51#include <QRect>
52#include <QImage>
53
54//=============================================================================================================
55// FORWARD DECLARATIONS
56//=============================================================================================================
57
58class QLabel;
59class QStandardItem;
60class QFrame;
61class QTimer;
62namespace CONNECTIVITYLIB
63{
64class Network;
65}
66
67namespace DISP3DLIB
68{
69
70class BrainTreeModel;
71class BrainRenderer;
72class BrainSurface;
73class DipoleObject;
74class ElectrodeObject;
75class NetworkObject;
76class PolylineObject;
77class VideoOverlay;
78class SliceObject;
79
80//=============================================================================================================
91{
92 QVector3D position;
93 QColor color;
94 float radius = 0.003f;
95 bool transparent = false;
96};
97
98//=============================================================================================================
107class DISP3DSHARED_EXPORT BrainView : public QRhiWidget
108{
109 Q_OBJECT
110
111public:
120
121public:
122 //=========================================================================================================
128 explicit BrainView(QWidget* parent = nullptr);
129
130 //=========================================================================================================
134 ~BrainView();
135
136 //=========================================================================================================
143 void setModel(BrainTreeModel* model);
144
145 //=========================================================================================================
152 void setInitialCameraRotation(const QQuaternion& rotation);
153
154public slots:
155 void onRowsInserted(const QModelIndex& parent, int first, int last);
156 void onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles);
157 //=========================================================================================================
163 void setActiveSurface(const QString& type);
164
165 //=========================================================================================================
171 void setShaderMode(const QString& mode);
172
173 //=========================================================================================================
179 void setBemShaderMode(const QString& mode);
180
184 void syncBemShadersToBrainShaders();
185
186 //=========================================================================================================
192 void setVisualizationMode(const QString& mode);
193
194 //=========================================================================================================
201 void setHemiVisible(int hemiIdx, bool visible);
202
203 //=========================================================================================================
210 void setBemVisible(const QString& name, bool visible);
211
212 //=========================================================================================================
218 void setBemHighContrast(bool enabled);
219
220 //=========================================================================================================
227 void setSensorVisible(const QString& type, bool visible);
228
229 //=========================================================================================================
235 void setSensorTransEnabled(bool enabled);
236
237 //=========================================================================================================
243 void setMegHelmetOverride(const QString& path);
244
245 //=========================================================================================================
255 bool loadMegHelmetSurface(const QString& helmetFilePath);
256
257 //=========================================================================================================
263 void setDipoleVisible(bool visible);
264
265 //=========================================================================================================
273 bool loadNetwork(const CONNECTIVITYLIB::Network& network, const QString& name = "Network");
274
275 //=========================================================================================================
281 void setNetworkVisible(bool visible);
282
283 //=========================================================================================================
289 void setNetworkThreshold(double threshold);
290
291 //=========================================================================================================
297 void setNetworkColormap(const QString& name);
298
299 //=========================================================================================================
305 void setLightingEnabled(bool enabled);
306
307 //=========================================================================================================
317 void setAutomatedRotation(bool enabled);
318
319 //=========================================================================================================
325 bool automatedRotation() const;
326
327 //=========================================================================================================
340 void setHeadMovementPath(const QVector<Eigen::Vector3f>& vecPositions);
341
342 //=========================================================================================================
346 void clearHeadMovementPath();
347
348 //=========================================================================================================
354 bool saveSnapshot();
355
356 //=========================================================================================================
363 bool takeScreenshot(const QString& fileName);
364
365 //=========================================================================================================
380 bool savePng(const QString& path, int width = 1200, int height = 800,
381 const QString& surfaceType = QStringLiteral("pial"));
382
383 //=========================================================================================================
387 void showSingleView();
388
389 //=========================================================================================================
393 void showMultiView();
394
395 //=========================================================================================================
402 void setViewCount(int count);
403
407 int viewCount() const
408 {
409 return m_viewCount;
410 }
411
412 //=========================================================================================================
419 void setViewportEnabled(int index, bool enabled);
420
427 void setViewportCameraPreset(int index, int preset);
428
432 void resetSingleViewCameraState();
433
439 void resetViewportCameraState(int index);
440
448 void resetAllSubViewState();
449
456 int viewportCameraPreset(int index) const;
457
461 void resetMultiViewLayout();
462
468 void setVisualizationEditTarget(int target);
469
475 int visualizationEditTarget() const;
476
480 QString activeSurfaceForTarget(int target) const;
481
485 QString shaderModeForTarget(int target) const;
486
490 QString bemShaderModeForTarget(int target) const;
491
495 QString overlayModeForTarget(int target) const;
496
504 bool objectVisibleForTarget(const QString& object, int target) const;
505
512 bool megFieldMapOnHeadForTarget(int target) const;
513
520 bool isViewportEnabled(int index) const;
521
522 //=========================================================================================================
528 void setInfoPanelVisible(bool visible);
529
530 //=========================================================================================================
537 {
538 return m_infoPanelVisible;
539 }
540
541 //=========================================================================================================
548 {
549 return m_viewMode;
550 }
551
552 //=========================================================================================================
560 bool loadSourceEstimate(const QString& lhPath, const QString& rhPath);
561
562 //=========================================================================================================
569 bool loadSensors(const QString& fifPath);
570
578 QMap<int, QVector3D> cardinalFiducialsInMri() const;
579
589 bool bemTopVertexInMri(QVector3D& pos) const;
590
591 //=========================================================================================================
598 bool loadDipoles(const QString& dipPath);
599
600 //=========================================================================================================
607 bool loadSourceSpace(const QString& fwdPath);
608
609 //=========================================================================================================
620 static QStringList probeEvokedSets(const QString& evokedPath);
621
629 bool loadSensorField(const QString& evokedPath, int aveIndex = 0);
630
631 //=========================================================================================================
637 void setSourceSpaceVisible(bool visible);
638
639 //=========================================================================================================
646 bool loadTransformation(const QString& transPath);
647
648 //=========================================================================================================
654 void setTimePoint(int index);
655
656 //=========================================================================================================
662 void castRay(const QPoint& pos);
663
664 //=========================================================================================================
670 void setSourceColormap(const QString& name);
671
672 //=========================================================================================================
680 void setSourceThresholds(float min, float mid, float max);
681
682 //=========================================================================================================
688 void setSensorFieldTimePoint(int index);
689
690 //=========================================================================================================
697 void setSensorFieldVisible(const QString& type, bool visible);
698
699 //=========================================================================================================
706 void setSensorFieldContourVisible(const QString& type, bool visible);
707
708 //=========================================================================================================
714 void setMegFieldMapOnHead(bool useHead);
715
716 //=========================================================================================================
722 void setSensorFieldColormap(const QString& name);
723
724 //=========================================================================================================
730 float stcStep() const;
731
732 //=========================================================================================================
738 float stcTmin() const;
739
740 //=========================================================================================================
746 int stcNumTimePoints() const;
747
748 //=========================================================================================================
755 int closestSensorFieldIndex(float timeSec) const;
756
757 //=========================================================================================================
764 int closestStcIndex(float timeSec) const;
765
766 //=========================================================================================================
772 void startRealtimeStreaming();
773
774 //=========================================================================================================
778 void stopRealtimeStreaming();
779
780 //=========================================================================================================
786 bool isRealtimeStreaming() const;
787
788 //=========================================================================================================
795 void pushRealtimeSourceData(const Eigen::VectorXd& matData);
796
797 //=========================================================================================================
803 void setRealtimeInterval(int msec);
804
805 //=========================================================================================================
811 void setRealtimeLooping(bool enabled);
812
813 //=========================================================================================================
821 bool sensorFieldTimeRange(float& tmin, float& tmax) const;
822
823 //=========================================================================================================
824 // ── Real-time sensor data streaming ────────────────────────────────
825 //=========================================================================================================
826
837 void startRealtimeSensorStreaming(const QString& modality = QStringLiteral("MEG"));
838
839 //=========================================================================================================
843 void stopRealtimeSensorStreaming();
844
845 //=========================================================================================================
851 bool isRealtimeSensorStreaming() const;
852
853 //=========================================================================================================
861 void pushRealtimeSensorData(const Eigen::VectorXf& vecData);
862
863 //=========================================================================================================
869 void setRealtimeSensorInterval(int msec);
870
871 //=========================================================================================================
877 void setRealtimeSensorLooping(bool enabled);
878
879 //=========================================================================================================
885 void setRealtimeSensorAverages(int numAvr);
886
887 //=========================================================================================================
893 void setRealtimeSensorColormap(const QString& name);
894
895 // ── Data removal ───────────────────────────────────────────────────
896
900 void clearSurfaces();
901
905 void clearBem();
906
910 void clearSourceEstimate();
911
915 void clearDipoles();
916
920 void clearSourceSpace();
921
925 void clearSensors();
926
927 // ── Live marker overlay (lightweight, no model, no scene-bounds) ───
928
935 void setLiveMarkers(const QVector<LiveMarker>& markers);
936
938 void clearLiveMarkers();
939
948 void setLiveRay(const QVector3D& from, const QVector3D& to,
949 const QColor& color, float radius = 0.001f);
950
952 void clearLiveRay();
953
967 void setProbeVisualization(const QVector3D& tip, const QVector3D& direction,
968 float length, const QColor& color,
969 const QColor& glowColor = QColor(0, 0, 0, 0),
970 const QQuaternion& orientation = QQuaternion(0, 0, 0, 0));
971
973 void clearProbeVisualization();
974
979 void setStaticMarkers(const QVector<LiveMarker>& markers);
980
982 void clearStaticMarkers();
983
988 void setCameraFocusOverride(const QVector3D& center, float size);
989
991 void clearCameraFocusOverride();
992
996 void clearEvoked();
997
1001 void clearTransformation();
1002
1006 void clearNetwork();
1007
1012 void stopAllStreaming();
1013
1014 //=========================================================================================================
1015 // ── Video overlay ──────────────────────────────────────────────────
1016 //=========================================================================================================
1017
1022 void setVideoOverlayEnabled(bool enabled);
1023
1025 bool isVideoOverlayEnabled() const;
1026
1028 void setVideoOverlayFocusPosition(const QVector3D& position);
1029
1031 void setVideoOverlayUpHint(const QVector3D& dir);
1032
1034 void setVideoOverlaySize(float meters);
1035
1037 void setVideoOverlayOpacity(float opacity);
1038
1040 void pushVideoOverlayFrame(const QImage& frame);
1041
1043 void setVideoDepthEnabled(bool enabled);
1044
1046 void setVideoDepthScale(float scale);
1047
1049 void setVideoDepthSteps(int steps);
1050
1052 void pushVideoDepthFrame(const QImage& depthFrame);
1053
1065 bool intersectWorldRay(const QVector3D& origin, const QVector3D& direction, QVector3D& hitPoint) const;
1066
1067 //=========================================================================================================
1068 // ── MRI slice rendering ────────────────────────────────────────────
1069 //=========================================================================================================
1070
1077 void setSlice(int slotIndex, DISP3DLIB::SliceObject* slice);
1078
1085 void setSliceVisible(int slotIndex, bool visible);
1086
1092 void setMriSlicesVisible(bool visible);
1093
1099 void setElectrodes(DISP3DLIB::ElectrodeObject* electrodes);
1100
1109 void setElectrodeValues(const QMap<QString, float>& values);
1110
1111signals:
1112 //=========================================================================================================
1119 void timePointChanged(int index, float time);
1120
1121 //=========================================================================================================
1127 void sourceEstimateLoaded(int numTimePoints);
1128
1129 //=========================================================================================================
1135 void sensorFieldLoaded(int numTimePoints, int initialTimePoint = 0);
1136
1137 //=========================================================================================================
1145 void sourceThresholdsUpdated(float min, float mid, float max);
1146
1147 //=========================================================================================================
1154 void stcLoadingProgress(int percent, const QString& message);
1155
1156 //=========================================================================================================
1163 void sensorFieldTimePointChanged(int index, float time);
1164
1165 //=========================================================================================================
1171 void hoveredRegionChanged(const QString& regionName);
1172
1179 void electrodeContactClicked(const QString& contactName, const QVector3D& position);
1180
1181 //=========================================================================================================
1188
1189 //=========================================================================================================
1198 void viewCountChanged(int count);
1199
1200 //=========================================================================================================
1208 void shaderModeChanged(const QString& modeName);
1209
1214 void surfacePointClicked(const QVector3D& worldPos);
1215
1220 void surfacePointDoubleClicked(const QVector3D& worldPos);
1221
1222private slots:
1223 //=========================================================================================================
1230 void onSourceEstimateLoaded(int numTimePoints);
1231
1232 //=========================================================================================================
1240 void onRealtimeColorsAvailable(const QVector<uint32_t>& colorsLh,
1241 const QVector<uint32_t>& colorsRh);
1242
1243 //=========================================================================================================
1245 void onSensorStreamColorsAvailable(const QString& surfaceKey,
1246 const QVector<uint32_t>& colors);
1247
1248private:
1249 // Note: ViewVisibilityProfile and SubView are defined in core/viewstate.h.
1250 // SplitterHit is defined in view/multiviewlayout.h.
1251
1253 SubView& subViewForTarget(int target);
1254 const SubView& subViewForTarget(int target) const;
1255
1256 ViewVisibilityProfile& visibilityProfileForTarget(int target);
1257 const ViewVisibilityProfile& visibilityProfileForTarget(int target) const;
1258
1259 void refreshSensorTransforms();
1260 QMatrix4x4 itemTransform(const QStandardItem* item) const;
1261 void removeSurfacesByPrefix(const QStringList& prefixes);
1262
1263protected:
1264 void initialize(QRhiCommandBuffer* cb) override;
1265 void render(QRhiCommandBuffer* cb) override;
1266 void releaseResources() override;
1267
1268 void mousePressEvent(QMouseEvent* event) override;
1269 void mouseMoveEvent(QMouseEvent* event) override;
1270 void mouseReleaseEvent(QMouseEvent* event) override;
1271 void mouseDoubleClickEvent(QMouseEvent* event) override;
1272 void wheelEvent(QWheelEvent* event) override;
1273 void keyPressEvent(QKeyEvent* event) override;
1274 void resizeEvent(QResizeEvent* event) override;
1275
1276private:
1277 // ── Layout helpers (delegate to MultiViewLayout) ───────────────────
1278 QVector<int> enabledViewportIndices() const;
1279 int enabledViewportCount() const;
1280 int viewportIndexAt(const QPoint& pos) const;
1281 QRect multiViewSlotRect(int slot, int numEnabled, const QSize& outputSize) const;
1282 SplitterHit hitTestSplitter(const QPoint& pos, int numEnabled, const QSize& outputSize) const;
1283
1284 // ── Helpers ────────────────────────────────────────────────────────
1285 void updateSplitterCursor(const QPoint& pos);
1286 void updateViewportSeparators();
1287 void updateOverlayLayout();
1288 void updateViewportLabelHighlight();
1289 void showViewportPresetMenu(int viewport, const QPoint& globalPos);
1290 void logPerspectiveRotation(const QString& context) const;
1291 void loadMultiViewSettings();
1292 void saveMultiViewSettings() const;
1293 void updateInflatedSurfaceTransforms();
1294
1295 // ── Rendering ───────────────────────────────────────────────────────
1296 std::unique_ptr<BrainRenderer> m_renderer;
1297 BrainTreeModel* m_model = nullptr;
1298
1299 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
1300 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
1301
1302 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
1303 std::shared_ptr<BrainSurface> m_activeSurface;
1304 QString m_activeSurfaceType;
1305
1306 // ── SubView state ──────────────────────────────────────────────────
1307 static constexpr int kDefaultViewportCount = 4;
1308 SubView m_singleView;
1309 QVector<SubView> m_subViews;
1310 int m_visualizationEditTarget = -1;
1311
1312 // ── Active (runtime) copies — kept in sync with selected SubView ──
1313 ShaderMode m_brainShaderMode = Standard;
1314 ShaderMode m_bemShaderMode = Standard;
1315 VisualizationMode m_currentVisMode = ModeSurface;
1316 bool m_lightingEnabled = true;
1317
1318 // ── Extracted components ───────────────────────────────────────────
1319 CameraController m_camera;
1320 MultiViewLayout m_layout;
1321 SensorFieldMapper m_fieldMapper;
1322 SourceEstimateManager m_sourceManager;
1323 RtSensorStreamManager m_sensorStreamManager;
1324
1325 // ── Camera state ───────────────────────────────────────────────────
1326 QQuaternion m_cameraRotation;
1327 QVector3D m_sceneCenter = QVector3D(0, 0, 0);
1328 float m_sceneSize = 0.3f;
1329 bool m_cameraFocusOverride = false;
1330 QVector3D m_cameraFocusCenter;
1331 float m_cameraFocusSize = 0.3f;
1332 QPoint m_lastMousePos;
1333 QTimer* m_pAutoRotateTimer = nullptr;
1334
1335 // ── UI overlays ────────────────────────────────────────────────────
1336 int m_frameCount = 0;
1337 QElapsedTimer m_fpsTimer;
1338 QLabel* m_fpsLabel = nullptr;
1339 QLabel* m_singleViewInfoLabel = nullptr;
1340 bool m_sceneDirty = true;
1341 qint64 m_cachedVertexCount = 0;
1342 bool m_vertexCountDirty = true;
1343 bool m_infoPanelVisible = true;
1344
1345 // ── Scene objects ──────────────────────────────────────────────────
1346 std::unique_ptr<DipoleObject> m_dipoles;
1347 std::unique_ptr<NetworkObject> m_network;
1348 std::unique_ptr<PolylineObject> m_headPath;
1349 std::unique_ptr<DISP3DLIB::VideoOverlay> m_videoOverlay;
1350
1351 // ── MRI slices ─────────────────────────────────────────────────────
1352 static constexpr int kMaxSliceSlots = 3;
1353 DISP3DLIB::ElectrodeObject* m_electrodes = nullptr;
1354 DISP3DLIB::SliceObject* m_slices[kMaxSliceSlots] = {};
1355 bool m_sliceVisible[kMaxSliceSlots] = {true, true, true};
1356
1358 void updateSceneBounds();
1359
1360 // ── Coordinate transforms ──────────────────────────────────────────
1361 FIFFLIB::FiffCoordTrans m_headToMriTrans;
1362 QList<FIFFLIB::FiffDigPoint> m_cardinalDigPoints;
1363 bool m_applySensorTrans = true;
1364 QString m_megHelmetOverridePath;
1365 QMatrix4x4 m_devHeadTrans;
1366 bool m_hasDevHead = false;
1367 bool m_dipolesVisible = true;
1368 bool m_networkVisible = false;
1369
1370 // ── Ray-pick hover state ───────────────────────────────────────────
1371 QStandardItem* m_hoveredItem = nullptr;
1372 int m_hoveredIndex = -1;
1373 QString m_hoveredRegion;
1374 QString m_hoveredSurfaceKey;
1375 QLabel* m_regionLabel = nullptr;
1376 QVector<QLabel*> m_viewportNameLabels;
1377 QVector<QLabel*> m_viewportInfoLabels;
1378
1379 // ── Debug intersection ─────────────────────────────────────────────
1380 std::shared_ptr<BrainSurface> m_debugPointerSurface;
1381 QVector3D m_lastIntersectionPoint;
1382 bool m_hasIntersection = false;
1383
1384
1385 // ── Multi-view support ─────────────────────────────────────────────
1386 ViewMode m_viewMode = SingleView;
1387 int m_viewCount = 1;
1388 float m_multiSplitX = 0.5f;
1389 float m_multiSplitY = 0.5f;
1390 bool m_isDraggingSplitter = false;
1391 SplitterHit m_activeSplitter = SplitterHit::None;
1392 int m_splitterHitTolerancePx = 6;
1393 int m_splitterMinPanePx = 80;
1394 int m_separatorLinePx = 2;
1395 QFrame* m_verticalSeparator = nullptr;
1396 QFrame* m_horizontalSeparator = nullptr;
1397 bool m_perspectiveRotatedSincePress = false;
1398 bool m_draggedSincePress = false;
1399};
1400
1401} // namespace DISP3DLIB
1402
1403#endif // BRAINVIEW_H
4x4 affine FIFF coordinate transform (FIFF_COORD_TRANS) annotated with source/destination coordinate-...
Single digitization point (FIFF_DIG_POINT) with kind (cardinal/HPI/EEG/extra), identifier and 3D coor...
Library export/import macros and namespace marker for the disp3D library.
#define DISP3DSHARED_EXPORT
Camera state and projection / view / model matrix computation for single- and multi-view layouts.
Viewport geometry, splitter logic and per-pane preset assignment for the disp3D multi-view grid.
Per-viewport state (camera preset, zoom, pan, visibility filter) and serialisation helpers.
Lightweight render-related enums (ShaderMode, VisualizationMode) shared across disp3D.
Manager that wires real-time sensor data into the scene: owns the data controller,...
Builds the dense sensor-to-surface mapping matrix and the iso-contour overlay for MEG / EEG evoked da...
Owns the source-time-course overlay together with its loader, real-time controller and target cortica...
Functional connectivity metrics (coherence, PLV, cross-correlation, etc.).
3-D brain visualisation using the Qt RHI rendering backend.
Graph container for one connectivity metric; nodes + weighted edges + threshold/visualisation state.
Definition network.h:106
Per-view toggle flags controlling which data layers (brain, sensors, sources, network) are visible.
Definition viewstate.h:68
Viewport subdivision holding its own camera, projection, and scissor rectangle.
Definition viewstate.h:143
Camera state and matrix computation.
Hierarchical item model organizing all 3-D scene objects (surfaces, sensors, sources,...
Renderable cortical surface mesh with per-vertex color, curvature data, and GPU buffer management.
Renderable dipole arrow set with instanced GPU rendering.
Renderable sEEG / ECoG electrodes: contact spheres plus lead bodies.
Renderable connectivity network visualization.
Connected line segments through an ordered list of points.
Data model for a single 2-D MRI volume slice.
Definition sliceobject.h:82
Camera-facing textured quad rendered at a focus point in the 3-D scene.
Real-time sensor streaming lifecycle manager.
Sensor-to-surface field mapper that interpolates MEG/EEG measurements onto cortical meshes and genera...
Source estimate lifecycle manager.
Qt RHI-based 3-D renderer managing scene objects, lighting, camera, and render pipeline for brain vis...
Lightweight live overlay marker rendered as a single sphere.
Definition brainview.h:91
bool transparent
If true, rendered with alpha blending.
Definition brainview.h:95
Top-level QWidget hosting the QRhi-based 3-D brain visualization with mouse interaction and multi-vie...
Definition brainview.h:108
void initialize(QRhiCommandBuffer *cb) override
void surfacePointClicked(const QVector3D &worldPos)
void keyPressEvent(QKeyEvent *event) override
bool isInfoPanelVisible() const
Definition brainview.h:536
void visualizationEditTargetChanged(int target)
void wheelEvent(QWheelEvent *event) override
void timePointChanged(int index, float time)
void mouseDoubleClickEvent(QMouseEvent *event) override
void surfacePointDoubleClicked(const QVector3D &worldPos)
void sourceEstimateLoaded(int numTimePoints)
int viewCount() const
Definition brainview.h:407
void resizeEvent(QResizeEvent *event) override
void releaseResources() override
void viewCountChanged(int count)
void shaderModeChanged(const QString &modeName)
void render(QRhiCommandBuffer *cb) override
void sensorFieldLoaded(int numTimePoints, int initialTimePoint=0)
BrainView(QWidget *parent=nullptr)
Definition brainview.cpp:98
void hoveredRegionChanged(const QString &regionName)
void mousePressEvent(QMouseEvent *event) override
void electrodeContactClicked(const QString &contactName, const QVector3D &position)
void mouseMoveEvent(QMouseEvent *event) override
void stcLoadingProgress(int percent, const QString &message)
void mouseReleaseEvent(QMouseEvent *event) override
ViewMode viewMode() const
Definition brainview.h:547
void sensorFieldTimePointChanged(int index, float time)
void sourceThresholdsUpdated(float min, float mid, float max)
Multi-view geometry computations.
Labelled 4x4 FIFF affine: source frame, destination frame, rotation, translation and cached inverse.