00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <vector>
00026
00027 #include "../kernel/WKernel.h"
00028
00029 #include "WFiberDrawable.h"
00030
00031
00032
00033
00034
00035
00036 WFiberDrawable::WFiberDrawable():
00037 osg::Drawable(),
00038 m_useTubes( false )
00039 {
00040 setSupportsDisplayList( false );
00041
00042 }
00043
00044
00045
00046 WFiberDrawable::WFiberDrawable( const WFiberDrawable& , const osg::CopyOp& ):
00047 osg::Drawable()
00048 {
00049 }
00050
00051 osg::Object* WFiberDrawable::cloneType() const
00052 {
00053 return new WFiberDrawable();
00054 }
00055
00056 osg::Object* WFiberDrawable::clone( const osg::CopyOp& copyop ) const
00057 {
00058 return new WFiberDrawable( *this, copyop );
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void WFiberDrawable::drawImplementation( osg::RenderInfo& renderInfo ) const
00073 {
00074 if( m_useTubes )
00075 {
00076 drawTubes();
00077 }
00078 else
00079 {
00080 drawFibers( renderInfo );
00081 }
00082 }
00083
00084 void WFiberDrawable::drawFibers( osg::RenderInfo& renderInfo ) const
00085 {
00086 osg::State& state = *renderInfo.getState();
00087
00088 state.disableAllVertexArrays();
00089 state.setVertexPointer( 3, GL_FLOAT , 0, &( *m_verts )[0] );
00090 state.setColorPointer( 3 , GL_FLOAT , 0, &( *m_colors )[0] );
00091
00092 for( size_t i = 0; i < m_active->size(); ++i )
00093 {
00094 if( (*m_active)[i] )
00095 {
00096 state.glDrawArraysInstanced( GL_LINE_STRIP, (*m_startIndexes)[i], (*m_pointsPerLine)[i], 1);
00097 }
00098 }
00099
00100 state.disableVertexPointer();
00101 state.disableColorPointer();
00102 }
00103
00104 void WFiberDrawable::drawTubes() const
00105 {
00106 for( size_t i = 0; i < m_active->size(); ++i )
00107 {
00108 if( (*m_active)[i] )
00109 {
00110 glBegin( GL_QUAD_STRIP );
00111 int idx = m_startIndexes->at( i ) * 3;
00112 for( size_t k = 0; k < m_pointsPerLine->at( i ); ++k )
00113 {
00114 glNormal3f( m_tangents->at( idx ), m_tangents->at( idx + 1 ), m_tangents->at( idx + 2 ) );
00115 glColor3f( m_colors->at( idx ), m_colors->at( idx + 1 ), m_colors->at( idx + 2 ) );
00116 glTexCoord1f( -1.0f );
00117 glVertex3f( m_verts->at( idx ), m_verts->at( idx + 1 ), m_verts->at( idx + 2 ) );
00118 glTexCoord1f( 1.0f );
00119 glVertex3f( m_verts->at( idx ), m_verts->at( idx + 1 ), m_verts->at( idx + 2 ) );
00120 idx += 3;
00121
00122 }
00123 glEnd();
00124 }
00125 }
00126 }
00127