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).

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.

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;
>>> }
>>>       

-------------------------------------------------------------------------
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

Reply via email to