Обмен информацией о структуре между классами - Цель C - OpenGL ES - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть приложение на основе OpenGL ES со следующей структурой:

  • Я анализирую вершины из файла DAE, который содержит несколько объектов (используя NSXMLParser).
  • Как яанализируя каждый набор вершин, я создаю объект (sceneObject) и устанавливаю массив вершин в этом объекте, чтобы он соответствовал проанализированным вершинам.Затем я планирую добавить эти sceneObjects в массив объектов, которые будут отображаться OpenGL ES.

Изначально я использовал подход NSArrays для хранения данных вершин, однако я понимаю, что команды OpenGL(например, glvertexpointer) не принимают значения NSObject, вместо этого bue нужны необработанные значения (glfloats, gluints и т. д.).

Вместо того, чтобы преобразовывать NSObjects обратно в необработанные значения GL в классе объектов, я сейчас пытаюсь принятьструктурный подход.Это код, в котором я анализирую информацию о вершинах:

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 vertexItem = {x,y,z}

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

         }

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

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

         }
     }
    }
         }

Как вы можете видеть, я теперь каждый раз создаю C-структуру Vertex3D с проанализированной информацией о вершинах.

Мои вопросы:

  • Как мне затем создать массив этих отдельных структур C Vertex3D?
  • Как я могу затем передать этот массив структур в мой sceneObject?

1 Ответ

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

Создайте класс оболочки Objective C для вашего массива. Он может содержать несколько массивов (например, вершины, нормали и касательные). Вы заранее знаете размер массива, так что вы можете предварительно выделить необходимый объем пространства:

@interface MYVertexArray : NSObject {
   float* _mVerts;
   float* _mNormals;
   int _mCount;
}

@property(nonatomic, readonly) float* verts;
@property(nonatomic, readonly) float* norms;

/**
Here you're allocating your arrays (don't forget to free them is dealloc).
*/
-(id) initWithSize:(int) size;

@end

и затем в цикле, вы просто делаете это:

    MYVertexArray* my_vertex_data = [[MYVertexArray alloc] initWithSize: [finishedParsingArray count]];

    for(int i=0; i<[finishedParsingArray count]; ++i) {
        my_vertex_data.verts[i] = [[finishedParsingArray objectAtIndex: i] floatValue];
    }
...