Скопируйте NSMutableArray в массив с плавающей точкой для рендеринга GLES - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть NSMutableArray , называемый mVerticies, который хранится как член моего класса, и я хотел бы поместить их в массив с плавающей точкой, чтобы нарисовать их с помощью glVertexAttribPointer .

Обычно при рисовании я бы что-то вроде:

float verticies[] = {-1, -1, 1, -1};

// ... prepare to draw

glVertexAttribPointer(GLKVertexAttribPosition,
    2, GL_FLOAT, GL_FALSE, 0, verticies);

// ... draw

Но чтобы использовать функцию glVertexAttribPointer , мне нужен float []. Вершины хранятся как NSMutableArray , потому что они изменяются довольно часто. Есть ли простой способ сохранить динамический float [] в качестве члена или быстро преобразовать NSMutableArray в float []?

Ответы [ 3 ]

8 голосов
/ 15 февраля 2012

Предполагая, что значения хранятся как NSNumbers, вы можете сделать что-то вроде этого:

float *floatsArray = malloc([numbersArray count] * sizeof(float));
if (floatsArray == NULL) {
    // handle error
}
[numbersArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *number, NSUInteger idx, BOOL *stop) {
    floatsArray[idx] = [number floatValue];
}];

// use floatsArray

free(floatsArray);
2 голосов
/ 15 февраля 2012

Вам нужно использовать malloc, если вы просто хотите, чтобы необработанная чанка памяти непосредственно считывала и записывала значения.

Если у вас есть NSArray array, содержащий экземпляры NSNumber:

float *vertices = malloc(sizeof(float) * [array count]);
for (int i = 0; i < [array count]; i++) {
    vertices[i] = [[array objectAtIndex:i] floatValue];
}

// draw cool 3D objects and stuff
glVertexAttribPointer(....)

// then, when you're totally done with the memory
free(vertices);

В отличие от объектов Objective-C, указатель vertices не имеет счетчика хранения, поэтому вам нужно освободить его самостоятельно и отслеживать, когда вы можете освободить его, потому что при вызове free он сразу исчезнет .

0 голосов
/ 15 февраля 2012

Просто переберите значения.Предполагая, что ваши поплавки хранятся как NSNumbers:

NSUInteger count = [mutableVerticesArray count];
float vertices[count];
for (NSUInteger i = 0; i < count; i++) {
    vertices[i] = [[mutableVerticesArray objectAtIndex:i] floatValue];
}
// Drawing etc.
...