Evas: Move 3d to Efl.Canvas.Scene3d

This still seems a bit redondant with the underlying
Evas.Canvas3d.Scene class.
This commit is contained in:
Jean-Philippe Andre 2016-03-08 14:11:07 +09:00
parent bd7af3ecfe
commit 7ddb73b177
27 changed files with 325 additions and 315 deletions

View File

@ -43,6 +43,7 @@ evas_eolian_pub_files = \
lib/evas/canvas/efl_vg_gradient_linear.eo \
lib/evas/canvas/efl_canvas_snapshot.eo \
lib/evas/canvas/efl_canvas_proxy.eo \
lib/evas/canvas/efl_canvas_scene3d.eo \
lib/evas/canvas/evas_filter.eo \
$(NULL)
@ -176,7 +177,9 @@ lib/evas/canvas/evas_map.c \
lib/evas/canvas/evas_gl.c \
lib/evas/canvas/evas_out.c \
lib/evas/canvas/efl_canvas_proxy.c \
lib/evas/canvas/efl_canvas_snapshot.c
lib/evas/canvas/efl_canvas_snapshot.c \
lib/evas/canvas/efl_canvas_scene3d.c \
$(NULL)
EXTRA_DIST += \
lib/evas/canvas/render2/evas_render2_th_main.c \

View File

@ -220,11 +220,11 @@ main(void)
efl_gfx_size_set(background, WIDTH, HEIGHT);
efl_gfx_visible_set(background, EINA_TRUE);
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
evas_object_focus_set(image, EINA_TRUE);
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_DOWN, _on_key_down, mesh_node);

View File

@ -283,14 +283,14 @@ main(void)
evas_object_show(background);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
evas_object_move(image, 0, 0);
evas_object_resize(image, WIDTH, HEIGHT);
evas_object_show(image);
evas_object_focus_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */

View File

@ -381,12 +381,12 @@ int main(int argc, char **argv)
globalscene.precision = precision;
globalscene.scene_init(texture);
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
evas_object_focus_set(image, EINA_TRUE);
evas_obj_image_scene_set(image, globalscene.scene);
efl_canvas_scene3d_set(image, globalscene.scene);
r = evas_object_key_grab(image, "Down", 0, 0, EINA_TRUE);
r = evas_object_key_grab(image, "Up", 0, 0, EINA_TRUE);

View File

@ -255,14 +255,14 @@ main(void)
evas_object_show(background);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
evas_object_image_size_set(image, WIDTH, HEIGHT);
evas_object_move(image, 0, 0);
evas_object_resize(image, WIDTH, HEIGHT);
evas_object_show(image);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
evas_object_focus_set(image, EINA_TRUE);

View File

@ -239,12 +239,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */
ecore_timer_add(0.016, _animate_scene, &data);

View File

@ -240,12 +240,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */
ecore_timer_add(0.01, _animate_scene, &data);

View File

@ -192,12 +192,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
ecore_timer_add(0.01, _animate_md2, mesh_node);
ecore_timer_add(0.01, _animate_eet, mesh_node2);

View File

@ -215,13 +215,13 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */
ecore_animator_frametime_set(0.008);

View File

@ -425,13 +425,13 @@ main(void)
evas_object_resize(background, WIDTH, HEIGHT);
evas_object_show(background);
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
evas_object_move(image, 0, 0);
evas_object_resize(image, WIDTH, HEIGHT);
evas_object_show(image);
evas_object_focus_set(image, EINA_TRUE);
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
_redraw_bounding_object(&data);
_show_help();

View File

@ -435,7 +435,7 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
@ -443,7 +443,7 @@ main(void)
evas_object_focus_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_DOWN, _key_down, &data);

View File

@ -158,12 +158,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
ecore_timer_add(0.01, _animate_scene, mesh_node);

View File

@ -239,12 +239,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
/* Enter main loop. */
ecore_main_loop_begin();

View File

@ -218,12 +218,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
for (i = 0; i < NUMBER_OF_MESHES; i++)
ecore_timer_add(ANIM_SPEED, _animate_scene, mesh_node[i]);

View File

@ -243,13 +243,13 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
evas_object_focus_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */
ecore_timer_add(0.01, _animate_scene, &data);

View File

@ -187,8 +187,8 @@ main(void)
efl_gfx_size_set(background, WIDTH, HEIGHT);
efl_gfx_visible_set(background, EINA_TRUE);
image = evas_object_image_filled_add(evas);
evas_obj_image_scene_set(image, scene);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_canvas_scene3d_set(image, scene);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_DOWN,

View File

@ -214,12 +214,12 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, scene);
efl_canvas_scene3d_set(image, scene);
ecore_animator_frametime_set(0.03);
for (i = 0; i < NUMBER_OF_MESHES; i++)

View File

@ -75,8 +75,9 @@ _animate_scene(void *data)
/* Rotate */
if (angle > 360.0) angle -= 360.0f;
pixels = evas_obj_image_data_get(source, EINA_TRUE);
stride = evas_obj_image_stride_get(source);
//pixels = efl_gfx_buffer_get(source, EINA_TRUE, NULL, NULL, NULL, &stride, NULL, NULL, NULL, NULL, NULL, NULL);
pixels = evas_object_image_data_get(source, EINA_TRUE);
stride = evas_object_image_stride_get(source);
for (i = 0; i < IMG_HEIGHT; i++)
{
@ -88,8 +89,10 @@ _animate_scene(void *data)
}
}
evas_obj_image_data_set(source, pixels);
evas_obj_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);
//efl_gfx_buffer_set(source, pixels, 0, 0, stride, 0, 0, 0, 0, 0, 0);
//evas_obj_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);
evas_object_image_data_set(source, pixels);
evas_object_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);
return EINA_TRUE;
}
@ -212,7 +215,7 @@ main(void)
efl_gfx_visible_set(source, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, (WIDTH / 2), (HEIGHT / 2));
efl_gfx_visible_set(image, EINA_TRUE);
@ -220,7 +223,7 @@ main(void)
_scene_setup(&data);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
/* Add animation timer callback. */
ecore_timer_add(0.016, _animate_scene, &data);

View File

@ -616,13 +616,13 @@ main(void)
efl_gfx_visible_set(background, EINA_TRUE);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
efl_gfx_size_set(image, WIDTH, HEIGHT);
efl_gfx_visible_set(image, EINA_TRUE);
evas_object_focus_set(image, EINA_TRUE);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, data.scene);
efl_canvas_scene3d_set(image, data.scene);
nodes1 = eina_list_append(nodes1, data.sphere.node);
nodes2 = eina_list_append(nodes2, data.sphere.node);

View File

@ -1145,13 +1145,13 @@ main(int argc, char *argv[])
_scene_setup(&data);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
image = eo_add(EFL_CANVAS_SCENE3D_CLASS, evas);
evas_object_move(image, 0, 0);
evas_object_resize(image, WIDTH, HEIGHT);
evas_object_show(image);
/* Set the image object as render target for 3D scene. */
evas_obj_image_scene_set(image, global_scene);
efl_canvas_scene3d_set(image, global_scene);
evas_object_focus_set(image, EINA_TRUE);

View File

@ -344,6 +344,7 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
#include "canvas/efl_canvas_snapshot.eo.h"
#include "canvas/efl_canvas_proxy.eo.h"
#include "canvas/efl_canvas_scene3d.eo.h"
/**
* @ingroup Evas_Object_VG

View File

@ -46,13 +46,13 @@ _efl_canvas_proxy_source_set(Eo *eo_obj, void *pd EINA_UNUSED, Evas_Object *eo_s
}
if (o->cur->source == eo_src) return EINA_TRUE;
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
/* Kill the image if any */
if (o->cur->u.file || o->cur->key)
evas_object_image_file_set(eo_obj, NULL, NULL);
if (eo_src) _proxy_set(eo_obj, eo_src);
else _proxy_unset(eo_obj, obj, o);
if (eo_src) _evas_image_proxy_set(eo_obj, eo_src);
else _evas_image_proxy_unset(eo_obj, obj, o);
return EINA_TRUE;
}

View File

@ -0,0 +1,204 @@
#include "evas_image_private.h"
#include "efl_canvas_scene3d.eo.h"
#define MY_CLASS EFL_CANVAS_SCENE3D_CLASS
EOLIAN static void
_efl_canvas_scene3d_scene3d_set(Eo *eo_obj, void *pd EINA_UNUSED, Evas_Canvas3D_Scene *scene)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
Evas_Image_Load_Opts lo;
if (o->cur->scene == scene) return;
evas_object_async_block(obj);
_evas_image_init_set(NULL, NULL, NULL, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo);
_evas_image_done_set(eo_obj, obj, o);
if (scene) _evas_image_3d_set(eo_obj, scene);
else _evas_image_3d_unset(eo_obj, obj, o);
}
EOLIAN static Evas_Canvas3D_Scene *
_efl_canvas_scene3d_scene3d_get(Eo *eo_obj, void *pd EINA_UNUSED)
{
Evas_Image_Data *o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
return o->cur->scene;
}
void
_evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED,
Evas_Object_Protected_Data *obj, Evas_Image_Data *o EINA_UNUSED,
Evas_Canvas3D_Scene *scene)
{
Evas_Public_Data *e;
Eina_Bool need_native_set = EINA_FALSE;
Evas_Canvas3D_Scene_Public_Data scene_data;
Evas_Canvas3D_Scene_Data *pd_scene = NULL;
pd_scene = eo_data_scope_get(scene, EVAS_CANVAS3D_SCENE_CLASS);
if ((pd_scene->w == 0) || (pd_scene->h == 0)) return;
if (!pd_scene->camera_node)
{
WRN("Camera has not been set to scene(%p)", scene);
return;
}
e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
if (pd_scene->surface)
{
int w = 0;
int h = 0;
if (e->engine.func->drawable_size_get)
{
e->engine.func->drawable_size_get(e->engine.data.output,
pd_scene->surface, &w, &h);
}
if ((w != pd_scene->w) || (h != pd_scene->h))
{
if (e->engine.func->drawable_free)
{
e->engine.func->drawable_free(e->engine.data.output,
pd_scene->surface);
}
pd_scene->surface = NULL;
need_native_set = EINA_TRUE;
}
}
else
{
/* TODO: Hard-coded alpha on. */
if (e->engine.func->drawable_new)
{
pd_scene->surface =
e->engine.func->drawable_new(e->engine.data.output,
pd_scene->w, pd_scene->h, 1);
}
need_native_set = EINA_TRUE;
}
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
if (need_native_set)
{
if (e->engine.func->image_drawable_set)
{
data->surface =
e->engine.func->image_drawable_set(e->engine.data.output,
data->surface,
pd_scene->surface);
}
}
data->w = pd_scene->w;
data->h = pd_scene->h;
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
evas_canvas3d_scene_data_init(&scene_data);
scene_data.bg_color = pd_scene->bg_color;
scene_data.shadows_enabled = pd_scene->shadows_enabled;
scene_data.camera_node = pd_scene->camera_node;
scene_data.depth_offset = pd_scene->depth_offset;
scene_data.depth_constant = pd_scene->depth_constant;
/* Phase 1 - Update scene graph tree. */
evas_canvas3d_object_update(scene);
/* Phase 2 - Do frustum culling and get visible model nodes. */
evas_canvas3d_node_tree_traverse(pd_scene->root_node,
EVAS_CANVAS3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE,
evas_canvas3d_node_mesh_collect, &scene_data);
/* Phase 3 - Collect active light nodes in the scene graph tree. */
evas_canvas3d_node_tree_traverse(pd_scene->root_node,
EVAS_CANVAS3D_TREE_TRAVERSE_ANY_ORDER, EINA_FALSE,
evas_canvas3d_node_light_collect, &scene_data);
/* Phase 5 - Draw the scene. */
if (e->engine.func->drawable_scene_render)
{
e->engine.func->drawable_scene_render(e->engine.data.output,
pd_scene->surface, &scene_data);
}
/* Clean up temporary resources. */
evas_canvas3d_scene_data_fini(&scene_data);
}
void
_evas_image_3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
Evas_Canvas3D_Scene_Data *pd_scene = eo_data_scope_get(scene,
EVAS_CANVAS3D_SCENE_CLASS);
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
data->surface = NULL;
data->w = 0;
data->h = 0;
eo_ref(scene);
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
state_write->scene = scene;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
pd_scene->images = eina_list_append(pd_scene->images, eo_obj);
}
void
_evas_image_3d_unset(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj,
Evas_Image_Data *o)
{
Evas_Public_Data *e;
if (!o->cur->scene) return;
Evas_Canvas3D_Scene_Data *pd_scene =
eo_data_scope_get(o->cur->scene, EVAS_CANVAS3D_SCENE_CLASS);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
pd_scene->images = eina_list_remove(pd_scene->images, eo_obj);
eo_unref(state_write->scene);
state_write->scene = NULL;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
if (o->cur->defmap)
{
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
evas_map_free(state_write->defmap);
state_write->defmap = NULL;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
}
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
e = obj->layer->evas;
if (data->surface)
e->engine.func->image_free(e->engine.data.output, data->surface);
data->surface = NULL;
data->w = 0;
data->h = 0;
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
}
#include "efl_canvas_scene3d.eo.c"

View File

@ -0,0 +1,19 @@
class Efl.Canvas.Scene3d (Evas.Image, Efl.Gfx.Base, Efl.Image, Efl.Gfx.Buffer, Efl.Gfx.Fill, Efl.Gfx.View, Efl.Gfx.Filter)
{
[[A UI view for EFL Canvas 3D.]]
legacy_prefix: null;
data: null;
methods {
@property scene3d {
[[The 3d scene to display in this view.
@since 1.10
]]
set {}
get {}
values {
scene: Evas.Canvas3D.Scene *; [[3D scene.]]
}
}
}
}

View File

@ -141,31 +141,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
surf: Evas.Native_Surface* @nonull; [[The native surface.]]
}
}
/* 3d */
@property scene {
set {
[[Set the 3D scene of a given image of the canvas.
This function sets a 3d scene of a given canvas image.
@since 1.10
]]
legacy: null;
}
get {
[[Get the 3D scene of a given image of the canvas.
This function returns the 3d scene of a given canvas image.
@since 1.10
]]
legacy: null;
}
values {
scene: Evas.Canvas3D.Scene *; [[3D scene on an image object.]]
}
}
}
implements {
Eo.Base.constructor;

View File

@ -137,9 +137,24 @@ struct _Evas_Image_Data
};
/* shared functions between legacy and new eo classes */
void _evas_object_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _proxy_set(Evas_Object *proxy, Evas_Object *src);
void _proxy_error(Evas_Object *proxy, void *context, void *output, void *surface, int x, int y, Eina_Bool do_async);
void _evas_image_init_set(const Eina_File *f, const char *file, const char *key, Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Image_Load_Opts *lo);
void _evas_image_done_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _evas_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _evas_image_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _evas_image_proxy_set(Evas_Object *proxy, Evas_Object *src);
void _evas_image_proxy_error(Evas_Object *proxy, void *context, void *output, void *surface, int x, int y, Eina_Bool do_async);
void _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene);
void _evas_image_3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene);
void _evas_image_3d_unset(Evas_Object *eo_obj, Evas_Object_Protected_Data *image, Evas_Image_Data *o);
/* save typing */
#define ENFN obj->layer->evas->engine.func
#define ENDT obj->layer->evas->engine.data.output
# define EINA_COW_IMAGE_STATE_WRITE_BEGIN(Obj, Write) \
EINA_COW_WRITE_BEGIN(evas_object_image_state_cow, Obj->cur, Evas_Object_Image_State, Write)
# define EINA_COW_IMAGE_STATE_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_state_cow, Obj->cur, Write)
#endif // EVAS_IMAGE_PRIVATE_H

View File

@ -3,10 +3,6 @@
#define MY_CLASS EVAS_IMAGE_CLASS
#define MY_CLASS_NAME "Evas_Image"
/* save typing */
#define ENFN obj->layer->evas->engine.func
#define ENDT obj->layer->evas->engine.data.output
/* private magic number for image objects */
static const char o_type[] = "image";
@ -61,10 +57,6 @@ static int evas_object_image_can_map(Evas_Object *eo_obj);
static void *evas_object_image_data_convert_internal(Evas_Image_Data *o, void *data, Evas_Colorspace to_cspace);
static void evas_object_image_filled_resize_listener(void *data, Evas *eo_e, Evas_Object *eo_obj, void *einfo);
static void _3d_render(Evas *eo_e, Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene);
static void _3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene);
static void _3d_unset(Evas_Object *eo_obj, Evas_Object_Protected_Data *image, Evas_Image_Data *o);
static const Evas_Object_Func object_func =
{
/* methods (compulsory) */
@ -134,12 +126,6 @@ Eina_Cow *evas_object_image_state_cow = NULL;
# define EINA_COW_LOAD_OPTS_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_load_opts_cow, Obj->load_opts, Write)
# define EINA_COW_IMAGE_STATE_WRITE_BEGIN(Obj, Write) \
EINA_COW_WRITE_BEGIN(evas_object_image_state_cow, Obj->cur, Evas_Object_Image_State, Write)
# define EINA_COW_IMAGE_STATE_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_state_cow, Obj->cur, Write)
# define EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY(Obj) \
if ((!Obj->cur->mmaped_source && Obj->cur->u.file) || Obj->cur->key) \
{ \
@ -153,7 +139,7 @@ Eina_Cow *evas_object_image_state_cow = NULL;
}
void
_evas_object_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o)
_evas_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o)
{
/* Eina_Cow doesn't know if the resulting memory has changed, better check
before we change it */
@ -171,8 +157,8 @@ _evas_object_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj,
o->preloading = EINA_FALSE;
ENFN->image_data_preload_cancel(ENDT, o->engine_data, eo_obj);
}
if (o->cur->source) _proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _3d_unset(eo_obj, obj, o);
if (o->cur->source) _evas_image_proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _evas_image_3d_unset(eo_obj, obj, o);
}
static Eina_Bool
@ -262,13 +248,13 @@ evas_object_image_memfile_set(Evas_Object *eo_obj, void *data, int size, char *f
eina_file_close(f);
}
static void
_image_init_set(const Eina_File *f, const char *file, const char *key,
void
_evas_image_init_set(const Eina_File *f, const char *file, const char *key,
Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o,
Evas_Image_Load_Opts *lo)
{
if (o->cur->source) _proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _3d_unset(eo_obj, obj, o);
if (o->cur->source) _evas_image_proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _evas_image_3d_unset(eo_obj, obj, o);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
@ -337,8 +323,8 @@ _image_init_set(const Eina_File *f, const char *file, const char *key,
lo->degree = 0;
}
static void
_image_done_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o)
void
_evas_image_done_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o)
{
Eina_Bool resize_call = EINA_FALSE;
@ -408,9 +394,9 @@ _evas_image_efl_file_mmap_set(Eo *eo_obj,
return EINA_FALSE;
}
evas_object_async_block(obj);
_image_init_set(f, NULL, key, eo_obj, obj, o, &lo);
_evas_image_init_set(f, NULL, key, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_mmap(ENDT, o->cur->u.f, o->cur->key, &o->load_error, &lo);
_image_done_set(eo_obj, obj, o);
_evas_image_done_set(eo_obj, obj, o);
return EINA_TRUE;
}
@ -445,9 +431,9 @@ _evas_image_efl_file_file_set(Eo *eo_obj, Evas_Image_Data *o, const char *file,
ENFN->image_data_preload_cancel(ENDT, o->engine_data, eo_obj);
*/
evas_object_async_block(obj);
_image_init_set(NULL, file, key, eo_obj, obj, o, &lo);
_evas_image_init_set(NULL, file, key, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo);
_image_done_set(eo_obj, obj, o);
_evas_image_done_set(eo_obj, obj, o);
return EINA_TRUE;
}
@ -549,29 +535,6 @@ _evas_image_eo_base_dbg_info_get(Eo *eo_obj, Evas_Image_Data *o, Eo_Dbg_Info *ro
}
}
EOLIAN static void
_evas_image_scene_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Load_Opts lo;
if (o->cur->scene == scene) return;
evas_object_async_block(obj);
_image_init_set(NULL, NULL, NULL, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo);
_image_done_set(eo_obj, obj, o);
if (scene) _3d_set(eo_obj, scene);
else _3d_unset(eo_obj, obj, o);
}
EOLIAN static Evas_Canvas3D_Scene *
_evas_image_scene_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->cur->scene;
}
EOLIAN static void
_evas_image_efl_image_border_set(Eo *eo_obj, Evas_Image_Data *o, int l, int r, int t, int b)
{
@ -736,7 +699,7 @@ evas_object_image_size_set(Eo *eo_obj, int w, int h)
if (o->cur->scene) return;
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if (w < 1) w = 1;
if (h < 1) h = 1;
if (w >= 32768) return;
@ -1114,7 +1077,7 @@ _evas_image_efl_file_save(const Eo *eo_obj, Evas_Image_Data *o, const char *file
if (o->cur->scene)
{
_3d_render(obj->layer->evas->evas, (Eo *) eo_obj, obj, o, o->cur->scene);
_evas_image_3d_render(obj->layer->evas->evas, (Eo *) eo_obj, obj, o, o->cur->scene);
pixels = obj->data_3d->surface;
imagew = obj->data_3d->w;
imageh = obj->data_3d->h;
@ -1293,7 +1256,7 @@ evas_object_image_pixels_import(Evas_Object *eo_obj, Evas_Pixel_Import_Source *p
evas_object_async_block(obj);
o = eo_data_scope_get(eo_obj, MY_CLASS);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if ((pixels->w != o->cur->image.w) || (pixels->h != o->cur->image.h)) return EINA_FALSE;
switch (pixels->format)
@ -1524,7 +1487,7 @@ evas_object_image_colorspace_set(Evas_Object *eo_obj, Evas_Colorspace cspace)
Evas_Image_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
state_write->cspace = cspace;
@ -1546,7 +1509,7 @@ _evas_image_video_surface_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Video_Surface
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if (o->video_surface)
{
o->video_surface = EINA_FALSE;
@ -1610,7 +1573,7 @@ _evas_image_video_surface_caps_set(Eo *eo_obj, Evas_Image_Data *o, unsigned int
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if (caps == o->pixels->video_caps)
return;
@ -1655,7 +1618,7 @@ _evas_image_native_surface_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Native_Surfa
evas_object_async_block(obj);
evas_render_rendering_wait(obj->layer->evas);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if (!ENFN->image_native_set) return;
if ((surf) &&
((surf->version < 2) ||
@ -1964,7 +1927,7 @@ _evas_canvas_image_max_size_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int *
}
void
_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_proxy, Evas_Image_Data *o)
_evas_image_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_proxy, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *cur_source;
@ -2020,7 +1983,7 @@ _proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_proxy, Evas_Ima
}
void
_proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
_evas_image_proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
{
Evas_Object_Protected_Data *src = eo_data_scope_get(eo_src, EVAS_OBJECT_CLASS);
Evas_Object_Protected_Data *proxy = eo_data_scope_get(eo_proxy, EVAS_OBJECT_CLASS);
@ -2052,7 +2015,7 @@ _proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
* Give them some pixels. A random color
*/
void
_proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface,
_evas_image_proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface,
int x, int y, Eina_Bool do_async)
{
Evas_Image_Data *o = eo_data_scope_get(eo_proxy, MY_CLASS);
@ -2077,179 +2040,6 @@ _proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface,
do_async);
}
static void
_3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
Evas_Canvas3D_Scene_Data *pd_scene = eo_data_scope_get(scene,
EVAS_CANVAS3D_SCENE_CLASS);
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
data->surface = NULL;
data->w = 0;
data->h = 0;
eo_ref(scene);
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
state_write->scene = scene;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
pd_scene->images = eina_list_append(pd_scene->images, eo_obj);
}
static void
_3d_unset(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj,
Evas_Image_Data *o)
{
Evas_Public_Data *e;
if (!o->cur->scene) return;
Evas_Canvas3D_Scene_Data *pd_scene =
eo_data_scope_get(o->cur->scene, EVAS_CANVAS3D_SCENE_CLASS);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
pd_scene->images = eina_list_remove(pd_scene->images, eo_obj);
eo_unref(state_write->scene);
state_write->scene = NULL;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
if (o->cur->defmap)
{
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
{
evas_map_free(state_write->defmap);
state_write->defmap = NULL;
}
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
}
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
e = obj->layer->evas;
if (data->surface)
e->engine.func->image_free(e->engine.data.output, data->surface);
data->surface = NULL;
data->w = 0;
data->h = 0;
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
}
static void
_3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED,
Evas_Object_Protected_Data *obj, Evas_Image_Data *o EINA_UNUSED,
Evas_Canvas3D_Scene *scene)
{
Evas_Public_Data *e;
Eina_Bool need_native_set = EINA_FALSE;
Evas_Canvas3D_Scene_Public_Data scene_data;
Evas_Canvas3D_Scene_Data *pd_scene = NULL;
pd_scene = eo_data_scope_get(scene, EVAS_CANVAS3D_SCENE_CLASS);
if ((pd_scene->w == 0) || (pd_scene->h == 0)) return;
if (!pd_scene->camera_node)
{
WRN("Camera has not been set to scene(%p)", scene);
return;
}
e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
if (pd_scene->surface)
{
int w = 0;
int h = 0;
if (e->engine.func->drawable_size_get)
{
e->engine.func->drawable_size_get(e->engine.data.output,
pd_scene->surface, &w, &h);
}
if ((w != pd_scene->w) || (h != pd_scene->h))
{
if (e->engine.func->drawable_free)
{
e->engine.func->drawable_free(e->engine.data.output,
pd_scene->surface);
}
pd_scene->surface = NULL;
need_native_set = EINA_TRUE;
}
}
else
{
/* TODO: Hard-coded alpha on. */
if (e->engine.func->drawable_new)
{
pd_scene->surface =
e->engine.func->drawable_new(e->engine.data.output,
pd_scene->w, pd_scene->h, 1);
}
need_native_set = EINA_TRUE;
}
EINA_COW_WRITE_BEGIN(evas_object_3d_cow, obj->data_3d, Evas_Object_3D_Data,
data)
{
if (need_native_set)
{
if (e->engine.func->image_drawable_set)
{
data->surface =
e->engine.func->image_drawable_set(e->engine.data.output,
data->surface,
pd_scene->surface);
}
}
data->w = pd_scene->w;
data->h = pd_scene->h;
}
EINA_COW_WRITE_END(evas_object_3d_cow, obj->data_3d, data);
evas_canvas3d_scene_data_init(&scene_data);
scene_data.bg_color = pd_scene->bg_color;
scene_data.shadows_enabled = pd_scene->shadows_enabled;
scene_data.camera_node = pd_scene->camera_node;
scene_data.depth_offset = pd_scene->depth_offset;
scene_data.depth_constant = pd_scene->depth_constant;
/* Phase 1 - Update scene graph tree. */
evas_canvas3d_object_update(scene);
/* Phase 2 - Do frustum culling and get visible model nodes. */
evas_canvas3d_node_tree_traverse(pd_scene->root_node,
EVAS_CANVAS3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_TRUE,
evas_canvas3d_node_mesh_collect, &scene_data);
/* Phase 3 - Collect active light nodes in the scene graph tree. */
evas_canvas3d_node_tree_traverse(pd_scene->root_node,
EVAS_CANVAS3D_TREE_TRAVERSE_ANY_ORDER, EINA_FALSE,
evas_canvas3d_node_light_collect, &scene_data);
/* Phase 5 - Draw the scene. */
if (e->engine.func->drawable_scene_render)
{
e->engine.func->drawable_scene_render(e->engine.data.output,
pd_scene->surface, &scene_data);
}
/* Clean up temporary resources. */
evas_canvas3d_scene_data_fini(&scene_data);
}
static void
evas_object_image_unload(Evas_Object *eo_obj, Eina_Bool dirty)
{
@ -2461,8 +2251,8 @@ evas_object_image_free(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
if (o->cur->u.f) eina_file_close(o->cur->u.f);
}
if (o->cur->key) eina_stringshare_del(o->cur->key);
if (o->cur->source) _proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _3d_unset(eo_obj, obj, o);
if (o->cur->source) _evas_image_proxy_unset(eo_obj, obj, o);
if (o->cur->scene) _evas_image_3d_unset(eo_obj, obj, o);
if (obj->layer && obj->layer->evas)
{
if (o->engine_data)
@ -2765,7 +2555,7 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v
/* Proxy sanity */
if (o->proxyrendering)
{
_proxy_error(eo_obj, context, output, surface, x, y, EINA_FALSE);
_evas_image_proxy_error(eo_obj, context, output, surface, x, y, EINA_FALSE);
return;
}
@ -2843,7 +2633,7 @@ _evas_image_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
if (o->cur->scene)
{
_3d_render(obj->layer->evas->evas, eo_obj, obj, o, o->cur->scene);
_evas_image_3d_render(obj->layer->evas->evas, eo_obj, obj, o, o->cur->scene);
pixels = obj->data_3d->surface;
imagew = obj->data_3d->w;
imageh = obj->data_3d->h;
@ -3743,7 +3533,7 @@ evas_object_image_is_inside(Evas_Object *eo_obj,
if (o->cur->scene)
{
_3d_render(obj->layer->evas->evas, eo_obj, obj, o, o->cur->scene);
_evas_image_3d_render(obj->layer->evas->evas, eo_obj, obj, o, o->cur->scene);
pixels = obj->data_3d->surface;
imagew = obj->data_3d->w;
imageh = obj->data_3d->h;
@ -4486,7 +4276,7 @@ evas_object_image_data_set(Eo *eo_obj, void *data)
evas_object_async_block(obj);
evas_render_rendering_wait(obj->layer->evas);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
p_data = o->engine_data;
if (data)
{
@ -4614,7 +4404,7 @@ evas_object_image_data_copy_set(Eo *eo_obj, void *data)
if (!data) return;
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
_evas_image_cleanup(eo_obj, obj, o);
if ((o->cur->image.w <= 0) ||
(o->cur->image.h <= 0)) return;
if (o->engine_data)