change OpenGLDrawable interface

This commit is contained in:
Vadim Lopatin 2015-12-21 09:52:19 +03:00
parent 57aba53bf5
commit aea38fb5fe
4 changed files with 18 additions and 13 deletions

View File

@ -974,7 +974,8 @@ static if (ENABLE_OPENGL) {
bool _oldApi; bool _oldApi;
private void doDraw(DrawBuf buf, Rect rc) { /// this is OpenGLDrawableDelegate implementation
private void doDraw(Rect windowRect, Rect rc) {
Log.v("GlGears: MyOpenglWidget.doDraw() draw gears"); Log.v("GlGears: MyOpenglWidget.doDraw() draw gears");
if (!openglEnabled) { if (!openglEnabled) {
Log.v("GlGears: OpenGL is disabled"); Log.v("GlGears: OpenGL is disabled");
@ -988,6 +989,7 @@ static if (ENABLE_OPENGL) {
} }
} }
/// Legacy API example (glBegin/glEnd)
void drawUsingOldAPI(Rect rc) { void drawUsingOldAPI(Rect rc) {
static bool _initCalled; static bool _initCalled;
if (!_initCalled) { if (!_initCalled) {
@ -1006,17 +1008,21 @@ static if (ENABLE_OPENGL) {
glDisable(GL_LIGHT0); glDisable(GL_LIGHT0);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
/// New API example (OpenGL3+, shaders)
void drawUsingNewAPI(Rect rc) { void drawUsingNewAPI(Rect rc) {
// TODO: put some sample code here
} }
/// returns true is widget is being animated - need to call animate() and redraw /// returns true is widget is being animated - need to call animate() and redraw
@property override bool animating() { return true; } @property override bool animating() { return true; }
/// animates window; interval is time left from previous draw, in hnsecs (1/10000000 of second) /// animates window; interval is time left from previous draw, in hnsecs (1/10000000 of second)
override void animate(long interval) { override void animate(long interval) {
if (_oldApi) { if (_oldApi) {
// animate legacy API example
// rotate gears // rotate gears
angle += interval * 0.000002f; angle += interval * 0.000002f;
} else { } else {
// animate new API example // TODO: animate new API example
} }
invalidate(); invalidate();
} }

View File

@ -40,7 +40,7 @@ static if (ENABLE_OPENGL) {
} }
/// Custom draw delegate for OpenGL direct drawing /// Custom draw delegate for OpenGL direct drawing
alias OpenGLDrawableDelegate = void delegate(DrawBuf buf, Rect rc); alias OpenGLDrawableDelegate = void delegate(Rect windowRect, Rect rc);
/// drawing buffer - image container which allows to perform some drawing operations /// drawing buffer - image container which allows to perform some drawing operations
class DrawBuf : RefCountedObject { class DrawBuf : RefCountedObject {

View File

@ -91,7 +91,7 @@ class GLDrawBuf : DrawBuf, GLConfigCallback {
/// draw custom OpenGL scene /// draw custom OpenGL scene
override void drawCustomOpenGLScene(Rect rc, OpenGLDrawableDelegate handler) { override void drawCustomOpenGLScene(Rect rc, OpenGLDrawableDelegate handler) {
_scene.add(new CustomDrawnSceneItem(this, rc, handler)); _scene.add(new CustomDrawnSceneItem(Rect(0, 0, width, height), rc, handler));
} }
/// fill the whole buffer with solid color (no clipping applied) /// fill the whole buffer with solid color (no clipping applied)
@ -911,13 +911,13 @@ public:
private class CustomDrawnSceneItem : SceneItem { private class CustomDrawnSceneItem : SceneItem {
private: private:
DrawBuf _buf; Rect _windowRect;
Rect _rc; Rect _rc;
OpenGLDrawableDelegate _handler; OpenGLDrawableDelegate _handler;
public: public:
this(DrawBuf buf, Rect rc, OpenGLDrawableDelegate handler) { this(Rect windowRect, Rect rc, OpenGLDrawableDelegate handler) {
_buf = buf; _windowRect = windowRect;
_rc = rc; _rc = rc;
_handler = handler; _handler = handler;
} }
@ -925,10 +925,9 @@ public:
if (_handler) { if (_handler) {
import derelict.opengl3.gl3 : glViewport; import derelict.opengl3.gl3 : glViewport;
glViewport(_rc.left, _buf.height - _rc.bottom, _rc.width, _rc.height); glViewport(_rc.left, _windowRect.height - _rc.bottom, _rc.width, _rc.height);
_handler(_buf, _rc); _handler(_windowRect, _rc);
glSupport.setOrthoProjection(Rect(0, 0, _buf.width, _buf.height)); glSupport.setOrthoProjection(_windowRect);
} }
} }
} }

View File

@ -252,10 +252,10 @@ class OpenGLDrawable : Drawable {
_drawHandler = drawHandler; _drawHandler = drawHandler;
} }
void onDraw(DrawBuf buf, Rect rc) { void onDraw(Rect windowRect, Rect rc) {
// either override this method or assign draw handler // either override this method or assign draw handler
if (_drawHandler) { if (_drawHandler) {
_drawHandler(buf, rc); _drawHandler(windowRect, rc);
} }
} }