00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include <vector>
00026 #include "cinder/Vector.h"
00027 #include "cinder/AxisAlignedBox.h"
00028 #include "cinder/DataSource.h"
00029 #include "cinder/DataTarget.h"
00030 #include "cinder/Matrix.h"
00031 #include "cinder/Color.h"
00032 #include "cinder/Rect.h"
00033
00034 namespace cinder {
00035
00066 class TriMesh {
00067 public:
00068
00069 void clear();
00070
00071 bool hasNormals() const { return ! mNormals.empty(); }
00072 bool hasColorsRGB() const { return ! mColorsRGB.empty(); }
00073 bool hasColorsRGBA() const { return ! mColorsRGBA.empty(); }
00074 bool hasTexCoords() const { return ! mTexCoords.empty(); }
00075
00077 void appendVertex( const Vec3f &v ) { mVertices.push_back( v ); }
00079 void appendVertices( const Vec4d *verts, size_t num );
00081 void appendNormal( const Vec3f &v ) { mNormals.push_back( v ); }
00083 void appendNormals( const Vec4d *normals, size_t num );
00085 void appendColorRGB( const Color &rgb ) { mColorsRGB.push_back( rgb ); }
00087 void appendColorRGBA( const ColorA &rgba ) { mColorsRGBA.push_back( rgba ); }
00089 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00090
00094 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00095 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00097 void appendIndices( uint32_t *indices, size_t num );
00098
00100 size_t getNumIndices() const { return mIndices.size(); }
00102 size_t getNumTriangles() const { return mIndices.size() / 3; }
00104 size_t getNumVertices() const { return mVertices.size(); }
00105
00107 void getTriangleVertices( size_t idx, Vec3f *a, Vec3f *b, Vec3f *c ) const;
00108
00110 std::vector<Vec3f>& getVertices() { return mVertices; }
00112 const std::vector<Vec3f>& getVertices() const { return mVertices; }
00114 std::vector<Vec3f>& getNormals() { return mNormals; }
00116 const std::vector<Vec3f>& getNormals() const { return mNormals; }
00118 std::vector<Color>& getColorsRGB() { return mColorsRGB; }
00120 const std::vector<Color>& getColorsRGB() const { return mColorsRGB; }
00122 std::vector<ColorA>& getColorsRGBA() { return mColorsRGBA; }
00124 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRGBA; }
00126 std::vector<Vec2f>& getTexCoords() { return mTexCoords; }
00128 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00130 std::vector<uint32_t>& getIndices() { return mIndices; }
00132 const std::vector<uint32_t>& getIndices() const { return mIndices; }
00133
00135 AxisAlignedBox3f calcBoundingBox() const;
00137 AxisAlignedBox3f calcBoundingBox( const Matrix44f &transform ) const;
00138
00140 void read( DataSourceRef in );
00142 void write( DataTargetRef out ) const;
00143
00144 private:
00145 std::vector<Vec3f> mVertices;
00146 std::vector<Vec3f> mNormals;
00147 std::vector<Color> mColorsRGB;
00148 std::vector<ColorA> mColorsRGBA;
00149 std::vector<Vec2f> mTexCoords;
00150 std::vector<uint32_t> mIndices;
00151 };
00152
00153 class TriMesh2d {
00154 public:
00155 void clear();
00156
00157 bool hasColorsRgb() const { return ! mColorsRgb.empty(); }
00158 bool hasColorsRgba() const { return ! mColorsRgba.empty(); }
00159 bool hasTexCoords() const { return ! mTexCoords.empty(); }
00160
00162 void appendVertex( const Vec2f &v ) { mVertices.push_back( v ); }
00164 void appendVertices( const Vec2f *verts, size_t num );
00166 void appendColorRgb( const Color &rgb ) { mColorsRgb.push_back( rgb ); }
00168 void appendColorRgba( const ColorA &rgba ) { mColorsRgba.push_back( rgba ); }
00170 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00171
00175 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00176 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00178 void appendIndices( uint32_t *indices, size_t num );
00179
00181 size_t getNumIndices() const { return mIndices.size(); }
00183 size_t getNumTriangles() const { return mIndices.size() / 3; }
00185 size_t getNumVertices() const { return mVertices.size(); }
00186
00188 void getTriangleVertices( size_t idx, Vec2f *a, Vec2f *b, Vec2f *c ) const;
00189
00191 const std::vector<Vec2f>& getVertices() const { return mVertices; }
00193 const std::vector<Color>& getColorsRGB() const { return mColorsRgb; }
00195 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRgba; }
00197 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00199 const std::vector<size_t>& getIndices() const { return mIndices; }
00200
00202 Rectf calcBoundingBox() const;
00203
00204 private:
00205 std::vector<Vec2f> mVertices;
00206 std::vector<Color> mColorsRgb;
00207 std::vector<ColorA> mColorsRgba;
00208 std::vector<Vec2f> mTexCoords;
00209 std::vector<size_t> mIndices;
00210 };
00211
00212 }