cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=28d69200f9bba968e51941b302869d205e2eb13c

commit 28d69200f9bba968e51941b302869d205e2eb13c
Author: Oleksandr Shcherbina <o.shcherb...@samsung.com>
Date:   Mon Sep 21 23:41:25 2015 +0200

    evas_canvas3d: sets for shadow rendering
    
    Summary:
    Add possibility change quality and offsets for shadow.
    Add mesh API's to sets size, step and bias constant.
    Add scene API to sets depth values.
    
    Reviewers: Hermet, cedric
    
    Reviewed By: cedric
    
    Subscribers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D3056
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 src/lib/evas/canvas/evas_canvas3d_mesh.c           |  39 ++++++
 src/lib/evas/canvas/evas_canvas3d_mesh.eo          |  26 ++++
 src/lib/evas/canvas/evas_canvas3d_scene.c          |  19 +++
 src/lib/evas/canvas/evas_canvas3d_scene.eo         |  15 +++
 src/lib/evas/canvas/evas_object_image.c            |   2 +
 src/lib/evas/canvas/evas_types.eot                 |   3 +
 src/lib/evas/include/evas_private.h                |  11 ++
 src/modules/evas/engines/gl_common/evas_gl_3d.c    |  11 +-
 .../evas/engines/gl_common/evas_gl_3d_private.h    |   6 +
 .../evas/engines/gl_common/evas_gl_3d_shader.c     |  21 +++
 .../gl_common/shader_3d/evas_gl_3d_shaders.x       | 146 ++++++++++++---------
 .../evas/engines/gl_common/shader_3d/flat_frag.shd |   2 +-
 .../evas/engines/gl_common/shader_3d/include.shd   |  28 ++--
 .../gl_common/shader_3d/normal_map_frag.shd        |   2 +-
 .../shader_3d/parallax_occlusion_frag.shd          |   2 +-
 .../engines/gl_common/shader_3d/phong_frag.shd     |   2 +-
 16 files changed, 253 insertions(+), 82 deletions(-)

diff --git a/src/lib/evas/canvas/evas_canvas3d_mesh.c 
b/src/lib/evas/canvas/evas_canvas3d_mesh.c
index c6082ea..892ecd1 100644
--- a/src/lib/evas/canvas/evas_canvas3d_mesh.c
+++ b/src/lib/evas/canvas/evas_canvas3d_mesh.c
@@ -132,6 +132,9 @@ _mesh_init(Evas_Canvas3D_Mesh_Data *pd)
    pd->color_pick_key.b = 0.0;
 #endif
    pd->color_pick_enabled = EINA_FALSE;
+   pd->shadows_edges_filtering_level = 4;
+   pd->shadows_edges_size = 300.0;
+   pd->shadows_constant_bias = 0.00015;
 }
 
 static inline void
@@ -1078,4 +1081,40 @@ _evas_canvas3d_mesh_color_pick_enable_set(Eo *obj, 
Evas_Canvas3D_Mesh_Data *pd,
    eo_do(obj, evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_COLOR_PICK, 
NULL));
 }
 
+EOLIAN static void
+_evas_canvas3d_mesh_shadows_edges_filtering_set(Eo *obj, 
Evas_Canvas3D_Mesh_Data *pd,
+                                          int blur_level, Evas_Real edges_size)
+{
+   if (blur_level > 0)
+     pd->shadows_edges_filtering_level = blur_level;
+   if (edges_size >= 0)
+     pd->shadows_edges_size = edges_size;
+   eo_do(obj, 
evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_SHADOWS_EDGES_FILTERING, 
NULL));
+}
+
+EOLIAN static void
+_evas_canvas3d_mesh_shadows_edges_filtering_get(Eo *obj EINA_UNUSED, 
Evas_Canvas3D_Mesh_Data *pd,
+                                   int *blur_level, Evas_Real *edges_size)
+{
+   if (blur_level) *blur_level = pd->shadows_edges_filtering_level;
+   if (edges_size) *edges_size = pd->shadows_edges_size;
+}
+
+EOLIAN static void
+_evas_canvas3d_mesh_shadows_constant_bias_set(Eo *obj EINA_UNUSED, 
Evas_Canvas3D_Mesh_Data *pd,
+                                         Evas_Real bias)
+{
+   if (pd->shadows_constant_bias != bias)
+     {
+        pd->shadows_constant_bias = bias;
+        eo_do(obj, 
evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_SHADOWS_CONSTANT_BIAS, 
NULL));
+     }
+}
+
+EOLIAN static Evas_Real
+_evas_canvas3d_mesh_shadows_constant_bias_get(Eo *obj EINA_UNUSED, 
Evas_Canvas3D_Mesh_Data *pd)
+{
+   return pd->shadows_constant_bias;
+}
+
 #include "canvas/evas_canvas3d_mesh.eo.c"
