scene.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2014 Google Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <tango-gl/conversions.h>
19 #include <tango-gl/util.h>
20 
22 #include <rtabmap/utilite/UStl.h>
23 #include <rtabmap/utilite/UTimer.h>
27 #include <pcl/common/transforms.h>
28 #include <pcl/common/common.h>
29 
30 #include <glm/gtx/transform.hpp>
31 
32 #include "scene.h"
33 #include "util.h"
34 
35 // We want to represent the device properly with respect to the ground so we'll
36 // add an offset in z to our origin. We'll set this offset to 1.3 meters based
37 // on the average height of a human standing with a Tango device. This allows us
38 // to place a grid roughly on the ground for most users.
39 const glm::vec3 Scene::kHeightOffset = glm::vec3(0.0f, -1.3f, 0.0f);
40 
41 // Color of the motion tracking trajectory.
42 const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
43 
44 // Color of the ground grid.
45 const tango_gl::Color kGridColor(0.85f, 0.85f, 0.85f);
46 
47 // Frustum scale.
48 const glm::vec3 kFrustumScale = glm::vec3(0.4f, 0.3f, 0.5f);
49 
50 const std::string kGraphVertexShader =
51  "precision mediump float;\n"
52  "precision mediump int;\n"
53  "attribute vec3 vertex;\n"
54  "uniform vec3 color;\n"
55  "uniform mat4 mvp;\n"
56  "varying vec3 v_color;\n"
57  "void main() {\n"
58  " gl_Position = mvp*vec4(vertex.x, vertex.y, vertex.z, 1.0);\n"
59  " v_color = color;\n"
60  "}\n";
61 const std::string kGraphFragmentShader =
62  "precision mediump float;\n"
63  "precision mediump int;\n"
64  "varying vec3 v_color;\n"
65  "void main() {\n"
66  " gl_FragColor = vec4(v_color.z, v_color.y, v_color.x, 1.0);\n"
67  "}\n";
68 
69 
70 
72  background_renderer_(0),
73  gesture_camera_(0),
74  axis_(0),
75  frustum_(0),
76  grid_(0),
77  box_(0),
78  trace_(0),
79  graph_(0),
80  graphVisible_(true),
81  gridVisible_(true),
82  traceVisible_(true),
83  frustumVisible_(true),
84  color_camera_to_display_rotation_(rtabmap::ROTATION_0),
85  currentPose_(0),
86  graph_shader_program_(0),
87  blending_(true),
88  mapRendering_(true),
89  meshRendering_(true),
90  meshRenderingTexture_(true),
91  pointSize_(10.0f),
92  boundingBoxRendering_(false),
93  lighting_(false),
94  backfaceCulling_(true),
95  wireFrame_(false),
96  textureColorSeamsHidden_(true),
97  r_(0.0f),
98  g_(0.0f),
99  b_(0.0f),
100  fboId_(0),
101  rboId_(0),
102  screenWidth_(0),
103  screenHeight_(0),
104  doubleTapOn_(false)
105 {
106  depthTexture_ = 0;
110 }
111 
113  DeleteResources();
114  delete gesture_camera_;
115  delete currentPose_;
116 }
117 
118 //Should only be called in OpenGL thread!
120 {
121  if(axis_ != 0)
122  {
123  DeleteResources();
124  }
125 
126  UASSERT(axis_ == 0);
127 
129 
130  axis_ = new tango_gl::Axis();
131  frustum_ = new tango_gl::Frustum();
132  trace_ = new tango_gl::Trace();
133  grid_ = new tango_gl::Grid();
134  box_ = new BoundingBoxDrawable();
135 
136 
137  axis_->SetScale(glm::vec3(0.5f,0.5f,0.5f));
143  box_->SetShader();
144  box_->SetColor(1,0,0);
145 
147 
148  if(graph_shader_program_ == 0)
149  {
152  }
153 }
154 
155 //Should only be called in OpenGL thread!
157 
158  LOGI("Scene::DeleteResources()");
159  if(axis_)
160  {
161  delete axis_;
162  axis_ = 0;
163  delete frustum_;
164  delete trace_;
165  delete grid_;
166  delete box_;
167  delete background_renderer_;
169  }
170 
173 
174  if (graph_shader_program_) {
175  glDeleteShader(graph_shader_program_);
177  }
178 
179  if(fboId_>0)
180  {
181  glDeleteFramebuffers(1, &fboId_);
182  fboId_ = 0;
183  glDeleteRenderbuffers(1, &rboId_);
184  rboId_ = 0;
185  glDeleteTextures(1, &depthTexture_);
186  depthTexture_ = 0;
187  }
188 
189  clear();
190 }
191 
192 //Should only be called in OpenGL thread!
194 {
195  LOGI("Scene::clear()");
196  for(std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
197  {
198  delete iter->second;
199  }
200  for(std::map<int, tango_gl::Axis*>::iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
201  {
202  delete iter->second;
203  }
204  clearLines();
205  clearQuads();
206  clearTexts();
207  clearCircles();
208  if(trace_)
209  {
211  }
212  if(graph_)
213  {
214  delete graph_;
215  graph_ = 0;
216  }
217  pointClouds_.clear();
218  markers_.clear();
219  if(grid_)
220  {
222  }
223 }
224 
226 {
227  for(std::map<int, tango_gl::Line*>::iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
228  {
229  delete iter->second;
230  }
231  lines_.clear();
232 }
234 {
235  for(std::map<int, TextDrawable*>::iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
236  {
237  delete iter->second;
238  }
239  texts_.clear();
240 }
242 {
243  for(std::map<int, QuadColor*>::iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
244  {
245  delete iter->second;
246  }
247  quads_.clear();
248 }
250 {
251  for(std::map<int, tango_gl::Circle*>::iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
252  {
253  delete iter->second;
254  }
255  circles_.clear();
256 }
257 
258 //Should only be called in OpenGL thread!
259 void Scene::SetupViewPort(int w, int h) {
260  if (h == 0) {
261  LOGE("Setup graphic height not valid");
262  }
263 
264  UASSERT(gesture_camera_ != 0);
265  gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
266  glViewport(0, 0, w, h);
267  if(screenWidth_ != w || screenHeight_ != h || fboId_ == 0)
268  {
269  UINFO("Setup viewport OpenGL: %dx%d", w, h);
270 
271  if(fboId_>0)
272  {
273  glDeleteFramebuffers(1, &fboId_);
274  fboId_ = 0;
275  glDeleteRenderbuffers(1, &rboId_);
276  rboId_ = 0;
277  glDeleteTextures(1, &depthTexture_);
278  depthTexture_ = 0;
279  }
280 
281  GLint originid = 0;
282  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originid);
283 
284  // regenerate fbo texture
285  // create a framebuffer object, you need to delete them when program exits.
286  glGenFramebuffers(1, &fboId_);
287  glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
288 
289  // Create depth texture
290  glGenTextures(1, &depthTexture_);
291  glBindTexture(GL_TEXTURE_2D, depthTexture_);
292  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
293  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
294  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
295  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
296  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
297  glBindTexture(GL_TEXTURE_2D, 0);
298 
299  glGenRenderbuffers(1, &rboId_);
300  glBindRenderbuffer(GL_RENDERBUFFER, rboId_);
301  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);
302  glBindRenderbuffer(GL_RENDERBUFFER, 0);
303 
304  // Set the texture to be at the color attachment point of the FBO (we pack depth 32 bits in color)
305  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depthTexture_, 0);
306  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboId_);
307 
308  GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
309  UASSERT ( status == GL_FRAMEBUFFER_COMPLETE);
310  glBindFramebuffer(GL_FRAMEBUFFER, originid);
311  }
312  screenWidth_ = w;
313  screenHeight_ = h;
314 }
315 
316 std::vector<glm::vec4> computeFrustumPlanes(const glm::mat4 & mat, bool normalize = true)
317 {
318  // http://www.txutxi.com/?p=444
319  std::vector<glm::vec4> planes(6);
320 
321  // Left Plane
322  // col4 + col1
323  planes[0].x = mat[0][3] + mat[0][0];
324  planes[0].y = mat[1][3] + mat[1][0];
325  planes[0].z = mat[2][3] + mat[2][0];
326  planes[0].w = mat[3][3] + mat[3][0];
327 
328  // Right Plane
329  // col4 - col1
330  planes[1].x = mat[0][3] - mat[0][0];
331  planes[1].y = mat[1][3] - mat[1][0];
332  planes[1].z = mat[2][3] - mat[2][0];
333  planes[1].w = mat[3][3] - mat[3][0];
334 
335  // Bottom Plane
336  // col4 + col2
337  planes[2].x = mat[0][3] + mat[0][1];
338  planes[2].y = mat[1][3] + mat[1][1];
339  planes[2].z = mat[2][3] + mat[2][1];
340  planes[2].w = mat[3][3] + mat[3][1];
341 
342  // Top Plane
343  // col4 - col2
344  planes[3].x = mat[0][3] - mat[0][1];
345  planes[3].y = mat[1][3] - mat[1][1];
346  planes[3].z = mat[2][3] - mat[2][1];
347  planes[3].w = mat[3][3] - mat[3][1];
348 
349  // Near Plane
350  // col4 + col3
351  planes[4].x = mat[0][3] + mat[0][2];
352  planes[4].y = mat[1][3] + mat[1][2];
353  planes[4].z = mat[2][3] + mat[2][2];
354  planes[4].w = mat[3][3] + mat[3][2];
355 
356  // Far Plane
357  // col4 - col3
358  planes[5].x = mat[0][3] - mat[0][2];
359  planes[5].y = mat[1][3] - mat[1][2];
360  planes[5].z = mat[2][3] - mat[2][2];
361  planes[5].w = mat[3][3] - mat[3][2];
362 
363  //if(normalize)
364  {
365  for(unsigned int i=0;i<planes.size(); ++i)
366  {
367  if(normalize)
368  {
369  float d = std::sqrt(planes[i].x * planes[i].x + planes[i].y * planes[i].y + planes[i].z * planes[i].z); // for normalizing the coordinates
370  planes[i].x/=d;
371  planes[i].y/=d;
372  planes[i].z/=d;
373  planes[i].w/=d;
374  }
375  }
376  }
377 
378  return planes;
379 }
380 
390  const std::vector<glm::vec4> &planes,
391  const pcl::PointXYZ &boxMin,
392  const pcl::PointXYZ &boxMax)
393 {
394  // Indexed for the 'index trick' later
395  const pcl::PointXYZ * box[] = {&boxMin, &boxMax};
396 
397  // We only need to do 6 point-plane tests
398  for (unsigned int i = 0; i < planes.size(); ++i)
399  {
400  // This is the current plane
401  const glm::vec4 &p = planes[i];
402 
403  // p-vertex selection (with the index trick)
404  // According to the plane normal we can know the
405  // indices of the positive vertex
406  const int px = p.x > 0.0f?1:0;
407  const int py = p.y > 0.0f?1:0;
408  const int pz = p.z > 0.0f?1:0;
409 
410  // Dot product
411  // project p-vertex on plane normal
412  // (How far is p-vertex from the origin)
413  const float dp =
414  (p.x*box[px]->x) +
415  (p.y*box[py]->y) +
416  (p.z*box[pz]->z) + p.w;
417 
418  // Doesn't intersect if it is behind the plane
419  if (dp < 0) {return false; }
420  }
421  return true;
422 }
423 
424 //Should only be called in OpenGL thread!
425 int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat4 arProjectionMatrix, const rtabmap::Mesh & occlusionMesh, bool mapping)
426 {
427  UASSERT(gesture_camera_ != 0);
428 
429  if(currentPose_ == 0)
430  {
431  currentPose_ = new rtabmap::Transform(0,0,0,0,0,-M_PI/2.0f);
432  }
435  glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
436  glm::mat4 rotateM;
437  if(!currentPose_->isNull())
438  {
439  rotateM = glm::rotate<float>(float(color_camera_to_display_rotation_)*-1.57079632679489661923132169163975144, glm::vec3(0.0f, 0.0f, 1.0f));
440 
442  {
443  // In first person mode, we directly control camera's motion.
446  }
447  else
448  {
449  // In third person or top down mode, we follow the camera movement.
451  }
452  }
453 
454  glm::mat4 projectionMatrix = gesture_camera_->GetProjectionMatrix();
455  glm::mat4 viewMatrix = gesture_camera_->GetViewMatrix();
456 
457  bool renderBackgroundCamera =
460  !rtabmap::glmToTransform(arProjectionMatrix).isNull() &&
461  uvsTransformed;
462 
463  if(renderBackgroundCamera)
464  {
465  if(projectionMatrix[0][0] > arProjectionMatrix[0][0]-0.3)
466  {
467  projectionMatrix = arProjectionMatrix;
468  viewMatrix = arViewMatrix;
469  }
470  else
471  {
472  renderBackgroundCamera = false;
473  }
474  }
475 
476  rtabmap::Transform openglCamera = GetOpenGLCameraPose();//*rtabmap::Transform(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f);
477  // transform in same coordinate as frustum filtering
478  openglCamera *= rtabmap::Transform(
479  0.0f, 0.0f, 1.0f, 0.0f,
480  0.0f, 1.0f, 0.0f, 0.0f,
481  -1.0f, 0.0f, 0.0f, 0.0f);
482 
483  //Culling
484  std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
485  std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
486  int oi=0;
487  int positiveCloudIds = 0;
488  for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
489  {
490  if(iter->first > 0)
491  {
492  positiveCloudIds++;
493  }
494 
495  if(!mapRendering_ && iter->first > 0)
496  {
497  break;
498  }
499 
500  if(iter->second->isVisible())
501  {
503  iter->second->aabbMinWorld(),
504  iter->second->aabbMaxWorld()))
505  {
506  cloudsToDraw[oi++] = iter->second;
507  }
508  }
509  }
510  cloudsToDraw.resize(oi);
511 
512  // First rendering to get depth texture
513  glEnable(GL_DEPTH_TEST);
514  glDepthFunc(GL_LESS);
515  glDepthMask(GL_TRUE);
516  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
517  glDisable (GL_BLEND);
518  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
519 
520  if(backfaceCulling_)
521  {
522  glEnable(GL_CULL_FACE);
523  }
524  else
525  {
526  glDisable(GL_CULL_FACE);
527  }
528 
529  bool onlineBlending =
530  (!meshRendering_ &&
531  occlusionMesh.cloud.get() &&
532  occlusionMesh.cloud->size()) ||
533  (blending_ &&
536  (positiveCloudIds > 1 || (renderBackgroundCamera && wireFrame_)));
537 
538  if(onlineBlending && fboId_)
539  {
540  GLint originid = 0;
541  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originid);
542 
543  // set the rendering destination to FBO
544  glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
545 
546  glClearColor(0, 0, 0, 0);
547  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
548 
549  // Draw scene
550  for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
551  {
552  Eigen::Vector3f cloudToCamera(
553  (*iter)->getPose().x() - openglCamera.x(),
554  (*iter)->getPose().y() - openglCamera.y(),
555  (*iter)->getPose().z() - openglCamera.z());
556  float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
557  (*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, false, false, distanceToCameraSqr, 0, 0, 0, 0, 0, true);
558  }
559 
560  if(!meshRendering_ && occlusionMesh.cloud.get() && occlusionMesh.cloud->size())
561  {
562  PointCloudDrawable drawable(occlusionMesh);
563  drawable.Render(projectionMatrix, viewMatrix, true, pointSize_, false, false, 0, 0, 0, 0, 0, 0, true);
564  }
565 
566  // back to normal window-system-provided framebuffer
567  glBindFramebuffer(GL_FRAMEBUFFER, originid); // unbind
568  }
569 
571  {
572  glClearColor(0, 0, 0, 0);
573  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
574 
575  // FIXME: we could use the depthTexture if already computed!
576  for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
577  {
578  Eigen::Vector3f cloudToCamera(
579  (*iter)->getPose().x() - openglCamera.x(),
580  (*iter)->getPose().y() - openglCamera.y(),
581  (*iter)->getPose().z() - openglCamera.z());
582  float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
583 
584  (*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_*10.0f, false, false, distanceToCameraSqr, 0, 0, 0, 0, 0, true);
585  }
586 
587  GLubyte zValue[4];
588  glReadPixels(doubleTapPos_.x*screenWidth_, screenHeight_-doubleTapPos_.y*screenHeight_, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, zValue);
589  float zValueF = float(zValue[0]/255.0f) + float(zValue[1]/255.0f)/255.0f + float(zValue[2]/255.0f)/65025.0f + float(zValue[3]/255.0f)/160581375.0f;
590 
591  if(zValueF != 0.0f)
592  {
593  zValueF = zValueF*2.0-1.0;//NDC
594  glm::vec4 point = glm::inverse(projectionMatrix*viewMatrix)*glm::vec4(doubleTapPos_.x*2.0f-1.0f, (1.0f-doubleTapPos_.y)*2.0f-1.0f, zValueF, 1.0f);
595  point /= point.w;
597  }
598  }
599  doubleTapOn_ = false;
600 
601  glClearColor(r_, g_, b_, 1.0f);
602  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
603 
604  if(renderBackgroundCamera && (!onlineBlending || !meshRendering_))
605  {
606  background_renderer_->Draw(uvsTransformed, 0, screenWidth_, screenHeight_, false);
607 
608  //To debug occlusion image:
609  //PointCloudDrawable drawable(occlusionMesh);
610  //drawable.Render(projectionMatrix, viewMatrix, true, pointSize_, false, false, 999.0f);
611  }
612 
613  if(!currentPose_->isNull())
614  {
616  {
619  // Set the frustum scale to 4:3, this doesn't necessarily match the physical
620  // camera's aspect ratio, this is just for visualization purposes.
622  frustum_->Render(projectionMatrix, viewMatrix);
623 
625  glm::vec3 positionCamera(cameraFrame.x(), cameraFrame.y(), cameraFrame.z());
626  Eigen::Quaternionf quatCamera = cameraFrame.getQuaternionf();
627  glm::quat rotationCamera(quatCamera.w(), quatCamera.x(), quatCamera.y(), quatCamera.z());
628 
629  axis_->SetPosition(positionCamera);
630  axis_->SetRotation(rotationCamera);
631  axis_->Render(projectionMatrix, viewMatrix);
632  }
633 
635  if(traceVisible_)
636  {
637  trace_->Render(projectionMatrix, viewMatrix);
638  }
639  else
640  {
642  }
643  }
644 
645  if(gridVisible_ && !renderBackgroundCamera)
646  {
647  grid_->Render(projectionMatrix, viewMatrix);
648  }
649 
650  if(graphVisible_ && graph_)
651  {
652  graph_->Render(projectionMatrix, viewMatrix);
653  }
654 
655 
656  if(onlineBlending)
657  {
658  glEnable (GL_BLEND);
659  glDepthMask(GL_FALSE);
660  }
661 
662  for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
663  {
664  PointCloudDrawable * cloud = *iter;
665 
667  {
668  box_->updateVertices(cloud->aabbMinWorld(), cloud->aabbMaxWorld());
669  box_->Render(projectionMatrix, viewMatrix);
670  }
671 
672  Eigen::Vector3f cloudToCamera(
673  cloud->getPose().x() - openglCamera.x(),
674  cloud->getPose().y() - openglCamera.y(),
675  cloud->getPose().z() - openglCamera.z());
676  float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
677 
679  }
680 
681  if(quads_.find(55556)!=quads_.end())
682  {
683  glEnable(GL_BLEND);
684  glDisable(GL_CULL_FACE);
685  const QuadColor * quad = quads_.at(55556);
686  quad->Render(projectionMatrix, viewMatrix);
687  glEnable(GL_CULL_FACE);
688  }
689 
690  if(onlineBlending)
691  {
692  if(renderBackgroundCamera && meshRendering_)
693  {
695  }
696 
697  glDisable (GL_BLEND);
698  glDepthMask(GL_TRUE);
699  }
700 
702  glDisable (GL_DEPTH_TEST);
703  if(lines_.size())
704  {
705  for(std::map<int, tango_gl::Line*>::const_iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
706  {
707  const tango_gl::Line * line = iter->second;
708  line->Render(projectionMatrix, viewMatrix);
709  }
710  }
711 
712  if(quads_.size())
713  {
714  glEnable(GL_BLEND);
715  glDisable(GL_CULL_FACE);
716  for(std::map<int, QuadColor*>::const_iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
717  {
718  if(iter->first!=55556)
719  {
720  const QuadColor * quad = iter->second;
721  quad->Render(projectionMatrix, viewMatrix);
722  }
723  }
724  }
725  if(circles_.size())
726  {
727  glEnable(GL_BLEND);
728  glDisable(GL_CULL_FACE);
729  for(std::map<int, tango_gl::Circle*>::const_iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
730  {
731  const tango_gl::Circle * circle = iter->second;
732  circle->Render(projectionMatrix, viewMatrix);
733  }
734  }
735  if(texts_.size())
736  {
737  glDisable(GL_CULL_FACE);
738  glEnable(GL_BLEND);
739 
740  glm::mat4 viewMatrixRotInv = viewMatrix;
741  viewMatrixRotInv[3][0] = 0;
742  viewMatrixRotInv[3][1] = 0;
743  viewMatrixRotInv[3][2] = 0;
744  viewMatrixRotInv = glm::inverse(viewMatrixRotInv);
745  for(std::map<int, TextDrawable*>::const_iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
746  {
747  const TextDrawable * text = iter->second;
748  text->Render(projectionMatrix, viewMatrix, viewMatrixRotInv);
749  }
750  }
751 
752  //draw markers on foreground
753  for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
754  {
755  iter->second->Render(projectionMatrix, viewMatrix);
756  }
757 
758  return (int)cloudsToDraw.size();
759 }
760 
762  gesture_camera_->SetCameraType(camera_type);
763 }
764 
766 {
767  UASSERT(!pose.isNull());
768  if(currentPose_ ==0)
769  {
770  currentPose_ = new rtabmap::Transform(0,0,0,0,0,-M_PI/2.0f);
771  }
772  *currentPose_ = pose;
773 }
774 
775 void Scene::setFOV(float angle)
776 {
778 }
779 void Scene::setOrthoCropFactor(float value)
780 {
782 }
783 void Scene::setGridRotation(float angleDeg)
784 {
785  float angleRad = angleDeg * DEGREE_2_RADIANS;
786  if(grid_)
787  {
788  glm::quat rot = glm::rotate(glm::quat(1,0,0,0), angleRad, glm::vec3(0, 1, 0));
790  }
791 }
792 
794 {
795  if(fov)
796  {
797  *fov = gesture_camera_->getFOV();
798  }
800 }
801 
802 void Scene::OnTouchEvent(int touch_count,
803  tango_gl::GestureCamera::TouchEvent event, float x0,
804  float y0, float x1, float y1) {
805  UASSERT(gesture_camera_ != 0);
806  if(touch_count == 3)
807  {
808  //doubletap
809  if(!doubleTapOn_)
810  {
811  doubleTapPos_.x = x0;
812  doubleTapPos_.y = y0;
813  doubleTapOn_ = true;
814  }
815  }
816  else
817  {
818  // rotate/translate/zoom
819  gesture_camera_->OnTouchEvent(touch_count, event, x0, y0, x1, y1);
820  }
821 }
822 
824  const std::map<int, rtabmap::Transform> & poses,
825  const std::multimap<int, rtabmap::Link> & links)
826 {
827  LOGI("updateGraph");
828  //create
830  delete graph_;
831  graph_ = new GraphDrawable(graph_shader_program_, poses, links);
832 }
833 
834 void Scene::setGraphVisible(bool visible)
835 {
836  graphVisible_ = visible;
837 }
838 
839 void Scene::setGridVisible(bool visible)
840 {
841  gridVisible_ = visible;
842 }
843 
844 void Scene::setTraceVisible(bool visible)
845 {
846  traceVisible_ = visible;
847 }
848 
849 void Scene::setFrustumVisible(bool visible)
850 {
851  frustumVisible_ = visible;
852 }
853 
854 //Should only be called in OpenGL thread!
856  int id,
857  const rtabmap::Transform & pose)
858 {
859  LOGI("add marker %d", id);
860  std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
861  if(iter == markers_.end())
862  {
863  //create
864  tango_gl::Axis * drawable = new tango_gl::Axis();
865  drawable->SetScale(glm::vec3(0.05f,0.05f,0.05f));
866  drawable->SetLineWidth(5);
867  markers_.insert(std::make_pair(id, drawable));
868  }
869  setMarkerPose(id, pose);
870 }
871 void Scene::setMarkerPose(int id, const rtabmap::Transform & pose)
872 {
873  UASSERT(!pose.isNull());
874  std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
875  if(iter != markers_.end())
876  {
877  glm::vec3 position(pose.x(), pose.y(), pose.z());
879  glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
880  iter->second->SetPosition(position);
881  iter->second->SetRotation(rotation);
882  }
883 }
884 bool Scene::hasMarker(int id) const
885 {
886  return markers_.find(id) != markers_.end();
887 }
889 {
890  std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
891  if(iter != markers_.end())
892  {
893  delete iter->second;
894  markers_.erase(iter);
895  }
896 }
897 std::set<int> Scene::getAddedMarkers() const
898 {
899  return uKeysSet(markers_);
900 }
901 
903  int id,
904  const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
905  const pcl::IndicesPtr & indices,
906  const rtabmap::Transform & pose)
907 {
908  LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
909  removeCloudOrMesh(id);
910 
911  //create
912  PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
913  drawable->setPose(pose);
914  pointClouds_.insert(std::make_pair(id, drawable));
915 }
916 
918 {
919  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
920  if(iter != pointClouds_.end())
921  {
922  delete iter->second;
923  pointClouds_.erase(iter);
924  }
925 }
926 
928  int id,
929  const rtabmap::Mesh & mesh,
930  const rtabmap::Transform & pose,
931  bool createWireframe)
932 {
933  LOGI("add mesh %d", id);
934  removeCloudOrMesh(id);
935 
936  //create
937  PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
938  drawable->setPose(pose);
939  pointClouds_.insert(std::make_pair(id, drawable));
940 
941  if(!mesh.pose.isNull() && mesh.cloud->size() && (!mesh.cloud->isOrganized() || mesh.indices->size()))
942  {
943  UTimer time;
944  float height = 0.0f;
945  Eigen::Affine3f affinePose = mesh.pose.toEigen3f();
946  if(mesh.polygons.size())
947  {
948  for(unsigned int i=0; i<mesh.polygons.size(); ++i)
949  {
950  for(unsigned int j=0; j<mesh.polygons[i].vertices.size(); ++j)
951  {
952  pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.polygons[i].vertices[j]), affinePose);
953  if(pt.z < height)
954  {
955  height = pt.z;
956  }
957  }
958  }
959  }
960  else
961  {
962  if(mesh.cloud->isOrganized())
963  {
964  for(unsigned int i=0; i<mesh.indices->size(); ++i)
965  {
966  pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.indices->at(i)), affinePose);
967  if(pt.z < height)
968  {
969  height = pt.z;
970  }
971  }
972  }
973  else
974  {
975  for(unsigned int i=0; i<mesh.cloud->size(); ++i)
976  {
977  pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(i), affinePose);
978  if(pt.z < height)
979  {
980  height = pt.z;
981  }
982  }
983  }
984  }
985 
986  if(grid_->GetPosition().y == kHeightOffset.y || grid_->GetPosition().y > height)
987  {
988  grid_->SetPosition(glm::vec3(0,height,0));
989  }
990  LOGD("compute min height %f s", time.ticks());
991  }
992 }
993 
995  int id,
996  const cv::Point3f & pt1,
997  const cv::Point3f & pt2,
998  const tango_gl::Color & color)
999 {
1000  LOGI("add line %d", id);
1001  removeLine(id);
1002 
1003  //create
1004  tango_gl::Line * line = new tango_gl::Line(2.0f, GL_LINES);
1005  line->SetShader();
1006  std::vector<glm::vec3> vertices(2);
1007  vertices[0].x = pt1.x;
1008  vertices[0].y = pt1.y;
1009  vertices[0].z = pt1.z;
1010  vertices[1].x = pt2.x;
1011  vertices[1].y = pt2.y;
1012  vertices[1].z = pt2.z;
1014  line->SetColor(color);
1015  lines_.insert(std::make_pair(id, line));
1016 }
1017 
1018 void Scene::removeLine(int id)
1019 {
1020  std::map<int, tango_gl::Line*>::iterator iter=lines_.find(id);
1021  if(iter != lines_.end())
1022  {
1023  delete iter->second;
1024  lines_.erase(iter);
1025  }
1026 }
1027 
1029  int id,
1030  const std::string & text,
1031  const rtabmap::Transform & pose,
1032  float size,
1033  const tango_gl::Color & color)
1034 {
1035  LOGI("add text %d", id);
1036  removeText(id);
1037 
1038  //create
1039  TextDrawable * textD = new TextDrawable(text, pose, size, color);
1040  texts_.insert(std::make_pair(id, textD));
1041 }
1042 void Scene::removeText(int id)
1043 {
1044  std::map<int, TextDrawable*>::iterator iter=texts_.find(id);
1045  if(iter != texts_.end())
1046  {
1047  delete iter->second;
1048  texts_.erase(iter);
1049  }
1050 }
1051 
1053  int id,
1054  float size,
1055  const rtabmap::Transform & pose,
1056  const tango_gl::Color & color,
1057  float alpha)
1058 {
1059  //LOGI("add quad %d", id);
1060  std::map<int, QuadColor*>::iterator iter=quads_.find(id);
1061  if(iter != quads_.end())
1062  {
1063  delete iter->second;
1064  quads_.erase(iter);
1065  }
1066 
1067  //create
1068  QuadColor * quad = new QuadColor(size);
1070  quad->SetColor(color);
1071  quad->SetAlpha(alpha);
1072  quads_.insert(std::make_pair(id, quad));
1073 }
1074 
1076  int id,
1077  float widthLeft,
1078  float widthRight,
1079  float heightBottom,
1080  float heightTop,
1081  const rtabmap::Transform & pose,
1082  const tango_gl::Color & color,
1083  float alpha)
1084 {
1085  //LOGI("add quad %d", id);
1086  removeQuad(id);
1087 
1088  //create
1089  QuadColor * quad = new QuadColor(widthLeft, widthRight, heightBottom, heightTop);
1091  quad->SetColor(color);
1092  quad->SetAlpha(alpha);
1093  quads_.insert(std::make_pair(id, quad));
1094 }
1095 
1096 void Scene::removeQuad(int id)
1097 {
1098  std::map<int, QuadColor*>::iterator iter=quads_.find(id);
1099  if(iter != quads_.end())
1100  {
1101  delete iter->second;
1102  quads_.erase(iter);
1103  }
1104 }
1105 
1106 bool Scene::hasQuad(int id) const
1107 {
1108  return quads_.find(id) != quads_.end();
1109 }
1110 
1112  int id,
1113  float radius,
1114  const rtabmap::Transform & pose,
1115  const tango_gl::Color & color,
1116  float alpha)
1117 {
1118  //LOGI("add quad %d", id);
1119  std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
1120  if(iter != circles_.end())
1121  {
1122  delete iter->second;
1123  circles_.erase(iter);
1124  }
1125 
1126  //create
1127  tango_gl::Circle * circle = new tango_gl::Circle(radius, 12);
1128  circle->SetTransformationMatrix(glmFromTransform(pose));
1129  circle->SetColor(color);
1130  circle->SetAlpha(alpha);
1131  circles_.insert(std::make_pair(id, circle));
1132 }
1133 
1135 {
1136  std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
1137  if(iter != circles_.end())
1138  {
1139  delete iter->second;
1140  circles_.erase(iter);
1141  }
1142 }
1143 
1144 bool Scene::hasCircle(int id) const
1145 {
1146  return circles_.find(id) != circles_.end();
1147 }
1148 
1149 void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
1150 {
1151  UASSERT(!pose.isNull());
1152  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
1153  if(iter != pointClouds_.end())
1154  {
1155  iter->second->setPose(pose);
1156  }
1157 }
1158 
1159 void Scene::setCloudVisible(int id, bool visible)
1160 {
1161  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
1162  if(iter != pointClouds_.end())
1163  {
1164  iter->second->setVisible(visible);
1165  }
1166 }
1167 
1168 bool Scene::hasCloud(int id) const
1169 {
1170  return pointClouds_.find(id) != pointClouds_.end();
1171 }
1172 
1173 bool Scene::hasMesh(int id) const
1174 {
1175  return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasMesh();
1176 }
1177 
1178 bool Scene::hasTexture(int id) const
1179 {
1180  return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasTexture();
1181 }
1182 
1183 std::set<int> Scene::getAddedClouds() const
1184 {
1185  return uKeysSet(pointClouds_);
1186 }
1187 
1188 void Scene::updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons)
1189 {
1190  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
1191  if(iter != pointClouds_.end())
1192  {
1193  iter->second->updatePolygons(polygons);
1194  }
1195 }
1196 
1197 void Scene::updateMesh(int id, const rtabmap::Mesh & mesh)
1198 {
1199  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
1200  if(iter != pointClouds_.end())
1201  {
1202  iter->second->updateMesh(mesh);
1203  }
1204 }
1205 
1206 void Scene::updateGains(int id, float gainR, float gainG, float gainB)
1207 {
1208  std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
1209  if(iter != pointClouds_.end())
1210  {
1211  iter->second->setGains(gainR, gainG, gainB);
1212  }
1213 }
1214 
1215 void Scene::setGridColor(float r, float g, float b)
1216 {
1217  if(grid_)
1218  {
1219  grid_->SetColor(r, g, b);
1220  }
1221 }
w
RowVector3d w
PointCloudDrawable::releaseShaderPrograms
static void releaseShaderPrograms()
Definition: point_cloud_drawable.cpp:315
Scene::hasTexture
bool hasTexture(int id) const
Definition: scene.cpp:1178
tango_gl::Transform::GetPosition
glm::vec3 GetPosition() const
Definition: transform.cpp:39
tango_gl::GestureCamera::getFOV
float getFOV() const
Definition: gesture_camera.h:69
Scene::addQuad
void addQuad(int id, float size, const rtabmap::Transform &pose, const tango_gl::Color &color, float alpha=1.0f)
Definition: scene.cpp:1052
tango_gl::Camera::GetViewMatrix
glm::mat4 GetViewMatrix()
Definition: camera.cpp:34
Scene::fboId_
GLuint fboId_
Definition: scene.h:263
Scene::currentPose_
rtabmap::Transform * currentPose_
Definition: scene.h:245
Scene::OnTouchEvent
void OnTouchEvent(int touch_count, tango_gl::GestureCamera::TouchEvent event, float x0, float y0, float x1, float y1)
Definition: scene.cpp:802
Scene::Render
int Render(const float *uvsTransformed=0, glm::mat4 arViewMatrix=glm::mat4(0), glm::mat4 arProjectionMatrix=glm::mat4(0), const rtabmap::Mesh &occlusionMesh=rtabmap::Mesh(), bool mapping=false)
Definition: scene.cpp:425
BoundingBoxDrawable::updateVertices
void updateVertices(const pcl::PointXYZ &min, const pcl::PointXYZ &max)
Definition: bounding_box_drawable.h:42
UINFO
#define UINFO(...)
Scene::b_
float b_
Definition: scene.h:262
Scene::lines_
std::map< int, tango_gl::Line * > lines_
Definition: scene.h:240
BackgroundRenderer::Draw
void Draw(const float *transformed_uvs, const GLuint &depthTexture, int screenWidth, int screenHeight, bool redUnknown)
Definition: background_renderer.cc:157
glm::detail::tquat::y
T y
Definition: gtc/quaternion.hpp:65
tango_gl::DrawableObject::SetAlpha
void SetAlpha(const float alpha)
Definition: drawable_object.cpp:49
tango_gl::GestureCamera::kTopOrtho
@ kTopOrtho
Definition: gesture_camera.h:32
util3d_surface.h
x1
Double_ x1(x1_key)
Scene::clearLines
void clearLines()
Definition: scene.cpp:225
Scene::screenWidth_
GLsizei screenWidth_
Definition: scene.h:266
Eigen::Transform
alpha
RealScalar alpha
tango_gl::DrawableObject::SetColor
void SetColor(const Color &color)
Definition: drawable_object.cpp:45
Scene::pointClouds_
std::map< int, PointCloudDrawable * > pointClouds_
Definition: scene.h:239
Scene::graphVisible_
bool graphVisible_
Definition: scene.h:230
QuadColor::Render
void Render(const glm::mat4 &projection_mat, const glm::mat4 &view_mat) const
Definition: quad_color.cpp:51
tango_gl::GestureCamera::SetCameraType
void SetCameraType(CameraType camera_index)
Definition: gesture_camera.cpp:180
tango_gl::Camera::getNearClipPlane
float getNearClipPlane() const
Definition: camera.h:39
tango_gl::Camera::SetWindowSize
void SetWindowSize(const float width, const float height)
Definition: camera.cpp:46
Scene::clear
void clear()
Definition: scene.cpp:193
b
Array< int, 3, 1 > b
Scene::rboId_
GLuint rboId_
Definition: scene.h:264
Scene::setGridColor
void setGridColor(float r, float g, float b)
Definition: scene.cpp:1215
Scene::setGridVisible
void setGridVisible(bool visible)
Definition: scene.cpp:839
kTraceColor
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f)
Scene::wireFrame_
bool wireFrame_
Definition: scene.h:258
Scene::texts_
std::map< int, TextDrawable * > texts_
Definition: scene.h:241
tango_gl::GestureCamera::kFirstPerson
@ kFirstPerson
Definition: gesture_camera.h:29
tango_gl::Line::SetLineWidth
void SetLineWidth(const float pixels)
Definition: line.cpp:24
Scene::graph_shader_program_
GLuint graph_shader_program_
Definition: scene.h:248
PointCloudDrawable::setPose
void setPose(const rtabmap::Transform &pose)
Definition: point_cloud_drawable.cpp:977
Scene::screenHeight_
GLsizei screenHeight_
Definition: scene.h:267
glm::quat
highp_quat quat
Quaternion of default single-precision floating-point numbers.
Definition: fwd.hpp:68
size
Index size
glm::rotate
GLM_FUNC_DECL detail::tmat4x4< T, P > rotate(detail::tmat4x4< T, P > const &m, T const &angle, detail::tvec3< T, P > const &axis)
Scene::r_
float r_
Definition: scene.h:260
Scene::~Scene
~Scene()
Definition: scene.cpp:112
tango_gl::Axis::Render
void Render(const glm::mat4 &projection_mat, const glm::mat4 &view_mat) const
Definition: axis.cpp:53
Scene::frustum_
tango_gl::Frustum * frustum_
Definition: scene.h:219
Scene::addCircle
void addCircle(int id, float radius, const rtabmap::Transform &pose, const tango_gl::Color &color, float alpha=1.0f)
Definition: scene.cpp:1111
Scene::backfaceCulling_
bool backfaceCulling_
Definition: scene.h:257
Scene::addMesh
void addMesh(int id, const rtabmap::Mesh &mesh, const rtabmap::Transform &pose, bool createWireframe=false)
Definition: scene.cpp:927
tango_gl::Line::Render
void Render(const glm::mat4 &projection_mat, const glm::mat4 &view_mat) const
Definition: line.cpp:25
Scene::g_
float g_
Definition: scene.h:261
util.h
if
if(ret >=0) *info
boxMax
Vector3f boxMax(Vector3f::Ones())
tango_gl::Line
Definition: line.h:23
tango_gl::GestureCamera::GetCameraType
CameraType GetCameraType() const
Definition: gesture_camera.h:68
tango_gl::Axis
Definition: axis.h:23
Scene::updateCloudPolygons
void updateCloudPolygons(int id, const std::vector< pcl::Vertices > &polygons)
Definition: scene.cpp:1188
kFrustumScale
const glm::vec3 kFrustumScale
Definition: scene.cpp:48
glm::vec3
highp_vec3 vec3
Definition: type_vec.hpp:392
Scene::SetupViewPort
void SetupViewPort(int w, int h)
Definition: scene.cpp:259
y
Matrix3f y
Scene::getAddedClouds
std::set< int > getAddedClouds() const
Definition: scene.cpp:1183
Scene::getAddedMarkers
std::set< int > getAddedMarkers() const
Definition: scene.cpp:897
true
#define true
Definition: ConvertUTF.c:57
glm::normalize
GLM_FUNC_DECL genType normalize(genType const &x)
Scene::hasCircle
bool hasCircle(int id) const
Definition: scene.cpp:1144
tango_gl::Transform::SetPosition
void SetPosition(const glm::vec3 &position)
Definition: transform.cpp:35
h
const double h
Scene::quads_
std::map< int, QuadColor * > quads_
Definition: scene.h:242
glm::detail::tquat
Definition: fwd.hpp:41
kGraphVertexShader
const std::string kGraphVertexShader
Definition: scene.cpp:50
tango_gl::GestureCamera
Definition: gesture_camera.h:26
glm::detail::tquat::z
T z
Definition: gtc/quaternion.hpp:65
glm::detail::tvec3
Definition: type_mat.hpp:37
Scene::setFOV
void setFOV(float angle)
Definition: scene.cpp:775
box
box
tango_gl::Circle
Definition: circle.h:23
rtabmap::Mesh::pose
rtabmap::Transform pose
Definition: util.h:182
Scene::clearQuads
void clearQuads()
Definition: scene.cpp:241
rot
int EIGEN_BLAS_FUNC() rot(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps)
Scene::removeMarker
void removeMarker(int id)
Definition: scene.cpp:888
UTimer.h
glm::detail::tmat4x4
Definition: type_mat.hpp:47
rtabmap::Transform::isNull
bool isNull() const
Definition: Transform.cpp:107
conversions.h
LOGE
#define LOGE(...)
Definition: tango-gl/include/tango-gl/util.h:61
Scene::lighting_
bool lighting_
Definition: scene.h:256
indices
indices
tango_gl::Trace::ClearVertexArray
void ClearVertexArray()
Definition: trace.cpp:37
rtabmap::Mesh
Definition: util.h:165
Scene::addLine
void addLine(int id, const cv::Point3f &pt1, const cv::Point3f &pt2, const tango_gl::Color &color=tango_gl::Color(1.0f, 1.0f, 1.0f))
Definition: scene.cpp:994
Scene::updateGains
void updateGains(int id, float gainR, float gainG, float gainB)
Definition: scene.cpp:1206
rtabmap::Transform::toEigen3f
Eigen::Affine3f toEigen3f() const
Definition: Transform.cpp:391
tango_gl::GestureCamera::CameraType
CameraType
Definition: gesture_camera.h:28
tango_gl::Camera::GetProjectionMatrix
glm::mat4 GetProjectionMatrix()
Definition: camera.cpp:38
Scene::meshRenderingTexture_
bool meshRenderingTexture_
Definition: scene.h:253
rtabmap::util3d::transformPoint
cv::Point3f RTABMAP_CORE_EXPORT transformPoint(const cv::Point3f &pt, const Transform &transform)
Definition: util3d_transforms.cpp:211
rtabmap::Transform::y
float & y()
Definition: Transform.h:93
Scene::blending_
bool blending_
Definition: scene.h:250
tango_gl::Camera::SetFieldOfView
void SetFieldOfView(const float fov)
Definition: camera.cpp:52
point
point
tango_gl::GestureCamera::kThirdPersonFollow
@ kThirdPersonFollow
Definition: gesture_camera.h:30
rtabmap::Transform::z
float & z()
Definition: Transform.h:94
GL_FALSE
#define GL_FALSE
Definition: dummy.cpp:79
Scene::frustumVisible_
bool frustumVisible_
Definition: scene.h:233
scene.h
GLuint
unsigned int GLuint
Definition: dummy.cpp:78
util3d_transforms.h
Scene::Scene
Scene()
Definition: scene.cpp:71
GraphDrawable
Definition: graph_drawable.h:43
g
float g
j
std::ptrdiff_t j
Scene::clearTexts
void clearTexts()
Definition: scene.cpp:233
Scene::background_renderer_
BackgroundRenderer * background_renderer_
Definition: scene.h:209
BoundingBoxDrawable
Definition: bounding_box_drawable.h:33
vertices
static const float vertices[]
Definition: quad_color.cpp:20
tango_gl::util::CreateProgram
GLuint CreateProgram(const char *vertex_source, const char *fragment_source)
Definition: util.cpp:75
glm::sqrt
GLM_FUNC_DECL vecType< T, P > sqrt(vecType< T, P > const &x)
TextDrawable::createShaderProgram
static void createShaderProgram()
Definition: text_drawable.cpp:71
util3d_filtering.h
glm::detail::tquat::w
T w
Definition: gtc/quaternion.hpp:65
planes
void planes()
kGraphFragmentShader
const std::string kGraphFragmentShader
Definition: scene.cpp:61
PointCloudDrawable::getPose
rtabmap::Transform getPose() const
Definition: point_cloud_drawable.h:70
Scene::markers_
std::map< int, tango_gl::Axis * > markers_
Definition: scene.h:235
tango_gl::Line::UpdateLineVertices
void UpdateLineVertices(const std::vector< glm::vec3 > &vec_vertices)
Definition: line.h:28
Scene::textureColorSeamsHidden_
bool textureColorSeamsHidden_
Definition: scene.h:259
rtabmap::optical_T_opengl
static const rtabmap::Transform optical_T_opengl(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f)
x0
x0
rtabmap::Transform::x
float & x()
Definition: Transform.h:92
Scene::addMarker
void addMarker(int id, const rtabmap::Transform &pose)
Definition: scene.cpp:855
PointCloudDrawable::aabbMinWorld
const pcl::PointXYZ & aabbMinWorld() const
Definition: point_cloud_drawable.h:78
tango_gl::GestureCamera::TouchEvent
TouchEvent
Definition: gesture_camera.h:36
glm::vec4
highp_vec4 vec4
Definition: type_vec.hpp:397
glm::detail::tvec4
Definition: type_mat.hpp:38
TextDrawable
Definition: text_drawable.h:36
computeFrustumPlanes
std::vector< glm::vec4 > computeFrustumPlanes(const glm::mat4 &mat, bool normalize=true)
Definition: scene.cpp:316
Scene::removeQuad
void removeQuad(int id)
Definition: scene.cpp:1096
PointCloudDrawable::aabbMaxWorld
const pcl::PointXYZ & aabbMaxWorld() const
Definition: point_cloud_drawable.h:79
tango_gl::Trace
Definition: trace.h:23
Scene::DeleteResources
void DeleteResources()
Definition: scene.cpp:156
PointCloudDrawable::createShaderPrograms
static void createShaderPrograms()
Definition: point_cloud_drawable.cpp:287
Scene::grid_
tango_gl::Grid * grid_
Definition: scene.h:222
Scene::setOrthoCropFactor
void setOrthoCropFactor(float value)
Definition: scene.cpp:779
UASSERT
#define UASSERT(condition)
d
d
glm::detail::tvec3::y
T y
Definition: type_vec3.hpp:85
z
z
x
x
p
Point3_ p(2)
Scene::InitGLContent
void InitGLContent()
Definition: scene.cpp:119
Scene::depthTexture_
GLuint depthTexture_
Definition: scene.h:265
Scene::doubleTapPos_
cv::Point2f doubleTapPos_
Definition: scene.h:269
tango_gl::Transform::SetScale
void SetScale(const glm::vec3 &scale)
Definition: transform.cpp:51
glm::angle
GLM_FUNC_DECL T angle(detail::tquat< T, P > const &x)
Scene::addCloud
void addCloud(int id, const pcl::PointCloud< pcl::PointXYZRGB >::Ptr &cloud, const pcl::IndicesPtr &indices, const rtabmap::Transform &pose)
Definition: scene.cpp:902
tango_gl::Frustum
Definition: frustum.h:23
Scene::doubleTapOn_
bool doubleTapOn_
Definition: scene.h:268
boxMin
Vector3f boxMin(Vector3f::Zero())
time
#define time
uKeysSet
std::set< K > uKeysSet(const std::map< K, V > &m)
Definition: UStl.h:186
Scene::setCloudVisible
void setCloudVisible(int id, bool visible)
Definition: scene.cpp:1159
Scene::clearCircles
void clearCircles()
Definition: scene.cpp:249
TextDrawable::releaseShaderProgram
static void releaseShaderProgram()
Definition: text_drawable.cpp:200
Scene::graph_
GraphDrawable * graph_
Definition: scene.h:229
QuadColor
Definition: quad_color.h:22
rtabmap::Mesh::polygons
std::vector< pcl::Vertices > polygons
Definition: util.h:180
LOGI
#define LOGI(...)
Definition: tango-gl/include/tango-gl/util.h:53
f
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Scene::SetCameraPose
void SetCameraPose(const rtabmap::Transform &pose)
Definition: scene.cpp:765
Scene::removeCircle
void removeCircle(int id)
Definition: scene.cpp:1134
y1
CEPHES_EXTERN_EXPORT double y1(double x)
M_PI
#define M_PI
Definition: tango-gl/include/tango-gl/util.h:66
Eigen::Quaternion
ULogger.h
ULogger class and convenient macros.
Scene::hasCloud
bool hasCloud(int id) const
Definition: scene.cpp:1168
transform.hpp
Scene::mapRendering_
bool mapRendering_
Definition: scene.h:251
rtabmap::Transform
Definition: Transform.h:41
tango_gl::GestureCamera::SetAnchorOffset
void SetAnchorOffset(const glm::vec3 &pos)
Definition: gesture_camera.h:59
tango_gl::Grid
Definition: grid.h:23
tango_gl::Color
Definition: color.h:21
glm::rotation
GLM_FUNC_DECL detail::tquat< T, P > rotation(detail::tvec3< T, P > const &orig, detail::tvec3< T, P > const &dest)
Scene::hasQuad
bool hasQuad(int id) const
Definition: scene.cpp:1106
Scene::SetCameraType
void SetCameraType(tango_gl::GestureCamera::CameraType camera_type)
Definition: scene.cpp:761
y0
CEPHES_EXTERN_EXPORT double y0(double x)
Scene::removeLine
void removeLine(int id)
Definition: scene.cpp:1018
Scene::updateGraph
void updateGraph(const std::map< int, rtabmap::Transform > &poses, const std::multimap< int, rtabmap::Link > &links)
Definition: scene.cpp:823
GraphDrawable::Render
void Render(const glm::mat4 &projectionMatrix, const glm::mat4 &viewMatrix)
Definition: graph_drawable.cpp:127
iter
iterator iter(handle obj)
LOGD
#define LOGD(...)
Definition: tango-gl/include/tango-gl/util.h:52
tango_gl::Camera::SetOrthoCropFactor
void SetOrthoCropFactor(float value)
Definition: camera.h:34
Scene::updateMesh
void updateMesh(int id, const rtabmap::Mesh &mesh)
Definition: scene.cpp:1197
UStl.h
Wrappers of STL for convenient functions.
rtabmap::Mesh::indices
pcl::IndicesPtr indices
Definition: util.h:179
tango_gl::DrawableObject::SetShader
void SetShader()
Definition: drawable_object.cpp:22
intersectFrustumAABB
bool intersectFrustumAABB(const std::vector< glm::vec4 > &planes, const pcl::PointXYZ &boxMin, const pcl::PointXYZ &boxMax)
Definition: scene.cpp:389
Scene::axis_
tango_gl::Axis * axis_
Definition: scene.h:216
position
Point3 position(const NavState &X, OptionalJacobian< 3, 9 > H)
Scene::trace_
tango_gl::Trace * trace_
Definition: scene.h:228
Scene::circles_
std::map< int, tango_gl::Circle * > circles_
Definition: scene.h:243
Scene::color_camera_to_display_rotation_
rtabmap::ScreenRotation color_camera_to_display_rotation_
Definition: scene.h:237
UTimer
Definition: UTimer.h:46
Scene::setMarkerPose
void setMarkerPose(int id, const rtabmap::Transform &pose)
Definition: scene.cpp:871
tango_gl::Transform::SetRotation
void SetRotation(const glm::quat &rotation)
Definition: transform.cpp:43
Scene::setTraceVisible
void setTraceVisible(bool visible)
Definition: scene.cpp:844
tango_gl::Trace::UpdateVertexArray
void UpdateVertexArray(const glm::vec3 &v)
Definition: trace.cpp:26
Scene::pointSize_
float pointSize_
Definition: scene.h:254
rtabmap::Mesh::cloud
pcl::PointCloud< pcl::PointXYZRGB >::Ptr cloud
Definition: util.h:177
float
float
rtabmap::CameraMobile::opticalRotationInv
static const rtabmap::Transform opticalRotationInv
Definition: CameraMobile.h:77
Scene::kHeightOffset
static const glm::vec3 kHeightOffset
Definition: scene.h:54
Scene::setFrustumVisible
void setFrustumVisible(bool visible)
Definition: scene.cpp:849
py
int RealScalar int RealScalar * py
Scene::setGridRotation
void setGridRotation(float angleDeg)
Definition: scene.cpp:783
circle
circle
tango_gl::GestureCamera::SetAnchorPosition
void SetAnchorPosition(const glm::vec3 &pos, const glm::quat &rotation)
Definition: gesture_camera.cpp:165
NULL
#define NULL
Scene::addText
void addText(int id, const std::string &text, const rtabmap::Transform &pose, float size, const tango_gl::Color &color)
Definition: scene.cpp:1028
false
#define false
Definition: ConvertUTF.c:56
Scene::meshRendering_
bool meshRendering_
Definition: scene.h:252
DEGREE_2_RADIANS
#define DEGREE_2_RADIANS
Definition: tango-gl/include/tango-gl/util.h:70
rtabmap::ROTATION_0
@ ROTATION_0
0 degree rotation (natural orientation)
Definition: util.h:199
rtabmap::glmFromTransform
glm::mat4 glmFromTransform(const rtabmap::Transform &transform)
Definition: util.h:124
gesture_camera.h
Scene::setGraphVisible
void setGraphVisible(bool visible)
Definition: scene.cpp:834
Scene::gesture_camera_
tango_gl::GestureCamera * gesture_camera_
Definition: scene.h:213
Scene::hasMesh
bool hasMesh(int id) const
Definition: scene.cpp:1173
Scene::GetOpenGLCameraPose
rtabmap::Transform GetOpenGLCameraPose(float *fov=0) const
Definition: scene.cpp:793
Scene::removeCloudOrMesh
void removeCloudOrMesh(int id)
Definition: scene.cpp:917
rtabmap
Definition: CameraARCore.cpp:35
kGridColor
const tango_gl::Color kGridColor(0.85f, 0.85f, 0.85f)
rtabmap::glmToTransform
rtabmap::Transform glmToTransform(const glm::mat4 &mat)
Definition: util.h:144
Scene::box_
BoundingBoxDrawable * box_
Definition: scene.h:225
Scene::gridVisible_
bool gridVisible_
Definition: scene.h:231
tango_gl::Transform::GetTransformationMatrix
glm::mat4 GetTransformationMatrix() const
Definition: transform.cpp:67
Scene::traceVisible_
bool traceVisible_
Definition: scene.h:232
Scene::boundingBoxRendering_
bool boundingBoxRendering_
Definition: scene.h:255
glm::inverse
GLM_FUNC_DECL matType< T, P > inverse(matType< T, P > const &m)
tango_gl::Camera::getFarClipPlane
float getFarClipPlane() const
Definition: camera.h:40
value
value
i
int i
Scene::removeText
void removeText(int id)
Definition: scene.cpp:1042
Scene::hasMarker
bool hasMarker(int id) const
Definition: scene.cpp:884
rtabmap::Transform::getQuaternionf
Eigen::Quaternionf getQuaternionf() const
Definition: Transform.cpp:401
text
text
tango_gl::Transform::SetTransformationMatrix
void SetTransformationMatrix(const glm::mat4 &transform_mat)
Definition: transform.cpp:63
Scene::setCloudPose
void setCloudPose(int id, const rtabmap::Transform &pose)
Definition: scene.cpp:1149
PointCloudDrawable::Render
void Render(const glm::mat4 &projectionMatrix, const glm::mat4 &viewMatrix, bool meshRendering=true, float pointSize=3.0f, bool textureRendering=false, bool lighting=true, float distanceToCamSqr=0.0f, const GLuint &depthTexture=0, int screenWidth=0, int screenHeight=0, float nearClipPlane=0, float farClipPlane=0, bool packDepthToColorChannel=false, bool wireFrame=false, bool hideSeams=false) const
Definition: point_cloud_drawable.cpp:1015
mat
else mat
glm::detail::tquat::x
T x
Definition: gtc/quaternion.hpp:65
tango_gl::GestureCamera::OnTouchEvent
void OnTouchEvent(int touch_count, TouchEvent event, float x0, float y0, float x1, float y1)
Definition: gesture_camera.cpp:66
px
RealScalar RealScalar * px
PointCloudDrawable
Definition: point_cloud_drawable.h:44


rtabmap
Author(s): Mathieu Labbe
autogenerated on Mon Apr 28 2025 02:45:59