summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2015-02-09 22:16:51 +0100
committerCedric BAIL <cedric@osg.samsung.com>2015-02-09 22:16:51 +0100
commit6f3f92b72a2e600718eadead399346ede47de199 (patch)
tree3b709ecaf9c41243f22360c948f3f970532e2122 /src
parent2d403151270d074cb10367232ef7109d65e6be00 (diff)
parentd5496b09ad51ebcfaa541335bb89477682e038d1 (diff)
Merge branch 'devs/cedric/next'
Just merging patch that did come during the end of our last release cycle and couldn't get in as they were to much of a new feature.
Diffstat (limited to '')
-rw-r--r--src/benchmarks/eina/eina_bench.c4
-rw-r--r--src/bin/edje/edje_cc.h2
-rwxr-xr-xsrc/bin/edje/edje_cc_out.c174
-rw-r--r--src/lib/edje/edje_private.h1
-rw-r--r--src/lib/eldbus/eldbus_proxy.c53
-rw-r--r--src/lib/evas/Evas_Eo.h12
-rw-r--r--src/lib/evas/canvas/evas_3d_node.c80
-rw-r--r--src/lib/evas/include/evas_private.h10
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d.c166
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_common.h3
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_private.h6
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_shader.c15
-rw-r--r--src/modules/evas/engines/gl_generic/evas_engine.c33
-rw-r--r--src/tests/ecore/ecore_test_ecore_con.c69
14 files changed, 543 insertions, 85 deletions
diff --git a/src/benchmarks/eina/eina_bench.c b/src/benchmarks/eina/eina_bench.c
index 1f7d18cec4..dec210e06d 100644
--- a/src/benchmarks/eina/eina_bench.c
+++ b/src/benchmarks/eina/eina_bench.c
@@ -68,6 +68,10 @@ static void _mempool_shutdown(void)
68 eina_module_list_free(_modules); 68 eina_module_list_free(_modules);
69 if (_modules) 69 if (_modules)
70 { 70 {
71 Eina_Array_Iterator it;
72 char* module;
73 unsigned int i;
74
71 EINA_ARRAY_ITER_NEXT(_modules, i, module, it) 75 EINA_ARRAY_ITER_NEXT(_modules, i, module, it)
72 free(module); 76 free(module);
73 eina_array_free(_modules); 77 eina_array_free(_modules);
diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h
index 7b794ed0ed..d5ee9aa6c3 100644
--- a/src/bin/edje/edje_cc.h
+++ b/src/bin/edje/edje_cc.h
@@ -184,8 +184,10 @@ void data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int
184void data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest); 184void data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest);
185void data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest); 185void data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest);
186void data_queue_image_lookup(char *name, int *dest, Eina_Bool *set); 186void data_queue_image_lookup(char *name, int *dest, Eina_Bool *set);
187void data_queue_model_lookup(char *name, int *dest, Eina_Bool *set);
187void data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set); 188void data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set);
188void data_queue_image_remove(int *dest, Eina_Bool *set); 189void data_queue_image_remove(int *dest, Eina_Bool *set);
190void data_queue_model_remove(int *dest, Eina_Bool *set);
189void data_queue_spectrum_lookup(char *name, int *dest); 191void data_queue_spectrum_lookup(char *name, int *dest);
190void data_queue_spectrum_slave_lookup(int *master, int *slave); 192void data_queue_spectrum_slave_lookup(int *master, int *slave);
191void data_process_lookups(void); 193void data_process_lookups(void);
diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c
index 4f582c779c..a284bebfff 100755
--- a/src/bin/edje/edje_cc_out.c
+++ b/src/bin/edje/edje_cc_out.c
@@ -213,6 +213,7 @@ static Eina_List *program_lookups = NULL;
213static Eina_List *group_lookups = NULL; 213static Eina_List *group_lookups = NULL;
214static Eina_List *face_group_lookups = NULL; 214static Eina_List *face_group_lookups = NULL;
215static Eina_List *image_lookups = NULL; 215static Eina_List *image_lookups = NULL;
216static Eina_List *model_lookups = NULL;
216 217
217static Eina_Hash *part_dest_lookup = NULL; 218static Eina_Hash *part_dest_lookup = NULL;
218static Eina_Hash *part_pc_dest_lookup = NULL; 219static Eina_Hash *part_pc_dest_lookup = NULL;
@@ -2571,6 +2572,36 @@ data_queue_image_remove(int *dest, Eina_Bool *set)
2571 } 2572 }
2572 2573
2573void 2574void
2575data_queue_model_lookup(char *name, int *dest, Eina_Bool *set)
2576{
2577 Image_Lookup *il;
2578
2579 il = mem_alloc(SZ(Image_Lookup));
2580 model_lookups = eina_list_append(model_lookups, il);
2581 il->name = mem_strdup(name);
2582 il->dest = dest;
2583 il->set = set;
2584}
2585
2586void
2587data_queue_model_remove(int *dest, Eina_Bool *set)
2588{
2589 Eina_List *l;
2590 Image_Lookup *il;
2591
2592 EINA_LIST_FOREACH(model_lookups, l, il)
2593 {
2594 if (il->dest == dest && il->set == set)
2595 {
2596 model_lookups = eina_list_remove_list(model_lookups, l);
2597 free(il->name);
2598 free(il);
2599 return;
2600 }
2601 }
2602}
2603
2604void
2574data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set) 2605data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set)
2575{ 2606{
2576 Eina_List *l; 2607 Eina_List *l;
@@ -2731,6 +2762,7 @@ _data_image_id_update(Eina_List *images_unused_list)
2731 Edje_Part_Collection *pc; 2762 Edje_Part_Collection *pc;
2732 Edje_Part *part; 2763 Edje_Part *part;
2733 Edje_Part_Description_Image *part_desc_image; 2764 Edje_Part_Description_Image *part_desc_image;
2765 Edje_Part_Description_Mesh_Node *part_desc_mesh_node;
2734 Edje_Part_Image_Id *tween_id; 2766 Edje_Part_Image_Id *tween_id;
2735 unsigned int i, j, desc_it; 2767 unsigned int i, j, desc_it;
2736 Eina_List *l, *l2, *l3; 2768 Eina_List *l, *l2, *l3;
@@ -2757,6 +2789,15 @@ _data_image_id_update(Eina_List *images_unused_list)
2757 } \ 2789 } \
2758 } 2790 }
2759 2791
2792#define PART_DESC_PROXY_ID_UPDATE \
2793 EINA_LIST_FOREACH(images_unused_list, l3, iui) \
2794 { \
2795 if (part_desc_mesh_node->mesh_node.texture.id == iui->old_id) \
2796 { \
2797 part_desc_mesh_node->mesh_node.texture.id = iui->new_id; \
2798 break; \
2799 } \
2800 }
2760 EINA_LIST_FOREACH_SAFE(edje_collections, l, l2, pc) 2801 EINA_LIST_FOREACH_SAFE(edje_collections, l, l2, pc)
2761 { 2802 {
2762 for(i = 0; i < pc->parts_count; i++) 2803 for(i = 0; i < pc->parts_count; i++)
@@ -2773,6 +2814,17 @@ _data_image_id_update(Eina_List *images_unused_list)
2773 PART_DESC_IMAGE_ID_UPDATE 2814 PART_DESC_IMAGE_ID_UPDATE
2774 } 2815 }
2775 } 2816 }
2817 else if (part->type == EDJE_PART_TYPE_MESH_NODE)
2818 {
2819 part_desc_mesh_node = (Edje_Part_Description_Mesh_Node *)part->default_desc;
2820 if (!part_desc_mesh_node) continue;
2821 PART_DESC_PROXY_ID_UPDATE
2822 for (j = 0; j < part->other.desc_count; j++)
2823 {
2824 part_desc_mesh_node = (Edje_Part_Description_Mesh_Node *)part->other.desc[j];
2825 PART_DESC_PROXY_ID_UPDATE
2826 }
2827 }
2776 } 2828 }
2777 } 2829 }
2778 for (i = 0; i < edje_file->image_dir->sets_count; i++) 2830 for (i = 0; i < edje_file->image_dir->sets_count; i++)
@@ -2796,6 +2848,46 @@ _data_image_id_update(Eina_List *images_unused_list)
2796 } 2848 }
2797} 2849}
2798 2850
2851static void
2852_data_model_id_update(Eina_List *models_unused_list)
2853{
2854 Image_Unused_Ids *iui;
2855 Edje_Part_Collection *pc;
2856 Edje_Part *part;
2857 Edje_Part_Description_Mesh_Node *part_desc_mesh_node;
2858 unsigned int i, j;
2859 Eina_List *l, *l2, *l3;
2860
2861#define PART_DESC_MODEL_ID_UPDATE \
2862 EINA_LIST_FOREACH(models_unused_list, l3, iui) \
2863 { \
2864 if (part_desc_mesh_node->mesh_node.mesh.id == iui->old_id) \
2865 { \
2866 part_desc_mesh_node->mesh_node.mesh.id = iui->new_id; \
2867 break; \
2868 } \
2869 } \
2870
2871 EINA_LIST_FOREACH_SAFE(edje_collections, l, l2, pc)
2872 {
2873 for(i = 0; i < pc->parts_count; i++)
2874 {
2875 part = pc->parts[i];
2876 if (part->type == EDJE_PART_TYPE_MESH_NODE)
2877 {
2878 part_desc_mesh_node = (Edje_Part_Description_Mesh_Node *)part->default_desc;
2879 if (!part_desc_mesh_node) continue;
2880 PART_DESC_MODEL_ID_UPDATE
2881 for (j = 0; j < part->other.desc_count; j++)
2882 {
2883 part_desc_mesh_node = (Edje_Part_Description_Mesh_Node *)part->other.desc[j];
2884 PART_DESC_MODEL_ID_UPDATE
2885 }
2886 }
2887 }
2888 }
2889}
2890
2799void 2891void
2800data_process_lookups(void) 2892data_process_lookups(void)
2801{ 2893{
@@ -2805,9 +2897,11 @@ data_process_lookups(void)
2805 Program_Lookup *program; 2897 Program_Lookup *program;
2806 Group_Lookup *group; 2898 Group_Lookup *group;
2807 Image_Lookup *image; 2899 Image_Lookup *image;
2900 Image_Lookup *model;
2808 Eina_List *l2; 2901 Eina_List *l2;
2809 Eina_List *l; 2902 Eina_List *l;
2810 Eina_Hash *images_in_use; 2903 Eina_Hash *images_in_use;
2904 Eina_Hash *models_in_use;
2811 char *group_name; 2905 char *group_name;
2812 Eina_Bool is_lua = EINA_FALSE; 2906 Eina_Bool is_lua = EINA_FALSE;
2813 Image_Unused_Ids *iui; 2907 Image_Unused_Ids *iui;
@@ -3178,6 +3272,86 @@ free_group:
3178 } 3272 }
3179 3273
3180 eina_hash_free(images_in_use); 3274 eina_hash_free(images_in_use);
3275
3276 models_in_use = eina_hash_string_superfast_new(NULL);
3277
3278 EINA_LIST_FREE(model_lookups, model)
3279 {
3280 Eina_Bool find = EINA_FALSE;
3281
3282 if (edje_file->model_dir)
3283 {
3284 Edje_Model_Directory_Entry *de;
3285 unsigned int i;
3286
3287 for (i = 0; i < edje_file->model_dir->entries_count; ++i)
3288 {
3289 de = edje_file->model_dir->entries + i;
3290
3291 if ((de->entry) && (!strcmp(de->entry, model->name)))
3292 {
3293 *(model->dest) = de->id;
3294 *(model->set) = EINA_FALSE;
3295 find = EINA_TRUE;
3296
3297 if (!eina_hash_find(models_in_use, model->name))
3298 eina_hash_direct_add(models_in_use, de->entry, de);
3299 break;
3300 }
3301 }
3302 }
3303
3304 if (!find)
3305 {
3306 ERR("Unable to find model name \"%s\".", model->name);
3307 exit(-1);
3308 }
3309
3310 free(model->name);
3311 free(model);
3312 }
3313
3314 if (edje_file->model_dir && !is_lua)
3315 {
3316 Edje_Model_Directory_Entry *de, *de_last, *mdl;
3317 Eina_List *models_unused_list = NULL;
3318 unsigned int i;
3319
3320 for (i = 0; i < edje_file->model_dir->entries_count; ++i)
3321 {
3322 de = edje_file->model_dir->entries + i;
3323
3324 if (de->entry && eina_hash_find(models_in_use, de->entry))
3325 continue ;
3326
3327 INF("Model '%s' in resource 'edje/model/%i' will not be included as it is unused.",
3328 de->entry, de->id);
3329
3330 /* so as not to write the unused models, moved last model in the
3331 list to unused model position and check it */
3332 free((void *)de->entry);
3333 de->entry = NULL;
3334 de_last = edje_file->model_dir->entries + edje_file->model_dir->entries_count - 1;
3335 iui = mem_alloc(SZ(Image_Unused_Ids));
3336 iui->old_id = de_last->id;
3337 models_unused_list = eina_list_append(models_unused_list, iui);
3338 iui->new_id = i;
3339 de_last->id = i;
3340 memcpy(de, de_last, sizeof (Edje_Model_Directory_Entry));
3341 --i; /* need to check a moved model on this index */
3342 edje_file->model_dir->entries_count--;
3343 mdl = realloc(edje_file->model_dir->entries,
3344 sizeof (Edje_Model_Directory_Entry) * edje_file->model_dir->entries_count);
3345 edje_file->model_dir->entries = mdl;
3346 }
3347
3348 /* update model id in parts */
3349 if (models_unused_list) _data_model_id_update(models_unused_list);
3350 EINA_LIST_FREE(models_unused_list, iui)
3351 free(iui);
3352 }
3353
3354 eina_hash_free(models_in_use);
3181} 3355}
3182 3356
3183static void 3357static void
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 19bc6944ea..6e310eb144 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -633,7 +633,6 @@ struct _Edje_Model_Directory
633struct _Edje_Model_Directory_Entry 633struct _Edje_Model_Directory_Entry
634{ 634{
635 const char *entry; /* the nominal name of the model - if any */ 635 const char *entry; /* the nominal name of the model - if any */
636 int source_type; /* alternate source mode. 0 = none */
637 int id; /* the id no. of the image */ 636 int id; /* the id no. of the image */
638}; 637};
639 638
diff --git a/src/lib/eldbus/eldbus_proxy.c b/src/lib/eldbus/eldbus_proxy.c
index f43265a4da..e543bb6bfb 100644
--- a/src/lib/eldbus/eldbus_proxy.c
+++ b/src/lib/eldbus/eldbus_proxy.c
@@ -305,34 +305,43 @@ eldbus_proxy_data_del(Eldbus_Proxy *proxy, const char *key)
305 return eldbus_data_del(&(((Eldbus_Proxy *)proxy)->data), key); 305 return eldbus_data_del(&(((Eldbus_Proxy *)proxy)->data), key);
306} 306}
307 307
308static void 308static Eina_Value *
309_property_changed_iter(void *data, const void *key, Eldbus_Message_Iter *var) 309_iter_hash_value_set(Eina_Hash *props, const char *key, Eldbus_Message_Iter *var) EINA_ARG_NONNULL(1, 2, 3)
310{ 310{
311 Eldbus_Proxy *proxy = data; 311 Eina_Value *st_value = _message_iter_struct_to_eina_value(var);
312 const char *skey = key; 312 Eina_Value *value;
313 Eina_Value *st_value, stack_value, *value; 313 Eina_Value stack_value;
314 Eldbus_Proxy_Event_Property_Changed event;
315 314
316 st_value = _message_iter_struct_to_eina_value(var);
317 eina_value_struct_value_get(st_value, "arg0", &stack_value); 315 eina_value_struct_value_get(st_value, "arg0", &stack_value);
318 316
319 value = eina_hash_find(proxy->props, skey); 317 value = eina_hash_find(props, key);
320 if (!value) 318 if (!value)
321 { 319 {
322 value = eina_value_new(eina_value_type_get(&stack_value)); 320 value = eina_value_new(eina_value_type_get(&stack_value));
323 eina_hash_add(proxy->props, skey, value); 321 eina_hash_add(props, key, value);
324 } 322 }
325 323
326 eina_value_flush(value); 324 eina_value_flush(value);
327 eina_value_copy(&stack_value, value); 325 eina_value_copy(&stack_value, value);
328 326
329 event.name = skey; 327 eina_value_flush(&stack_value);
330 event.value = value; 328 eina_value_free(st_value);
331 event.proxy = proxy; 329 return value;
330}
331
332static void
333_property_changed_iter(void *data, const void *key, Eldbus_Message_Iter *var)
334{
335 Eldbus_Proxy *proxy = data;
336 const char *skey = key;
337
338 Eina_Value *value = _iter_hash_value_set(proxy->props, skey, var);
339
340 Eldbus_Proxy_Event_Property_Changed event = {.name = skey,
341 .value = value,
342 .proxy = proxy};
332 _eldbus_proxy_event_callback_call(proxy, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED, 343 _eldbus_proxy_event_callback_call(proxy, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED,
333 &event); 344 &event);
334 eina_value_free(st_value);
335 eina_value_flush(&stack_value);
336} 345}
337 346
338static void 347static void
@@ -743,22 +752,8 @@ _property_iter(void *data, const void *key, Eldbus_Message_Iter *var)
743{ 752{
744 Eldbus_Proxy *proxy = data; 753 Eldbus_Proxy *proxy = data;
745 const char *skey = key; 754 const char *skey = key;
746 Eina_Value *st_value, stack_value, *value;
747
748 st_value = _message_iter_struct_to_eina_value(var);
749 eina_value_struct_value_get(st_value, "arg0", &stack_value);
750
751 value = eina_hash_find(proxy->props, skey);
752 if (!value)
753 {
754 value = eina_value_new(eina_value_type_get(&stack_value));
755 eina_hash_add(proxy->props, skey, value);
756 }
757 eina_value_flush(value);
758 eina_value_copy(&stack_value, value);
759 755
760 eina_value_free(st_value); 756 _iter_hash_value_set(proxy->props, skey, var);
761 eina_value_flush(&stack_value);
762} 757}
763 758
764static void 759static void
diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index 088f15fb6b..8fa89b30ba 100644
--- a/src/lib/evas/Evas_Eo.h
+++ b/src/lib/evas/Evas_Eo.h
@@ -487,6 +487,7 @@ typedef enum _Evas_3D_State
487 EVAS_3D_STATE_MESH_SHADE_MODE, 487 EVAS_3D_STATE_MESH_SHADE_MODE,
488 EVAS_3D_STATE_MESH_FOG, 488 EVAS_3D_STATE_MESH_FOG,
489 EVAS_3D_STATE_MESH_BLENDING, 489 EVAS_3D_STATE_MESH_BLENDING,
490 EVAS_3D_STATE_MESH_COLOR_PICK,
490 491
491 EVAS_3D_STATE_CAMERA_PROJECTION = 1, 492 EVAS_3D_STATE_CAMERA_PROJECTION = 1,
492 493
@@ -499,7 +500,9 @@ typedef enum _Evas_3D_State
499 EVAS_3D_STATE_LIGHT_ATTENUATION, 500 EVAS_3D_STATE_LIGHT_ATTENUATION,
500 EVAS_3D_STATE_LIGHT_PROJECTION, 501 EVAS_3D_STATE_LIGHT_PROJECTION,
501 502
502 EVAS_3D_STATE_NODE_TRANSFORM = 1, 503 EVAS_3D_STATE_NODE_TRANSFORM_POSITION = 1,
504 EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION,
505 EVAS_3D_STATE_NODE_TRANSFORM_SCALE,
503 EVAS_3D_STATE_NODE_MESH_GEOMETRY, 506 EVAS_3D_STATE_NODE_MESH_GEOMETRY,
504 EVAS_3D_STATE_NODE_MESH_MATERIAL, 507 EVAS_3D_STATE_NODE_MESH_MATERIAL,
505 EVAS_3D_STATE_NODE_MESH_FRAME, 508 EVAS_3D_STATE_NODE_MESH_FRAME,
@@ -507,7 +510,9 @@ typedef enum _Evas_3D_State
507 EVAS_3D_STATE_NODE_MESH_MATERIAL_ID, 510 EVAS_3D_STATE_NODE_MESH_MATERIAL_ID,
508 EVAS_3D_STATE_NODE_LIGHT, 511 EVAS_3D_STATE_NODE_LIGHT,
509 EVAS_3D_STATE_NODE_CAMERA, 512 EVAS_3D_STATE_NODE_CAMERA,
510 EVAS_3D_STATE_NODE_PARENT, 513 EVAS_3D_STATE_NODE_PARENT_POSITION,
514 EVAS_3D_STATE_NODE_PARENT_ORIENTATION,
515 EVAS_3D_STATE_NODE_PARENT_SCALE,
511 EVAS_3D_STATE_NODE_MEMBER, 516 EVAS_3D_STATE_NODE_MEMBER,
512} Evas_3D_State; 517} Evas_3D_State;
513 518
@@ -773,7 +778,8 @@ typedef enum _Evas_3D_Shade_Mode
773 EVAS_3D_SHADE_MODE_NORMAL_MAP, 778 EVAS_3D_SHADE_MODE_NORMAL_MAP,
774 /**< fragment color is defined by its z-coord*/ 779 /**< fragment color is defined by its z-coord*/
775 EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER, 780 EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER,
776 781 /**< rendering to additional frame bufer*/
782 EVAS_3D_SHADE_MODE_COLOR_PICK,
777} Evas_3D_Shade_Mode; 783} Evas_3D_Shade_Mode;
778 784
779/** 785/**
diff --git a/src/lib/evas/canvas/evas_3d_node.c b/src/lib/evas/canvas/evas_3d_node.c
index ed47791ad5..a5355ed4ec 100644
--- a/src/lib/evas/canvas/evas_3d_node.c
+++ b/src/lib/evas/canvas/evas_3d_node.c
@@ -59,6 +59,10 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_
59{ 59{
60 Eina_List *l; 60 Eina_List *l;
61 Evas_3D_Node *n; 61 Evas_3D_Node *n;
62 Eina_Bool orientation;
63 Eina_Bool position;
64 Eina_Bool scale;
65 Eina_Bool parent_change;
62 66
63 /* Notify all scenes using this node that it has changed. */ 67 /* Notify all scenes using this node that it has changed. */
64 if (pd->scenes_root) 68 if (pd->scenes_root)
@@ -67,17 +71,39 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_
67 if (pd->scenes_camera) 71 if (pd->scenes_camera)
68 eina_hash_foreach(pd->scenes_camera, _node_scene_camera_change_notify, obj); 72 eina_hash_foreach(pd->scenes_camera, _node_scene_camera_change_notify, obj);
69 73
74 parent_change = (state == EVAS_3D_STATE_NODE_PARENT_ORIENTATION)
75 || (state == EVAS_3D_STATE_NODE_PARENT_POSITION)
76 || (state == EVAS_3D_STATE_NODE_PARENT_SCALE);
77
70 /* Notify parent that a member has changed. */ 78 /* Notify parent that a member has changed. */
71 if (pd->parent) 79 if (pd->parent && !parent_change)
72 { 80 {
73 eo_do(pd->parent, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, obj)); 81 eo_do(pd->parent, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, obj));
74 } 82 }
75 83
84 orientation = (state == EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION)
85 || (state == EVAS_3D_STATE_NODE_PARENT_ORIENTATION);
86 position = (state == EVAS_3D_STATE_NODE_TRANSFORM_POSITION)
87 || (state == EVAS_3D_STATE_NODE_PARENT_POSITION);
88 scale = (state == EVAS_3D_STATE_NODE_TRANSFORM_SCALE)
89 || (state == EVAS_3D_STATE_NODE_PARENT_SCALE);
90
76 /* Notify members that the parent has changed. */ 91 /* Notify members that the parent has changed. */
77 EINA_LIST_FOREACH(pd->members, l, n) 92 if (scale)
78 { 93 EINA_LIST_FOREACH(pd->members, l, n)
79 eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, obj)); 94 {
80 } 95 eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, obj));
96 }
97 if (orientation)
98 EINA_LIST_FOREACH(pd->members, l, n)
99 {
100 eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, obj));
101 }
102 if (position)
103 EINA_LIST_FOREACH(pd->members, l, n)
104 {
105 eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, obj));
106 }
81} 107}
82 108
83static Eina_Bool 109static Eina_Bool
@@ -87,8 +113,12 @@ _node_transform_update(Evas_3D_Node *node, void *data EINA_UNUSED)
87 Eina_Bool transform_dirty = EINA_FALSE, parent_dirty = EINA_FALSE; 113 Eina_Bool transform_dirty = EINA_FALSE, parent_dirty = EINA_FALSE;
88 114
89 eo_do(node, 115 eo_do(node,
90 transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM), 116 transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION),
91 parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT)); 117 transform_dirty|= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_POSITION),
118 transform_dirty|= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_SCALE),
119 parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_ORIENTATION),
120 parent_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_POSITION),
121 parent_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_SCALE));
92 122
93 if (transform_dirty || parent_dirty) 123 if (transform_dirty || parent_dirty)
94 { 124 {
@@ -204,7 +234,6 @@ _node_aabb_update(Evas_3D_Node *node, void *data EINA_UNUSED)
204 Eina_Bool transform_dirty = EINA_FALSE, mesh_geom_dirty = EINA_FALSE; 234 Eina_Bool transform_dirty = EINA_FALSE, mesh_geom_dirty = EINA_FALSE;
205 Eina_Bool mesh_frame_dirty = EINA_FALSE, member_dirty = EINA_FALSE; 235 Eina_Bool mesh_frame_dirty = EINA_FALSE, member_dirty = EINA_FALSE;
206 Eina_Bool frame_found = EINA_FALSE, is_change_orientation = EINA_FALSE; 236 Eina_Bool frame_found = EINA_FALSE, is_change_orientation = EINA_FALSE;
207 Eina_Bool parent_dirty = EINA_FALSE;
208 const Eina_List *m, *l; 237 const Eina_List *m, *l;
209 Evas_3D_Mesh *mesh; 238 Evas_3D_Mesh *mesh;
210 int frame, count, size, i, j; 239 int frame, count, size, i, j;
@@ -215,17 +244,20 @@ _node_aabb_update(Evas_3D_Node *node, void *data EINA_UNUSED)
215 Evas_Box3 box3; 244 Evas_Box3 box3;
216 245
217 eo_do(node, 246 eo_do(node,
218 transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM), 247 transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_POSITION),
248 transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION),
249 transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_SCALE),
250 transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_ORIENTATION),
251 transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_POSITION),
252 transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_SCALE),
219 mesh_geom_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_GEOMETRY), 253 mesh_geom_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_GEOMETRY),
220 mesh_frame_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_FRAME), 254 mesh_frame_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_FRAME),
221 parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT),
222 member_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MEMBER)); 255 member_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MEMBER));
223 256
224 if (transform_dirty || 257 if (transform_dirty ||
225 mesh_geom_dirty || 258 mesh_geom_dirty ||
226 mesh_frame_dirty || 259 mesh_frame_dirty ||
227 member_dirty || 260 member_dirty)
228 parent_dirty)
229 { 261 {
230 if (pd->type == EVAS_3D_NODE_TYPE_MESH) 262 if (pd->type == EVAS_3D_NODE_TYPE_MESH)
231 { 263 {
@@ -854,8 +886,10 @@ _evas_3d_node_member_add(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member)
854 pdmember->parent = obj; 886 pdmember->parent = obj;
855 887
856 /* Mark changed. */ 888 /* Mark changed. */
857 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, NULL));
858 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL)); 889 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL));
890 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, NULL));
891 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, NULL));
892 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, NULL));
859} 893}
860 894
861EOLIAN static void 895EOLIAN static void
@@ -874,7 +908,9 @@ _evas_3d_node_member_del(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member)
874 908
875 /* Mark modified object as changed. */ 909 /* Mark modified object as changed. */
876 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL)); 910 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL));
877 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, NULL)); 911 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, NULL));
912 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, NULL));
913 eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, NULL));
878 914
879 /* Decrease reference count. */ 915 /* Decrease reference count. */
880 eo_unref(member); 916 eo_unref(member);
@@ -899,7 +935,7 @@ _evas_3d_node_position_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Rea
899 pd->position.y = y; 935 pd->position.y = y;
900 pd->position.z = z; 936 pd->position.z = z;
901 937
902 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 938 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_POSITION, NULL));
903} 939}
904 940
905EOLIAN static void 941EOLIAN static void
@@ -910,7 +946,7 @@ _evas_3d_node_orientation_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_
910 pd->orientation.z = z; 946 pd->orientation.z = z;
911 pd->orientation.w = w; 947 pd->orientation.w = w;
912 948
913 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 949 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL));
914} 950}
915 951
916EOLIAN static void 952EOLIAN static void
@@ -929,7 +965,7 @@ _evas_3d_node_orientation_angle_axis_set(Eo *obj, Evas_3D_Node_Data *pd,
929 pd->orientation.y = s * axis.y; 965 pd->orientation.y = s * axis.y;
930 pd->orientation.z = s * axis.z; 966 pd->orientation.z = s * axis.z;
931 967
932 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 968 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL));
933} 969}
934 970
935EOLIAN static void 971EOLIAN static void
@@ -939,7 +975,7 @@ _evas_3d_node_scale_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Real y
939 pd->scale.y = y; 975 pd->scale.y = y;
940 pd->scale.z = z; 976 pd->scale.z = z;
941 977
942 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 978 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_SCALE, NULL));
943} 979}
944 980
945EOLIAN static void 981EOLIAN static void
@@ -1028,21 +1064,21 @@ EOLIAN static void
1028_evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) 1064_evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
1029{ 1065{
1030 pd->position_inherit = inherit; 1066 pd->position_inherit = inherit;
1031 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 1067 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_POSITION, NULL));
1032} 1068}
1033 1069
1034EOLIAN static void 1070EOLIAN static void
1035_evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) 1071_evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
1036{ 1072{
1037 pd->orientation_inherit = inherit; 1073 pd->orientation_inherit = inherit;
1038 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 1074 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL));
1039} 1075}
1040 1076
1041EOLIAN static void 1077EOLIAN static void
1042_evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) 1078_evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
1043{ 1079{
1044 pd->scale_inherit = inherit; 1080 pd->scale_inherit = inherit;
1045 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 1081 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_SCALE, NULL));
1046} 1082}
1047 1083
1048EOLIAN static Eina_Bool 1084EOLIAN static Eina_Bool
@@ -1170,7 +1206,7 @@ _evas_3d_node_look_at_set(Eo *obj, Evas_3D_Node_Data *pd,
1170 pd->orientation.y = (y.z + z.y) * s; 1206 pd->orientation.y = (y.z + z.y) * s;
1171 } 1207 }
1172 1208
1173 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); 1209 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL));
1174} 1210}
1175 1211
1176EOLIAN static void 1212EOLIAN static void
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 673b6aab77..e0f8171e26 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -340,6 +340,9 @@ struct _Evas_3D_Mesh
340 340
341 Evas_Color fog_color; 341 Evas_Color fog_color;
342 Eina_Bool fog_enabled :1; 342 Eina_Bool fog_enabled :1;
343
344 double color_pick_key;
345 Eina_Bool color_pick_enabled :1;
343}; 346};
344 347
345struct _Evas_3D_Texture 348struct _Evas_3D_Texture
@@ -376,6 +379,9 @@ struct _Evas_3D_Scene_Public_Data
376 Eina_List *light_nodes; 379 Eina_List *light_nodes;
377 Eina_List *mesh_nodes; 380 Eina_List *mesh_nodes;
378 Eina_Bool shadows_enabled :1; 381 Eina_Bool shadows_enabled :1;
382 Eina_Bool color_pick_enabled :1;
383 Eina_Hash *node_mesh_colors;
384 Eina_Hash *colors_node_mesh;
379}; 385};
380 386
381struct _Evas_3D_Pick_Data 387struct _Evas_3D_Pick_Data
@@ -1319,6 +1325,10 @@ struct _Evas_Func
1319 void *(*image_drawable_set) (void *data, void *image, void *drawable); 1325 void *(*image_drawable_set) (void *data, void *image, void *drawable);
1320 1326
1321 void (*drawable_scene_render) (void *data, void *drawable, void *scene_data); 1327 void (*drawable_scene_render) (void *data, void *drawable, void *scene_data);
1328 Eina_Bool (*drawable_scene_render_to_texture) (void *data, void *drawable, void *scene_data);
1329
1330 int (*drawable_texture_color_pick_id_get) (void *drawable);
1331 double (*drawable_texture_pixel_color_get) (unsigned int tex EINA_UNUSED, int x, int y, void *drawable);
1322 1332
1323 void *(*texture_new) (void *data); 1333 void *(*texture_new) (void *data);
1324 void (*texture_free) (void *data, void *texture); 1334 void (*texture_free) (void *data, void *texture);
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 4f045d29e7..ee464f4d34 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_3d.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c
@@ -1,6 +1,23 @@
1#include "evas_gl_private.h" 1#include "evas_gl_private.h"
2#include "evas_gl_3d_private.h" 2#include "evas_gl_3d_private.h"
3 3
4#define RENDER_MESH_NODE_ITERATE_BEGIN(param) \
5 Evas_Mat4 matrix_mv; \
6 Evas_Mat4 matrix_mvp; \
7 Eina_Iterator *it; \
8 void *ptr; \
9 evas_mat4_multiply(&matrix_mv, matrix_##param, &pd_mesh_node->data.mesh.matrix_local_to_world); \
10 evas_mat4_multiply(&matrix_mvp, &pd->projection, &matrix_mv); \
11 it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes); \
12 while (eina_iterator_next(it, &ptr)) \
13 { \
14 Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr; \
15 Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS);
16
17#define RENDER_MESH_NODE_ITERATE_END \
18 } \
19 eina_iterator_free(it);
20
4void 21void
5e3d_texture_param_update(E3D_Texture *texture) 22e3d_texture_param_update(E3D_Texture *texture)
6{ 23{
@@ -407,7 +424,7 @@ E3D_Drawable *
407e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format) 424e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format)
408{ 425{
409 E3D_Drawable *drawable = NULL; 426 E3D_Drawable *drawable = NULL;
410 GLuint tex, fbo, texDepth; 427 GLuint tex, fbo, texDepth, texcolorpick, color_pick_fb_id;
411 GLuint depth_stencil_buf = 0; 428 GLuint depth_stencil_buf = 0;
412 GLuint depth_buf = 0; 429 GLuint depth_buf = 0;
413 GLuint stencil_buf = 0; 430 GLuint stencil_buf = 0;
@@ -435,6 +452,18 @@ e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_fo
435 glTexImage2D(GL_TEXTURE_2D, 0, GL_R16, w, h, 0, GL_RED, GL_UNSIGNED_SHORT, 0); 452 glTexImage2D(GL_TEXTURE_2D, 0, GL_R16, w, h, 0, GL_RED, GL_UNSIGNED_SHORT, 0);
436#endif 453#endif
437 454
455 glGenTextures(1, &texcolorpick);
456 glBindTexture(GL_TEXTURE_2D, texcolorpick);
457 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
458 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
459 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
460 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
461#ifndef GL_GLES
462 glTexImage2D(GL_TEXTURE_2D, 0, GL_R16, w, h, 0, GL_RED, GL_UNSIGNED_SHORT, 0);
463#endif
464
465 glGenFramebuffers(1, &color_pick_fb_id);
466
438 glGenFramebuffers(1, &fbo); 467 glGenFramebuffers(1, &fbo);
439 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 468 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
440 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 469 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
@@ -511,6 +540,8 @@ e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_fo
511 drawable->tex = tex; 540 drawable->tex = tex;
512 drawable->fbo = fbo; 541 drawable->fbo = fbo;
513 drawable->depth_stencil_buf = depth_stencil_buf; 542 drawable->depth_stencil_buf = depth_stencil_buf;
543 drawable->texcolorpick = texcolorpick;
544 drawable->color_pick_fb_id = color_pick_fb_id;
514 drawable->depth_buf = depth_buf; 545 drawable->depth_buf = depth_buf;
515 drawable->stencil_buf = stencil_buf; 546 drawable->stencil_buf = stencil_buf;
516 drawable->texDepth = texDepth; 547 drawable->texDepth = texDepth;
@@ -522,9 +553,13 @@ error:
522 553
523 if (tex) 554 if (tex)
524 glDeleteTextures(1, &tex); 555 glDeleteTextures(1, &tex);
556 if (texcolorpick)
557 glDeleteTextures(1, &texcolorpick);
525 558
526 if (fbo) 559 if (fbo)
527 glDeleteFramebuffers(1, &fbo); 560 glDeleteFramebuffers(1, &fbo);
561 if (color_pick_fb_id)
562 glDeleteFramebuffers(1, &color_pick_fb_id);
528 563
529 if (depth_stencil_buf) 564 if (depth_stencil_buf)
530 { 565 {
@@ -595,6 +630,12 @@ e3d_drawable_texture_id_get(E3D_Drawable *drawable)
595 return drawable->tex; 630 return drawable->tex;
596} 631}
597 632
633GLuint
634e3d_drawable_texture_color_pick_id_get(E3D_Drawable *drawable)
635{
636 return drawable->texcolorpick;
637}
638
598GLenum 639GLenum
599e3d_drawable_format_get(E3D_Drawable *drawable) 640e3d_drawable_format_get(E3D_Drawable *drawable)
600{ 641{
@@ -1105,6 +1146,12 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
1105 if (pdmesh->shadowed) 1146 if (pdmesh->shadowed)
1106 data->flags |= E3D_SHADER_FLAG_SHADOWED; 1147 data->flags |= E3D_SHADER_FLAG_SHADOWED;
1107 1148
1149 if (pdmesh->color_pick_enabled)
1150 {
1151 data->flags |= E3D_SHADER_FLAG_COLOR_PICK_ENABLED;
1152 data->color_pick_key = pdmesh->color_pick_key;
1153 }
1154
1108 data->blending = pdmesh->blending; 1155 data->blending = pdmesh->blending;
1109 data->blend_sfactor = pdmesh->blend_sfactor; 1156 data->blend_sfactor = pdmesh->blend_sfactor;
1110 data->blend_dfactor = pdmesh->blend_dfactor; 1157 data->blend_dfactor = pdmesh->blend_dfactor;
@@ -1141,6 +1188,10 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
1141 { 1188 {
1142 BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE); 1189 BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
1143 } 1190 }
1191 else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_COLOR_PICK)
1192 {
1193 BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
1194 }
1144 else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_DIFFUSE) 1195 else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_DIFFUSE)
1145 { 1196 {
1146 BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE); 1197 BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
@@ -1256,32 +1307,18 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_S
1256 1307
1257 EINA_LIST_FOREACH(data->mesh_nodes, l, n) 1308 EINA_LIST_FOREACH(data->mesh_nodes, l, n)
1258 { 1309 {
1259 Evas_Mat4 matrix_mv;
1260 Evas_Mat4 matrix_mvp;
1261 Eina_Iterator *it;
1262 void *ptr;
1263
1264 Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EVAS_3D_NODE_CLASS); 1310 Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EVAS_3D_NODE_CLASS);
1265 1311
1266 if (evas_is_sphere_in_frustum(&pd_mesh_node->bsphere, planes)) 1312 if (evas_is_sphere_in_frustum(&pd_mesh_node->bsphere, planes))
1267 { 1313 {
1268 1314 RENDER_MESH_NODE_ITERATE_BEGIN(light_eye)
1269 evas_mat4_multiply(&matrix_mv, matrix_light_eye, &pd_mesh_node->data.mesh.matrix_local_to_world);
1270 evas_mat4_multiply(&matrix_mvp, &pd->projection,
1271 &matrix_mv);
1272
1273 it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes);
1274
1275 while (eina_iterator_next(it, &ptr))
1276 { 1315 {
1277 Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr;
1278 Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS);
1279 shade_mode = pdmesh->shade_mode; 1316 shade_mode = pdmesh->shade_mode;
1280 pdmesh->shade_mode = EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER; 1317 pdmesh->shade_mode = EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER;
1281 _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_light_eye, &matrix_mv, &matrix_mvp, &matrix_mvp); 1318 _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_light_eye, &matrix_mv, &matrix_mvp, &matrix_mvp);
1282 pdmesh->shade_mode = shade_mode; 1319 pdmesh->shade_mode = shade_mode;
1283 } 1320 }
1284 eina_iterator_free(it); 1321 RENDER_MESH_NODE_ITERATE_END
1285 } 1322 }
1286 } 1323 }
1287 1324
@@ -1367,3 +1404,98 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3
1367 } 1404 }
1368 e3d_renderer_flush(renderer); 1405 e3d_renderer_flush(renderer);
1369} 1406}
1407
1408Eina_Bool
1409e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *renderer,
1410 Evas_3D_Scene_Public_Data *data)
1411{
1412 const Evas_Mat4 *matrix_eye;
1413 Evas_3D_Shade_Mode shade_mode;
1414 Eina_Stringshare *tmp;
1415 Eina_Iterator *itmn;
1416 void *ptrmn;
1417 Eina_List *repeat_node = NULL;
1418 Evas_Color c = {0, 0, 0}, *unic_color = NULL;
1419
1420 glBindFramebuffer(GL_FRAMEBUFFER, drawable->color_pick_fb_id);
1421 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
1422 GL_TEXTURE_2D, drawable->texcolorpick, 0);
1423#ifdef GL_GLES
1424 glBindTexture(GL_TEXTURE_2D, drawable->depth_stencil_buf);
1425 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
1426 GL_TEXTURE_2D, drawable->depth_stencil_buf, 0);
1427#else
1428 glBindRenderbuffer(GL_RENDERBUFFER, drawable->depth_stencil_buf);
1429 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
1430 GL_RENDERBUFFER, drawable->depth_stencil_buf);
1431#endif
1432
1433 e3d_renderer_clear(renderer, &c);
1434
1435 Evas_3D_Node_Data *pd_camera_node = eo_data_scope_get(data->camera_node, EVAS_3D_NODE_CLASS);
1436 matrix_eye = &pd_camera_node->data.camera.matrix_world_to_eye;
1437 Evas_3D_Camera_Data *pd = eo_data_scope_get(pd_camera_node->data.camera.camera, EVAS_3D_CAMERA_CLASS);
1438
1439 itmn = eina_hash_iterator_data_new(data->colors_node_mesh);
1440
1441 while (eina_iterator_next(itmn, &ptrmn))
1442 {
1443 Evas_3D_Node *n;
1444 Eina_Array *arr = NULL;
1445
1446 arr = (Eina_Array *)ptrmn;
1447 n = (Evas_3D_Node *)eina_array_data_get(arr, 0);
1448 /*To avoid repeatedly render mesh*/
1449 if (!repeat_node)
1450 repeat_node = eina_list_append(repeat_node, (void*)n);
1451 else
1452 {
1453 if (eina_list_data_find(repeat_node, (void *)n))
1454 continue;
1455 else
1456 repeat_node = eina_list_append(repeat_node, (void *)n);
1457 }
1458 Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EVAS_3D_NODE_CLASS);
1459 RENDER_MESH_NODE_ITERATE_BEGIN(eye)
1460 {
1461 if (pdmesh->color_pick_enabled)
1462 {
1463 tmp = eina_stringshare_printf("%p %p", n, nm->mesh);
1464 unic_color = (Evas_Color *)eina_hash_find(data->node_mesh_colors, tmp);
1465 if (unic_color)
1466 {
1467 pdmesh->color_pick_key = unic_color->r;
1468 shade_mode = pdmesh->shade_mode;
1469 pdmesh->shade_mode = EVAS_3D_SHADE_MODE_COLOR_PICK;
1470 _mesh_draw(renderer, nm->mesh, nm->frame, NULL, matrix_eye, &matrix_mv,
1471 &matrix_mvp, NULL);
1472 pdmesh->shade_mode = shade_mode;
1473 }
1474 eina_stringshare_del(tmp);
1475 }
1476 }
1477 RENDER_MESH_NODE_ITERATE_END
1478 }
1479
1480 eina_iterator_free(itmn);
1481 eina_list_free(repeat_node);
1482 glBindFramebuffer(GL_FRAMEBUFFER, drawable->fbo);
1483 return EINA_TRUE;
1484}
1485
1486double
1487e3d_drawable_texture_pixel_color_get(GLuint tex EINA_UNUSED, int x, int y,
1488 void *drawable)
1489{
1490 E3D_Drawable *d = (E3D_Drawable *)drawable;
1491 GLuint pixel;
1492
1493 glBindFramebuffer(GL_FRAMEBUFFER, d->color_pick_fb_id);
1494 /*TODO Bottle neck - get more effective getting pixels from openGL*/
1495 glReadPixels(x, y, 1, 1, GL_RED, GL_UNSIGNED_SHORT, &pixel);
1496 glBindFramebuffer(GL_FRAMEBUFFER, d->fbo);
1497 return (double)pixel / USHRT_MAX;
1498}
1499
1500#undef RENDER_MESH_NODE_ITERATE_BEGIN
1501#undef RENDER_MESH_NODE_ITERATE_END
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 ceba63e5f0..f119b40c46 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
@@ -28,8 +28,11 @@ void e3d_texture_filter_get(const E3D_Texture *texture, Evas_3D_
28E3D_Drawable *e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format); 28E3D_Drawable *e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format);
29void e3d_drawable_free(E3D_Drawable *drawable); 29void e3d_drawable_free(E3D_Drawable *drawable);
30void e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Public_Data *data); 30void e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Public_Data *data);
31Eina_Bool e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Public_Data *data);
31void e3d_drawable_size_get(E3D_Drawable *drawable, int *w, int *h); 32void e3d_drawable_size_get(E3D_Drawable *drawable, int *w, int *h);
32GLuint e3d_drawable_texture_id_get(E3D_Drawable *drawable); 33GLuint e3d_drawable_texture_id_get(E3D_Drawable *drawable);
34GLuint e3d_drawable_texture_color_pick_id_get(E3D_Drawable *drawable);
35double e3d_drawable_texture_pixel_color_get(GLuint tex EINA_UNUSED, int x, int y, void *drawable);
33GLenum e3d_drawable_format_get(E3D_Drawable *drawable); 36GLenum e3d_drawable_format_get(E3D_Drawable *drawable);
34 37
35/* Renderer */ 38/* Renderer */
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 75a76acb31..6d956f554d 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
@@ -37,7 +37,7 @@ typedef unsigned long E3D_Shader_Flag;
37#define E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND (1 << 28) 37#define E3D_SHADER_FLAG_NORMAL_TEXTURE_BLEND (1 << 28)
38#define E3D_SHADER_FLAG_FOG_ENABLED (1 << 29) 38#define E3D_SHADER_FLAG_FOG_ENABLED (1 << 29)
39#define E3D_SHADER_FLAG_SHADOWED (1 << 30) 39#define E3D_SHADER_FLAG_SHADOWED (1 << 30)
40 40#define E3D_SHADER_FLAG_COLOR_PICK_ENABLED (1 << 31)
41 41
42static inline Eina_Bool 42static inline Eina_Bool
43_flags_need_tex_coord(E3D_Shader_Flag flags) 43_flags_need_tex_coord(E3D_Shader_Flag flags)
@@ -100,6 +100,7 @@ struct _E3D_Draw_Data
100 Evas_Color specular; 100 Evas_Color specular;
101 } light; 101 } light;
102 Evas_Color fog_color; 102 Evas_Color fog_color;
103 double color_pick_key;
103}; 104};
104 105
105struct _E3D_Texture 106struct _E3D_Texture
@@ -126,13 +127,14 @@ struct _E3D_Drawable
126 GLenum format; 127 GLenum format;
127 GLenum depth_format; 128 GLenum depth_format;
128 GLenum stencil_format; 129 GLenum stencil_format;
129
130 GLuint tex; 130 GLuint tex;
131 GLuint fbo; 131 GLuint fbo;
132 GLuint depth_stencil_buf; 132 GLuint depth_stencil_buf;
133 GLuint depth_buf; 133 GLuint depth_buf;
134 GLuint stencil_buf; 134 GLuint stencil_buf;
135 GLuint texDepth; 135 GLuint texDepth;
136 GLuint texcolorpick;
137 GLuint color_pick_fb_id;
136}; 138};
137 139
138/* Texture internal functions. */ 140/* Texture internal functions. */
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 c036aa1840..e042c83b83 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
@@ -49,6 +49,7 @@ typedef enum _E3D_Uniform
49 E3D_UNIFORM_MATERIAL_SHININESS, 49 E3D_UNIFORM_MATERIAL_SHININESS,
50 E3D_UNIFORM_FOG_FACTOR, 50 E3D_UNIFORM_FOG_FACTOR,
51 E3D_UNIFORM_FOG_COLOR, 51 E3D_UNIFORM_FOG_COLOR,
52 E3D_UNIFORM_COLOR_PICK,
52 53
53 E3D_UNIFORM_COUNT, 54 E3D_UNIFORM_COUNT,
54} E3D_Uniform; 55} E3D_Uniform;
@@ -526,6 +527,9 @@ _fragment_shader_string_variable_add(E3D_Shader_String *shader,
526 ADD_LINE("uniform sampler2D uShadowMap;"); 527 ADD_LINE("uniform sampler2D uShadowMap;");
527 } 528 }
528 529
530 if (flags & E3D_SHADER_FLAG_COLOR_PICK_ENABLED)
531 ADD_LINE("uniform float uColorPick;");
532
529 /* Materials. */ 533 /* Materials. */
530 if (flags & E3D_SHADER_FLAG_DIFFUSE) 534 if (flags & E3D_SHADER_FLAG_DIFFUSE)
531 { 535 {
@@ -1151,6 +1155,11 @@ _fragment_shader_string_get(E3D_Shader_String *shader,
1151 ADD_LINE("gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor );"); 1155 ADD_LINE("gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor );");
1152 } 1156 }
1153 1157
1158 if (mode == EVAS_3D_SHADE_MODE_COLOR_PICK)
1159 {
1160 ADD_LINE("gl_FragColor = vec4(uColorPick);");
1161 }
1162
1154 ADD_LINE("}"); 1163 ADD_LINE("}");
1155} 1164}
1156 1165
@@ -1321,7 +1330,8 @@ static const char *uniform_names[] =
1321 "uMaterialEmission", 1330 "uMaterialEmission",
1322 "uMaterialShininess", 1331 "uMaterialShininess",
1323 "uFogFactor", 1332 "uFogFactor",
1324 "uFogColor" 1333 "uFogColor",
1334 "uColorPick"
1325}; 1335};
1326 1336
1327static inline void 1337static inline void
@@ -1498,6 +1508,9 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
1498 case E3D_UNIFORM_FOG_COLOR: 1508 case E3D_UNIFORM_FOG_COLOR:
1499 glUniform4f(loc, data->fog_color.r, data->fog_color.g, data->fog_color.b, 1); 1509 glUniform4f(loc, data->fog_color.r, data->fog_color.g, data->fog_color.b, 1);
1500 break; 1510 break;
1511 case E3D_UNIFORM_COLOR_PICK:
1512 glUniform1f(loc, data->color_pick_key);
1513 break;
1501 default: 1514 default:
1502 ERR("Invalid uniform ID."); 1515 ERR("Invalid uniform ID.");
1503 break; 1516 break;
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c
index e280fddf91..082ac0d921 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -1836,6 +1836,35 @@ eng_drawable_scene_render(void *data, void *drawable, void *scene_data)
1836 e3d_drawable_scene_render(drawable, renderer, scene_data); 1836 e3d_drawable_scene_render(drawable, renderer, scene_data);
1837} 1837}
1838 1838
1839static int
1840eng_drawable_texture_color_pick_id_get(void *drawable)
1841{
1842 return e3d_drawable_texture_color_pick_id_get((E3D_Drawable *)drawable);
1843}
1844
1845static double
1846eng_drawable_texture_pixel_color_get(GLuint tex EINA_UNUSED, int x, int y, void *drawable)
1847{
1848 return e3d_drawable_texture_pixel_color_get(tex, x, y, drawable);
1849}
1850
1851static Eina_Bool
1852eng_drawable_scene_render_to_texture(void *data, void *drawable, void *scene_data)
1853{
1854 Evas_Engine_GL_Context *gl_context;
1855 Render_Engine_GL_Generic *re = data;
1856 E3D_Renderer *renderer = NULL;
1857
1858 re->window_use(re->software.ob);
1859 gl_context = re->window_gl_context_get(re->software.ob);
1860 evas_gl_common_context_flush(gl_context);
1861
1862 eng_context_3d_use(data);
1863 renderer = eng_renderer_3d_get(data);
1864
1865 return e3d_drawable_scene_render_to_texture((E3D_Drawable *)drawable, renderer, scene_data);
1866}
1867
1839static void * 1868static void *
1840eng_texture_new(void *data EINA_UNUSED) 1869eng_texture_new(void *data EINA_UNUSED)
1841{ 1870{
@@ -2045,6 +2074,10 @@ module_open(Evas_Module *em)
2045 2074
2046 ORD(drawable_scene_render); 2075 ORD(drawable_scene_render);
2047 2076
2077 ORD(drawable_texture_color_pick_id_get);
2078 ORD(drawable_texture_pixel_color_get);
2079 ORD(drawable_scene_render_to_texture);
2080
2048 ORD(texture_new); 2081 ORD(texture_new);
2049 ORD(texture_free); 2082 ORD(texture_free);
2050 ORD(texture_data_set); 2083 ORD(texture_data_set);
diff --git a/src/tests/ecore/ecore_test_ecore_con.c b/src/tests/ecore/ecore_test_ecore_con.c
index ca0e311c11..58ea44c70b 100644
--- a/src/tests/ecore/ecore_test_ecore_con.c
+++ b/src/tests/ecore/ecore_test_ecore_con.c
@@ -162,7 +162,7 @@ _dns_err(void *data, int type EINA_UNUSED, void *ev EINA_UNUSED)
162 return ECORE_CALLBACK_RENEW; 162 return ECORE_CALLBACK_RENEW;
163} 163}
164 164
165START_TEST(ecore_test_ecore_con_server) 165void _ecore_con_server_client_tests(Ecore_Con_Type compl_type, const char *name)
166{ 166{
167 Ecore_Con_Server *server; 167 Ecore_Con_Server *server;
168 Ecore_Con_Server *client; 168 Ecore_Con_Server *client;
@@ -171,13 +171,13 @@ START_TEST(ecore_test_ecore_con_server)
171 Ecore_Event_Handler *handlers[6]; 171 Ecore_Event_Handler *handlers[6];
172 void *server_data = malloc (1); 172 void *server_data = malloc (1);
173 void *client_data = malloc (1); 173 void *client_data = malloc (1);
174 int ret; 174 char sdata[] = "Server_info";
175 double timeout_val = 10, timeout_ret;
176 int ret, server_port = 1234;
175 void *del_ret; 177 void *del_ret;
176 178
177 ret = eina_init(); 179 ret = eina_init();
178 fail_if(ret != 1); 180 fail_if(ret != 1);
179 ret = ecore_init();
180 fail_if(ret < 1);
181 ret = ecore_con_init(); 181 ret = ecore_con_init();
182 fail_if(ret != 1); 182 fail_if(ret != 1);
183 183
@@ -201,14 +201,30 @@ START_TEST(ecore_test_ecore_con_server)
201 _data, (void *) 2); 201 _data, (void *) 2);
202 fail_if(handlers[5] == NULL); 202 fail_if(handlers[5] == NULL);
203 203
204 server = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 1234, 204 fail_if (ecore_con_server_connected_get(server));
205
206 server = ecore_con_server_add(compl_type, name, server_port,
205 server_data); 207 server_data);
206 fail_if (server == NULL); 208 fail_if (server == NULL);
207 209
208 ecore_con_server_timeout_set(server, 10); 210 del_ret = ecore_con_server_data_get(server);
211 fail_if (del_ret != server_data);
212
213 del_ret = ecore_con_server_data_set(server, sdata);
214 fail_if (del_ret != server_data);
215
216 fail_if (!ecore_con_server_connected_get(server));
217
218 ecore_con_server_timeout_set(server, timeout_val);
219 timeout_ret = ecore_con_server_timeout_get(server);
220 fail_if (timeout_ret != timeout_val);
221
222 ret = ecore_con_server_port_get(server);
223 fail_if (ret != server_port);
224
209 ecore_con_server_client_limit_set(server, 1, 0); 225 ecore_con_server_client_limit_set(server, 1, 0);
210 226
211 client = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, "127.0.0.1", 1234, 227 client = ecore_con_server_connect(compl_type, name, server_port,
212 client_data); 228 client_data);
213 fail_if (client == NULL); 229 fail_if (client == NULL);
214 230
@@ -226,7 +242,8 @@ START_TEST(ecore_test_ecore_con_server)
226 ecore_con_server_uptime_get(server)); 242 ecore_con_server_uptime_get(server));
227 243
228 del_ret = ecore_con_server_del(server); 244 del_ret = ecore_con_server_del(server);
229 fail_if (del_ret != server_data); 245 fail_if (strcmp((char *)del_ret, sdata));
246
230 free (server_data); 247 free (server_data);
231 del_ret = ecore_con_server_del(client); 248 del_ret = ecore_con_server_del(client);
232 fail_if (del_ret != client_data); 249 fail_if (del_ret != client_data);
@@ -248,9 +265,37 @@ START_TEST(ecore_test_ecore_con_server)
248 265
249 ret = ecore_con_shutdown(); 266 ret = ecore_con_shutdown();
250 fail_if(ret != 0); 267 fail_if(ret != 0);
251 ret = ecore_shutdown();
252 ret = eina_shutdown(); 268 ret = eina_shutdown();
253} 269}
270
271START_TEST(ecore_test_ecore_con_local_user)
272{
273 _ecore_con_server_client_tests(ECORE_CON_LOCAL_USER, "test_sock");
274}
275END_TEST
276
277START_TEST(ecore_test_ecore_con_local_system)
278{
279 _ecore_con_server_client_tests(ECORE_CON_LOCAL_SYSTEM, "test_sock");
280}
281END_TEST
282
283START_TEST(ecore_test_ecore_con_local_abstract)
284{
285 _ecore_con_server_client_tests(ECORE_CON_LOCAL_ABSTRACT, "test_sock");
286}
287END_TEST
288
289START_TEST(ecore_test_ecore_con_remote_tcp)
290{
291 _ecore_con_server_client_tests(ECORE_CON_REMOTE_TCP, "127.0.0.1");
292}
293END_TEST
294
295START_TEST(ecore_test_ecore_con_remote_nodelay)
296{
297 _ecore_con_server_client_tests(ECORE_CON_REMOTE_NODELAY, "127.0.0.1");
298}
254END_TEST 299END_TEST
255 300
256START_TEST(ecore_test_ecore_con_init) 301START_TEST(ecore_test_ecore_con_init)
@@ -321,7 +366,11 @@ END_TEST
321void ecore_test_ecore_con(TCase *tc) 366void ecore_test_ecore_con(TCase *tc)
322{ 367{
323 tcase_add_test(tc, ecore_test_ecore_con_init); 368 tcase_add_test(tc, ecore_test_ecore_con_init);
324 tcase_add_test(tc, ecore_test_ecore_con_server); 369 tcase_add_test(tc, ecore_test_ecore_con_local_user);
370 tcase_add_test(tc, ecore_test_ecore_con_local_system);
371 tcase_add_test(tc, ecore_test_ecore_con_local_abstract);
372 tcase_add_test(tc,ecore_test_ecore_con_remote_tcp);
373 tcase_add_test(tc,ecore_test_ecore_con_remote_nodelay);
325 tcase_add_test(tc, ecore_test_ecore_con_dns); 374 tcase_add_test(tc, ecore_test_ecore_con_dns);
326 tcase_add_test(tc, ecore_test_ecore_con_shutdown_bef_init); 375 tcase_add_test(tc, ecore_test_ecore_con_shutdown_bef_init);
327} 376}