cartographer_ros/cartographer_rviz/cartographer_rviz/ogre_slice.h

81 lines
2.6 KiB
C++

/*
* Copyright 2016 The Cartographer Authors
*
* 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 CARTOGRAPHER_RVIZ_SRC_OGRE_SLICE_H_
#define CARTOGRAPHER_RVIZ_SRC_OGRE_SLICE_H_
#include "Eigen/Core"
#include "Eigen/Geometry"
#include "OgreManualObject.h"
#include "OgreMaterial.h"
#include "OgreQuaternion.h"
#include "OgreSceneManager.h"
#include "OgreSceneNode.h"
#include "OgreTexture.h"
#include "OgreVector3.h"
#include "cartographer/io/submap_painter.h"
#include "cartographer/mapping/id.h"
namespace cartographer_rviz {
Ogre::Vector3 ToOgre(const Eigen::Vector3d& v);
Ogre::Quaternion ToOgre(const Eigen::Quaterniond& q);
// A class containing the Ogre code to visualize a slice texture of a submap.
// Member functions are expected to be called from the Ogre thread.
class OgreSlice {
public:
// Attaches a node visualizing the submap 'id' to the 'submap_node' which is
// expected to represent the submap frame.
OgreSlice(const ::cartographer::mapping::SubmapId& id, int slice_id,
Ogre::SceneManager* const scene_manager,
Ogre::SceneNode* const submap_node);
~OgreSlice();
OgreSlice(const OgreSlice&) = delete;
OgreSlice& operator=(const OgreSlice&) = delete;
// Updates the texture and pose of the submap using new data from
// 'submap_texture'.
void Update(const ::cartographer::io::SubmapTexture& submap_texture);
// Changes the opacity of the submap to 'alpha'.
void SetAlpha(float alpha);
// Sets the local visibility of this slice.
void SetVisibility(bool visibility);
// Updates the SceneNode to be visible if the submap and this slice are
// visible.
void UpdateOgreNodeVisibility(bool submap_visibility);
private:
// TODO(gaschler): Pack both ids into a struct.
const ::cartographer::mapping::SubmapId id_;
const int slice_id_;
Ogre::SceneManager* const scene_manager_;
Ogre::SceneNode* const submap_node_;
Ogre::SceneNode* const slice_node_;
Ogre::ManualObject* const manual_object_;
Ogre::TexturePtr texture_;
Ogre::MaterialPtr material_;
bool visibility_ = true;
};
} // namespace cartographer_rviz
#endif // CARTOGRAPHER_RVIZ_SRC_OGRE_SLICE_H_