00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "rviz_interaction_tools/mesh_object.h"
00031
00032 #include <OGRE/OgreMesh.h>
00033 #include <OGRE/OgreManualObject.h>
00034 #include <OGRE/OgreMaterialManager.h>
00035 #include <OGRE/OgreSceneNode.h>
00036 #include <OGRE/OgreSceneManager.h>
00037 #include <OGRE/OgreEntity.h>
00038 #include <OGRE/OgreMeshManager.h>
00039
00040 namespace rviz_interaction_tools
00041 {
00042
00043 MeshObject::MeshObject( Ogre::SceneManager* scene_manager, Ogre::SceneNode* scene_root ) :
00044 entity_(0),
00045 scene_manager_(scene_manager),
00046 scene_root_(scene_root)
00047 {
00048 scene_node_ = scene_root->createChildSceneNode();
00049 }
00050
00051 MeshObject::~MeshObject()
00052 {
00053 clear();
00054 scene_root_->removeChild(scene_node_);
00055 }
00056
00057 void MeshObject::clear( )
00058 {
00059 scene_node_->detachAllObjects();
00060
00061 if ( entity_ )
00062 {
00063 scene_manager_->destroyEntity(entity_);
00064 entity_ = 0;
00065 }
00066
00067 if ( !mesh_ptr_.isNull() )
00068 {
00069 Ogre::MeshManager::getSingleton().remove( mesh_ptr_->getHandle() );
00070 mesh_ptr_.setNull();
00071 }
00072 }
00073
00074 void MeshObject::setVisible( bool visible )
00075 {
00076 entity_->setVisible( visible );
00077 entity_->setQueryFlags( visible ? 1 : 0 );
00078 }
00079
00080 void MeshObject::setMaterialName( std::string name )
00081 {
00082 entity_->setMaterialName(name);
00083 }
00084
00085 void MeshObject::setPose( const geometry_msgs::Pose& pose )
00086 {
00087 scene_node_->setPosition( pose.position.x, pose.position.y, pose.position.z );
00088 scene_node_->setOrientation( pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z );
00089 }
00090
00091 void MeshObject::loadMesh( std::string name, const geometric_shapes_msgs::Shape& mesh )
00092 {
00093 ROS_ASSERT(mesh.triangles.size() % 3 == 0);
00094 ROS_ASSERT(mesh.triangles.size() > 0);
00095 ROS_ASSERT(mesh.vertices.size() > 0);
00096
00097 ROS_INFO_STREAM( "Loading mesh. name='" << name << "'" );
00098
00099
00100 Ogre::ManualObject *manual_object = new Ogre::ManualObject( name );
00101
00102 manual_object->setUseIdentityProjection(false);
00103 manual_object->setUseIdentityView(false);
00104 manual_object->setDynamic(true);
00105
00106 manual_object->estimateVertexCount( mesh.vertices.size() );
00107 manual_object->estimateIndexCount( mesh.triangles.size()*3 );
00108
00109 manual_object->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST );
00110
00111
00112 for ( size_t v=0; v<mesh.vertices.size(); ++v )
00113 {
00114 const geometry_msgs::Point& p = mesh.vertices[v];
00115 manual_object->position( p.x, p.y, p.z );
00116 manual_object->colour( 1.0, 1.0, 1.0, 1.0 );
00117 }
00118
00119
00120 size_t num_t = mesh.triangles.size();
00121 for ( size_t t=0; t+2<num_t; t+=3 )
00122 {
00123 assert( (size_t)mesh.triangles[t] < mesh.vertices.size() );
00124 assert( (size_t)mesh.triangles[t+1] < mesh.vertices.size() );
00125 assert( (size_t)mesh.triangles[t+2] < mesh.vertices.size() );
00126
00127 manual_object->triangle( mesh.triangles[t+2], mesh.triangles[t+1], mesh.triangles[t] );
00128 }
00129
00130 manual_object->end();
00131
00132 std::string mesh_name = name + "mesh";
00133
00134 Ogre::MeshPtr mesh_ptr = manual_object->convertToMesh( mesh_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
00135 mesh_ptr->buildEdgeList();
00136
00137 entity_ = scene_manager_->createEntity( name, mesh_name );
00138 entity_->setRenderQueueGroup(Ogre::RENDER_QUEUE_1);
00139
00140 scene_node_->attachObject( entity_ );
00141
00142 delete manual_object;
00143
00144 mesh_ptr_ = mesh_ptr;
00145 }
00146
00147 void MeshObject::loadPoints( std::string name, const std::vector< geometry_msgs::Point32 > &points )
00148 {
00149 std::vector< Point > points_converted;
00150 points_converted.reserve( points.size() );
00151
00152 Point point;
00153 point.r = point.g = point.b = 0;
00154
00155 for ( unsigned i=0; i<points.size(); i++ )
00156 {
00157 point.x = points[i].x;
00158 point.y = points[i].y;
00159 point.z = points[i].z;
00160 point.a = 1.0;
00161 points_converted.push_back( point );
00162 }
00163
00164 loadMesh( name, points_converted );
00165 }
00166
00167 void MeshObject::loadMesh( std::string name, const std::vector< Point > &vertices,
00168 const std::vector<unsigned> triangles )
00169 {
00170 ROS_ASSERT(vertices.size() > 0);
00171
00172
00173 Ogre::ManualObject *manual_object = new Ogre::ManualObject( name );
00174
00175 manual_object->setUseIdentityProjection(false);
00176 manual_object->setUseIdentityView(false);
00177 manual_object->setDynamic(true);
00178
00179 manual_object->estimateVertexCount( vertices.size() );
00180 manual_object->estimateIndexCount( triangles.size() > 0 ? triangles.size() : vertices.size()*3 );
00181
00182 manual_object->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST );
00183
00184
00185 for ( size_t v=0; v<vertices.size(); ++v )
00186 {
00187 const Point& p = vertices[v];
00188 manual_object->position( p.x, p.y, p.z );
00189 manual_object->colour( p.r, p.g, p.b );
00190 }
00191
00192
00193 if ( triangles.size() > 0 )
00194 {
00195 size_t num_t = triangles.size();
00196 for ( size_t t=0; t+2<num_t; t+=3 )
00197 {
00198 assert( (size_t)triangles[t] < vertices.size() );
00199 assert( (size_t)triangles[t+1] < vertices.size() );
00200 assert( (size_t)triangles[t+2] < vertices.size() );
00201
00202 manual_object->triangle( triangles[t], triangles[t+1], triangles[t+2] );
00203 }
00204 }
00205 else
00206 {
00207 for ( size_t t=0; t<vertices.size(); t+=3 )
00208 {
00209 manual_object->triangle( t, (t+1)%vertices.size(), (t+2)%vertices.size() );
00210 }
00211 }
00212
00213 manual_object->end();
00214
00215 std::string mesh_name = name + "mesh";
00216
00217 Ogre::MeshPtr mesh_ptr = manual_object->convertToMesh( mesh_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
00218 mesh_ptr->buildEdgeList();
00219
00220 entity_ = scene_manager_->createEntity( name, mesh_name );
00221 entity_->setRenderQueueGroup(Ogre::RENDER_QUEUE_1);
00222 entity_->setCastShadows(false);
00223
00224 scene_node_->attachObject( entity_ );
00225
00226 delete manual_object;
00227
00228 mesh_ptr_ = mesh_ptr;
00229
00230 #if 0
00231 Ogre::Vector3 min = entity_->getBoundingBox().getMinimum();
00232 Ogre::Vector3 max = entity_->getBoundingBox().getMaximum();
00233 ROS_INFO("Bbox min: %f %f %f max: %f %f %f",
00234 min.x, min.y, min.z, max.x, max.y, max.z );
00235 #endif
00236 }
00237
00238 }