90 std::vector<uint> mTextID;
99 mMRS.setDefaultSettingsFromCapability();
106 mMRS.setDefaultSettingsFromCapability();
114 AbstractDrawableMesh::swap(
other);
115 MeshType::swap(
other);
116 swap(mBoundingBox,
other.mBoundingBox);
117 swap(mMRD,
other.mMRD);
118 swap(mTextID,
other.mTextID);
137 if (this->MeshType::boundingBox().isNull()) {
152 mMRS.setRenderCapabilityFrom(*
this);
156 uint vertexNumber()
const override {
return MeshType::vertexNumber(); }
158 uint faceNumber()
const override
161 return MeshType::faceNumber();
166 uint edgeNumber()
const override
169 return MeshType::edgeNumber();
177 return MeshType::transformMatrix().template
cast<double>();
184 std::vector<std::string> textures()
const override
186 std::vector<std::string>
txs;
188 txs.reserve(MeshType::textureNumber());
189 for (
const auto&
tpath : MeshType::texturePaths()) {
198 void init()
override { bindTextures(); }
204 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
212 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
213 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
227 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
252 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
256 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
257 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
262 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
276 return std::make_shared<DrawableMeshOpenGL2>(*
this);
279 std::shared_ptr<DrawableObject>
clone() &&
override
281 return std::make_shared<DrawableMeshOpenGL2>(std::move(*
this));
284 std::string&
name()
override {
return MeshType::name(); }
286 const std::string&
name()
const override {
return MeshType::name(); }
289 void renderPass()
const
291 uint
nv = mMRD.vertexNumber();
292 uint
nt = mMRD.triangleNumber();
294 const float* positions = mMRD.vertexBufferData();
300 const float*
vertTexCoords = mMRD.vertexTexCoordsBufferData();
301 const float*
wedgTexCoords = mMRD.wedgeTexCoordsBufferData();
303 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
307 if (mMRS.
isPoints(MRI::Points::COLOR_VERTEX)) {
311 else if (mMRS.
isPoints(MRI::Points::COLOR_MESH)) {
312 glColor4fv(mMRD.meshColorBufferData());
314 else if (mMRS.
isPoints(MRI::Points::COLOR_USER)) {
315 glColor4fv(mMRS.pointUserColorData());
318 glPointSize(mMRS.pointWidth());
320 glDrawArrays(GL_POINTS, 0, nv);
322 glDisableClientState(GL_COLOR_ARRAY);
323 glDisableClientState(GL_VERTEX_ARRAY);
326 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
328 if (mMRS.
isSurface(MRI::Surface::COLOR_FACE)) {
330 for (
int tid = 0; tid < n_tris; ++tid) {
331 int tid_ptr = 3 * tid;
332 int vid0 = triangles[tid_ptr + 0];
333 int vid1 = triangles[tid_ptr + 1];
334 int vid2 = triangles[tid_ptr + 2];
335 int vid0_ptr = 3 * vid0;
336 int vid1_ptr = 3 * vid1;
337 int vid2_ptr = 3 * vid2;
339 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
340 glBegin(GL_TRIANGLES);
341 glColor4ubv((GLubyte*) &(triangleColors[tid]));
342 glNormal3fv(&(vertexNormals[vid0_ptr]));
343 glVertex3fv(&(positions[vid0_ptr]));
344 glNormal3fv(&(vertexNormals[vid1_ptr]));
345 glVertex3fv(&(positions[vid1_ptr]));
346 glNormal3fv(&(vertexNormals[vid2_ptr]));
347 glVertex3fv(&(positions[vid2_ptr]));
351 glBegin(GL_TRIANGLES);
352 glColor4ubv((GLubyte*) &(triangleColors[tid]));
353 glNormal3fv(&(triangleNormals[tid_ptr]));
354 glVertex3fv(&(positions[vid0_ptr]));
355 glNormal3fv(&(triangleNormals[tid_ptr]));
356 glVertex3fv(&(positions[vid1_ptr]));
357 glNormal3fv(&(triangleNormals[tid_ptr]));
358 glVertex3fv(&(positions[vid2_ptr]));
363 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX)) {
364 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
365 glEnableClientState(GL_VERTEX_ARRAY);
366 glVertexPointer(3, GL_FLOAT, 0, positions);
368 glEnableClientState(GL_NORMAL_ARRAY);
369 glNormalPointer(GL_FLOAT, 0, vertexNormals);
371 glEnableClientState(GL_COLOR_ARRAY);
372 glColorPointer(4, GL_UNSIGNED_BYTE, 0, vertexColors);
375 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
377 glDisableClientState(GL_COLOR_ARRAY);
378 glDisableClientState(GL_NORMAL_ARRAY);
379 glDisableClientState(GL_VERTEX_ARRAY);
382 glShadeModel(GL_SMOOTH);
384 for (
int tid = 0; tid < n_tris; ++tid) {
385 int tid_ptr = 3 * tid;
386 int vid0 = triangles[tid_ptr + 0];
387 int vid1 = triangles[tid_ptr + 1];
388 int vid2 = triangles[tid_ptr + 2];
389 int vid0_ptr = 3 * vid0;
390 int vid1_ptr = 3 * vid1;
391 int vid2_ptr = 3 * vid2;
393 glBegin(GL_TRIANGLES);
394 glColor4ubv((GLubyte*) &(vertexColors[vid0]));
395 glNormal3fv(&(triangleNormals[tid_ptr]));
396 glVertex3fv(&(positions[vid0_ptr]));
397 glColor4ubv((GLubyte*) &(vertexColors[vid1]));
398 glNormal3fv(&(triangleNormals[tid_ptr]));
399 glVertex3fv(&(positions[vid1_ptr]));
400 glColor4ubv((GLubyte*) &(vertexColors[vid2]));
401 glNormal3fv(&(triangleNormals[tid_ptr]));
402 glVertex3fv(&(positions[vid2_ptr]));
408 mMRS.
isSurface(MRI::Surface::COLOR_MESH) ||
409 mMRS.
isSurface(MRI::Surface::COLOR_USER)) {
410 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
411 glEnableClientState(GL_VERTEX_ARRAY);
412 glVertexPointer(3, GL_FLOAT, 0, positions);
414 glEnableClientState(GL_NORMAL_ARRAY);
415 glNormalPointer(GL_FLOAT, 0, vertexNormals);
417 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
418 glColor4fv(mMRD.meshColorBufferData());
421 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
425 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
427 glDisableClientState(GL_COLOR_ARRAY);
428 glDisableClientState(GL_NORMAL_ARRAY);
429 glDisableClientState(GL_VERTEX_ARRAY);
432 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
433 glColor4fv(mMRD.meshColorBufferData());
436 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
439 for (
int tid = 0; tid < n_tris; ++tid) {
440 int tid_ptr = 3 * tid;
441 int vid0 = triangles[tid_ptr + 0];
442 int vid1 = triangles[tid_ptr + 1];
443 int vid2 = triangles[tid_ptr + 2];
444 int vid0_ptr = 3 * vid0;
445 int vid1_ptr = 3 * vid1;
446 int vid2_ptr = 3 * vid2;
448 glBegin(GL_TRIANGLES);
449 glNormal3fv(&(triangleNormals[tid_ptr]));
450 glVertex3fv(&(positions[vid0_ptr]));
451 glNormal3fv(&(triangleNormals[tid_ptr]));
452 glVertex3fv(&(positions[vid1_ptr]));
453 glNormal3fv(&(triangleNormals[tid_ptr]));
454 glVertex3fv(&(positions[vid2_ptr]));
459 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX_TEX)) {
460 glShadeModel(GL_SMOOTH);
462 for (
int tid = 0; tid < n_tris; ++tid) {
463 int tid_ptr = 3 * tid;
464 int vid0 = triangles[tid_ptr + 0];
465 int vid1 = triangles[tid_ptr + 1];
466 int vid2 = triangles[tid_ptr + 2];
467 int vid0_ptr = 3 * vid0;
468 int vid1_ptr = 3 * vid1;
469 int vid2_ptr = 3 * vid2;
471 mTextID[mMRD.vertexTextureIDsBufferData()[tid]];
472 glBindTexture(GL_TEXTURE_2D, texture);
473 glBegin(GL_TRIANGLES);
474 glColor4f(1, 1, 1, 1);
476 vertTexCoords[vid0 * 2 + 0],
477 vertTexCoords[vid0 * 2 + 1]);
478 glNormal3fv(&(vertexNormals[vid0_ptr]));
479 glVertex3fv(&(positions[vid0_ptr]));
481 vertTexCoords[vid1 * 2 + 0],
482 vertTexCoords[vid1 * 2 + 1]);
483 glNormal3fv(&(vertexNormals[vid1_ptr]));
484 glVertex3fv(&(positions[vid1_ptr]));
486 vertTexCoords[vid2 * 2 + 0],
487 vertTexCoords[vid2 * 2 + 1]);
488 glNormal3fv(&(vertexNormals[vid2_ptr]));
489 glVertex3fv(&(positions[vid2_ptr]));
491 glBindTexture(GL_TEXTURE_2D, 0);
494 else if (mMRS.
isSurface(MRI::Surface::COLOR_WEDGE_TEX)) {
496 for (
int tid = 0; tid < n_tris; ++tid) {
497 int tid_ptr = 3 * tid;
498 int vid0 = triangles[tid_ptr + 0];
499 int vid1 = triangles[tid_ptr + 1];
500 int vid2 = triangles[tid_ptr + 2];
501 int vid0_ptr = 3 * vid0;
502 int vid1_ptr = 3 * vid1;
503 int vid2_ptr = 3 * vid2;
505 mTextID[mMRD.wedgeTextureIDsBufferData()[tid]];
506 glBindTexture(GL_TEXTURE_2D, texture);
507 glBegin(GL_TRIANGLES);
508 glColor4f(1, 1, 1, 1);
510 wedgTexCoords[vid0 * 2 + 0],
511 wedgTexCoords[vid0 * 2 + 1]);
512 glNormal3fv(&(vertexNormals[vid0_ptr]));
513 glVertex3fv(&(positions[vid0_ptr]));
515 wedgTexCoords[vid1 * 2 + 0],
516 wedgTexCoords[vid1 * 2 + 1]);
517 glNormal3fv(&(vertexNormals[vid1_ptr]));
518 glVertex3fv(&(positions[vid1_ptr]));
520 wedgTexCoords[vid2 * 2 + 0],
521 wedgTexCoords[vid2 * 2 + 1]);
522 glNormal3fv(&(vertexNormals[vid2_ptr]));
523 glVertex3fv(&(positions[vid2_ptr]));
525 glBindTexture(GL_TEXTURE_2D, 0);
531 glEnableClientState(GL_VERTEX_ARRAY);
532 glVertexPointer(3, GL_FLOAT, 0, positions);
534 glLineWidth(mMRS.wireframeWidth());
536 if (mMRS.
isWireframe(MRI::Wireframe::COLOR_MESH)) {
537 glColor4fv(mMRD.meshColorBufferData());
540 glColor4fv(mMRS.wireframeUserColorData());
543 glDrawElements(GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
545 glDisableClientState(GL_VERTEX_ARRAY);
551 mTextID.resize(mMRD.textureNumber());
552 glEnable(GL_TEXTURE_2D);
553 glGenTextures(mMRD.textureNumber(), mTextID.data());
555 for (uint i = 0; i < mMRD.textureNumber(); i++) {
556 glBindTexture(GL_TEXTURE_2D, mTextID[i]);
561 mMRD.textureSize(i).x(),
562 mMRD.textureSize(i).y(),
566 mMRD.textureBufferData(i));
567 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
568 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
569 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
570 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
574 void unbindTextures()
576 if (mTextID.size() > 0) {
577 glDeleteTextures(mTextID.size(), mTextID.data());