読者です 読者をやめる 読者になる 読者になる

gl::DrawPrimitive文

OpenGL

これの見た目が気に入らなかったので

glBegin(GL_LINES);
    glVertex2d(0.0, 0.8);
    glVertex2d(1.0, 0.8);
glEnd();

glFlush();

こういうのを用意して

namespace gl {

struct DrawPrimitiveRange {
    DrawPrimitiveRange(GLenum mode) { ::glBegin(mode); }
    ~DrawPrimitiveRange() { ::glEnd(); ::glFlush(); }
};

#define GL_DRAW_PRIMITIVE(__mode) \
    DrawPrimitiveRange __primitiveRange(__mode);

#define DrawPrimitive GL_DRAW_PRIMITIVE

}

こう書けるようにした

gl::DrawPrimitive(GL_LINES) {
    glVertex2d(0.0, 0.8);
    glVertex2d(1.0, 0.8);
}

gl::DrawPrimitiveのスコープが抜けるときに glEnd() とglFlush() が呼ばれます。


DrawPrimitiveはマクロなので名前空間のスコープ無視しますが
gl::を省略するとエラーになるようにしてます。


デストラクト時に呼ばれるのをglEnd()だけにしてgl::DrawPrimitive文抜けたあとにglFlush()呼ぶと、
なぜか表示されない。。。


本当はこうしたかった

gl::DrawPrimitive(GL_LINES) {
    glVertex2d(0.0, 0.8);
    glVertex2d(1.0, 0.8);
}

glFlush();

glEndとglFlushのスコープが異なるとダメなの?と思ったけどそれはないみたい。
glEndとglFlushの間でオブジェクトの破棄が行われるとダメ?と思ったけどそれもないみたい。

うーん、原因がわからない



追記:


これでOK

namespace gl {

struct DrawPrimitiveRange {
    DrawPrimitiveRange(GLenum mode) { ::glBegin(mode); }
    ~DrawPrimitiveRange() { ::glEnd(); }

    operator bool() const { return true; }
};

#define GL_DRAW_PRIMITIVE(__mode) \
    if (gl::DrawPrimitiveRange __primitiveRange = __mode)

#define DrawPrimitive GL_DRAW_PRIMITIVE

} // namespace gl
DrawPrimitive(GL_LINES) {
    glVertex2d(0.0, 0.8);
    glVertex2d(1.0, 0.8);
}

glFlush();