diff --git a/src/lib/evas/canvas/evas_canvas3d_mesh.eo 
b/src/lib/evas/canvas/evas_canvas3d_mesh.eo
index d0faf59..aa1a23e 100644
--- a/src/lib/evas/canvas/evas_canvas3d_mesh.eo
+++ b/src/lib/evas/canvas/evas_canvas3d_mesh.eo
@@ -360,7 +360,33 @@ class Evas.Canvas3D.Mesh (Evas.Canvas3D.Object, 
Evas.Common_Interface, Efl.File)
             assembly: Evas.Canvas3D.Vertex_Assembly; [[The vertex assembly.]]
          }
       }
+      @property shadows_edges_filtering {
+        set {
+           [[Set the shadow edges blur parameters. 
 
+             The averaging values in window is used for blurring. 
+             User can set the size of window and num of points in window.
+           ]]
+        }
+        get {
+            [[Get the shadow edges blur parameters.]]
+        }
+        values {
+           blur_level: int; [[Number of points within a bluring radius.]]
+           edges_size: Evas.Real; [[The bluring radius.]]
+        }
+      }
+      @property shadows_constant_bias {
+        set {
+           [[Set offset shadow toward object.]]
+        }
+        get {
+            [[Get offset shadow toward object.]]
+        }
+        values {
+           bias: Evas.Real; [[Offset.]]
+        }
+      }
    }
    implements {
       Eo.Base.constructor;
diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.c 
b/src/lib/evas/canvas/evas_canvas3d_scene.c
index 518bcbe..13dd68a 100644
--- a/src/lib/evas/canvas/evas_canvas3d_scene.c
+++ b/src/lib/evas/canvas/evas_canvas3d_scene.c
@@ -74,6 +74,8 @@ _evas_canvas3d_scene_eo_base_constructor(Eo *obj, 
Evas_Canvas3D_Scene_Data *pd)
    pd->color_pick_enabled = EINA_FALSE;
    pd->node_mesh_colors = NULL;
    pd->colors_node_mesh = NULL;
+   pd->depth_offset = 4.0;
+   pd->depth_constant = 100.0;
 
    return obj;
 }
@@ -804,4 +806,21 @@ _evas_canvas3d_scene_color_pick_enable_set(Eo *obj 
EINA_UNUSED, Evas_Canvas3D_Sc
    return EINA_TRUE;
 }
 
+EOLIAN static void
+_evas_canvas3d_scene_shadows_depth_set(Eo *obj EINA_UNUSED, 
Evas_Canvas3D_Scene_Data *pd,
+                                       Evas_Real depth_offset, Evas_Real 
depth_constant)
+{
+   pd->depth_offset = depth_offset;
+   pd->depth_constant = depth_constant;
+   eo_do(obj, 
evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_SCENE_SHADOWS_DEPTH, NULL));
+}
+
+EOLIAN static void
+_evas_canvas3d_scene_shadows_depth_get(Eo *obj EINA_UNUSED, 
Evas_Canvas3D_Scene_Data *pd,
+                                       Evas_Real *depth_offset, Evas_Real 
*depth_constant)
+{
+   if (depth_offset) *depth_offset = pd->depth_offset;
+   if (depth_constant) *depth_constant = pd->depth_constant;
+}
+
 #include "canvas/evas_canvas3d_scene.eo.c"
diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.eo 
b/src/lib/evas/canvas/evas_canvas3d_scene.eo
index a9e7aa0..0464809 100644
--- a/src/lib/evas/canvas/evas_canvas3d_scene.eo
+++ b/src/lib/evas/canvas/evas_canvas3d_scene.eo
@@ -145,6 +145,21 @@ class Evas.Canvas3D.Scene (Evas.Canvas3D.Object, 
Evas.Common_Interface)
                                           camera node for the scene.]]
          }
       }
