Go to the documentation of this file.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 Vec3f *verts, size_t num );
00081 void appendVertices( const Vec4d *verts, size_t num );
00083 void appendNormal( const Vec3f &v ) { mNormals.push_back( v ); }
00085 void appendNormals( const Vec4d *normals, size_t num );
00087 void appendColorRGB( const Color &rgb ) { mColorsRGB.push_back( rgb ); }
00089 void appendColorRGBA( const ColorA &rgba ) { mColorsRGBA.push_back( rgba ); }
00091 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00092
00096 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00097 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00099 void appendIndices( uint32_t *indices, size_t num );
00100
00102 size_t getNumIndices() const { return mIndices.size(); }
00104 size_t getNumTriangles() const { return mIndices.size() / 3; }
00106 size_t getNumVertices() const { return mVertices.size(); }
00107
00109 void getTriangleVertices( size_t idx, Vec3f *a, Vec3f *b, Vec3f *c ) const;
00110
00112 std::vector<Vec3f>& getVertices() { return mVertices; }
00114 const std::vector<Vec3f>& getVertices() const { return mVertices; }
00116 std::vector<Vec3f>& getNormals() { return mNormals; }
00118 const std::vector<Vec3f>& getNormals() const { return mNormals; }
00120 std::vector<Color>& getColorsRGB() { return mColorsRGB; }
00122 const std::vector<Color>& getColorsRGB() const { return mColorsRGB; }
00124 std::vector<ColorA>& getColorsRGBA() { return mColorsRGBA; }
00126 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRGBA; }
00128 std::vector<Vec2f>& getTexCoords() { return mTexCoords; }
00130 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00132 std::vector<uint32_t>& getIndices() { return mIndices; }
00134 const std::vector<uint32_t>& getIndices() const { return mIndices; }
00135
00137 AxisAlignedBox3f calcBoundingBox() const;
00139 AxisAlignedBox3f calcBoundingBox( const Matrix44f &transform ) const;
00140
00142 void read( DataSourceRef in );
00144 void write( DataTargetRef out ) const;
00145
00146 private:
00147 std::vector<Vec3f> mVertices;
00148 std::vector<Vec3f> mNormals;
00149 std::vector<Color> mColorsRGB;
00150 std::vector<ColorA> mColorsRGBA;
00151 std::vector<Vec2f> mTexCoords;
00152 std::vector<uint32_t> mIndices;
00153 };
00154
00155 class TriMesh2d {
00156 public:
00157 void clear();
00158
00159 bool hasColorsRgb() const { return ! mColorsRgb.empty(); }
00160 bool hasColorsRgba() const { return ! mColorsRgba.empty(); }
00161 bool hasTexCoords() const { return ! mTexCoords.empty(); }
00162
00164 void appendVertex( const Vec2f &v ) { mVertices.push_back( v ); }
00166 void appendVertices( const Vec2f *verts, size_t num );
00168 void appendColorRgb( const Color &rgb ) { mColorsRgb.push_back( rgb ); }
00170 void appendColorRgba( const ColorA &rgba ) { mColorsRgba.push_back( rgba ); }
00172 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00173
00177 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00178 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00180 void appendIndices( uint32_t *indices, size_t num );
00181
00183 size_t getNumIndices() const { return mIndices.size(); }
00185 size_t getNumTriangles() const { return mIndices.size() / 3; }
00187 size_t getNumVertices() const { return mVertices.size(); }
00188
00190 void getTriangleVertices( size_t idx, Vec2f *a, Vec2f *b, Vec2f *c ) const;
00191
00193 std::vector<Vec2f>& getVertices() { return mVertices; }
00195 const std::vector<Vec2f>& getVertices() const { return mVertices; }
00197 std::vector<Color>& getColorsRGB() { return mColorsRgb; }
00199 const std::vector<Color>& getColorsRGB() const { return mColorsRgb; }
00201 std::vector<ColorA>& getColorsRGBA() { return mColorsRgba; }
00203 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRgba; }
00205 std::vector<Vec2f>& getTexCoords() { return mTexCoords; }
00207 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00209 std::vector<size_t>& getIndices() { return mIndices; }
00211 const std::vector<size_t>& getIndices() const { return mIndices; }
00212
00214 Rectf calcBoundingBox() const;
00215
00216 private:
00217 std::vector<Vec2f> mVertices;
00218 std::vector<Color> mColorsRgb;
00219 std::vector<ColorA> mColorsRgba;
00220 std::vector<Vec2f> mTexCoords;
00221 std::vector<size_t> mIndices;
00222 };
00223
00224 }