コンパイル時に型が不明な配列の要素を反復処理する無害なサイクルに見えるものがあります。私の配列は mesh->vertices という名前で、void へのポインタです。mesh->textured の真の値に応じて、配列を別の方法で考慮する必要があります。ちなみに、以下のコード セグメントの if と else のコードは似ていますが、2 つのケースを区別する必要があります。
void TransformMesh(struct Mesh *mesh, struct Matrix4 *t)
{
for (int i = 0; i < mesh->nVertices; ++i)
{
if (mesh->textured)
{
struct TexturedVertex *ptr = ((struct TexturedVertex *)mesh->vertices) + i;
ptr[i].position = MatrixPointMultiply3(t, &ptr->position);
ptr[i].normal = MatrixPointMultiply3(t, &ptr->normal);
}
else
{
struct Vertex *ptr = ((struct Vertex *)mesh->vertices) + i;
ptr[i].position = MatrixPointMultiply3(t, &ptr->position);
ptr[i].normal = MatrixPointMultiply3(t, &ptr->normal);
}
}
}
自動参照カウント オプションを付けてプロジェクトを作成し、C コードには影響しないと思っていたのですが、今では間違っているように感じます (ちなみに、どのオプションを選択したかを確認するにはどうすればよいでしょうか?)。
この関数は、別の配列 (mesh->triangles と呼ばれる) で何か問題を起こしているようで、おそらくそれを解放しています。ベクターを使用しようとすると、EXC_BAD_ACCESS エラーが発生します。
glDrawElements(GL_TRIANGLES, mesh->nTriangles * 3, GL_UNSIGNED_INT, mesh->triangles);
mesh->vertices 要素を反復し、それらをキャストしてポインター演算を実行すると、メモリが破損しているようです。私の問題は ARC だと思うので、ここで説明したことを実行しようとしましたが、うまくいきませんでした。
編集:
Conrad Shultz が指摘したように、上記のコードは間違っていました。以下は正しいです。
ptr->position = MatrixPointMultiply3(t, &ptr->position);
ptr->normal = MatrixPointMultiply3(t, &ptr->normal);