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 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 } // namespace cinder