88 std::vector<uint> mTextID;
97 mMRS.setDefaultSettingsFromCapability();
104 mMRS.setDefaultSettingsFromCapability();
112 AbstractDrawableMesh::swap(
other);
113 MeshType::swap(
other);
114 swap(mMRD,
other.mMRD);
115 swap(mTextID,
other.mTextID);
134 AbstractDrawableMesh::computeBoundingBox(
static_cast<MeshType
>(*
this));
138 mMRS.setRenderCapabilityFrom(*
this);
142 uint vertexNumber()
const override {
return MeshType::vertexNumber(); }
144 uint faceNumber()
const override
147 return MeshType::faceNumber();
152 uint edgeNumber()
const override
155 return MeshType::edgeNumber();
163 return MeshType::transformMatrix().template
cast<double>();
173 return MeshType::materials();
182 void init()
override { bindTextures(); }
188 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
196 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
197 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
198 glEnable(GL_LIGHTING);
199 glShadeModel(GL_FLAT);
200 glDepthRange(0.01, 1.0);
203 glDisable(GL_LIGHTING);
204 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
205 glDepthRange(0.0, 1.0);
206 glDepthFunc(GL_LEQUAL);
208 glDepthFunc(GL_LESS);
209 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
211 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
212 glEnable(GL_LIGHTING);
213 glShadeModel(GL_SMOOTH);
214 glDepthRange(0.01, 1.0);
217 glDisable(GL_LIGHTING);
218 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
219 glDepthRange(0.0, 1.0);
220 glDepthFunc(GL_LEQUAL);
222 glDepthFunc(GL_LESS);
223 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
227 glDisable(GL_LIGHTING);
228 glShadeModel(GL_FLAT);
229 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
230 glDepthRange(0.0, 1.0);
232 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
236 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
237 glDisable(GL_LIGHTING);
240 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
241 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
242 glEnable(GL_LIGHTING);
243 glShadeModel(GL_FLAT);
246 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
247 glEnable(GL_LIGHTING);
248 glShadeModel(GL_SMOOTH);
258 return std::make_shared<DrawableMeshOpenGL2>(*
this);
261 std::shared_ptr<DrawableObject>
clone() &&
override
263 return std::make_shared<DrawableMeshOpenGL2>(std::move(*
this));
266 std::string&
name()
override {
return MeshType::name(); }
268 const std::string&
name()
const override {
return MeshType::name(); }
271 void renderPass()
const
273 uint
nv = mMRD.vertexNumber();
274 uint
nt = mMRD.triangleNumber();
276 const float* positions = mMRD.vertexBufferData();
282 const float*
vertTexCoords = mMRD.vertexTexCoordsBufferData();
283 const float*
wedgTexCoords = mMRD.wedgeTexCoordsBufferData();
285 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
289 if (mMRS.
isPoints(MRI::Points::COLOR_VERTEX)) {
293 else if (mMRS.
isPoints(MRI::Points::COLOR_MESH)) {
294 glColor4fv(mMRD.meshColorBufferData());
296 else if (mMRS.
isPoints(MRI::Points::COLOR_USER)) {
297 glColor4fv(mMRS.pointUserColorData());
300 glPointSize(mMRS.pointWidth());
302 glDrawArrays(GL_POINTS, 0, nv);
304 glDisableClientState(GL_COLOR_ARRAY);
305 glDisableClientState(GL_VERTEX_ARRAY);
308 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
310 if (mMRS.
isSurface(MRI::Surface::COLOR_FACE)) {
312 for (
int tid = 0; tid < n_tris; ++tid) {
313 int tid_ptr = 3 * tid;
314 int vid0 = triangles[tid_ptr + 0];
315 int vid1 = triangles[tid_ptr + 1];
316 int vid2 = triangles[tid_ptr + 2];
317 int vid0_ptr = 3 * vid0;
318 int vid1_ptr = 3 * vid1;
319 int vid2_ptr = 3 * vid2;
321 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
322 glBegin(GL_TRIANGLES);
323 glColor4ubv((GLubyte*) &(triangleColors[tid]));
324 glNormal3fv(&(vertexNormals[vid0_ptr]));
325 glVertex3fv(&(positions[vid0_ptr]));
326 glNormal3fv(&(vertexNormals[vid1_ptr]));
327 glVertex3fv(&(positions[vid1_ptr]));
328 glNormal3fv(&(vertexNormals[vid2_ptr]));
329 glVertex3fv(&(positions[vid2_ptr]));
333 glBegin(GL_TRIANGLES);
334 glColor4ubv((GLubyte*) &(triangleColors[tid]));
335 glNormal3fv(&(triangleNormals[tid_ptr]));
336 glVertex3fv(&(positions[vid0_ptr]));
337 glNormal3fv(&(triangleNormals[tid_ptr]));
338 glVertex3fv(&(positions[vid1_ptr]));
339 glNormal3fv(&(triangleNormals[tid_ptr]));
340 glVertex3fv(&(positions[vid2_ptr]));
345 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX)) {
346 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
347 glEnableClientState(GL_VERTEX_ARRAY);
348 glVertexPointer(3, GL_FLOAT, 0, positions);
350 glEnableClientState(GL_NORMAL_ARRAY);
351 glNormalPointer(GL_FLOAT, 0, vertexNormals);
353 glEnableClientState(GL_COLOR_ARRAY);
354 glColorPointer(4, GL_UNSIGNED_BYTE, 0, vertexColors);
357 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
359 glDisableClientState(GL_COLOR_ARRAY);
360 glDisableClientState(GL_NORMAL_ARRAY);
361 glDisableClientState(GL_VERTEX_ARRAY);
364 glShadeModel(GL_SMOOTH);
366 for (
int tid = 0; tid < n_tris; ++tid) {
367 int tid_ptr = 3 * tid;
368 int vid0 = triangles[tid_ptr + 0];
369 int vid1 = triangles[tid_ptr + 1];
370 int vid2 = triangles[tid_ptr + 2];
371 int vid0_ptr = 3 * vid0;
372 int vid1_ptr = 3 * vid1;
373 int vid2_ptr = 3 * vid2;
375 glBegin(GL_TRIANGLES);
376 glColor4ubv((GLubyte*) &(vertexColors[vid0]));
377 glNormal3fv(&(triangleNormals[tid_ptr]));
378 glVertex3fv(&(positions[vid0_ptr]));
379 glColor4ubv((GLubyte*) &(vertexColors[vid1]));
380 glNormal3fv(&(triangleNormals[tid_ptr]));
381 glVertex3fv(&(positions[vid1_ptr]));
382 glColor4ubv((GLubyte*) &(vertexColors[vid2]));
383 glNormal3fv(&(triangleNormals[tid_ptr]));
384 glVertex3fv(&(positions[vid2_ptr]));
390 mMRS.
isSurface(MRI::Surface::COLOR_MESH) ||
391 mMRS.
isSurface(MRI::Surface::COLOR_USER)) {
392 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
393 glEnableClientState(GL_VERTEX_ARRAY);
394 glVertexPointer(3, GL_FLOAT, 0, positions);
396 glEnableClientState(GL_NORMAL_ARRAY);
397 glNormalPointer(GL_FLOAT, 0, vertexNormals);
399 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
400 glColor4fv(mMRD.meshColorBufferData());
403 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
407 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
409 glDisableClientState(GL_COLOR_ARRAY);
410 glDisableClientState(GL_NORMAL_ARRAY);
411 glDisableClientState(GL_VERTEX_ARRAY);
414 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
415 glColor4fv(mMRD.meshColorBufferData());
418 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
421 for (
int tid = 0; tid < n_tris; ++tid) {
422 int tid_ptr = 3 * tid;
423 int vid0 = triangles[tid_ptr + 0];
424 int vid1 = triangles[tid_ptr + 1];
425 int vid2 = triangles[tid_ptr + 2];
426 int vid0_ptr = 3 * vid0;
427 int vid1_ptr = 3 * vid1;
428 int vid2_ptr = 3 * vid2;
430 glBegin(GL_TRIANGLES);
431 glNormal3fv(&(triangleNormals[tid_ptr]));
432 glVertex3fv(&(positions[vid0_ptr]));
433 glNormal3fv(&(triangleNormals[tid_ptr]));
434 glVertex3fv(&(positions[vid1_ptr]));
435 glNormal3fv(&(triangleNormals[tid_ptr]));
436 glVertex3fv(&(positions[vid2_ptr]));
441 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX_TEX)) {
442 glShadeModel(GL_SMOOTH);
444 for (
int tid = 0; tid < n_tris; ++tid) {
445 int tid_ptr = 3 * tid;
446 int vid0 = triangles[tid_ptr + 0];
447 int vid1 = triangles[tid_ptr + 1];
448 int vid2 = triangles[tid_ptr + 2];
449 int vid0_ptr = 3 * vid0;
450 int vid1_ptr = 3 * vid1;
451 int vid2_ptr = 3 * vid2;
453 mTextID[mMRD.vertexTextureIDsBufferData()[tid]];
454 glBindTexture(GL_TEXTURE_2D, texture);
455 glBegin(GL_TRIANGLES);
456 glColor4f(1, 1, 1, 1);
458 vertTexCoords[vid0 * 2 + 0],
459 vertTexCoords[vid0 * 2 + 1]);
460 glNormal3fv(&(vertexNormals[vid0_ptr]));
461 glVertex3fv(&(positions[vid0_ptr]));
463 vertTexCoords[vid1 * 2 + 0],
464 vertTexCoords[vid1 * 2 + 1]);
465 glNormal3fv(&(vertexNormals[vid1_ptr]));
466 glVertex3fv(&(positions[vid1_ptr]));
468 vertTexCoords[vid2 * 2 + 0],
469 vertTexCoords[vid2 * 2 + 1]);
470 glNormal3fv(&(vertexNormals[vid2_ptr]));
471 glVertex3fv(&(positions[vid2_ptr]));
473 glBindTexture(GL_TEXTURE_2D, 0);
476 else if (mMRS.
isSurface(MRI::Surface::COLOR_WEDGE_TEX)) {
478 for (
int tid = 0; tid < n_tris; ++tid) {
479 int tid_ptr = 3 * tid;
480 int vid0 = triangles[tid_ptr + 0];
481 int vid1 = triangles[tid_ptr + 1];
482 int vid2 = triangles[tid_ptr + 2];
483 int vid0_ptr = 3 * vid0;
484 int vid1_ptr = 3 * vid1;
485 int vid2_ptr = 3 * vid2;
487 mTextID[mMRD.wedgeTextureIDsBufferData()[tid]];
488 glBindTexture(GL_TEXTURE_2D, texture);
489 glBegin(GL_TRIANGLES);
490 glColor4f(1, 1, 1, 1);
492 wedgTexCoords[vid0 * 2 + 0],
493 wedgTexCoords[vid0 * 2 + 1]);
494 glNormal3fv(&(vertexNormals[vid0_ptr]));
495 glVertex3fv(&(positions[vid0_ptr]));
497 wedgTexCoords[vid1 * 2 + 0],
498 wedgTexCoords[vid1 * 2 + 1]);
499 glNormal3fv(&(vertexNormals[vid1_ptr]));
500 glVertex3fv(&(positions[vid1_ptr]));
502 wedgTexCoords[vid2 * 2 + 0],
503 wedgTexCoords[vid2 * 2 + 1]);
504 glNormal3fv(&(vertexNormals[vid2_ptr]));
505 glVertex3fv(&(positions[vid2_ptr]));
507 glBindTexture(GL_TEXTURE_2D, 0);
513 glEnableClientState(GL_VERTEX_ARRAY);
514 glVertexPointer(3, GL_FLOAT, 0, positions);
516 glLineWidth(mMRS.wireframeWidth());
518 if (mMRS.
isWireframe(MRI::Wireframe::COLOR_MESH)) {
519 glColor4fv(mMRD.meshColorBufferData());
522 glColor4fv(mMRS.wireframeUserColorData());
525 glDrawElements(GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
527 glDisableClientState(GL_VERTEX_ARRAY);
533 mTextID.resize(mMRD.textureNumber());
534 glEnable(GL_TEXTURE_2D);
535 glGenTextures(mMRD.textureNumber(), mTextID.data());
537 for (uint i = 0; i < mMRD.textureNumber(); i++) {
538 glBindTexture(GL_TEXTURE_2D, mTextID[i]);
543 mMRD.textureSize(i).x(),
544 mMRD.textureSize(i).y(),
548 mMRD.textureBufferData(i));
549 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
550 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
551 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
552 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
556 void unbindTextures()
558 if (mTextID.size() > 0) {
559 glDeleteTextures(mTextID.size(), mTextID.data());