Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.
Jeśli piszemy funkcję, która ma przejść po kolejnych wektorach, to najprościej wydaje się przekazać po prostu tablicę wektorów:
void DoSth(const vec3 Arr[], size_t ArrLen)
{
for (size_t i = 0; i < ArrLen; i++)
DoSthWithVec(Arr[i]);
}
Istnieje pewien genialny pomysł, który uczyni tą funkcję bardziej elastyczną. Polega na przekazaniu jej Stride - kroku, mówiącego o ile bajtów trzeba przesuwać wskaźnik:
void DoSth(const void *Data, size_t ArrLen, int Stride)
{
const char *Bytes = (const char*)Data;
for (size_t i = 0; i < ArrLen; i++)
{
DoSthWithVec( *(const vec3*)Bytes );
Bytes += Stride;
}
}
To pozwala m.in.:
Przechodzić zwykłą tablicę jak wyżej - jako Data trzeba podać adres pierwszego elementu, jako Stride trzeba podać sizeof(vec3).
Przechodzić tablicę od końca - jako Data trzeba podać adres ostatniego elementu, jako Stride trzeba podać -sizeof(vec3).
Odwiedzić tylko co któryś element, na przykład wybraną kolumnę macierzy - jako Data trzeba podać adres pierwszego takiego elementu, jako Stride rozmiar całego wiersza w bajtach.
Przetworzyć tablicę, której elementy zamiast pojedynczego wektora zawierają też inne dane (np. są wierzchołkami posiadającymi pozycję, normalną, współrzędne tekstury) - jako Data trzeba podać adres pola z pozycją w pierwszym wierzchołku, jako Stride rozmiar całej struktury wierzchołka.
To jeden z tych drobnych algorytmów, których niestety nikt nigdzie nie naucza. Każdy musi je gdzieś wypatrzeć przy okazji (albo samemu wymyślić, jeśli ma do tego łeb :)