00001 /* 00002 * Copyright (c) 2011, 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 <OGRE/OgreSceneManager.h> 00031 #include <ogre_tools/movable_text.h> 00032 00033 #include <rve_render_server/convert.h> 00034 00035 #include "rve_render_server/billboard_text.h" 00036 00037 namespace rve_render_server 00038 { 00039 00041 class BillboardText::MyMovableText: public ogre_tools::MovableText 00042 { 00043 public: 00044 MyMovableText() 00045 : MovableText( std::string( "not-empty" )) 00046 {} 00047 const Ogre::MaterialPtr &getMaterial(void) const 00048 { 00049 return MovableText::getMaterial(); 00050 } 00051 }; 00052 00053 BillboardText::BillboardText( const rve_common::UUID& id, Ogre::SceneManager* scene_manager ) 00054 : id_( id ) 00055 , scene_manager_( scene_manager ) 00056 { 00057 movable_text_ = new MyMovableText(); 00058 00059 // The following setSchemeName() line needs to be called every time 00060 // after the MovableText's font changes. 00061 // 00062 // This is really a hack to make ogre_tools::MovableText's custom 00063 // render operation work with RVE's renderer. It does not seem to 00064 // play nicely in some cases. It seems good enough for now, but 00065 // when better control is desired, it might be necessary to 00066 // reimplement MovableText in some other fashion. 00067 movable_text_->getMaterial()->getTechnique(0)->setSchemeName("WeightedAverageAlpha"); 00068 00069 movable_text_->setVisible( true ); 00070 scene_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode(); 00071 scene_node_->attachObject( movable_text_ ); 00072 scene_node_->setVisible( true ); 00073 } 00074 00075 BillboardText::~BillboardText() 00076 { 00077 scene_manager_->destroySceneNode(scene_node_); 00078 delete movable_text_; 00079 } 00080 00081 void BillboardText::setText( const std::string& text ) 00082 { 00083 movable_text_->setCaption( text ); 00084 } 00085 00086 void BillboardText::setPosition( const rve_msgs::Vector3& position ) 00087 { 00088 scene_node_->setPosition( fromRobot( position )); 00089 } 00090 00093 void BillboardText::setCharacterHeight( float height ) 00094 { 00095 movable_text_->setCharacterHeight( height ); 00096 } 00097 00099 void BillboardText::setAlignment( const rve_msgs::TextAlignment& align ) 00100 { 00101 ogre_tools::MovableText::HorizontalAlignment h = ogre_tools::MovableText::H_LEFT; 00102 ogre_tools::MovableText::VerticalAlignment v = ogre_tools::MovableText::V_ABOVE; 00103 00104 switch( align.horizontal ) 00105 { 00106 case rve_msgs::TextAlignment::H_LEFT: h = ogre_tools::MovableText::H_LEFT; break; 00107 case rve_msgs::TextAlignment::H_CENTER: h = ogre_tools::MovableText::H_CENTER; break; 00108 } 00109 00110 switch( align.vertical ) 00111 { 00112 case rve_msgs::TextAlignment::V_TOP: v = ogre_tools::MovableText::V_BELOW; break; 00113 case rve_msgs::TextAlignment::V_CENTER: v = ogre_tools::MovableText::V_CENTER; break; 00114 case rve_msgs::TextAlignment::V_BOTTOM: v = ogre_tools::MovableText::V_ABOVE; break; 00115 } 00116 00117 movable_text_->setTextAlignment( h, v ); 00118 } 00119 00122 void BillboardText::setColor( const rve_msgs::ColorRGB& color ) 00123 { 00124 movable_text_->setColor( Ogre::ColourValue(color.r, color.g, color.b, 1 )); 00125 } 00126 00127 }