MNE-CPP  0.1.9
A Framework for Electrophysiology
geometrymultiplier.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "geometrymultiplier.h"
41 
42 //=============================================================================================================
43 // QT INCLUDES
44 //=============================================================================================================
45 
46 #include <Qt3DRender/QGeometry>
47 #include <Qt3DRender/QBuffer>
48 #include <Qt3DRender/QAttribute>
49 
50 #include <Qt3DCore/QNode>
51 
52 #include <QVector3D>
53 #include <QMatrix4x4>
54 #include <QColor>
55 
56 //=============================================================================================================
57 // EIGEN INCLUDES
58 //=============================================================================================================
59 
60 //=============================================================================================================
61 // USED NAMESPACES
62 //=============================================================================================================
63 
64 using namespace DISP3DLIB;
65 using namespace Qt3DRender;
66 
67 //=============================================================================================================
68 // DEFINE GLOBAL METHODS
69 //=============================================================================================================
70 
71 //=============================================================================================================
72 // DEFINE MEMBER METHODS
73 //=============================================================================================================
74 
75 GeometryMultiplier::GeometryMultiplier(QSharedPointer<Qt3DRender::QGeometry> tGeometry,
76  Qt3DCore::QNode *tParent)
77 : QGeometryRenderer(tParent)
78 , m_pGeometry(tGeometry)
79 , m_pTransformBuffer(new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer))
80 , m_pColorBuffer(new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer))
81 , m_pTransformAttribute(new QAttribute())
82 , m_pColorAttribute(new QAttribute())
83 {
84  init();
85 }
86 
87 //=============================================================================================================
88 
90 {
91  m_pGeometry->deleteLater();
92  m_pTransformBuffer->deleteLater();
93  m_pColorBuffer->deleteLater();
94  m_pTransformAttribute->deleteLater();
95  m_pColorAttribute->deleteLater();
96 }
97 
98 //=============================================================================================================#
99 
100 void GeometryMultiplier::setTransforms(const QVector<QMatrix4x4> &tInstanceTansform)
101 {
102  //Update buffer content
103  m_pTransformBuffer->setData(buildTransformBuffer(tInstanceTansform));
104 
105  this->setInstanceCount(tInstanceTansform.size());
106 }
107 
108 //=============================================================================================================#
109 
110 void GeometryMultiplier::setColors(const QVector<QColor> &tInstanceColors)
111 {
112  //Update buffer content
113  m_pColorBuffer->setData(buildColorBuffer(tInstanceColors));
114 
115  if(tInstanceColors.size() > 1) {
116  m_pColorAttribute->setDivisor(1);
117  } else {
118  //enable 1 color for x transforms
119  m_pColorAttribute->setDivisor(0);
120  }
121 
122  this->setInstanceCount(tInstanceColors.size());
123 }
124 
125 //=============================================================================================================
126 
127 void GeometryMultiplier::init()
128 {
129  //Set transform attribute parameter
130  m_pTransformAttribute->setName(QStringLiteral("instanceModelMatrix"));
131  m_pTransformAttribute->setAttributeType(QAttribute::VertexAttribute);
132  m_pTransformAttribute->setVertexBaseType(QAttribute::Float);
133  m_pTransformAttribute->setVertexSize(16);
134  m_pTransformAttribute->setDivisor(1);
135  m_pTransformAttribute->setByteOffset(0);
136  m_pTransformAttribute->setBuffer(m_pTransformBuffer);
137 
138  //Set color attribute parameters
139  m_pColorAttribute->setName(QStringLiteral("instanceColor"));
140  m_pColorAttribute->setAttributeType(QAttribute::VertexAttribute);
141  m_pColorAttribute->setVertexBaseType(QAttribute::Float);
142  m_pColorAttribute->setVertexSize(4);
143 
144  //Set divisor 0 to enable empty color buffer
145  m_pColorAttribute->setDivisor(0);
146  m_pColorAttribute->setByteOffset(0);
147  m_pColorAttribute->setBuffer(m_pColorBuffer);
148 
149  //Set default instance color
150  QVector<QColor> tempColors;
151  tempColors.push_back(QColor(0, 0, 255));
152  setColors(tempColors);
153 
154  //set default transforms
155  QVector<QMatrix4x4> tempTrans;
156  tempTrans.push_back(QMatrix4x4());
157  setTransforms(tempTrans);
158 
159  //Add Attibute to Geometry
160  m_pGeometry->addAttribute(m_pTransformAttribute);
161  m_pGeometry->addAttribute(m_pColorAttribute);
162 
163  //configure geometry renderer
164  this->setPrimitiveType(Qt3DRender::QGeometryRenderer::Triangles);
165  this->setIndexOffset(0);
166  this->setFirstInstance(0);
167  this->setGeometry(m_pGeometry.data());
168 }
169 
170 //=============================================================================================================
171 
172 QByteArray GeometryMultiplier::buildTransformBuffer(const QVector<QMatrix4x4> &tInstanceTransform)
173 {
174  const uint iVertNum = tInstanceTransform.size();
175  const uint iMatrixDim = 4;
176  const uint iMatrixSize = iMatrixDim * iMatrixDim;
177  //create byte array
178  QByteArray bufferData;
179  bufferData.resize(iVertNum * iMatrixSize * (int)sizeof(float));
180  float *rawVertexArray = reinterpret_cast<float *>(bufferData.data());
181 
182  //copy transforms into buffer
183  for(uint i = 0 ; i < iVertNum; i++)
184  {
185  const float *rawMatrix = tInstanceTransform.at(i).data();
186  for(uint idx = 0; idx < iMatrixSize; idx++)
187  {
188  rawVertexArray[iMatrixSize * i + idx] = rawMatrix[idx];
189  }
190  }
191 
192  return bufferData;
193 }
194 
195 //=============================================================================================================
196 
197 QByteArray GeometryMultiplier::buildColorBuffer(const QVector<QColor> &tInstanceColor)
198 {
199  const uint iVertSize = 4;
200  //create byte array
201  QByteArray bufferData;
202  bufferData.resize(tInstanceColor.size() * iVertSize * (int)sizeof(float));
203  float *rawVertexArray = reinterpret_cast<float *>(bufferData.data());
204 
205  //copy colors into buffer
206  for(int i = 0; i < tInstanceColor.size(); i++)
207  {
208  rawVertexArray[iVertSize * i] = tInstanceColor[i].redF();
209  rawVertexArray[iVertSize * i + 1] = tInstanceColor[i].greenF();
210  rawVertexArray[iVertSize * i + 2] = tInstanceColor[i].blueF();
211  rawVertexArray[iVertSize * i + 3] = tInstanceColor[i].alphaF();
212  }
213 
214  return bufferData;
215 }
GeometryMultiplier(QSharedPointer< Qt3DRender::QGeometry > tGeometry, Qt3DCore::QNode *tParent=nullptr)
void setColors(const QVector< QColor > &tInstanceColors)
void setTransforms(const QVector< QMatrix4x4 > &tInstanceTansform)
GeometryMultiplier class declaration.