我需要实现一个根据属性存储顶点的结构。例如,每个顶点都有一个属性,如"Normals“或"Position”"Colors“等,并且可以通过它们的名称访问它们。
VertexStructure vstruct;
AttribStream posStream = vstruct.CreateNewAttributeStream("Position",Vec3<double>);
posStream.push_back(Vec3<double>(23.5,12.5,11.3));
AttribStream normalStream = vstruct.CreateNewAttributeStream("Normals",Vec3<double>);
normalStream.push_back(Vec3<double>(0.03,0.02,0.18));
AttribStream indexStream = vstruct.CreateNewAttribStream("Indices",int);
indexStream.push_back(23);
std::cout << indexStream.size() << "," << normalStream.size() << posStream.size() << std::endl;现在我能做的一个简单的方法就是用预定义的数据类型创建一个枚举,比如OpenGL是如何做到的。比如:
enum {
DOUBLE = 0,
FLOAT,
INT,
};
AttribStream posStream = vstruct.CreateNewAttributeStream("Position",DOUBLE,3);
posStream.push_back_vec3d(23.5,12.5,11.3);但是,它非常冗长,我必须为每一种可能的数据类型创建一个枚举,并为每种数据类型设置单独的函数,以推动新元素的返回。
另一种可能的方法是使用抽象类。但即使这样也不能保证类型安全(除非使用RTTI),而且涉及到铸造,而且也很难抽象出来。另外,没有办法创建一个通用的'push_back',所以我需要为每个类型创建专门的函数。
class PX_STREAMBase
{
public:
template <typename T>
PX_STREAMBase( T val) : value_type(typeid(T)),
value_size(sizeof(val))
{};
virtual size_t bytes() const = 0;
virtual size_t size() const = 0;
virtual const void* data() const = 0;
const std::type_info& value_type;
const std::size_t value_size;
private:
};
template<typename T, template <typename, typename> class Container = std::vector> class PX_STREAM;
template<typename T, template <typename, typename> class Container>
class PX_STREAM : public PX_STREAMBase {
public:
PX_STREAM() :
PX_STREAMBase( T())
{}
size_t bytes() const {
return vec.size() * value_size;
}
size_t size() const {
return vec.size();
}
const void* data() const {
return vec.data();
}
private:
Container<T, std::allocator<T> > vec;
};最后,使用char数组结构作为described in this question,那么,创建一个抽象向量并可以保存任何类型的属性流的结构最好的方法是什么?
发布于 2014-01-27 23:04:56
好的,这看起来就像你试图创建一个结构来存储一个3D模型的数据。顶点坐标和法线。老实说,我觉得你只是想让它变得花哨。一个带有一对vec3<double>s来存储位置和法线的结构(实际上,如果您想在openGL中使用它们,它们应该是浮动的,因为大多数显卡对双精度浮点数的支持非常糟糕),然后不管您的系统为其模型存储了什么其他数据。您使用此结构的向量,它将任意给定顶点的所有信息保存在一起。
如果你真的需要把所有的数据分开,我还没有看到一个有这样的需求的系统,但是我的经验仍然比我想要的要有限,然后创建一个结构或类,这个结构或类有很多向量,每个向量都包含一个vec3或者那个特定结构所需要的任何数据类型。大多数系统都知道他们将为他们的模型寻找什么样的数据,所以静态地实现这些结构不应该是个问题。对于最终的顶点数据,您只需创建一个结构,该结构包含构成特定顶点的独立组件的许多索引。
是否有这样一个简单得多的系统的原因:
class Model
{
private:
//These vectors serve just to hold all of the data for all of your vertices
vector<vec3<float> > positions;
vector<vec3<float> > normals;
vector<vec3<float> > colors;
//This struct holds indices to the vectors above
struct Vertex
{
int position;
int normal;
int color;
};
//Holds a list of all of your vertices, but allows you to pair different positions with different normals, etc...
vector<Vertex> vertices;
//Holds a list of indices from vertices that are your points to draw.
vector<int> drawPoints;
public:
//constructor, destructor, and accessors to add elements to your various elements.
};不管用吗?
https://stackoverflow.com/questions/21393164
复制相似问题