2016-01-04 183 views
-1

我正在写一个小型玩具游戏引擎,使用Tinyobjloader来加载.obj文件。我存储顶点数据和所有使用glm :: vecX来使事情更容易。std :: vector <float> to std :: vector <glm::vecX>没有复制

Tinyobjloader给我一个std::vector<float>,当我想要一个std::vector<glm::vecX>。我怎么做,而不复制?

要清楚,glm::vecX是一个简单的结构,其中包含例如float成员x, y, z

我在想,因为结构可以表现得像数组一样,std::move会工作,但没有运气。

谢谢!

编辑: 我知道我对此并不清楚,对不起。我想要将std::vector<float>转换为std::vector<glm::vecX>或将其作为std::vector<glm::vecX>&传递。

使用std::memcpy复制数据可以正常工作,但它复制了我希望避免的数据。

+1

你必须创建自己的函数来实现这一(它的成本你1) –

+0

是什么glm :: vecX'的定义? –

+1

成员'x','y'和'z'的类型是什么?相应的“float”值应该是多少? –

回答

1

可能的是,直接将向量的内容解释为结构的实例,而不必复制数据。如果你能保证表示是兼容的,那就是。在存储器中的vector<float>的内容被布置为没有多余的填充直接彼此跟随(数组)浮点值的序列,而vector<glm::vecX>的内容被布置为vecX的序列。因此,您需要确保以下条件成立:

  • glm::vecX正好是X浮点数的大小,没有填充。根据结构的声明,这可能与平台有关。
  • vector<float>的内容是正确的顺序,即作为[X1,Y1,Z1,X2,Y2,Z2,...]用于VEC3代替[X1,X2,...,XN, Y1,Y2 ...]。

在这种情况下,可以将浮子矢量作为指针的数据指针安全地重新解释到vecX数组作为在这个例子中:

std::vector<float> myObjData = ...; 
auto nVecs = myObjData.size()/3; // You should check that there are no remainders! 
glm::vec3* vecs = reinterpret_cast<glm::vec3*>(myObjData.data()); 
std::cout << vecs[0]; // Use vecs[0..nVecs-1] 

可以没有,但是,安全地重新解释矢量本身GLM的矢量:: vecX,甚至还不如一个const矢量,因为存储在向量元素的数量可能不是重新解释后一致。这取决于vector<T>代码是否存储元件的直接数,或分配的字节数(),然后大小(除以通过的sizeof(T)):

// Don't do this, the result of .size() and .end() may be wrong! 
const std::vector<glm::vec3>& bad = *reinterpret_cast<std::vector<glm::vec3>*>(&myObjData); 
bad[bad.size()-1].z = 0; // Potential BOOM! 

大多数时间,但是,你不需要通过实际的矢量,因为标准库中的大多数函数接受容器范围,这很容易给出像第一个示例中那样的数组。所以,如果你想基于z位置的VEC3数组进行排序,然后打印出来,你会怎么做:

// nVecs and vecs from the first example 
std::sort(vecs, vecs+nVecs, // Sort by Z position 
    [](const glm::vec3& a, const glm::vec3& b) { return a.z < b.z; }); 
std::copy(vecs, vecs+nVecs, std::ostream_iterator<glm::vec3>(std::cout, "\n")); 
+0

Oooo,看中!由于'glm :: vecX'应该是无填充的(这是glm的要点)。当然,如你所说,这可能是依赖于平台的,所以我会在使用它之前检查它。 [检查出来](http://stackoverflow.com/questions/13571898/c-opengl-glm-and-struct-padding)和[this](http://stackoverflow.com/questions/33058927/how-does -opengl-fill-buffers-and-read-them-back)以获取更多信息。 – fordcars

0

总之:这是 - 据我所知 - 不可能不抄袭。

,在我看来,std::memcpy没有业务正在与std::vector使用。

+0

是的,你可能是对的。 – fordcars

相关问题