111 explicit BrainView(QWidget *parent =
nullptr);
134 void setInitialCameraRotation(
const QQuaternion &rotation);
137 void onRowsInserted(
const QModelIndex &parent,
int first,
int last);
138 void onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QVector<int> &roles);
145 void setActiveSurface(
const QString &type);
153 void setShaderMode(
const QString &mode);
161 void setBemShaderMode(
const QString &mode);
166 void syncBemShadersToBrainShaders();
174 void setVisualizationMode(
const QString &mode);
183 void setHemiVisible(
int hemiIdx,
bool visible);
192 void setBemVisible(
const QString &name,
bool visible);
200 void setBemHighContrast(
bool enabled);
209 void setSensorVisible(
const QString &type,
bool visible);
217 void setSensorTransEnabled(
bool enabled);
225 void setMegHelmetOverride(
const QString &path);
237 bool loadMegHelmetSurface(
const QString &helmetFilePath);
245 void setDipoleVisible(
bool visible);
263 void setNetworkVisible(
bool visible);
271 void setNetworkThreshold(
double threshold);
279 void setNetworkColormap(
const QString &name);
287 void setLightingEnabled(
bool enabled);
310 bool savePng(
const QString &path,
int width = 1200,
int height = 800,
311 const QString &surfaceType = QStringLiteral(
"pial"));
317 void showSingleView();
323 void showMultiView();
332 void setViewCount(
int count);
346 void setViewportEnabled(
int index,
bool enabled);
354 void setViewportCameraPreset(
int index,
int preset);
359 void resetSingleViewCameraState();
366 void resetViewportCameraState(
int index);
375 void resetAllSubViewState();
383 int viewportCameraPreset(
int index)
const;
388 void resetMultiViewLayout();
395 void setVisualizationEditTarget(
int target);
402 int visualizationEditTarget()
const;
407 QString activeSurfaceForTarget(
int target)
const;
412 QString shaderModeForTarget(
int target)
const;
417 QString bemShaderModeForTarget(
int target)
const;
422 QString overlayModeForTarget(
int target)
const;
431 bool objectVisibleForTarget(
const QString &
object,
int target)
const;
439 bool megFieldMapOnHeadForTarget(
int target)
const;
447 bool isViewportEnabled(
int index)
const;
455 void setInfoPanelVisible(
bool visible);
481 bool loadSourceEstimate(
const QString &lhPath,
const QString &rhPath);
490 bool loadSensors(
const QString &fifPath);
499 QMap<int, QVector3D> cardinalFiducialsInMri()
const;
510 bool bemTopVertexInMri(QVector3D& pos)
const;
519 bool loadDipoles(
const QString &dipPath);
528 bool loadSourceSpace(
const QString &fwdPath);
541 static QStringList probeEvokedSets(
const QString &evokedPath);
550 bool loadSensorField(
const QString &evokedPath,
int aveIndex = 0);
558 void setSourceSpaceVisible(
bool visible);
567 bool loadTransformation(
const QString &transPath);
575 void setTimePoint(
int index);
583 void castRay(
const QPoint &pos);
591 void setSourceColormap(
const QString &name);
601 void setSourceThresholds(
float min,
float mid,
float max);
609 void setSensorFieldTimePoint(
int index);
618 void setSensorFieldVisible(
const QString &type,
bool visible);
627 void setSensorFieldContourVisible(
const QString &type,
bool visible);
635 void setMegFieldMapOnHead(
bool useHead);
643 void setSensorFieldColormap(
const QString &name);
651 float stcStep()
const;
659 float stcTmin()
const;
667 int stcNumTimePoints()
const;
676 int closestSensorFieldIndex(
float timeSec)
const;
685 int closestStcIndex(
float timeSec)
const;
693 void startRealtimeStreaming();
699 void stopRealtimeStreaming();
707 bool isRealtimeStreaming()
const;
716 void pushRealtimeSourceData(
const Eigen::VectorXd &data);
724 void setRealtimeInterval(
int msec);
732 void setRealtimeLooping(
bool enabled);
742 bool sensorFieldTimeRange(
float &tmin,
float &tmax)
const;
758 void startRealtimeSensorStreaming(
const QString &modality = QStringLiteral(
"MEG"));
764 void stopRealtimeSensorStreaming();
772 bool isRealtimeSensorStreaming()
const;
782 void pushRealtimeSensorData(
const Eigen::VectorXf &data);
790 void setRealtimeSensorInterval(
int msec);
798 void setRealtimeSensorLooping(
bool enabled);
806 void setRealtimeSensorAverages(
int numAvr);
814 void setRealtimeSensorColormap(
const QString &name);
821 void clearSurfaces();
831 void clearSourceEstimate();
841 void clearSourceSpace();
856 void setLiveMarkers(
const QVector<LiveMarker>& markers);
859 void clearLiveMarkers();
869 void setLiveRay(
const QVector3D& from,
const QVector3D& to,
870 const QColor& color,
float radius = 0.001f);
888 void setProbeVisualization(
const QVector3D& tip,
const QVector3D& direction,
889 float length,
const QColor& color,
890 const QColor& glowColor = QColor(0, 0, 0, 0),
891 const QQuaternion& orientation = QQuaternion(0, 0, 0, 0));
894 void clearProbeVisualization();
900 void setStaticMarkers(
const QVector<LiveMarker>& markers);
903 void clearStaticMarkers();
909 void setCameraFocusOverride(
const QVector3D& center,
float size);
912 void clearCameraFocusOverride();
922 void clearTransformation();
933 void stopAllStreaming();
943 void setVideoOverlayEnabled(
bool enabled);
946 bool isVideoOverlayEnabled()
const;
949 void setVideoOverlayFocusPosition(
const QVector3D &position);
952 void setVideoOverlayUpHint(
const QVector3D &dir);
955 void setVideoOverlaySize(
float meters);
958 void setVideoOverlayOpacity(
float opacity);
961 void pushVideoOverlayFrame(
const QImage &frame);
964 void setVideoDepthEnabled(
bool enabled);
967 void setVideoDepthScale(
float scale);
970 void setVideoDepthSteps(
int steps);
973 void pushVideoDepthFrame(
const QImage &depthFrame);
986 bool intersectWorldRay(
const QVector3D& origin,
const QVector3D& direction, QVector3D& hitPoint)
const;
1006 void setSliceVisible(
int slotIndex,
bool visible);
1013 void setMriSlicesVisible(
bool visible);
1126 void onSourceEstimateLoaded(
int numTimePoints);
1136 void onRealtimeColorsAvailable(
const QVector<uint32_t> &colorsLh,
1137 const QVector<uint32_t> &colorsRh);
1141 void onSensorStreamColorsAvailable(
const QString &surfaceKey,
1142 const QVector<uint32_t> &colors);
1149 SubView& subViewForTarget(
int target);
1150 const SubView& subViewForTarget(
int target)
const;
1155 void refreshSensorTransforms();
1156 void removeSurfacesByPrefix(
const QString &prefix);
1159 void initialize(QRhiCommandBuffer *cb)
override;
1160 void render(QRhiCommandBuffer *cb)
override;
1166 void wheelEvent(QWheelEvent *event)
override;
1172 QVector<int> enabledViewportIndices()
const;
1173 int enabledViewportCount()
const;
1174 int viewportIndexAt(
const QPoint& pos)
const;
1175 QRect multiViewSlotRect(
int slot,
int numEnabled,
const QSize& outputSize)
const;
1176 SplitterHit hitTestSplitter(
const QPoint& pos,
int numEnabled,
const QSize& outputSize)
const;
1179 void updateSplitterCursor(
const QPoint& pos);
1180 void updateViewportSeparators();
1181 void updateOverlayLayout();
1182 void updateViewportLabelHighlight();
1183 void showViewportPresetMenu(
int viewport,
const QPoint &globalPos);
1184 void logPerspectiveRotation(
const QString& context)
const;
1185 void loadMultiViewSettings();
1186 void saveMultiViewSettings()
const;
1187 void updateInflatedSurfaceTransforms();
1190 std::unique_ptr<BrainRenderer> m_renderer;
1193 QMap<const QStandardItem*, std::shared_ptr<BrainSurface>> m_itemSurfaceMap;
1194 QMap<const QStandardItem*, std::shared_ptr<DipoleObject>> m_itemDipoleMap;
1196 QMap<QString, std::shared_ptr<BrainSurface>> m_surfaces;
1197 std::shared_ptr<BrainSurface> m_activeSurface;
1198 QString m_activeSurfaceType;
1201 static constexpr int kDefaultViewportCount = 4;
1203 QVector<SubView> m_subViews;
1204 int m_visualizationEditTarget = -1;
1210 bool m_lightingEnabled =
true;
1220 QQuaternion m_cameraRotation;
1221 QVector3D m_sceneCenter = QVector3D(0, 0, 0);
1222 float m_sceneSize = 0.3f;
1223 bool m_cameraFocusOverride =
false;
1224 QVector3D m_cameraFocusCenter;
1225 float m_cameraFocusSize = 0.3f;
1226 float m_zoom = 0.0f;
1227 QPoint m_lastMousePos;
1230 int m_frameCount = 0;
1231 QElapsedTimer m_fpsTimer;
1232 QLabel *m_fpsLabel =
nullptr;
1233 QLabel *m_singleViewInfoLabel =
nullptr;
1234 bool m_sceneDirty =
true;
1235 qint64 m_cachedVertexCount = 0;
1236 bool m_vertexCountDirty =
true;
1237 int m_snapshotCounter = 0;
1238 bool m_infoPanelVisible =
true;
1241 std::unique_ptr<DipoleObject> m_dipoles;
1242 std::unique_ptr<NetworkObject> m_network;
1243 std::unique_ptr<DISP3DLIB::VideoOverlay> m_videoOverlay;
1246 static constexpr int kMaxSliceSlots = 3;
1248 bool m_sliceVisible[kMaxSliceSlots] = {
true,
true,
true};
1251 void updateSceneBounds();
1254 FIFFLIB::FiffCoordTrans m_headToMriTrans;
1255 QList<FIFFLIB::FiffDigPoint> m_cardinalDigPoints;
1256 bool m_applySensorTrans =
true;
1257 QString m_megHelmetOverridePath;
1258 QMatrix4x4 m_devHeadTrans;
1259 bool m_hasDevHead =
false;
1260 bool m_dipolesVisible =
true;
1261 bool m_networkVisible =
false;
1264 QStandardItem* m_hoveredItem =
nullptr;
1265 int m_hoveredIndex = -1;
1266 QString m_hoveredRegion;
1267 QString m_hoveredSurfaceKey;
1268 QLabel* m_regionLabel =
nullptr;
1269 QVector<QLabel*> m_viewportNameLabels;
1270 QVector<QLabel*> m_viewportInfoLabels;
1273 std::shared_ptr<BrainSurface> m_debugPointerSurface;
1274 QVector3D m_lastIntersectionPoint;
1275 bool m_hasIntersection =
false;
1280 ViewMode m_viewMode = SingleView;
1281 int m_viewCount = 1;
1282 float m_multiSplitX = 0.5f;
1283 float m_multiSplitY = 0.5f;
1284 bool m_isDraggingSplitter =
false;
1286 int m_splitterHitTolerancePx = 6;
1287 int m_splitterMinPanePx = 80;
1288 int m_separatorLinePx = 2;
1289 QFrame* m_verticalSeparator =
nullptr;
1290 QFrame* m_horizontalSeparator =
nullptr;
1291 bool m_perspectiveRotatedSincePress =
false;