CODING CONVENTIONS AND COMMIT GUIDELINES!!! Commit message should be:
evas 3d: mechanism... Lines are too long. Indentation is completely broken for this patch. Please start rejecting patches. -- Tom. On 11/02/15 17:50, Oleksandr Shcherbina wrote: > cedric pushed a commit to branch master. > > http://git.enlightenment.org/core/efl.git/commit/?id=dc0b144cf09deba3a5a6fe746f0130b67b5bf64b > > commit dc0b144cf09deba3a5a6fe746f0130b67b5bf64b > Author: Oleksandr Shcherbina <o.shcherb...@samsung.com> > Date: Wed Feb 11 17:44:42 2015 +0100 > > evas: Evas_3D - mechanism for finding node by color pick. > > Summary: > See first part https://phab.enlightenment.org/D1811 (backend, gl) > > Add get/set for color pick mode at evas_3d_mesh and evas_3d_scene > Add evas_3d_node_color_node_mesh_collect function to collect data at > force rendering > Add state flag for scene to avoid useless force rendering in case scene > wasn't changed > Add functionality for color pick in evas_3d_scene_pick method > > Reviewers: Hermet, raster, cedric > > Reviewed By: cedric > > Subscribers: cedric > > Differential Revision: https://phab.enlightenment.org/D1956 > > Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> > --- > src/lib/evas/Evas_Eo.h | 1 + > src/lib/evas/canvas/evas_3d_mesh.c | 17 ++++++ > src/lib/evas/canvas/evas_3d_mesh.eo | 21 +++++++ > src/lib/evas/canvas/evas_3d_node.c | 71 +++++++++++++++++++++++ > src/lib/evas/canvas/evas_3d_scene.c | 109 > +++++++++++++++++++++++++++++++++-- > src/lib/evas/canvas/evas_3d_scene.eo | 21 +++++++ > src/lib/evas/include/evas_private.h | 8 ++- > 7 files changed, 242 insertions(+), 6 deletions(-) > > diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h > index 8fa89b3..033ada2 100644 > --- a/src/lib/evas/Evas_Eo.h > +++ b/src/lib/evas/Evas_Eo.h > @@ -468,6 +468,7 @@ typedef enum _Evas_3D_State > EVAS_3D_STATE_SCENE_BACKGROUND_COLOR, > EVAS_3D_STATE_SCENE_SIZE, > EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, > + EVAS_3D_STATE_SCENE_UPDATED, > > EVAS_3D_STATE_TEXTURE_DATA = 1, > EVAS_3D_STATE_TEXTURE_WRAP, > diff --git a/src/lib/evas/canvas/evas_3d_mesh.c > b/src/lib/evas/canvas/evas_3d_mesh.c > index ddbf619..44304380 100644 > --- a/src/lib/evas/canvas/evas_3d_mesh.c > +++ b/src/lib/evas/canvas/evas_3d_mesh.c > @@ -120,6 +120,9 @@ _mesh_init(Evas_3D_Mesh_Data *pd) > pd->blend_sfactor = EVAS_3D_BLEND_ONE; > pd->blend_dfactor = EVAS_3D_BLEND_ZERO; > pd->blending = EINA_FALSE; > + > + pd->color_pick_key = -1.0; > + pd->color_pick_enabled = EINA_FALSE; > } > > static inline void > @@ -963,4 +966,18 @@ evas_3d_mesh_interpolate_vertex_buffer_get(Evas_3D_Mesh > *mesh, int frame, > } > } > > +EOLIAN static Eina_Bool > +_evas_3d_mesh_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data > *pd) > +{ > + return pd->color_pick_enabled; > +} > +EOLIAN static Eina_Bool > +_evas_3d_mesh_color_pick_enable_set(Eo *obj, Evas_3D_Mesh_Data *pd, > Eina_Bool _enabled) > +{ > + if (pd->color_pick_enabled != _enabled) > + pd->color_pick_enabled = _enabled; > + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_COLOR_PICK, NULL)); > + return EINA_TRUE; > +} > + > #include "canvas/evas_3d_mesh.eo.c" > diff --git a/src/lib/evas/canvas/evas_3d_mesh.eo > b/src/lib/evas/canvas/evas_3d_mesh.eo > index 5657b32..a23654a 100644 > --- a/src/lib/evas/canvas/evas_3d_mesh.eo > +++ b/src/lib/evas/canvas/evas_3d_mesh.eo > @@ -352,6 +352,27 @@ class Evas_3D_Mesh (Evas_3D_Object, > Evas.Common_Interface, Efl.File) > params { > } > } > + color_pick_enable_get @const { > + /* > + Get status of color picking of the mesh. > + > + @ingroup Evas_3D_Mesh > + */ > + return: bool; > + params { > + } > + } > + color_pick_enable_set { > + /* > + Set posibility color picking. > + > + @ingroup Evas_3D_Mesh > + */ > + return: bool; > + params { > + @in bool _enabled; /*@ Posibility flag */ > + } > + } > } > properties { > shade_mode { > diff --git a/src/lib/evas/canvas/evas_3d_node.c > b/src/lib/evas/canvas/evas_3d_node.c > index a5355ed..62e2c1c 100644 > --- a/src/lib/evas/canvas/evas_3d_node.c > +++ b/src/lib/evas/canvas/evas_3d_node.c > @@ -6,6 +6,27 @@ > > Evas_3D_Mesh_Frame *evas_3d_mesh_frame_find(Evas_3D_Mesh_Data *pd, int > frame); > > +static Eina_Stringshare * > +_generate_unic_color_key(Evas_Color *color, Evas_Color *bg_color, > Evas_3D_Node *node, Evas_3D_Mesh *mesh, > + Eina_Bool init) > +{ > + static unsigned short red = USHRT_MAX; > + > + if (init) red = USHRT_MAX; > + > + if (fabs(bg_color->r - (double)red) <= DBL_EPSILON) red--; > + > + color->r = (double)red / USHRT_MAX; > + color->g = 0.0; > + color->b = 0.0; > + > + red--; > + > + if (red < 1) red = USHRT_MAX; > + > + return eina_stringshare_printf("%p %p", node, mesh); > +} > + > static inline Evas_3D_Node_Mesh * > _node_mesh_new(Evas_3D_Node *node, Evas_3D_Mesh *mesh) > { > @@ -795,6 +816,56 @@ evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data) > } > > Eina_Bool > +evas_3d_node_color_node_mesh_collect(Evas_3D_Node *node, void *data) > +{ > + Evas_3D_Scene_Public_Data *scene_data = (Evas_3D_Scene_Public_Data *)data; > + Evas_3D_Node_Data *pd = eo_data_scope_get(node, MY_CLASS); > + Evas_3D_Node_Data *pd_camera = eo_data_scope_get(scene_data->camera_node, > MY_CLASS); > + Evas_3D_Camera *camera = (Evas_3D_Camera*)pd_camera->data.camera.camera; > + > + Eina_List *list_meshes, *l; > + Evas_3D_Mesh *mesh; > + Eina_Stringshare *key, *datakey; > + Evas_Color *color; > + Eina_Bool visible = EINA_FALSE; > + Eina_Array *arr; > + if (pd->type == EVAS_3D_NODE_TYPE_MESH) > + { > + eo_do(camera, > + visible = > evas_3d_camera_node_visible_get(scene_data->camera_node, > + node, > EVAS_3D_FRUSTUM_MODE_BSPHERE)); > + if (visible) > + { > + eo_do (node, list_meshes = (Eina_List > *)evas_3d_node_mesh_list_get()); > + EINA_LIST_FOREACH(list_meshes, l, mesh) > + { > + if (eo_do(mesh, evas_3d_mesh_color_pick_enable_get())) > + { > + color = calloc(1, sizeof(Evas_Color)); > + > + if > (!eina_hash_population(scene_data->node_mesh_colors)) > + key = _generate_unic_color_key(color, > &scene_data->bg_color, > + node, mesh, > EINA_TRUE); > + else > + key = _generate_unic_color_key(color, > &scene_data->bg_color, > + node, mesh, > EINA_FALSE); > + > + datakey = eina_stringshare_printf("%f %f %f", > color->r, color->g, color->b); > + eina_hash_add(scene_data->node_mesh_colors, key, > color); > + arr = eina_array_new(2); > + eina_array_push(arr, (void *)node); > + eina_array_push(arr, (void *)mesh); > + eina_hash_add(scene_data->colors_node_mesh, datakey, > arr); > + } > + } > + } > + else > + return EINA_FALSE; > + } > + return EINA_TRUE; > +} > + > +Eina_Bool > evas_3d_node_light_collect(Evas_3D_Node *node, void *data) > { > Evas_3D_Scene_Public_Data *scene_data = (Evas_3D_Scene_Public_Data > *)data; > diff --git a/src/lib/evas/canvas/evas_3d_scene.c > b/src/lib/evas/canvas/evas_3d_scene.c > index 0e177a7..a26b6c8 100644 > --- a/src/lib/evas/canvas/evas_3d_scene.c > +++ b/src/lib/evas/canvas/evas_3d_scene.c > @@ -9,6 +9,8 @@ evas_3d_scene_data_init(Evas_3D_Scene_Public_Data *data) > data->camera_node = NULL; > data->light_nodes = NULL; > data->mesh_nodes = NULL; > + data->node_mesh_colors = NULL; > + data->colors_node_mesh = NULL; > } > > void > @@ -46,6 +48,8 @@ _evas_3d_scene_evas_3d_object_update_notify(Eo *obj > EINA_UNUSED, Evas_3D_Scene_D > { > eo_do(pd->camera_node, evas_3d_object_update()); > } > + > + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_UPDATED, NULL)); > } > > EAPI Evas_3D_Scene * > @@ -65,6 +69,9 @@ _evas_3d_scene_eo_base_constructor(Eo *obj, > Evas_3D_Scene_Data *pd) > eo_do(obj, evas_3d_object_type_set(EVAS_3D_OBJECT_TYPE_SCENE)); > evas_color_set(&pd->bg_color, 0.0, 0.0, 0.0, 0.0); > pd->shadows_enabled = EINA_FALSE; > + pd->color_pick_enabled = EINA_FALSE; > + pd->node_mesh_colors = NULL; > + pd->colors_node_mesh = NULL; > } > > EOLIAN static void > @@ -608,17 +615,32 @@ _node_pick(Evas_3D_Node *node, void *data) > return EINA_TRUE; > } > > +static void _node_mesh_colors_free_cb(void *data) > +{ > + if (data) free(data); > +} > + > EOLIAN static Eina_Bool > _evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real > y, > Evas_3D_Node **node, Evas_3D_Mesh **mesh, > Evas_Real *s, Evas_Real *t) > { > - /* TODO: Use H/W picking if availabe. */ > Evas_3D_Pick_Data data; > + Evas_3D_Node_Data *pd_camera_node; > + Evas_3D_Camera_Data *pd_camera; > + Evas_3D_Object_Data *pd_parent; > + Evas_Public_Data *e; > + int tex, px, py;; > + double redcomponent; > + Eina_Stringshare *tmp; > + Eina_Array *arr = NULL; > + Eina_Bool update_scene = EINA_FALSE; > + > + pd_parent = eo_data_scope_get(obj, EVAS_3D_OBJECT_CLASS); > + e = eo_data_scope_get(pd_parent->evas, EVAS_CANVAS_CLASS); > > data.x = ((x * 2.0) / (Evas_Real)pd->w) - 1.0; > data.y = (((pd->h - y - 1) * 2.0) / ((Evas_Real)pd->h)) - 1.0; > - > data.picked = EINA_FALSE; > data.z = 1.0; > data.node = NULL; > @@ -626,17 +648,78 @@ _evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, > Evas_Real x, Evas_Real y, > data.s = 0.0; > data.t = 0.0; > > + px = round(x * pd->w / e->viewport.w); > + py = round((pd->h - (y * pd->h / e->viewport.h) - 1)); > + > + /*Use color pick mechanism finding node and mesh*/ > + if (pd->color_pick_enabled) > + { > + Evas_3D_Scene_Public_Data scene_data; > + > + scene_data.bg_color = pd->bg_color; > + scene_data.shadows_enabled = pd->shadows_enabled; > + scene_data.camera_node = pd->camera_node; > + scene_data.color_pick_enabled = pd->color_pick_enabled; > + update_scene = eo_do(obj, > evas_3d_object_dirty_get(EVAS_3D_STATE_SCENE_UPDATED)); > + if (update_scene) > + { > + if (pd->node_mesh_colors) > + { > + eina_hash_free(pd->node_mesh_colors); > + eina_hash_free(pd->colors_node_mesh); > + pd->node_mesh_colors = NULL; > + pd->colors_node_mesh = NULL; > + } > + pd->node_mesh_colors = > eina_hash_stringshared_new(_node_mesh_colors_free_cb); > + pd->colors_node_mesh = > eina_hash_stringshared_new(_node_mesh_colors_free_cb); > + } > + scene_data.node_mesh_colors = pd->node_mesh_colors; > + scene_data.colors_node_mesh = pd->colors_node_mesh; > + evas_3d_node_tree_traverse(pd->root_node, > + EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, > EINA_TRUE, > + evas_3d_node_color_node_mesh_collect, > &scene_data); > + > + if (e->engine.func->drawable_scene_render_to_texture) > + { > + if > (e->engine.func->drawable_scene_render_to_texture(e->engine.data.output, > + pd->surface, > &scene_data)) > + { > + if (e->engine.func->drawable_texture_color_pick_id_get) > + tex = > e->engine.func->drawable_texture_color_pick_id_get(pd->surface); > + if (e->engine.func->drawable_texture_pixel_color_get) > + { > + redcomponent = > e->engine.func->drawable_texture_pixel_color_get(tex, px, py, pd->surface); > + tmp = eina_stringshare_printf("%f %f %f", > redcomponent, 0.0, 0.0); > + arr = (Eina_Array > *)eina_hash_find(pd->colors_node_mesh, tmp); > + if (arr) > + { > + if (mesh) *mesh = (Evas_3D_Mesh > *)eina_array_data_get(arr, 1); > + if (node) *node = (Evas_3D_Node > *)eina_array_data_get(arr, 0); > + eina_stringshare_del(tmp); > + > + return EINA_TRUE; > + } > + else > + { > + eina_stringshare_del(tmp); > + if (mesh) *mesh = NULL; > + if (node) *node = NULL; > + } > + } > + } > + } > + return EINA_FALSE; > + } > /* Update the scene graph. */ > eo_do(obj, evas_3d_object_update()); > - Evas_3D_Node_Data *pd_camera_node = eo_data_scope_get(pd->camera_node, > EVAS_3D_NODE_CLASS); > - Evas_3D_Camera_Data *pd_camera = > eo_data_scope_get(pd_camera_node->data.camera.camera, EVAS_3D_CAMERA_CLASS); > + pd_camera_node = eo_data_scope_get(pd->camera_node, EVAS_3D_NODE_CLASS); > + pd_camera = eo_data_scope_get(pd_camera_node->data.camera.camera, > EVAS_3D_CAMERA_CLASS); > evas_mat4_multiply(&data.matrix_vp, > &pd_camera->projection, > &pd_camera_node->data.camera.matrix_world_to_eye); > > evas_ray3_init(&data.ray_world, data.x, data.y, &data.matrix_vp); > > - > /* Traverse tree while adding meshes into pick data structure. */ > evas_3d_node_tree_traverse(pd->root_node, > EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE, > _node_pick, &data); > @@ -726,4 +809,20 @@ _evas_3d_scene_shadows_enable_set(Eo *obj EINA_UNUSED, > Evas_3D_Scene_Data *pd, E > eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, > NULL)); > } > > +EOLIAN static Eina_Bool > +_evas_3d_scene_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data > *pd) > +{ > + return pd->color_pick_enabled; > +} > + > +EOLIAN static Eina_Bool > +_evas_3d_scene_color_pick_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data > *pd, Eina_Bool _enabled) > +{ > + if (pd->color_pick_enabled != _enabled) > + pd->color_pick_enabled = _enabled; > + > + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_UPDATED, NULL)); > + return EINA_TRUE; > +} > + > #include "canvas/evas_3d_scene.eo.c" > diff --git a/src/lib/evas/canvas/evas_3d_scene.eo > b/src/lib/evas/canvas/evas_3d_scene.eo > index 1078c02..bb25f90 100644 > --- a/src/lib/evas/canvas/evas_3d_scene.eo > +++ b/src/lib/evas/canvas/evas_3d_scene.eo > @@ -136,6 +136,27 @@ class Evas_3D_Scene (Evas_3D_Object, > Evas.Common_Interface) > params { > } > } > + color_pick_enable_get @const { > + /* > + Get status of color picking of the scene. > + > + @ingroup Evas_3D_Scene > + */ > + return: bool; > + params { > + } > + } > + color_pick_enable_set { > + /* > + Set posibility color picking. > + > + @ingroup Evas_3D_Scene > + */ > + return: bool; > + params { > + @in bool color_pick; /*@ Posibility flag */ > + } > + } > } > properties { > > diff --git a/src/lib/evas/include/evas_private.h > b/src/lib/evas/include/evas_private.h > index c07cfa3..ceab19d 100644 > --- a/src/lib/evas/include/evas_private.h > +++ b/src/lib/evas/include/evas_private.h > @@ -191,11 +191,15 @@ struct _Evas_3D_Scene > Evas_3D_Node *root_node; > Evas_3D_Node *camera_node; > Evas_Color bg_color; > + Eina_Bool shadows_enabled :1; > + Eina_Bool color_pick_enabled :1; > > void *surface; > int w, h; > Eina_List *images; > - Eina_Bool shadows_enabled :1; > + > + Eina_Hash *node_mesh_colors; > + Eina_Hash *colors_node_mesh; > }; > > struct _Evas_3D_Node_Mesh > @@ -380,6 +384,7 @@ struct _Evas_3D_Scene_Public_Data > Eina_List *mesh_nodes; > Eina_Bool shadows_enabled :1; > Eina_Bool color_pick_enabled :1; > + > Eina_Hash *node_mesh_colors; > Eina_Hash *colors_node_mesh; > }; > @@ -1628,6 +1633,7 @@ void _canvas_smart_objects_calculate_count_get(Eo *e, > void *_pd, va_list *list); > void evas_3d_node_traverse(Evas_3D_Node *from, Evas_3D_Node *to, > Evas_3D_Node_Traverse_Type type, Eina_Bool skip, Evas_3D_Node_Func func, void > *data); > void evas_3d_node_tree_traverse(Evas_3D_Node *root, > Evas_3D_Tree_Traverse_Type type, Eina_Bool skip, Evas_3D_Node_Func func, void > *data); > Eina_Bool evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data); > +Eina_Bool evas_3d_node_color_node_mesh_collect(Evas_3D_Node *node, void > *data); > Eina_Bool evas_3d_node_light_collect(Evas_3D_Node *node, void *data); > void evas_3d_node_scene_root_add(Evas_3D_Node *node, Evas_3D_Scene *scene); > void evas_3d_node_scene_root_del(Evas_3D_Node *node, Evas_3D_Scene *scene); > * ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel