Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "LaserScan3DPainter.h"
00012
00013 #include "Workers/Math/Math.h"
00014
00015 #include "Messages/PointCloudM.h"
00016 #include "Messages/SceneGraphM.h"
00017
00018 #include <QtOpenGL>
00019 #include <GL/glut.h>
00020
00021 #define THIS LaserScan3DPainter
00022
00023 THIS::THIS() : PainterPlugin( )
00024 {
00025 setName ( "3D Debug Data" );
00026 m_RawDataCounter = 0;
00027 }
00028
00029
00030 THIS::~THIS()
00031 {
00032 }
00033
00034
00035 void THIS::processMessage ( Message* newMessage )
00036 {
00037 PainterPlugin::processMessage ( newMessage );
00038 switch ( newMessage->getType() )
00039 {
00040 case MessageTypes::DEBUG_3D_M:
00041 {
00042 Debug3DM* message = Message::castTo<Debug3DM> ( newMessage );
00043 if ( message )
00044 {
00045 m_VertexSets[message->getChannelId()] = message->getVertexSets();
00046 m_TransformationMatrices[message->getChannelId()] = message->getTransformationMatrix();
00047 requestRedraw();
00048 }
00049 break;
00050 }
00051
00052 case MessageTypes::SCENE_GRAPH_M:
00053 {
00054 SceneGraphM* message = Message::castTo<SceneGraphM> ( newMessage );
00055 if ( message )
00056 {
00057 m_RobotToWorld = message->getSceneGraph().getTransformation( "Robot", "World" );
00058 }
00059 break;
00060 }
00061
00062 case MessageTypes::POINT_CLOUD_M:
00063 {
00064 PointCloudM* message = Message::castTo<PointCloudM> ( newMessage );
00065 if ( message )
00066 {
00067
00068 Debug3DM::VertexSet vs;
00069 vs.r = 1;
00070 vs.g = 1;
00071 vs.b = 1;
00072 vs.paintStyle = Debug3DM::SmallDots;
00073 vs.points = message->getPoints();
00074 string id = "Raw PointCloudM Data" + Tracer::toString( m_RawDataCounter );
00075
00076 m_VertexSets[id] = vector<Debug3DM::VertexSet>();
00077 m_VertexSets[id].push_back( vs );
00078 m_TransformationMatrices[id] = m_RobotToWorld;
00079
00080 requestRedraw();
00081 }
00082 break;
00083 }
00084
00085 default:
00086 break;
00087
00088 }
00089 }
00090
00091 void THIS::paint ( float next2DLayer )
00092 {
00093
00094 std::map< std::string, std::vector<Debug3DM::VertexSet> >::iterator vertexSetIt;
00095
00096 for ( vertexSetIt = m_VertexSets.begin(); vertexSetIt != m_VertexSets.end(); vertexSetIt++ )
00097 {
00098 glPushMatrix();
00099
00100 GLdouble glMatrix[16];
00101 m_TransformationMatrices[ vertexSetIt->first ].toColumnMajor ( glMatrix );
00102 glMultMatrixd ( glMatrix );
00103
00104 std::vector<Debug3DM::VertexSet>& vertexSet = vertexSetIt->second;
00105 for ( unsigned i=0; i<vertexSet.size(); i++ )
00106 {
00107 float r = vertexSet[i].r;
00108 float g = vertexSet[i].g;
00109 float b = vertexSet[i].b;
00110
00111
00112 switch ( vertexSet[i].paintStyle )
00113 {
00114 case Debug3DM::Dots:
00115 glPointSize ( 3.0 );
00116 glBegin( GL_POINTS );
00117 break;
00118
00119 case Debug3DM::SmallDots:
00120 glPointSize ( 1.0 );
00121 glBegin( GL_POINTS );
00122 break;
00123
00124 case Debug3DM::LineStrip:
00125 glPointSize ( 3.0 );
00126 glBegin( GL_LINE_STRIP );
00127 break;
00128
00129 case Debug3DM::LineLoop:
00130 glPointSize ( 3.0 );
00131 glBegin( GL_LINE_LOOP );
00132 break;
00133
00134 case Debug3DM::DotFlowers:
00135 glPointSize ( 3.0 );
00136 glBegin( GL_POINTS );
00137 break;
00138
00139 case Debug3DM::Quads:
00140 glBegin( GL_QUADS );
00141 break;
00142 }
00143
00144 for ( unsigned j=0; j<vertexSet[i].points.size(); j++ )
00145 {
00146 glColor3f( r,g,b );
00147 glVertex3f( vertexSet[i].points[j].x, vertexSet[i].points[j].y, vertexSet[i].points[j].z );
00148 }
00149 glEnd();
00150
00151 switch ( vertexSet[i].paintStyle )
00152 {
00153 case Debug3DM::DotFlowers:
00154 glLineWidth ( 1.0 );
00155 glBegin( GL_LINES );
00156 for ( unsigned j=0; j<vertexSet[i].points.size(); j++ )
00157 {
00158 glColor3f( 0.5,0.5,0.5 );
00159 glVertex3f( vertexSet[i].points[j].x, vertexSet[i].points[j].y, 0 );
00160 glVertex3f( vertexSet[i].points[j].x, vertexSet[i].points[j].y, vertexSet[i].points[j].z );
00161 }
00162 glEnd();
00163 break;
00164
00165 default:
00166 break;
00167 }
00168 }
00169 glPopMatrix();
00170 }
00171
00172 }
00173
00174 #undef THIS