Hello,

On Thu, Feb 19, 2015 at 11:40:00AM +0000, Oleksandr Shcherbina wrote:
> 
>    it is strange because,  I did git pull and make efl an hour before. It is
>    all right.
> 
>    Do you turn additional confugure keys?

"make all" works.

The problem is while running "make distcheck".

> 
> 
>    ------- Original Message -------
> 
>    Sender : marcel-hollerb...@t-online.de<marcel-hollerb...@t-online.de>
> 
>    Date : Feb 19, 2015 14:20 (GMT+03:00)
> 
>    Title  : Re: [E-devel] [EGIT] [core/efl] master 01/07: evas: Evas_3D -
>    refactor shader system.
> 
> 
>    Hello,
>    I am getting the same error.
>    On Thu, Feb 19, 2015 at 10:28:01AM +0200, Daniel Hirt wrote:
>    > Hello,
>    >
>    > A small FYI from out-of-tree builder, this broke distcheck:
>    >
>    >   make[3]: *** No rule to make target
>    > 'modules/evas/engines/gl_common/shader_3d/vertex_color_vert.shd', needed
>    > by 'modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x'.  
> Stop.
>    >
>    > Maybe something went wrong with Makefile_Evas.am changes...
>    >
>    > On 02/18/2015 11:43 PM, Dmytro Dadyka wrote:
>    > > cedric pushed a commit to branch master.
>    > >
>    > >
>    
> http://git.enlightenment.org/core/efl.git/commit/?id=b9b5ced501f4642f03d8bcc
>    8441fd3f7b55a7f52
>    > >
>    > > commit b9b5ced501f4642f03d8bcc8441fd3f7b55a7f52
>    > > Author: Dmytro Dadyka
>    > > Date:   Wed Feb 18 21:19:28 2015 +0100
>    > >
>    > >     evas: Evas_3D - refactor shader system.
>    > >
>    > >     Reviewers: Hermet, raster, jpeg, cedric
>    > >
>    > >     Subscribers: artem.popov, cedric
>    > >
>    > >     Differential Revision: https://phab.enlightenment.org/D1947
>    > >
>    > >     Signed-off-by: Cedric BAIL
>    > > ---
>    > >  .gitignore                                         |    1 +
>    > >  src/Makefile_Evas.am                               |   30 +
>    > >  src/modules/evas/engines/gl_common/evas_gl_3d.c    |    7 +-
>    > >  .../evas/engines/gl_common/evas_gl_3d_private.h    |   27 +-
>    >    >  .../evas/engines/gl_common/evas_gl_3d_shader.c        |   1097
>    +-------------------
>    > >  .../gl_common/shader_3d/color_pick_frag.shd        |    7 +
>    > >  .../gl_common/shader_3d/color_pick_vert.shd        |   28 +
>    > >  .../engines/gl_common/shader_3d/diffuse_frag.shd   |   47 +
>    > >  .../engines/gl_common/shader_3d/diffuse_vert.shd   |   52 +
>    > >  .../evas/engines/gl_common/shader_3d/flat_frag.shd |  195 ++++
>    > >  .../evas/engines/gl_common/shader_3d/flat_vert.shd |  154 +++
>    > >  .../engines/gl_common/shader_3d/gen_shaders_3d.sh  |   45 +
>    > >  .../gl_common/shader_3d/normal_map_frag.shd        |  283 +++++
>    > >  .../gl_common/shader_3d/normal_map_vert.shd        |  189 ++++
>    > >  .../engines/gl_common/shader_3d/phong_frag.shd     |  235 +++++
>    > >  .../engines/gl_common/shader_3d/phong_vert.shd     |  116 +++
>    > >  .../gl_common/shader_3d/shadow_map_frag.shd        |    4 +
>    > >  .../gl_common/shader_3d/shadow_map_vert.shd        |   28 +
>    > >  .../gl_common/shader_3d/vertex_color_frag.shd      |   20 +
>    > >  .../gl_common/shader_3d/vertex_color_vert.shd      |   50 +
>    > >  20 files changed, 1553 insertions(+), 1062 deletions(-)
>    > >
>    > > diff --git a/.gitignore b/.gitignore
>    > > index 4f04840..96345bf 100644
>    > > --- a/.gitignore
>    > > +++ b/.gitignore
>    > > @@ -67,4 +67,5 @@ tags
>    > >  /config.rpath
>    > >  /coverage
>    > >  /src/lib/ecore_x/ecore_x_vsync
>    > > +/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x
>    > >  Session.vim
>    > > diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
>    > > index 0651d7f..3cfbced 100644
>    > > --- a/src/Makefile_Evas.am
>    > > +++ b/src/Makefile_Evas.am
>    > > @@ -586,6 +586,7 @@ modules/evas/engines/gl_common/evas_gl_api.c \
>    > >  modules/evas/engines/gl_common/evas_gl_api_gles1.c \
>    > >  modules/evas/engines/gl_common/evas_gl_api_ext.c \
>    > >  modules/evas/engines/gl_common/shader/evas_gl_shaders.x \
>    > > +modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x \
>    > >  modules/evas/engines/gl_common/shader/evas_gl_enum.x
>    > >
>    > >  # 3D
>    > > @@ -729,6 +730,35 @@
>    modules/evas/engines/gl_common/shader/evas_gl_shaders.x:
>    modules/evas/engines/gl
>    > >
>    >             >  modules/evas/engines/gl_common/shader/evas_gl_enum.x:
>    modules/evas/engines/gl_common/shader/evas_gl_shaders.x
>    > >
>    > > +# NOTE: order here should be equal with modes in file Evas_Eo.h
>    > > +GL_SHADERS_3D_GEN = \
>    > > +modules/evas/engines/gl_common/shader_3d/vertex_color_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/vertex_color_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/diffuse_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/diffuse_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/flat_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/flat_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/phong_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/phong_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/normal_map_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/shadow_map_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/shadow_map_frag.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/color_pick_vert.shd \
>    > > +modules/evas/engines/gl_common/shader_3d/color_pick_frag.shd \
>    > > +$(NULL)
>    > > +
>    > > +EXTRA_DIST += \
>    > > +modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    > > +
>    > > +BUILT_SOURCES += \
>    > > +modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x
>    > > +
>    >   >  +modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x:
>    modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    $(GL_SHADERS_3D_GEN)
>    > > + @echo "  SHADERS_3D  $@"
>    >   >   +  @modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    $(GL_SHADERS_3D_GEN)
>    > > +
>    > > +
>    > >  GL_GENERIC_SOURCES = \
>    > >  modules/evas/engines/gl_generic/evas_engine.c \
>    > >  modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
>    >   >   diff  --git  a/src/modules/evas/engines/gl_common/evas_gl_3d.c
>    b/src/modules/evas/engines/gl_common/evas_gl_3d.c
>    > > index b1b277d..403aea6 100644
>    > > --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c
>    > > +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c
>    > > @@ -1144,13 +1144,10 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
>    > >       }
>    > >
>    > >     if (pdmesh->shadowed)
>    > > -        data->flags |= E3D_SHADER_FLAG_SHADOWED;
>    > > +     data->flags |= E3D_SHADER_FLAG_SHADOWED;
>    > >
>    > >     if (pdmesh->color_pick_enabled)
>    > > -     {
>    > > -        data->flags |= E3D_SHADER_FLAG_COLOR_PICK_ENABLED;
>    > > -        data->color_pick_key = pdmesh->color_pick_key;
>    > > -     }
>    > > +     data->color_pick_key = pdmesh->color_pick_key;
>    > >
>    > >     data->blending = pdmesh->blending;
>    > >     data->blend_sfactor = pdmesh->blend_sfactor;
>    > > diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h
>    b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h
>    > > index 6d956f5..78ddc42 100644
>    > > --- a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h
>    > > +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h
>    > > @@ -7,6 +7,7 @@ typedef struct _E3D_Program   E3D_Program;
>    > >  typedef struct _E3D_Draw_Data E3D_Draw_Data;
>    > >  typedef unsigned long         E3D_Shader_Flag;
>    > >
>    >  >  +//  NOTE:  order  here  should be equal with flag names in file
>    evas_gl_3d_shader.c
>    > >  #define E3D_SHADER_FLAG_NORMALIZE_NORMALS       (1 << 0)
>    > >  #define E3D_SHADER_FLAG_VERTEX_POSITION         (1 << 1)
>    > >  #define E3D_SHADER_FLAG_VERTEX_POSITION_BLEND   (1 << 2)
>    > > @@ -25,19 +26,19 @@ typedef unsigned long         E3D_Shader_Flag;
>    > >  #define E3D_SHADER_FLAG_DIFFUSE                 (1 << 15)
>    > >  #define E3D_SHADER_FLAG_SPECULAR                (1 << 16)
>    > >  #define E3D_SHADER_FLAG_EMISSION                (1 << 17)
>    > > -#define E3D_SHADER_FLAG_DIFFUSE_TEXTURE         (1 << 19)
>    > > -#define E3D_SHADER_FLAG_AMBIENT_TEXTURE         (1 << 20)
>    > > -#define E3D_SHADER_FLAG_SPECULAR_TEXTURE        (1 << 21)
>    > > -#define E3D_SHADER_FLAG_EMISSION_TEXTURE        (1 << 22)
>    > > -#define E3D_SHADER_FLAG_NORMAL_TEXTURE          (1 << 23)
>    > > -#define E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND   (1 << 24)
>    > > -#define E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND   (1 << 25)
>    > > -#define E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND  (1 << 26)
>    > > -#define E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND  (1 << 27)
>    > > -#define E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND    (1 << 28)
>    > > -#define E3D_SHADER_FLAG_FOG_ENABLED             (1 << 29)
>    > > -#define E3D_SHADER_FLAG_SHADOWED                (1 << 30)
>    > > -#define E3D_SHADER_FLAG_COLOR_PICK_ENABLED      (1 << 31)
>    > > +#define E3D_SHADER_FLAG_DIFFUSE_TEXTURE         (1 << 18)
>    > > +#define E3D_SHADER_FLAG_AMBIENT_TEXTURE         (1 << 19)
>    > > +#define E3D_SHADER_FLAG_SPECULAR_TEXTURE        (1 << 20)
>    > > +#define E3D_SHADER_FLAG_EMISSION_TEXTURE        (1 << 21)
>    > > +#define E3D_SHADER_FLAG_NORMAL_TEXTURE          (1 << 22)
>    > > +#define E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND   (1 << 23)
>    > > +#define E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND   (1 << 24)
>    > > +#define E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND  (1 << 25)
>    > > +#define E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND  (1 << 26)
>    > > +#define E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND    (1 << 27)
>    > > +#define E3D_SHADER_FLAG_FOG_ENABLED             (1 << 28)
>    > > +#define E3D_SHADER_FLAG_SHADOWED                (1 << 29)
>    > > +#define E3D_SHADER_FLAG_COUNT                    30
>    > >
>    > >  static inline Eina_Bool
>    > >  _flags_need_tex_coord(E3D_Shader_Flag flags)
>    > > diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
>    b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
>    > > index 757b265..4f8fced 100644
>    > > --- a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
>    > > +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
>    > > @@ -1,4 +1,5 @@
>    > >  #include "evas_gl_3d_private.h"
>    > > +#include "shader_3d/evas_gl_3d_shaders.x"
>    > >
>    > >  typedef enum _E3D_Uniform
>    > >  {
>    > > @@ -54,6 +55,40 @@ typedef enum _E3D_Uniform
>    > >     E3D_UNIFORM_COUNT,
>    > >  } E3D_Uniform;
>    > >
>    > > +static const char *shader_flag_names[] =
>    > > +{
>    > > +   "NORMALIZE_NORMALS",
>    > > +   "VERTEX_POSITION",
>    > > +   "VERTEX_POSITION_BLEND",
>    > > +   "VERTEX_NORMAL",
>    > > +   "VERTEX_NORMAL_BLEND",
>    > > +   "VERTEX_TANGENT",
>    > > +   "VERTEX_TANGENT_BLEND",
>    > > +   "VERTEX_COLOR",
>    > > +   "VERTEX_COLOR_BLEND",
>    > > +   "VERTEX_TEXCOORD",
>    > > +   "VERTEX_TEXCOORD_BLEND",
>    > > +   "LIGHT_DIRECTIONAL",
>    > > +   "LIGHT_SPOT",
>    > > +   "LIGHT_ATTENUATION",
>    > > +   "AMBIENT",
>    > > +   "DIFFUSE",
>    > > +   "SPECULAR",
>    > > +   "EMISSION",
>    > > +   "DIFFUSE_TEXTURE",
>    > > +   "AMBIENT_TEXTURE",
>    > > +   "SPECULAR_TEXTURE",
>    > > +   "EMISSION_TEXTURE",
>    > > +   "NORMAL_TEXTURE",
>    > > +   "DIFFUSE_TEXTURE_BLEND",
>    > > +   "AMBIENT_TEXTURE_BLEND",
>    > > +   "SPECULAR_TEXTURE_BLEND",
>    > > +   "EMISSION_TEXTURE_BLEND",
>    > > +   "NORMAL_TEXTURE_BLEND",
>    > > +   "FOG_ENABLED",
>    > > +   "SHADOWED"
>    > > +};
>    > > +
>    > >  typedef struct _E3D_Shader_String
>    > >  {
>    > >     char *str;
>    >  > @@ -117,1050 +152,21 @@ void _shader_string_add(E3D_Shader_String
>    *shader, const char *str)
>    > >     shader->count += len;
>    > >  }
>    > >
>    > > -#define ADD_LINE(str)   _shader_string_add(shader, str"\n")
>    > > -
>    > > -static void
>    > > -_vertex_shader_string_variable_add(E3D_Shader_String *shader,
>    >   >   -                                    Evas_3D_Shade_Mode  mode,
>    E3D_Shader_Flag flags)
>    > > -{
>    > > -   ADD_LINE("uniform mat4  uMatrixMvp;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("uniform mat4 uMatrixLight;");
>    > > -        ADD_LINE("varying vec4 lpos;");
>    > > -     }
>    > > -
>    > > -   /* Vertex attributes. */
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_POSITION)
>    > > -     ADD_LINE("attribute   vec4  aPosition0;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_POSITION_BLEND)
>    > > -     {
>    > > -        ADD_LINE("attribute   vec4  aPosition1;");
>    > > -        ADD_LINE("uniform     float uPositionWeight;");
>    > > -     }
>    > > -
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER) return;
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_NORMAL)
>    > > -     ADD_LINE("attribute   vec4  aNormal0;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_NORMAL_BLEND)
>    > > -     {
>    > > -        ADD_LINE("attribute   vec4  aNormal1;");
>    > > -        ADD_LINE("uniform     float uNormalWeight;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TANGENT)
>    > > -     ADD_LINE("attribute   vec4  aTangent0;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TANGENT_BLEND)
>    > > -     {
>    > > -        ADD_LINE("attribute   vec4  aTangent1;");
>    > > -        ADD_LINE("uniform     float uTangentWeight;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_COLOR)
>    > > -     ADD_LINE("attribute   vec4  aColor0;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_COLOR_BLEND)
>    > > -     {
>    > > -        ADD_LINE("attribute   vec4  aColor1;");
>    > > -        ADD_LINE("uniform     float uColorWeight;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD)
>    > > -     ADD_LINE("attribute   vec4  aTexCoord0;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD_BLEND)
>    > > -     {
>    > > -        ADD_LINE("attribute   vec4  aTexCoord1;");
>    > > -        ADD_LINE("uniform     float uTexCoordWeight;");
>    > > -     }
>    > > -
>    > > -   /* Texture coordinate. */
>    > > -   if (_flags_need_tex_coord(flags))
>    > > -     ADD_LINE("varying vec2 vTexCoord;");
>    > > -
>    > > -   /* Variables for each shade modes. */
>    > > -   if (mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
>    > > -     {
>    > > -        ADD_LINE("varying     vec4  vColor;");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_DIFFUSE)
>    > > -     {
>    > > -        /* Nothing to declare. */
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     {
>    > > -        ADD_LINE("uniform   mat3  uMatrixNormal;");
>    > > -        ADD_LINE("uniform   mat4  uMatrixModelview;");
>    > > -        ADD_LINE("uniform   vec4  uLightPosition;");
>    > > -
>    > > -        ADD_LINE("varying   vec2  vFactor;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_SPOT)
>    > > -          {
>    > > -             ADD_LINE("uniform   vec3  uLightSpotDir;");
>    > > -             ADD_LINE("uniform   float uLightSpotExp;");
>    > > -             ADD_LINE("uniform   float uLightSpotCutoffCos;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -          ADD_LINE("uniform float   uMaterialShininess;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -          ADD_LINE("uniform   vec3  uLightAtten;");
>    > > -   }
>    >  >  -    else  if  (mode  ==  EVAS_3D_SHADE_MODE_PHONG  ||  mode  ==
>    EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     {
>    > > -        ADD_LINE("uniform  mat3  uMatrixNormal;");
>    > > -        ADD_LINE("uniform  mat4  uMatrixModelview;");
>    > > -        ADD_LINE("uniform  vec4  uLightPosition;");
>    > > -        ADD_LINE("varying  vec3  vLightVector;");
>    > > -        ADD_LINE("varying  vec3  vLightHalfVector;");
>    > > -
>    > > -       if (mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -          ADD_LINE("varying  vec3  vEyeVector;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -          ADD_LINE("varying  float vLightDist;");
>    > > -
>    >   >  -        if  (mode  ==  EVAS_3D_SHADE_MODE_PHONG  ||  (flags  &
>    E3D_SHADER_FLAG_VERTEX_TANGENT) == 0)
>    > > -          ADD_LINE("varying   vec3  vNormal;");
>    > > -     }
>    > > -}
>    > > -
>    > > -static void
>    > > -_vertex_shader_string_func_flat_add(E3D_Shader_String *shader,
>    >   >   -                                    Evas_3D_Shade_Mode   mode
>    EINA_UNUSED, E3D_Shader_Flag flags)
>    > > -{
>    > > -   ADD_LINE("void vertexFlat(vec4 position, vec3 normal) {");
>    > > -
>    > > -   ADD_LINE("vec3  lv;");
>    > > -   ADD_LINE("float factor;");
>    > > -
>    > > -   ADD_LINE("normal = uMatrixNormal * normal;");
>    > > -   ADD_LINE("position = uMatrixModelview * position;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_NORMALIZE_NORMALS)
>    > > -     ADD_LINE("normal = normalize(normal);");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_DIRECTIONAL)
>    > > -     {
>    > > -        ADD_LINE("lv = uLightPosition.xyz;");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("lv = uLightPosition.xyz - position.xyz;");
>    > > -        ADD_LINE("lv = normalize(lv);");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("factor = max(dot(lv, normal), 0.0);");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_SPOT)
>    > > -     {
>    > > -        ADD_LINE("float f = dot(-lv, uLightSpotDir);");
>    > > -        ADD_LINE("if (f > uLightSpotCutoffCos)");
>    > > -        ADD_LINE("factor *= pow(f, uLightSpotExp);");
>    > > -        ADD_LINE("else");
>    > > -        ADD_LINE("factor = 0.0;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("if (factor > 0.0) {");
>    > > -
>    > > -   /* Diffuse term. */
>    > > -   if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -     ADD_LINE("vFactor.x = factor;");
>    > > -   else
>    > > -     ADD_LINE("vFactor.x = 0.0;");
>    > > -
>    > > -   /* Specular term. */
>    > > -   if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -     {
>    > > -        ADD_LINE("vec3  hv = normalize(normalize(-position.xyz) +
>    lv);");
>    >   >   -        ADD_LINE("factor  =  pow(max(dot(hv,  normal),  0.0),
>    uMaterialShininess);");
>    > > -        ADD_LINE("vFactor.y = factor;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("} else {");
>    > > -   ADD_LINE("vFactor = vec2(0.0, 0.0);");
>    > > -   ADD_LINE("}");
>    > > -
>    > > -   /* Light attenuation. */
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -     {
>    > > -        ADD_LINE("float dist = length(lv);");
>    > > -        ADD_LINE("vFactor /= dot(uLightAtten, vec3(1.0, dist, dist *
>    dist));");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_vertex_shader_string_func_phong_add(E3D_Shader_String *shader,
>    >   >  -                                      Evas_3D_Shade_Mode  mode
>    EINA_UNUSED, E3D_Shader_Flag flags)
>    > > -{
>    > > -   ADD_LINE("void vertexPhong(vec4 position, vec3 normal) {");
>    > > -
>    > > -   ADD_LINE("normal = uMatrixNormal * normal;");
>    > > -   ADD_LINE("position = uMatrixModelview * position;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_NORMALIZE_NORMALS)
>    > > -     ADD_LINE("normal = normalize(normal);");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_DIRECTIONAL)
>    > > -     {
>    > > -        ADD_LINE("vLightVector = uLightPosition.xyz;");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("vLightVector = uLightPosition.xyz - position.xyz;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -          ADD_LINE("vLightDist = length(vLightVector);");
>    > > -
>    > > -        ADD_LINE("vLightVector = normalize(vLightVector);");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("vLightHalfVector = normalize(normalize(-position.xyz) +
>    vLightVector);");
>    > > -   ADD_LINE("vNormal = normal;");
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_vertex_shader_string_func_normal_map_add(E3D_Shader_String *shader,
>    > > -                                          Evas_3D_Shade_Mode mode
>    EINA_UNUSED,
>    > > -                                          E3D_Shader_Flag flags)
>    > > -{
>    > > -   if ((flags & E3D_SHADER_FLAG_VERTEX_TANGENT) == 0)
>    > > -     {
>    > > -        ADD_LINE("void vertexNormalMap(vec4 position, vec3 normal) 
> {");
>    > > -
>    > > -        ADD_LINE("normal = uMatrixNormal * normal;");
>    > > -        ADD_LINE("position = uMatrixModelview * position;");
>    > > -        ADD_LINE("vEyeVector = normalize(-position.xyz);");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_NORMALIZE_NORMALS)
>    > > -          ADD_LINE("normal = normalize(normal);");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_DIRECTIONAL)
>    > > -          {
>    > > -             ADD_LINE("vLightVector = uLightPosition.xyz;");
>    > > -          }
>    > > -        else
>    > > -          {
>    >   >  -              ADD_LINE("vLightVector  =  uLightPosition.xyz  -
>    position.xyz;");
>    > > -
>    > > -             if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -               ADD_LINE("vLightDist = length(vLightVector);");
>    > > -
>    > > -             ADD_LINE("vLightVector = normalize(vLightVector);");
>    > > -          }
>    > > -
>    >   >  -        ADD_LINE("vLightHalfVector  =  normalize(vEyeVector  +
>    vLightVector);");
>    > > -        ADD_LINE("vNormal = normal;");
>    > > -        ADD_LINE("}");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("void vertexNormalMap(vec4 position, vec3 normal, 
> vec3
>    tangent) {");
>    > > -
>    > > -        ADD_LINE("vec3 n = normalize(uMatrixNormal * normal);");
>    > > -        ADD_LINE("vec3 t = normalize(uMatrixNormal * tangent);");
>    > > -        ADD_LINE("vec3 b = cross(n, t);");
>    > > -        ADD_LINE("vec3 tmp;");
>    > > -
>    > > -        ADD_LINE("position = uMatrixModelview * position;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_DIRECTIONAL)
>    > > -          {
>    > > -             ADD_LINE("vec3 lightDir = uLightPosition.xyz;");
>    > > -          }
>    > > -        else
>    > > -          {
>    >  >  -              ADD_LINE("vec3  lightDir  =  uLightPosition.xyz -
>    position.xyz;");
>    > > -
>    > > -             if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -               ADD_LINE("vLightDist = length(lightDir);");
>    > > -
>    > > -             ADD_LINE("lightDir = normalize(lightDir);");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("tmp.x = dot(lightDir, t);");
>    > > -        ADD_LINE("tmp.y = dot(lightDir, b);");
>    > > -        ADD_LINE("tmp.z = dot(lightDir, n);");
>    > > -        ADD_LINE("vLightVector = tmp;");
>    > > -
>    > > -        ADD_LINE("tmp.x = dot(position.xyz, t);");
>    > > -        ADD_LINE("tmp.y = dot(position.xyz, b);");
>    > > -        ADD_LINE("tmp.z = dot(position.xyz, n);");
>    > > -        ADD_LINE("vEyeVector = normalize(tmp);");
>    > > -
>    >  > -        ADD_LINE("vec3 hv = normalize(normalize(-position.xyz) +
>    lightDir);");
>    > > -        ADD_LINE("tmp.x = dot(hv, t);");
>    > > -        ADD_LINE("tmp.y = dot(hv, b);");
>    > > -        ADD_LINE("tmp.z = dot(hv, n);");
>    > > -        ADD_LINE("vLightHalfVector = tmp;");
>    > > -
>    > > -        ADD_LINE("}");
>    > > -     }
>    > > -}
>    > > -
>    > > -static void
>    > > -_vertex_shader_string_get(E3D_Shader_String *shader,
>    > > -                          Evas_3D_Shade_Mode mode, E3D_Shader_Flag
>    flags)
>    > > -{
>    > > -   /* Add variables - vertex attributes. */
>    > > -   _vertex_shader_string_variable_add(shader, mode, flags);
>    > > -
>    > > -   /* Add functions. */
>    > > -   if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     _vertex_shader_string_func_flat_add(shader, mode, flags);
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_PHONG)
>    > > -     _vertex_shader_string_func_phong_add(shader, mode, flags);
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     _vertex_shader_string_func_normal_map_add(shader, mode, flags);
>    > > -
>    > > -   ADD_LINE("void main() {");
>    > > -
>    > > -   /* Process vertex attributes. */
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_POSITION_BLEND)
>    > > -     {
>    > > -        ADD_LINE("vec4 position = aPosition0 * uPositionWeight + ");
>    > > -        ADD_LINE("aPosition1 * (1.0 - uPositionWeight);");
>    > > -        ADD_LINE("position = vec4(position.xyz, 1.0);");
>    > > -     }
>    > > -   else if (flags & E3D_SHADER_FLAG_VERTEX_POSITION)
>    > > -     {
>    > > -        ADD_LINE("vec4 position = vec4(aPosition0.xyz, 1.0);");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_NORMAL_BLEND)
>    > > -     {
>    > > -        ADD_LINE("vec3 normal = aNormal0.xyz * uNormalWeight + ");
>    > > -        ADD_LINE("aNormal1.xyz * (1.0 - uNormalWeight);");
>    > > -     }
>    > > -   else if (flags & E3D_SHADER_FLAG_VERTEX_NORMAL)
>    > > -     {
>    > > -        ADD_LINE("vec3 normal = aNormal0.xyz;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TANGENT_BLEND)
>    > > -     {
>    > > -        ADD_LINE("vec3 tangent = aTangent0.xyz * uTangentWeight + ");
>    > > -        ADD_LINE("aTangent1.xyz * (1.0 - uTangentWeight);");
>    > > -     }
>    > > -   else if (flags & E3D_SHADER_FLAG_VERTEX_TANGENT)
>    > > -     {
>    > > -        ADD_LINE("vec3 tangent = aTangent0.xyz;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_COLOR_BLEND)
>    > > -     {
>    > > -        ADD_LINE("vec4 color = aColor0 * uColorWeight + aColor1 * (1.0
>    - uColorWeight);");
>    > > -     }
>    > > -   else if (flags & E3D_SHADER_FLAG_VERTEX_COLOR)
>    > > -     {
>    > > -        ADD_LINE("vec4 color = aColor0;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD_BLEND)
>    > > -     {
>    > > -        ADD_LINE("vTexCoord = aTexCoord0.st * uTexCoordWeight + ");
>    > > -        ADD_LINE("aTexCoord1.st * (1.0 - uTexCoordWeight);");
>    > > -     }
>    > > -   else if (flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD)
>    > > -     {
>    > > -        ADD_LINE("vTexCoord = aTexCoord0.st;");
>    > > -     }
>    > > -
>    > > -   /* Transform vertex position. */
>    > > -   ADD_LINE("gl_Position = uMatrixMvp * position;");
>    > > -
>    > > -   /* Process according to the shade mode. */
>    > > -   if (mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
>    > > -     {
>    > > -        ADD_LINE("vColor = color;");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     {
>    > > -        ADD_LINE("vertexFlat(position, normal);");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_PHONG)
>    > > -     {
>    > > -        ADD_LINE("vertexPhong(position, normal);");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_VERTEX_TANGENT)
>    > > -          ADD_LINE("vertexNormalMap(position, normal, tangent);");
>    > > -        else
>    > > -          ADD_LINE("vertexNormalMap(position, normal);");
>    > > -     }
>    > > -
>    > > -     if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("lpos = uMatrixLight * position;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_variable_add(E3D_Shader_String *shader,
>    >  >  -                                      Evas_3D_Shade_Mode  mode,
>    E3D_Shader_Flag flags)
>    > > -{
>    > > -   /* Texture coordinate. */
>    > > -   if (_flags_need_tex_coord(flags))
>    > > -     ADD_LINE("varying vec2   vTexCoord;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_FOG_ENABLED)
>    > > -     {
>    > > -        ADD_LINE("uniform float uFogFactor;");
>    > > -        ADD_LINE("uniform vec4  uFogColor;");
>    > > -     }
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("varying vec4 lpos;");
>    > > -        ADD_LINE("uniform sampler2D uShadowMap;");
>    > > -     }
>    > > -
>    > > - if (flags & E3D_SHADER_FLAG_COLOR_PICK_ENABLED)
>    > > -   ADD_LINE("uniform float uColorPick;");
>    > > -
>    > > -   /* Materials. */
>    > > -   if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -     {
>    > > -        ADD_LINE("uniform   vec4        uMaterialDiffuse;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureDiffuse0;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureDiffuse1;");
>    > > -             ADD_LINE("uniform float      uTextureDiffuseWeight;");
>    > > -          }
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -     {
>    > > -        ADD_LINE("uniform  vec4        uMaterialSpecular;");
>    > > -        ADD_LINE("uniform  float       uMaterialShininess;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureSpecular0;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureSpecular1;");
>    > > -             ADD_LINE("uniform float      uTextureSpecularWeight;");
>    > > -          }
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -     {
>    > > -        ADD_LINE("uniform  vec4        uMaterialAmbient;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureAmbient0;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureAmbient1;");
>    > > -             ADD_LINE("uniform float      uTextureAmbientWeight;");
>    > > -          }
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_EMISSION)
>    > > -     {
>    > > -        ADD_LINE("uniform vec4       uMaterialEmission;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureEmission0;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("uniform sampler2D  uTextureEmission1;");
>    > > -             ADD_LINE("uniform float      uTextureEmissionWeight;");
>    > > -          }
>    > > -     }
>    > > -
>    > > -   if (mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
>    > > -     {
>    > > -        ADD_LINE("varying  vec4        vColor;");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_DIFFUSE)
>    > > -     {
>    > > -        /* Nothing to declare. */
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     {
>    > > -        ADD_LINE("varying vec2   vFactor;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -          ADD_LINE("uniform   vec4        uLightDiffuse;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -          ADD_LINE("uniform  vec4        uLightSpecular;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -          ADD_LINE("uniform  vec4        uLightAmbient;");
>    > > -     }
>    >  >  -    else  if  (mode  ==  EVAS_3D_SHADE_MODE_PHONG  ||  mode  ==
>    EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     {
>    > > -        ADD_LINE("varying  vec3        vLightVector;");
>    > > -        ADD_LINE("varying  vec3        vLightHalfVector;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_SPOT)
>    > > -          {
>    > > -             ADD_LINE("uniform   vec3  uLightSpotDir;");
>    > > -             ADD_LINE("uniform   float uLightSpotExp;");
>    > > -             ADD_LINE("uniform   float uLightSpotCutoffCos;");
>    > > -          }
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -          ADD_LINE("uniform   vec4     uLightDiffuse;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -          ADD_LINE("uniform   vec4     uLightSpecular;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -          ADD_LINE("uniform   vec4     uLightAmbient;");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -          ADD_LINE("varying   float    vLightDist;");
>    > > -
>    > > -        if (mode == EVAS_3D_SHADE_MODE_PHONG)
>    > > -          {
>    > > -             ADD_LINE("varying  vec3        vNormal;");
>    > > -          }
>    > > -        else /* Normal map. */
>    > > -          {
>    > > -             ADD_LINE("uniform  sampler2D   uTextureNormal0;");
>    > > -
>    > > -             if (flags & E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND)
>    > > -               {
>    > > -                  ADD_LINE("uniform  sampler2D  uTextureNormal1;");
>    > >
>    -                  ADD_LINE("uniform  float      uTextureNormalWeight;");
>    > > -               }
>    > > -
>    > > -             ADD_LINE("varying  vec3        vEyeVector;");
>    > > -
>    > > -            if ((flags & E3D_SHADER_FLAG_VERTEX_TANGENT) == 0)
>    > > -              ADD_LINE("varying  vec3        vNormal;");
>    > > -          }
>    > > -     }
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_func_flat_add(E3D_Shader_String *shader,
>    >   >  -                                      Evas_3D_Shade_Mode  mode
>    EINA_UNUSED, E3D_Shader_Flag flags)
>    > > -{
>    > > -   ADD_LINE("void fragmentFlat() {");
>    > > -   ADD_LINE("vec4 color;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureDiffuse0, vTexCoord) 
> *
>    uTextureDiffuseWeight +");
>    > > -             ADD_LINE("texture2D(uTextureDiffuse1, vTexCoord) * (1.0 -
>    uTextureDiffuseWeight);");
>    > > -             ADD_LINE("color *= uMaterialDiffuse;");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureDiffuse0, vTexCoord) 
> *
>    uMaterialDiffuse;");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialDiffuse;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor = uLightDiffuse * color * vFactor.x;");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureSpecular0, vTexCoord)
>    * uTextureSpecularWeight +");
>    > > -             ADD_LINE("texture2D(uTextureSpecular1, vTexCoord) * (1.0 
> -
>    uTextureSpecularWeight);");
>    > > -             ADD_LINE("color *= uMaterialSpecular;");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureSpecular0, vTexCoord)
>    * uMaterialSpecular;");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialSpecular;");
>    > > -          }
>    > > -
>    >  >  -        ADD_LINE("gl_FragColor  +=  uLightSpecular  *  color  *
>    vFactor.y;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor *= shadow;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureAmbient0, vTexCoord) 
> *
>    uTextureAmbientWeight +");
>    > > -             ADD_LINE("texture2D(uTextureAmbient1, vTexCoord) * (1.0 -
>    uTextureAmbientWeight);");
>    > > -             ADD_LINE("color *= uMaterialAmbient;");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureAmbient0, vTexCoord) 
> *
>    uMaterialAmbient;");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialAmbient;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += uLightAmbient * color;");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_EMISSION)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureEmission0, vTexCoord)
>    * uTextureEmissionWeight +");
>    > > -             ADD_LINE("texture2D(uTextureEmission1, vTexCoord) * (1.0 
> -
>    uTextureEmissionWeight);");
>    > > -             ADD_LINE("color *= uMaterialEmission;");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureEmission0, vTexCoord)
>    * uMaterialEmission;");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialEmission;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += color;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_func_phong_add(E3D_Shader_String *shader,
>    >  >  -                                        Evas_3D_Shade_Mode mode
>    EINA_UNUSED, E3D_Shader_Flag flags)
>    > > -{
>    > > -   ADD_LINE("void fragmentPhong() {");
>    > > -   ADD_LINE("vec3  normal = normalize(vNormal);");
>    > > -   ADD_LINE("vec3  lv = normalize(vLightVector);");
>    > > -   ADD_LINE("float factor = dot(lv, normal);");
>    > > -   ADD_LINE("vec4  color;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_SPOT)
>    > > -     {
>    > > -        ADD_LINE("float f = dot(-lv, normalize(uLightSpotDir));");
>    > > -
>    > > -        ADD_LINE("if (f > uLightSpotCutoffCos)");
>    > > -        ADD_LINE("factor *= pow(f, uLightSpotExp);");
>    > > -        ADD_LINE("else");
>    > > -        ADD_LINE("factor = 0.0;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("if (factor > 0.0) {");
>    > > -
>    > > -   /* Diffuse term. */
>    > > -   if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureDiffuse0, vTexCoord) 
> *
>    uTextureDiffuseWeight +");
>    > > -             ADD_LINE("texture2D(uTextureDiffuse1, vTexCoord) * (1.0 -
>    uTextureDiffuseWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE)
>    > > -          {
>    >   >   -              ADD_LINE("color  =  texture2D(uTextureDiffuse0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialDiffuse;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor = uLightDiffuse * color * factor;");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);");
>    > > -     }
>    > > -
>    > > -   /* Specular term. */
>    > > -   if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -     {
>    > > -        ADD_LINE("factor = dot(normalize(vLightHalfVector), 
> normal);");
>    > > -        ADD_LINE("if (factor > 0.0) {");
>    > > -        ADD_LINE("factor = pow(factor, uMaterialShininess);");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureSpecular0, vTexCoord)
>    * uTextureSpecularWeight +");
>    > > -             ADD_LINE("texture2D(uTextureSpecular1, vTexCoord) * (1.0 
> -
>    uTextureSpecularWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE)
>    > > -          {
>    >   >  -              ADD_LINE("color  =  texture2D(uTextureSpecular0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialSpecular;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += uLightSpecular * color * factor;");
>    > > -        ADD_LINE("}");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("} else {");
>    > > -   ADD_LINE("gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);");
>    > > -   ADD_LINE("}");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor *= shadow;");
>    > > -     }
>    > > -
>    > > -   /* Ambient term. */
>    > > -   if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureAmbient0, vTexCoord) 
> *
>    uTextureAmbientWeight +");
>    > > -             ADD_LINE("texture2D(uTextureAmbient1 * vTexCoord) * (1.0 
> -
>    uTextureAmbientWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE)
>    > > -          {
>    >   >   -              ADD_LINE("color  =  texture2D(uTextureAmbient0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialAmbient;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += uLightAmbient * color;");
>    > > -     }
>    > > -
>    > > -   /* Light attenuation. */
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -     ADD_LINE("gl_FragColor /= dot(uLightAtten, vec3(1.0, vLightDist,
>    vLightDist * vLightDist));");
>    > > -
>    > > -   /* Emission term. */
>    > > -   if (flags & E3D_SHADER_FLAG_EMISSION)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureEmission0, vTexCoord)
>    * uTextureEmissionWeight +");
>    > > -             ADD_LINE("texture2D(uTextureEmission1, vTexCoord) * (1.0 
> -
>    uTextureEmissionWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE)
>    > > -          {
>    >   >  -              ADD_LINE("color  =  texture2D(uTextureEmission0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialEmission;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += color;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_func_normal_map_add(E3D_Shader_String *shader,
>    > > -                                            Evas_3D_Shade_Mode mode
>    EINA_UNUSED,
>    > > -                                            E3D_Shader_Flag flags)
>    > > +void _shader_flags_add(E3D_Shader_String *shader, E3D_Shader_Flag
>    flags)
>    > >  {
>    > > -   if ((flags & E3D_SHADER_FLAG_VERTEX_TANGENT) == 0)
>    > > -     {
>    > > -        ADD_LINE("mat3 cotangent_frame(vec3 n, vec3 p, vec2 uv) {");
>    > > -        ADD_LINE("vec3 dp1 = dFdx(p);");
>    > > -        ADD_LINE("vec3 dp2 = dFdy(p);");
>    > > -        ADD_LINE("vec2 duv1 = dFdx(uv);");
>    > > -        ADD_LINE("vec2 duv2 = dFdy(uv);");
>    > > -        ADD_LINE("vec3 dp2perp = cross(dp2, n);");
>    > > -        ADD_LINE("vec3 dp1perp = cross(n, dp1);");
>    > > -        ADD_LINE("vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;");
>    > > -        ADD_LINE("vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;");
>    > > -        ADD_LINE("float invmax = inversesqrt(max(dot(t, t), dot(b,
>    b)));");
>    > > -        ADD_LINE("return mat3(t * invmax, b * invmax, n);");
>    > > -        ADD_LINE("}");
>    > > -
>    > > -        ADD_LINE("vec3 perturb_normal(vec3 normal) {");
>    > > -        ADD_LINE("mat3 tbn = cotangent_frame(vNormal, -vEyeVector,
>    vTexCoord);");
>    > > -        ADD_LINE("return normalize(tbn * normal);");
>    > > -        ADD_LINE("}");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("void fragmentNormalMap() {");
>    > > -   ADD_LINE("float factor;");
>    > > -   ADD_LINE("vec3  normal;");
>    > > -   ADD_LINE("vec4  color;");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND)
>    > > -     {
>    > > -        ADD_LINE("normal = texture2D(uTextureNormal0, vTexCoord).rgb *
>    uTextureNormalWeight;");
>    > > -        ADD_LINE("normal += texture2D(uTextureNormal1, vTexCoord).rgb 
> *
>    ");
>    > > -        ADD_LINE("(1.0 - uTextureNormalWeight);");
>    > > -     }
>    > > -   else
>    > > -     {
>    >    >    -        ADD_LINE("normal    =    texture2D(uTextureNormal0,
>    vTexCoord).rgb;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("normal = 2.0 * normal - 1.0;");
>    > > -
>    > > -   if ((flags & E3D_SHADER_FLAG_VERTEX_TANGENT) == 0)
>    > > -     {
>    > > -        ADD_LINE("normal = perturb_normal(normal);");
>    > > -     }
>    > > -
>    > > -   /* Can we skip this normalization?? */
>    > > -   ADD_LINE("vec3  lv = normalize(vLightVector);");
>    > > -   ADD_LINE("normal = normalize(normal);");
>    > > -
>    > > -   ADD_LINE("factor = dot(lv, normal);");
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_SPOT)
>    > > -     {
>    > > -        ADD_LINE("float f = dot(-lv, normalize(uLightSpotDir));");
>    > > -
>    > > -        ADD_LINE("if (f > uLightSpotCutoffCos)");
>    > > -        ADD_LINE("factor *= pow(f, uLightSpotExp);");
>    > > -        ADD_LINE("else");
>    > > -        ADD_LINE("factor = 0.0;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("if (factor > 0.0) {");
>    > > -
>    > > -   /* Diffuse term. */
>    > > -   if (flags & E3D_SHADER_FLAG_DIFFUSE)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureDiffuse0, vTexCoord) 
> *
>    uTextureDiffuseWeight +");
>    > > -             ADD_LINE("texture2D(uTextureDiffuse1, vTexCoord) * (1.0 -
>    uTextureDiffuseWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE)
>    > > -          {
>    >   >   -              ADD_LINE("color  =  texture2D(uTextureDiffuse0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialDiffuse;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor = uLightDiffuse * color * factor;");
>    > > -     }
>    > > -   else
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);");
>    > > -     }
>    > > -
>    > > -   /* Specular term. */
>    > > -   if (flags & E3D_SHADER_FLAG_SPECULAR)
>    > > -     {
>    > > -        ADD_LINE("factor = dot(normalize(vLightHalfVector), 
> normal);");
>    > > -        ADD_LINE("if (factor > 0.0) {");
>    > > -        ADD_LINE("factor = pow(factor, uMaterialShininess);");
>    > > -
>    > > -        if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureSpecular0, vTexCoord)
>    * uTextureSpecularWeight +");
>    > > -             ADD_LINE("texture2D(uTextureSpecular1, vTexCoord) * (1.0 
> -
>    uTextureSpecularWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_SPECULAR_TEXTURE)
>    > > -          {
>    >   >  -              ADD_LINE("color  =  texture2D(uTextureSpecular0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialSpecular;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += uLightSpecular * color * factor;");
>    > > -        ADD_LINE("}");
>    > > -     }
>    > > -
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor *= shadow;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("} else {");
>    > > -   ADD_LINE("gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);");
>    > > -   ADD_LINE("}");
>    > > -
>    > > -   /* Ambient term. */
>    > > -   if (flags & E3D_SHADER_FLAG_AMBIENT)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureAmbient0, vTexCoord) 
> *
>    uTextureAmbientWeight +");
>    > > -             ADD_LINE("texture2D(uTextureAmbient1, vTexCoord) * (1.0 -
>    uTextureAmbientWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_AMBIENT_TEXTURE)
>    > > -          {
>    >   >   -              ADD_LINE("color  =  texture2D(uTextureAmbient0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialAmbient;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += uLightAmbient * color;");
>    > > -     }
>    > > -
>    > > -   /* Light attenuation. */
>    > > -   if (flags & E3D_SHADER_FLAG_LIGHT_ATTENUATION)
>    > > -     ADD_LINE("gl_FragColor /= dot(uLightAtten, vec3(1.0, vLightDist,
>    vLightDist * vLightDist));");
>    > > -
>    > > -   /* Emission term. */
>    > > -   if (flags & E3D_SHADER_FLAG_EMISSION)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("color = texture2D(uTextureEmission0, vTexCoord)
>    * uTextureEmissionWeight +");
>    > > -             ADD_LINE("texture2D(uTextureEmission1, vTexCoord) * (1.0 
> -
>    uTextureEmissionWeight);");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_EMISSION_TEXTURE)
>    > > -          {
>    >   >  -              ADD_LINE("color  =  texture2D(uTextureEmission0,
>    vTexCoord);");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("color = uMaterialEmission;");
>    > > -          }
>    > > -
>    > > -        ADD_LINE("gl_FragColor += color;");
>    > > -     }
>    > > -
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_pcf_even_func_add(E3D_Shader_String *shader,
>    > > -                                            Evas_3D_Shade_Mode mode
>    EINA_UNUSED,
>    > > -                                            E3D_Shader_Flag flags
>    EINA_UNUSED)
>    > > -{
>    > > -   ADD_LINE("float pcf(vec4 lpos, float size)");
>    > > -   ADD_LINE("{");
>    > > -   ADD_LINE("vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;");
>    > > -   ADD_LINE("float i, j, randx, randy, shadow;");
>    > > -   ADD_LINE("shadow = 0.0;");
>    > > -   ADD_LINE("for (i = -4.0; i < 4.0; i++)");
>    > > -   ADD_LINE("for (j = -4.0; j < 4.0; j++)");
>    > > -   ADD_LINE("{");
>    >  >  -   ADD_LINE("shadow += float(smcoord.z <= texture2D(uShadowMap,
>    smcoord.xy +vec2(i / 8.0, j / 8.0)*size).x);");
>    > > -   ADD_LINE("}");
>    > > -   ADD_LINE("return shadow / 64.0;");
>    > > -   ADD_LINE("}");
>    > > -}
>    > > -
>    > > -static void
>    > > -_fragment_shader_string_get(E3D_Shader_String *shader,
>    > > -                            Evas_3D_Shade_Mode mode, E3D_Shader_Flag
>    flags)
>    > > -{
>    > > -   /* Add variables - vertex attributes. */
>    > > -   _fragment_shader_string_variable_add(shader, mode, flags);
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("float shadow;");
>    > > -     }
>    > > -   /* Add functions. */
>    > > -   if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     _fragment_shader_string_func_flat_add(shader, mode, flags);
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_PHONG)
>    > > -     _fragment_shader_string_func_phong_add(shader, mode, flags);
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     _fragment_shader_string_func_normal_map_add(shader, mode, flags);
>    > > -
>    > > -   // TODO Add flexible bluring algorithm of shadows boundaries.
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     _fragment_shader_string_pcf_even_func_add(shader, mode, flags);
>    > > -
>    > > -   /* Add main function. */
>    > > -   ADD_LINE("void main() {");
>    > > -   if (flags & E3D_SHADER_FLAG_SHADOWED)
>    > > -     {
>    > > -        ADD_LINE("shadow = pcf(lpos, 1.0 / 200.0);");
>    > > -     }
>    > > -
>    > > -   if (mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor = vColor;");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_DIFFUSE)
>    > > -     {
>    > > -        if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE_BLEND)
>    > > -          {
>    > > -             ADD_LINE("gl_FragColor = (texture2D(uTextureDiffuse0,
>    vTexCoord) *");
>    >      >      -                  ADD_LINE("uTextureDiffuseWeight     +
>    texture2D(uTextureDiffuse1, vTexCoord) *");
>    >   >   -               ADD_LINE("(1.0   -  uTextureDiffuseWeight))  *
>    uMaterialDiffuse;");
>    > > -          }
>    > > -        else if (flags & E3D_SHADER_FLAG_DIFFUSE_TEXTURE)
>    > > -          {
>    > > -             ADD_LINE("gl_FragColor = texture2D(uTextureDiffuse0,
>    vTexCoord) * uMaterialDiffuse;");
>    > > -          }
>    > > -        else
>    > > -          {
>    > > -             ADD_LINE("gl_FragColor = uMaterialDiffuse;");
>    > > -          }
>    > > -     }
>    > > -   else if(mode == EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER)
>    > > -     {
>    > > -        ADD_LINE("gl_FragColor = vec4(gl_FragCoord.z);");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_FLAT)
>    > > -     {
>    > > -        ADD_LINE("fragmentFlat();");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_PHONG)
>    > > -     {
>    > > -        ADD_LINE("fragmentPhong();");
>    > > -     }
>    > > -   else if (mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
>    > > -     {
>    > > -        ADD_LINE("fragmentNormalMap();");
>    > > -     }
>    > > -
>    >  >  -      if  ((flags  &  E3D_SHADER_FLAG_FOG_ENABLED)  && (mode !=
>    EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER))
>    > > -     {
>    > > -        ADD_LINE("float z = gl_FragCoord.z / gl_FragCoord.w;");
>    > > -        ADD_LINE("float fogFactor = exp2( -uFogFactor * uFogFactor * z
>    * z * 1.44 );");
>    > > -        ADD_LINE("fogFactor = clamp(fogFactor, 0.0, 1.0);");
>    > > -        ADD_LINE("gl_FragColor = mix(uFogColor, gl_FragColor, 
> fogFactor
>    );");
>    > > -     }
>    > > -
>    > > -   if (mode == EVAS_3D_SHADE_MODE_COLOR_PICK)
>    > > -     {
>    > > -       ADD_LINE("gl_FragColor = vec4(uColorPick);");
>    > > -     }
>    > > +   int i;
>    > >
>    > > -   ADD_LINE("}");
>    > > +   for (i = 0; i < E3D_SHADER_FLAG_COUNT; i++)
>    > > +     if (flags & (1 << i))
>    > > +       {
>    > > +          int len = strlen("#define ") + strlen(shader_flag_names[i]) 
> +
>    2;
>    > > +          char str[len];
>    > > +          snprintf(str, len, "#define %s\n", shader_flag_names[i]);
>    > > +          _shader_string_add(shader, str);
>    > > +       }
>    > > +
>    > > +   if(_flags_need_tex_coord(flags))
>    > > +     _shader_string_add(shader, "#define NEED_TEX_COORD\n");
>    > >  }
>    > >
>    > >  static inline Eina_Bool
>    >  >  @@  -1543,8  +549,11 @@ e3d_program_new(Evas_3D_Shade_Mode mode,
>    E3D_Shader_Flag flags)
>    > >     program->mode = mode;
>    > >     program->flags = flags;
>    > >
>    > > -   _vertex_shader_string_get(&vert, mode, flags);
>    > > -   _fragment_shader_string_get(&frag, mode, flags);
>    > > +   _shader_flags_add(&vert, flags);
>    > > +   _shader_string_add(&frag, vert.str);
>    > > +
>    > > +   _shader_string_add(&vert, vertex_shaders[mode]);
>    > > +   _shader_string_add(&frag, fragment_shaders[mode]);
>    > >
>    > >     if (! _program_build(program, vert.str, frag.str))
>    > >       goto error;
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/color_pick_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/color_pick_frag.shd
>    > > new file mode 100644
>    > > index 0000000..5e0fc6c
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/color_pick_frag.shd
>    > > @@ -0,0 +1,7 @@
>    > > +uniform float uColorPick;
>    > > +
>    > > +void main()
>    > > +{
>    > > +   gl_FragColor = vec4(uColorPick);
>    > > +}
>    > > +
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/color_pick_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/color_pick_vert.shd
>    > > new file mode 100644
>    > > index 0000000..472866f
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/color_pick_vert.shd
>    > > @@ -0,0 +1,28 @@
>    > > +uniform mat4  uMatrixMvp;
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +void main()
>    > > +{
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +}
>    > > +
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/diffuse_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/diffuse_frag.shd
>    > > new file mode 100644
>    > > index 0000000..7b6dc2b
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/diffuse_frag.shd
>    > > @@ -0,0 +1,47 @@
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2   vTexCoord;
>    > > +#endif //TEX_COORD
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +uniform float uFogFactor;
>    > > +uniform vec4  uFogColor;
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +uniform   vec4        uMaterialDiffuse;
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    > > +uniform sampler2D  uTextureDiffuse0;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureDiffuse1;
>    > > +uniform float      uTextureDiffuseWeight;
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +#endif //DIFFUSE
>    > > +
>    > > +void main() {
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    > > +   gl_FragColor = (texture2D(uTextureDiffuse0, vTexCoord) *
>    > > +   uTextureDiffuseWeight + texture2D(uTextureDiffuse1, vTexCoord) *
>    > > +   (1.0 - uTextureDiffuseWeight)) * uMaterialDiffuse;
>    > > +#else
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    >  >  +    gl_FragColor  =  texture2D(uTextureDiffuse0,  vTexCoord)  *
>    uMaterialDiffuse;
>    > > +#else
>    > > +   gl_FragColor = uMaterialDiffuse;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +   float z = gl_FragCoord.z / gl_FragCoord.w;
>    > > +   float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
>    > > +   fogFactor = clamp(fogFactor, 0.0, 1.0);
>    > > +   gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +}
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/diffuse_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/diffuse_vert.shd
>    > > new file mode 100644
>    > > index 0000000..2b62b82
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/diffuse_vert.shd
>    > > @@ -0,0 +1,52 @@
>    > > +uniform mat4  uMatrixMvp;
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +attribute   vec4  aTexCoord0;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +attribute   vec4  aTexCoord1;
>    > > +uniform     float uTexCoordWeight;
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2 vTexCoord;
>    > > +#endif //NEED_TEX_COORD
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +   vTexCoord = aTexCoord0.st * uTexCoordWeight +
>    > > +   aTexCoord1.st * (1.0 - uTexCoordWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +   vTexCoord = aTexCoord0.st;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +}
>    > > diff --git a/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd
>    > > new file mode 100644
>    > > index 0000000..824fb66
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd
>    > > @@ -0,0 +1,195 @@
>    > > +varying vec2   vFactor;
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2   vTexCoord;
>    > > +#endif //TEX_COORD
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +uniform float uFogFactor;
>    > > +uniform vec4  uFogColor;
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +varying vec4 vLightPosition;
>    > > +uniform sampler2D uShadowMap;
>    > > +float shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +uniform   vec4        uMaterialDiffuse;
>    > > +uniform   vec4        uLightDiffuse;
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    > > +uniform sampler2D  uTextureDiffuse0;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureDiffuse1;
>    > > +uniform float      uTextureDiffuseWeight;
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +uniform   vec4     uLightSpecular;
>    > > +uniform   float    uMaterialShininess;
>    > > +uniform   vec4     uMaterialSpecular;
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE
>    > > +uniform sampler2D  uTextureSpecular0;
>    > > +#endif //SPECULAR_TEXTURE
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureSpecular1;
>    > > +uniform float      uTextureSpecularWeight;
>    > > +#endif //SPECULAR_TEXTURE_BLEND
>    > > +
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef AMBIENT
>    > > +uniform  vec4       uMaterialAmbient;
>    > > +uniform  vec4       uLightAmbient;
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +uniform sampler2D  uTextureAmbient0;
>    > > +#endif //AMBIENT_TEXTURE
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureAmbient1;
>    > > +uniform float      uTextureAmbientWeight;
>    > > +#endif //AMBIENT_TEXTURE_BLEND
>    > > +
>    > > +#endif //AMBIENT
>    > > +
>    > > +#ifdef EMISSION
>    > > +uniform vec4       uMaterialEmission;
>    > > +
>    > > +#ifdef EMISSION_TEXTURE
>    > > +uniform sampler2D  uTextureEmission0;
>    > > +#endif //EMISSION_TEXTURE
>    > > +
>    > > +#ifdef EMISSION_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureEmission1;
>    > > +uniform float      uTextureEmissionWeight;
>    > > +#endif //EMISSION_TEXTURE_BLEND
>    > > +
>    > > +#endif //EMISSION
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +float pcf(vec4 lpos, float size)
>    > > +{
>    > > +   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;
>    > > +   float i, j, randx, randy, shadow;
>    > > +   shadow = 0.0;
>    > > +   for (i = -4.0; i < 4.0; i++)
>    > > +     for (j = -4.0; j < 4.0; j++)
>    > > +        shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy
>    +vec2(i / 8.0, j / 8.0)*size).x);
>    > > +   return shadow / 64.0;
>    > > +}
>    > > +#endif //SHADOWED
>    > > +
>    > > +void fragmentFlat()
>    > > +{
>    > > +   vec4 color;
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    >   >   +        color   =  texture2D(uTextureDiffuse0,  vTexCoord)  *
>    uTextureDiffuseWeight +
>    >   >   +        texture2D(uTextureDiffuse1,   vTexCoord)   *  (1.0  -
>    uTextureDiffuseWeight);
>    > > +        color *= uMaterialDiffuse;
>    > > +#else
>    > > +
>    > > +#ifdef  DIFFUSE_TEXTURE
>    >   >   +        color   =  texture2D(uTextureDiffuse0,  vTexCoord)  *
>    uMaterialDiffuse;
>    > > +#else
>    > > +        color = uMaterialDiffuse;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +        gl_FragColor = uLightDiffuse * color * vFactor.x;
>    > > +#else
>    > > +        gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureSpecular0,   vTexCoord)  *
>    uTextureSpecularWeight +
>    >   >   +     texture2D(uTextureSpecular1,   vTexCoord)   *   (1.0   -
>    uTextureSpecularWeight);
>    > > +   color *= uMaterialSpecular;
>    > > +#else
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE
>    > > +   color = texture2D(uTextureSpecular0, vTexCoord) * 
> uMaterialSpecular;
>    > > +#else
>    > > +   color = uMaterialSpecular;
>    > > +#endif //SPECULAR_TEXTURE
>    > > +
>    > > +#endif //SPECULAR_TEXTURE_BLEND
>    > > +
>    > > +   gl_FragColor += uLightSpecular * color * vFactor.y;
>    > > +
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   gl_FragColor *= shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef E3D_SHADER_FLAG_AMBIENT
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    > > +
>    >   >   +     color   =   texture2D(uTextureAmbient0,   vTexCoord)   *
>    uTextureAmbientWeight +
>    >    >   +     texture2D(uTextureAmbient1,   vTexCoord)   *   (1.0   -
>    uTextureAmbientWeight);
>    > > +   color *= uMaterialAmbient;
>    > > +
>    > > +#else
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +   color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;
>    > > +#else
>    > > +   color = uMaterialAmbient;
>    > > +#endif //AMBIENT_TEXTURE
>    > > +
>    > > +#endif //AMBIENT_TEXTURE_BLEND
>    > > +   gl_FragColor += uLightAmbient * color;
>    > > +#endif //AMBIENT
>    > > +
>    > > +#ifdef EMISSION
>    > > +
>    > > +#ifdef EMISSION_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureEmission0,   vTexCoord)  *
>    uTextureEmissionWeight +
>    >   >   +     texture2D(uTextureEmission1,   vTexCoord)   *   (1.0   -
>    uTextureEmissionWeight);
>    > > +   color *= uMaterialEmission;
>    > > +#else
>    > > +
>    > > +#ifdef EMISSION_TEXTURE
>    > > +   color = texture2D(uTextureEmission0, vTexCoord) * 
> uMaterialEmission;
>    > > +#else
>    > > +   color = uMaterialEmission;
>    > > +#endif //EMISSION_TEXTURE
>    > > +
>    > > +#endif //EMISSION_TEXTURE_BLEND
>    > > +
>    > > +   gl_FragColor += color;
>    > > +#endif //EMISSION
>    > > +
>    > > +}
>    > > +
>    > > +void main() {
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   shadow = pcf(vLightPosition, 1.0 / 200.0);
>    > > +#endif //SHADOWED
>    > > +
>    > > +   fragmentFlat();
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +   float z = gl_FragCoord.z / gl_FragCoord.w;
>    > > +   float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
>    > > +   fogFactor = clamp(fogFactor, 0.0, 1.0);
>    > > +   gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +}
>    > > diff --git a/src/modules/evas/engines/gl_common/shader_3d/flat_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/flat_vert.shd
>    > > new file mode 100644
>    > > index 0000000..37aba1c
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/flat_vert.shd
>    > > @@ -0,0 +1,154 @@
>    > > +uniform   mat4  uMatrixMvp;
>    > > +uniform   mat3  uMatrixNormal;
>    > > +uniform   mat4  uMatrixModelview;
>    > > +uniform   vec4  uLightPosition;
>    > > +varying   vec2  vFactor;
>    > > +
>    > > +#ifdef SHADOWED
>    > > +uniform mat4 uMatrixLight;
>    > > +varying vec4 vLightPosition;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +attribute   vec4  aNormal0;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +attribute   vec4  aNormal1;
>    > > +uniform     float uNormalWeight;
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +attribute   vec4  aTexCoord0;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +attribute   vec4  aTexCoord1;
>    > > +uniform     float uTexCoordWeight;
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2 vTexCoord;
>    > > +#endif //NEED_TEX_COORD
>    > > +
>    > > +#ifdef LIGHT_SPOT
>    > > +uniform   vec3  uLightSpotDir;
>    > > +uniform   float uLightSpotExp;
>    > > +uniform   float uLightSpotCutoffCos;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +#ifdef SPECULAR
>    > > +uniform float   uMaterialShininess;
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +uniform   vec3  uLightAtten;
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +void vertexFlat(vec4 position, vec3 normal)
>    > > +{
>    > > +   vec3  lv;
>    > > +   float factor;
>    > > +   normal = uMatrixNormal * normal;
>    > > +   position = uMatrixModelview * position;
>    > > +
>    > > +#ifdef NORMALIZE_NORMALS
>    > > +   normal = normalize(normal);
>    > > +#endif //NORMALIZE_NORMALS
>    > > +
>    > > +#ifdef LIGHT_DIRECTIONAL
>    > > +   lv = uLightPosition.xyz;
>    > > +#else
>    > > +   lv = uLightPosition.xyz - position.xyz;
>    > > +   lv = normalize(lv);
>    > > +#endif //LIGHT_DIRECTIONAL
>    > > +
>    > > +   factor = max(dot(lv, normal), 0.0);
>    > > +
>    > > +#ifdef LIGHT_SPOT
>    > > +   float f = dot(-lv, uLightSpotDir);
>    > > +   if (f > uLightSpotCutoffCos)
>    > > +     factor *= pow(f, uLightSpotExp);
>    > > +   else
>    > > +      factor = 0.0;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +   if (factor > 0.0)
>    > > +     {
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +        vFactor.x = factor;
>    > > +#else
>    > > +        vFactor.x = 0.0;
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +        vec3  hv = normalize(normalize(-position.xyz) + lv);
>    > > +        factor = pow(max(dot(hv, normal), 0.0), uMaterialShininess);
>    > > +        vFactor.y = factor;
>    > > +#endif //SPECULAR
>    > > +
>    > > +     }
>    > > +   else
>    > > +     vFactor = vec2(0.0, 0.0);
>    > > +
>    > > +   /* Light attenuation. */
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +   float dist = length(lv);
>    > > +   vFactor /= dot(uLightAtten, vec3(1.0, dist, dist * dist));
>    > > +#endif //LIGHT_ATTENUATION
>    > > +}
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +   vec3 normal = aNormal0.xyz * uNormalWeight +
>    > > +   aNormal1.xyz * (1.0 - uNormalWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +   vec3 normal = aNormal0.xyz;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +   vTexCoord = aTexCoord0.st * uTexCoordWeight +
>    > > +   aTexCoord1.st * (1.0 - uTexCoordWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +   vTexCoord = aTexCoord0.st;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +   vertexFlat(position, normal);
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   vLightPosition = uMatrixLight * position;
>    > > +#endif
>    > > +}
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    b/src/modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    > > new file mode 100755
>    > > index 0000000..8bb6a2a
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/gen_shaders_3d.sh
>    > > @@ -0,0 +1,45 @@
>    > > +#!/bin/bash
>    > > +
>    > > +# This script will generate a C file containing all the shaders used 
> by
>    Evas_3D
>    > > +
>    > > +DIR=`dirname $0`
>    > > +
>    > > +OUTPUT=${DIR}/evas_gl_3d_shaders.x
>    > > +
>    > > +exec 1<&-
>    > > +exec 1>${OUTPUT}
>    > > +
>    > > +SHADERS="$@"
>    > > +vert_shaders_source=""
>    > > +frag_shaders_source=""
>    > > +
>    > > +# Write header
>    > > +printf "/* DO NOT MODIFY THIS FILE AS IT IS AUTO-GENERATED\n * See: $0
>    */\n\n"
>    > > +for shd in ${SHADERS} ; do
>    > > +  lname=`basename ${shd} .shd`
>    > > +
>    > > +  if echo ${lname} |grep _vert 2>&1 >> /dev/null ; then
>    > > +    vert_shaders_source="${vert_shaders_source}    ${lname}_glsl,\n"
>    > > +  fi
>    > > +  if echo ${lname} |grep _frag 2>&1 >> /dev/null ; then
>    > > +    frag_shaders_source="${frag_shaders_source}    ${lname}_glsl,\n"
>    > > +  fi
>    > > +  OIFS=$IFS
>    > > +  IFS=$'\n'
>    > > +  printf "static const char const ${lname}_glsl[] ="
>    > > +  for line in `cat ${shd}` ; do
>    > > +      printf "\n   \"${line}\\\n\""
>    > > +  done
>    > > +  printf ";\n\n"
>    > > +  IFS=${OIFS}
>    > > +done
>    > > +
>    > > +printf "static const char *vertex_shaders[] =
>    > > +{\n"
>    > > +      printf "${vert_shaders_source}"
>    > > +printf "};\n\n"
>    > > +
>    > > +printf "static const char *fragment_shaders[] =
>    > > +{\n"
>    > > +      printf "${frag_shaders_source}"
>    > > +printf "};\n"
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd
>    > > new file mode 100644
>    > > index 0000000..766e07f
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd
>    > > @@ -0,0 +1,283 @@
>    > > +varying  vec3        vLightVector;
>    > > +varying  vec3        vLightHalfVector;
>    > > +uniform  sampler2D   uTextureNormal0;
>    > > +varying  vec3        vEyeVector;
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2   vTexCoord;
>    > > +#endif //TEX_COORD
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +uniform float uFogFactor;
>    > > +uniform vec4  uFogColor;
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +varying vec4 vLightPosition;
>    > > +uniform sampler2D uShadowMap;
>    > > +float shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef NORMAL_TEXTURE_BLEND
>    > > +uniform  sampler2D  uTextureNormal1;
>    > > +uniform  float      uTextureNormalWeight;
>    > > +#endif //NORMAL_TEXTURE_BLEND
>    > > +
>    > > +#ifndef VERTEX_TANGENT
>    > > +varying  vec3        vNormal;
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +uniform   vec4        uMaterialDiffuse;
>    > > +uniform   vec4        uLightDiffuse;
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    > > +uniform sampler2D  uTextureDiffuse0;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureDiffuse1;
>    > > +uniform float      uTextureDiffuseWeight;
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +uniform   vec4     uLightSpecular;
>    > > +uniform   float    uMaterialShininess;
>    > > +uniform   vec4     uMaterialSpecular;
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE
>    > > +uniform sampler2D  uTextureSpecular0;
>    > > +#endif //SPECULAR_TEXTURE
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureSpecular1;
>    > > +uniform float      uTextureSpecularWeight;
>    > > +#endif //SPECULAR_TEXTURE_BLEND
>    > > +
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef AMBIENT
>    > > +uniform  vec4       uMaterialAmbient;
>    > > +uniform  vec4       uLightAmbient;
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +uniform sampler2D  uTextureAmbient0;
>    > > +#endif //AMBIENT_TEXTURE
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureAmbient1;
>    > > +uniform float      uTextureAmbientWeight;
>    > > +#endif //AMBIENT_TEXTURE_BLEND
>    > > +
>    > > +#endif //AMBIENT
>    > > +
>    > > +#ifdef EMISSION
>    > > +uniform vec4       uMaterialEmission;
>    > > +
>    > > +#ifdef EMISSION_TEXTURE
>    > > +uniform sampler2D  uTextureEmission0;
>    > > +#endif //EMISSION_TEXTURE
>    > > +
>    > > +#ifdef EMISSION_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureEmission1;
>    > > +uniform float      uTextureEmissionWeight;
>    > > +#endif //EMISSION_TEXTURE_BLEND
>    > > +
>    > > +#endif //EMISSION
>    > > +
>    > > +#ifdef LIGHT_SPOT
>    > > +uniform   vec3  uLightSpotDir;
>    > > +uniform   float uLightSpotExp;
>    > > +uniform   float uLightSpotCutoffCos;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +varying   float    vLightDist;
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +#ifndef VERTEX_TANGENT
>    > > +
>    > > +mat3 cotangent_frame(vec3 n, vec3 p, vec2 uv)
>    > > +{
>    > > +   vec3 dp1 = dFdx(p);
>    > > +   vec3 dp2 = dFdy(p);
>    > > +   vec2 duv1 = dFdx(uv);
>    > > +   vec2 duv2 = dFdy(uv);
>    > > +   vec3 dp2perp = cross(dp2, n);
>    > > +   vec3 dp1perp = cross(n, dp1);
>    > > +   vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
>    > > +   vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
>    > > +   float invmax = inversesqrt(max(dot(t, t), dot(b, b)));
>    > > +   return mat3(t * invmax, b * invmax, n);
>    > > +}
>    > > +
>    > > +vec3 perturb_normal(vec3 normal)
>    > > +{
>    > > +   mat3 tbn = cotangent_frame(vNormal, -vEyeVector, vTexCoord);
>    > > +   return normalize(tbn * normal);
>    > > +}
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +void fragmentNormalMap()
>    > > +{
>    > > +   float factor;
>    > > +   vec3  normal;
>    > > +   vec4  color;
>    > > +
>    > > +#ifdef NORMAL_TEXTURE_BLEND
>    >   >   +     normal  =  texture2D(uTextureNormal0,  vTexCoord).rgb  *
>    uTextureNormalWeight;
>    > > +   normal += texture2D(uTextureNormal1, vTexCoord).rgb *
>    > > +   (1.0 - uTextureNormalWeight);
>    > > +#else
>    > > +   normal = texture2D(uTextureNormal0, vTexCoord).rgb;
>    > > +#endif //NORMAL_TEXTURE_BLEND
>    > > +
>    > > +   normal = 2.0 * normal - 1.0;
>    > > +
>    > > +#ifndef VERTEX_TANGENT
>    > > +   normal = perturb_normal(normal);
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +   vec3  lv = normalize(vLightVector);
>    > > +   normal = normalize(normal);
>    > > +
>    > > +   factor = dot(lv, normal);
>    > > +
>    > > +#ifdef LIGHT_SPOT
>    > > +   float f = dot(-lv, normalize(uLightSpotDir));
>    > > +
>    > > +   if (f > uLightSpotCutoffCos)
>    > > +     factor *= pow(f, uLightSpotExp);
>    > > +   else
>    > > +     factor = 0.0;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +   if (factor > 0.0)
>    > > +     {
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    >   >   +        color   =  texture2D(uTextureDiffuse0,  vTexCoord)  *
>    uTextureDiffuseWeight +
>    >   >   +        texture2D(uTextureDiffuse1,   vTexCoord)   *  (1.0  -
>    uTextureDiffuseWeight);
>    > > +#else
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    > > +        color = texture2D(uTextureDiffuse0, vTexCoord);
>    > > +#else
>    > > +        color = uMaterialDiffuse;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +        gl_FragColor = uLightDiffuse * color * factor;
>    > > +
>    > > +#else
>    > > +        gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +
>    > > +        factor = dot(normalize(vLightHalfVector), normal);
>    > > +        if (factor > 0.0)
>    > > +          {
>    > > +             factor = pow(factor, uMaterialShininess);
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE_BLEND
>    >  >  +              color = texture2D(uTextureSpecular0, vTexCoord) *
>    uTextureSpecularWeight +
>    >  >  +              texture2D(uTextureSpecular1,  vTexCoord) * (1.0 -
>    uTextureSpecularWeight);
>    > > +#else
>    > > +#ifdef SPECULAR_TEXTURE
>    > > +             color = texture2D(uTextureSpecular0, vTexCoord);
>    > > +#else
>    > > +             color = uMaterialSpecular;
>    > > +#endif //SPECULAR_TEXTURE
>    > > +
>    > > +#endif //SPECULAR_TEXTURE_BLEND
>    > > +
>    > > +             gl_FragColor += uLightSpecular * color * factor;
>    > > +          }
>    > > +
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef SHADOWED
>    > > +        gl_FragColor *= shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +     }
>    > > +   else
>    > > +     gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
>    > > +
>    > > +#ifdef AMBIENT
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureAmbient0,   vTexCoord)   *
>    uTextureAmbientWeight +
>    >    >   +     texture2D(uTextureAmbient1,   vTexCoord)   *   (1.0   -
>    uTextureAmbientWeight);
>    > > +#else
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +   color = texture2D(uTextureAmbient0, vTexCoord);
>    > > +#else
>    > > +   color = uMaterialAmbient;
>    > > +#endif //AMBIENT_TEXTURE
>    > > +
>    > > +#endif //AMBIENT_TEXTURE_BLEND
>    > > +
>    > > +     gl_FragColor += uLightAmbient * color;
>    > > +#endif //AMBIENT
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +   gl_FragColor /= dot(uLightAtten, vec3(1.0, vLightDist, vLightDist *
>    vLightDist));
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +#ifdef EMISSION
>    > > +
>    > > +#ifdef EMISSION_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureEmission0,   vTexCoord)  *
>    uTextureEmissionWeight +
>    >   >   +     texture2D(uTextureEmission1,   vTexCoord)   *   (1.0   -
>    uTextureEmissionWeight);
>    > > +#else
>    > > +
>    > > +#ifdef EMISSION_TEXTURE
>    > > +   color = texture2D(uTextureEmission0, vTexCoord);
>    > > +#else
>    > > +   color = uMaterialEmission;
>    > > +#endif //EMISSION_TEXTURE
>    > > +
>    > > +#endif //EMISSION_TEXTURE_BLEND
>    > > +
>    > > +   gl_FragColor += color;
>    > > +#endif //EMISSION
>    > > +
>    > > +}
>    > > +
>    > > +#ifdef SHADOWED
>    > > +float pcf(vec4 lpos, float size)
>    > > +{
>    > > +   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;
>    > > +   float i, j, randx, randy, shadow;
>    > > +   shadow = 0.0;
>    > > +   for (i = -4.0; i < 4.0; i++)
>    > > +     for (j = -4.0; j < 4.0; j++)
>    > > +        shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy
>    +vec2(i / 8.0, j / 8.0)*size).x);
>    > > +   return shadow / 64.0;
>    > > +}
>    > > +#endif //SHADOWED
>    > > +
>    > > +void main() {
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   shadow = pcf(vLightPosition, 1.0 / 200.0);
>    > > +#endif //SHADOWED
>    > > +
>    > > +   fragmentNormalMap();
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +   float z = gl_FragCoord.z / gl_FragCoord.w;
>    > > +   float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
>    > > +   fogFactor = clamp(fogFactor, 0.0, 1.0);
>    > > +   gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +}
>    > > +
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/normal_map_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/normal_map_vert.shd
>    > > new file mode 100644
>    > > index 0000000..3dc42d2
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/normal_map_vert.shd
>    > > @@ -0,0 +1,189 @@
>    > > +uniform  mat4  uMatrixMvp;
>    > > +uniform  mat3  uMatrixNormal;
>    > > +uniform  mat4  uMatrixModelview;
>    > > +uniform  vec4  uLightPosition;
>    > > +varying  vec3  vLightVector;
>    > > +varying  vec3  vLightHalfVector;
>    > > +varying  vec3  vEyeVector;
>    > > +
>    > > +#ifndef VERTEX_TANGENT
>    > > +varying  vec3  vNormal;
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +#ifdef SHADOWED
>    > > +uniform mat4 uMatrixLight;
>    > > +varying vec4 vLightPosition;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +attribute   vec4  aNormal0;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +attribute   vec4  aNormal1;
>    > > +uniform     float uNormalWeight;
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TANGENT
>    > > +attribute   vec4  aTangent0;
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +#ifdef VERTEX_TANGENT_BLEND
>    > > +attribute   vec4  aTangent1;
>    > > +uniform     float uTangentWeight;
>    > > +#endif //VERTEX_TANGENT_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +attribute   vec4  aTexCoord0;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +attribute   vec4  aTexCoord1;
>    > > +uniform     float uTexCoordWeight;
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2 vTexCoord;
>    > > +#endif //NEED_TEX_COORD
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +varying  float vLightDist;
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +#ifndef VERTEX_TANGENT
>    > > +void vertexNormalMap(vec4 position, vec3 normal)
>    > > +{
>    > > +   normal = uMatrixNormal * normal;
>    > > +   position = uMatrixModelview * position;
>    > > +   vEyeVector = normalize(-position.xyz);
>    > > +
>    > > +#ifdef NORMALIZE_NORMALS
>    > > +   normal = normalize(normal);
>    > > +#endif //NORMALIZE_NORMALS
>    > > +
>    > > +#ifdef LIGHT_DIRECTIONAL
>    > > +   vLightVector = uLightPosition.xyz;
>    > > +#else
>    > > +   vLightVector = uLightPosition.xyz - position.xyz;
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +   vLightDist = length(vLightVector);
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +   vLightVector = normalize(vLightVector);
>    > > +#endif //LIGHT_DIRECTIONAL
>    > > +
>    > > +   vLightHalfVector = normalize(vEyeVector + vLightVector);
>    > > +   vNormal = normal;
>    > > +}
>    > > +
>    > > +#else
>    > > +
>    > > +void vertexNormalMap(vec4 position, vec3 normal, vec3 tangent)
>    > > +{
>    > > +   vec3 n = normalize(uMatrixNormal * normal);
>    > > +   vec3 t = normalize(uMatrixNormal * tangent);
>    > > +   vec3 b = cross(n, t);
>    > > +   vec3 tmp;
>    > > +
>    > > +   position = uMatrixModelview * position;
>    > > +
>    > > +#ifdef LIGHT_DIRECTIONAL
>    > > +   vec3 lightDir = uLightPosition.xyz;
>    > > +#else
>    > > +   vec3 lightDir = uLightPosition.xyz - position.xyz;
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +   vLightDist = length(lightDir);
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +   lightDir = normalize(lightDir);
>    > > +#endif //LIGHT_DIRECTIONAL
>    > > +
>    > > +   tmp.x = dot(lightDir, t);
>    > > +   tmp.y = dot(lightDir, b);
>    > > +   tmp.z = dot(lightDir, n);
>    > > +   vLightVector = tmp;
>    > > +
>    > > +   tmp.x = dot(position.xyz, t);
>    > > +   tmp.y = dot(position.xyz, b);
>    > > +   tmp.z = dot(position.xyz, n);
>    > > +   vEyeVector = normalize(tmp);
>    > > +
>    > > +   vec3 hv = normalize(normalize(-position.xyz) + lightDir);
>    > > +   tmp.x = dot(hv, t);
>    > > +   tmp.y = dot(hv, b);
>    > > +   tmp.z = dot(hv, n);
>    > > +   vLightHalfVector = tmp;
>    > > +}
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +   vec3 normal = aNormal0.xyz * uNormalWeight +
>    > > +   aNormal1.xyz * (1.0 - uNormalWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +   vec3 normal = aNormal0.xyz;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TANGENT_BLEND
>    > > +   vec3 tangent = aTangent0.xyz * uTangentWeight +
>    > > +   aTangent1.xyz * (1.0 - uTangentWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_TANGENT
>    > > +   vec3 tangent = aTangent0.xyz;
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +#endif //VERTEX_TANGENT_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +   vTexCoord = aTexCoord0.st * uTexCoordWeight +
>    > > +   aTexCoord1.st * (1.0 - uTexCoordWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +   vTexCoord = aTexCoord0.st;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +
>    > > +#ifdef  VERTEX_TANGENT
>    > > +   vertexNormalMap(position, normal, tangent);
>    > > +#else
>    > > +   vertexNormalMap(position, normal);
>    > > +#endif //VERTEX_TANGENT
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   vLightPosition = uMatrixLight * position;
>    > > +#endif
>    > > +}
>    > > diff --git 
> a/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd
>    > > new file mode 100644
>    > > index 0000000..f668984
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd
>    > > @@ -0,0 +1,235 @@
>    > > +varying  vec3        vLightVector;
>    > > +varying  vec3        vLightHalfVector;
>    > > +varying  vec3        vNormal;
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2   vTexCoord;
>    > > +#endif //TEX_COORD
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +uniform float uFogFactor;
>    > > +uniform vec4  uFogColor;
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +varying vec4 vLightPosition;
>    > > +uniform sampler2D uShadowMap;
>    > > +float shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef DIFFUSE
>    > > +uniform   vec4        uMaterialDiffuse;
>    > > +uniform   vec4        uLightDiffuse;
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE
>    > > +uniform sampler2D  uTextureDiffuse0;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#ifdef DIFFUSE_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureDiffuse1;
>    > > +uniform float      uTextureDiffuseWeight;
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +#endif //DIFFUSE
>    > > +
>    > > +#ifdef SPECULAR
>    > > +uniform   vec4     uLightSpecular;
>    > > +uniform   float    uMaterialShininess;
>    > > +uniform   vec4     uMaterialSpecular;
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE
>    > > +uniform sampler2D  uTextureSpecular0;
>    > > +#endif //SPECULAR_TEXTURE
>    > > +
>    > > +#ifdef SPECULAR_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureSpecular1;
>    > > +uniform float      uTextureSpecularWeight;
>    > > +#endif //SPECULAR_TEXTURE_BLEND
>    > > +
>    > > +#endif //SPECULAR
>    > > +
>    > > +#ifdef AMBIENT
>    > > +uniform  vec4       uMaterialAmbient;
>    > > +uniform  vec4       uLightAmbient;
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +uniform sampler2D  uTextureAmbient0;
>    > > +#endif //AMBIENT_TEXTURE
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureAmbient1;
>    > > +uniform float      uTextureAmbientWeight;
>    > > +#endif //AMBIENT_TEXTURE_BLEND
>    > > +
>    > > +#endif //AMBIENT
>    > > +
>    > > +#ifdef EMISSION
>    > > +uniform vec4       uMaterialEmission;
>    > > +
>    > > +#ifdef EMISSION_TEXTURE
>    > > +uniform sampler2D  uTextureEmission0;
>    > > +#endif //EMISSION_TEXTURE
>    > > +
>    > > +#ifdef EMISSION_TEXTURE_BLEND
>    > > +uniform sampler2D  uTextureEmission1;
>    > > +uniform float      uTextureEmissionWeight;
>    > > +#endif //EMISSION_TEXTURE_BLEND
>    > > +
>    > > +#endif //EMISSION
>    > > +
>    > > +#ifdef LIGHT_SPOT
>    > > +uniform   vec3  uLightSpotDir;
>    > > +uniform   float uLightSpotExp;
>    > > +uniform   float uLightSpotCutoffCos;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +varying   float    vLightDist;
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +void fragmentPhong()
>    > > +{
>    > > +   vec3  normal = normalize(vNormal);
>    > > +   vec3  lv = normalize(vLightVector);
>    > > +   float factor = dot(lv, normal);
>    > > +   vec4  color;
>    > > +
>    > > +#ifdef  LIGHT_SPOT
>    > > +   float f = dot(-lv, normalize(uLightSpotDir));
>    > > +
>    > > +   if (f > uLightSpotCutoffCos)
>    > > +      factor *= pow(f, uLightSpotExp);
>    > > +   else
>    > > +     factor = 0.0;
>    > > +#endif //LIGHT_SPOT
>    > > +
>    > > +   if (factor > 0.0)
>    > > +     {
>    > > +
>    > > +   /* Diffuse term. */
>    > > +#ifdef  DIFFUSE
>    > > +
>    > > +#ifdef  DIFFUSE_TEXTURE_BLEND
>    >   >   +        color   =  texture2D(uTextureDiffuse0,  vTexCoord)  *
>    uTextureDiffuseWeight +
>    >   >   +        texture2D(uTextureDiffuse1,   vTexCoord)   *  (1.0  -
>    uTextureDiffuseWeight);
>    > > +#else
>    > > +
>    > > +#ifdef  DIFFUSE_TEXTURE
>    > > +        color = texture2D(uTextureDiffuse0, vTexCoord);
>    > > +#else
>    > > +        color = uMaterialDiffuse;
>    > > +#endif //DIFFUSE_TEXTURE
>    > > +
>    > > +#endif //DIFFUSE_TEXTURE_BLEND
>    > > +
>    > > +        gl_FragColor = uLightDiffuse * color * factor;
>    > > +#else
>    > > +        gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
>    > > +#endif //DIFFUSE
>    > > +
>    > > +   /* Specular term. */
>    > > +#ifdef SPECULAR
>    > > +        factor = dot(normalize(vLightHalfVector), normal);
>    > > +        if (factor > 0.0)
>    > > +          {
>    > > +             factor = pow(factor, uMaterialShininess);
>    > > +
>    > > +#ifdef  SPECULAR_TEXTURE_BLEND
>    >  >  +              color = texture2D(uTextureSpecular0, vTexCoord) *
>    uTextureSpecularWeight +
>    >  >  +              texture2D(uTextureSpecular1,  vTexCoord) * (1.0 -
>    uTextureSpecularWeight);
>    > > +#else
>    > > +
>    > > +#ifdef   SPECULAR_TEXTURE
>    > > +             color = texture2D(uTextureSpecular0, vTexCoord);
>    > > +#else
>    > > +             color = uMaterialSpecular;
>    > > +#endif
>    > > +
>    > > +#endif
>    > > +
>    > > +             gl_FragColor += uLightSpecular * color * factor;
>    > > +          }
>    > > +#endif
>    > > +
>    > > +     }
>    > > +   else
>    > > +     gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +   gl_FragColor *= shadow;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef AMBIENT
>    > > +#ifdef AMBIENT_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureAmbient0,   vTexCoord)   *
>    uTextureAmbientWeight +
>    >    >   +     texture2D(uTextureAmbient1,   vTexCoord)   *   (1.0   -
>    uTextureAmbientWeight);
>    > > +#else
>    > > +
>    > > +#ifdef AMBIENT_TEXTURE
>    > > +   color = texture2D(uTextureAmbient0, vTexCoord);
>    > > +#else
>    > > +   color = uMaterialAmbient;
>    > > +#endif
>    > > +
>    > > +#endif
>    > > +
>    > > +   gl_FragColor += uLightAmbient * color;
>    > > +#endif
>    > > +
>    > > +   /* Light attenuation. */
>    > > +#ifdef  LIGHT_ATTENUATION
>    > > +   gl_FragColor /= dot(uLightAtten, vec3(1.0, vLightDist, vLightDist *
>    vLightDist));
>    > > +#endif
>    > > +
>    > > +   /* Emission term. */
>    > > +#ifdef  EMISSION
>    > > +
>    > > +#ifdef  EMISSION_TEXTURE_BLEND
>    >   >   +     color   =   texture2D(uTextureEmission0,   vTexCoord)  *
>    uTextureEmissionWeight +
>    >   >   +     texture2D(uTextureEmission1,   vTexCoord)   *   (1.0   -
>    uTextureEmissionWeight);
>    > > +#else
>    > > +
>    > > +#ifdef  EMISSION_TEXTURE
>    > > +   color = texture2D(uTextureEmission0, vTexCoord);
>    > > +#else
>    > > +   color = uMaterialEmission;
>    > > +#endif
>    > > +
>    > > +#endif
>    > > +
>    > > +   gl_FragColor += color;
>    > > +#endif
>    > > +
>    > > +}
>    > > +
>    > > +#ifdef  SHADOWED
>    > > +float pcf(vec4 lpos, float size)
>    > > +{
>    > > +   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;
>    > > +   float i, j, randx, randy, shadow;
>    > > +   shadow = 0.0;
>    > > +   for (i = -4.0; i < 4.0; i++)
>    > > +     for (j = -4.0; j < 4.0; j++)
>    > > +        shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy
>    +vec2(i / 8.0, j / 8.0)*size).x);
>    > > +   return shadow / 64.0;
>    > > +}
>    > > +#endif //SHADOWED
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   shadow = pcf(vLightPosition, 1.0 / 300.0);
>    > > +#endif //SHADOWED
>    > > +
>    > > +   fragmentPhong();
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +   float z = gl_FragCoord.z / gl_FragCoord.w;
>    > > +   float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
>    > > +   fogFactor = clamp(fogFactor, 0.0, 1.0);
>    > > +   gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +}
>    > > +
>    > > diff --git 
> a/src/modules/evas/engines/gl_common/shader_3d/phong_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/phong_vert.shd
>    > > new file mode 100644
>    > > index 0000000..fb2c5d4
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/phong_vert.shd
>    > > @@ -0,0 +1,116 @@
>    > > +uniform  mat4  uMatrixMvp;
>    > > +uniform  mat3  uMatrixNormal;
>    > > +uniform  mat4  uMatrixModelview;
>    > > +uniform  vec4  uLightPosition;
>    > > +varying  vec3  vLightVector;
>    > > +varying  vec3  vLightHalfVector;
>    > > +varying  vec3  vNormal;
>    > > +
>    > > +#ifdef SHADOWED
>    > > +uniform mat4 uMatrixLight;
>    > > +varying vec4 vLightPosition;
>    > > +#endif //SHADOWED
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +attribute   vec4  aNormal0;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +attribute   vec4  aNormal1;
>    > > +uniform     float uNormalWeight;
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +attribute   vec4  aTexCoord0;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +attribute   vec4  aTexCoord1;
>    > > +uniform     float uTexCoordWeight;
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +#ifdef NEED_TEX_COORD
>    > > +varying vec2 vTexCoord;
>    > > +#endif //NEED_TEX_COORD
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +varying  float vLightDist;
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +void vertexPhong(vec4 position, vec3 normal)
>    > > +{
>    > > +   normal = uMatrixNormal * normal;
>    > > +   position = uMatrixModelview * position;
>    > > +
>    > > +#ifdef NORMALIZE_NORMALS
>    > > +   normal = normalize(normal);
>    > > +#endif //NORMALIZE_NORMALS
>    > > +
>    > > +#ifdef LIGHT_DIRECTIONAL
>    > > +   vLightVector = uLightPosition.xyz;
>    > > +#else
>    > > +   vLightVector = uLightPosition.xyz - position.xyz;
>    > > +
>    > > +#ifdef LIGHT_ATTENUATION
>    > > +   vLightDist = length(vLightVector);
>    > > +#endif //LIGHT_ATTENUATION
>    > > +
>    > > +   vLightVector = normalize(vLightVector);
>    > > +#endif //LIGHT_DIRECTIONAL
>    > > +
>    >   >  +    vLightHalfVector  =  normalize(normalize(-position.xyz)  +
>    vLightVector);
>    > > +   vNormal = normal;
>    > > +}
>    > > +
>    > > +void main() {
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_NORMAL_BLEND
>    > > +   vec3 normal = aNormal0.xyz * uNormalWeight +
>    > > +   aNormal1.xyz * (1.0 - uNormalWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_NORMAL
>    > > +   vec3 normal = aNormal0.xyz;
>    > > +#endif //VERTEX_NORMAL
>    > > +
>    > > +#endif //VERTEX_NORMAL_BLEND
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD_BLEND
>    > > +   vTexCoord = aTexCoord0.st * uTexCoordWeight +
>    > > +   aTexCoord1.st * (1.0 - uTexCoordWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_TEXCOORD
>    > > +   vTexCoord = aTexCoord0.st;
>    > > +#endif //VERTEX_TEXCOORD
>    > > +
>    > > +#endif //VERTEX_TEXCOORD_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +   vertexPhong(position, normal);
>    > > +
>    > > +#ifdef SHADOWED
>    > > +   vLightPosition = uMatrixLight * position;
>    > > +#endif //SHADOWED
>    > > +}
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/shadow_map_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/shadow_map_frag.shd
>    > > new file mode 100644
>    > > index 0000000..84a586a
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/shadow_map_frag.shd
>    > > @@ -0,0 +1,4 @@
>    > > +void main()
>    > > +{
>    > > +   gl_FragColor.r = gl_FragCoord.z;
>    > > +}
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/shadow_map_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/shadow_map_vert.shd
>    > > new file mode 100644
>    > > index 0000000..3f12a69
>    > > --- /dev/null
>    > > +++ b/src/modules/evas/engines/gl_common/shader_3d/shadow_map_vert.shd
>    > > @@ -0,0 +1,28 @@
>    > > +uniform mat4  uMatrixMvp;
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +}
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/vertex_color_frag.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/vertex_color_frag.shd
>    > > new file mode 100644
>    > > index 0000000..9b0c023
>    > > --- /dev/null
>    > > +++ 
> b/src/modules/evas/engines/gl_common/shader_3d/vertex_color_frag.shd
>    > > @@ -0,0 +1,20 @@
>    > > +varying  vec4        vColor;
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +uniform float uFogFactor;
>    > > +uniform vec4  uFogColor;
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +void main()
>    > > +{
>    > > +   gl_FragColor = vColor;
>    > > +
>    > > +#ifdef FOG_ENABLED
>    > > +   float z = gl_FragCoord.z / gl_FragCoord.w;
>    > > +   float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
>    > > +   fogFactor = clamp(fogFactor, 0.0, 1.0);
>    > > +   gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
>    > > +#endif //FOG_ENABLED
>    > > +
>    > > +}
>    > > +
>    > > diff --git
>    a/src/modules/evas/engines/gl_common/shader_3d/vertex_color_vert.shd
>    b/src/modules/evas/engines/gl_common/shader_3d/vertex_color_vert.shd
>    > > new file mode 100644
>    > > index 0000000..560baad
>    > > --- /dev/null
>    > > +++ 
> b/src/modules/evas/engines/gl_common/shader_3d/vertex_color_vert.shd
>    > > @@ -0,0 +1,50 @@
>    > > +uniform     mat4  uMatrixMvp;
>    > > +varying     vec4  vColor;
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +attribute   vec4  aPosition0;
>    > > +#endif //VERTEX_POSITION
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +attribute   vec4  aPosition1;
>    > > +uniform     float uPositionWeight;
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_COLOR
>    > > +attribute   vec4  aColor0;
>    > > +#endif //VERTEX_COLOR
>    > > +
>    > > +#ifdef VERTEX_COLOR_BLEND
>    > > +attribute   vec4  aColor1;
>    > > +uniform     float uColorWeight;
>    > > +#endif //VERTEX_COLOR_BLEND
>    > > +
>    > > +void main()
>    > > +{
>    > > +
>    > > +#ifdef VERTEX_POSITION_BLEND
>    > > +   vec4 position = aPosition0 * uPositionWeight +
>    > > +   aPosition1 * (1.0 - uPositionWeight);
>    > > +   position = vec4(position.xyz, 1.0);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_POSITION
>    > > +   vec4 position = vec4(aPosition0.xyz, 1.0);
>    > > +#endif // VERTEX_POSITION
>    > > +
>    > > +#endif //VERTEX_POSITION_BLEND
>    > > +
>    > > +#ifdef VERTEX_COLOR_BLEND
>    >  >  +    vec4  color  =  aColor0  *  uColorWeight + aColor1 * (1.0 -
>    uColorWeight);
>    > > +#else
>    > > +
>    > > +#ifdef VERTEX_COLOR
>    > > +   vec4 color = aColor0;
>    > > +#endif //VERTEX_COLOR
>    > > +
>    > > +#endif //VERTEX_COLOR_BLEND
>    > > +
>    > > +   vColor = color;
>    > > +   gl_Position = uMatrixMvp * position;
>    > > +}
>    > > +
>    > >
>    >
>    >
>    
> ----------------------------------------------------------------------------
>    --
>    > Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
>    > from Actuate! Instantly Supercharge Your Business Reports and Dashboards
>    > with Interactivity, Sharing, Native Excel Exports, App Integration & more
>    > Get technology previously reserved for billion-dollar corporations, FREE
>    >
>    
> http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
>    > _______________________________________________
>    > enlightenment-devel mailing list
>    > enlightenment-devel@lists.sourceforge.net
>    > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>    
> ----------------------------------------------------------------------------
>    --
>    Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
>    from Actuate! Instantly Supercharge Your Business Reports and Dashboards
>    with Interactivity, Sharing, Native Excel Exports, App Integration & more
>    Get technology previously reserved for billion-dollar corporations, FREE
>    
> http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
>    _______________________________________________
>    enlightenment-devel mailing list
>    enlightenment-devel@lists.sourceforge.net
>    https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 
> 
>    With best regards,
> 
>    Oleksander Shcherbina
> 
>    SRK-Tizen Platform Lab
> 
>    Samsung Ukraine R&D Institute
> 
>    57 L'va Tolstogo Str., Kyiv 01032, Ukraine
> 
>    Mob.: +380 (66) 1297544
> 
>    o.shcherb...@samsung.com
> 
> 
> 
> 
>    [cid:LLKJ9INH0GAN@namo.co.kr]
> 
>    
> [SeenTimeChecker?do=f39c14f5643c71c58d395db40ae9c4ecb541d7877385379628d6023d
>    
> ffbae032ba777c355c197185c465c2cf80a2b7ef9aba4bb3b2b5ca43ddd7e184e0604d958075
>    b6b33f32d245be7a12499853ada082afa00ff4b36e9acf878f9a26ce15a0]



> ------------------------------------------------------------------------------
> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> with Interactivity, Sharing, Native Excel Exports, App Integration & more
> Get technology previously reserved for billion-dollar corporations, FREE
> http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk

> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to