将NSMutableArray复制到GLES渲染的浮点数组中

时间:2012-02-14 23:05:21

标签: objective-c ios opengl-es

我有一个名为mVerticies的 NSMutableArray 存储为我的类的成员,我想将它们放入一个float数组中,用 glVertexAttribPointer 绘制它们。

通常在绘图时,我会有类似的东西:

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

// ... prepare to draw

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

// ... draw

但是为了使用 glVertexAttribPointer 函数,我需要一个float []。 verticies存储为 NSMutableArray ,因为它们经常更改。有没有一种简单的方法可以将动态float []存储为成员,或者将 NSMutableArray 快速转换为float []?

3 个答案:

答案 0 :(得分:8)

假设值存储为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);

答案 1 :(得分:2)

如果您只是希望原始块内存直接读取和写入值,则需要使用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指针没有保留计数,因此您需要自己释放它,并跟踪何时可以释放它,因为当您免费调用时它将是马上就走了。

答案 2 :(得分:0)

只需遍历值。假设您的浮动存储为NSNumbers:

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