CVertexO数据结构
容器
vcg::vertex::vector_ocf<CVertexO>
template <class VALUE_TYPE>
class vector_ocf: public std::vector<VALUE_TYPE>
继承自std::vector,内部定义了一些vector用来存放相关联的数据,比如颜色等
CVertexO
class CVertexO : public vcg::Vertex< CUsedTypesO,
vcg::vertex::InfoOcf, /* 4b */
vcg::vertex::Coord3f, /* 12b */
vcg::vertex::BitFlags, /* 4b */
vcg::vertex::Normal3f, /* 12b */
vcg::vertex::Qualityf, /* 4b */
vcg::vertex::Color4b, /* 4b */
vcg::vertex::VFAdjOcf, /* 0b */
vcg::vertex::MarkOcf, /* 0b */
vcg::vertex::TexCoordfOcf, /* 0b */
vcg::vertex::CurvaturefOcf, /* 0b */
vcg::vertex::CurvatureDirfOcf, /* 0b */
vcg::vertex::RadiusfOcf /* 0b */
>{
};
继承自vcg::Vertex,继承关系大致如下
令T=EmptyCore<CUsedTypesO>
Vertex<T,A,B,C,D,E,F,G,H,I,J,K,L>
VertexArityMax<T, A, B, C, D, E, F, G, H, I, J, K, L>
//以下忽略Arity
RadiusfOcf<Arity11<T, A, B, C, D, E, F, G, H, I, J, K>>
CurvatureDirfOcf<Arity10<T, A, B, C, D, E, F, G, H, I, J>>
CurvaturefOcf<Arity9<T, A, B, C, D, E, F, G, H, I>>
TexCoordfOcf<Arity8<T, A, B, C, D, E, F, G, H>>
MarkOcf<Arity7<T, A, B, C, D, E, F, G>>
VFAdjOcf<Arity6<T, A, B, C, D, E, F>>
Color4b<Arity5<T, A, B, C, D, E>>
Qualityf<Arity4<T, A, B, C, D>>
Normal3f<Arity3<T, A, B, C>>
BitFlags<Arity2<T, A, B>>
Coord3f<Arity1<T, A>>
InfoOcf<T>
EmptyCore<CUsedTypesO>
CUsedTypesO
CUsedTypesO定义如下:
class CUsedTypesO: public vcg::UsedTypes < vcg::Use<CVertexO>::AsVertexType,
vcg::Use<CEdgeO >::AsEdgeType,
vcg::Use<CFaceO >::AsFaceType >{};
主要是定义了各种数据相关的类型,之前有简单分析过UsedTypes,这里不再展开。
简单的说就是CUsedTypesO通过typedef定义了一些数据相关的类型。
接着是EmptyCore
template <class TT> class EmptyCore: public TT
与名字相对的,该类主要定义了基本的方法(接口),没什么实质性的实现。
InfoOcf
template < class T> class InfoOcf: public T
定义了容器相关的一些方法
inline InfoOcf &operator=(const InfoOcf & /*other*/)
vector_ocf<typename T::VertexType> &Base()
inline int Index() const
Coord3f
template <class T> class Coord3f: public Coord<vcg::Point3f, T>
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Coord3f"));T::Name(name);}
将类名放入容器,并调用基类的Name函数
template <class A, class T> class Coord: public T
template < class RightValueType>
实现了
ImportData
HasCoord
Name
该类主要是封装坐标点的信息 CoordType _coord;
定义float为ScalarType,Point3f为CoordType
BitFlags
template <class T> class BitFlags: public T
实现了
ImportData
HasFlags
Name
封装了标记值 int _flags;
Normal3f
template <class T> class Normal3f: public Normal<vcg::Point3f, T>
实现了
Name
template <class Point3f, class T> class Normal: public T
定义:
typedef Point3f NormalType;
封装:
NormalType _norm
实现:
ImportData
HasNormal
Name
Qualityf
template <class TT> class Qualityf: public Quality<float, TT>
实现:
Name
template <class float, class TT> class Quality: public TT
定义:
typedef float QualityType;
封装:
QualityType _quality
实现:
ImportData
HasQuality
Name
Color4b
template <class TT> class Color4b: public Color<vcg::Color4b, TT>
实现:
Name
定义:
typedef A ColorType;
封装:
ColorType _color;
实现
ImportData
HasColor
Name
VFAdjOcf
template <class T> class VFAdjOcf: public T
封装点面关系的一些函数
其中VFAdjType是存在vector_ocf之中的std::vector<struct VFAdjType> AV;
MarkOcf
template <class T> class MarkOcf: public T
封装对标记位的一些操作
操作对象存在vector_ocf之中的std::vector<int> MV;
TexCoordfOcf
template <class T> class TexCoordfOcf
实现Name
TexCoordOcf<TexCoord2<float,1>, T>
定义:
typedef TexCoord2<float,1> TexCoordType;
操作对象存在vector_ocf之中的std::vector<TexCoord2<float,1>> TV;
CurvaturefOcf
template <class T> class CurvaturefOcf: public CurvatureOcf<float, T>
实现Name
CurvatureOcf<float, T>
定义:
typedef Point2<float> CurvatureType;
typedef float ScalarTypeCur;
实现了对于Curvature的一些方法
操作对象在vector_ocf之中的std::vector<Point2<float>> CuV;
CurvatureDirfOcf
template <class T> class CurvatureDirfOcf: public CurvatureDirOcf<CurvatureDirTypeOcf<float>, T>
CurvatureDirOcf<CurvatureDirTypeOcf<float>, T>
定义:
typedef CurvatureDirTypeOcf<float> CurvatureDirType;
typedef CurvatureDirTypeOcf<float>::CurVecType CurVecType;
typedef CurvatureDirTypeOcf<float>::CurScalarType CurScalarType;
操作对象在vector_ocf之中的std::vector<CurvatureDirTypeOcf<float>> CuDV;
CurvatureDirTypeOcf为一个结构体,这里不再展开
RadiusfOcf
template <class T> class RadiusfOcf: public RadiusOcf<float, T> {}
template <class A, class TT> class RadiusOcf: public TT
定义:
typedef float RadiusType;
操作对象vector_ocf之中的std::vector<float > RadiusV;
总结
1.容器信息类
InfoOcf类实现了两个很重要的函数:
Index() //返回当前对象在容器中的序号
Base() //返回容器本身的指针 vector_ocf *
之后所有的xxxocf类都会用到这两个函数
2.带有ocf后缀的类
这些类与容器相关,处infoocf之外,其它的带有ocf后缀的类一方面定义了某一信息的类型,另一方面实现了对于这些信息的一些方法,然而信息本身是存储在vector_ocf之中的
3.所有的类都会覆盖积累的对于该类操作的信息的开关函数(比如HasColor),以及ImportData函数
4.没有ocf后缀的类,基本上都是自己内部维护了数据,比如Coord3f内部有vcg::Point3f来保存颜色信息