+      @property shadows_depth {
+         set {
+            [[Set scale and units used to calculate depth values.]]
+         }
+         get {
+            [[Get scale and units used to calculate depth values.]]
+         }
+         values {
+            depth_offset: Evas.Real; [[Scale factor that is used to
+                                       create a variable depth offset
+                                       for each polygon.]]
+            depth_constant: Evas.Real; [[Value to create a constant
+                                         depth offset]]
+         }
+      }
    }
    implements {
       Eo.Base.constructor;
diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index 21c94f2..f82d825 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -2694,6 +2694,8 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED,
    scene_data.bg_color = pd_scene->bg_color;
    scene_data.shadows_enabled = pd_scene->shadows_enabled;
    scene_data.camera_node = pd_scene->camera_node;
+   scene_data.depth_offset = pd_scene->depth_offset;
+   scene_data.depth_constant = pd_scene->depth_constant;
 
    /* Phase 1 - Update scene graph tree. */
    eo_do(scene, evas_canvas3d_object_update());
diff --git a/src/lib/evas/canvas/evas_types.eot 
b/src/lib/evas/canvas/evas_types.eot
index 6a6b98e..eb4b042 100644
--- a/src/lib/evas/canvas/evas_types.eot
+++ b/src/lib/evas/canvas/evas_types.eot
@@ -264,6 +264,7 @@ enum Evas.Canvas3D.State
    scene_size,
    scene_shadows_enabled,
    scene_updated, [[@since 1.14]]
+   scene_shadows_depth,
 
    texture_data = 1,
    texture_wrap,
@@ -285,6 +286,8 @@ enum Evas.Canvas3D.State
    mesh_blending,
    mesh_alpha_test,
    mesh_color_pick,
+   mesh_shadows_edges_filtering,
+   mesh_shadows_constant_bias,
 
    camera_projection = 1,
 
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index e5d5889..c15a579 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -229,6 +229,9 @@ struct _Evas_Canvas3D_Scene
 
    Eina_Hash        *node_mesh_colors;
    Eina_Hash        *colors_node_mesh;
+   /*sets constant for shadow rendering*/
+   Evas_Real depth_offset;
+   Evas_Real depth_constant;
 };
 
 struct _Evas_Canvas3D_Node_Mesh
@@ -387,6 +390,10 @@ struct _Evas_Canvas3D_Mesh
    Evas_Color              color_pick_key;
 #endif
    Eina_Bool               color_pick_enabled :1;
+   /*sets of the quality and offsets for shadow rendering*/
+   int                     shadows_edges_filtering_level;
+   Evas_Real               shadows_edges_size;
+   Evas_Real               shadows_constant_bias;
 };
 
 struct _Evas_Canvas3D_Texture
@@ -440,6 +447,10 @@ struct _Evas_Canvas3D_Scene_Public_Data
 
    Eina_Hash        *node_mesh_colors;
    Eina_Hash        *colors_node_mesh;
+
+   /*sets constant for shadow rendering*/
+   Evas_Real depth_offset;
+   Evas_Real depth_constant;
 };
 
 struct _Evas_Canvas3D_Pick_Data
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 6264f80..69c9c54 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_3d.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c
@@ -1005,7 +1005,14 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
      data->flags |= E3D_SHADER_FLAG_ALPHA_TEST_ENABLED;
 
    if (pdmesh->shadowed)
-     data->flags |= E3D_SHADER_FLAG_SHADOWED;
+     {
+        data->flags |= E3D_SHADER_FLAG_SHADOWED;
+        data->pcf_size = 1 / pdmesh->shadows_edges_size;
+        data->pcf_step = (Evas_Real)pdmesh->shadows_edges_filtering_level;
+#ifdef GL_GLES
+        data->constant_bias = pdmesh->shadows_constant_bias;
+#endif
+     }
 
    if (pdmesh->color_pick_enabled)
      data->color_pick_key = pdmesh->color_pick_key;
@@ -1178,7 +1185,7 @@ void _shadowmap_render(E3D_Drawable *drawable, 
E3D_Renderer *renderer,
    Evas_Mat4 matrix_vp;
 
    glEnable(GL_POLYGON_OFFSET_FILL);
-   glPolygonOffset(4.0, 100.0);
+   glPolygonOffset(data->depth_offset, data->depth_constant);
 #ifdef GL_GLES
    glBindFramebuffer(GL_FRAMEBUFFER, drawable->shadow_fbo);
    glBindRenderbuffer(GL_RENDERBUFFER, drawable->depth_render_buf);
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 4ac9cac..6f44456 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
@@ -111,6 +111,12 @@ struct _E3D_Draw_Data
 #else
    Evas_Color color_pick_key;
 #endif
+   /*Sets of the quality of shadow rendering*/
+   Evas_Real               pcf_step;
+   Evas_Real               pcf_size;
+#ifdef GL_GLES
+   Evas_Real               constant_bias;
+#endif
 };
 
 struct _E3D_Texture
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 0046508..21d5d18 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
@@ -45,6 +45,11 @@ typedef enum _E3D_Uniform
    E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL1,
 
    E3D_UNIFORM_SHADOWMAP,
+   E3D_UNIFORM_SHADOWS_PCF_STEP,
+   E3D_UNIFORM_SHADOWS_PCF_SIZE,
+#ifdef GL_GLES
+   E3D_UNIFORM_SHADOWS_CONSTANT_BIAS,
+#endif
 
    E3D_UNIFORM_LIGHT_POSITION,
    E3D_UNIFORM_LIGHT_SPOT_DIR,
@@ -337,6 +342,11 @@ static const char *uniform_names[] =
    "uTextureMatrixTransformEmission1",
    "uTextureMatrixTransformNormal1",
    "uShadowMap",
+   "uShadowsPCFStep",
+   "uShadowsPCFSize",
+#ifdef GL_GLES
+   "uShadowsConstantBias",
+#endif
    "uLightPosition",
    "uLightSpotDir",
    "uLightSpotExp",
@@ -512,6 +522,17 @@ _uniform_upload(E3D_Uniform u, GLint loc, const 
E3D_Draw_Data *data)
       case E3D_UNIFORM_SHADOWMAP:
          glUniform1i(loc, data->smap_sampler);
          break;
+      case E3D_UNIFORM_SHADOWS_PCF_STEP:
+         glUniform1f(loc, data->pcf_step);
+         break;
+      case E3D_UNIFORM_SHADOWS_PCF_SIZE:
+         glUniform1f(loc, data->pcf_size);
+         break;
+#ifdef GL_GLES
+      case E3D_UNIFORM_SHADOWS_CONSTANT_BIAS:
+         glUniform1f(loc, data->constant_bias);
+         break;
+#endif
       case E3D_UNIFORM_LIGHT_POSITION:
          glUniform4f(loc, data->light.position.x, data->light.position.y,
                      data->light.position.z, data->light.position.w);
diff --git a/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x 
b/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x
index 1a282f6..0284011 100644
--- a/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x
+++ b/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x
@@ -3,7 +3,7 @@
 
 static const char vertex_color_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -46,7 +46,7 @@ static const char vertex_color_vert_glsl[] =
 
 static const char vertex_color_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -116,7 +116,7 @@ static const char vertex_color_frag_glsl[] =
 
 static const char diffuse_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -160,7 +160,7 @@ static const char diffuse_vert_glsl[] =
 
 static const char diffuse_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -261,7 +261,7 @@ static const char diffuse_frag_glsl[] =
 
 static const char flat_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -386,7 +386,7 @@ static const char flat_vert_glsl[] =
 
 static const char flat_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -401,27 +401,31 @@ static const char flat_frag_glsl[] =
    "#ifdef  SHADOWED\n"
    "varying vec4 vLightPosition;\n"
    "uniform sampler2D uShadowMap;\n"
+   "uniform float uShadowsPCFStep;\n"
+   "uniform float uShadowsPCFSize;\n"
+   "uniform float uShadowsConstantBias;\n"
    "float shadow;\n"
-   "float pcf(vec4 lpos, float size)\n"
+   "float pcf(vec4 lpos)\n"
    "{\n"
    "   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
-   "   float i, j, shadow;\n"
+   "   float i, j, shadow, q, c;\n"
+   "   q = floor(uShadowsPCFStep * 2.0);\n"
+   "   c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n"
    "   shadow = 0.0;\n"
    "#ifndef GL_ES\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
-   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / 8.0, j / 8.0) * size).x);\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
+   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / q, j / q) * uShadowsPCFSize).x);\n"
    "#else\n"
    "   const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 
256.0), 1.0 / 256.0, 1.0);\n"
-   "   const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
    "       {\n"
