v2.0.0
Loading...
Searching...
No Matches
brainsurface.h
Go to the documentation of this file.
1//=============================================================================================================
34
35#ifndef BRAINSURFACE_H
36#define BRAINSURFACE_H
37
38//=============================================================================================================
39// INCLUDES
40//=============================================================================================================
41
43
44#include "../core/rendertypes.h"
45
46#include <QVector>
47#include <QVector3D>
48#include <QColor>
49#include <memory>
50#include <vector>
51#include <fs/surface.h>
52#include <fs/annotation.h>
53#include <mne/mne_bem.h>
54
55#include <Eigen/Core>
56
57// Forward-declare QRhi types so that this header stays QRhi-free
58class QRhi;
59class QRhiBuffer;
60class QRhiResourceUpdateBatch;
61
62//=============================================================================================================
63// STRUCTS
64//=============================================================================================================
65
69struct VertexData {
70 QVector3D pos;
71 QVector3D norm;
72 uint32_t color; // curvature / base / STC color (ABGR packed)
73 uint32_t colorAnnotation; // annotation region color (ABGR packed)
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::Surface &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::Annotation &annotation);
215
216 //=========================================================================================================
222 void setVisualizationMode(VisualizationMode mode);
223
224 //=========================================================================================================
230 void applySourceEstimateColors(const QVector<uint32_t> &colors);
231
232 //=========================================================================================================
239 void updateBuffers(QRhi *rhi, QRhiResourceUpdateBatch *u);
240
241 QRhiBuffer* vertexBuffer() const;
242 QRhiBuffer* indexBuffer() const;
243 uint32_t indexCount() const { return m_indexCount; }
244 uint32_t vertexCount() const { return m_vertexData.size(); }
245
246 //=========================================================================================================
250 Eigen::MatrixX3f vertexPositions() const;
251
252 //=========================================================================================================
256 Eigen::MatrixX3f vertexNormals() const;
257
258 //=========================================================================================================
262 QVector<uint32_t> triangleIndices() const { return m_indexData; }
263
264 //=========================================================================================================
270 float minX() const;
271
272 //=========================================================================================================
278 float maxX() const;
279
280 //=========================================================================================================
287 void boundingBox(QVector3D &min, QVector3D &max) const;
288
289 //=========================================================================================================
301 bool intersects(const QVector3D &rayOrigin, const QVector3D &rayDir, float &dist, int &vertexIdx) const;
302
303 //=========================================================================================================
310 QString getAnnotationLabel(int vertexIdx) const;
311 int getAnnotationLabelId(int vertexIdx) const;
312
313 //=========================================================================================================
319 void setSelectedRegion(int regionId);
325 void translateX(float offset);
326
327 //=========================================================================================================
333 void transform(const QMatrix4x4 &m);
334
335 //=========================================================================================================
342 void applyTransform(const QMatrix4x4 &m);
343
344 //=========================================================================================================
351 std::vector<Eigen::VectorXi> computeNeighbors() const;
352
353 //=========================================================================================================
359 Eigen::MatrixX3f verticesAsMatrix() const;
360
361 //=========================================================================================================
365 void setUseDefaultColor(bool useDefault);
366
367 void setSelected(bool selected);
368 bool isSelected() const { return m_selected; }
369
377 void setSelectedVertexRange(int start, int count);
378
379private:
380 void updateVertexColors();
381
382 QVector<VertexData> m_vertexData;
383 QVector<VertexData> m_originalVertexData;
384 QVector<uint32_t> m_indexData;
385 uint32_t m_indexCount = 0;
386
387 QColor m_defaultColor = Qt::white;
388 QColor m_baseColor = Qt::white;
389
390 FSLIB::Annotation m_annotation;
391 bool m_hasAnnotation = false;
392 VisualizationMode m_visMode = ModeSurface;
393 QVector<float> m_curvature;
394 QVector<uint32_t> m_stcColors;
395
396 bool m_visible = true;
397 bool m_selected = false;
398 int m_selectedRegionId = -1;
399 int m_selectedVertexStart = -1;
400 int m_selectedVertexCount = 0;
401 int m_hemi = -1; // 0=lh, 1=rh
402 TissueType m_tissueType = TissueUnknown;
403
405 struct GpuBuffers;
406 std::unique_ptr<GpuBuffers> m_gpu;
407
408 mutable QVector3D m_aabbMin;
409 mutable QVector3D m_aabbMax;
410 mutable bool m_bAABBDirty = true;
411};
412
413#endif // BRAINSURFACE_H
disp3D_rhi library export/import macros.
#define DISP3DRHISHARED_EXPORT
Lightweight render-related enums shared across the disp3D_rhi library.
VisualizationMode
Definition rendertypes.h:90
@ ModeSurface
Definition rendertypes.h:91
MNEBem class declaration.
Annotation class declaration.
Surface class declaration.
Interleaved vertex attributes (position, normal, color, curvature) for brain surface GPU upload.
uint32_t colorAnnotation
QVector3D norm
QVector3D pos
uint32_t color
uint32_t indexCount() const
void setHemi(int hemi)
TissueType tissueType() const
static constexpr VisualizationMode ModeAnnotation
static constexpr VisualizationMode ModeScientific
::VisualizationMode VisualizationMode
bool isSelected() const
static constexpr VisualizationMode ModeSourceEstimate
QVector< uint32_t > triangleIndices() const
uint32_t vertexCount() const
int hemi() const
void setTissueType(TissueType type)
bool isVisible() const
static constexpr VisualizationMode ModeSurface
Free surfer annotation.
Definition annotation.h:81
FreeSurfer surface mesh.
Definition surface.h:76
BEM surface provides geometry information.