127 explicit BrainView(QWidget* parent =
nullptr);
151 void setInitialCameraRotation(
const QQuaternion& rotation);
154 void onRowsInserted(
const QModelIndex& parent,
int first,
int last);
155 void onDataChanged(
const QModelIndex& topLeft,
const QModelIndex& bottomRight,
const QVector<int>& roles);
162 void setActiveSurface(
const QString& type);
170 void setShaderMode(
const QString& mode);
178 void setBemShaderMode(
const QString& mode);
183 void syncBemShadersToBrainShaders();
191 void setVisualizationMode(
const QString& mode);
200 void setHemiVisible(
int hemiIdx,
bool visible);
209 void setBemVisible(
const QString& name,
bool visible);
217 void setBemHighContrast(
bool enabled);
226 void setSensorVisible(
const QString& type,
bool visible);
234 void setSensorTransEnabled(
bool enabled);
242 void setMegHelmetOverride(
const QString& path);
254 bool loadMegHelmetSurface(
const QString& helmetFilePath);
262 void setDipoleVisible(
bool visible);
280 void setNetworkVisible(
bool visible);
288 void setNetworkThreshold(
double threshold);
296 void setNetworkColormap(
const QString& name);
304 void setLightingEnabled(
bool enabled);
316 void setAutomatedRotation(
bool enabled);
324 bool automatedRotation()
const;
339 void setHeadMovementPath(
const QVector<Eigen::Vector3f>& vecPositions);
345 void clearHeadMovementPath();
362 bool takeScreenshot(
const QString& fileName);
379 bool savePng(
const QString& path,
int width = 1200,
int height = 800,
380 const QString& surfaceType = QStringLiteral(
"pial"));
386 void showSingleView();
392 void showMultiView();
401 void setViewCount(
int count);
418 void setViewportEnabled(
int index,
bool enabled);
426 void setViewportCameraPreset(
int index,
int preset);
431 void resetSingleViewCameraState();
438 void resetViewportCameraState(
int index);
447 void resetAllSubViewState();
455 int viewportCameraPreset(
int index)
const;
460 void resetMultiViewLayout();
467 void setVisualizationEditTarget(
int target);
474 int visualizationEditTarget()
const;
479 QString activeSurfaceForTarget(
int target)
const;
484 QString shaderModeForTarget(
int target)
const;
489 QString bemShaderModeForTarget(
int target)
const;
494 QString overlayModeForTarget(
int target)
const;
503 bool objectVisibleForTarget(
const QString&
object,
int target)
const;
511 bool megFieldMapOnHeadForTarget(
int target)
const;
519 bool isViewportEnabled(
int index)
const;
527 void setInfoPanelVisible(
bool visible);
537 return m_infoPanelVisible;
559 bool loadSourceEstimate(
const QString& lhPath,
const QString& rhPath);
568 bool loadSensors(
const QString& fifPath);
577 QMap<int, QVector3D> cardinalFiducialsInMri()
const;
588 bool bemTopVertexInMri(QVector3D& pos)
const;
597 bool loadDipoles(
const QString& dipPath);
606 bool loadSourceSpace(
const QString& fwdPath);
619 static QStringList probeEvokedSets(
const QString& evokedPath);
628 bool loadSensorField(
const QString& evokedPath,
int aveIndex = 0);
636 void setSourceSpaceVisible(
bool visible);
645 bool loadTransformation(
const QString& transPath);
653 void setTimePoint(
int index);
661 void castRay(
const QPoint& pos);
669 void setSourceColormap(
const QString& name);
679 void setSourceThresholds(
float min,
float mid,
float max);
687 void setSensorFieldTimePoint(
int index);
696 void setSensorFieldVisible(
const QString& type,
bool visible);
705 void setSensorFieldContourVisible(
const QString& type,
bool visible);
713 void setMegFieldMapOnHead(
bool useHead);
721 void setSensorFieldColormap(
const QString& name);
729 float stcStep()
const;
737 float stcTmin()
const;
745 int stcNumTimePoints()
const;
754 int closestSensorFieldIndex(
float timeSec)
const;
763 int closestStcIndex(
float timeSec)
const;
771 void startRealtimeStreaming();
777 void stopRealtimeStreaming();
785 bool isRealtimeStreaming()
const;
794 void pushRealtimeSourceData(
const Eigen::VectorXd& matData);
802 void setRealtimeInterval(
int msec);
810 void setRealtimeLooping(
bool enabled);
820 bool sensorFieldTimeRange(
float& tmin,
float& tmax)
const;
836 void startRealtimeSensorStreaming(
const QString& modality = QStringLiteral(
"MEG"));
842 void stopRealtimeSensorStreaming();
850 bool isRealtimeSensorStreaming()
const;
860 void pushRealtimeSensorData(
const Eigen::VectorXf& vecData);
868 void setRealtimeSensorInterval(
int msec);
876 void setRealtimeSensorLooping(
bool enabled);
884 void setRealtimeSensorAverages(
int numAvr);
892 void setRealtimeSensorColormap(
const QString& name);
899 void clearSurfaces();
909 void clearSourceEstimate();
919 void clearSourceSpace();
934 void setLiveMarkers(
const QVector<LiveMarker>& markers);
937 void clearLiveMarkers();
947 void setLiveRay(
const QVector3D& from,
const QVector3D& to,
948 const QColor& color,
float radius = 0.001f);
966 void setProbeVisualization(
const QVector3D& tip,
const QVector3D& direction,
967 float length,
const QColor& color,
968 const QColor& glowColor = QColor(0, 0, 0, 0),
969 const QQuaternion& orientation = QQuaternion(0, 0, 0, 0));
972 void clearProbeVisualization();
978 void setStaticMarkers(
const QVector<LiveMarker>& markers);
981 void clearStaticMarkers();
987 void setCameraFocusOverride(
const QVector3D& center,
float size);
990 void clearCameraFocusOverride();
1000 void clearTransformation();
1005 void clearNetwork();
1011 void stopAllStreaming();
1021 void setVideoOverlayEnabled(
bool enabled);
1024 bool isVideoOverlayEnabled()
const;
1027 void setVideoOverlayFocusPosition(
const QVector3D& position);
1030 void setVideoOverlayUpHint(
const QVector3D& dir);
1033 void setVideoOverlaySize(
float meters);
1036 void setVideoOverlayOpacity(
float opacity);
1039 void pushVideoOverlayFrame(
const QImage& frame);
1042 void setVideoDepthEnabled(
bool enabled);
1045 void setVideoDepthScale(
float scale);
1048 void setVideoDepthSteps(
int steps);
1051 void pushVideoDepthFrame(
const QImage& depthFrame);
1064 bool intersectWorldRay(
const QVector3D& origin,
const QVector3D& direction, QVector3D& hitPoint)
const;
1084 void setSliceVisible(
int slotIndex,
bool visible);
1091 void setMriSlicesVisible(
bool visible);
1204 void onSourceEstimateLoaded(
int numTimePoints);
1214 void onRealtimeColorsAvailable(
const QVector<uint32_t>& colorsLh,
1215 const QVector<uint32_t>& colorsRh);
1219 void onSensorStreamColorsAvailable(
const QString& surfaceKey,
1220 const QVector<uint32_t>& colors);
1227 SubView& subViewForTarget(
int target);
1228 const SubView& subViewForTarget(
int target)
const;
1233 void refreshSensorTransforms();
1234 QMatrix4x4 itemTransform(
const QStandardItem* item)
const;
1235 void removeSurfacesByPrefix(
const QStringList& prefixes);
1238 void initialize(QRhiCommandBuffer* cb)
override;
1239 void render(QRhiCommandBuffer* cb)
override;
1245 void wheelEvent(QWheelEvent* event)
override;
1251 QVector<int> enabledViewportIndices()
const;
1252 int enabledViewportCount()
const;
1253 int viewportIndexAt(
const QPoint& pos)
const;
1254 QRect multiViewSlotRect(
int slot,
int numEnabled,
const QSize& outputSize)
const;
1255 SplitterHit hitTestSplitter(
const QPoint& pos,
int numEnabled,
const QSize& outputSize)
const;
1258 void updateSplitterCursor(
const QPoint& pos);
1259 void updateViewportSeparators();
1260 void updateOverlayLayout();
1261 void updateViewportLabelHighlight();
1262 void showViewportPresetMenu(
int viewport,
const QPoint& globalPos);
1263 void logPerspectiveRotation(
const QString& context)
const;
1264 void loadMultiViewSettings();
1265 void saveMultiViewSettings()
const;
1266 void updateInflatedSurfaceTransforms();
1269 std::unique_ptr<BrainRenderer> m_renderer;
1272 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
1273 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
1275 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
1276 std::shared_ptr<BrainSurface> m_activeSurface;
1277 QString m_activeSurfaceType;
1280 static constexpr int kDefaultViewportCount = 4;
1282 QVector<SubView> m_subViews;
1283 int m_visualizationEditTarget = -1;
1289 bool m_lightingEnabled =
true;
1299 QQuaternion m_cameraRotation;
1300 QVector3D m_sceneCenter = QVector3D(0, 0, 0);
1301 float m_sceneSize = 0.3f;
1302 bool m_cameraFocusOverride =
false;
1303 QVector3D m_cameraFocusCenter;
1304 float m_cameraFocusSize = 0.3f;
1305 QPoint m_lastMousePos;
1306 QTimer* m_pAutoRotateTimer =
nullptr;
1309 int m_frameCount = 0;
1310 QElapsedTimer m_fpsTimer;
1311 QLabel* m_fpsLabel =
nullptr;
1312 QLabel* m_singleViewInfoLabel =
nullptr;
1313 bool m_sceneDirty =
true;
1314 qint64 m_cachedVertexCount = 0;
1315 bool m_vertexCountDirty =
true;
1316 bool m_infoPanelVisible =
true;
1319 std::unique_ptr<DipoleObject> m_dipoles;
1320 std::unique_ptr<NetworkObject> m_network;
1321 std::unique_ptr<PolylineObject> m_headPath;
1322 std::unique_ptr<DISP3DLIB::VideoOverlay> m_videoOverlay;
1325 static constexpr int kMaxSliceSlots = 3;
1327 bool m_sliceVisible[kMaxSliceSlots] = {
true,
true,
true};
1330 void updateSceneBounds();
1334 QList<FIFFLIB::FiffDigPoint> m_cardinalDigPoints;
1335 bool m_applySensorTrans =
true;
1336 QString m_megHelmetOverridePath;
1337 QMatrix4x4 m_devHeadTrans;
1338 bool m_hasDevHead =
false;
1339 bool m_dipolesVisible =
true;
1340 bool m_networkVisible =
false;
1343 QStandardItem* m_hoveredItem =
nullptr;
1344 int m_hoveredIndex = -1;
1345 QString m_hoveredRegion;
1346 QString m_hoveredSurfaceKey;
1347 QLabel* m_regionLabel =
nullptr;
1348 QVector<QLabel*> m_viewportNameLabels;
1349 QVector<QLabel*> m_viewportInfoLabels;
1352 std::shared_ptr<BrainSurface> m_debugPointerSurface;
1353 QVector3D m_lastIntersectionPoint;
1354 bool m_hasIntersection =
false;
1358 ViewMode m_viewMode = SingleView;
1359 int m_viewCount = 1;
1360 float m_multiSplitX = 0.5f;
1361 float m_multiSplitY = 0.5f;
1362 bool m_isDraggingSplitter =
false;
1363 SplitterHit m_activeSplitter = SplitterHit::None;
1364 int m_splitterHitTolerancePx = 6;
1365 int m_splitterMinPanePx = 80;
1366 int m_separatorLinePx = 2;
1367 QFrame* m_verticalSeparator =
nullptr;
1368 QFrame* m_horizontalSeparator =
nullptr;
1369 bool m_perspectiveRotatedSincePress =
false;
1370 bool m_draggedSincePress =
false;