v2.0.0
Loading...
Searching...
No Matches
brainsurface.h
Go to the documentation of this file.
1//=============================================================================================================
31
32#ifndef BRAINSURFACE_H
33#define BRAINSURFACE_H
34
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
39#include "../disp3D_global.h"
40
41#include "../core/rendertypes.h"
42
43#include <QVector>
44#include <QVector3D>
45#include <QColor>
46#include <memory>
47#include <vector>
48#include <fs/fs_surface.h>
49#include <fs/fs_annotation.h>
50#include <mne/mne_bem.h>
51
52#include <Eigen/Core>
53
54// Forward-declare QRhi types so that this header stays QRhi-free
55class QRhi;
56class QRhiBuffer;
57class QRhiResourceUpdateBatch;
58
59//=============================================================================================================
60// STRUCTS
61//=============================================================================================================
62
66struct VertexData {
67 QVector3D pos;
68 QVector3D norm;
69 uint32_t color; // curvature / base / STC color (ABGR packed)
70 uint32_t colorAnnotation; // annotation region color (ABGR packed)
71 float surfaceId = 0.0f; // WORKAROUND(QRhi-GLES2): surface ID for merged
72 // single-drawIndexed on WASM. Always 0 for
73 // individual surfaces; set by merged path.
74};
75
76//=============================================================================================================
83{
84public:
85 //=========================================================================================================
90
91 //=========================================================================================================
96
97 // VisualizationMode is defined in core/rendertypes.h for lightweight inclusion.
98 // These aliases preserve backward compatibility.
104
108 TissueSkin = 2, // Head/Scalp surface
109 TissueOuterSkull = 3, // Outer skull bone
110 TissueInnerSkull = 4 // Inner skull bone
111 };
112
113 //=========================================================================================================
119 void setVisible(bool visible);
120
121 //=========================================================================================================
127 bool isVisible() const { return m_visible; }
128
129 //=========================================================================================================
135 void setHemi(int hemi) { m_hemi = hemi; }
136
137 //=========================================================================================================
143 void setTissueType(TissueType type) { m_tissueType = type; }
144
145 //=========================================================================================================
151 TissueType tissueType() const { return m_tissueType; }
152
153 //=========================================================================================================
159 int hemi() const { return m_hemi; }
160
161 //=========================================================================================================
167 void fromSurface(const FSLIB::FsSurface &surf);
168
169 //=========================================================================================================
176 void fromBemSurface(const MNELIB::MNEBemSurface &surf, const QColor &color = Qt::white);
177
178 //=========================================================================================================
186 void createFromData(const Eigen::MatrixX3f &vertices, const Eigen::MatrixX3i &triangles, const QColor &color);
187
188 //=========================================================================================================
197 void createFromData(const Eigen::MatrixX3f &vertices, const Eigen::MatrixX3f &normals, const Eigen::MatrixX3i &triangles, const QColor &color);
198
199 //=========================================================================================================
206 bool loadAnnotation(const QString &path);
207
208 //=========================================================================================================
214 void addAnnotation(const FSLIB::FsAnnotation &annotation);
215
216 //=========================================================================================================
222 void setVisualizationMode(VisualizationMode mode);
223
224 //=========================================================================================================
230 void applySourceEstimateColors(const QVector<uint32_t> &colors);
231
235 void clearSourceEstimateColors();
236
237 //=========================================================================================================
244 void updateBuffers(QRhi *rhi, QRhiResourceUpdateBatch *u);
245
246 QRhiBuffer* vertexBuffer() const;
247 QRhiBuffer* indexBuffer() const;
248 uint32_t indexCount() const { return m_indexCount; }
249 uint32_t vertexCount() const { return m_vertexData.size(); }
250
251 //=========================================================================================================
255 Eigen::MatrixX3f vertexPositions() const;
256
257 //=========================================================================================================
261 Eigen::MatrixX3f vertexNormals() const;
262
263 //=========================================================================================================
267 QVector<uint32_t> triangleIndices() const { return m_indexData; }
268
270 const QVector<VertexData>& vertexDataRef() const { return m_vertexData; }
272 const QVector<uint32_t>& indexDataRef() const { return m_indexData; }
273
275 quint64 vertexGeneration() const { return m_vertexGeneration; }
276
277 //=========================================================================================================
283 float minX() const;
284
285 //=========================================================================================================
291 float maxX() const;
292
293 //=========================================================================================================
300 void boundingBox(QVector3D &min, QVector3D &max) const;
301
302 //=========================================================================================================
314 bool intersects(const QVector3D &rayOrigin, const QVector3D &rayDir, float &dist, int &vertexIdx) const;
315
316 //=========================================================================================================
323 QString getAnnotationLabel(int vertexIdx) const;
324 int getAnnotationLabelId(int vertexIdx) const;
325
326 //=========================================================================================================
332 void setSelectedRegion(int regionId);
338 void translateX(float offset);
339
340 //=========================================================================================================
346 void transform(const QMatrix4x4 &m);
347
348 //=========================================================================================================
355 void applyTransform(const QMatrix4x4 &m);
356
357 //=========================================================================================================
364 std::vector<Eigen::VectorXi> computeNeighbors() const;
365
366 //=========================================================================================================
372 Eigen::MatrixX3f verticesAsMatrix() const;
373
374 //=========================================================================================================
378 void setUseDefaultColor(bool useDefault);
379
380 void setSelected(bool selected);
381 bool isSelected() const { return m_selected; }
382 int selectedRegionId() const { return m_selectedRegionId; }
383 int selectedVertexStart() const { return m_selectedVertexStart; }
384
392 void setSelectedVertexRange(int start, int count);
393
394private:
395 void updateVertexColors();
396 void markVertexDirty();
397
398 QVector<VertexData> m_vertexData;
399 QVector<VertexData> m_originalVertexData;
400 QVector<uint32_t> m_indexData;
401 uint32_t m_indexCount = 0;
402
403 QColor m_defaultColor = Qt::white;
404 QColor m_baseColor = Qt::white;
405
406 FSLIB::FsAnnotation m_annotation;
407 bool m_hasAnnotation = false;
408 VisualizationMode m_visMode = ModeSurface;
409 QVector<float> m_curvature;
410 QVector<uint32_t> m_stcColors;
411
412 bool m_visible = true;
413 bool m_selected = false;
414 int m_selectedRegionId = -1;
415 int m_selectedVertexStart = -1;
416 int m_selectedVertexCount = 0;
417 int m_hemi = -1; // 0=lh, 1=rh
418 TissueType m_tissueType = TissueUnknown;
419
421 struct GpuBuffers;
422 std::unique_ptr<GpuBuffers> m_gpu;
423
424 quint64 m_vertexGeneration = 0;
425
426 mutable QVector3D m_aabbMin;
427 mutable QVector3D m_aabbMax;
428 mutable bool m_bAABBDirty = true;
429};
430
431#endif // BRAINSURFACE_H
Lightweight render-related enums (ShaderMode, VisualizationMode) shared across disp3D.
VisualizationMode
Definition rendertypes.h:78
@ ModeSurface
Definition rendertypes.h:79
Library export/import macros and namespace marker for the disp3D library.
#define DISP3DSHARED_EXPORT
Reader and in-memory representation of a single FreeSurfer triangular surface (e.g....
Reader for FreeSurfer per-vertex annotation (parcellation) files such as lh.aparc....
Boundary element model bundle (inner skull, outer skull, outer skin) loaded from -bem....
Interleaved vertex attributes (position, normal, color, curvature) for brain surface GPU upload.
uint32_t colorAnnotation
QVector3D norm
QVector3D pos
uint32_t color
float surfaceId
uint32_t indexCount() const
const QVector< VertexData > & vertexDataRef() const
Const-ref access to CPU-side vertex data (used by merged rendering).
void setHemi(int hemi)
TissueType tissueType() const
static constexpr VisualizationMode ModeAnnotation
static constexpr VisualizationMode ModeScientific
int selectedVertexStart() const
::VisualizationMode VisualizationMode
bool isSelected() const
static constexpr VisualizationMode ModeSourceEstimate
quint64 vertexGeneration() const
Monotonically increasing counter bumped whenever vertex data changes.
QVector< uint32_t > triangleIndices() const
uint32_t vertexCount() const
int hemi() const
const QVector< uint32_t > & indexDataRef() const
Const-ref access to CPU-side index data (used by merged rendering).
int selectedRegionId() const
void setTissueType(TissueType type)
bool isVisible() const
static constexpr VisualizationMode ModeSurface
Single-hemisphere FreeSurfer parcellation: vertex → region label plus embedded colortable.
In-memory FreeSurfer triangular cortical surface for one hemisphere.
Definition fs_surface.h:92
BEM surface provides geometry information.