0

私は単純なグラフィック エンジンに取り組んでおり、(コンストラクターで) 作成時に (セットに挿入することにより) Renderer に登録することになっている Drawable オブジェクトを持っています。また、レンダリングのために (透明度、深度マスクなどによって) 並べ替える必要があります。つまり、いくつかのブール値フラグによって並べ替える必要があります。

これが私のセットです。

std::set<Drawable *, DrawableComp> drawable_set;

比較関数:

struct DrawableComp : public std::binary_function<const Drawable *, const Drawable *, bool> {
    bool operator() (const Drawable * lhs, const Drawable * rhs) const
    {
        return *lhs < *rhs;
    }
};

そして、Drawable のオーバーロードされた operator<:

bool Drawable::operator<(const Drawable & rhs) const
{
    if (writesDepth() != rhs.writesDepth())
        return !writesDepth() < !rhs.writesDepth();
    else
        return getSortNumber() < rhs.getSortNumber();
}

これは、Drawables を順番に set に挿入することになっていることに注意してください。これにより、最初に深度バッファに書き込むオブジェクトに進み、次に深度バッファに書き込まないオブジェクトが続きます。ソート番号はオブジェクトごとに一意です。

問題は、それが機能しないことです。セットの最後に深度バッファに書き込む Drawables を取得します。

また、 writeDepth() は仮想 bool 関数です。Drawable は単なる抽象的なインターフェースです。writeDepth() を純粋仮想にすると、「純粋仮想メソッドが呼び出されました」という実行時エラーが発生します。その具体的な実装ではなく、セットに Drawable オブジェクトを配置したことがないため、その理由はよくわかりません。

4

1 に答える 1

0

わかりました、問題が見つかりました。Drawable コンストラクターから Drawables を登録していました。コンストラクターでこの呼び出しがありました(registerDrawableはセットに挿入するだけです):

Application::get().getRenderer().registerDrawable(this);

問題は、これが派生型ではなく型 Drawable のオブジェクトへのポインターを送信することです。そのため、セットは派生クラスが何であるかを「認識せず」、基本メソッド writeDepth() を呼び出すだけです。

簡単な解決策は、この呼び出しを派生コンストラクターに移動することです。それは私のデザインに少し混乱と冗長性を挿入しますが...

于 2012-10-20T06:12:08.357 に答える