110 qInfo(
"\tcomputing normals\n");
112 MatrixX3f r1(
tris.rows(),3); MatrixX3f r2(
tris.rows(),3); MatrixX3f r3(
tris.rows(),3);
114 for(qint32 i = 0; i <
tris.rows(); ++i)
116 r1.row(i) =
rr.row(
tris(i, 0));
117 r2.row(i) =
rr.row(
tris(i, 1));
118 r3.row(i) =
rr.row(
tris(i, 2));
121 MatrixX3f x = r2 - r1;
122 MatrixX3f y = r3 - r1;
123 MatrixX3f tri_nn(x.rows(),y.cols());
124 tri_nn.col(0) = x.col(1).cwiseProduct(y.col(2)) - x.col(2).cwiseProduct(y.col(1));
125 tri_nn.col(1) = x.col(2).cwiseProduct(y.col(0)) - x.col(0).cwiseProduct(y.col(2));
126 tri_nn.col(2) = x.col(0).cwiseProduct(y.col(1)) - x.col(1).cwiseProduct(y.col(0));
129 MatrixX3f tmp = tri_nn.cwiseProduct(tri_nn);
130 VectorXf normSize = tmp.rowwise().sum();
131 normSize = normSize.cwiseSqrt();
133 for(qint32 i = 0; i < normSize.size(); ++i)
135 tri_nn.row(i) /= normSize(i);
137 MatrixX3f
nn = MatrixX3f::Zero(
rr.rows(), 3);
139 for(qint32 p = 0; p <
tris.rows(); ++p)
141 Vector3i verts =
tris.row(p);
142 for(qint32 j = 0; j < verts.size(); ++j)
143 nn.row(verts(j)) = tri_nn.row(p);
146 tmp =
nn.cwiseProduct(
nn);
147 normSize = tmp.rowwise().sum();
148 normSize = normSize.cwiseSqrt();
150 for(qint32 i = 0; i < normSize.size(); ++i)
152 nn.row(i) /= normSize(i);
187 QFile t_File(p_sFile);
189 if (!t_File.open(QIODevice::ReadOnly))
191 qWarning(
"\tError: Couldn't open the surface file");
195 qInfo(
"Reading surface...\n");
198 qint32 t_NameIdx = 0;
199 if(p_sFile.contains(
"lh."))
200 t_NameIdx = p_sFile.indexOf(
"lh.");
201 else if(p_sFile.contains(
"rh."))
202 t_NameIdx = p_sFile.indexOf(
"rh.");
206 p_Surface.m_sFilePath = p_sFile.mid(0,t_NameIdx);
207 p_Surface.m_sFileName = p_sFile.mid(t_NameIdx,p_sFile.size()-t_NameIdx);
209 QDataStream t_DataStream(&t_File);
210 t_DataStream.setByteOrder(QDataStream::BigEndian);
235 qInfo(
"\t%s is a quad file (nvert = %d nquad = %d)\n", p_sFile.toUtf8().constData(),nvert,nquad);
237 qInfo(
"\t%s is a new quad file (nvert = %d nquad = %d)\n", p_sFile.toUtf8().constData(),nvert,nquad);
240 verts.resize(nvert, 3);
244 for(qint32 i = 0; i < nvert; ++i)
246 for(qint32 j = 0; j < 3; ++j)
248 t_DataStream >> iVal;
250 verts(i,j) =
static_cast<float>(iVal) / 100;
256 t_DataStream.readRawData(
reinterpret_cast<char *
>(verts.data()), nvert*3*
sizeof(
float));
257 for(qint32 i = 0; i < nvert; ++i)
258 for(qint32 j = 0; j < 3; ++j)
263 MatrixXi quads_new(4, nquad);
265 for(qint32 j = 0; j < quads.cols(); ++j)
267 for(qint32 i = 0; i < quads.rows(); ++i)
269 quads_new(i,j) = quads(count, 0);
273 quads = quads_new.transpose();
277 faces = MatrixXi::Zero(2*nquad,3);
278 for(qint32 k = 0; k < nquad; ++k)
280 RowVectorXi quad = quads.row(k);
281 if ((quad[0] % 2) == 0)
283 faces(nface,0) = quad[0];
284 faces(nface,1) = quad[1];
285 faces(nface,2) = quad[3];
288 faces(nface,0) = quad[2];
289 faces(nface,1) = quad[3];
290 faces(nface,2) = quad[1];
295 faces(nface,0) = quad(0);
296 faces(nface,1) = quad(1);
297 faces(nface,2) = quad(2);
300 faces(nface,0) = quad(0);
301 faces(nface,1) = quad(2);
302 faces(nface,2) = quad(3);
309 QString s = t_File.readLine();
312 t_DataStream >> nvert;
313 t_DataStream >> nface;
317 qInfo(
"\t%s is a triangle file (nvert = %d ntri = %d)\n", p_sFile.toUtf8().constData(), nvert, nface);
318 qInfo(
"\t%s", s.toUtf8().constData());
321 verts.resize(3, nvert);
322 t_DataStream.readRawData(
reinterpret_cast<char *
>(verts.data()), nvert*3*
sizeof(
float));
323 for(qint32 i = 0; i < 3; ++i)
324 for(qint32 j = 0; j < nvert; ++j)
328 faces.resize(nface, 3);
330 for(qint32 i = 0; i < nface; ++i)
332 for(qint32 j = 0; j < 3; ++j)
334 t_DataStream >> iVal;
342 qWarning(
"Bad magic number (%d) in surface file %s",magic,p_sFile.toUtf8().constData());
346 verts.transposeInPlace();
347 verts.array() *= 0.001f;
349 p_Surface.m_matRR = verts.block(0,0,verts.rows(),3);
350 p_Surface.m_matTris = faces.block(0,0,faces.rows(),3);
353 p_Surface.m_matNN =
compute_normals(p_Surface.m_matRR, p_Surface.m_matTris);
356 if(t_File.fileName().contains(
"lh."))
357 p_Surface.m_iHemi = 0;
358 else if(t_File.fileName().contains(
"rh."))
359 p_Surface.m_iHemi = 1;
362 p_Surface.m_iHemi = -1;
367 p_Surface.m_sSurf = t_File.fileName().mid((t_NameIdx+3),t_File.fileName().size() - (t_NameIdx+3));
372 QString t_sCurvatureFile = QString(
"%1%2.curv").arg(p_Surface.m_sFilePath).arg(p_Surface.m_iHemi == 0 ?
"lh" :
"rh");
378 qInfo(
"\tRead a surface with %d vertices from %s\n[done]\n",nvert,p_sFile.toUtf8().constData());
389 qInfo(
"Reading curvature...");
390 QFile t_File(p_sFileName);
392 if (!t_File.open(QIODevice::ReadOnly))
394 qWarning(
"\tError: Couldn't open the curvature file");
398 QDataStream t_DataStream(&t_File);
399 t_DataStream.setByteOrder(QDataStream::BigEndian);
402 qint32 NEW_VERSION_MAGIC_NUMBER = 16777215;
404 if(vnum == NEW_VERSION_MAGIC_NUMBER)
406 qint32 fnum, vals_per_vertex;
407 t_DataStream >> vnum;
409 t_DataStream >> fnum;
410 t_DataStream >> vals_per_vertex;
412 curv.resize(vnum, 1);
413 t_DataStream.readRawData(
reinterpret_cast<char *
>(
curv.data()), vnum*
sizeof(
float));
414 for(qint32 i = 0; i < vnum; ++i)
422 curv.resize(vnum, 1);
423 for(qint32 i = 0; i < vnum; ++i)
425 t_DataStream >> iVal;
427 curv(i) =
static_cast<float>(iVal) / 100;