90 std::vector<uint> mTextID;
99 mMRS.setDefaultSettingsFromCapability();
106 mMRS.setDefaultSettingsFromCapability();
120 if (this->MeshType::boundingBox().isNull()) {
135 mMRS.setRenderCapabilityFrom(*
this);
139 std::string&
name()
override {
return MeshType::name(); }
141 const std::string&
name()
const override {
return MeshType::name(); }
146 AbstractDrawableMesh::swap(
other);
147 MeshType::swap(
other);
148 swap(mBoundingBox,
other.mBoundingBox);
149 swap(mMRD,
other.mMRD);
150 swap(mTextID,
other.mTextID);
153 friend void swap(DrawableMeshOpenGL2& a, DrawableMeshOpenGL2& b)
160 void init()
override { bindTextures(); }
166 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
174 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
175 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
189 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
214 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
218 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
219 if (mMRS.
isSurface(MRI::Surface::SHADING_FLAT)) {
224 else if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
238 return std::make_shared<DrawableMeshOpenGL2>(*
this);
241 std::shared_ptr<DrawableObject>
clone() &&
override
243 return std::make_shared<DrawableMeshOpenGL2>(std::move(*
this));
247 void renderPass()
const
249 uint
nv = mMRD.vertexNumber();
250 uint
nt = mMRD.triangleNumber();
252 const float* coords = mMRD.vertexBufferData();
258 const float*
vertTexCoords = mMRD.vertexTexCoordsBufferData();
259 const float*
wedgTexCoords = mMRD.wedgeTexCoordsBufferData();
261 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
265 if (mMRS.
isPoints(MRI::Points::COLOR_VERTEX)) {
269 else if (mMRS.
isPoints(MRI::Points::COLOR_MESH)) {
270 glColor4fv(mMRD.meshColorBufferData());
272 else if (mMRS.
isPoints(MRI::Points::COLOR_USER)) {
273 glColor4fv(mMRS.pointUserColorData());
276 glPointSize(mMRS.pointWidth());
278 glDrawArrays(GL_POINTS, 0, nv);
280 glDisableClientState(GL_COLOR_ARRAY);
281 glDisableClientState(GL_VERTEX_ARRAY);
284 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
286 if (mMRS.
isSurface(MRI::Surface::COLOR_FACE)) {
288 for (
int tid = 0; tid < n_tris; ++tid) {
289 int tid_ptr = 3 * tid;
290 int vid0 = triangles[tid_ptr + 0];
291 int vid1 = triangles[tid_ptr + 1];
292 int vid2 = triangles[tid_ptr + 2];
293 int vid0_ptr = 3 * vid0;
294 int vid1_ptr = 3 * vid1;
295 int vid2_ptr = 3 * vid2;
297 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
298 glBegin(GL_TRIANGLES);
299 glColor4ubv((GLubyte*) &(triangleColors[tid]));
300 glNormal3fv(&(vertexNormals[vid0_ptr]));
301 glVertex3fv(&(coords[vid0_ptr]));
302 glNormal3fv(&(vertexNormals[vid1_ptr]));
303 glVertex3fv(&(coords[vid1_ptr]));
304 glNormal3fv(&(vertexNormals[vid2_ptr]));
305 glVertex3fv(&(coords[vid2_ptr]));
309 glBegin(GL_TRIANGLES);
310 glColor4ubv((GLubyte*) &(triangleColors[tid]));
311 glNormal3fv(&(triangleNormals[tid_ptr]));
312 glVertex3fv(&(coords[vid0_ptr]));
313 glNormal3fv(&(triangleNormals[tid_ptr]));
314 glVertex3fv(&(coords[vid1_ptr]));
315 glNormal3fv(&(triangleNormals[tid_ptr]));
316 glVertex3fv(&(coords[vid2_ptr]));
321 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX)) {
322 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
323 glEnableClientState(GL_VERTEX_ARRAY);
324 glVertexPointer(3, GL_FLOAT, 0, coords);
326 glEnableClientState(GL_NORMAL_ARRAY);
327 glNormalPointer(GL_FLOAT, 0, vertexNormals);
329 glEnableClientState(GL_COLOR_ARRAY);
330 glColorPointer(4, GL_UNSIGNED_BYTE, 0, vertexColors);
333 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
335 glDisableClientState(GL_COLOR_ARRAY);
336 glDisableClientState(GL_NORMAL_ARRAY);
337 glDisableClientState(GL_VERTEX_ARRAY);
340 glShadeModel(GL_SMOOTH);
342 for (
int tid = 0; tid < n_tris; ++tid) {
343 int tid_ptr = 3 * tid;
344 int vid0 = triangles[tid_ptr + 0];
345 int vid1 = triangles[tid_ptr + 1];
346 int vid2 = triangles[tid_ptr + 2];
347 int vid0_ptr = 3 * vid0;
348 int vid1_ptr = 3 * vid1;
349 int vid2_ptr = 3 * vid2;
351 glBegin(GL_TRIANGLES);
352 glColor4ubv((GLubyte*) &(vertexColors[vid0]));
353 glNormal3fv(&(triangleNormals[tid_ptr]));
354 glVertex3fv(&(coords[vid0_ptr]));
355 glColor4ubv((GLubyte*) &(vertexColors[vid1]));
356 glNormal3fv(&(triangleNormals[tid_ptr]));
357 glVertex3fv(&(coords[vid1_ptr]));
358 glColor4ubv((GLubyte*) &(vertexColors[vid2]));
359 glNormal3fv(&(triangleNormals[tid_ptr]));
360 glVertex3fv(&(coords[vid2_ptr]));
366 mMRS.
isSurface(MRI::Surface::COLOR_MESH) ||
367 mMRS.
isSurface(MRI::Surface::COLOR_USER)) {
368 if (mMRS.
isSurface(MRI::Surface::SHADING_SMOOTH)) {
369 glEnableClientState(GL_VERTEX_ARRAY);
370 glVertexPointer(3, GL_FLOAT, 0, coords);
372 glEnableClientState(GL_NORMAL_ARRAY);
373 glNormalPointer(GL_FLOAT, 0, vertexNormals);
375 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
376 glColor4fv(mMRD.meshColorBufferData());
379 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
383 GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
385 glDisableClientState(GL_COLOR_ARRAY);
386 glDisableClientState(GL_NORMAL_ARRAY);
387 glDisableClientState(GL_VERTEX_ARRAY);
390 if (mMRS.
isSurface(MRI::Surface::COLOR_MESH)) {
391 glColor4fv(mMRD.meshColorBufferData());
394 glColor4ubv((GLubyte*) mMRS.surfaceUserColorData());
397 for (
int tid = 0; tid < n_tris; ++tid) {
398 int tid_ptr = 3 * tid;
399 int vid0 = triangles[tid_ptr + 0];
400 int vid1 = triangles[tid_ptr + 1];
401 int vid2 = triangles[tid_ptr + 2];
402 int vid0_ptr = 3 * vid0;
403 int vid1_ptr = 3 * vid1;
404 int vid2_ptr = 3 * vid2;
406 glBegin(GL_TRIANGLES);
407 glNormal3fv(&(triangleNormals[tid_ptr]));
408 glVertex3fv(&(coords[vid0_ptr]));
409 glNormal3fv(&(triangleNormals[tid_ptr]));
410 glVertex3fv(&(coords[vid1_ptr]));
411 glNormal3fv(&(triangleNormals[tid_ptr]));
412 glVertex3fv(&(coords[vid2_ptr]));
417 else if (mMRS.
isSurface(MRI::Surface::COLOR_VERTEX_TEX)) {
418 glShadeModel(GL_SMOOTH);
420 for (
int tid = 0; tid < n_tris; ++tid) {
421 int tid_ptr = 3 * tid;
422 int vid0 = triangles[tid_ptr + 0];
423 int vid1 = triangles[tid_ptr + 1];
424 int vid2 = triangles[tid_ptr + 2];
425 int vid0_ptr = 3 * vid0;
426 int vid1_ptr = 3 * vid1;
427 int vid2_ptr = 3 * vid2;
429 mTextID[mMRD.vertexTextureIDsBufferData()[tid]];
430 glBindTexture(GL_TEXTURE_2D, texture);
431 glBegin(GL_TRIANGLES);
432 glColor4f(1, 1, 1, 1);
434 vertTexCoords[vid0 * 2 + 0],
435 vertTexCoords[vid0 * 2 + 1]);
436 glNormal3fv(&(vertexNormals[vid0_ptr]));
437 glVertex3fv(&(coords[vid0_ptr]));
439 vertTexCoords[vid1 * 2 + 0],
440 vertTexCoords[vid1 * 2 + 1]);
441 glNormal3fv(&(vertexNormals[vid1_ptr]));
442 glVertex3fv(&(coords[vid1_ptr]));
444 vertTexCoords[vid2 * 2 + 0],
445 vertTexCoords[vid2 * 2 + 1]);
446 glNormal3fv(&(vertexNormals[vid2_ptr]));
447 glVertex3fv(&(coords[vid2_ptr]));
449 glBindTexture(GL_TEXTURE_2D, 0);
452 else if (mMRS.
isSurface(MRI::Surface::COLOR_WEDGE_TEX)) {
454 for (
int tid = 0; tid < n_tris; ++tid) {
455 int tid_ptr = 3 * tid;
456 int vid0 = triangles[tid_ptr + 0];
457 int vid1 = triangles[tid_ptr + 1];
458 int vid2 = triangles[tid_ptr + 2];
459 int vid0_ptr = 3 * vid0;
460 int vid1_ptr = 3 * vid1;
461 int vid2_ptr = 3 * vid2;
463 mTextID[mMRD.wedgeTextureIDsBufferData()[tid]];
464 glBindTexture(GL_TEXTURE_2D, texture);
465 glBegin(GL_TRIANGLES);
466 glColor4f(1, 1, 1, 1);
468 wedgTexCoords[vid0 * 2 + 0],
469 wedgTexCoords[vid0 * 2 + 1]);
470 glNormal3fv(&(vertexNormals[vid0_ptr]));
471 glVertex3fv(&(coords[vid0_ptr]));
473 wedgTexCoords[vid1 * 2 + 0],
474 wedgTexCoords[vid1 * 2 + 1]);
475 glNormal3fv(&(vertexNormals[vid1_ptr]));
476 glVertex3fv(&(coords[vid1_ptr]));
478 wedgTexCoords[vid2 * 2 + 0],
479 wedgTexCoords[vid2 * 2 + 1]);
480 glNormal3fv(&(vertexNormals[vid2_ptr]));
481 glVertex3fv(&(coords[vid2_ptr]));
483 glBindTexture(GL_TEXTURE_2D, 0);
489 glEnableClientState(GL_VERTEX_ARRAY);
490 glVertexPointer(3, GL_FLOAT, 0, coords);
492 glLineWidth(mMRS.wireframeWidth());
494 if (mMRS.
isWireframe(MRI::Wireframe::COLOR_MESH)) {
495 glColor4fv(mMRD.meshColorBufferData());
498 glColor4fv(mMRS.wireframeUserColorData());
501 glDrawElements(GL_TRIANGLES, nt * 3, GL_UNSIGNED_INT, triangles);
503 glDisableClientState(GL_VERTEX_ARRAY);
509 mTextID.resize(mMRD.textureNumber());
510 glEnable(GL_TEXTURE_2D);
511 glGenTextures(mMRD.textureNumber(), mTextID.data());
513 for (uint i = 0; i < mMRD.textureNumber(); i++) {
514 glBindTexture(GL_TEXTURE_2D, mTextID[i]);
519 mMRD.textureSize(i).x(),
520 mMRD.textureSize(i).y(),
524 mMRD.textureBufferData(i));
525 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
526 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
527 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
528 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
532 void unbindTextures()
534 if (mTextID.size() > 0) {
535 glDeleteTextures(mTextID.size(), mTextID.data());