cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d88ccf06a5f6ebcfc68dcc21e55a241f64ff9aa9
commit d88ccf06a5f6ebcfc68dcc21e55a241f64ff9aa9 Author: Oleksandr Shcherbina <o.shcherb...@samsung.com> Date: Wed Apr 22 15:19:02 2015 +0200 evas: use Evas_GL_image for generate texture unit for Evas_3D_Texture. Summary: Used engine function for load image/data and use texture unit through Evas_GL_Image object Used Evas_ColorSpace format instead Evas_3D_Color/Pixel format Added transformation matrix for adjusting texture unit coordinates in shader Added property in Evas_3D_Texture for mark possibility get texture without atlas (see https://phab.enlightenment.org/conpherence/54/, I suppose it will done after this patch) Reviewers: Hermet, cedric Reviewed By: cedric Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D2371 Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> --- src/lib/evas/Evas_Eo.h | 38 ---- src/lib/evas/canvas/evas_3d_texture.c | 84 ++++++-- src/lib/evas/canvas/evas_3d_texture.eo | 30 ++- src/lib/evas/include/evas_3d_utils.h | 30 +++ src/lib/evas/include/evas_private.h | 12 +- src/modules/evas/engines/gl_common/evas_gl_3d.c | 230 ++++----------------- .../evas/engines/gl_common/evas_gl_3d_common.h | 7 +- .../evas/engines/gl_common/evas_gl_3d_private.h | 26 ++- .../evas/engines/gl_common/evas_gl_3d_shader.c | 72 +++++++ .../gl_common/shader_3d/evas_gl_3d_shaders.x | 214 ++++++++++++++----- .../evas/engines/gl_common/shader_3d/include.shd | 14 +- .../shader_3d/parallax_occlusion_frag.shd | 14 +- .../gl_common/shader_3d/shadow_map_frag.shd | 12 +- src/modules/evas/engines/gl_generic/evas_engine.c | 60 ++---- .../evas/engines/software_generic/evas_engine.c | 4 +- 15 files changed, 467 insertions(+), 380 deletions(-) diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 1e1fb59..2964442 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -698,44 +698,6 @@ typedef enum _Evas_3D_Comparison } Evas_3D_Comparison; /** - * Color formats of pixel data - * - * @since 1.10 - * @ingroup Evas_3D_Types - */ -typedef enum _Evas_3D_Color_Format -{ - /**< Color contains full components, red, green, blue and alpha */ - EVAS_3D_COLOR_FORMAT_RGBA = 0, - /**< Color contains only red, green and blue components */ - EVAS_3D_COLOR_FORMAT_RGB, - /**< Color contains only alpha component */ - EVAS_3D_COLOR_FORMAT_ALPHA -} Evas_3D_Color_Format; - -/** - * Pixel formats - * - * @since 1.10 - * @ingroup Evas_3D_Types - */ -typedef enum _Evas_3D_Pixel_Format -{ - /**< 8-bit pixel with single component */ - EVAS_3D_PIXEL_FORMAT_8 = 0, - /**< 16-bit pixel with three components (5-6-5 bit) */ - EVAS_3D_PIXEL_FORMAT_565, - /**< 24-bit pixel with three 8-bit components */ - EVAS_3D_PIXEL_FORMAT_888, - /**< 32-bit pixel with four 8-bit components */ - EVAS_3D_PIXEL_FORMAT_8888, - /**< 16-bit pixel with four 4-bit components */ - EVAS_3D_PIXEL_FORMAT_4444, - /**< 16-bit pixel with four components (5-5-5-1 bit) */ - EVAS_3D_PIXEL_FORMAT_5551 -} Evas_3D_Pixel_Format; - -/** * Wrap modes * * @since 1.10 diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index 314450c..8b68d81 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -234,7 +234,7 @@ _evas_3d_texture_evas_3d_object_update_notify(Eo *obj, Evas_3D_Texture_Data *pd) if (e->engine.func->texture_new) { pd->engine_data = - e->engine.func->texture_new(e->engine.data.output); + e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); } if (pd->engine_data == NULL) @@ -308,7 +308,6 @@ evas_3d_texture_material_del(Evas_3D_Texture *texture, Evas_3D_Material *materia eina_hash_set(pd->materials, &material, (const void *)(uintptr_t)(count - 1)); } - EAPI Evas_3D_Texture * evas_3d_texture_add(Evas *e) { @@ -324,6 +323,8 @@ EOLIAN static void _evas_3d_texture_eo_base_constructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUSED) { eo_do_super(obj, MY_CLASS, eo_constructor()); + pd->atlas_enable = EINA_TRUE; + eo_do(obj, evas_3d_object_type_set(EVAS_3D_OBJECT_TYPE_TEXTURE)); } @@ -335,37 +336,68 @@ _evas_3d_texture_eo_base_destructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUS } EOLIAN static void -_evas_3d_texture_data_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_3D_Color_Format color_format, - Evas_3D_Pixel_Format pixel_format, int w, int h, const void *data) +_evas_3d_texture_data_set(Eo *obj, Evas_3D_Texture_Data *pd, + Evas_Colorspace color_format, + int w, int h, const void *data) { Eo *evas = NULL; + void *image = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); if (!pd->engine_data && e->engine.func->texture_new) - pd->engine_data = e->engine.func->texture_new(e->engine.data.output); + pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + if (!data) + { + ERR("Failure, image data is empty"); + return; + } - if (e->engine.func->texture_data_set) - e->engine.func->texture_data_set(e->engine.data.output, pd->engine_data, - color_format, pixel_format, w, h, data); + image = e->engine.func->image_new_from_data(e->engine.data.output, w, h, (DATA32 *)data, EINA_TRUE, color_format); + if (!image) + { + ERR("Can't load image from data"); + return; + } + if (e->engine.func->texture_image_set) + e->engine.func->texture_image_set(e->engine.data.output, + pd->engine_data, + image); + e->engine.func->image_free(e->engine.data.output, image); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } EOLIAN static void _evas_3d_texture_file_set(Eo *obj, Evas_3D_Texture_Data *pd, const char *file, const char *key) { + + Evas_Image_Load_Opts lo; + int load_error; Eo *evas = NULL; + void *image; + eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); if (!pd->engine_data && e->engine.func->texture_new) - pd->engine_data = e->engine.func->texture_new(e->engine.data.output); + pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + + memset(&lo, 0x0, sizeof(Evas_Image_Load_Opts)); + image = e->engine.func->image_load(e->engine.data.output, + file, key, &load_error, &lo); + if (!image) + { + ERR("Can't load image from file"); + return; + } - if (e->engine.func->texture_file_set) - e->engine.func->texture_file_set(e->engine.data.output, pd->engine_data, - file, key); + if (e->engine.func->texture_image_set) + e->engine.func->texture_image_set(e->engine.data.output, + pd->engine_data, + image); + e->engine.func->image_free(e->engine.data.output, image); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } @@ -374,6 +406,7 @@ _evas_3d_texture_source_set(Eo *obj , Evas_3D_Texture_Data *pd, Evas_Object *sou { Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); + Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); Evas_Object_Protected_Data *src; if (source == pd->source) @@ -403,6 +436,8 @@ _evas_3d_texture_source_set(Eo *obj , Evas_3D_Texture_Data *pd, Evas_Object *sou ERR("No evas surface associated with the source object."); return; } + if (!pd->engine_data && e->engine.func->texture_new) + pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); _texture_proxy_set(obj, source, src); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); @@ -442,19 +477,21 @@ _evas_3d_texture_source_visible_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *p return !src_obj->proxy->src_invisible; } -EOLIAN static Evas_3D_Color_Format +EOLIAN static Evas_Colorspace _evas_3d_texture_color_format_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd) { - // FIXME: we need an unknown color format and unify that with Evas color space to - Evas_3D_Color_Format format = -1; + Evas_Colorspace format = -1; Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); - if (e->engine.func->texture_color_format_get) + if (e->engine.func->image_colorspace_get && + e->engine.func->texture_image_get) { - e->engine.func->texture_color_format_get(e->engine.data.output, - pd->engine_data, &format); + void *image; + + image = e->engine.func->texture_image_get(e->engine.data.output, pd->engine_data); + format = e->engine.func->image_colorspace_get(e->engine.data.output, image); } return format; @@ -527,4 +564,15 @@ _evas_3d_texture_filter_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_ } } +EOLIAN static void +_evas_3d_texture_atlas_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Eina_Bool use_atlas) +{ + if (pd->atlas_enable != use_atlas) pd->atlas_enable = use_atlas; +} + +EOLIAN static Eina_Bool +_evas_3d_texture_atlas_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd) +{ + return pd->atlas_enable; +} #include "canvas/evas_3d_texture.eo.c" diff --git a/src/lib/evas/canvas/evas_3d_texture.eo b/src/lib/evas/canvas/evas_3d_texture.eo index 83ab29a..39efb61 100644 --- a/src/lib/evas/canvas/evas_3d_texture.eo +++ b/src/lib/evas/canvas/evas_3d_texture.eo @@ -31,6 +31,29 @@ class Evas_3D_Texture (Evas_3D_Object, Evas.Common_Interface) bool visible; /*@ @c EINA_TRUE for visible, @c EINA_FALSE for invisible.*/ } } + atlas_enable { + set { + /* + Set enable flag to generation texture unit with support atlas. + + Use this flag only in case not normalize texture coordinates. + + By default, is enabled. + + @ingroup Evas_3D_Texture + */ + } + get { + /* + Get enable flag of generation texture unit with support atlas. + + @ingroup Evas_3D_Texture + */ + } + values { + bool use_atlas; /*@ @c EINA_TRUE for enable, @c EINA_FALSE for disable.*/ + } + } } methods { data_set { @@ -43,8 +66,7 @@ class Evas_3D_Texture (Evas_3D_Object, Evas.Common_Interface) */ params { - @in Evas_3D_Color_Format color_format; /*@ Color format of the texture. */ - @in Evas_3D_Pixel_Format pixel_format; /*@ Pixel format of the data. */ + @in Evas_Colorspace color_format; /*@ Color format of the texture. */ @in int w; /*@ Width of the data. */ @in int h; /*@ Height of the data. */ @in const(void)* data; /*@ Pointer to the data. */ @@ -55,8 +77,6 @@ class Evas_3D_Texture (Evas_3D_Object, Evas.Common_Interface) /* Set the data of the given texture from file. - Only PNG format is supported. - @ingroup Evas_3D_Texture */ @@ -96,7 +116,7 @@ class Evas_3D_Texture (Evas_3D_Object, Evas.Common_Interface) @ingroup Evas_3D_Texture */ - return: Evas_3D_Color_Format; + return: Evas_Colorspace; } size_get @const { diff --git a/src/lib/evas/include/evas_3d_utils.h b/src/lib/evas/include/evas_3d_utils.h index d11533f..87bf708 100644 --- a/src/lib/evas/include/evas_3d_utils.h +++ b/src/lib/evas/include/evas_3d_utils.h @@ -1150,6 +1150,36 @@ evas_mat3_invserse(Evas_Mat3 *out, const Evas_Mat3 *mat) } } +static inline void +evas_mat3_set_position_transform(Evas_Mat3 *out, const Evas_Real p_x, const Evas_Real p_y) +{ + Evas_Real *d = &out->m[0]; + memset(d, 0x00, sizeof(Evas_Mat3)); + d[0] = 1; + d[2] = p_x; + d[4] = 1; + d[5] = p_y; + d[8] = 1; + if (p_x || p_y) + out->flags = 0; + else + out->flags = EVAS_MATRIX_IS_IDENTITY; +} + +static inline void +evas_mat3_set_scale_transform(Evas_Mat3 *out, Evas_Real s_x, Evas_Real s_y) +{ + Evas_Real *d = &out->m[0]; + memset(d, 0x00, sizeof(Evas_Mat3)); + d[0] = s_x; + d[4] = s_y; + d[8] = 1; + if (s_x != 1.0 || s_y != 1.0) + out->flags = 0; + else + out->flags = EVAS_MATRIX_IS_IDENTITY; +} + /* 2x2 matrix */ static inline void evas_mat2_identity_set(Evas_Mat2 *m) diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index af2592b..427a71d 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -369,9 +369,11 @@ struct _Evas_3D_Texture Evas_Object *source; Eina_Bool proxy_rendering; void *proxy_surface; - /* Engine-side object. */ void *engine_data; + + /*Use atlases, @EINA_TRUE by default*/ + Eina_Bool atlas_enable :1; }; struct _Evas_3D_Material @@ -389,7 +391,7 @@ struct _Evas_3D_Material struct _Evas_3D_Scene_Public_Data { - Evas_Color bg_color; + Evas_Color bg_color; Evas_3D_Node *camera_node; Eina_List *light_nodes; Eina_List *mesh_nodes; @@ -1360,17 +1362,15 @@ struct _Evas_Func int (*drawable_texture_color_pick_id_get) (void *drawable); double (*drawable_texture_pixel_color_get) (unsigned int tex EINA_UNUSED, int x, int y, void *drawable); - void *(*texture_new) (void *data); + void *(*texture_new) (void *data, Eina_Bool use_atlas); void (*texture_free) (void *data, void *texture); - void (*texture_data_set) (void *data, void *texture, Evas_3D_Color_Format format, Evas_3D_Pixel_Format pixel_format, int w, int h, const void *pixels); - void (*texture_file_set) (void *data, void *texture, const char *file, const char *key); - void (*texture_color_format_get) (void *data, void *texture, Evas_3D_Color_Format *format); void (*texture_size_get) (void *data, void *texture, int *w, int *h); void (*texture_wrap_set) (void *data, void *texture, Evas_3D_Wrap_Mode s, Evas_3D_Wrap_Mode t); void (*texture_wrap_get) (void *data, void *texture, Evas_3D_Wrap_Mode *s, Evas_3D_Wrap_Mode *t); void (*texture_filter_set) (void *data, void *texture, Evas_3D_Texture_Filter min, Evas_3D_Texture_Filter mag); void (*texture_filter_get) (void *data, void *texture, Evas_3D_Texture_Filter *min, Evas_3D_Texture_Filter *mag); void (*texture_image_set) (void *data, void *texture, void *image); + void *(*texture_image_get) (void *data, void *texture); Ector_Surface *(*ector_get) (void *data); void (*ector_begin) (void *data, void *context, void *surface, int x, int y, Eina_Bool do_async); 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 1de2c64..9f8e742 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c @@ -21,9 +21,6 @@ void e3d_texture_param_update(E3D_Texture *texture) { - if (texture->is_imported) - return; - if (texture->wrap_dirty) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s); @@ -40,7 +37,7 @@ e3d_texture_param_update(E3D_Texture *texture) } E3D_Texture * -e3d_texture_new(void) +e3d_texture_new(Eina_Bool use_atlas) { E3D_Texture *texture = NULL; @@ -52,12 +49,14 @@ e3d_texture_new(void) return NULL; } + evas_mat3_identity_set(&texture->trans); + texture->w = 0; texture->h = 0; + texture->x = 0; + texture->y = 0; - texture->is_imported = EINA_FALSE; texture->tex = 0; - texture->format = GL_RGBA; texture->wrap_dirty = EINA_TRUE; texture->wrap_s = GL_CLAMP_TO_EDGE; @@ -67,192 +66,63 @@ e3d_texture_new(void) texture->filter_min = GL_NEAREST; texture->filter_mag = GL_NEAREST; + texture->atlas_enable = use_atlas; + return texture; } void e3d_texture_free(E3D_Texture *texture) { - if (texture->tex && !texture->is_imported) - glDeleteTextures(1, &texture->tex); - - free(texture); -} - -void -e3d_texture_data_set(E3D_Texture *texture, - Evas_3D_Color_Format color_format, Evas_3D_Pixel_Format pixel_format, - int w, int h, const void *data) -{ - GLenum format; - GLenum iformat; - GLenum type; - - if (color_format == EVAS_3D_COLOR_FORMAT_RGBA) - { - format = GL_RGBA; - iformat = GL_BGRA; - - if (pixel_format == EVAS_3D_PIXEL_FORMAT_8888) - type = GL_UNSIGNED_BYTE; - else if (pixel_format == EVAS_3D_PIXEL_FORMAT_4444) - type = GL_UNSIGNED_SHORT_4_4_4_4; - else if (pixel_format == EVAS_3D_PIXEL_FORMAT_5551) - type = GL_UNSIGNED_SHORT_5_5_5_1; - else - { - ERR("Texture data format mismatch."); - return; - } - } - else if (color_format == EVAS_3D_COLOR_FORMAT_RGB) - { - format = GL_RGB; - iformat = GL_BGR; - - if (pixel_format == EVAS_3D_PIXEL_FORMAT_565) - type = GL_UNSIGNED_SHORT_5_6_5; - else if (pixel_format == EVAS_3D_PIXEL_FORMAT_888) - type = GL_UNSIGNED_BYTE; - else - { - ERR("Texture data format mismatch."); - return; - } - } - else if (color_format == EVAS_3D_COLOR_FORMAT_ALPHA) - { - format = GL_LUMINANCE; - iformat = GL_LUMINANCE; - - if (pixel_format == EVAS_3D_PIXEL_FORMAT_8) - type = GL_UNSIGNED_BYTE; - else - { - ERR("Texture data format mismatch."); - return; - } - } - else + if (texture) { - ERR("Invalid texture color format"); - return; + if (texture->surface) + evas_gl_common_image_unref(texture->surface); } - - if (texture->tex == 0 || texture->is_imported) - { - glGenTextures(1, &texture->tex); - texture->wrap_dirty = EINA_TRUE; - texture->filter_dirty = EINA_TRUE; - } - - glBindTexture(GL_TEXTURE_2D, texture->tex); - glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, iformat, type, data); - - if (texture->wrap_dirty) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t); - texture->wrap_dirty = EINA_FALSE; - } - - if (texture->filter_dirty) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->filter_min); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->filter_mag); - texture->filter_dirty = EINA_FALSE; - } - - texture->is_imported = EINA_FALSE; - texture->format = format; -} - -void -e3d_texture_file_set(E3D_Texture *texture, const char *file, const char *key) -{ - Evas_Image_Load_Opts lo; - int error; - Evas_3D_Color_Format color_format; - Evas_3D_Pixel_Format pixel_format; - - memset(&lo, 0x0, sizeof(Evas_Image_Load_Opts)); - RGBA_Image *im = evas_common_load_image_from_file(file, key, &lo, &error); - if (!im) return; - - error = evas_cache_image_load_data(&im->cache_entry); - - switch(im->cache_entry.space) - { - case EVAS_COLORSPACE_ARGB8888: - pixel_format = EVAS_3D_PIXEL_FORMAT_8888; - color_format = EVAS_3D_COLOR_FORMAT_RGBA; - break; - default: - return; - } - e3d_texture_data_set(texture, color_format, pixel_format, im->cache_entry.w, - im->cache_entry.h, im->image.data); - evas_cache_image_unload_data(&im->cache_entry); -} - -Evas_3D_Color_Format -e3d_texture_color_format_get(E3D_Texture *texture) -{ - if (texture->is_imported) - { - ERR("Cannot get the size of an imported texture."); - return EVAS_3D_COLOR_FORMAT_RGBA; - } - - switch (texture->format) - { - case GL_RGBA: - return EVAS_3D_COLOR_FORMAT_RGBA; - case GL_RGB: - return EVAS_3D_COLOR_FORMAT_RGB; - case GL_ALPHA: - return EVAS_3D_COLOR_FORMAT_ALPHA; - default: - break; - } - - ERR("Invalid texture format."); - return EVAS_3D_COLOR_FORMAT_RGBA; + free(texture); } void e3d_texture_size_get(const E3D_Texture *texture, int *w, int *h) { - if (texture->is_imported) - { - ERR("Invalid operation on an imported texture resource."); - return; - } - if (w) *w = texture->w; if (h) *h = texture->h; } void -e3d_texture_import(E3D_Texture *texture, GLuint tex) +e3d_texture_set(Evas_Engine_GL_Context *gc, + E3D_Texture *texture, + Evas_GL_Image *im) { - if (tex == 0) - { - ERR("Cannot import an invalid texture ID."); - return; - } + Evas_Mat3 pt,st; + Evas_Real pt_x, pt_y, st_x, st_y; - if (texture->tex && !texture->is_imported) - glDeleteTextures(1, &texture->tex); + texture->surface = im; + evas_gl_common_image_ref(im); - texture->tex = tex; - texture->is_imported = EINA_TRUE; + evas_gl_common_image_update(gc, im); + + texture->tex = im->tex->pt->texture; + texture->w = im->w; + texture->h = im->h; + texture->x = im->tex->x; + texture->y = im->tex->y; + + pt_x = im->tex->pt->w ? (im->tex->x/(Evas_Real)im->tex->pt->w) : 0; + pt_y = im->tex->pt->h ? (im->tex->y/(Evas_Real)im->tex->pt->h) : 0; + + st_x = im->tex->pt->w ? (im->w/(Evas_Real)im->tex->pt->w) : 1.0; + st_y = im->tex->pt->h ? (im->h/(Evas_Real)im->tex->pt->h) : 1.0; + /*Build adjusting matrix for texture unit coordinates*/ + evas_mat3_set_position_transform(&pt, pt_x, pt_y); + evas_mat3_set_scale_transform(&st, st_x, st_y); + evas_mat3_multiply(&texture->trans, &st, &pt); } -Eina_Bool -e3d_texture_is_imported_get(const E3D_Texture *texture) +Evas_GL_Image * +e3d_texture_get(E3D_Texture *texture) { - return texture->is_imported; + return texture ? texture->surface : NULL; } static inline GLenum @@ -348,12 +218,6 @@ e3d_texture_wrap_set(E3D_Texture *texture, Evas_3D_Wrap_Mode s, Evas_3D_Wrap_Mod { GLenum gl_s, gl_t; - if (texture->is_imported) - { - ERR("Invalid operation on an imported texture resource."); - return; - } - gl_s = _to_gl_texture_wrap(s); gl_t = _to_gl_texture_wrap(t); @@ -368,12 +232,6 @@ e3d_texture_wrap_set(E3D_Texture *texture, Evas_3D_Wrap_Mode s, Evas_3D_Wrap_Mod void e3d_texture_wrap_get(const E3D_Texture *texture, Evas_3D_Wrap_Mode *s, Evas_3D_Wrap_Mode *t) { - if (texture->is_imported) - { - ERR("Invalid operation on an imported texture resource."); - return; - } - if (s) *s = _to_e3d_texture_wrap(texture->wrap_s); @@ -386,12 +244,6 @@ e3d_texture_filter_set(E3D_Texture *texture, Evas_3D_Texture_Filter min, Evas_3D { GLenum gl_min, gl_mag; - if (texture->is_imported) - { - ERR("Invalid operation on an imported texture resource."); - return; - } - gl_min = _to_gl_texture_filter(min); gl_mag = _to_gl_texture_filter(mag); @@ -407,12 +259,6 @@ void e3d_texture_filter_get(const E3D_Texture *texture, Evas_3D_Texture_Filter *min, Evas_3D_Texture_Filter *mag) { - if (texture->is_imported) - { - ERR("Invalid operation on an imported texture resource."); - return; - } - if (min) *min = _to_e3d_texture_filter(texture->filter_min); diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h index f119b40..fdb4784 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h @@ -7,13 +7,12 @@ typedef struct _E3D_Drawable E3D_Drawable; typedef struct _E3D_Renderer E3D_Renderer; /* Texture */ -E3D_Texture *e3d_texture_new(void); +E3D_Texture *e3d_texture_new(Eina_Bool use_atlas); void e3d_texture_free(E3D_Texture *texture); -void e3d_texture_data_set(E3D_Texture *texture, Evas_3D_Color_Format format, Evas_3D_Pixel_Format pixel_format, int w, int h, const void *data); -void e3d_texture_file_set(E3D_Texture *texture, const char *file, const char *key); -Evas_3D_Color_Format e3d_texture_color_format_get(E3D_Texture *texture); void e3d_texture_size_get(const E3D_Texture *texture, int *w, int *h); +void e3d_texture_set(Evas_Engine_GL_Context *gc, E3D_Texture *texture, Evas_GL_Image *im); +Evas_GL_Image *e3d_texture_get(E3D_Texture *texture); void e3d_texture_import(E3D_Texture *texture, GLuint tex); Eina_Bool e3d_texture_is_imported_get(const E3D_Texture *texture); 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 948ec7b..87fbb8a 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,19 +111,25 @@ struct _E3D_Draw_Data struct _E3D_Texture { - int w, h; + /*Offset for atlasses*/ + int x, y; + int w, h; - Eina_Bool is_imported; - GLuint tex; - GLenum format; + Evas_GL_Image *surface; + /*Tranformation matrix, use it for adjusting texture unit coordinates*/ + Evas_Mat3 trans; - Eina_Bool wrap_dirty; - GLenum wrap_s; - GLenum wrap_t; + GLuint tex; - Eina_Bool filter_dirty; - GLenum filter_min; - GLenum filter_mag; + Eina_Bool wrap_dirty; + GLenum wrap_s; + GLenum wrap_t; + + Eina_Bool filter_dirty; + GLenum filter_min; + GLenum filter_mag; + /*Use atlas for generation texture unit, @EINA_TRUE by default*/ + Eina_Bool atlas_enable; }; struct _E3D_Drawable 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 9d858aa..59d68a0 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 @@ -32,6 +32,18 @@ typedef enum _E3D_Uniform E3D_UNIFORM_TEXTURE_EMISSION1, E3D_UNIFORM_TEXTURE_NORMAL1, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_AMBIENT0, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_DIFFUSE0, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_SPECULAR0, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_EMISSION0, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL0, + + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_AMBIENT1, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_DIFFUSE1, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_SPECULAR1, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_EMISSION1, + E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL1, + E3D_UNIFORM_SHADOWMAP, E3D_UNIFORM_LIGHT_POSITION, @@ -312,6 +324,16 @@ static const char *uniform_names[] = "uTextureSpecular1", "uTextureEmission1", "uTextureNormal1", + "uTextureMatrixTransformAmbient0", + "uTextureMatrixTransformDiffuse0", + "uTextureMatrixTransformSpecular0", + "uTextureMatrixTransformEmission0", + "uTextureMatrixTransformNormal0", + "uTextureMatrixTransformAmbient1", + "uTextureMatrixTransformDiffuse1", + "uTextureMatrixTransformSpecular1", + "uTextureMatrixTransformEmission1", + "uTextureMatrixTransformNormal1", "uShadowMap", "uLightPosition", "uLightSpotDir", @@ -344,6 +366,15 @@ _program_uniform_init(E3D_Program *program) static inline void _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data) { +#define SET_TEX_COORD_TRANSFORM_MATRIX(attrib, tn) \ + if (data->materials[attrib].tex##tn) \ + { \ + float m[9]; \ + for(int i = 0 ; i < 9 ; i++) \ + m[i] = data->materials[attrib].tex##tn->trans.m[i]; \ + glUniformMatrix3fv(loc, 1, EINA_FALSE, &m[0]); \ + } + switch (u) { case E3D_UNIFORM_MATRIX_MVP: { @@ -434,6 +465,46 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data) case E3D_UNIFORM_TEXTURE_NORMAL1: glUniform1i(loc, data->materials[EVAS_3D_MATERIAL_NORMAL].sampler1); break; + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_AMBIENT0: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_AMBIENT, 0) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_DIFFUSE0: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_DIFFUSE, 0) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_SPECULAR0: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_SPECULAR, 0) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_EMISSION0: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_EMISSION, 0) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL0: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_NORMAL, 0) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_AMBIENT1: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_AMBIENT, 1) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_DIFFUSE1: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_DIFFUSE, 1) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_SPECULAR1: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_SPECULAR, 1) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_EMISSION1: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_EMISSION, 1) + break; + } + case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL1: { + SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_3D_MATERIAL_NORMAL, 1) + break; + } case E3D_UNIFORM_SHADOWMAP: glUniform1i(loc, data->smap_sampler); break; @@ -512,6 +583,7 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data) ERR("Invalid uniform ID."); break; } +#undef SET_TEX_SHIFT } void 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 62e2626..75cbec2 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 @@ -129,22 +129,28 @@ static const char diffuse_frag_glsl[] = "uniform vec4 uLightDiffuse;\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "void main() {\n" " vec4 color;\n" " \n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureDiffuse1, vTexCoord),\n" - " texture2D(uTextureDiffuse0, vTexCoord), uTextureDiffuseWeight);\n" + " color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n" + " texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n" " color *= uMaterialDiffuse;\n" "#else\n" "#ifdef DIFFUSE_TEXTURE\n" - " color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n" + " color = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) * uMaterialDiffuse;\n" "#else\n" " color = uMaterialDiffuse;\n" "#endif //DIFFUSE_TEXTURE\n" @@ -309,7 +315,7 @@ static const char flat_frag_glsl[] = " shadow = 0.0;\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" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" " return shadow / 64.0;\n" "}\n" "#endif //SHADOWED\n" @@ -318,10 +324,16 @@ static const char flat_frag_glsl[] = "uniform vec4 uLightDiffuse;\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "#ifdef SPECULAR\n" @@ -330,10 +342,16 @@ static const char flat_frag_glsl[] = "uniform vec4 uMaterialSpecular;\n" "#ifdef SPECULAR_TEXTURE\n" "uniform sampler2D uTextureSpecular0;\n" + "uniform mat3 uTextureMatrixTransformSpecular0;\n" + "vec3 Tex0CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n" "#endif //SPECULAR_TEXTURE\n" "#ifdef SPECULAR_TEXTURE_BLEND\n" "uniform sampler2D uTextureSpecular1;\n" "uniform float uTextureSpecularWeight;\n" + "uniform mat3 uTextureMatrixTransformSpecular1;\n" + "vec3 Tex1CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n" "#endif //SPECULAR_TEXTURE_BLEND\n" "#endif //SPECULAR\n" "#ifdef AMBIENT\n" @@ -341,20 +359,32 @@ static const char flat_frag_glsl[] = "uniform vec4 uLightAmbient;\n" "#ifdef AMBIENT_TEXTURE\n" "uniform sampler2D uTextureAmbient0;\n" + "uniform mat3 uTextureMatrixTransformAmbient0;\n" + "vec3 Tex0CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n" "#endif //AMBIENT_TEXTURE\n" "#ifdef AMBIENT_TEXTURE_BLEND\n" "uniform sampler2D uTextureAmbient1;\n" "uniform float uTextureAmbientWeight;\n" + "uniform mat3 uTextureMatrixTransformAmbient1;\n" + "vec3 Tex1CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n" "#endif //AMBIENT_TEXTURE_BLEND\n" "#endif //AMBIENT\n" "#ifdef EMISSION\n" "uniform vec4 uMaterialEmission;\n" "#ifdef EMISSION_TEXTURE\n" "uniform sampler2D uTextureEmission0;\n" + "uniform mat3 uTextureMatrixTransformEmission0;\n" + "vec3 Tex0CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n" "#endif //EMISSION_TEXTURE\n" "#ifdef EMISSION_TEXTURE_BLEND\n" "uniform sampler2D uTextureEmission1;\n" "uniform float uTextureEmissionWeight;\n" + "uniform mat3 uTextureMatrixTransformEmission1;\n" + "vec3 Tex1CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n" "#endif //EMISSION_TEXTURE_BLEND\n" "#endif //EMISSION\n" "void fragmentFlat()\n" @@ -363,12 +393,12 @@ static const char flat_frag_glsl[] = "#ifdef DIFFUSE\n" " \n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureDiffuse1, vTexCoord),\n" - " texture2D(uTextureDiffuse0, vTexCoord), uTextureDiffuseWeight);\n" + " color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n" + " texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n" " color *= uMaterialDiffuse;\n" "#else\n" "#ifdef DIFFUSE_TEXTURE\n" - " color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n" + " color = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) * uMaterialDiffuse;\n" "#else\n" " color = uMaterialDiffuse;\n" "#endif //DIFFUSE_TEXTURE\n" @@ -380,12 +410,12 @@ static const char flat_frag_glsl[] = "#ifdef SPECULAR\n" " \n" "#ifdef SPECULAR_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureSpecular1, vTexCoord),\n" - " texture2D(uTextureSpecular0, vTexCoord), uTextureSpecularWeight);\n" + " color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n" + " texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n" " color *= uMaterialSpecular;\n" "#else\n" "#ifdef SPECULAR_TEXTURE\n" - " color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;\n" + " color = texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)) * uMaterialSpecular;\n" "#else\n" " color = uMaterialSpecular;\n" "#endif //SPECULAR_TEXTURE\n" @@ -398,12 +428,12 @@ static const char flat_frag_glsl[] = "#ifdef AMBIENT\n" " \n" "#ifdef AMBIENT_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureAmbient1, vTexCoord),\n" - " texture2D(uTextureAmbient0, vTexCoord), uTextureAmbientWeight);\n" + " color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n" + " texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n" " color *= uMaterialAmbient;\n" "#else\n" "#ifdef AMBIENT_TEXTURE\n" - " color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;\n" + " color = texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)) * uMaterialAmbient;\n" "#else\n" " color = uMaterialAmbient;\n" "#endif //AMBIENT_TEXTURE\n" @@ -413,12 +443,12 @@ static const char flat_frag_glsl[] = "#ifdef EMISSION\n" " \n" "#ifdef EMISSION_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureEmission1, vTexCoord),\n" - " texture2D(uTextureEmission0, vTexCoord), uTextureEmissionWeight);\n" + " color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n" + " texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n" " color *= uMaterialEmission;\n" "#else\n" "#ifdef EMISSION_TEXTURE\n" - " color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;\n" + " color = texture2D(uTextureEmission0, vec2(Tex0CoordEmission)) * uMaterialEmission;\n" "#else\n" " color = uMaterialEmission;\n" "#endif //EMISSION_TEXTURE\n" @@ -560,7 +590,7 @@ static const char phong_frag_glsl[] = " shadow = 0.0;\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" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" " return shadow / 64.0;\n" "}\n" "#endif //SHADOWED\n" @@ -569,10 +599,16 @@ static const char phong_frag_glsl[] = "uniform vec4 uLightDiffuse;\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "#ifdef SPECULAR\n" @@ -581,10 +617,16 @@ static const char phong_frag_glsl[] = "uniform vec4 uMaterialSpecular;\n" "#ifdef SPECULAR_TEXTURE\n" "uniform sampler2D uTextureSpecular0;\n" + "uniform mat3 uTextureMatrixTransformSpecular0;\n" + "vec3 Tex0CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n" "#endif //SPECULAR_TEXTURE\n" "#ifdef SPECULAR_TEXTURE_BLEND\n" "uniform sampler2D uTextureSpecular1;\n" "uniform float uTextureSpecularWeight;\n" + "uniform mat3 uTextureMatrixTransformSpecular1;\n" + "vec3 Tex1CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n" "#endif //SPECULAR_TEXTURE_BLEND\n" "#endif //SPECULAR\n" "#ifdef AMBIENT\n" @@ -592,20 +634,32 @@ static const char phong_frag_glsl[] = "uniform vec4 uLightAmbient;\n" "#ifdef AMBIENT_TEXTURE\n" "uniform sampler2D uTextureAmbient0;\n" + "uniform mat3 uTextureMatrixTransformAmbient0;\n" + "vec3 Tex0CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n" "#endif //AMBIENT_TEXTURE\n" "#ifdef AMBIENT_TEXTURE_BLEND\n" "uniform sampler2D uTextureAmbient1;\n" "uniform float uTextureAmbientWeight;\n" + "uniform mat3 uTextureMatrixTransformAmbient1;\n" + "vec3 Tex1CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n" "#endif //AMBIENT_TEXTURE_BLEND\n" "#endif //AMBIENT\n" "#ifdef EMISSION\n" "uniform vec4 uMaterialEmission;\n" "#ifdef EMISSION_TEXTURE\n" "uniform sampler2D uTextureEmission0;\n" + "uniform mat3 uTextureMatrixTransformEmission0;\n" + "vec3 Tex0CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n" "#endif //EMISSION_TEXTURE\n" "#ifdef EMISSION_TEXTURE_BLEND\n" "uniform sampler2D uTextureEmission1;\n" "uniform float uTextureEmissionWeight;\n" + "uniform mat3 uTextureMatrixTransformEmission1;\n" + "vec3 Tex1CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n" "#endif //EMISSION_TEXTURE_BLEND\n" "#endif //EMISSION\n" "#ifdef LIGHT_SPOT\n" @@ -635,12 +689,12 @@ static const char phong_frag_glsl[] = "#ifdef DIFFUSE\n" " \n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureDiffuse1, vTexCoord),\n" - " texture2D(uTextureDiffuse0, vTexCoord), uTextureDiffuseWeight);\n" + " color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n" + " texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n" " color *= uMaterialDiffuse;\n" "#else\n" "#ifdef DIFFUSE_TEXTURE\n" - " color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n" + " color = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) * uMaterialDiffuse;\n" "#else\n" " color = uMaterialDiffuse;\n" "#endif //DIFFUSE_TEXTURE\n" @@ -657,12 +711,12 @@ static const char phong_frag_glsl[] = " factor = pow(factor, uMaterialShininess);\n" " \n" "#ifdef SPECULAR_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureSpecular1, vTexCoord),\n" - " texture2D(uTextureSpecular0, vTexCoord), uTextureSpecularWeight);\n" + " color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n" + " texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n" " color *= uMaterialSpecular;\n" "#else\n" "#ifdef SPECULAR_TEXTURE\n" - " color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;\n" + " color = texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)) * uMaterialSpecular;\n" "#else\n" " color = uMaterialSpecular;\n" "#endif //SPECULAR_TEXTURE\n" @@ -679,12 +733,12 @@ static const char phong_frag_glsl[] = "#ifdef AMBIENT\n" " \n" "#ifdef AMBIENT_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureAmbient1, vTexCoord),\n" - " texture2D(uTextureAmbient0, vTexCoord), uTextureAmbientWeight);\n" + " color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n" + " texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n" " color *= uMaterialAmbient;\n" "#else\n" "#ifdef AMBIENT_TEXTURE\n" - " color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;\n" + " color = texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)) * uMaterialAmbient;\n" "#else\n" " color = uMaterialAmbient;\n" "#endif //AMBIENT_TEXTURE\n" @@ -699,12 +753,12 @@ static const char phong_frag_glsl[] = "#ifdef EMISSION\n" " \n" "#ifdef EMISSION_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureEmission1, vTexCoord),\n" - " texture2D(uTextureEmission0, vTexCoord), uTextureEmissionWeight);\n" + " color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n" + " texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n" " color *= uMaterialEmission;\n" "#else\n" "#ifdef EMISSION_TEXTURE\n" - " color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;\n" + " color = texture2D(uTextureEmission0, vec2(Tex0CoordEmission)) * uMaterialEmission;\n" "#else\n" " color = uMaterialEmission;\n" "#endif //EMISSION_TEXTURE\n" @@ -905,7 +959,7 @@ static const char normal_map_frag_glsl[] = " shadow = 0.0;\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" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" " return shadow / 64.0;\n" "}\n" "#endif //SHADOWED\n" @@ -921,10 +975,16 @@ static const char normal_map_frag_glsl[] = "uniform vec4 uLightDiffuse;\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "#ifdef SPECULAR\n" @@ -933,10 +993,16 @@ static const char normal_map_frag_glsl[] = "uniform vec4 uMaterialSpecular;\n" "#ifdef SPECULAR_TEXTURE\n" "uniform sampler2D uTextureSpecular0;\n" + "uniform mat3 uTextureMatrixTransformSpecular0;\n" + "vec3 Tex0CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n" "#endif //SPECULAR_TEXTURE\n" "#ifdef SPECULAR_TEXTURE_BLEND\n" "uniform sampler2D uTextureSpecular1;\n" "uniform float uTextureSpecularWeight;\n" + "uniform mat3 uTextureMatrixTransformSpecular1;\n" + "vec3 Tex1CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n" "#endif //SPECULAR_TEXTURE_BLEND\n" "#endif //SPECULAR\n" "#ifdef AMBIENT\n" @@ -944,20 +1010,32 @@ static const char normal_map_frag_glsl[] = "uniform vec4 uLightAmbient;\n" "#ifdef AMBIENT_TEXTURE\n" "uniform sampler2D uTextureAmbient0;\n" + "uniform mat3 uTextureMatrixTransformAmbient0;\n" + "vec3 Tex0CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n" "#endif //AMBIENT_TEXTURE\n" "#ifdef AMBIENT_TEXTURE_BLEND\n" "uniform sampler2D uTextureAmbient1;\n" "uniform float uTextureAmbientWeight;\n" + "uniform mat3 uTextureMatrixTransformAmbient1;\n" + "vec3 Tex1CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n" "#endif //AMBIENT_TEXTURE_BLEND\n" "#endif //AMBIENT\n" "#ifdef EMISSION\n" "uniform vec4 uMaterialEmission;\n" "#ifdef EMISSION_TEXTURE\n" "uniform sampler2D uTextureEmission0;\n" + "uniform mat3 uTextureMatrixTransformEmission0;\n" + "vec3 Tex0CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n" "#endif //EMISSION_TEXTURE\n" "#ifdef EMISSION_TEXTURE_BLEND\n" "uniform sampler2D uTextureEmission1;\n" "uniform float uTextureEmissionWeight;\n" + "uniform mat3 uTextureMatrixTransformEmission1;\n" + "vec3 Tex1CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n" "#endif //EMISSION_TEXTURE_BLEND\n" "#endif //EMISSION\n" "#ifdef LIGHT_SPOT\n" @@ -1019,12 +1097,12 @@ static const char normal_map_frag_glsl[] = "#ifdef DIFFUSE\n" " \n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureDiffuse1, vTexCoord),\n" - " texture2D(uTextureDiffuse0, vTexCoord), uTextureDiffuseWeight);\n" + " color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n" + " texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n" " color *= uMaterialDiffuse;\n" "#else\n" "#ifdef DIFFUSE_TEXTURE\n" - " color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n" + " color = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) * uMaterialDiffuse;\n" "#else\n" " color = uMaterialDiffuse;\n" "#endif //DIFFUSE_TEXTURE\n" @@ -1040,12 +1118,12 @@ static const char normal_map_frag_glsl[] = " factor = pow(factor, uMaterialShininess);\n" " \n" "#ifdef SPECULAR_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureSpecular1, vTexCoord),\n" - " texture2D(uTextureSpecular0, vTexCoord), uTextureSpecularWeight);\n" + " color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n" + " texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n" " color *= uMaterialSpecular;\n" "#else\n" "#ifdef SPECULAR_TEXTURE\n" - " color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;\n" + " color = texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)) * uMaterialSpecular;\n" "#else\n" " color = uMaterialSpecular;\n" "#endif //SPECULAR_TEXTURE\n" @@ -1062,12 +1140,12 @@ static const char normal_map_frag_glsl[] = "#ifdef AMBIENT\n" " \n" "#ifdef AMBIENT_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureAmbient1, vTexCoord),\n" - " texture2D(uTextureAmbient0, vTexCoord), uTextureAmbientWeight);\n" + " color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n" + " texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n" " color *= uMaterialAmbient;\n" "#else\n" "#ifdef AMBIENT_TEXTURE\n" - " color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;\n" + " color = texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)) * uMaterialAmbient;\n" "#else\n" " color = uMaterialAmbient;\n" "#endif //AMBIENT_TEXTURE\n" @@ -1080,12 +1158,12 @@ static const char normal_map_frag_glsl[] = "#ifdef EMISSION\n" " \n" "#ifdef EMISSION_TEXTURE_BLEND\n" - " color = mix(texture2D(uTextureEmission1, vTexCoord),\n" - " texture2D(uTextureEmission0, vTexCoord), uTextureEmissionWeight);\n" + " color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n" + " texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n" " color *= uMaterialEmission;\n" "#else\n" "#ifdef EMISSION_TEXTURE\n" - " color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;\n" + " color = texture2D(uTextureEmission0, vec2(Tex0CoordEmission)) * uMaterialEmission;\n" "#else\n" " color = uMaterialEmission;\n" "#endif //EMISSION_TEXTURE\n" @@ -1167,10 +1245,16 @@ static const char shadow_map_frag_glsl[] = "#ifdef DIFFUSE\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse =\n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse =\n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "#endif //ALPHA_TEST_ENABLED\n" @@ -1180,12 +1264,12 @@ static const char shadow_map_frag_glsl[] = "#endif\n" "#ifdef ALPHA_TEST_ENABLED\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" - " gl_FragColor = (texture2D(uTextureDiffuse0, vTexCoord) *\n" - " uTextureDiffuseWeight + texture2D(uTextureDiffuse1, vTexCoord) *\n" + " gl_FragColor = (texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) *\n" + " uTextureDiffuseWeight + texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)) *\n" " (1.0 - uTextureDiffuseWeight));\n" "#else\n" "#ifdef DIFFUSE_TEXTURE\n" - " gl_FragColor = texture2D(uTextureDiffuse0, vTexCoord) ;\n" + " gl_FragColor = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) ;\n" "#else\n" " gl_FragColor = vec4(1);\n" "#endif //DIFFUSE_TEXTURE\n" @@ -1361,10 +1445,13 @@ static const char parallax_occlusion_frag_glsl[] = "#endif\n" "varying vec3 vLightVector;\n" "varying vec3 vLightHalfVector;\n" - "uniform sampler2D uTextureNormal0;\n" "varying vec3 vEyeVector;\n" + "uniform sampler2D uTextureNormal0;\n" + "uniform mat3 uTextureMatrixTransformNormal0;\n" "#ifdef NEED_TEX_COORD\n" "varying vec2 vTexCoord;\n" + "vec3 Tex0CoordNormal = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;\n" "#endif //TEX_COORD\n" "#ifdef FOG_ENABLED\n" "uniform float uFogFactor;\n" @@ -1381,23 +1468,32 @@ static const char parallax_occlusion_frag_glsl[] = " shadow = 0.0;\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" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" " return shadow / 64.0;\n" "}\n" "#endif //SHADOWED\n" "#ifdef NORMAL_TEXTURE_BLEND\n" "uniform sampler2D uTextureNormal1;\n" "uniform float uTextureNormalWeight;\n" + "uniform mat3 uTextureMatrixTransformNormal1;\n" + "vec3 Tex1CoordNormal = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;\n" "#endif //NORMAL_TEXTURE_BLEND\n" "#ifdef DIFFUSE\n" "uniform vec4 uMaterialDiffuse;\n" "uniform vec4 uLightDiffuse;\n" "#ifdef DIFFUSE_TEXTURE\n" "uniform sampler2D uTextureDiffuse0;\n" + "uniform mat3 uTextureMatrixTransformDiffuse0;\n" + "vec3 Tex0CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n" "#endif //DIFFUSE_TEXTURE\n" "#ifdef DIFFUSE_TEXTURE_BLEND\n" "uniform sampler2D uTextureDiffuse1;\n" "uniform float uTextureDiffuseWeight;\n" + "uniform mat3 uTextureMatrixTransformDiffuse1;\n" + "vec3 Tex1CoordDiffuse = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n" "#endif //DIFFUSE_TEXTURE_BLEND\n" "#endif //DIFFUSE\n" "#ifdef SPECULAR\n" @@ -1406,10 +1502,16 @@ static const char parallax_occlusion_frag_glsl[] = "uniform vec4 uMaterialSpecular;\n" "#ifdef SPECULAR_TEXTURE\n" "uniform sampler2D uTextureSpecular0;\n" + "uniform mat3 uTextureMatrixTransformSpecular0;\n" + "vec3 Tex0CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n" "#endif //SPECULAR_TEXTURE\n" "#ifdef SPECULAR_TEXTURE_BLEND\n" "uniform sampler2D uTextureSpecular1;\n" "uniform float uTextureSpecularWeight;\n" + "uniform mat3 uTextureMatrixTransformSpecular1;\n" + "vec3 Tex1CoordSpecular = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n" "#endif //SPECULAR_TEXTURE_BLEND\n" "#endif //SPECULAR\n" "#ifdef AMBIENT\n" @@ -1417,20 +1519,32 @@ static const char parallax_occlusion_frag_glsl[] = "uniform vec4 uLightAmbient;\n" "#ifdef AMBIENT_TEXTURE\n" "uniform sampler2D uTextureAmbient0;\n" + "uniform mat3 uTextureMatrixTransformAmbient0;\n" + "vec3 Tex0CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n" "#endif //AMBIENT_TEXTURE\n" "#ifdef AMBIENT_TEXTURE_BLEND\n" "uniform sampler2D uTextureAmbient1;\n" "uniform float uTextureAmbientWeight;\n" + "uniform mat3 uTextureMatrixTransformAmbient1;\n" + "vec3 Tex1CoordAmbient = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n" "#endif //AMBIENT_TEXTURE_BLEND\n" "#endif //AMBIENT\n" "#ifdef EMISSION\n" "uniform vec4 uMaterialEmission;\n" "#ifdef EMISSION_TEXTURE\n" "uniform sampler2D uTextureEmission0;\n" + "uniform mat3 uTextureMatrixTransformEmission0;\n" + "vec3 Tex0CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n" "#endif //EMISSION_TEXTURE\n" "#ifdef EMISSION_TEXTURE_BLEND\n" "uniform sampler2D uTextureEmission1;\n" "uniform float uTextureEmissionWeight;\n" + "uniform mat3 uTextureMatrixTransformEmission1;\n" + "vec3 Tex1CoordEmission = \n" + " vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n" "#endif //EMISSION_TEXTURE_BLEND\n" "#endif //EMISSION\n" "#ifdef LIGHT_SPOT\n" @@ -1451,8 +1565,8 @@ static const char parallax_occlusion_frag_glsl[] = " vec2 dtex = parallaxScale * view.xy / view.z / numLayers;\n" " vec2 currentTextureCoords = tex;\n" "#ifdef NORMAL_TEXTURE_BLEND\n" - " float heightFromTexture = (1.0 - texture2D(uTextureNormal0, currentTextureCoords).a) * uTextureNormalWeight;\n" - " heightFromTexture += (1.0 - texture2D(uTextureNormal1, currentTextureCoords).a) *\n" + " float heightFromTexture = (1.0 - texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a) * uTextureNormalWeight;\n" + " heightFromTexture += (1.0 - texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).a) *\n" " (1.0 - uTextureNormalWeight);\n" "#else\n" " float heightFromTexture = 1.0 - texture2D(uTextureNormal0, currentTextureCoords).a;\n" @@ -1491,7 +1605,7 @@ static const char parallax_occlusion_frag_glsl[] = " vec3 normal;\n" " vec4 color;\n" " float parallaxHeight;\n" - " vec2 tex = parallaxMapping(vEyeVector, vTexCoord, parallaxHeight);\n" + " vec2 tex = parallaxMapping(vEyeVector, vec2(Tex0CoordNormal), parallaxHeight);\n" " vec3 lv = normalize(vLightVector);\n" "#ifdef NORMAL_TEXTURE_BLEND\n" " normal = texture2D(uTextureNormal0, tex).rgb * uTextureNormalWeight / texture2D(uTextureNormal0, tex).a;\n" 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 489c4ff..1d67172 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/include.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/include.shd @@ -12,10 +12,16 @@ varying vec2 vTexCoord; define(`FRAGMENT_SHADER_USE_TEXTURE', ` #ifdef $1_TEXTURE uniform sampler2D uTexture$2`0'; +uniform mat3 uTextureMatrixTransform$2`0'; +vec3 Tex0Coord$2 = + vec3(vTexCoord, 1.0) * uTextureMatrixTransform$2`0'; #endif //$1_TEXTURE #ifdef $1_TEXTURE_BLEND uniform sampler2D uTexture$2`1'; uniform float uTexture$2Weight; +uniform mat3 uTextureMatrixTransform$2`1'; +vec3 Tex1Coord$2 = + vec3(vTexCoord, 1.0) * uTextureMatrixTransform$2`1'; #endif //$1_TEXTURE_BLEND') define(`FRAGMENT_SHADER_USE_FOG', ` @@ -36,7 +42,7 @@ float pcf(vec4 lpos, float size) 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); + shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x); return shadow / 64.0; } #endif //SHADOWED') @@ -61,12 +67,12 @@ varying float vLightDist; define(`FRAGMENT_SHADER_TEXTURE_BLEND', ` #ifdef $1_TEXTURE_BLEND - color = mix(texture2D(uTexture$2`1', vTexCoord), - texture2D(uTexture$2`0', vTexCoord), uTexture$2Weight); + color = mix(texture2D(uTexture$2`1', vec2(Tex1Coord$2)), + texture2D(uTexture$2`0', vec2(Tex0Coord$2)), uTexture$2Weight); color *= uMaterial$2; #else #ifdef $1_TEXTURE - color = texture2D(uTexture$2`0', vTexCoord) * uMaterial$2; + color = texture2D(uTexture$2`0', vec2(Tex0Coord$2)) * uMaterial$2; #else color = uMaterial$2; #endif //$1_TEXTURE 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 598343d..6faab21 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 @@ -1,10 +1,13 @@ varying vec3 vLightVector; varying vec3 vLightHalfVector; -uniform sampler2D uTextureNormal0; varying vec3 vEyeVector; +uniform sampler2D uTextureNormal0; +uniform mat3 uTextureMatrixTransformNormal0; #ifdef NEED_TEX_COORD varying vec2 vTexCoord; +vec3 Tex0CoordNormal = + vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0; #endif //TEX_COORD FRAGMENT_SHADER_USE_FOG @@ -13,6 +16,9 @@ FRAGMENT_SHADER_USE_SHADOWS #ifdef NORMAL_TEXTURE_BLEND uniform sampler2D uTextureNormal1; uniform float uTextureNormalWeight; +uniform mat3 uTextureMatrixTransformNormal1; +vec3 Tex1CoordNormal = + vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1; #endif //NORMAL_TEXTURE_BLEND FRAGMENT_SHADER_USE_DIFFUSE_TERM @@ -35,8 +41,8 @@ vec2 parallaxMapping(in vec3 view, in vec2 tex, out float parallaxHeight) vec2 currentTextureCoords = tex; #ifdef NORMAL_TEXTURE_BLEND - float heightFromTexture = (1.0 - texture2D(uTextureNormal0, currentTextureCoords).a) * uTextureNormalWeight; - heightFromTexture += (1.0 - texture2D(uTextureNormal1, currentTextureCoords).a) * + float heightFromTexture = (1.0 - texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a) * uTextureNormalWeight; + heightFromTexture += (1.0 - texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).a) * (1.0 - uTextureNormalWeight); #else float heightFromTexture = 1.0 - texture2D(uTextureNormal0, currentTextureCoords).a; @@ -83,7 +89,7 @@ void fragmentParallaxMap() vec4 color; float parallaxHeight; - vec2 tex = parallaxMapping(vEyeVector, vTexCoord, parallaxHeight); + vec2 tex = parallaxMapping(vEyeVector, vec2(Tex0CoordNormal), parallaxHeight); vec3 lv = normalize(vLightVector); 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 index c1e6964..23c339e 100644 --- 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 @@ -5,11 +5,17 @@ FRAGMENT_SHADER_USE_TEX_COORD #ifdef DIFFUSE_TEXTURE uniform sampler2D uTextureDiffuse0; +uniform mat3 uTextureMatrixTransformDiffuse0; +vec3 Tex0CoordDiffuse = + vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0; #endif //DIFFUSE_TEXTURE #ifdef DIFFUSE_TEXTURE_BLEND uniform sampler2D uTextureDiffuse1; uniform float uTextureDiffuseWeight; +uniform mat3 uTextureMatrixTransformDiffuse1; +vec3 Tex1CoordDiffuse = + vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1; #endif //DIFFUSE_TEXTURE_BLEND #endif //DIFFUSE @@ -23,13 +29,13 @@ void main() { #ifdef ALPHA_TEST_ENABLED #ifdef DIFFUSE_TEXTURE_BLEND - gl_FragColor = (texture2D(uTextureDiffuse0, vTexCoord) * - uTextureDiffuseWeight + texture2D(uTextureDiffuse1, vTexCoord) * + gl_FragColor = (texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) * + uTextureDiffuseWeight + texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)) * (1.0 - uTextureDiffuseWeight)); #else #ifdef DIFFUSE_TEXTURE - gl_FragColor = texture2D(uTextureDiffuse0, vTexCoord) ; + gl_FragColor = texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)) ; #else gl_FragColor = vec4(1); #endif //DIFFUSE_TEXTURE diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 2597753..cd08995 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -2203,9 +2203,9 @@ eng_drawable_scene_render_to_texture(void *data, void *drawable, void *scene_dat } static void * -eng_texture_new(void *data EINA_UNUSED) +eng_texture_new(void *data EINA_UNUSED, Eina_Bool use_atlas) { - return e3d_texture_new(); + return e3d_texture_new(use_atlas); } static void @@ -2215,41 +2215,6 @@ eng_texture_free(void *data EINA_UNUSED, void *texture) } static void -eng_texture_data_set(void *data, void *texture, Evas_3D_Color_Format color_format, - Evas_3D_Pixel_Format pixel_format, int w, int h, const void *pixels) -{ - Evas_Engine_GL_Context *gl_context; - Render_Engine_GL_Generic *re = data; - - re->window_use(re->software.ob); - gl_context = re->window_gl_context_get(re->software.ob); - evas_gl_common_context_flush(gl_context); - eng_context_3d_use(data); - - e3d_texture_data_set((E3D_Texture *)texture, color_format, pixel_format, w, h, pixels); -} - -static void -eng_texture_file_set(void *data, void *texture, const char *file, const char *key) -{ - Evas_Engine_GL_Context *gl_context; - Render_Engine_GL_Generic *re = data; - - re->window_use(re->software.ob); - gl_context = re->window_gl_context_get(re->software.ob); - evas_gl_common_context_flush(gl_context); - eng_context_3d_use(data); - - e3d_texture_file_set((E3D_Texture *)texture, file, key); -} - -static void -eng_texture_color_format_get(void *data EINA_UNUSED, void *texture, Evas_3D_Color_Format *format) -{ - *format = e3d_texture_color_format_get((E3D_Texture *)texture); -} - -static void eng_texture_size_get(void *data EINA_UNUSED, void *texture, int *w, int *h) { e3d_texture_size_get((E3D_Texture *)texture, w, h); @@ -2284,10 +2249,21 @@ eng_texture_filter_get(void *data EINA_UNUSED, void *texture, } static void -eng_texture_image_set(void *data EINA_UNUSED, void *texture, void *image) +eng_texture_image_set(void *data, void *texture, void *image) +{ + Evas_Engine_GL_Context *gl_context; + Render_Engine_GL_Generic *re = data; + + re->window_use(re->software.ob); + gl_context = re->window_gl_context_get(re->software.ob); + + e3d_texture_set(gl_context, (E3D_Texture *)texture, (Evas_GL_Image *)image); +} + +static void * +eng_texture_image_get(void *data EINA_UNUSED, void *texture) { - Evas_GL_Image *im = (Evas_GL_Image *)image; - e3d_texture_import((E3D_Texture *)texture, im->tex->pt->texture); + return e3d_texture_get((E3D_Texture *)texture); } static Ector_Surface *_software_ector = NULL; @@ -2607,15 +2583,13 @@ module_open(Evas_Module *em) ORD(texture_new); ORD(texture_free); - ORD(texture_data_set); - ORD(texture_file_set); - ORD(texture_color_format_get); ORD(texture_size_get); ORD(texture_wrap_set); ORD(texture_wrap_get); ORD(texture_filter_set); ORD(texture_filter_get); ORD(texture_image_set); + ORD(texture_image_get); ORD(ector_get); ORD(ector_begin); diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index dfdcb5c..3a796f6 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -3917,15 +3917,13 @@ static Evas_Func func = NULL, // eng_drawable_texture_pixel_color_get NULL, // eng_texture_new NULL, // eng_texture_free - NULL, // eng_texture_data_set - NULL, // eng_texture_file_set - NULL, // eng_texture_color_format_get NULL, // eng_texture_size_get NULL, // eng_texture_wrap_set NULL, // eng_texture_wrap_get NULL, // eng_texture_filter_set NULL, // eng_texture_filter_get NULL, // eng_texture_image_set + NULL, // eng_texture_image_get eng_ector_get, eng_ector_begin, eng_ector_renderer_draw, --