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 "Teddy/Models/TriangleStrip.h"
00026 #include "Teddy/Models/Vertex.h"
00027 #include "Teddy/PhysicalComponents/Projection.h"
00028 #include "Teddy/SysSupport/Messages.h"
00029 #include "Teddy/SysSupport/StdIO.h"
00030 using namespace Teddy::SysSupport;
00031
00032
00033 namespace Teddy {
00034 namespace Models {
00035
00036
00038 TriangleStrip::TriangleStrip(){
00039 }
00040
00041
00043 TriangleStrip::~TriangleStrip(){
00044
00045 }
00046
00047
00049 void TriangleStrip::draw( Projection *p ){
00050
00051 if( isEnabled(EL_USE_ELEMENT_NORMAL|EL_HAS_ELEMENT_NORMAL) ){
00052 dmsg( M_INIT, "Drawing flat trianglestrip" );
00053
00054 p->beginTriangles();
00055
00056 list<Vector*>::const_iterator n_it = normals .begin();
00057 list<Vertex*>::const_iterator v1_it = vertices.begin();
00058 list<Vertex*>::const_iterator v2_it = v1_it;
00059 bool swap = true;
00060 while( n_it != normals.end() && v2_it != vertices.end() ){
00061 Vector *normal = *n_it++;
00062 p->normal( *normal );
00063 v2_it = v1_it;
00064 Vertex *a = *v2_it++; if( v2_it == vertices.end() ){ dmsg( M_WARN, "TriangleStrip missing vertices" ); break; }
00065 Vertex *b = *v2_it++; if( v2_it == vertices.end() ){ dmsg( M_WARN, "TriangleStrip missing vertices" ); break; }
00066 Vertex *c = *v2_it++;
00067 if( swap ){
00068 b->draw( p );
00069 a->draw( p );
00070 }else{
00071 a->draw( p );
00072 b->draw( p );
00073 }
00074 c->draw( p );
00075 dprint( M_INIT, "." );
00076 v1_it++;
00077 swap = !swap;
00078 }
00079
00080 p->end();
00081
00082 }else{
00083 dmsg( M_INIT, "Drawing smoothed trianglestrip" );
00084
00085 p->beginTriangleStrip();
00086 list<Vertex*>::const_iterator v_it = vertices.begin();
00087 while( v_it != vertices.end() ){
00088 (*v_it)->draw( p );
00089 v_it++;
00090 }
00091
00092 p->end();
00093 }
00094
00095 }
00096
00097
00098
00099 void TriangleStrip::makeNormal(){
00100 list<Vertex*>::iterator v_i1 = vertices.begin();
00101 list<Vertex*>::iterator v_i2 = v_i1;
00102
00103 if( vertices.size()<3 ){
00104 dmsg( M_WARN,
00105 "Element does not have enough vertices for normal calculation (%d vertices found)",
00106 vertices.size()
00107 );
00108 normal = Vector(0,1,0);
00109 return;
00110 }
00111
00112 normals.clear();
00113 float len;
00114 bool swap = true;
00115 Vector a;
00116 Vector b;
00117 Vector c;
00118 do{
00119 v_i2 = v_i1++;
00120
00121 if( swap ){
00122 if( v_i2 == vertices.end() ){ dmsg( M_WARN, "TriangleStripe normal problem" ); return; }
00123 b = (*v_i2++)->getVertex();
00124 if( v_i2 == vertices.end() ){ dmsg( M_WARN, "TriangleStripe normal problem" ); return; }
00125 a = (*v_i2++)->getVertex();
00126 }else{
00127 if( v_i2 == vertices.end() ){ dmsg( M_WARN, "TriangleStripe normal problem" ); return; }
00128 a = (*v_i2++)->getVertex();
00129 if( v_i2 == vertices.end() ){ dmsg( M_WARN, "TriangleStripe normal problem" ); return; }
00130 b = (*v_i2++)->getVertex();
00131 }
00132
00133 if( v_i2 == vertices.end() ){ dmsg( M_WARN, "TriangleStripe normal problem" ); return; }
00134 c = (*v_i2++)->getVertex();
00135
00136 Vector ab = b-a;
00137 ab.normalize();
00138 Vector bc = c-b;
00139 bc.normalize();
00140 float test = ab | bc;
00141 normal = (a-c)^(a-b);
00142 normal.normalize();
00143 len = normal.magnitude();
00144 if( len < 0.9 || len >11.1 ){
00145 dmsg( M_WARN, "TriangleStripe normal problem" );
00146 return;
00147 }
00148 if( test == -1.0 || test == 1.0 ){
00149 }else{
00150 this->normal = normal;
00151 }
00152 normals.push_back( new Vector(normal) );
00153 swap = !swap;
00154 }while( v_i2 != vertices.end() );
00155
00156 enable( EL_HAS_ELEMENT_NORMAL | EL_USE_ELEMENT_NORMAL );
00157 }
00158
00159
00160
00161 #if defined( TEDDY_INCLUDE_COLDET )
00162 int TriangleStrip::addToCollisionModel( Teddy::ColDet::CollisionModel3D *collision_model ){
00163 int tris = 0;
00164 list<Vertex*>::const_iterator v_it = vertices.begin();
00165
00166 FloatVector a = (*v_it)->getVertex(); v_it++; if( v_it == vertices.end() ) return 0;
00167 FloatVector b = (*v_it)->getVertex(); v_it++;
00168 while( v_it != vertices.end() ){
00169 FloatVector c = (*v_it)->getVertex();
00170 collision_model->addTriangle( a, b, c );
00171 a = b;
00172 b = c;
00173 tris++;
00174 v_it++;
00175 }
00176 return tris;
00177 }
00178 #endif
00179
00180
00181
00182 unsigned long TriangleStrip::countCSGFaceElements(){
00183 unsigned long size = vertices.size();
00184 return size - 2;
00185 }
00186
00187
00188 };
00189 };
00190