diff --git a/vcg/simplex/faceplus/component_occ.h b/vcg/simplex/faceplus/component_occ.h new file mode 100644 index 00000000..46fe7b3e --- /dev/null +++ b/vcg/simplex/faceplus/component_occ.h @@ -0,0 +1,183 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ + +****************************************************************************/ + +/* +Note +OCC = Optional Component Compact +compare with OCF(Optional Component Fast) + +****************************************************************************/ +#ifndef __VCG_FACE_PLUS_COMPONENT_OCC +#define __VCG_FACE_PLUS_COMPONENT_OCC + +#include +#include + + +namespace vcg { + namespace face { + +///*-------------------------- NORMAL ----------------------------------------*/ + + template class NormalOcc: public T { + public: + typedef A NormalType; + NormalType &N() {return CAT< vector_occ,NormalType>::Instance()->Get((FaceType*)this);} + static bool HasNormal() { return true; } + static bool HasColorOcc() { return true; } + }; + + template class Normal3sOcc: public NormalOcc {}; + template class Normal3fOcc: public NormalOcc {}; + template class Normal3dOcc: public NormalOcc {}; + +///*-------------------------- COLOR ----------------------------------------*/ + +template class ColorOcc: public T { +public: + typedef A ColorType; + ColorType &C() { return CAT< vector_occ,ColorType>::Instance()->Get((FaceType*)this); } + static bool HasColor() { return true; } + static bool HasColorOcc() { return true; } +}; + +template class Color4bOcc: public ColorOcc {}; + +/*----------------------------- VFADJ ---------------------------------------*/ + +// questo tipo serve per tenere tutte le informazioni sull'adiacenza dentro una +// singola classe +template +struct VFAdjTypeSup { + FP _vfp[3]; + char _vfi[3]; + }; + +template class VFAdjOccBase: public T { +public: + typename T::FacePointer &VFp(const int j) { + return (CAT< vector_occ,VFAdjTypeSup >::Instance()->Get((FaceType*)this))._vfp[j];} + + typename T::FacePointer cVFp(const int j) const { + return (CAT< vector_occ,VFAdjTypeSup >::Instance()->Get((FaceType*)this))._vfp[j];} + + char &VFi(const int j) { return (CAT< vector_occ,VFAdjTypeSup >::Instance()->Get((FaceType*)this))._vfi[j];} + + static bool HasVFAdjacency() { return true; } + static bool HasVFAdjacencyOcc() { return true; } +}; + +template class VFAdjOcc : public VFAdjOccBase,T>{}; + +/*----------------------------- FFADJ -----------------------------------*/ + +// questo tipo serve per tenere tutte le informazioni sull'adiacenza dentro una +// singola classe +template +struct FFAdjTypeSup { + FP _ffp[3]; + char _ffi[3]; + }; + +template class FFAdjOccBase: public T { +public: + + typedef A FFAdjType; + + typename T::FacePointer &FFp(const int j) { + return (CAT< vector_occ,FFAdjTypeSup >::Instance()->Get((FaceType*)this))._ffp[j];} + + typename T::FacePointer const FFp(const int j) const { + return (CAT< vector_occ,FFAdjTypeSup >::Instance()->Get((FaceType*)this))._ffp[j];} + + typename T::FacePointer const cFFp(const int j) const { + return (CAT< vector_occ,FFAdjTypeSup >::Instance()->Get((FaceType*)this))._ffp[j];} + + char &FFi(const int j) { + return (CAT< vector_occ,FFAdjTypeSup >::Instance()->Get((FaceType*)this))._ffi[j];} + + static bool HasFFAdjacency() { return true; } + static bool HasFFAdjacencyOcc() { return true; } + +}; + +template class FFAdjOcc : public FFAdjOccBase,T>{}; + +template class VertexRefOcc: public T { +public: + // typedef typename T::VertexType VertexType; + // typedef typename T::VertexType::CoordType CoordType; + + inline typename T::VertexType * & V( const int j ) { assert(j>=0 && j<3); + return (CAT< vector_occ,VertexRef >::Instance()->Get((FaceType*)this)).V(j); } + + inline typename T::VertexType * const & V( const int j ) const { assert(j>=0 && j<3); + return (CAT< vector_occ,VertexRef >::Instance()->Get((FaceType*)this)).V(j); } + + inline typename T::VertexType * const cV( const int j ) const { assert(j>=0 && j<3); + return (CAT< vector_occ,VertexRef >::Instance()->Get((FaceType*)this)).V(j); } + + // Shortcut per accedere ai punti delle facce + inline typename T::CoordType & P( const int j ) { assert(j>=0 && j<3); return V(j)->P(); } + inline const typename T::CoordType & P( const int j ) const { assert(j>=0 && j<3); return V(j)->cP(); } + inline const typename T::CoordType &cP( const int j ) const { assert(j>=0 && j<3); return V(j)->cP(); } + + /** Return the pointer to the ((j+1)%3)-th vertex of the face. + @param j Index of the face vertex. + */ + inline typename T::VertexType * & V0( const int j ) { return V(j);} + inline typename T::VertexType * & V1( const int j ) { return V((j+1)%3);} + inline typename T::VertexType * & V2( const int j ) { return V((j+2)%3);} + inline const typename T::VertexType * const & V0( const int j ) const { return V(j);} + inline const typename T::VertexType * const & V1( const int j ) const { return V((j+1)%3);} + inline const typename T::VertexType * const & V2( const int j ) const { return V((j+2)%3);} + inline const typename T::VertexType * const & cV0( const int j ) const { return cV(j);} + inline const typename T::VertexType * const & cV1( const int j ) const { return cV((j+1)%3);} + inline const typename T::VertexType * const & cV2( const int j ) const { return cV((j+2)%3);} + + /// Shortcut per accedere ai punti delle facce + inline typename T::CoordType & P0( const int j ) { return V(j)->P();} + inline typename T::CoordType & P1( const int j ) { return V((j+1)%3)->P();} + inline typename T::CoordType & P2( const int j ) { return V((j+2)%3)->P();} + inline const typename T::CoordType & P0( const int j ) const { return V(j)->P();} + inline const typename T::CoordType & P1( const int j ) const { return V((j+1)%3)->P();} + inline const typename T::CoordType & P2( const int j ) const { return V((j+2)%3)->P();} + inline const typename T::CoordType & cP0( const int j ) const { return cV(j)->P();} + inline const typename T::CoordType & cP1( const int j ) const { return cV((j+1)%3)->P();} + inline const typename T::CoordType & cP2( const int j ) const { return cV((j+2)%3)->P();} + + inline typename T::VertexType * & UberV( const int j ) { assert(j>=0 && j<3); return v[j]; } + inline const typename T::VertexType * const & UberV( const int j ) const { assert(j>=0 && j<3); return v[j]; } + static bool HasVertexRef() { return true; } +}; + + + } // end namespace face +}// end namespace vcg +#endif diff --git a/vcg/simplex/vertexplus/component.h b/vcg/simplex/vertexplus/component.h index e3e3ead1..68df9517 100644 --- a/vcg/simplex/vertexplus/component.h +++ b/vcg/simplex/vertexplus/component.h @@ -24,6 +24,10 @@ History $Log: not supported by cvs2svn $ +Revision 1.9 2005/10/14 13:30:07 cignoni +Added constant access functions and reflective functions (HasSomething stuff) +to all the components This is the first really working version... + Revision 1.8 2005/10/07 15:19:54 cignoni minor updates to keep it in line with the rest of the library @@ -52,6 +56,9 @@ First working version! ****************************************************************************/ #ifndef __VCG_VERTEX_PLUS_COMPONENT #define __VCG_VERTEX_PLUS_COMPONENT +#include +#include +#include namespace vcg { namespace vert { diff --git a/vcg/simplex/vertexplus/component_opt.h b/vcg/simplex/vertexplus/component_occ.h similarity index 59% rename from vcg/simplex/vertexplus/component_opt.h rename to vcg/simplex/vertexplus/component_occ.h index e367460a..29aabde9 100644 --- a/vcg/simplex/vertexplus/component_opt.h +++ b/vcg/simplex/vertexplus/component_occ.h @@ -24,22 +24,14 @@ History $Log: not supported by cvs2svn $ -Revision 1.3 2004/03/31 14:16:40 ganovelli -Data structure to handle temporary attributes. First version - -Revision 1.2 2004/03/31 13:15:28 cignoni -Added optional cpmponent - -Revision 1.1 2004/03/31 12:46:53 cignoni -First working version! ****************************************************************************/ -#ifndef __VCG_VERTEX_PLUS_COMPONENT_OPT -#define __VCG_VERTEX_PLUS_COMPONENT_OPT +#ifndef __VCG_VERTEX_PLUS_COMPONENT_OCC +#define __VCG_VERTEX_PLUS_COMPONENT_OCC #include -#include +#include namespace vcg { @@ -52,92 +44,92 @@ All the Components that can be added to a vertex should be defined in the namesp /*------------------------- COORD -----------------------------------------*/ -template class CoordOpt: public T { +template class CoordOcc: public T { public: typedef A CoordType; typedef typename CoordType::ScalarType ScalarType; - CoordType &P() { return CAT< TVector,CoordType>::Get((VertType*)this); } - CoordType &UberP() { return CAT< TVector,CoordType>::Get((VertType*)this); } + CoordType &P() { return CAT< vector_occ,CoordType>::Instance()->Get((VertType*)this); } + CoordType &UberP() { return CAT< vector_occ,CoordType>::Instance()->Get((VertType*)this); } }; -template class Coord3fOpt: public CoordOpt {}; -template class Coord3dOpt: public CoordOpt {}; +template class Coord3fOcc: public CoordOcc {}; +template class Coord3dOcc: public CoordOcc {}; /*-------------------------- NORMAL ----------------------------------------*/ -template class NormalOpt: public T { +template class NormalOcc: public T { public: typedef A NormalType; - NormalType &N() {return CAT< TVector,NormalType>::Get((VertType*)this); } -private: - NormalType _norm; + NormalType &N() {return CAT< vector_occ,NormalType>::Instance()->Get((VertType*)this); } +/*private: + NormalType _norm; */ }; -template class Normal3sOpt: public NormalOpt {}; -template class Normal3fOpt: public NormalOpt {}; -template class Normal3dOpt: public NormalOpt {}; +template class Normal3sOcc: public NormalOcc {}; +template class Normal3fOcc: public NormalOcc {}; +template class Normal3dOcc: public NormalOcc {}; /*-------------------------- TEXTURE ----------------------------------------*/ -template class TextureOpt: public T { +template class TextureOcc: public T { public: typedef A TextureType; - TextureType &T() {return CAT< TVector,TextureType>::Get((VertType*)this); } + TextureType &T() {return CAT< vector_occ,TextureType>::Instance()->Get((VertType*)this); } static bool HasTexture() { return true; } -private: - TextureType _t; +/* private: + TextureType _t; */ }; -template class Texture2sOpt: public TextureOpt, T> {}; -template class Texture2fOpt: public TextureOpt, T> {}; -template class Texture2dOpt: public TextureOpt, T> {}; +template class Texture2sOcc: public TextureOcc, T> {}; +template class Texture2fOcc: public TextureOcc, T> {}; +template class Texture2dOcc: public TextureOcc, T> {}; ///*------------------------- FLAGS -----------------------------------------*/ -template class FlagOpt: public T { +template class FlagOcc: public T { public: - int &Flags() {return CAT< TVector,int>::Get((VertType*)this); } + int &Flags() {return CAT< vector_occ,int>::Instance()->Get((VertType*)this); } const int Flags() const {return _flags; } - +/* private: - int _flags; + int _flags; */ }; ///*-------------------------- COLOR ----------------------------------*/ -template class ColorOpt: public T { +template class ColorOcc: public T { public: typedef A ColorType; - ColorType &C() { return CAT< TVector,ColorType>::Get((VertType*)this); } + ColorType &C() { return CAT< vector_occ,ColorType>::Instance()->Get((VertType*)this); } static bool HasColor() { return true; } -private: - ColorType _color; +/*private: + ColorType _color; */ }; -template class Color4bOpt: public ColorOpt {}; +template class Color4bOcc: public ColorOcc {}; ///*-------------------------- Quality ----------------------------------*/ -template class QualityOpt: public T { +template class QualityOcc: public T { public: typedef A QualityType; - QualityType &Q() { return CAT< TVector,QualityType>::Get((VertType*)this);} + QualityType &Q() { return CAT< vector_occ,QualityType>::Instance()->Get((VertType*)this);} static bool HasQuality() { return true; } -private: - QualityType _quality; +/*private: + QualityType _quality; */ }; -template class QualitysOpt: public QualityOpt {}; -template class QualityfOpt: public QualityOpt {}; -template class QualitydOpt: public QualityOpt {}; +template class QualitysOcc: public QualityOcc {}; +template class QualityfOcc: public QualityOcc {}; +template class QualitydOcc: public QualityOcc {}; // ///*----------------------------- VFADJ ------------------------------*/ -template class VFAdjOpt: public T { +template class VFAdjOcc: public T { public: - typename T::FacePointer &Fp() {return CAT< TVector,T::FacePointer>::Get((VertType*)this); } + typename T::FacePointer &Fp() {return CAT< vector_occ,T::FacePointer>::Instance()->Get((VertType*)this); } int &Zp() {return _zp; } static bool HasVFAdjacency() { return true; } private: