2012-02-16 70 views
0

我有一个基于OpenGL ES的应用程序,它使用NSXMLParser解析xml文件中的信息。由于顶点信息都在该文件中的每个场景的对象,我在一个NSMutableArray如下保存它:将NSMutableArray转换为C结构数组 - iPhone - OpenGL ES

- (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}, 
… 
}; 

这是我有点困惑 - 我想这是一个包含3个Vertex3D对象的C结构数组,每个对象包含三个浮点数。

任何人都可以告诉我如何可以将我的NSMutableArray转换为正确格式的C结构以用于OpenGL ES?我也很感谢如何在代码中设置这个C结构的帮助,因为我的C知识不如我的对象那么强大。

预先感谢您!

+0

** ** Vertex3D您在使用**常量Vertex3D tigerBottomPositions [] **能与您定义的类** Vertex3D **不一样。 – sch 2012-02-16 21:10:28

回答

1

你需要一个动态数组...给出一个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 
+0

格奥尔格 - 谢谢 - 但我很困惑,我会把这段代码 - 我是对的,我需要在我的SceneObject类中创建一个单独的方法?另外,我怎样才能从其他课程中引用职位 - 我似乎不能在头文件中声明职位。 – GuybrushThreepwood 2012-02-16 21:12:07

+0

@Ohn:这取决于你在哪里以及如何使用它。如果您只想使用这些数据一次,则可以将其转换为您需要的数据。如果你想多次使用它,你可以在解析并存储它以备后用。 – 2012-02-16 21:14:53

+0

非常感谢 - 我将如何存储职位,以便其他职员都能看到职位? – GuybrushThreepwood 2012-02-16 21:16:22