128 explicit BrainView(QWidget* parent =
nullptr);
152 void setInitialCameraRotation(
const QQuaternion& rotation);
155 void onRowsInserted(
const QModelIndex& parent,
int first,
int last);
156 void onDataChanged(
const QModelIndex& topLeft,
const QModelIndex& bottomRight,
const QVector<int>& roles);
163 void setActiveSurface(
const QString& type);
171 void setShaderMode(
const QString& mode);
179 void setBemShaderMode(
const QString& mode);
184 void syncBemShadersToBrainShaders();
192 void setVisualizationMode(
const QString& mode);
201 void setHemiVisible(
int hemiIdx,
bool visible);
210 void setBemVisible(
const QString& name,
bool visible);
218 void setBemHighContrast(
bool enabled);
227 void setSensorVisible(
const QString& type,
bool visible);
235 void setSensorTransEnabled(
bool enabled);
243 void setMegHelmetOverride(
const QString& path);
255 bool loadMegHelmetSurface(
const QString& helmetFilePath);
263 void setDipoleVisible(
bool visible);
281 void setNetworkVisible(
bool visible);
289 void setNetworkThreshold(
double threshold);
297 void setNetworkColormap(
const QString& name);
305 void setLightingEnabled(
bool enabled);
317 void setAutomatedRotation(
bool enabled);
325 bool automatedRotation()
const;
340 void setHeadMovementPath(
const QVector<Eigen::Vector3f>& vecPositions);
346 void clearHeadMovementPath();
363 bool takeScreenshot(
const QString& fileName);
380 bool savePng(
const QString& path,
int width = 1200,
int height = 800,
381 const QString& surfaceType = QStringLiteral(
"pial"));
387 void showSingleView();
393 void showMultiView();
402 void setViewCount(
int count);
419 void setViewportEnabled(
int index,
bool enabled);
427 void setViewportCameraPreset(
int index,
int preset);
432 void resetSingleViewCameraState();
439 void resetViewportCameraState(
int index);
448 void resetAllSubViewState();
456 int viewportCameraPreset(
int index)
const;
461 void resetMultiViewLayout();
468 void setVisualizationEditTarget(
int target);
475 int visualizationEditTarget()
const;
480 QString activeSurfaceForTarget(
int target)
const;
485 QString shaderModeForTarget(
int target)
const;
490 QString bemShaderModeForTarget(
int target)
const;
495 QString overlayModeForTarget(
int target)
const;
504 bool objectVisibleForTarget(
const QString&
object,
int target)
const;
512 bool megFieldMapOnHeadForTarget(
int target)
const;
520 bool isViewportEnabled(
int index)
const;
528 void setInfoPanelVisible(
bool visible);
538 return m_infoPanelVisible;
560 bool loadSourceEstimate(
const QString& lhPath,
const QString& rhPath);
569 bool loadSensors(
const QString& fifPath);
578 QMap<int, QVector3D> cardinalFiducialsInMri()
const;
589 bool bemTopVertexInMri(QVector3D& pos)
const;
598 bool loadDipoles(
const QString& dipPath);
607 bool loadSourceSpace(
const QString& fwdPath);
620 static QStringList probeEvokedSets(
const QString& evokedPath);
629 bool loadSensorField(
const QString& evokedPath,
int aveIndex = 0);
637 void setSourceSpaceVisible(
bool visible);
646 bool loadTransformation(
const QString& transPath);
654 void setTimePoint(
int index);
662 void castRay(
const QPoint& pos);
670 void setSourceColormap(
const QString& name);
680 void setSourceThresholds(
float min,
float mid,
float max);
688 void setSensorFieldTimePoint(
int index);
697 void setSensorFieldVisible(
const QString& type,
bool visible);
706 void setSensorFieldContourVisible(
const QString& type,
bool visible);
714 void setMegFieldMapOnHead(
bool useHead);
722 void setSensorFieldColormap(
const QString& name);
730 float stcStep()
const;
738 float stcTmin()
const;
746 int stcNumTimePoints()
const;
755 int closestSensorFieldIndex(
float timeSec)
const;
764 int closestStcIndex(
float timeSec)
const;
772 void startRealtimeStreaming();
778 void stopRealtimeStreaming();
786 bool isRealtimeStreaming()
const;
795 void pushRealtimeSourceData(
const Eigen::VectorXd& matData);
803 void setRealtimeInterval(
int msec);
811 void setRealtimeLooping(
bool enabled);
821 bool sensorFieldTimeRange(
float& tmin,
float& tmax)
const;
837 void startRealtimeSensorStreaming(
const QString& modality = QStringLiteral(
"MEG"));
843 void stopRealtimeSensorStreaming();
851 bool isRealtimeSensorStreaming()
const;
861 void pushRealtimeSensorData(
const Eigen::VectorXf& vecData);
869 void setRealtimeSensorInterval(
int msec);
877 void setRealtimeSensorLooping(
bool enabled);
885 void setRealtimeSensorAverages(
int numAvr);
893 void setRealtimeSensorColormap(
const QString& name);
900 void clearSurfaces();
910 void clearSourceEstimate();
920 void clearSourceSpace();
935 void setLiveMarkers(
const QVector<LiveMarker>& markers);
938 void clearLiveMarkers();
948 void setLiveRay(
const QVector3D& from,
const QVector3D& to,
949 const QColor& color,
float radius = 0.001f);
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));
973 void clearProbeVisualization();
979 void setStaticMarkers(
const QVector<LiveMarker>& markers);
982 void clearStaticMarkers();
988 void setCameraFocusOverride(
const QVector3D& center,
float size);
991 void clearCameraFocusOverride();
1001 void clearTransformation();
1006 void clearNetwork();
1012 void stopAllStreaming();
1022 void setVideoOverlayEnabled(
bool enabled);
1025 bool isVideoOverlayEnabled()
const;
1028 void setVideoOverlayFocusPosition(
const QVector3D& position);
1031 void setVideoOverlayUpHint(
const QVector3D& dir);
1034 void setVideoOverlaySize(
float meters);
1037 void setVideoOverlayOpacity(
float opacity);
1040 void pushVideoOverlayFrame(
const QImage& frame);
1043 void setVideoDepthEnabled(
bool enabled);
1046 void setVideoDepthScale(
float scale);
1049 void setVideoDepthSteps(
int steps);
1052 void pushVideoDepthFrame(
const QImage& depthFrame);
1065 bool intersectWorldRay(
const QVector3D& origin,
const QVector3D& direction, QVector3D& hitPoint)
const;
1085 void setSliceVisible(
int slotIndex,
bool visible);
1092 void setMriSlicesVisible(
bool visible);
1109 void setElectrodeValues(
const QMap<QString, float>& values);
1230 void onSourceEstimateLoaded(
int numTimePoints);
1240 void onRealtimeColorsAvailable(
const QVector<uint32_t>& colorsLh,
1241 const QVector<uint32_t>& colorsRh);
1245 void onSensorStreamColorsAvailable(
const QString& surfaceKey,
1246 const QVector<uint32_t>& colors);
1253 SubView& subViewForTarget(
int target);
1254 const SubView& subViewForTarget(
int target)
const;
1259 void refreshSensorTransforms();
1260 QMatrix4x4 itemTransform(
const QStandardItem* item)
const;
1261 void removeSurfacesByPrefix(
const QStringList& prefixes);
1264 void initialize(QRhiCommandBuffer* cb)
override;
1265 void render(QRhiCommandBuffer* cb)
override;
1272 void wheelEvent(QWheelEvent* event)
override;
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;
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();
1296 std::unique_ptr<BrainRenderer> m_renderer;
1299 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
1300 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
1302 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
1303 std::shared_ptr<BrainSurface> m_activeSurface;
1304 QString m_activeSurfaceType;
1307 static constexpr int kDefaultViewportCount = 4;
1309 QVector<SubView> m_subViews;
1310 int m_visualizationEditTarget = -1;
1316 bool m_lightingEnabled =
true;
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;
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;
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;
1352 static constexpr int kMaxSliceSlots = 3;
1355 bool m_sliceVisible[kMaxSliceSlots] = {
true,
true,
true};
1358 void updateSceneBounds();
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;
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;
1380 std::shared_ptr<BrainSurface> m_debugPointerSurface;
1381 QVector3D m_lastIntersectionPoint;
1382 bool m_hasIntersection =
false;
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;