summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Shcherbina <o.shcherbina@samsung.com>2015-02-11 17:44:42 +0100
committerCedric BAIL <cedric@osg.samsung.com>2015-02-11 17:44:50 +0100
commitdc0b144cf09deba3a5a6fe746f0130b67b5bf64b (patch)
treeeb1cab25e7c7b62aff9151b50f1ff0e0fd2d9d21
parent46b9b23144ba6a95d619b1aa21ec326ea92303b6 (diff)
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 <cedric@osg.samsung.com>
-rw-r--r--src/lib/evas/Evas_Eo.h1
-rw-r--r--src/lib/evas/canvas/evas_3d_mesh.c17
-rw-r--r--src/lib/evas/canvas/evas_3d_mesh.eo21
-rw-r--r--src/lib/evas/canvas/evas_3d_node.c71
-rw-r--r--src/lib/evas/canvas/evas_3d_scene.c109
-rw-r--r--src/lib/evas/canvas/evas_3d_scene.eo21
-rw-r--r--src/lib/evas/include/evas_private.h8
7 files changed, 242 insertions, 6 deletions
diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index 8fa89b30ba..033ada29cf 100644
--- a/src/lib/evas/Evas_Eo.h
+++ b/src/lib/evas/Evas_Eo.h
@@ -468,6 +468,7 @@ typedef enum _Evas_3D_State
468 EVAS_3D_STATE_SCENE_BACKGROUND_COLOR, 468 EVAS_3D_STATE_SCENE_BACKGROUND_COLOR,
469 EVAS_3D_STATE_SCENE_SIZE, 469 EVAS_3D_STATE_SCENE_SIZE,
470 EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, 470 EVAS_3D_STATE_SCENE_SHADOWS_ENABLED,
471 EVAS_3D_STATE_SCENE_UPDATED,
471 472
472 EVAS_3D_STATE_TEXTURE_DATA = 1, 473 EVAS_3D_STATE_TEXTURE_DATA = 1,
473 EVAS_3D_STATE_TEXTURE_WRAP, 474 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 ddbf61916f..4430438054 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)
120 pd->blend_sfactor = EVAS_3D_BLEND_ONE; 120 pd->blend_sfactor = EVAS_3D_BLEND_ONE;
121 pd->blend_dfactor = EVAS_3D_BLEND_ZERO; 121 pd->blend_dfactor = EVAS_3D_BLEND_ZERO;
122 pd->blending = EINA_FALSE; 122 pd->blending = EINA_FALSE;
123
124 pd->color_pick_key = -1.0;
125 pd->color_pick_enabled = EINA_FALSE;
123} 126}
124 127
125static inline void 128static inline void
@@ -963,4 +966,18 @@ evas_3d_mesh_interpolate_vertex_buffer_get(Evas_3D_Mesh *mesh, int frame,
963 } 966 }
964} 967}
965 968
969EOLIAN static Eina_Bool
970_evas_3d_mesh_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd)
971{
972 return pd->color_pick_enabled;
973}
974EOLIAN static Eina_Bool
975_evas_3d_mesh_color_pick_enable_set(Eo *obj, Evas_3D_Mesh_Data *pd, Eina_Bool _enabled)
976{
977 if (pd->color_pick_enabled != _enabled)
978 pd->color_pick_enabled = _enabled;
979 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_COLOR_PICK, NULL));
980 return EINA_TRUE;
981}
982
966#include "canvas/evas_3d_mesh.eo.c" 983#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 5657b32e54..a23654aa39 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)
352 params { 352 params {
353 } 353 }
354 } 354 }
355 color_pick_enable_get @const {
356 /*
357 Get status of color picking of the mesh.
358
359 @ingroup Evas_3D_Mesh
360 */
361 return: bool;
362 params {
363 }
364 }
365 color_pick_enable_set {
366 /*
367 Set posibility color picking.
368
369 @ingroup Evas_3D_Mesh
370 */
371 return: bool;
372 params {
373 @in bool _enabled; /*@ Posibility flag */
374 }
375 }
355 } 376 }
356 properties { 377 properties {
357 shade_mode { 378 shade_mode {
diff --git a/src/lib/evas/canvas/evas_3d_node.c b/src/lib/evas/canvas/evas_3d_node.c
index a5355ed4ec..62e2c1cb01 100644
--- a/src/lib/evas/canvas/evas_3d_node.c
+++ b/src/lib/evas/canvas/evas_3d_node.c
@@ -6,6 +6,27 @@
6 6
7Evas_3D_Mesh_Frame *evas_3d_mesh_frame_find(Evas_3D_Mesh_Data *pd, int frame); 7Evas_3D_Mesh_Frame *evas_3d_mesh_frame_find(Evas_3D_Mesh_Data *pd, int frame);
8 8
9static Eina_Stringshare *
10_generate_unic_color_key(Evas_Color *color, Evas_Color *bg_color, Evas_3D_Node *node, Evas_3D_Mesh *mesh,
11 Eina_Bool init)
12{
13 static unsigned short red = USHRT_MAX;
14
15 if (init) red = USHRT_MAX;
16
17 if (fabs(bg_color->r - (double)red) <= DBL_EPSILON) red--;
18
19 color->r = (double)red / USHRT_MAX;
20 color->g = 0.0;
21 color->b = 0.0;
22
23 red--;
24
25 if (red < 1) red = USHRT_MAX;
26
27 return eina_stringshare_printf("%p %p", node, mesh);
28}
29
9static inline Evas_3D_Node_Mesh * 30static inline Evas_3D_Node_Mesh *
10_node_mesh_new(Evas_3D_Node *node, Evas_3D_Mesh *mesh) 31_node_mesh_new(Evas_3D_Node *node, Evas_3D_Mesh *mesh)
11{ 32{
@@ -795,6 +816,56 @@ evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data)
795} 816}
796 817
797Eina_Bool 818Eina_Bool
819evas_3d_node_color_node_mesh_collect(Evas_3D_Node *node, void *data)
820{
821 Evas_3D_Scene_Public_Data *scene_data = (Evas_3D_Scene_Public_Data *)data;
822 Evas_3D_Node_Data *pd = eo_data_scope_get(node, MY_CLASS);
823 Evas_3D_Node_Data *pd_camera = eo_data_scope_get(scene_data->camera_node, MY_CLASS);
824 Evas_3D_Camera *camera = (Evas_3D_Camera*)pd_camera->data.camera.camera;
825
826 Eina_List *list_meshes, *l;
827 Evas_3D_Mesh *mesh;
828 Eina_Stringshare *key, *datakey;
829 Evas_Color *color;
830 Eina_Bool visible = EINA_FALSE;
831 Eina_Array *arr;
832 if (pd->type == EVAS_3D_NODE_TYPE_MESH)
833 {
834 eo_do(camera,
835 visible = evas_3d_camera_node_visible_get(scene_data->camera_node,
836 node, EVAS_3D_FRUSTUM_MODE_BSPHERE));
837 if (visible)
838 {
839 eo_do (node, list_meshes = (Eina_List *)evas_3d_node_mesh_list_get());
840 EINA_LIST_FOREACH(list_meshes, l, mesh)
841 {
842 if (eo_do(mesh, evas_3d_mesh_color_pick_enable_get()))
843 {
844 color = calloc(1, sizeof(Evas_Color));
845
846 if (!eina_hash_population(scene_data->node_mesh_colors))
847 key = _generate_unic_color_key(color, &scene_data->bg_color,
848 node, mesh, EINA_TRUE);
849 else
850 key = _generate_unic_color_key(color, &scene_data->bg_color,
851 node, mesh, EINA_FALSE);
852
853 datakey = eina_stringshare_printf("%f %f %f", color->r, color->g, color->b);
854 eina_hash_add(scene_data->node_mesh_colors, key, color);
855 arr = eina_array_new(2);
856 eina_array_push(arr, (void *)node);
857 eina_array_push(arr, (void *)mesh);
858 eina_hash_add(scene_data->colors_node_mesh, datakey, arr);
859 }
860 }
861 }
862 else
863 return EINA_FALSE;
864 }
865 return EINA_TRUE;
866}
867
868Eina_Bool
798evas_3d_node_light_collect(Evas_3D_Node *node, void *data) 869evas_3d_node_light_collect(Evas_3D_Node *node, void *data)
799{ 870{
800 Evas_3D_Scene_Public_Data *scene_data = (Evas_3D_Scene_Public_Data *)data; 871 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 0e177a74ca..a26b6c8967 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)
9 data->camera_node = NULL; 9 data->camera_node = NULL;
10 data->light_nodes = NULL; 10 data->light_nodes = NULL;
11 data->mesh_nodes = NULL; 11 data->mesh_nodes = NULL;
12 data->node_mesh_colors = NULL;
13 data->colors_node_mesh = NULL;
12} 14}
13 15
14void 16void
@@ -46,6 +48,8 @@ _evas_3d_scene_evas_3d_object_update_notify(Eo *obj EINA_UNUSED, Evas_3D_Scene_D
46 { 48 {
47 eo_do(pd->camera_node, evas_3d_object_update()); 49 eo_do(pd->camera_node, evas_3d_object_update());
48 } 50 }
51
52 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_UPDATED, NULL));
49} 53}
50 54
51EAPI Evas_3D_Scene * 55EAPI Evas_3D_Scene *
@@ -65,6 +69,9 @@ _evas_3d_scene_eo_base_constructor(Eo *obj, Evas_3D_Scene_Data *pd)
65 eo_do(obj, evas_3d_object_type_set(EVAS_3D_OBJECT_TYPE_SCENE)); 69 eo_do(obj, evas_3d_object_type_set(EVAS_3D_OBJECT_TYPE_SCENE));
66 evas_color_set(&pd->bg_color, 0.0, 0.0, 0.0, 0.0); 70 evas_color_set(&pd->bg_color, 0.0, 0.0, 0.0, 0.0);
67 pd->shadows_enabled = EINA_FALSE; 71 pd->shadows_enabled = EINA_FALSE;
72 pd->color_pick_enabled = EINA_FALSE;
73 pd->node_mesh_colors = NULL;
74 pd->colors_node_mesh = NULL;
68} 75}
69 76
70EOLIAN static void 77EOLIAN static void
@@ -608,17 +615,32 @@ _node_pick(Evas_3D_Node *node, void *data)
608 return EINA_TRUE; 615 return EINA_TRUE;
609} 616}
610 617
618static void _node_mesh_colors_free_cb(void *data)
619{
620 if (data) free(data);
621}
622
611EOLIAN static Eina_Bool 623EOLIAN static Eina_Bool
612_evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real y, 624_evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real y,
613 Evas_3D_Node **node, Evas_3D_Mesh **mesh, 625 Evas_3D_Node **node, Evas_3D_Mesh **mesh,
614 Evas_Real *s, Evas_Real *t) 626 Evas_Real *s, Evas_Real *t)
615{ 627{
616 /* TODO: Use H/W picking if availabe. */
617 Evas_3D_Pick_Data data; 628 Evas_3D_Pick_Data data;
629 Evas_3D_Node_Data *pd_camera_node;
630 Evas_3D_Camera_Data *pd_camera;
631 Evas_3D_Object_Data *pd_parent;
632 Evas_Public_Data *e;
633 int tex, px, py;;
634 double redcomponent;
635 Eina_Stringshare *tmp;
636 Eina_Array *arr = NULL;
637 Eina_Bool update_scene = EINA_FALSE;
638
639 pd_parent = eo_data_scope_get(obj, EVAS_3D_OBJECT_CLASS);
640 e = eo_data_scope_get(pd_parent->evas, EVAS_CANVAS_CLASS);
618 641
619 data.x = ((x * 2.0) / (Evas_Real)pd->w) - 1.0; 642 data.x = ((x * 2.0) / (Evas_Real)pd->w) - 1.0;
620 data.y = (((pd->h - y - 1) * 2.0) / ((Evas_Real)pd->h)) - 1.0; 643 data.y = (((pd->h - y - 1) * 2.0) / ((Evas_Real)pd->h)) - 1.0;
621
622 data.picked = EINA_FALSE; 644 data.picked = EINA_FALSE;
623 data.z = 1.0; 645 data.z = 1.0;
624 data.node = NULL; 646 data.node = NULL;
@@ -626,17 +648,78 @@ _evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real y,
626 data.s = 0.0; 648 data.s = 0.0;
627 data.t = 0.0; 649 data.t = 0.0;
628 650
651 px = round(x * pd->w / e->viewport.w);
652 py = round((pd->h - (y * pd->h / e->viewport.h) - 1));
653
654 /*Use color pick mechanism finding node and mesh*/
655 if (pd->color_pick_enabled)
656 {
657 Evas_3D_Scene_Public_Data scene_data;
658
659 scene_data.bg_color = pd->bg_color;
660 scene_data.shadows_enabled = pd->shadows_enabled;
661 scene_data.camera_node = pd->camera_node;
662 scene_data.color_pick_enabled = pd->color_pick_enabled;
663 update_scene = eo_do(obj, evas_3d_object_dirty_get(EVAS_3D_STATE_SCENE_UPDATED));
664 if (update_scene)
665 {
666 if (pd->node_mesh_colors)
667 {
668 eina_hash_free(pd->node_mesh_colors);
669 eina_hash_free(pd->colors_node_mesh);
670 pd->node_mesh_colors = NULL;
671 pd->colors_node_mesh = NULL;
672 }
673 pd->node_mesh_colors = eina_hash_stringshared_new(_node_mesh_colors_free_cb);
674 pd->colors_node_mesh = eina_hash_stringshared_new(_node_mesh_colors_free_cb);
675 }
676 scene_data.node_mesh_colors = pd->node_mesh_colors;
677 scene_data.colors_node_mesh = pd->colors_node_mesh;
678 evas_3d_node_tree_traverse(pd->root_node,
679 EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE,
680 evas_3d_node_color_node_mesh_collect, &scene_data);
681
682 if (e->engine.func->drawable_scene_render_to_texture)
683 {
684 if (e->engine.func->drawable_scene_render_to_texture(e->engine.data.output,
685 pd->surface, &scene_data))
686 {
687 if (e->engine.func->drawable_texture_color_pick_id_get)
688 tex = e->engine.func->drawable_texture_color_pick_id_get(pd->surface);
689 if (e->engine.func->drawable_texture_pixel_color_get)
690 {
691 redcomponent = e->engine.func->drawable_texture_pixel_color_get(tex, px, py, pd->surface);
692 tmp = eina_stringshare_printf("%f %f %f", redcomponent, 0.0, 0.0);
693 arr = (Eina_Array *)eina_hash_find(pd->colors_node_mesh, tmp);
694 if (arr)
695 {
696 if (mesh) *mesh = (Evas_3D_Mesh *)eina_array_data_get(arr, 1);
697 if (node) *node = (Evas_3D_Node *)eina_array_data_get(arr, 0);
698 eina_stringshare_del(tmp);
699
700 return EINA_TRUE;
701 }
702 else
703 {
704 eina_stringshare_del(tmp);
705 if (mesh) *mesh = NULL;
706 if (node) *node = NULL;
707 }
708 }
709 }
710 }
711 return EINA_FALSE;
712 }
629 /* Update the scene graph. */ 713 /* Update the scene graph. */
630 eo_do(obj, evas_3d_object_update()); 714 eo_do(obj, evas_3d_object_update());
631 Evas_3D_Node_Data *pd_camera_node = eo_data_scope_get(pd->camera_node, EVAS_3D_NODE_CLASS); 715 pd_camera_node = eo_data_scope_get(pd->camera_node, EVAS_3D_NODE_CLASS);
632 Evas_3D_Camera_Data *pd_camera = eo_data_scope_get(pd_camera_node->data.camera.camera, EVAS_3D_CAMERA_CLASS); 716 pd_camera = eo_data_scope_get(pd_camera_node->data.camera.camera, EVAS_3D_CAMERA_CLASS);
633 evas_mat4_multiply(&data.matrix_vp, 717 evas_mat4_multiply(&data.matrix_vp,
634 &pd_camera->projection, 718 &pd_camera->projection,
635 &pd_camera_node->data.camera.matrix_world_to_eye); 719 &pd_camera_node->data.camera.matrix_world_to_eye);
636 720
637 evas_ray3_init(&data.ray_world, data.x, data.y, &data.matrix_vp); 721 evas_ray3_init(&data.ray_world, data.x, data.y, &data.matrix_vp);
638 722
639
640 /* Traverse tree while adding meshes into pick data structure. */ 723 /* Traverse tree while adding meshes into pick data structure. */
641 evas_3d_node_tree_traverse(pd->root_node, EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE, 724 evas_3d_node_tree_traverse(pd->root_node, EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE,
642 _node_pick, &data); 725 _node_pick, &data);
@@ -726,4 +809,20 @@ _evas_3d_scene_shadows_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, E
726 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, NULL)); 809 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, NULL));
727} 810}
728 811
812EOLIAN static Eina_Bool
813_evas_3d_scene_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd)
814{
815 return pd->color_pick_enabled;
816}
817
818EOLIAN static Eina_Bool
819_evas_3d_scene_color_pick_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, Eina_Bool _enabled)
820{
821 if (pd->color_pick_enabled != _enabled)
822 pd->color_pick_enabled = _enabled;
823
824 eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_UPDATED, NULL));
825 return EINA_TRUE;
826}
827
729#include "canvas/evas_3d_scene.eo.c" 828#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 1078c0262a..bb25f90776 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)
136 params { 136 params {
137 } 137 }
138 } 138 }
139 color_pick_enable_get @const {
140 /*
141 Get status of color picking of the scene.
142
143 @ingroup Evas_3D_Scene
144 */
145 return: bool;
146 params {
147 }
148 }
149 color_pick_enable_set {
150 /*
151 Set posibility color picking.
152
153 @ingroup Evas_3D_Scene
154 */
155 return: bool;
156 params {
157 @in bool color_pick; /*@ Posibility flag */
158 }
159 }
139 } 160 }
140 properties { 161 properties {
141 162
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index c07cfa31df..ceab19d960 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
191 Evas_3D_Node *root_node; 191 Evas_3D_Node *root_node;
192 Evas_3D_Node *camera_node; 192 Evas_3D_Node *camera_node;
193 Evas_Color bg_color; 193 Evas_Color bg_color;
194 Eina_Bool shadows_enabled :1;
195 Eina_Bool color_pick_enabled :1;
194 196
195 void *surface; 197 void *surface;
196 int w, h; 198 int w, h;
197 Eina_List *images; 199 Eina_List *images;
198 Eina_Bool shadows_enabled :1; 200
201 Eina_Hash *node_mesh_colors;
202 Eina_Hash *colors_node_mesh;
199}; 203};
200 204
201struct _Evas_3D_Node_Mesh 205struct _Evas_3D_Node_Mesh
@@ -380,6 +384,7 @@ struct _Evas_3D_Scene_Public_Data
380 Eina_List *mesh_nodes; 384 Eina_List *mesh_nodes;
381 Eina_Bool shadows_enabled :1; 385 Eina_Bool shadows_enabled :1;
382 Eina_Bool color_pick_enabled :1; 386 Eina_Bool color_pick_enabled :1;
387
383 Eina_Hash *node_mesh_colors; 388 Eina_Hash *node_mesh_colors;
384 Eina_Hash *colors_node_mesh; 389 Eina_Hash *colors_node_mesh;
385}; 390};
@@ -1628,6 +1633,7 @@ void _canvas_smart_objects_calculate_count_get(Eo *e, void *_pd, va_list *list);
1628void 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); 1633void 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);
1629void 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); 1634void 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);
1630Eina_Bool evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data); 1635Eina_Bool evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data);
1636Eina_Bool evas_3d_node_color_node_mesh_collect(Evas_3D_Node *node, void *data);
1631Eina_Bool evas_3d_node_light_collect(Evas_3D_Node *node, void *data); 1637Eina_Bool evas_3d_node_light_collect(Evas_3D_Node *node, void *data);
1632void evas_3d_node_scene_root_add(Evas_3D_Node *node, Evas_3D_Scene *scene); 1638void evas_3d_node_scene_root_add(Evas_3D_Node *node, Evas_3D_Scene *scene);
1633void evas_3d_node_scene_root_del(Evas_3D_Node *node, Evas_3D_Scene *scene); 1639void evas_3d_node_scene_root_del(Evas_3D_Node *node, Evas_3D_Scene *scene);