用于存储顶点属性的数据结构

时间:2014-01-27 22:36:51

标签: c++ opengl data-structures stl

我需要实现一个按属性存储顶点的结构。例如,每个顶点都有一个属性,如“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 那么,创建一个抽象向量的结构并保存任何类型的属性流的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

好的,所以这看起来像是在尝试创建一个结构来存储3D模型的数据。顶点坐标和法线。老实说,我认为你只是想让它变得有趣。一个带有vec3<double>对的结构,用于存储位置和法线(实际上,如果你想在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.
};

无效?