2012-02-16 36 views
0

我有具有以下結構的一個OpenGL ES基於應用程式:共享STRUCT類之間信息 - 目標C - 的OpenGL ES

  • 我解析從包含多個對象(使用的NSXMLParser)的DAE文件頂點。
  • 當我解析每一組頂點時,我創建一個對象(sceneObject),並在此對象中設置頂點數組以匹配解析的頂點。然後,我打算將這些sceneObjects添加到OpenGL ES呈現的對象數組中。

起初,我採取了使用NSArrays存儲頂點數據的方法,但是據我所知,OpenGL命令(如glvertexpointer)不接受NSObject的值,積屑瘤,而不是需要原始值(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:@""]; 

     } 
    } 
    } 
     } 

正如你所看到的,我現在用的解析頂點信息每次創建一個Vertex3D C結構。

我的問題是:

  • 我怎麼會那麼創建這些個人ÇVertex3D結構的數組?
  • 我該如何將這個結構數組傳遞給我的sceneObject?
+0

簡單,但沒有很好的解決方案! 以您的結構作爲參數並創建對象數組的子類NSObject。然後在接收器類中創建結構數組 – SAKrisT 2012-02-16 11:10:55

+0

不知道這有助於 - 你不能添加nsobjects到c結構? – GuybrushThreepwood 2012-02-16 12:15:55

回答

0

爲您的數組創建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]; 
    } 
+0

這仍然不能解決問題 - 你不能用nsarray提供OpenGL。我需要與我認爲的stucts合作? – GuybrushThreepwood 2012-02-16 12:59:44

+0

這裏沒有NSArray。只有普通的C和一些ObjC糖。 – Max 2012-02-16 14:57:43

+0

正確 - 但my_vertex_data仍然是一個NSObject嗎?我試圖以{1,2,3} {4,5,6} {6,7,8}格式結束,因爲這是glDrawElements需要與索引一起使用的格式。 – GuybrushThreepwood 2012-02-16 15:56:02