105 explicit BrainView(QWidget *parent =
nullptr);
128 void setInitialCameraRotation(
const QQuaternion &rotation);
131 void onRowsInserted(
const QModelIndex &parent,
int first,
int last);
132 void onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QVector<int> &roles);
139 void setActiveSurface(
const QString &type);
147 void setShaderMode(
const QString &mode);
155 void setBemShaderMode(
const QString &mode);
160 void syncBemShadersToBrainShaders();
168 void setVisualizationMode(
const QString &mode);
177 void setHemiVisible(
int hemiIdx,
bool visible);
186 void setBemVisible(
const QString &name,
bool visible);
194 void setBemHighContrast(
bool enabled);
203 void setSensorVisible(
const QString &type,
bool visible);
211 void setSensorTransEnabled(
bool enabled);
219 void setMegHelmetOverride(
const QString &path);
231 bool loadMegHelmetSurface(
const QString &helmetFilePath);
239 void setDipoleVisible(
bool visible);
257 void setNetworkVisible(
bool visible);
265 void setNetworkThreshold(
double threshold);
273 void setNetworkColormap(
const QString &name);
281 void setLightingEnabled(
bool enabled);
293 void showSingleView();
299 void showMultiView();
308 void setViewCount(
int count);
322 void setViewportEnabled(
int index,
bool enabled);
330 void setViewportCameraPreset(
int index,
int preset);
338 int viewportCameraPreset(
int index)
const;
343 void resetMultiViewLayout();
350 void setVisualizationEditTarget(
int target);
357 int visualizationEditTarget()
const;
362 QString activeSurfaceForTarget(
int target)
const;
367 QString shaderModeForTarget(
int target)
const;
372 QString bemShaderModeForTarget(
int target)
const;
377 QString overlayModeForTarget(
int target)
const;
386 bool objectVisibleForTarget(
const QString &
object,
int target)
const;
394 bool megFieldMapOnHeadForTarget(
int target)
const;
402 bool isViewportEnabled(
int index)
const;
410 void setInfoPanelVisible(
bool visible);
436 bool loadSourceEstimate(
const QString &lhPath,
const QString &rhPath);
445 bool loadSensors(
const QString &fifPath);
454 bool loadDipoles(
const QString &dipPath);
463 bool loadSourceSpace(
const QString &fwdPath);
476 static QStringList probeEvokedSets(
const QString &evokedPath);
485 bool loadSensorField(
const QString &evokedPath,
int aveIndex = 0);
493 void setSourceSpaceVisible(
bool visible);
502 bool loadTransformation(
const QString &transPath);
510 void setTimePoint(
int index);
518 void castRay(
const QPoint &pos);
526 void setSourceColormap(
const QString &name);
536 void setSourceThresholds(
float min,
float mid,
float max);
544 void setSensorFieldTimePoint(
int index);
553 void setSensorFieldVisible(
const QString &type,
bool visible);
562 void setSensorFieldContourVisible(
const QString &type,
bool visible);
570 void setMegFieldMapOnHead(
bool useHead);
578 void setSensorFieldColormap(
const QString &name);
586 float stcStep()
const;
594 float stcTmin()
const;
602 int stcNumTimePoints()
const;
611 int closestSensorFieldIndex(
float timeSec)
const;
620 int closestStcIndex(
float timeSec)
const;
628 void startRealtimeStreaming();
634 void stopRealtimeStreaming();
642 bool isRealtimeStreaming()
const;
651 void pushRealtimeSourceData(
const Eigen::VectorXd &data);
659 void setRealtimeInterval(
int msec);
667 void setRealtimeLooping(
bool enabled);
677 bool sensorFieldTimeRange(
float &tmin,
float &tmax)
const;
693 void startRealtimeSensorStreaming(
const QString &modality = QStringLiteral(
"MEG"));
699 void stopRealtimeSensorStreaming();
707 bool isRealtimeSensorStreaming()
const;
717 void pushRealtimeSensorData(
const Eigen::VectorXf &data);
725 void setRealtimeSensorInterval(
int msec);
733 void setRealtimeSensorLooping(
bool enabled);
741 void setRealtimeSensorAverages(
int numAvr);
749 void setRealtimeSensorColormap(
const QString &name);
829 void onSourceEstimateLoaded(
int numTimePoints);
839 void onRealtimeColorsAvailable(
const QVector<uint32_t> &colorsLh,
840 const QVector<uint32_t> &colorsRh);
844 void onSensorStreamColorsAvailable(
const QString &surfaceKey,
845 const QVector<uint32_t> &colors);
852 SubView& subViewForTarget(
int target);
853 const SubView& subViewForTarget(
int target)
const;
858 void refreshSensorTransforms();
861 void initialize(QRhiCommandBuffer *cb)
override;
862 void render(QRhiCommandBuffer *cb)
override;
873 QVector<int> enabledViewportIndices()
const;
874 int enabledViewportCount()
const;
875 int viewportIndexAt(
const QPoint& pos)
const;
876 QRect multiViewSlotRect(
int slot,
int numEnabled,
const QSize& outputSize)
const;
877 SplitterHit hitTestSplitter(
const QPoint& pos,
int numEnabled,
const QSize& outputSize)
const;
880 void updateSplitterCursor(
const QPoint& pos);
881 void updateViewportSeparators();
882 void updateOverlayLayout();
883 void updateViewportLabelHighlight();
884 void showViewportPresetMenu(
int viewport,
const QPoint &globalPos);
885 void logPerspectiveRotation(
const QString& context)
const;
886 void loadMultiViewSettings();
887 void saveMultiViewSettings()
const;
888 void updateInflatedSurfaceTransforms();
891 std::unique_ptr<BrainRenderer> m_renderer;
894 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
895 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
897 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
898 std::shared_ptr<BrainSurface> m_activeSurface;
899 QString m_activeSurfaceType;
902 static constexpr int kDefaultViewportCount = 4;
904 QVector<SubView> m_subViews;
905 int m_visualizationEditTarget = -1;
911 bool m_lightingEnabled =
true;
921 QQuaternion m_cameraRotation;
922 QVector3D m_sceneCenter = QVector3D(0, 0, 0);
923 float m_sceneSize = 0.3f;
925 QPoint m_lastMousePos;
928 int m_frameCount = 0;
929 QElapsedTimer m_fpsTimer;
930 QLabel *m_fpsLabel =
nullptr;
931 QLabel *m_singleViewInfoLabel =
nullptr;
932 QTimer *m_updateTimer =
nullptr;
933 int m_snapshotCounter = 0;
934 bool m_infoPanelVisible =
true;
937 std::unique_ptr<DipoleObject> m_dipoles;
938 std::unique_ptr<NetworkObject> m_network;
941 void updateSceneBounds();
945 bool m_applySensorTrans =
true;
946 QString m_megHelmetOverridePath;
947 QMatrix4x4 m_devHeadTrans;
948 bool m_hasDevHead =
false;
949 bool m_dipolesVisible =
true;
950 bool m_networkVisible =
false;
953 QStandardItem* m_hoveredItem =
nullptr;
954 int m_hoveredIndex = -1;
955 QString m_hoveredRegion;
956 QString m_hoveredSurfaceKey;
957 QLabel* m_regionLabel =
nullptr;
958 QVector<QLabel*> m_viewportNameLabels;
959 QVector<QLabel*> m_viewportInfoLabels;
962 std::shared_ptr<BrainSurface> m_debugPointerSurface;
963 QVector3D m_lastIntersectionPoint;
964 bool m_hasIntersection =
false;
971 float m_multiSplitX = 0.5f;
972 float m_multiSplitY = 0.5f;
973 bool m_isDraggingSplitter =
false;
975 int m_splitterHitTolerancePx = 6;
976 int m_splitterMinPanePx = 80;
977 int m_separatorLinePx = 2;
978 QFrame* m_verticalSeparator =
nullptr;
979 QFrame* m_horizontalSeparator =
nullptr;
980 bool m_perspectiveRotatedSincePress =
false;