これの見た目が気に入らなかったので
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();