21#include <QMutexLocker>
40 QMutexLocker locker(&m_mutex);
43 if (m_lDataQ.size() <
static_cast<int>(m_dSFreq)) {
44 m_lDataQ.append(data);
49 m_lDataLoopQ.append(data);
51 if (m_lDataLoopQ.size() >
static_cast<int>(m_dSFreq) * 10) {
52 m_lDataLoopQ.removeFirst();
61 QMutexLocker locker(&m_mutex);
64 m_vecAverage = Eigen::VectorXf();
73 QMutexLocker locker(&m_mutex);
81 QMutexLocker locker(&m_mutex);
82 m_iNumAverages = qMax(1, numAvr);
89 QMutexLocker locker(&m_mutex);
90 m_sColormapType = name;
97 QMutexLocker locker(&m_mutex);
98 if (min == 0.0 && max == 0.0) {
99 m_bUseAutoNorm =
true;
103 m_bUseAutoNorm =
false;
113 QMutexLocker locker(&m_mutex);
114 m_bIsLooping = enabled;
121 QMutexLocker locker(&m_mutex);
122 m_dSFreq = qMax(1.0, sFreq);
129 QMutexLocker locker(&m_mutex);
130 m_bStreamSmoothedData = bStreamSmoothedData;
137 QMutexLocker locker(&m_mutex);
140 Eigen::VectorXf vecCurrentData;
142 if (!m_lDataQ.isEmpty()) {
143 vecCurrentData = m_lDataQ.takeFirst();
144 }
else if (m_bIsLooping && !m_lDataLoopQ.isEmpty()) {
146 vecCurrentData = m_lDataLoopQ[m_iCurrentSample % m_lDataLoopQ.size()];
154 if (m_iNumAverages > 1) {
155 if (m_vecAverage.size() != vecCurrentData.size()) {
156 m_vecAverage = vecCurrentData;
159 m_vecAverage += vecCurrentData;
163 if (m_iSampleCtr < m_iNumAverages) {
167 vecCurrentData = m_vecAverage /
static_cast<float>(m_iSampleCtr);
168 m_vecAverage = Eigen::VectorXf();
173 if (!m_bStreamSmoothedData) {
175 Eigen::VectorXf rawData = vecCurrentData;
182 QVector<uint32_t> colors = computeSurfaceColors(vecCurrentData);
187 if (!colors.isEmpty()) {
194QVector<uint32_t> RtSensorDataWorker::computeSurfaceColors(
const Eigen::VectorXf &sensorData)
const
196 if (sensorData.size() == 0 || !m_mappingMat || m_mappingMat->rows() == 0) {
197 return QVector<uint32_t>();
201 if (m_mappingMat->cols() != sensorData.size()) {
202 qWarning() <<
"RtSensorDataWorker: Mapping matrix cols" << m_mappingMat->cols()
203 <<
"!= sensor data size" << sensorData.size();
204 return QVector<uint32_t>();
208 Eigen::VectorXf mapped = (*m_mappingMat) * sensorData;
210 int nVertices = mapped.size();
213 float normMin, normMax;
214 if (m_bUseAutoNorm) {
217 for (
int i = 0; i < nVertices; ++i) {
218 maxAbs = std::max(maxAbs, std::abs(mapped(i)));
220 if (maxAbs <= 0.0f) maxAbs = 1.0f;
225 normMin =
static_cast<float>(m_dThreshMin);
226 normMax =
static_cast<float>(m_dThreshMax);
227 if (normMax <= normMin) normMax = normMin + 1.0f;
230 float range = normMax - normMin;
233 QVector<uint32_t> colors(nVertices);
235 for (
int i = 0; i < nVertices; ++i) {
237 double norm =
static_cast<double>(mapped(i) - normMin) /
static_cast<double>(range);
238 norm = qBound(0.0, norm, 1.0);
242 uint32_t r = qRed(rgb);
243 uint32_t g = qGreen(rgb);
244 uint32_t b = qBlue(rgb);
Background worker that turns queued sensor packets into per-vertex ABGR colour buffers via a dense ma...
Lightweight render-related enums (ShaderMode, VisualizationMode) shared across disp3D.
uint32_t packABGR(uint32_t r, uint32_t g, uint32_t b, uint32_t a=0xFF)
Static scalar-to-colour lookup helpers (Jet, Hot, Bone, Viridis, Cool, RedBlue, MNE) used by every pl...
3-D brain visualisation using the Qt RHI rendering backend.
static QRgb valueToColor(double v, const QString &sMap)
void setSFreq(double sFreq)
void newRtSensorColors(const QString &surfaceKey, const QVector< uint32_t > &colors)
void setLoopState(bool enabled)
void setThresholds(double min, double max)
void addData(const Eigen::VectorXf &data)
RtSensorDataWorker(QObject *parent=nullptr)
void setMappingMatrix(std::shared_ptr< Eigen::MatrixXf > mat)
void setColormapType(const QString &name)
void setStreamSmoothedData(bool bStreamSmoothedData)
void setNumberAverages(int numAvr)
void newRtRawSensorData(const Eigen::VectorXf &data)