OpenWalnut 1.2.5
WCreateColorArraysThread.cpp
00001 //---------------------------------------------------------------------------
00002 //
00003 // Project: OpenWalnut ( http://www.openwalnut.org )
00004 //
00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
00006 // For more information see http://www.openwalnut.org/copying
00007 //
00008 // This file is part of OpenWalnut.
00009 //
00010 // OpenWalnut is free software: you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as published by
00012 // the Free Software Foundation, either version 3 of the License, or
00013 // (at your option) any later version.
00014 //
00015 // OpenWalnut is distributed in the hope that it will be useful,
00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 // GNU Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public License
00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
00022 //
00023 //---------------------------------------------------------------------------
00024 
00025 #include <vector>
00026 
00027 #include "WCreateColorArraysThread.h"
00028 
00029 
00030 WCreateColorArraysThread::WCreateColorArraysThread(  int left, int right, boost::shared_ptr< std::vector< float > >vertices,
00031         boost::shared_ptr< std::vector< size_t > > lineStartIndexes,
00032         boost::shared_ptr< std::vector< size_t > > lineLengths,
00033         boost::shared_ptr< std::vector< float > > globalColors,
00034         boost::shared_ptr< std::vector< float > > localColors,
00035         boost::shared_ptr< std::vector< float > > tangents ):
00036     WThreadedRunner(),
00037     m_myThreadFinished( false ),
00038     m_left( left ),
00039     m_right( right ),
00040     m_vertices( vertices ),
00041     m_tangents( tangents ),
00042     m_globalColors( globalColors ),
00043     m_localColors( localColors ),
00044     m_lineStartIndexes( lineStartIndexes ),
00045     m_lineLengths( lineLengths )
00046 {
00047 }
00048 
00049 WCreateColorArraysThread::~WCreateColorArraysThread()
00050 {
00051 }
00052 
00053 void WCreateColorArraysThread::threadMain()
00054 {
00055     if( !m_vertices || !m_tangents || !m_globalColors || !m_localColors || !m_lineStartIndexes || !m_lineLengths )
00056     {
00057         return;
00058     }
00059 
00060     if( !m_vertices->size() ||
00061          !m_tangents->size() ||
00062          !m_globalColors->size() ||
00063          !m_localColors->size() ||
00064          !m_lineStartIndexes->size() ||
00065          !m_lineLengths->size() )
00066     {
00067         return;
00068     }
00069 
00070     int pc = 0;
00071     for( int i = 0; i < m_left; ++i )
00072     {
00073         pc += (*m_lineLengths)[i]*3;
00074     }
00075 
00076     float r, g, b, rr, gg, bb;
00077     float x1, x2, y1, y2, z1, z2;
00078     float lastx, lasty, lastz;
00079     for( int i = m_left; i <= m_right; ++i )
00080     {
00081         x1 = (*m_vertices)[pc];
00082         y1 = (*m_vertices)[pc + 1];
00083         z1 = (*m_vertices)[pc + 2];
00084         x2 = (*m_vertices)[pc + (*m_lineLengths)[i] * 3 - 3 ];
00085         y2 = (*m_vertices)[pc + (*m_lineLengths)[i] * 3 - 2 ];
00086         z2 = (*m_vertices)[pc + (*m_lineLengths)[i] * 3 - 1 ];
00087         r = ( x1 ) - ( x2 );
00088         g = ( y1 ) - ( y2 );
00089         b = ( z1 ) - ( z2 );
00090         if( r < 0.0 )
00091             r *= -1.0;
00092         if( g < 0.0 )
00093             g *= -1.0;
00094         if( b < 0.0 )
00095             b *= -1.0;
00096 
00097         float norm = sqrt( r * r + g * g + b * b );
00098         r *= 1.0 / norm;
00099         g *= 1.0 / norm;
00100         b *= 1.0 / norm;
00101 
00102         lastx = (*m_vertices)[pc] + ( (*m_vertices)[pc] - (*m_vertices)[pc + 3] );
00103         lasty = (*m_vertices)[pc+ 1] + ( (*m_vertices)[pc + 1] - (*m_vertices)[pc + 4] );
00104         lastz = (*m_vertices)[pc + 2] + ( (*m_vertices)[pc + 2] - (*m_vertices)[pc + 5] );
00105 
00106         for( size_t j = 0; j < m_lineLengths->at( i ); ++j )
00107         {
00108             rr = lastx - (*m_vertices)[pc];
00109             gg = lasty - (*m_vertices)[pc + 1];
00110             bb = lastz - (*m_vertices)[pc + 2];
00111             lastx = (*m_vertices)[pc];
00112             lasty = (*m_vertices)[pc + 1];
00113             lastz = (*m_vertices)[pc + 2];
00114 
00115             float norm = sqrt( rr * rr + gg * gg + bb * bb );
00116             rr *= 1.0 / norm;
00117             gg *= 1.0 / norm;
00118             bb *= 1.0 / norm;
00119             (*m_tangents)[pc] = rr;
00120             (*m_tangents)[pc+1] = gg;
00121             (*m_tangents)[pc+2] = bb;
00122 
00123             if( rr < 0.0 )
00124                 rr *= -1.0;
00125             if( gg < 0.0 )
00126                 gg *= -1.0;
00127             if( bb < 0.0 )
00128                 bb *= -1.0;
00129 
00130             (*m_localColors)[pc] = rr;
00131             (*m_localColors)[pc+1] = gg;
00132             (*m_localColors)[pc+2] = bb;
00133 
00134             (*m_globalColors)[pc] = r;
00135             (*m_globalColors)[pc+1] = g;
00136             (*m_globalColors)[pc+2] = b;
00137             pc += 3;
00138         }
00139     }
00140 
00141     m_myThreadFinished = true;
00142 }
00143 
00144 bool WCreateColorArraysThread::isFinished()
00145 {
00146     return m_myThreadFinished;
00147 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends