include/cinder/TriMesh.h
Go to the documentation of this file.
00001 /*
00002  Copyright (c) 2010, The Barbarian Group
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
00006  the following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
00009     the following disclaimer.
00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
00012 
00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00020  POSSIBILITY OF SUCH DAMAGE.
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 } // namespace cinder