CMeshO数据结构2

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来保存颜色信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值