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 Vec3f *normals, size_t num );
00087 void appendNormals( const Vec4d *normals, size_t num );
00089 void appendColorRgb( const Color &rgb ) { mColorsRGB.push_back( rgb ); }
00091 void appendColorRgba( const ColorA &rgba ) { mColorsRGBA.push_back( rgba ); }
00093 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00094
00096 void appendColorsRgb( const Color *rgbs, size_t num );
00098 void appendColorsRgba( const ColorA *rgbas, size_t num );
00100 void appendTexCoords( const Vec2f *texcoords, size_t num );
00101
00105 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00106 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00108 void appendIndices( const uint32_t *indices, size_t num );
00109
00111 size_t getNumIndices() const { return mIndices.size(); }
00113 size_t getNumTriangles() const { return mIndices.size() / 3; }
00115 size_t getNumVertices() const { return mVertices.size(); }
00116
00118 void getTriangleVertices( size_t idx, Vec3f *a, Vec3f *b, Vec3f *c ) const;
00119
00121 std::vector<Vec3f>& getVertices() { return mVertices; }
00123 const std::vector<Vec3f>& getVertices() const { return mVertices; }
00125 std::vector<Vec3f>& getNormals() { return mNormals; }
00127 const std::vector<Vec3f>& getNormals() const { return mNormals; }
00129 std::vector<Color>& getColorsRGB() { return mColorsRGB; }
00131 const std::vector<Color>& getColorsRGB() const { return mColorsRGB; }
00133 std::vector<ColorA>& getColorsRGBA() { return mColorsRGBA; }
00135 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRGBA; }
00137 std::vector<Vec2f>& getTexCoords() { return mTexCoords; }
00139 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00141 std::vector<uint32_t>& getIndices() { return mIndices; }
00143 const std::vector<uint32_t>& getIndices() const { return mIndices; }
00144
00146 AxisAlignedBox3f calcBoundingBox() const;
00148 AxisAlignedBox3f calcBoundingBox( const Matrix44f &transform ) const;
00149
00151 void read( DataSourceRef in );
00153 void write( DataTargetRef out ) const;
00154
00156 void recalculateNormals();
00157
00158 private:
00159 std::vector<Vec3f> mVertices;
00160 std::vector<Vec3f> mNormals;
00161 std::vector<Color> mColorsRGB;
00162 std::vector<ColorA> mColorsRGBA;
00163 std::vector<Vec2f> mTexCoords;
00164 std::vector<uint32_t> mIndices;
00165 };
00166
00167 class TriMesh2d {
00168 public:
00169 void clear();
00170
00171 bool hasColorsRgb() const { return ! mColorsRgb.empty(); }
00172 bool hasColorsRgba() const { return ! mColorsRgba.empty(); }
00173 bool hasTexCoords() const { return ! mTexCoords.empty(); }
00174
00176 void appendVertex( const Vec2f &v ) { mVertices.push_back( v ); }
00178 void appendVertices( const Vec2f *verts, size_t num );
00180 void appendColorRgb( const Color &rgb ) { mColorsRgb.push_back( rgb ); }
00182 void appendColorRgba( const ColorA &rgba ) { mColorsRgba.push_back( rgba ); }
00184 void appendTexCoord( const Vec2f &v ) { mTexCoords.push_back( v ); }
00185
00187 void appendColorsRgb( const Color *rgbs, size_t num );
00189 void appendColorsRgba( const ColorA *rgbas, size_t num );
00191 void appendTexCoords( const Vec2f *texcoords, size_t num );
00192
00196 void appendTriangle( size_t v0, size_t v1, size_t v2 )
00197 { mIndices.push_back( v0 ); mIndices.push_back( v1 ); mIndices.push_back( v2 ); }
00199 void appendIndices( const uint32_t *indices, size_t num );
00200
00202 size_t getNumIndices() const { return mIndices.size(); }
00204 size_t getNumTriangles() const { return mIndices.size() / 3; }
00206 size_t getNumVertices() const { return mVertices.size(); }
00207
00209 void getTriangleVertices( size_t idx, Vec2f *a, Vec2f *b, Vec2f *c ) const;
00210
00212 std::vector<Vec2f>& getVertices() { return mVertices; }
00214 const std::vector<Vec2f>& getVertices() const { return mVertices; }
00216 std::vector<Color>& getColorsRGB() { return mColorsRgb; }
00218 const std::vector<Color>& getColorsRGB() const { return mColorsRgb; }
00220 std::vector<ColorA>& getColorsRGBA() { return mColorsRgba; }
00222 const std::vector<ColorA>& getColorsRGBA() const { return mColorsRgba; }
00224 std::vector<Vec2f>& getTexCoords() { return mTexCoords; }
00226 const std::vector<Vec2f>& getTexCoords() const { return mTexCoords; }
00228 std::vector<size_t>& getIndices() { return mIndices; }
00230 const std::vector<size_t>& getIndices() const { return mIndices; }
00231
00233 Rectf calcBoundingBox() const;
00234
00235 private:
00236 std::vector<Vec2f> mVertices;
00237 std::vector<Color> mColorsRgb;
00238 std::vector<ColorA> mColorsRgba;
00239 std::vector<Vec2f> mTexCoords;
00240 std::vector<size_t> mIndices;
00241 };
00242
00243 }