evas: set visible texcolorpick texture in 3D shaders

Summary:
Add uniform varialble uColorTexture. Generate sampler count for textcolorpick
and pass to renderer for bind additional texture unit to gl.
It can be used for different 3D effects - blur, wave distortion, heat haze, etc.
T2761

Reviewers: Hermet, raster, cedric

Reviewed By: cedric

Differential Revision: https://phab.enlightenment.org/D3372

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Oleksandr Shcherbina 2015-12-02 14:47:28 -08:00 committed by Cedric BAIL
parent dc918064ce
commit e82baf2703
4 changed files with 40 additions and 6 deletions

View File

@ -1122,13 +1122,19 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
_light_build(data, light, matrix_eye);
eina_normal3_matrix_get(&data->matrix_normal, matrix_mv);
}
int num;
/*Check possible quantity of texture units*/
int num, count = 0;
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &num);
data->smap_sampler = num - 1;
if (data->texture_count >= num)
if ((data->flags & E3D_SHADER_FLAG_SHADOWED) || (data->texture_count > num))
if (data->render_to_texture)
{
count++;
data->colortex_sampler = num - (count + 1);
}
if (data->texture_count + count >= num)
if ((data->flags & E3D_SHADER_FLAG_SHADOWED) ||
(data->texture_count + count > num))
{
ERR("Too many textures for your graphics configuration.");
return EINA_FALSE;
@ -1144,6 +1150,7 @@ _mesh_draw(E3D_Renderer *renderer, Evas_Canvas3D_Mesh *mesh, int frame, Evas_Can
E3D_Draw_Data data;
memset(&data, 0x00, sizeof(E3D_Draw_Data));
data.render_to_texture = e3d_renderer_rendering_to_texture_get(renderer);
if (_mesh_draw_data_build(&data, mesh, frame, matrix_eye, matrix_mv, matrix_mvp, matrix_light, light))
e3d_renderer_draw(renderer, &data);

View File

@ -87,6 +87,7 @@ struct _E3D_Draw_Data
Evas_Real shininess;
GLint smap_sampler;
GLint colortex_sampler;
Evas_Canvas3D_Blend_Func blend_sfactor;
Evas_Canvas3D_Blend_Func blend_dfactor;
Eina_Bool blending : 1;
@ -111,6 +112,8 @@ struct _E3D_Draw_Data
Evas_Real pcf_step;
Evas_Real pcf_size;
Evas_Real constant_bias;
Eina_Bool render_to_texture;
};
struct _E3D_Texture
@ -171,5 +174,5 @@ void e3d_renderer_clear(E3D_Renderer *renderer, const Evas_Color
void e3d_renderer_draw(E3D_Renderer *renderer, E3D_Draw_Data *data);
void e3d_renderer_flush(E3D_Renderer *renderer);
void e3d_renderer_color_pick_target_set(E3D_Renderer *renderer, E3D_Drawable *drawable);
Eina_Bool e3d_renderer_rendering_to_texture_get(E3D_Renderer *renderer);
#endif /* EVAS_GL_3D_PRIVATE_H */

View File

@ -15,7 +15,10 @@ struct _E3D_Renderer
Eina_Bool vertex_attrib_enable[E3D_MAX_VERTEX_ATTRIB_COUNT];
Eina_Bool depth_test_enable;
GLuint texDepth;
GLint smap_sampler;
GLint smap_sampler;
Eina_Bool render_to_texture;
GLuint texcolorpick;
GLint colortex_sampler;
};
static inline GLenum
@ -208,6 +211,12 @@ _renderer_texture_bind(E3D_Renderer *renderer, E3D_Draw_Data *data)
glBindTexture(GL_TEXTURE_2D, renderer->texDepth);
renderer->smap_sampler = data->smap_sampler;
}
if (renderer->render_to_texture)
{
glActiveTexture(GL_TEXTURE0 + data->colortex_sampler);
glBindTexture(GL_TEXTURE_2D, renderer->texcolorpick);
renderer->colortex_sampler = data->colortex_sampler;
}
}
static inline void
@ -269,6 +278,8 @@ e3d_renderer_target_set(E3D_Renderer *renderer, E3D_Drawable *target)
glViewport(0, 0, target->w, target->h);
renderer->fbo = target->fbo;
renderer->texDepth = target->texDepth;
renderer->texcolorpick = target->texcolorpick;
renderer->render_to_texture = EINA_FALSE;
}
void
@ -288,6 +299,14 @@ e3d_renderer_color_pick_target_set(E3D_Renderer *renderer, E3D_Drawable *drawabl
#endif
glViewport(0, 0, drawable->w, drawable->h);
renderer->texDepth = drawable->texDepth;
renderer->texcolorpick = drawable->texcolorpick;
renderer->render_to_texture = EINA_TRUE;
}
Eina_Bool
e3d_renderer_rendering_to_texture_get(E3D_Renderer *renderer)
{
return renderer->render_to_texture;
}
void

View File

@ -68,6 +68,7 @@ typedef enum _E3D_Uniform
E3D_UNIFORM_COLOR_PICK,
E3D_UNIFORM_ALPHATEST_COMPARISON,
E3D_UNIFORM_ALPHATEST_REFVALUE,
E3D_UNIFORM_RENDER_TO_TEXTURE,
E3D_UNIFORM_COUNT,
} E3D_Uniform;
@ -361,6 +362,7 @@ static const char *uniform_names[] =
"uColorPick",
"uAlphaTestComparison",
"uAlphaTestRefValue",
"uColorTexture",
};
static inline void
@ -630,6 +632,9 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
case E3D_UNIFORM_ALPHATEST_REFVALUE:
glUniform1f(loc, (data->alpha_ref_value ? data->alpha_ref_value : 0.0));
break;
case E3D_UNIFORM_RENDER_TO_TEXTURE:
glUniform1i(loc, data->colortex_sampler);
break;
default:
ERR("Invalid uniform ID.");
break;