MNE-CPP  0.1.9
A Framework for Electrophysiology
custommesh.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "custommesh.h"
41 
42 //=============================================================================================================
43 // QT INCLUDES
44 //=============================================================================================================
45 
46 #include <QSharedPointer>
47 #include <QVector3D>
48 
49 #include <Qt3DRender/QGeometry>
50 #include <Qt3DRender/QAttribute>
51 #include <Qt3DRender/QBuffer>
52 
53 //=============================================================================================================
54 // EIGEN INCLUDES
55 //=============================================================================================================
56 
57 //=============================================================================================================
58 // USED NAMESPACES
59 //=============================================================================================================
60 
61 using namespace DISP3DLIB;
62 using namespace Eigen;
63 
64 //=============================================================================================================
65 // DEFINE MEMBER METHODS
66 //=============================================================================================================
67 
69 : Qt3DRender::QGeometryRenderer()
70 , m_iNumVert(0)
71 {
72  init();
73 }
74 
75 //=============================================================================================================
76 
77 CustomMesh::CustomMesh(const MatrixX3f& tMatVert,
78  const MatrixX3f& tMatNorm,
79  const MatrixXi& tMatTris,
80  const MatrixX4f& tMatColors,
81  Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType)
82 : Qt3DRender::QGeometryRenderer()
83 , m_iNumVert(tMatVert.rows())
84 {
85  init();
86 
87  setMeshData(tMatVert,
88  tMatNorm,
89  tMatTris,
90  tMatColors,
91  primitiveType);
92 }
93 
94 //=============================================================================================================
95 
97 {
98  m_pCustomGeometry = new Qt3DRender::QGeometry(this);
99 
100  this->setGeometry(m_pCustomGeometry);
101 
102  m_pVertexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer);
103  m_pNormalDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer);
104  m_pColorDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer);
105  m_pIndexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::IndexBuffer);
106 
107  m_pIndexAttribute = new Qt3DRender::QAttribute();
108  m_pIndexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
109  m_pIndexAttribute->setDataType(Qt3DRender::QAttribute::UnsignedInt);
110  m_pIndexAttribute->setByteOffset(0);
112 
113  m_pVertexAttribute = new Qt3DRender::QAttribute();
114  m_pVertexAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
115  m_pVertexAttribute->setDataType(Qt3DRender::QAttribute::Float);
116  m_pVertexAttribute->setDataSize(3);
117  m_pVertexAttribute->setByteOffset(0);
118  m_pVertexAttribute->setByteStride(3 * sizeof(float));
119  m_pVertexAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
121 
122  m_pNormalAttribute = new Qt3DRender::QAttribute();
123  m_pNormalAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
124  m_pNormalAttribute->setDataType(Qt3DRender::QAttribute::Float);
125  m_pNormalAttribute->setDataSize(3);
126  m_pNormalAttribute->setByteOffset(0);
127  m_pNormalAttribute->setByteStride(3 * sizeof(float));
128  m_pNormalAttribute->setName(Qt3DRender::QAttribute::defaultNormalAttributeName());
130 
131  m_pColorAttribute = new Qt3DRender::QAttribute();
132  m_pColorAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
133  m_pColorAttribute->setDataType(Qt3DRender::QAttribute::Float);
134  m_pColorAttribute->setDataSize(4);
135  m_pColorAttribute->setByteOffset(0);
136  m_pColorAttribute->setByteStride(4 * sizeof(float));
137  m_pColorAttribute->setName(Qt3DRender::QAttribute::defaultColorAttributeName());
139 
140  m_pCustomGeometry->addAttribute(m_pVertexAttribute);
141  m_pCustomGeometry->addAttribute(m_pNormalAttribute);
142  m_pCustomGeometry->addAttribute(m_pColorAttribute);
143  m_pCustomGeometry->addAttribute(m_pIndexAttribute);
144 }
145 
146 //=============================================================================================================
147 
149 {
150  m_pVertexDataBuffer->deleteLater();
151  m_pNormalDataBuffer->deleteLater();
152  m_pColorDataBuffer->deleteLater();
153  m_pIndexDataBuffer->deleteLater();
154  m_pCustomGeometry->deleteLater();
155  m_pIndexAttribute->deleteLater();
156  m_pVertexAttribute->deleteLater();
157  m_pNormalAttribute->deleteLater();
158  m_pColorAttribute->deleteLater();
159 }
160 
161 //=============================================================================================================
162 
163 void CustomMesh::setColor(const Eigen::MatrixX4f& tMatColors)
164 {
165  QByteArray colorBufferData;
166  colorBufferData.resize(tMatColors.rows() * 4 * (int)sizeof(float));
167  float *rawColorArray = reinterpret_cast<float *>(colorBufferData.data());
168 
169  int idxColor = 0;
170 
171  for(int i = 0; i < tMatColors.rows(); ++i) {
172  rawColorArray[idxColor++] = tMatColors(i,0);
173  rawColorArray[idxColor++] = tMatColors(i,1);
174  rawColorArray[idxColor++] = tMatColors(i,2);
175  rawColorArray[idxColor++] = tMatColors(i,3);
176  }
177 
178  //Update color
179  m_pColorDataBuffer->setData(colorBufferData);
180 
181  //m_pColorAttribute->setBuffer(m_pColorDataBuffer);
182  m_pColorAttribute->setCount(tMatColors.rows());
183 }
184 
185 //=============================================================================================================
186 
187 void CustomMesh::setNormals(const Eigen::MatrixX3f& tMatNorm)
188 {
189  QByteArray normalBufferData;
190  normalBufferData.resize(tMatNorm.rows() * 3 * (int)sizeof(float));
191  float *rawNormalArray = reinterpret_cast<float *>(normalBufferData.data());
192 
193  int idxNorm = 0;
194  for(int i = 0; i < tMatNorm.rows(); ++i) {
195  //Normal
196  rawNormalArray[idxNorm++] = tMatNorm(i,0);
197  rawNormalArray[idxNorm++] = tMatNorm(i,1);
198  rawNormalArray[idxNorm++] = tMatNorm(i,2);
199  }
200 
201  m_pNormalDataBuffer->setData(normalBufferData);
202 
203  //m_pNormalAttribute->setBuffer(m_pNormalDataBuffer);
204  m_pNormalAttribute->setCount(tMatNorm.rows());
205 }
206 
207 //=============================================================================================================
208 
209 void CustomMesh::setVertex(const Eigen::MatrixX3f& tMatVert)
210 {
211  QByteArray vertexBufferData;
212  vertexBufferData.resize(tMatVert.rows() * 3 * (int)sizeof(float));
213  float *rawVertexArray = reinterpret_cast<float *>(vertexBufferData.data());
214 
215  int idxVert = 0;
216  for(int i = 0; i < tMatVert.rows(); ++i) {
217  rawVertexArray[idxVert++] = (tMatVert(i,0));
218  rawVertexArray[idxVert++] = (tMatVert(i,1));
219  rawVertexArray[idxVert++] = (tMatVert(i,2));
220  }
221 
222  m_pVertexDataBuffer->setData(vertexBufferData);
223 
224  //m_pVertexAttribute->setBuffer(m_pVertexDataBuffer);
225  m_pVertexAttribute->setCount(tMatVert.rows());
226 }
227 
228 //=============================================================================================================
229 
230 void CustomMesh::setIndex(const Eigen::MatrixXi& tMatTris)
231 {
232  QByteArray indexBufferData;
233 
234  const uint iIndicesCount = tMatTris.rows() * tMatTris.cols();
235  indexBufferData.resize(iIndicesCount * (int)sizeof(uint));
236 
237  uint *rawIndexArray = reinterpret_cast<uint *>(indexBufferData.data());
238  int idxTris = 0;
239 
240  for(int i = 0; i < tMatTris.rows(); ++i) {
241  //patches/tris/lines
242  for(int f = 0; f < tMatTris.cols(); ++f) {
243  rawIndexArray[idxTris++] = tMatTris(i,f);
244  }
245  }
246 
247  m_pIndexDataBuffer->setData(indexBufferData);
248 
249  m_pIndexAttribute->setCount(iIndicesCount);
250 
251  //Set the final geometry and primitive type
252  this->setVerticesPerPatch(tMatTris.cols());
253  this->setVertexCount(tMatTris.rows()*3);
254 }
255 
256 //=============================================================================================================
257 
258 void CustomMesh::setMeshData(const MatrixX3f& tMatVert,
259  const MatrixX3f& tMatNorm,
260  const MatrixXi& tMatTris,
261  const MatrixX4f& tMatColors,
262  Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType)
263 {
264  m_iNumVert = tMatVert.rows();
265 
266  setVertex(tMatVert);
267  setNormals(tMatNorm);
268  setIndex(tMatTris);
269  setColor(tMatColors);
270 
271  this->setPrimitiveType(primitiveType);
272 
277 }
278 
279 //=============================================================================================================
280 
281 void CustomMesh::addAttribute(Qt3DRender::QAttribute *pAttribute)
282 {
283  m_pCustomGeometry->addAttribute(pAttribute);
284 }
void setNormals(const Eigen::MatrixX3f &tMatNorm)
Definition: custommesh.cpp:187
void setIndex(const Eigen::MatrixXi &tMatTris)
Definition: custommesh.cpp:230
CustomMesh class declaration.
void setColor(const Eigen::MatrixX4f &tMatColors)
Definition: custommesh.cpp:163
QPointer< Qt3DRender::QBuffer > m_pColorDataBuffer
Definition: custommesh.h:184
QPointer< Qt3DRender::QAttribute > m_pNormalAttribute
Definition: custommesh.h:191
QPointer< Qt3DRender::QBuffer > m_pIndexDataBuffer
Definition: custommesh.h:185
QPointer< Qt3DRender::QBuffer > m_pVertexDataBuffer
Definition: custommesh.h:182
void addAttribute(Qt3DRender::QAttribute *pAttribute)
Definition: custommesh.cpp:281
QPointer< Qt3DRender::QBuffer > m_pNormalDataBuffer
Definition: custommesh.h:183
QPointer< Qt3DRender::QAttribute > m_pVertexAttribute
Definition: custommesh.h:190
void setVertex(const Eigen::MatrixX3f &tMatVert)
Definition: custommesh.cpp:209
QPointer< Qt3DRender::QAttribute > m_pIndexAttribute
Definition: custommesh.h:189
void setMeshData(const Eigen::MatrixX3f &tMatVert, const Eigen::MatrixX3f &tMatNorm, const Eigen::MatrixXi &tMatTris, const Eigen::MatrixX4f &tMatColors, Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType=Qt3DRender::QGeometryRenderer::Triangles)
Definition: custommesh.cpp:258
QPointer< Qt3DRender::QAttribute > m_pColorAttribute
Definition: custommesh.h:192
QPointer< Qt3DRender::QGeometry > m_pCustomGeometry
Definition: custommesh.h:187