104 explicit BrainView(QWidget *parent =
nullptr);
127 void setInitialCameraRotation(
const QQuaternion &rotation);
130 void onRowsInserted(
const QModelIndex &parent,
int first,
int last);
131 void onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QVector<int> &roles);
138 void setActiveSurface(
const QString &type);
146 void setShaderMode(
const QString &mode);
154 void setBemShaderMode(
const QString &mode);
159 void syncBemShadersToBrainShaders();
167 void setVisualizationMode(
const QString &mode);
176 void setHemiVisible(
int hemiIdx,
bool visible);
185 void setBemVisible(
const QString &name,
bool visible);
193 void setBemHighContrast(
bool enabled);
202 void setSensorVisible(
const QString &type,
bool visible);
210 void setSensorTransEnabled(
bool enabled);
218 void setMegHelmetOverride(
const QString &path);
230 bool loadMegHelmetSurface(
const QString &helmetFilePath);
238 void setDipoleVisible(
bool visible);
248 bool loadNetwork(
const CONNLIB::Network &network,
const QString &name =
"Network");
256 void setNetworkVisible(
bool visible);
264 void setNetworkThreshold(
double threshold);
272 void setNetworkColormap(
const QString &name);
280 void setLightingEnabled(
bool enabled);
292 void showSingleView();
298 void showMultiView();
307 void setViewCount(
int count);
321 void setViewportEnabled(
int index,
bool enabled);
329 void setViewportCameraPreset(
int index,
int preset);
337 int viewportCameraPreset(
int index)
const;
342 void resetMultiViewLayout();
349 void setVisualizationEditTarget(
int target);
356 int visualizationEditTarget()
const;
361 QString activeSurfaceForTarget(
int target)
const;
366 QString shaderModeForTarget(
int target)
const;
371 QString bemShaderModeForTarget(
int target)
const;
376 QString overlayModeForTarget(
int target)
const;
385 bool objectVisibleForTarget(
const QString &
object,
int target)
const;
393 bool megFieldMapOnHeadForTarget(
int target)
const;
401 bool isViewportEnabled(
int index)
const;
409 void setInfoPanelVisible(
bool visible);
435 bool loadSourceEstimate(
const QString &lhPath,
const QString &rhPath);
444 bool loadSensors(
const QString &fifPath);
453 bool loadDipoles(
const QString &dipPath);
462 bool loadSourceSpace(
const QString &fwdPath);
475 static QStringList probeEvokedSets(
const QString &evokedPath);
484 bool loadSensorField(
const QString &evokedPath,
int aveIndex = 0);
492 void setSourceSpaceVisible(
bool visible);
501 bool loadTransformation(
const QString &transPath);
509 void setTimePoint(
int index);
517 void castRay(
const QPoint &pos);
525 void setSourceColormap(
const QString &name);
535 void setSourceThresholds(
float min,
float mid,
float max);
543 void setSensorFieldTimePoint(
int index);
552 void setSensorFieldVisible(
const QString &type,
bool visible);
561 void setSensorFieldContourVisible(
const QString &type,
bool visible);
569 void setMegFieldMapOnHead(
bool useHead);
577 void setSensorFieldColormap(
const QString &name);
585 float stcStep()
const;
593 float stcTmin()
const;
601 int stcNumTimePoints()
const;
610 int closestSensorFieldIndex(
float timeSec)
const;
619 int closestStcIndex(
float timeSec)
const;
627 void startRealtimeStreaming();
633 void stopRealtimeStreaming();
641 bool isRealtimeStreaming()
const;
650 void pushRealtimeSourceData(
const Eigen::VectorXd &data);
658 void setRealtimeInterval(
int msec);
666 void setRealtimeLooping(
bool enabled);
676 bool sensorFieldTimeRange(
float &tmin,
float &tmax)
const;
692 void startRealtimeSensorStreaming(
const QString &modality = QStringLiteral(
"MEG"));
698 void stopRealtimeSensorStreaming();
706 bool isRealtimeSensorStreaming()
const;
716 void pushRealtimeSensorData(
const Eigen::VectorXf &data);
724 void setRealtimeSensorInterval(
int msec);
732 void setRealtimeSensorLooping(
bool enabled);
740 void setRealtimeSensorAverages(
int numAvr);
748 void setRealtimeSensorColormap(
const QString &name);
755 void clearSurfaces();
765 void clearSourceEstimate();
775 void clearSourceSpace();
790 void clearTransformation();
875 void onSourceEstimateLoaded(
int numTimePoints);
885 void onRealtimeColorsAvailable(
const QVector<uint32_t> &colorsLh,
886 const QVector<uint32_t> &colorsRh);
890 void onSensorStreamColorsAvailable(
const QString &surfaceKey,
891 const QVector<uint32_t> &colors);
898 SubView& subViewForTarget(
int target);
899 const SubView& subViewForTarget(
int target)
const;
904 void refreshSensorTransforms();
905 void removeSurfacesByPrefix(
const QString &prefix);
908 void initialize(QRhiCommandBuffer *cb)
override;
909 void render(QRhiCommandBuffer *cb)
override;
920 QVector<int> enabledViewportIndices()
const;
921 int enabledViewportCount()
const;
922 int viewportIndexAt(
const QPoint& pos)
const;
923 QRect multiViewSlotRect(
int slot,
int numEnabled,
const QSize& outputSize)
const;
924 SplitterHit hitTestSplitter(
const QPoint& pos,
int numEnabled,
const QSize& outputSize)
const;
927 void updateSplitterCursor(
const QPoint& pos);
928 void updateViewportSeparators();
929 void updateOverlayLayout();
930 void updateViewportLabelHighlight();
931 void showViewportPresetMenu(
int viewport,
const QPoint &globalPos);
932 void logPerspectiveRotation(
const QString& context)
const;
933 void loadMultiViewSettings();
934 void saveMultiViewSettings()
const;
935 void updateInflatedSurfaceTransforms();
938 std::unique_ptr<BrainRenderer> m_renderer;
941 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
942 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
944 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
945 std::shared_ptr<BrainSurface> m_activeSurface;
946 QString m_activeSurfaceType;
949 static constexpr int kDefaultViewportCount = 4;
951 QVector<SubView> m_subViews;
952 int m_visualizationEditTarget = -1;
958 bool m_lightingEnabled =
true;
968 QQuaternion m_cameraRotation;
969 QVector3D m_sceneCenter = QVector3D(0, 0, 0);
970 float m_sceneSize = 0.3f;
972 QPoint m_lastMousePos;
975 int m_frameCount = 0;
976 QElapsedTimer m_fpsTimer;
977 QLabel *m_fpsLabel =
nullptr;
978 QLabel *m_singleViewInfoLabel =
nullptr;
979 bool m_sceneDirty =
true;
980 qint64 m_cachedVertexCount = 0;
981 bool m_vertexCountDirty =
true;
982 int m_snapshotCounter = 0;
983 bool m_infoPanelVisible =
true;
986 std::unique_ptr<DipoleObject> m_dipoles;
987 std::unique_ptr<NetworkObject> m_network;
990 void updateSceneBounds();
994 bool m_applySensorTrans =
true;
995 QString m_megHelmetOverridePath;
996 QMatrix4x4 m_devHeadTrans;
997 bool m_hasDevHead =
false;
998 bool m_dipolesVisible =
true;
999 bool m_networkVisible =
false;
1002 QStandardItem* m_hoveredItem =
nullptr;
1003 int m_hoveredIndex = -1;
1004 QString m_hoveredRegion;
1005 QString m_hoveredSurfaceKey;
1006 QLabel* m_regionLabel =
nullptr;
1007 QVector<QLabel*> m_viewportNameLabels;
1008 QVector<QLabel*> m_viewportInfoLabels;
1011 std::shared_ptr<BrainSurface> m_debugPointerSurface;
1012 QVector3D m_lastIntersectionPoint;
1013 bool m_hasIntersection =
false;
1019 int m_viewCount = 1;
1020 float m_multiSplitX = 0.5f;
1021 float m_multiSplitY = 0.5f;
1022 bool m_isDraggingSplitter =
false;
1024 int m_splitterHitTolerancePx = 6;
1025 int m_splitterMinPanePx = 80;
1026 int m_separatorLinePx = 2;
1027 QFrame* m_verticalSeparator =
nullptr;
1028 QFrame* m_horizontalSeparator =
nullptr;
1029 bool m_perspectiveRotatedSincePress =
false;