2012-02-16 10 views
0

私は、次のような構造を持つのOpenGL ESベースのアプリを持っている:私は(NSXMLParserを使用して)オブジェクトの数が含まれているDAEファイルから頂点を解析共有構造体の情報のOpenGL ES

  • を。
  • 各頂点のセットを解析するときに、オブジェクト(sceneObject)を作成し、このオブジェクトの頂点配列を解析された頂点と一致するように設定します。次に、これらのsceneObjectを、OpenGL ESによってレンダリングされるオブジェクトの配列に追加することを計画しています。

当初、私はBUEではなく生の値(glfloatsとgluintsなど)を必要とする、しかし、私は(例えばglvertexpointerなど)のOpenGLのコマンドはNSObjectの値を受け入れないことを理解し、頂点データを格納するNSArraysを使用してのアプローチを取っていました。

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構造体を毎回作成しています、見ることができるように。

私の質問は以下のとおりです。

  • どのように私は、これらの個々のC Vertex3Dの構造体の配列を作成しますか?
  • この構造体の配列を私のsceneObjectに渡すにはどうしたらいいですか?
+0

単純ではなく、非常によくソリューションを使用すると、スペースの必要量を事前に割り当てることができますので、あなたは、事前に配列のサイズを知っています! 構造体をパラメータとしてNSObjectをサブクラス化し、オブジェクトの配列を作成します。そして、受信機クラスの構造体の配列を作成してください – SAKrisT

+0

これが役立つかどうかわかりません - あなたは構造体にnsobjectsを追加できませんか? – GuybrushThreepwood

答えて

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をフィードすることはできません。私は思ったスタウトで作業する必要がありますか? – GuybrushThreepwood

+0

NSArrayはありません。明白なCとObjCの砂糖だけ。 – Max

+0

右 - しかし、my_vertex_dataはまだNSObjectの権利ですか?私は{1,2,3} {4,5,6} {6,7,8}の形式のc構造体で終わるようにしています。これは、glDrawElementsがインデックスで動作する必要があるためです。 – GuybrushThreepwood

関連する問題