Преобразование NSMutableArray в массив структур C - iPhone - OpenGL ES - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть приложение на основе OpenGL ES, которое анализирует информацию из файла XML с помощью NSXMLParser.Поскольку информация о вершинах поступает для каждого объекта сцены в файле, я сохраняю ее в NSMutableArray следующим образом:

-  (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if (floatArray) {
    if (currentlyParsing == kVerticeInformation) {
     if (currentParserTagType == kGeometry) {

         //NSLog(@"Loaded Vertices %@", string);

         NSArray * nums = [string componentsSeparatedByString:@" "];
         culmunativeCount += [nums count];
         //NSLog(@"Culm Count is %d", culmunativeCount);

         [fullParseString appendString : string];

         if (checkSumCount <= culmunativeCount) {

             //NSLog(@"Full Parse String is %@", fullParseString);
             NSArray * finishedArray = [fullParseString componentsSeparatedByString:@" "];
             //NSLog(@"Finihsed ARray is %d", [finishedArray count]);
             [finishedParsingArray addObjectsFromArray:finishedArray];
             //NSLog(@" FINISHED PARSING = %d", [finishedParsingArray count]);

             NSUInteger baseIndex;

             for (baseIndex=0; baseIndex <[finishedParsingArray count]; baseIndex +=3) {
                 NSString * xPoint = [finishedParsingArray objectAtIndex:baseIndex];
                 NSDecimalNumber * errorCheckX = [NSDecimalNumber decimalNumberWithString:xPoint];
                 float x = [errorCheckX floatValue];

                 NSString * yPoint = [finishedParsingArray objectAtIndex:baseIndex +1];
                 NSDecimalNumber * errorCheckY = [NSDecimalNumber decimalNumberWithString:yPoint];
                 float y = [errorCheckY floatValue];

                 NSString * zPoint = [finishedParsingArray objectAtIndex:baseIndex+2];
                 NSDecimalNumber * errorCheckZ = [NSDecimalNumber decimalNumberWithString:zPoint];
                 float z = [errorCheckZ floatValue];

                 vertex3D = [[Vertex3D alloc]init];
                 vertex3D.value1 = x;
                 vertex3D.value2 = y;
                 vertex3D.value3 = z;

                 [verticesArray addObject:vertex3D];


             //NSLog(@"Vertices stored are %f, %f, %f", x,y,z);

         }

             currentlyParsing = kNilSetting;
             checkSumCount = 0;
             [finishedParsingArray removeAllObjects];

             //Set object to adds vertice array to verticesArray;
             vertex3D = nil;
             objectToAdd.Vertices = verticesArray;
             [verticesArray removeAllObjects];

             //[finishedArray release];
             culmunativeCount = 0;
             [fullParseString setString:@""];

         }
     }
    }
         }

Vertex3D - это пользовательский класс для хранения точек x, y, z:

#import <Foundation/Foundation.h>

@interface Vertex3D : NSObject

{
float value1;
float value2;
float value3;
}

@property (assign) float value1;
@property (assign) float value2;
@property (assign) float value3;


@end

Затем я передаю этот массив в класс SceneObject, который создается для каждого объекта в файле.Идея заключается в том, чтобы использовать эти объекты SceneObject для подачи движка OpenGL ES.Я использую glDrawElements, так как XML-файл использует индексы.

Проблема в том, что я не могу передать массив NSMutable в вызовы OpenGL ES (например, glVertexPointer).

Из примера, которому я следовал в http://www.everita.com/lightwave-collada-and-opengles-on-the-iphone,, похоже, мне нужно структурировать данные вершин следующим образом, чтобы использовать индексы:

const Vertex3D tigerBottomPositions[] = {
{0.176567, 0.143711, 0.264963},
{0.176567, 0.137939, 0.177312},
{0.198811, 0.135518, 0.179324},
…
};

Это гдеЯ немного запутался - я думаю, что это массив структур C, который содержит 3 объекта Vertex3D, каждый из которых содержит три числа с плавающей точкой.правильный формат для использования с OpenGL ES?Я также был бы признателен за помощь в настройке этой структуры C в коде, поскольку мои знания C не так сильны, как мой объект c.

Заранее спасибо!

1 Ответ

1 голос
/ 17 февраля 2012

Вам нужен динамический массив ... учитывая структуру C Vertex3D (не класс Objective-C):

NSArray *arr = ...;
const size_t count = [arr count];
Vertex3D *positions = (Vertex3D*)calloc(count, sizeof(Vertex3D));

for (size_t i=0; i<count; ++i) {
    positions[i].x = ...;
    // ... 
}

// ... use positions

free(positions); // clean up
...