-   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j 
/ 8.0) * size);\n"
-   "          shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n"
+   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / 
q) * uShadowsPCFSize);\n"
+   "          shadow += float(smcoord.z < dot(zvalue, unpack) + 
uShadowsConstantBias);\n"
    "       }\n"
    "#endif //GL_ES\n"
-   "   return shadow / 64.0;\n"
+   "   return shadow / c;\n"
    "}\n"
    "#endif //SHADOWED\n"
    "#ifdef DIFFUSE\n"
@@ -570,7 +574,7 @@ static const char flat_frag_glsl[] =
    "void main() {\n"
    "   vec4 color;\n"
    "#ifdef SHADOWED\n"
-   "   shadow = pcf(vLightPosition, 1.0 / 200.0);\n"
+   "   shadow = pcf(vLightPosition);\n"
    "#endif //SHADOWED\n"
    "   color = fragmentFlat();\n"
    "#ifdef ALPHA_TEST_ENABLED\n"
@@ -628,7 +632,7 @@ static const char flat_frag_glsl[] =
 
 static const char phong_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -721,7 +725,7 @@ static const char phong_vert_glsl[] =
 
 static const char phong_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -738,27 +742,31 @@ static const char phong_frag_glsl[] =
    "#ifdef  SHADOWED\n"
    "varying vec4 vLightPosition;\n"
    "uniform sampler2D uShadowMap;\n"
+   "uniform float uShadowsPCFStep;\n"
+   "uniform float uShadowsPCFSize;\n"
+   "uniform float uShadowsConstantBias;\n"
    "float shadow;\n"
-   "float pcf(vec4 lpos, float size)\n"
+   "float pcf(vec4 lpos)\n"
    "{\n"
    "   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
-   "   float i, j, shadow;\n"
+   "   float i, j, shadow, q, c;\n"
+   "   q = floor(uShadowsPCFStep * 2.0);\n"
+   "   c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n"
    "   shadow = 0.0;\n"
    "#ifndef GL_ES\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
-   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / 8.0, j / 8.0) * size).x);\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
+   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / q, j / q) * uShadowsPCFSize).x);\n"
    "#else\n"
    "   const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 
256.0), 1.0 / 256.0, 1.0);\n"
-   "   const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
    "       {\n"
-   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j 
/ 8.0) * size);\n"
-   "          shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n"
+   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / 
q) * uShadowsPCFSize);\n"
+   "          shadow += float(smcoord.z < dot(zvalue, unpack) + 
uShadowsConstantBias);\n"
    "       }\n"
    "#endif //GL_ES\n"
-   "   return shadow / 64.0;\n"
+   "   return shadow / c;\n"
    "}\n"
    "#endif //SHADOWED\n"
    "#ifdef DIFFUSE\n"
@@ -943,7 +951,7 @@ static const char phong_frag_glsl[] =
    "{\n"
    "   vec4 color;\n"
    "#ifdef SHADOWED\n"
-   "   shadow = pcf(vLightPosition, 1.0 / 300.0);\n"
+   "   shadow = pcf(vLightPosition);\n"
    "#endif //SHADOWED\n"
    "   color = fragmentPhong();\n"
    "#ifdef ALPHA_TEST_ENABLED\n"
@@ -1001,7 +1009,7 @@ static const char phong_frag_glsl[] =
 
 static const char normal_map_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1151,7 +1159,7 @@ static const char normal_map_vert_glsl[] =
 
 static const char normal_map_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1168,27 +1176,31 @@ static const char normal_map_frag_glsl[] =
    "#ifdef  SHADOWED\n"
    "varying vec4 vLightPosition;\n"
    "uniform sampler2D uShadowMap;\n"
+   "uniform float uShadowsPCFStep;\n"
+   "uniform float uShadowsPCFSize;\n"
+   "uniform float uShadowsConstantBias;\n"
    "float shadow;\n"
-   "float pcf(vec4 lpos, float size)\n"
+   "float pcf(vec4 lpos)\n"
    "{\n"
    "   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
-   "   float i, j, shadow;\n"
+   "   float i, j, shadow, q, c;\n"
+   "   q = floor(uShadowsPCFStep * 2.0);\n"
+   "   c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n"
    "   shadow = 0.0;\n"
    "#ifndef GL_ES\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
