$search
00001 /* 00002 * Copyright (c) 2009, Willow Garage, Inc. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of the Willow Garage, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #include "shape_marker.h" 00031 #include "marker_selection_handler.h" 00032 #include "rviz/default_plugin/marker_display.h" 00033 00034 #include "rviz/visualization_manager.h" 00035 #include "rviz/selection/selection_manager.h" 00036 00037 #include <ogre_tools/shape.h> 00038 00039 #include <OGRE/OgreSceneNode.h> 00040 #include <OGRE/OgreMatrix3.h> 00041 00042 namespace rviz 00043 { 00044 00045 ShapeMarker::ShapeMarker( MarkerDisplay* owner, VisualizationManager* manager, 00046 Ogre::SceneNode* parent_node ) : 00047 MarkerBase(owner, manager, parent_node), shape_(0) 00048 { 00049 } 00050 00051 ShapeMarker::~ShapeMarker() 00052 { 00053 delete shape_; 00054 } 00055 00056 void ShapeMarker::onNewMessage( const MarkerConstPtr& old_message, 00057 const MarkerConstPtr& new_message ) 00058 { 00059 if (!shape_ || old_message->type != new_message->type) 00060 { 00061 delete shape_; 00062 shape_ = 0; 00063 00064 switch (new_message->type) 00065 { 00066 case visualization_msgs::Marker::CUBE: 00067 { 00068 shape_ = new ogre_tools::Shape(ogre_tools::Shape::Cube, 00069 vis_manager_->getSceneManager(), scene_node_); 00070 } 00071 break; 00072 00073 case visualization_msgs::Marker::CYLINDER: 00074 { 00075 shape_ = new ogre_tools::Shape(ogre_tools::Shape::Cylinder, 00076 vis_manager_->getSceneManager(), scene_node_); 00077 } 00078 break; 00079 00080 case visualization_msgs::Marker::SPHERE: 00081 { 00082 shape_ = new ogre_tools::Shape(ogre_tools::Shape::Sphere, 00083 vis_manager_->getSceneManager(), scene_node_); 00084 } 00085 break; 00086 00087 default: 00088 ROS_BREAK(); 00089 break; 00090 } 00091 00092 vis_manager_->getSelectionManager()->removeObject(coll_); 00093 coll_ = vis_manager_->getSelectionManager()->createCollisionForObject( 00094 shape_, SelectionHandlerPtr(new MarkerSelectionHandler(this, MarkerID( 00095 new_message->ns, new_message->id))), coll_); 00096 } 00097 00098 Ogre::Vector3 pos, scale, scale_correct; 00099 Ogre::Quaternion orient; 00100 transform(new_message, pos, orient, scale); 00101 00102 if (owner_ && (new_message->scale.x * new_message->scale.y 00103 * new_message->scale.z == 0.0f)) 00104 { 00105 owner_->setMarkerStatus(getID(), status_levels::Warn, 00106 "Scale of 0 in one of x/y/z"); 00107 } 00108 00109 setPosition(pos); 00110 setOrientation( orient * Ogre::Quaternion( Ogre::Degree(90), Ogre::Vector3(1,0,0) ) ); 00111 00112 scale_correct = Ogre::Quaternion( Ogre::Degree(90), Ogre::Vector3(1,0,0) ) * scale; 00113 00114 shape_->setScale(scale_correct); 00115 00116 shape_->setColor(new_message->color.r, new_message->color.g, 00117 new_message->color.b, new_message->color.a); 00118 } 00119 00120 S_MaterialPtr ShapeMarker::getMaterials() 00121 { 00122 S_MaterialPtr materials; 00123 extractMaterials(shape_->getEntity(), materials); 00124 return materials; 00125 } 00126 00127 }