mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 17:40:23 +08:00
* Using shadows on all texts and icons to see them better when background is white. Buffering database previews to show faster the Library. Updated how RAM usage is computed and now show max memory. Added warnings when RAM usage is low. * Added measuring tool * fixed map not shown when closing visualization * Added measure text size setting, changed look and feel of point to point * Fixed measuring point not showing * Added fix for #1401 * Addressing #1407 * Export: Added colored OBJ options * fixed index_t not existing on focal * Fixed Settings not applied after restoring to all default settings witohut restarting the app (Marker detection not working issue #1455 ) * Marker detection: Fixing wrong depth used when rgb and depth image sizes cannot be divided exactly one from the the other #1455 * Added Marker Max Range option (default 1m) * Added OBJ texture policy option (keep color on textureless polygons) * Added texture/color blending option directly in the app. Added LAZ export option. * Hiding measuring button if not mesh, dont zip if exporting to laz, updating Export XXX button based on the current context, fixed always blending texture/color on not visualization mode * updated default marker max range to 2m * bump ios app version * fixing pcl 1.8.1 build * fixed android build
273 lines
8.9 KiB
C++
273 lines
8.9 KiB
C++
/*
|
|
* Copyright 2014 Google Inc. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef TANGO_POINT_CLOUD_SCENE_H_
|
|
#define TANGO_POINT_CLOUD_SCENE_H_
|
|
|
|
#ifdef __ANDROID__
|
|
#include <jni.h>
|
|
#endif
|
|
#include <memory>
|
|
#include <set>
|
|
|
|
#include "CameraMobile.h"
|
|
#include <tango-gl/axis.h>
|
|
#include <tango-gl/camera.h>
|
|
#include <tango-gl/color.h>
|
|
#include <tango-gl/gesture_camera.h>
|
|
#include <tango-gl/grid.h>
|
|
#include <tango-gl/frustum.h>
|
|
#include <tango-gl/trace.h>
|
|
#include <tango-gl/transform.h>
|
|
#include <tango-gl/util.h>
|
|
#include <tango-gl/circle.h>
|
|
|
|
#include <rtabmap/core/Transform.h>
|
|
#include <rtabmap/core/Link.h>
|
|
|
|
#include "point_cloud_drawable.h"
|
|
#include "graph_drawable.h"
|
|
#include "bounding_box_drawable.h"
|
|
#include "background_renderer.h"
|
|
#include "text_drawable.h"
|
|
#include "quad_color.h"
|
|
|
|
#include <pcl/point_cloud.h>
|
|
#include <pcl/point_types.h>
|
|
|
|
// Scene provides OpenGL drawable objects and renders them for visualization.
|
|
class Scene {
|
|
public:
|
|
static const glm::vec3 kHeightOffset;
|
|
public:
|
|
// Constructor and destructor.
|
|
Scene();
|
|
~Scene();
|
|
|
|
// Allocate OpenGL resources for rendering.
|
|
void InitGLContent();
|
|
|
|
// Release non-OpenGL allocated resources.
|
|
void DeleteResources();
|
|
|
|
// Setup GL view port.
|
|
void SetupViewPort(int w, int h);
|
|
int getViewPortWidth() const {return screenWidth_;}
|
|
int getViewPortHeight() const {return screenHeight_;}
|
|
|
|
rtabmap::ScreenRotation getScreenRotation() const {return color_camera_to_display_rotation_;}
|
|
void setScreenRotation(rtabmap::ScreenRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
|
|
|
void clear(); // removed all point clouds
|
|
void clearLines();
|
|
void clearTexts();
|
|
void clearQuads();
|
|
void clearCircles();
|
|
|
|
// Render loop.
|
|
// @param: cur_pose_transformation, latest pose's transformation.
|
|
// @param: point_cloud_transformation, pose transformation at point cloud
|
|
// frame's timestamp.
|
|
// @param: point_cloud_vertices, point cloud's vertices of the current point
|
|
// frame.
|
|
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);
|
|
|
|
// Set render camera's viewing angle, first person, third person or top down.
|
|
//
|
|
// @param: camera_type, camera type includes first person, third person and
|
|
// top down
|
|
void SetCameraType(tango_gl::GestureCamera::CameraType camera_type);
|
|
tango_gl::GestureCamera::CameraType GetCameraType() const {return gesture_camera_->GetCameraType();}
|
|
|
|
void SetCameraPose(const rtabmap::Transform & pose); // opengl camera
|
|
rtabmap::Transform GetCameraPose() const {return currentPose_!=0?*currentPose_:rtabmap::Transform();}
|
|
rtabmap::Transform GetOpenGLCameraPose(float * fov = 0) const;
|
|
|
|
// Touch event passed from android activity. This function only support two
|
|
// touches.
|
|
//
|
|
// @param: touch_count, total count for touches.
|
|
// @param: event, touch event of current touch.
|
|
// @param: x0, normalized touch location for touch 0 on x axis.
|
|
// @param: y0, normalized touch location for touch 0 on y axis.
|
|
// @param: x1, normalized touch location for touch 1 on x axis.
|
|
// @param: y1, normalized touch location for touch 1 on y axis.
|
|
void OnTouchEvent(int touch_count, tango_gl::GestureCamera::TouchEvent event,
|
|
float x0, float y0, float x1, float y1);
|
|
|
|
void updateGraph(
|
|
const std::map<int, rtabmap::Transform> & poses,
|
|
const std::multimap<int, rtabmap::Link> & links);
|
|
|
|
void setGraphVisible(bool visible);
|
|
void setGridVisible(bool visible);
|
|
void setTraceVisible(bool visible);
|
|
void setFrustumVisible(bool visible);
|
|
|
|
void addMarker(int id, const rtabmap::Transform & pose);
|
|
void setMarkerPose(int id, const rtabmap::Transform & pose);
|
|
bool hasMarker(int id) const;
|
|
void removeMarker(int id);
|
|
std::set<int> getAddedMarkers() const;
|
|
|
|
void addCloud(
|
|
int id,
|
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
|
const pcl::IndicesPtr & indices,
|
|
const rtabmap::Transform & pose);
|
|
void removeCloudOrMesh(int id);
|
|
void addMesh(
|
|
int id,
|
|
const rtabmap::Mesh & mesh,
|
|
const rtabmap::Transform & pose,
|
|
bool createWireframe = false);
|
|
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));
|
|
void removeLine(int id);
|
|
void addText(
|
|
int id,
|
|
const std::string & text,
|
|
const rtabmap::Transform & pose,
|
|
float size,
|
|
const tango_gl::Color & color);
|
|
void removeText(int id);
|
|
void addQuad(
|
|
int id,
|
|
float size,
|
|
const rtabmap::Transform & pose,
|
|
const tango_gl::Color & color,
|
|
float alpha = 1.0f);
|
|
void addQuad(
|
|
int id,
|
|
float widthLeft,
|
|
float widthRight,
|
|
float heightBottom,
|
|
float heightTop,
|
|
const rtabmap::Transform & pose,
|
|
const tango_gl::Color & color,
|
|
float alpha =1.0f);
|
|
void removeQuad(int id);
|
|
bool hasQuad(int id) const;
|
|
void addCircle(
|
|
int id,
|
|
float radius,
|
|
const rtabmap::Transform & pose,
|
|
const tango_gl::Color & color,
|
|
float alpha = 1.0f);
|
|
void removeCircle(int id);
|
|
bool hasCircle(int id) const;
|
|
|
|
void setCloudPose(int id, const rtabmap::Transform & pose);
|
|
void setCloudVisible(int id, bool visible);
|
|
bool hasCloud(int id) const;
|
|
bool hasMesh(int id) const;
|
|
bool hasTexture(int id) const;
|
|
std::set<int> getAddedClouds() const;
|
|
void updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons);
|
|
void updateMesh(int id, const rtabmap::Mesh & mesh);
|
|
void updateGains(int id, float gainR, float gainG, float gainB);
|
|
|
|
void setBlending(bool enabled) {blending_ = enabled;}
|
|
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
|
|
void setMeshRendering(bool enabled, bool withTexture) {meshRendering_ = enabled; meshRenderingTexture_ = withTexture;}
|
|
void setPointSize(float size) {pointSize_ = size;}
|
|
void setFOV(float angle);
|
|
void setOrthoCropFactor(float value);
|
|
void setGridRotation(float angleDeg);
|
|
void setLighting(bool enabled) {lighting_ = enabled;}
|
|
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
|
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
|
void setTextureColorSeamsHidden(bool hidden) {textureColorSeamsHidden_ = hidden;}
|
|
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
|
void setGridColor(float r, float g, float b);
|
|
|
|
bool isBlending() const {return blending_;}
|
|
bool isMapRendering() const {return mapRendering_;}
|
|
bool isMeshRendering() const {return meshRendering_;}
|
|
bool isMeshTexturing() const {return meshRendering_ && meshRenderingTexture_;}
|
|
float getPointSize() const {return pointSize_;}
|
|
bool isLighting() const {return lighting_;}
|
|
bool isBackfaceCulling() const {return backfaceCulling_;}
|
|
bool isWireframe() const {return wireFrame_;}
|
|
|
|
BackgroundRenderer * background_renderer_;
|
|
|
|
private:
|
|
// Camera object that allows user to use touch input to interact with.
|
|
tango_gl::GestureCamera* gesture_camera_;
|
|
|
|
// Device axis (in device frame of reference).
|
|
tango_gl::Axis* axis_;
|
|
|
|
// Device frustum.
|
|
tango_gl::Frustum* frustum_;
|
|
|
|
// Ground grid.
|
|
tango_gl::Grid* grid_;
|
|
|
|
// Bounding box
|
|
BoundingBoxDrawable * box_;
|
|
|
|
// Trace of pose data.
|
|
tango_gl::Trace* trace_;
|
|
GraphDrawable * graph_;
|
|
bool graphVisible_;
|
|
bool gridVisible_;
|
|
bool traceVisible_;
|
|
bool frustumVisible_;
|
|
|
|
std::map<int, tango_gl::Axis*> markers_;
|
|
|
|
rtabmap::ScreenRotation color_camera_to_display_rotation_;
|
|
|
|
std::map<int, PointCloudDrawable*> pointClouds_;
|
|
std::map<int, tango_gl::Line*> lines_;
|
|
std::map<int, TextDrawable*> texts_;
|
|
std::map<int, QuadColor*> quads_;
|
|
std::map<int, tango_gl::Circle*> circles_;
|
|
|
|
rtabmap::Transform * currentPose_;
|
|
|
|
// Shader to display point cloud.
|
|
GLuint graph_shader_program_;
|
|
|
|
bool blending_;
|
|
bool mapRendering_;
|
|
bool meshRendering_;
|
|
bool meshRenderingTexture_;
|
|
float pointSize_;
|
|
bool boundingBoxRendering_;
|
|
bool lighting_;
|
|
bool backfaceCulling_;
|
|
bool wireFrame_;
|
|
bool textureColorSeamsHidden_;
|
|
float r_;
|
|
float g_;
|
|
float b_;
|
|
GLuint fboId_;
|
|
GLuint rboId_;
|
|
GLuint depthTexture_; // 0=objects+occlusion
|
|
GLsizei screenWidth_;
|
|
GLsizei screenHeight_;
|
|
bool doubleTapOn_;
|
|
cv::Point2f doubleTapPos_;
|
|
};
|
|
|
|
#endif // TANGO_POINT_CLOUD_SCENE_H_
|