2014-01-23 5 views
0

Я делаю класс и одно из значений, которое у него есть, это все вершины, из которых он состоит (его трехмерная программа). Я хочу иметь массив по умолчанию вершин, а также (Поскольку вершины достаточно большие, чтобы войти), и, как я хочу, чтобы сделать это, чтобы определить массив вершин:Различные операции с массивами

Entity::vertices[] = { 
     { -0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }, 
     { 0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }, 
     { 0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }, 
     { 0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }, 
     { -0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }, 
     { -0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } } 
    }; 

, а затем в конструкторе класса проверьте, были ли введены пользовательские вершины и, если это так, сделайте массив вершин введенным массивом.

Есть ли функция копирования? Если нет, то как очистить массив (очистил бы существующие вершины по умолчанию, потому что если введенные вершины меньше, чем по умолчанию, у меня будут дополнительные вершины, которые были бы плохими для рендеринга) ?

+1

Есть что-то не так с std :: vector? – derpface

+0

@uberwulu Он не содержит данные о цвете (если это не так?), Который является важным при рендеринге. –

+1

std :: векторы шаблоны. Они могут удерживать любую структуру вершин, которую вы создаете, независимо от того, содержат ли ваши данные цветные данные или нет. Он также имеет функцию clear(). – derpface

ответ

3

Я не на 100% уверен, какие данные вы пытаетесь сохранить в своем массиве, но вот упрощенный пример того, как я храню данные вершин в играх, которые я сделал.

struct Vertex 
{ 
    vec3 pos; 
    vec3 nrm; 
    vec2 uvs; // Can replace this with D3DCOLOR for example if you want colors instead of texture samples. 
}; 

Чтобы сохранить их в станд :: вектор, создать вектор:

std::vector<Vertex> myVerts; 

Чтобы добавить Verts к вектору:

Vertex vert; 
myVerts.push_back(vert); 

Для очистки вектора:

myVerts.clear(); 

Чтобы скопировать из массива объекта Vertex s к вектору (присвоить вектор в массив):

// assuming: Vertex otherVerts[] = { ... }; 
myVerts.assign(otherVerts,otherVerts+otherSize); 

Если вы просто хотите добавить множество новых Verts к существующему вектору:

// assuming: Vertex otherVerts[] = { ... }; 
myVerts.insert(myVerts.end(),otherVerts,otherVerts+size); 

Чтобы скопировать из другого вектора Verts в этот (присвоение этого друг к другу):

// assuming: std::vector<Vertex> otherVerts(...); 
myVerts = otherVerts; 

чтобы добавить еще один вектор Verts к этому:

// assuming: std::vector<Vertex> otherVerts(...); 
myVerts.insert(myVerts.end(),otherVerts.begin(),otherVerts.end()); 

Если вы абсолютно настаиваете на том, чтобы использовать свои собственные массивы вместо того, что доступно в STL, вам в конечном итоге нужно будет имитировать эти же функции в вашем собственном классе динамических массивов. Если вашему массиву не нужно быть динамическим (это фиксированный размер, который известен во время компиляции), вам необязательно инкапсулировать функциональность внутри класса (хотя это можно сделать с помощью std :: array), но все же проще использовать настраиваемую структуру Vertex с настраиваемыми конструкторами, чем вручную писать каждый элемент в виде длинной и сложной для чтения серии поплавков.

+0

Я понятия не имел, что это можно сделать так. благодаря –