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