-   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / 8.0, j / 8.0) * size).x);\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
+   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / q, j / q) * uShadowsPCFSize).x);\n"
    "#else\n"
    "   const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 
256.0), 1.0 / 256.0, 1.0);\n"
-   "   const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
    "       {\n"
-   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j 
/ 8.0) * size);\n"
-   "          shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n"
+   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / 
q) * uShadowsPCFSize);\n"
+   "          shadow += float(smcoord.z < dot(zvalue, unpack) + 
uShadowsConstantBias);\n"
    "       }\n"
    "#endif //GL_ES\n"
-   "   return shadow / 64.0;\n"
+   "   return shadow / c;\n"
    "}\n"
    "#endif //SHADOWED\n"
    "#ifdef NORMAL_TEXTURE\n"
@@ -1417,7 +1429,7 @@ static const char normal_map_frag_glsl[] =
    "void main() {\n"
    "   vec4 color;\n"
    "#ifdef SHADOWED\n"
-   "   shadow = pcf(vLightPosition, 1.0 / 200.0);\n"
+   "   shadow = pcf(vLightPosition);\n"
    "#endif //SHADOWED\n"
    "   color = fragmentNormalMap();\n"
    "#ifdef ALPHA_TEST_ENABLED\n"
@@ -1474,7 +1486,7 @@ static const char normal_map_frag_glsl[] =
 
 static const char shadow_map_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1510,7 +1522,7 @@ static const char shadow_map_vert_glsl[] =
    "#endif // VERTEX_POSITION\n"
    "#endif //VERTEX_POSITION_BLEND\n"
    "#ifdef ALPHA_TEST_ENABLED\n"
-   "   #ifdef VERTEX_TEXCOORD_BLEND\n"
+   "#ifdef VERTEX_TEXCOORD_BLEND\n"
    "   vTexCoord = mix(aTexCoord1.st, aTexCoord0.st, uTexCoordWeight);\n"
    "#else\n"
    "#ifdef VERTEX_TEXCOORD\n"
@@ -1524,7 +1536,7 @@ static const char shadow_map_vert_glsl[] =
 
 static const char shadow_map_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1627,7 +1639,7 @@ static const char shadow_map_frag_glsl[] =
 
 static const char color_pick_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1654,7 +1666,7 @@ static const char color_pick_vert_glsl[] =
 
 static const char color_pick_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1723,7 +1735,7 @@ static const char color_pick_frag_glsl[] =
 
 static const char parallax_occlusion_vert_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1843,7 +1855,7 @@ static const char parallax_occlusion_vert_glsl[] =
 
 static const char parallax_occlusion_frag_glsl[] =
    "#ifdef GL_ES\n"
-   "precision mediump float;\n"
+   "precision highp float;\n"
    "precision mediump int;\n"
    "precision lowp sampler2D;\n"
    "#endif\n"
@@ -1871,27 +1883,31 @@ static const char parallax_occlusion_frag_glsl[] =
    "#ifdef  SHADOWED\n"
    "varying vec4 vLightPosition;\n"
    "uniform sampler2D uShadowMap;\n"
+   "uniform float uShadowsPCFStep;\n"
+   "uniform float uShadowsPCFSize;\n"
+   "uniform float uShadowsConstantBias;\n"
    "float shadow;\n"
-   "float pcf(vec4 lpos, float size)\n"
+   "float pcf(vec4 lpos)\n"
    "{\n"
    "   vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
-   "   float i, j, shadow;\n"
+   "   float i, j, shadow, q, c;\n"
+   "   q = floor(uShadowsPCFStep * 2.0);\n"
+   "   c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n"
    "   shadow = 0.0;\n"
    "#ifndef GL_ES\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
-   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / 8.0, j / 8.0) * size).x);\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
+   "       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + 
vec2(i / q, j / q) * uShadowsPCFSize).x);\n"
    "#else\n"
    "   const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 
256.0), 1.0 / 256.0, 1.0);\n"
-   "   const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n"
-   "   for (i = -4.0; i < 4.0; i++)\n"
-   "     for (j = -4.0; j < 4.0; j++)\n"
+   "   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n"
+   "     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n"
    "       {\n"
-   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j 
/ 8.0) * size);\n"
-   "          shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n"
+   "          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / 
q) * uShadowsPCFSize);\n"
+   "          shadow += float(smcoord.z < dot(zvalue, unpack) + 
uShadowsConstantBias);\n"
    "       }\n"
    "#endif //GL_ES\n"
