00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #pragma once
00022
00023 #include <Inventor/SbLinear.h>
00024 #include <Inventor/elements/SoTangentBindingElement.h>
00025
00053 {
00054 public:
00055 SoTangentGenerator( bool useLines, int approxNumVertices = 16 );
00056 ~SoTangentGenerator();
00057
00064 void setupApproxShapeSize( int32_t approxNumVertices );
00065
00070 void beginLineStrip();
00071 void lineStripVertex( const SbVec3f& point );
00072 void endLineStrip();
00073
00084 void setupIndexedVertexArray( const SbVec3f* pointArray );
00085
00090 void lineStripVertex( const int32_t pointIndex );
00091
00093 void generate();
00094
00100 int getNumTangents() const
00101 {
00102 return m_numVertTangents;
00103 }
00104
00109 const SbVec3f* getTangents() const
00110 {
00111 return m_vertTangents;
00112 }
00113
00118 const SbVec3f& getTangent( int32_t i ) const
00119 {
00120 return m_vertTangents[i];
00121 }
00122
00123 SoTangentBindingElement::Binding getBinding() const
00124 {
00125 return m_binding;
00126 }
00127
00136 void setTangent( int32_t index, const SbVec3f& newTangent );
00137
00138 private:
00144 void setTangentBuffer( int32_t numTangents, const SbVec3f* tangents );
00145
00146 private:
00147 SbVec3f computeTangent( const SbVec3f& previous, const SbVec3f& current, const SbVec3f& next ) const;
00148
00149 std::vector<SbVec3f> m_tangents;
00150 std::vector<SbVec3f> m_polylinePoints;
00151
00152 const SbVec3f* m_points;
00153 const SbVec3f* m_vertTangents;
00154
00155 int32_t m_numVertTangents;
00156 SoTangentBindingElement::Binding m_binding;
00157 bool m_useLines;
00158 static int s_generationMode;
00159 };
00160