8acbd755a2
* NEW: That new switcher component chooses between gb.gtk.opengl and gb.qt4.opengl according to the current desktop in use. git-svn-id: svn://localhost/gambas/trunk@4719 867c0c6c-44f3-4631-809d-bfa615b0a4ec
191 lines
4.0 KiB
C++
191 lines
4.0 KiB
C++
/***************************************************************************
|
|
|
|
CGLarea.cpp
|
|
|
|
(c) 2006 Laurent Carlier <lordheavy@users.sourceforge.net>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA.
|
|
|
|
***************************************************************************/
|
|
|
|
#define __CGLAREA_CPP
|
|
|
|
#include "CGLarea.h"
|
|
|
|
//#include "gl.h"
|
|
|
|
//#include <iostream>
|
|
|
|
|
|
static int glWidgetCount = 0;
|
|
static QGLWidget *sharedWidget = 0;
|
|
|
|
DECLARE_EVENT(EVENT_Open);
|
|
DECLARE_EVENT(EVENT_Draw);
|
|
DECLARE_EVENT(EVENT_Resize);
|
|
|
|
static void makeSharing()
|
|
{
|
|
if (sharedWidget)
|
|
return;
|
|
|
|
sharedWidget = new QGLWidget();
|
|
//qDebug("make_sharing: %p", sharedWidget);
|
|
}
|
|
|
|
BEGIN_METHOD_VOID(CGLAREA_exit)
|
|
|
|
//qDebug("CGLAREA_exit: %p", sharedWidget);
|
|
delete sharedWidget;
|
|
sharedWidget = 0;
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD(CGLAREA_new, GB_OBJECT parent)
|
|
|
|
if (!QGLFormat::hasOpenGL())
|
|
{
|
|
GB.Error( "This system has no OpenGL support");
|
|
return;
|
|
}
|
|
|
|
makeSharing();
|
|
GLarea *area = new GLarea(QT.GetContainer(VARG(parent)), THIS, sharedWidget);
|
|
glWidgetCount++;
|
|
|
|
QT.InitWidget(area, _object, false);
|
|
area->show();
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(CGLAREA_free)
|
|
|
|
glWidgetCount--;
|
|
|
|
// clean up the shared datas between GLwidgets if there is no more CGLarea
|
|
if (glWidgetCount <= 0)
|
|
{
|
|
delete sharedWidget;
|
|
sharedWidget = 0;
|
|
makeSharing();
|
|
glWidgetCount = 0;
|
|
}
|
|
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(CGLAREA_update)
|
|
|
|
WIDGET->updateGL();
|
|
|
|
END_METHOD
|
|
|
|
#if 0
|
|
BEGIN_METHOD_VOID(CGLAREA_select)
|
|
|
|
WIDGET->makeCurrent();
|
|
// really needed ?
|
|
GL.Init();
|
|
|
|
END_METHOD
|
|
#endif
|
|
|
|
BEGIN_METHOD(CGLAREA_text, GB_STRING text; GB_INTEGER x; GB_INTEGER y)
|
|
|
|
QString text;
|
|
int x, y;
|
|
GLboolean _LIGHTING = glIsEnabled(GL_LIGHTING);
|
|
GLboolean _TEXTURE_2D = glIsEnabled(GL_TEXTURE_2D);
|
|
|
|
if (_LIGHTING)
|
|
glDisable(GL_LIGHTING);
|
|
if (_TEXTURE_2D)
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
text = QSTRING_ARG(text);
|
|
x = VARG(x);
|
|
y = VARG(y);
|
|
|
|
WIDGET->renderText(x, y, text, WIDGET->font());
|
|
|
|
if (_LIGHTING)
|
|
glEnable(GL_LIGHTING);
|
|
if (_TEXTURE_2D)
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
END_METHOD
|
|
|
|
/**************************************************************************/
|
|
|
|
GB_DESC CGlareaDesc[] =
|
|
{
|
|
GB_DECLARE("GLArea", sizeof(CGLAREA)), GB_INHERITS("Control"),
|
|
|
|
GB_STATIC_METHOD("_exit", NULL, CGLAREA_exit, NULL),
|
|
|
|
GB_METHOD("_new", NULL, CGLAREA_new, "(Parent)Container;"),
|
|
GB_METHOD("_free", NULL, CGLAREA_free, NULL),
|
|
//GB_METHOD("Update", NULL, CGLAREA_update, NULL),
|
|
GB_METHOD("Refresh", NULL, CGLAREA_update, NULL),
|
|
//GB_METHOD("Select", NULL, CGLAREA_select, NULL),
|
|
//GB_METHOD("Text", NULL, CGLAREA_text, "(Text)s(X)i(Y)i"),
|
|
|
|
GB_CONSTANT("_Group", "s", "Special"),
|
|
|
|
GB_EVENT("Open", NULL, NULL, &EVENT_Open),
|
|
GB_EVENT("Draw", NULL, NULL, &EVENT_Draw),
|
|
GB_EVENT("Resize", NULL, NULL, &EVENT_Resize),
|
|
|
|
GB_END_DECLARE
|
|
};
|
|
|
|
/* class GLarea */
|
|
|
|
GLarea::GLarea(QWidget *parent,CGLAREA *object, QGLWidget *sharing): QGLWidget(parent, 0, sharing)
|
|
{
|
|
setFocusPolicy(Qt::WheelFocus);
|
|
setInputMethodEnabled(true);
|
|
_area = object;
|
|
};
|
|
|
|
|
|
void GLarea::initializeGL()
|
|
{
|
|
GL.Init();
|
|
GB.Raise(_area, EVENT_Open, 0);
|
|
}
|
|
|
|
void GLarea::paintGL()
|
|
{
|
|
static bool CleanupOnFirstShow = 0;
|
|
|
|
if (!CleanupOnFirstShow)
|
|
{
|
|
// clear to avoid garbage
|
|
CleanupOnFirstShow = true;
|
|
qglClearColor(Qt::black);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
}
|
|
|
|
GB.Raise(_area, EVENT_Draw, 0);
|
|
}
|
|
|
|
void GLarea::resizeGL(int w, int h)
|
|
{
|
|
GB.Raise(_area, EVENT_Resize, 0);
|
|
}
|
|
|