-   "   return shadow / 64.0;\n"
+   "   return shadow / c;\n"
    "}\n"
    "#endif //SHADOWED\n"
    "#ifdef DIFFUSE\n"
@@ -2119,7 +2135,7 @@ static const char parallax_occlusion_frag_glsl[] =
    "void main() {\n"
    "   vec4 color;\n"
    "#ifdef SHADOWED\n"
-   "   shadow = pcf(vLightPosition, 1.0 / 200.0);\n"
+   "   shadow = pcf(vLightPosition);\n"
    "#endif //SHADOWED\n"
    "   color = fragmentParallaxMap();\n"
    "#ifdef ALPHA_TEST_ENABLED\n"
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
index 7814f9a..863bac1 100644
--- a/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd
+++ b/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd
@@ -49,7 +49,7 @@ vec4 fragmentFlat()
 void main() {
    vec4 color;
 #ifdef SHADOWED
-   shadow = pcf(vLightPosition, 1.0 / 200.0);
+   shadow = pcf(vLightPosition);
 #endif //SHADOWED
 
    color = fragmentFlat();
diff --git a/src/modules/evas/engines/gl_common/shader_3d/include.shd 
b/src/modules/evas/engines/gl_common/shader_3d/include.shd
index 3b92e82..fd6be4d 100644
--- a/src/modules/evas/engines/gl_common/shader_3d/include.shd
+++ b/src/modules/evas/engines/gl_common/shader_3d/include.shd
@@ -40,27 +40,33 @@ define(`FRAGMENT_SHADER_USE_SHADOWS', `
 #ifdef  SHADOWED
 varying vec4 vLightPosition;
 uniform sampler2D uShadowMap;
+uniform float uShadowsPCFStep;
+uniform float uShadowsPCFSize;
+#ifdef GL_ES
+uniform float uShadowsConstantBias;
+#endif //GL_ES'
 float shadow;
-float pcf(vec4 lpos, float size)
+float pcf(vec4 lpos)
 {
    vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;
-   float i, j, shadow;
+   float i, j, shadow, q, c;
+   q = floor(uShadowsPCFStep * 2.0);
+   c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);
    shadow = 0.0;
 `#ifndef GL_ES'
-   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);
+   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)
+     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)
+       shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i 
/ q, j / q) * uShadowsPCFSize).x);
 `#else'
    const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 
256.0), 1.0 / 256.0, 1.0);
-   const float bias = 0.00015 /*TODO Optimizate set of offset*/;
-   for (i = -4.0; i < 4.0; i++)
-     for (j = -4.0; j < 4.0; j++)
+   for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)
+     for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)
        {
-          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 
8.0) * size);
-          shadow += float(smcoord.z < dot(zvalue, unpack) + bias);
+          vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) 
* uShadowsPCFSize);
+          shadow += float(smcoord.z < dot(zvalue, unpack) + 
uShadowsConstantBias);
        }
 `#endif //GL_ES'
-   return shadow / 64.0;
+   return shadow / c;
 }
 #endif //SHADOWED')
 
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
index 06d4948..403fefd 100644
--- 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
@@ -128,7 +128,7 @@ vec4 fragmentNormalMap()
 void main() {
    vec4 color;
 #ifdef SHADOWED
-   shadow = pcf(vLightPosition, 1.0 / 200.0);
+   shadow = pcf(vLightPosition);
 #endif //SHADOWED
 
    color = fragmentNormalMap();
diff --git 
a/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd 
b/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd
index be550ac..bd53418 100644
--- a/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd
+++ b/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd
@@ -216,7 +216,7 @@ vec4 fragmentParallaxMap()
 void main() {
    vec4 color;
 #ifdef SHADOWED
-   shadow = pcf(vLightPosition, 1.0 / 200.0);
+   shadow = pcf(vLightPosition);
 #endif //SHADOWED
 
    color = fragmentParallaxMap();
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
index ef914e9..78a867b 100644
--- a/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd
+++ b/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd
@@ -87,7 +87,7 @@ void main()
 {
    vec4 color;
 #ifdef SHADOWED
-   shadow = pcf(vLightPosition, 1.0 / 300.0);
+   shadow = pcf(vLightPosition);
 #endif //SHADOWED
 
    color = fragmentPhong();

-- 


Reply via email to