00001 /*===========================================================================*\ 00002 * * 00003 * OpenFlipper * 00004 * Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen * 00005 * www.openflipper.org * 00006 * * 00007 *---------------------------------------------------------------------------* 00008 * This file is part of OpenFlipper. * 00009 * * 00010 * OpenFlipper is free software: you can redistribute it and/or modify * 00011 * it under the terms of the GNU Lesser General Public License as * 00012 * published by the Free Software Foundation, either version 3 of * 00013 * the License, or (at your option) any later version with the * 00014 * following exceptions: * 00015 * * 00016 * If other files instantiate templates or use macros * 00017 * or inline functions from this file, or you compile this file and * 00018 * link it with other files to produce an executable, this file does * 00019 * not by itself cause the resulting executable to be covered by the * 00020 * GNU Lesser General Public License. This exception does not however * 00021 * invalidate any other reasons why the executable file might be * 00022 * covered by the GNU Lesser General Public License. * 00023 * * 00024 * OpenFlipper is distributed in the hope that it will be useful, * 00025 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00027 * GNU Lesser General Public License for more details. * 00028 * * 00029 * You should have received a copy of the GNU LesserGeneral Public * 00030 * License along with OpenFlipper. If not, * 00031 * see <http://www.gnu.org/licenses/>. * 00032 * * 00033 \*===========================================================================*/ 00034 00035 /*===========================================================================*\ 00036 * * 00037 * $Revision: 8548 $ * 00038 * $Author: moebius $ * 00039 * $Date: 2010-02-12 14:40:13 +0100 (Fr, 12. Feb 2010) $ * 00040 * * 00041 \*===========================================================================*/ 00042 00043 00044 00045 00046 //============================================================================= 00047 // 00048 // CLASS TriangleNode 00049 // 00050 //============================================================================= 00051 00052 #ifndef ACG_TRIANGLENODE_HH 00053 #define ACG_TRIANGLENODE_HH 00054 00055 //============================================================================= 00056 00057 #include "BaseNode.hh" 00058 00059 #include <vector> 00060 00061 //============================================================================= 00062 00063 namespace ACG { 00064 namespace SceneGraph { 00065 00066 //============================================================================= 00067 00068 00069 class ACGDLLEXPORT TriangleNode : public BaseNode 00070 { 00071 00072 public: 00073 00074 typedef std::vector<ACG::Vec3f> PointVector; 00075 00076 TriangleNode( BaseNode* _parent=0, 00077 std::string _name="<TriangleNode>" ); 00078 virtual ~TriangleNode(); 00079 00080 ACG_CLASSNAME(TriangleNode); 00081 00082 00083 DrawModes::DrawMode availableDrawModes() const; 00084 00085 void boundingBox(Vec3d& _bbMin, Vec3d& _bbMax); 00086 void draw(GLState& _state, DrawModes::DrawMode _drawMode); 00087 void pick(GLState& _state, PickTarget _target); 00088 00089 void add_triangle( const ACG::Vec3f & _p0, 00090 const ACG::Vec3f & _p1, 00091 const ACG::Vec3f & _p2 ) 00092 { 00093 point_.push_back( _p0 ); 00094 point_.push_back( _p1 ); 00095 point_.push_back( _p2 ); 00096 00097 ACG::Vec3f n = ( _p1 - _p0 ) % ( _p2 - _p1 ); 00098 if ( n.norm() > 0.00001 ) 00099 n.normalize(); 00100 else 00101 n = Vec3f( 0, 0, 0 ); 00102 normal_.push_back( n ); 00103 } 00104 00105 void clear() 00106 { 00107 point_.clear(); 00108 normal_.clear(); 00109 } 00110 00111 int n_triangles() const { return point_.size() / 3; } 00112 00113 void triangle( int _i, 00114 ACG::Vec3f & _p0, 00115 ACG::Vec3f & _p1, 00116 ACG::Vec3f & _p2 ) const 00117 { 00118 _p0 = point_[ 3 * _i + 0 ]; 00119 _p1 = point_[ 3 * _i + 1 ]; 00120 _p2 = point_[ 3 * _i + 2 ]; 00121 } 00122 00123 protected: 00124 00125 enum FaceMode { FACE_NORMALS, FACE_COLORS, PER_VERTEX }; 00126 00127 void draw_vertices(); 00128 void draw_faces(); 00129 void draw_wireframe(); 00130 00131 PointVector point_; 00132 PointVector normal_; 00133 00134 }; 00135 00136 00137 //============================================================================= 00138 } // namespace SceneGraph 00139 } // namespace ACG 00140 //============================================================================= 00141 #endif // ACG_TRIMESHNODE_HH defined 00142 //=============================================================================