grid.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008, 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 "grid.h"
00031 #include "billboard_line.h"
00032 
00033 #include <OGRE/OgreSceneManager.h>
00034 #include <OGRE/OgreSceneNode.h>
00035 #include <OGRE/OgreVector3.h>
00036 #include <OGRE/OgreQuaternion.h>
00037 #include <OGRE/OgreManualObject.h>
00038 #include <OGRE/OgreMaterialManager.h>
00039 
00040 #include <sstream>
00041 
00042 namespace rviz
00043 {
00044 
00045 Grid::Grid( Ogre::SceneManager* scene_manager, Ogre::SceneNode* parent_node, Style style, uint32_t cell_count, float cell_length, float line_width, const Ogre::ColourValue& color )
00046 : scene_manager_( scene_manager )
00047 , style_(style)
00048 , cell_count_(cell_count)
00049 , cell_length_(cell_length)
00050 , line_width_(line_width)
00051 , height_(0)
00052 , color_(color)
00053 {
00054   static uint32_t gridCount = 0;
00055   std::stringstream ss;
00056   ss << "Grid" << gridCount++;
00057 
00058   manual_object_ = scene_manager_->createManualObject( ss.str() );
00059 
00060   if ( !parent_node )
00061   {
00062     parent_node = scene_manager_->getRootSceneNode();
00063   }
00064 
00065   scene_node_ = parent_node->createChildSceneNode();
00066   scene_node_->attachObject( manual_object_ );
00067 
00068   billboard_line_ = new BillboardLine(scene_manager, scene_node_);
00069 
00070   ss << "Material";
00071   material_ = Ogre::MaterialManager::getSingleton().create( ss.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
00072   material_->setReceiveShadows(false);
00073   material_->getTechnique(0)->setLightingEnabled(false);
00074 
00075   setColor(color_);
00076 }
00077 
00078 Grid::~Grid()
00079 {
00080   delete billboard_line_;
00081 
00082   scene_manager_->destroySceneNode( scene_node_->getName() );
00083   scene_manager_->destroyManualObject( manual_object_ );
00084 
00085   material_->unload();
00086 }
00087 
00088 void Grid::setCellCount(uint32_t count)
00089 {
00090   cell_count_ = count;
00091 
00092   create();
00093 }
00094 
00095 void Grid::setCellLength(float len)
00096 {
00097   cell_length_ = len;
00098 
00099   create();
00100 }
00101 
00102 void Grid::setLineWidth(float width)
00103 {
00104   line_width_ = width;
00105 
00106   create();
00107 }
00108 
00109 void Grid::setColor(const Ogre::ColourValue& color)
00110 {
00111   color_ = color;
00112 
00113   if ( color_.a < 0.9998 )
00114   {
00115     material_->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA );
00116     material_->setDepthWriteEnabled( false );
00117   }
00118   else
00119   {
00120     material_->setSceneBlending( Ogre::SBT_REPLACE );
00121     material_->setDepthWriteEnabled( true );
00122   }
00123 
00124   create();
00125 }
00126 
00127 void Grid::setStyle(Style style)
00128 {
00129   style_ = style;
00130 
00131   create();
00132 }
00133 
00134 void Grid::setHeight(uint32_t height)
00135 {
00136   height_ = height;
00137 
00138   create();
00139 }
00140 
00141 void Grid::create()
00142 {
00143   manual_object_->clear();
00144   billboard_line_->clear();
00145 
00146   float extent = (cell_length_*((double)cell_count_))/2;
00147 
00148   if (style_ == Billboards)
00149   {
00150     billboard_line_->setColor(color_.r, color_.g, color_.b, color_.a);
00151     billboard_line_->setLineWidth(line_width_);
00152     billboard_line_->setMaxPointsPerLine(2);
00153     billboard_line_->setNumLines((cell_count_+1) * 2 * (height_ + 1)
00154                               + ((cell_count_ + 1) * (cell_count_ + 1)) * height_);
00155   }
00156   else
00157   {
00158     manual_object_->estimateVertexCount( cell_count_ * 4 * (height_ + 1) + ((cell_count_ + 1) * (cell_count_ + 1) * height_));
00159     manual_object_->begin( material_->getName(), Ogre::RenderOperation::OT_LINE_LIST );
00160   }
00161 
00162   for (uint32_t h = 0; h <= height_; ++h)
00163   {
00164     float h_real = (height_ / 2.0f - (float)h) * cell_length_;
00165     for( uint32_t i = 0; i <= cell_count_; i++ )
00166     {
00167       float inc = extent - ( i * cell_length_ );
00168 
00169       Ogre::Vector3 p1(inc, h_real, -extent);
00170       Ogre::Vector3 p2(inc, h_real, extent);
00171       Ogre::Vector3 p3(-extent, h_real, inc);
00172       Ogre::Vector3 p4(extent, h_real, inc);
00173 
00174       if (style_ == Billboards)
00175       {
00176         if (h != 0 || i != 0)
00177         {
00178           billboard_line_->newLine();
00179         }
00180 
00181         billboard_line_->addPoint(p1);
00182         billboard_line_->addPoint(p2);
00183 
00184         billboard_line_->newLine();
00185 
00186         billboard_line_->addPoint(p3);
00187         billboard_line_->addPoint(p4);
00188       }
00189       else
00190       {
00191         manual_object_->position(p1);
00192         manual_object_->colour( color_ );
00193         manual_object_->position(p2);
00194         manual_object_->colour( color_ );
00195 
00196         manual_object_->position(p3);
00197         manual_object_->colour( color_ );
00198         manual_object_->position(p4);
00199         manual_object_->colour( color_ );
00200       }
00201     }
00202   }
00203 
00204   if (height_ > 0)
00205   {
00206     for (uint32_t x = 0; x <= cell_count_; ++x)
00207     {
00208       for (uint32_t z = 0; z <= cell_count_; ++z)
00209       {
00210         float x_real = extent - x * cell_length_;
00211         float z_real = extent - z * cell_length_;
00212 
00213         float y_top = (height_ / 2.0f) * cell_length_;
00214         float y_bottom = -y_top;
00215 
00216         if (style_ == Billboards)
00217         {
00218           billboard_line_->newLine();
00219 
00220           billboard_line_->addPoint( Ogre::Vector3(x_real, y_bottom, z_real) );
00221           billboard_line_->addPoint( Ogre::Vector3(x_real, y_top, z_real) );
00222         }
00223         else
00224         {
00225           manual_object_->position( x_real, y_bottom, z_real );
00226           manual_object_->colour( color_ );
00227           manual_object_->position(x_real, y_top, z_real);
00228           manual_object_->colour( color_ );
00229         }
00230       }
00231     }
00232   }
00233 
00234   if (style_ == Lines)
00235   {
00236     manual_object_->end();
00237   }
00238 }
00239 
00240 void Grid::setUserData( const Ogre::Any& data )
00241 {
00242   manual_object_->setUserAny( data );
00243 }
00244 
00245 } // namespace rviz


rviz
Author(s): Dave Hershberger, David Gossow, Josh Faust
autogenerated on Mon Oct 6 2014 07:26:35