私は単純なグラフィック エンジンに取り組んでおり、(コンストラクターで) 作成時に (セットに挿入することにより) 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 オブジェクトを配置したことがないため、その理由はよくわかりません。