And again, it worked.

Took a little time before I figured out why the cube was flashing every 
time I lead the mouse over the button (which triggers an animation).
Got it though: Put this into the _flush_cb function:

    glDrawBuffer (GL_BACK);
    glReadBuffer (GL_BACK);


..Guess we are tricked by Evas' compositing routines.

Regards Rene







Simon TRENY wrote:
> On Tue, 14 Nov 2006 10:42:55 +0100,
> Rene Jensen <[EMAIL PROTECTED]> wrote :
>
>   
>> Simon, thanks, it worked!
>>
>> Next I'll see how well one can get away with mixing Etk with this.
>> With a little luck it is just a matter of calling glViewport and
>> glScissor before painting (and resetting them again afterwards of
>> course).
>>     
>
> Here is a really simple code that shows how to make it work in
> Etk. It's still heavy experimentation, really dirty and it has some
> problems.
> To make it work, you still need the Evas patch (the flush callback
> thing) and the latest Etk to have the GL-X11 engine of Etk (I've just
> committed it).
>
> To compile it:
> gcc -o etk_gl_proto etk_gl_proto.c `etk-config --libs --cflags` -Wall
> -lGL -lGLU
>
> and to execute it, you have to say to the app that you'd like to use
> the GL-X11 engine, so the command is:
> ./etk_gl_proto --etk-engine=ecore_evas_gl_x11
>
> It should work but it's a bit buggy (probably because I don't reset all
> the GL states before drawing the cube, so sometimes blending is
> enabled, sometimes scissor-test is enabled, ... it would be useful to
> have a command to reset all the GL-states to their default value...)
>
>   
>> I know this is a hack, but experimentation first, then we can start 
>> thinking about a clean solution that is OK with the lead developers.
>>     
>
> A way to make it cleaner and more generic would be to do as Jose said:
> render the OpenGL scene in a buffer, and render the buffer content in
> an Evas image. This should even be compatible with all the engines, but
> it may be a lot slower (I don't know, I never did something like that).
>
> Simon
>
>
>   
>> Regards
>> Rene
>>
>>
>>
>> Simon TRENY wrote:
>>     
>>> Here is a fixed version of the test code. It fixes the back-face
>>> culling and some glPush/Pop*() bugs.
>>>
>>> Simon
>>>
>>>
>>> On Sun, 12 Nov 2006 18:21:09 +0100,
>>> Simon TRENY <[EMAIL PROTECTED]> wrote :
>>>
>>>   
>>>       
>>>> Hi Rene,
>>>>
>>>> The main problem we have here is that what you'd like to do is
>>>> definitely engine-specific whereas Evas tends to abstract totally
>>>> the engine layer. Anyway, with some Evas engines it should be
>>>> quite easy to use OpenGL to render 3D stuff. Here is how to do it
>>>> with the GL-X11 engine of Evas (which is obviously the most
>>>> appropriate engine to do that since it already provides the GL
>>>> context).
>>>>
>>>> So, with the GL-X11 engine of Evas, all you have to do basically
>>>> is to call all your OpenGL functions before glXSwapBuffers() gets
>>>> called. glXSwapBuffers() is called by the output_flush() method of
>>>> the GL-X11 engine, which is called by
>>>> evas_render_updates_internal(). So the problem is that we need to
>>>> be somehow notified before evas_render_updates_internal() calls
>>>> the output_flush() method, and, for now, there is no way to do
>>>> that. I have written a small patch for Evas to add a callback
>>>> called each time before output_flush() is called. The function to
>>>> set this callback is evas_flush_callback_set(). The Evas patch is
>>>> joined with this email (this patch should not be applied to the
>>>> CVS repository of Evas, it's a quick'n'dirty hack!!).
>>>>
>>>> Now, all you have to do is to make the calls to the OpenGL
>>>> functions in the "flush-callback". I have attached a a small code
>>>> that shows how to do it. It's totally dirty and hacky but it works
>>>> quite well :) There is just a small problem with the Zbuffer of
>>>> with the backbface culling I guess (the cube looks weird...), but
>>>> it shouldn't be hard to fix. To compile this code, you have to
>>>> apply the patch to Evas, and to compile it with:
>>>> gcc -o evas_gl_proto evas_gl_proto.c `ecore-config --cflags --libs`
>>>> -lGL -lGLU -Wall
>>>>
>>>>
>>>> Note that the GL engine of Evas has some serious problems though.
>>>> Here is a list of the know problems written by raster some times
>>>> ago: 
>>>>         
>>>>> 1. a font with glyphs > 256x256 pixels will just break.
>>>>> 2. images that are bigger than max texture size simply won't show
>>>>> (need to build a mesh)
>>>>> 3. cards that don't support rectangular textures will end up with
>>>>> nasty scaling results when scaling "stretched" or "squashed"
>>>>> mostly in 1 dimension (mipmap issues basically when used for 2d)
>>>>> 4. scaling down even with smooth scaling is ugly (need to use
>>>>> anisotropic filtering  if possible)
>>>>> 5. doesn't support destination alpha (easy-ish to fix)
>>>>> 6. need pbuffer support implemented for the future (we need to be
>>>>> able to render to an intermediate buffer)
>>>>> 7. if the window is fullscreen glx may choose to do page flipping
>>>>> not copy from back to front buffer. in this case evas's assumption
>>>>> that the buffer was exactly as it left it when it last rendered is
>>>>> wrong - as it actually is as it was rendered 2 frames ago, not the
>>>>> last frame.
>>>>>       
>>>>>           
>>>> There is also a problem when you have several windows using the GL
>>>> engine in your program, but I think it's probably a problem with
>>>> Ecore_Evas_GL. The Glitz engine that raster seems to be writting
>>>> should fix most of these problems :)
>>>>
>>>>
>>>> Regards :)
>>>> Simon
>>>>
>>>>
>>>>
>>>>
>>>> On Sun, 12 Nov 2006 12:40:37 +0100,
>>>> Rene Jensen <[EMAIL PROTECTED]> wrote :
>>>>
>>>>     
>>>>         
>>>>> WARNING: LONG POST AHEAD...
>>>>>
>>>>> (Sigh) After having posted on both IRC and the webforum, I get
>>>>> the distinct feeling that this community has been worn down by
>>>>> daft requests for getting fancy window drawing using OpenGL.
>>>>>
>>>>> This is a serious shame because now even the smallest utterance of
>>>>> that API makes it's author look guilty. The developers forget that
>>>>> end-users asking for something XGL'ish is a far cry from
>>>>> application developers asking for their favorite API for
>>>>> graphics/GLGPU programming, which they need to make video/3D
>>>>> applications using Ewl/Etk.
>>>>>
>>>>> However, as an application developer, I feel that:
>>>>>
>>>>> 1) Etk/Edje is perfect for the job. The efficiency is the reason I
>>>>> am choosing E if I can get away with it in the first place. I
>>>>> need a strong and themable GUI. I *LOVE* Efl's well-organized
>>>>> style!
>>>>>
>>>>> 2) The window manager and graphics lib should NOT squander my
>>>>> precious GPU cycles on needless features. If I could make a 3D in
>>>>> a console window, I'd do that.
>>>>>
>>>>> 3) An extra GL layer is actually another source of errors! Once I
>>>>> made a small 3D paint-program that used GL for the painting
>>>>> procedures, http://artcamilla.dk/centipede. I spend a LOT of time
>>>>> tracking down a bug in Windows where I use Nvidias desktop
>>>>> switcher. All that was drawn on my screen was a frame delayed.
>>>>> Turned out that when I switched off the desktop switcher or even
>>>>> turned off screen rotation (I have a tablet-pc), the bug
>>>>> dissappeared. Wasn't in my program after all. Incidently, the
>>>>> above mentioned program used my own OpenGL based mini-GUI. Guess
>>>>> why I am looking for another GUI with a strong support of
>>>>> themes ;-)
>>>>>
>>>>> 4) It will be hard to write any program at all in the video/3D
>>>>> industry without having support for OpenGL.
>>>>>
>>>>> --------------------------------
>>>>>
>>>>> Ok, enough ranting. This is a verbatim copy of the forum post I
>>>>> made few days ago. By the end of this mail, I have already
>>>>> answered some of it:
>>>>>
>>>>> --------------------------------
>>>>>
>>>>> I've learned that OpenGL requests falls in two camps this place:
>>>>> Those for a way to put Evas into OpenGL (for kicks), and those
>>>>> for a way to put OpenGL into Evas/Etk (for making any kind of
>>>>> serious multimedia program). This post belongs in the latter camp.
>>>>>
>>>>> Without in any way claiming to be a proficient E programmer, I've
>>>>> taken the liberty to scout for the possibility of drawing 3D in
>>>>> ETK, since it appears to be a non-existing feature right now.
>>>>> Hope I won't make too big a fool of myself ;-)
>>>>>
>>>>> Basically all that is needed to be able to draw using opengl in X
>>>>> is the creation of a GL context using GLX. The only thing
>>>>> required is that you have a handle to an X drawable (Window or
>>>>> Pixmap). I can see that in E getting this handle is less obvious,
>>>>> since E is unaware of a specific render-backend. Opposite GTK
>>>>> which has an X Window for each widget, ETK renders each element
>>>>> directly to a buffer, and only this grand superbuffer has an
>>>>> associated Window - if using some kind of X11 backend of course.
>>>>> If I read the code correctly, the Evas software-X11 backend
>>>>> actually renders to a pixbuf in shared-memory.
>>>>>
>>>>> So far so good. I traced this Drawable to a function called
>>>>> 'eng_setup', which is handed an X Drawable (amongst other things).
>>>>> Though I can't see where this Drawable is created since I don't
>>>>> know who CALLS eng_setup, I guess it would still be possible to
>>>>> get the super-drawable somehow.
>>>>>
>>>>> So I guess that in order to get OpenGL support in ETK, three
>>>>> things are needed:
>>>>>
>>>>> 1) Access the Drawable for the root Evas (if using X11/GLX) or a
>>>>> Window (if using GDI/WGL on windows)
>>>>>
>>>>> 2) Knowledge about where in the root-evas the widget which on
>>>>> which OpenGL drawing should occur is placed.
>>>>>
>>>>> 3) Cooperation from ETK: It shouldn't paint anything to update
>>>>> that widget and it should make it possible to emit a "paint"
>>>>> signal so the user can emit the proper set of OpenGL commands.
>>>>>
>>>>> Getting 2. to work should be easy. Accessing the Drawable in 1 is
>>>>> not at all impossible either, I guess. (save the Drawable in a
>>>>> global var in some of the E libraries and get it through a
>>>>> function. As to 3., it is more of a mystery exactly how, but
>>>>> perhaps somebody sees the light more clearly.
>>>>>
>>>>> Before I go on, I'd like your sentiments on this
>>>>> request/suggestion. Presumable somebody will cry: "No way!  E has
>>>>> nothing to do with OpenGL period! This would violate the API which
>>>>> is totally architecture agnostic, you ignorant philistine", which
>>>>> is a perfectly adult way of opening this interesting discussion.
>>>>> Other people may ask why I am not simply using this ...XXX...
>>>>> GL-widget. I certainly hope that happens ;-)
>>>>>
>>>>>
>>>>> --------------------------------
>>>>>
>>>>> And a few more thoughts (and solutions) I have since made:
>>>>>
>>>>> 1) I can see a problem if Evas uses some form of buffering. Then
>>>>> you need to pump out the data from the GL context. This may not be
>>>>> as slow as it sounds on modern architectures and if the updating
>>>>> of the cache doesn't happen every time a single bit has been
>>>>> changed.
>>>>>
>>>>> 2) A spin on the above. In case Evas buffers use that cache, it is
>>>>> going to be hard to emit some kind of "paint" signal which will be
>>>>> needed to draw opengl into the canvas. However I studied Evas'
>>>>> code and I can see that the engine-module simply get a
>>>>>
>>>>>     eng_image_draw (in modules/engines/gl_x11/evas_engine.c)
>>>>>
>>>>> which converts into a
>>>>>
>>>>>     evas_gl_common_image_draw (in
>>>>> modules/engines/gl_common/evas_gl_image.c)
>>>>>
>>>>> In the last function, the is evident that the Image being painted
>>>>> is actually a GL texture. So a quick solution could be to use GL's
>>>>> recent Render-To-Texture mechanism (a.k.a Framebuffers) to make
>>>>> the Image being juggled with an actual 3D image rendered at users
>>>>> will (as long as (s)he remembers to tell Evas that the "image" has
>>>>> changed). Not the fastest solution, but not bad either. The
>>>>> programmer is unburdened with "paint" calls, and Evas is free to
>>>>> repaint and buffer as it sees fit.
>>>>>
>>>>>
>>>>> Responding to my own statements earlier:
>>>>>
>>>>> 1) We already have access to the Drawable from the program's main 
>>>>> function, which sets up the environment. I missed that because it
>>>>> seems etk_init handles it. Thus etk_init needs to open up a bit.
>>>>>
>>>>> 2) If you use Render-To-Texture, you don't need anything from Etk
>>>>> except access/modification possibility of it's GLuint that holds
>>>>> the texture name
>>>>>
>>>>> 3) - ditto -
>>>>>
>>>>>
>>>>> Caveat's:
>>>>>
>>>>> 1) You still need the GL CONTEXT that get's created. For some
>>>>> reason this isn't dont in the main function, e.g.
>>>>>
>>>>>     bin/evas_gl_x11_main.c
>>>>>
>>>>> 2) You need to be able to get the GLuint of an image.
>>>>>
>>>>> 3) This is inherently ENGINE SPECIFIC. No sense in asking for a 
>>>>> texture-id from a cairo backend.
>>>>>
>>>>>
>>>>> --------------------------------
>>>>>
>>>>> And something completely different:
>>>>>
>>>>> I have good experience with OpenGL and a small GDI/GL + X/GL 
>>>>> cross-platform GUI behind me. I couldn't help noticing that your 
>>>>> Win32/GDI engine files are almost empty. Just ask if you need any
>>>>> tips. I might be able to help. I also have a somewhat deep
>>>>> understanding of OpenGL Framebuffer Objects and all that "weird"
>>>>> OpenGL stuff.
>>>>>
>>>>> Oh, and don't use the GDI way of transferring buffered graphics
>>>>> data to a window (Device Independent Bitmap). Slow like hell.
>>>>> Either use a GL context (why not?) or DirectX. I don't know
>>>>> anything about GDI+ or the new stuff from MS.
>>>>>
>>>>>
>>>>>
>>>>> Ahem, I should stop talking.
>>>>>
>>>>>
>>>>> Regards Centipede (Rene Jensen)
>>>>>
>>>>>
>>>>> -------------------------------------------------------------------------
>>>>> Using Tomcat but need to do more? Need to support web services,
>>>>> security? Get stuff done quickly with pre-integrated technology to
>>>>> make your job easier Download IBM WebSphere Application Server
>>>>> v.1.0.1 based on Apache Geronimo
>>>>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
>>>>> _______________________________________________
>>>>> enlightenment-devel mailing list
>>>>> enlightenment-devel@lists.sourceforge.net
>>>>> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>>>>>
>>>>>       
>>>>> ------------------------------------------------------------------------
>>>>>
>>>>> #include <stdlib.h>
>>>>> #include <stdio.h>
>>>>> #include <Evas.h>
>>>>> #include <Ecore.h>
>>>>> #include <Ecore_Evas.h>
>>>>> #include <GL/gl.h>
>>>>> #include <GL/glu.h>
>>>>>
>>>>> #define WIDTH 800
>>>>> #define HEIGHT 600
>>>>>
>>>>> static int _animator_cb(void *data);
>>>>> static void _flush_cb(Evas *e);
>>>>>
>>>>> int main(int argc, char *argv[])
>>>>> {
>>>>>    Evas *e;
>>>>>    Ecore_Evas *ee;
>>>>>    Evas_Object *bg;
>>>>>    Evas_Object *rect;
>>>>>    
>>>>>    evas_init();
>>>>>    ecore_init();
>>>>>    ecore_evas_init();
>>>>>    
>>>>>    ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, WIDTH, HEIGHT);
>>>>>    ecore_evas_size_min_set(ee, WIDTH, HEIGHT);
>>>>>    ecore_evas_size_max_set(ee, WIDTH, HEIGHT);
>>>>>    e = ecore_evas_get(ee);
>>>>>    evas_flush_callback_set(e, _flush_cb);
>>>>>    ecore_evas_show(ee);
>>>>>    
>>>>>    
>>>>>    /* We create a black background rect because Evas doesn't
>>>>> clear the color buffer */ bg = evas_object_rectangle_add(e);
>>>>>    evas_object_color_set(bg, 0, 0, 0, 255);
>>>>>    evas_object_move(bg, 0, 0);
>>>>>    evas_object_resize(bg, WIDTH, HEIGHT);
>>>>>    evas_object_show(bg);
>>>>>    
>>>>>    /* The rectangle is here to show that Evas can render object
>>>>> while OpenGL is also rendering */ rect =
>>>>> evas_object_rectangle_add(e); evas_object_color_set(rect, 0, 200,
>>>>> 180, 255); evas_object_move(rect, 10, 10);
>>>>>    evas_object_resize(rect, 30, 30);
>>>>>    evas_object_show(rect);
>>>>>    
>>>>>    /* By default, an animator is 30 times per second */
>>>>>    ecore_animator_frametime_set(1.0 / 60.0);
>>>>>    ecore_animator_add(_animator_cb, e);
>>>>>    ecore_main_loop_begin();
>>>>>    
>>>>>    ecore_evas_shutdown();
>>>>>    ecore_shutdown();
>>>>>    evas_shutdown();
>>>>>    
>>>>>    return 0;
>>>>> }
>>>>>
>>>>> /* Forces Evas to redraw */
>>>>> static int _animator_cb(void *data)
>>>>> {
>>>>>    Evas *e;
>>>>>    
>>>>>    if (!(e = data))
>>>>>       return 1;
>>>>>
>>>>>    evas_damage_rectangle_add(e, 0, 0, WIDTH, HEIGHT);
>>>>>    return 1;
>>>>> }
>>>>>
>>>>> /* This is called before glXSwapBuffers() gets called.
>>>>>  * The calls to the GL API have to be placed here */
>>>>> static void _flush_cb(Evas *e)
>>>>> {
>>>>>    static float rot = 0.0;
>>>>>    
>>>>>    glPushAttrib(GL_ALL_ATTRIB_BITS);
>>>>>    
>>>>>    glEnable(GL_DEPTH_TEST);
>>>>>    glDepthFunc(GL_LEQUAL);
>>>>>    /* We have to disable the scissor test or sometimes it's not
>>>>> rendered. Not sure why... */ glDisable(GL_SCISSOR_TEST);
>>>>>    glEnable(GL_CULL_FACE);
>>>>>    glCullFace(GL_BACK);
>>>>>    
>>>>>    glClear(GL_DEPTH_BUFFER_BIT);
>>>>>    
>>>>>    glMatrixMode(GL_PROJECTION);
>>>>>    glPushMatrix();
>>>>>    glLoadIdentity();
>>>>>    gluPerspective(45.0, (float)WIDTH / (float)HEIGHT, 0.1, 100.0);
>>>>>
>>>>>    glMatrixMode(GL_MODELVIEW);
>>>>>    glPushMatrix();
>>>>>    glLoadIdentity();
>>>>>    
>>>>>    glTranslatef(0.0, 0.0, -5.0);
>>>>>    glRotatef(rot, 0.3, 0.6, 0.0);
>>>>>    glBegin(GL_QUADS);
>>>>>       /* Top of cube */
>>>>>       glColor3f(0.0f, 1.0f, 0.0f);
>>>>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>>>>       /* Bottom of cube */
>>>>>       glColor3f(1.0f, 0.5f, 0.0f);
>>>>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>>>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>>>>       /* Front of cube */
>>>>>       glColor3f(1.0f, 0.0f, 0.0f);
>>>>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>>>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>>>>       /* Back of cube */
>>>>>       glColor3f(1.0f, 1.0f, 0.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>>>>       /* Right side of cube */
>>>>>       glColor3f(1.0f, 0.0f, 1.0f);
>>>>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>>>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>>>>       /* Left side of cube */
>>>>>       glColor3f(0.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>>>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>>>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>>>>    glEnd();
>>>>>    
>>>>>    /* Restore the previous transform matrices */
>>>>>    glPopAttrib();
>>>>>    glMatrixMode(GL_PROJECTION);
>>>>>    glPopMatrix();
>>>>>    glMatrixMode(GL_MODELVIEW);
>>>>>    glPopMatrix();
>>>>>    
>>>>>    rot += 1.0;
>>>>> }
>>>>>       
>>>>>           
>> ------------------------------------------------------------------------
>>
>> #include <Etk.h>
>> #include <GL/gl.h>
>> #include <GL/glu.h>
>>
>> static void _opengl_view_realize_cb(Etk_Object *object, void *data);
>> static void _rotation_toggled_cb(Etk_Object *object, void *data);
>> static int _animator_cb(void *data);
>> static void _flush_cb(Evas *e);
>>
>> static Etk_Widget *_opengl_view;
>> static Etk_Bool _rotate = ETK_TRUE;
>>
>> int main(int argc, char *argv[])
>> {
>>    Etk_Widget *window;
>>    Etk_Widget *vbox;
>>    Etk_Widget *frame;
>>    Etk_Widget *button;
>>    
>>    etk_init(&argc, &argv);
>>    
>>    window = etk_window_new();
>>    vbox = etk_vbox_new(ETK_FALSE, 0);
>>    etk_container_add(ETK_CONTAINER(window), vbox);
>>    
>>    frame = etk_frame_new("OpenGL View");
>>    etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_EXPAND_FILL, 
>> 0);
>>    
>>    _opengl_view = etk_widget_new(ETK_WIDGET_TYPE, NULL);
>>    etk_widget_size_request_set(_opengl_view, 240, 320);
>>    etk_signal_connect("realize", ETK_OBJECT(_opengl_view), 
>> _opengl_view_realize_cb, NULL);
>>    etk_container_add(ETK_CONTAINER(frame), _opengl_view);
>>    
>>    etk_box_append(ETK_BOX(vbox), etk_hseparator_new(), ETK_BOX_START, 
>> ETK_BOX_NONE, 0);
>>    button = etk_toggle_button_new_with_label("Stop Rotation");
>>    etk_signal_connect("toggled", ETK_OBJECT(button), _rotation_toggled_cb, 
>> NULL);
>>    etk_box_append(ETK_BOX(vbox), button, ETK_BOX_START, ETK_BOX_NONE, 0);
>>    
>>    ecore_animator_frametime_set(1.0 / 60.0);
>>    ecore_animator_add(_animator_cb, NULL);
>>    
>>    etk_widget_show_all(window);
>>    etk_main();
>>    
>>    return 0;
>> }
>>
>> /* Called when the OpenGL view is realized: we set the "flush callback" to 
>> the Evas */
>> static void _opengl_view_realize_cb(Etk_Object *object, void *data)
>> {
>>    Evas *e;
>>    
>>    if (!(e = etk_widget_toplevel_evas_get(ETK_WIDGET(object))))
>>       return;
>>    evas_flush_callback_set(e, _flush_cb);
>> }
>>
>> /* Called when the "Stop Rotation" button is toggled */
>> static void _rotation_toggled_cb(Etk_Object *object, void *data)
>> {
>>    _rotate = !etk_toggle_button_active_get(ETK_TOGGLE_BUTTON(object));
>> }
>>
>> /* Forces Evas to redraw */
>> static int _animator_cb(void *data)
>> {
>>    Evas *e;
>>    
>>    if (!(e = etk_widget_toplevel_evas_get(_opengl_view)))
>>       return 1;
>>
>>    evas_damage_rectangle_add(e, 0, 0, 1000, 1000);
>>    return 1;
>> }
>>
>> /* This is called before glXSwapBuffers() gets called.
>>  * The calls to the GL API have to be placed here */
>> static void _flush_cb(Evas *e)
>> {
>>    Etk_Geometry geometry;
>>    static float rot = 0.0;
>>    
>>    etk_widget_geometry_get(_opengl_view, &geometry.x, &geometry.y, 
>> &geometry.w, &geometry.h);
>>    
>>    glPushAttrib(GL_ALL_ATTRIB_BITS);
>>    
>>    glViewport(geometry.x, geometry.y, geometry.w, geometry.h);
>>    
>>    glEnable(GL_DEPTH_TEST);
>>    glDepthFunc(GL_LEQUAL);
>>    /* We have to disable the scissor test or sometimes it's not rendered. 
>> Not sure why... */
>>    glDisable(GL_BLEND);
>>    glDisable(GL_SCISSOR_TEST);
>>    glEnable(GL_CULL_FACE);
>>    glCullFace(GL_BACK);
>>    
>>    glClear(GL_DEPTH_BUFFER_BIT);
>>    
>>    glMatrixMode(GL_PROJECTION);
>>    glPushMatrix();
>>    glLoadIdentity();
>>    gluPerspective(45.0, (float)geometry.w / (float)geometry.h, 0.1, 100.0);
>>
>>    glMatrixMode(GL_MODELVIEW);
>>    glPushMatrix();
>>    glLoadIdentity();
>>    
>>    glTranslatef(0.0, 0.0, -5.0);
>>    glRotatef(rot, 0.3, 0.6, 0.0);
>>    glBegin(GL_QUADS);
>>       /* Top of cube */
>>       glColor3f(0.0f, 1.0f, 0.0f);
>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>       /* Bottom of cube */
>>       glColor3f(1.0f, 0.5f, 0.0f);
>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>       /* Front of cube */
>>       glColor3f(1.0f, 0.0f, 0.0f);
>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>       /* Back of cube */
>>       glColor3f(1.0f, 1.0f, 0.0f);
>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>       /* Right side of cube */
>>       glColor3f(1.0f, 0.0f, 1.0f);
>>       glVertex3f(1.0f, 1.0f, -1.0f);
>>       glVertex3f(1.0f, 1.0f, 1.0f);
>>       glVertex3f(1.0f, -1.0f, 1.0f);
>>       glVertex3f(1.0f, -1.0f, -1.0f);
>>       /* Left side of cube */
>>       glColor3f(0.0f, 1.0f, 1.0f);
>>       glVertex3f(-1.0f, 1.0f, 1.0f);
>>       glVertex3f(-1.0f, 1.0f, -1.0f);
>>       glVertex3f(-1.0f, -1.0f, -1.0f);
>>       glVertex3f(-1.0f, -1.0f, 1.0f);
>>    glEnd();
>>    
>>    /* Restore the previous transform matrices */
>>    glPopAttrib();
>>    glMatrixMode(GL_PROJECTION);
>>    glPopMatrix();
>>    glMatrixMode(GL_MODELVIEW);
>>    glPopMatrix();
>>    
>>    if (_rotate)
>>       rot += 1.0;
>> }
>>     

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to