2013-06-22 2 views
-1

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

typedef struct 
{ 
    float *x, *y, *z; 
} point; 

Я тогда таНосом массива этого же размера как мой массив частиц.

Декларация на вершине:

point *points; 

Malloc:

points = malloc(sizeof(point) * [particles count]); 

Я тогда Переберите все частицы и копировать адреса каждой позиции к соответствующему указателю так:

for (int i = 0; i < [particles count]; ++i) 
{ 
    points[i].x = &[[particles objectAtIndex:i] getPosition].x; 
    points[i].y = &[[particles objectAtIndex:i] getPosition].y; 
    points[i].z = &[[particles objectAtIndex:i] getPosition].z; 
} 

Моя функция определения позиции возвращает векторную структуру (float x, y, z).

Первая проблема я столкнулась с этим состоит в том, что, когда я отображение значений следующим образом:

NSLog(@"%f", *points[0].x); 

Вместо чтения значения (например: 0,5), он отображает ее округлую и сведена на нет (так что: - 1.0).

я тогда получить данные в моей VBO так:

glBufferData(GL_ARRAY_BUFFER, sizeof(point) * [particles count], &points[0], GL_DYNAMIC_DRAW); 

Я думаю, что это тоже неправильно, но не можете найти какую-либо информацию о том, как передавать указатели на РВО.

ответ

0

Что вы делаете неправильно, потому что в C все передается по значению, поэтому, когда вы разыскиваете члена возвращаемой структуры .x, вы делаете это на копии позиции struct, которая будет выталкиваться из стека, если не назначено ни одному значению.

Вы дизайн так, что вам не нужно на структуру, как это:

typedef struct 
{ 
    float *x, *y, *z; 
} point; 

Скорее один, как это:

typedef struct 
{ 
    float x,y,z; 
} 

Если вы все еще хотите, чтобы назначить его на это первоначальное значение, так что, если значения исходной структуры изменяются, также эта структура изменяется, тогда вам нужен геттер, который вернет указатель на структуру и удерживает указатель на него:

points[i] = [[particles objectAtIndex:i] getPositionPointer]; 

Таким образом, вы уверены, что ваша структура содержит те же значения исходной структуры, но вы нарушаете инкапсуляцию. Это заставляет меня думать, что, возможно, вам действительно не нужно удерживать указатель на оригинальную структуру, но если есть причина, то я показал вам путь.

+0

GetPosition возвращает структуру значений не указателей, я сохраняю позиции каждой частицы в ее классе. – user22817

+0

Хорошо, я отредактировал ответ, рассматривая это. Не забудьте понять, как работает пропуск по значению на C, это важный факт. –

+0

Как это тогда, когда я создаю простой автономный указатель на значение класса, что, если я изменю значение классов, это также изменится? – user22817

Смежные вопросы