2

私のプロジェクトには、次のようなクラスがあります。

public class Vertices
{
    float[] vertexData1;
    int   vertexData1Offset;

    float[] vertexData2;
    int   vertexData2Offset;

    float[] vertexData3;
    int   vertexData3Offset;

    float[] vertexBuffer;

    int vertexCount;
    int vertexStride;

    public void Update()
    {
        for(int i = 0; i < vertexCount; i++)
        {
            vertexBuffer[(i * vertexStride) + vertexData1Offset] = vertexData1[i];
            vertexBuffer[(i * vertexStride) + vertexData2Offset] = vertexData2[i];
            vertexBuffer[(i * vertexStride) + vertexData3Offset] = vertexData3[i];
        }
    }
}

つまり、配列 ( vertexBuffer ) があり、この配列は別の配列セット ( vertexData1... ) の組み合わせです。配列が結合される方法のみで、各「コンポーネント配列」は、各配列が順次連結されるのとは対照的に、「メイン配列」全体に均等に分散された要素をすべてごちゃ混ぜにします。

これらの配列を公開する方法があるかどうかを知りたい (たとえば、Array をサブクラス化する方法) ( vertexData1... ) このクラスの消費者が、連続した要素を持つ通常の配列であるかのようにアクセスできるようにする方法( vertexData1... )との間のコピーを含む) が、舞台裏では、オブジェクトはこれらの要素をvertexBuffer全体に実際に配布し、 Update() メソッドと複製されたデータの必要性を取り除きます。

これはC#で可能ですか?

4

2 に答える 2

3

はい、インデクサーを使用できます。何かのようなもの:

public class Vertices
{
    float[] vertexData1;
    int   vertexData1Offset;

    float[] vertexData2;
    int   vertexData2Offset;

    float[] vertexData3;
    int   vertexData3Offset;

    private float[] GetArrayForIndex(int index) {
      switch (index / vertexStride) {
        case 0: return verdexData1;
        case 1: return vertedData2;
        case 2: return vertexData3;
        default: throw new IndexOutOfRangeException();
      }
    }

    public float vertexBuffer[int index] {
      get {
        return GetArrayForIndex(index)[index % vertexStride];
      }
      set {
        GetArrayForIndex(index)[index % vertexStride] = value;
      }
    }

    int vertexStride;

}

インデクサーでデータをどのように配置したいかわかりません。配列を交互に配置するか、インターリーブするかによって、 /andの使用を入れ替えることができます。%

于 2012-10-28T15:03:42.850 に答える
0

インデクサー this[int index] を実装して、独自の機能を提供できます。

public class Vertices
{
  public float this[int index]
  {
    get
    {
      // do your stuff here
    }
    set
    {
      // do your stuff here
    }
  }
}
于 2012-10-28T15:08:14.157 に答える