2012-02-16 4 views
0

NSXMLParserを使用してxmlファイルの情報を解析するOpenGL ESベースのアプリケーションがあります。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 
を頂点情報は、ファイル内の各シーンのオブジェクトのために来ると、以下のように、私はNSMutableArrayの中でそれを保存しています

私がしているのは、この配列をファイル内のすべてのオブジェクトに対してインスタンス化されたSceneObjectクラスに渡すことです。この考え方は、これらのSceneObjectオブジェクトをOpenGL ESエンジンに供給することです。私はインデックスを使用するxmlファイルとしてglDrawElementsを使用しています。

問題は、OpenGL ES呼び出し(glVertexPointerなど)にNSMutable配列を渡すことができないことです。私は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構造体の配列で、それぞれ3つの浮動小数点数を含みます。

NSMutableArrayをOpenGL ESで使用するための正しい形式のC構造体に変換する方法については、誰でも助言できますか?私はCの知識が私のobj cほど強くないので、コードでこのC構造体をセットアップする方法についても助けていただきたいと思います。

ありがとうございます!

+0

** Vertex3D **あなたは** constのVertex3D tigerBottomPositions [] **缶を使用中あなたが定義したクラス** Vertex3D **と同じではありません。 – sch

答えて

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

Georg - ありがとう - しかし、私はこのコードをどこに置くのか混乱しています - 私は自分のSceneObjectクラスに別のメソッドを作成する必要があるでしょうか?また、私はどのようにクラスの残りの部分から位置を参照することができます - 私は 'ヘッダーファイル内の位置を宣言することはできないようです。 – GuybrushThreepwood

+0

@Ohn:それはどこでどのように使いたいかによって決まります。データを一度しか使用したくない場合は、必要な場所に変換するだけです。複数回使用する場合は、解析して後で使用できるように保存してください。 –

+0

偉大な - ありがとう - 私はクラスの残りの部分に見えるようにポジションを保存する方法は? – GuybrushThreepwood

関連する問題