diff --git a/src/lib/evas/canvas/evas_3d_camera.c b/src/lib/evas/canvas/evas_3d_camera.c index c6da2d3aa7..7a9c8a5a25 100644 --- a/src/lib/evas/canvas/evas_3d_camera.c +++ b/src/lib/evas/canvas/evas_3d_camera.c @@ -74,8 +74,22 @@ EOLIAN static void _evas_3d_camera_eo_base_destructor(Eo *obj, Evas_3D_Camera_Data *pd) { - //evas_3d_object_unreference(&pd->base); - if (pd->nodes) eina_hash_free(pd->nodes); + Eina_Iterator *it = NULL; + void *data = NULL; + Evas_3D_Node_Data *node = NULL; + + if (pd->nodes) + { + it = eina_hash_iterator_key_new(pd->nodes); + while (eina_iterator_next(it, &data)) + { + node = eo_data_scope_get(data, EVAS_3D_NODE_CLASS); + node->data.camera.camera = NULL; + } + + eina_hash_free(pd->nodes); + } + eo_do_super(obj, MY_CLASS, eo_destructor()); } diff --git a/src/lib/evas/canvas/evas_3d_light.c b/src/lib/evas/canvas/evas_3d_light.c index f9ca75b17b..d8c73b66e4 100644 --- a/src/lib/evas/canvas/evas_3d_light.c +++ b/src/lib/evas/canvas/evas_3d_light.c @@ -97,8 +97,22 @@ _evas_3d_light_eo_base_constructor(Eo *obj, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_eo_base_destructor(Eo *obj, Evas_3D_Light_Data *pd) { + Eina_Iterator *it = NULL; + void *data = NULL; + Evas_3D_Node_Data *node = NULL; + if (pd->nodes) - eina_hash_free(pd->nodes); + { + it = eina_hash_iterator_key_new(pd->nodes); + while (eina_iterator_next(it, &data)) + { + node = eo_data_scope_get(data, EVAS_3D_NODE_CLASS); + node->data.light.light = NULL; + } + + eina_hash_free(pd->nodes); + } + eo_do_super(obj, MY_CLASS, eo_destructor()); } diff --git a/src/lib/evas/canvas/evas_3d_material.c b/src/lib/evas/canvas/evas_3d_material.c index 8cd325d6a1..aee8c85c9a 100644 --- a/src/lib/evas/canvas/evas_3d_material.c +++ b/src/lib/evas/canvas/evas_3d_material.c @@ -104,17 +104,34 @@ _evas_3d_material_eo_base_constructor(Eo *obj EINA_UNUSED, Evas_3D_Material_Data EOLIAN static void _evas_3d_material_eo_base_destructor(Eo *obj, Evas_3D_Material_Data *pd) { - int i; + int i = 0; + Eina_Iterator *it = NULL; + void *data = NULL; + Evas_3D_Mesh_Data *mesh = NULL; + Eina_List *l = NULL; + Evas_3D_Mesh_Frame *f = NULL; if (pd->meshes) - eina_hash_free(pd->meshes); + { + it = eina_hash_iterator_key_new(pd->meshes); + while (eina_iterator_next(it, &data)) + { + mesh = eo_data_scope_get(data, EVAS_3D_MESH_CLASS); + if (mesh->frames) + { + EINA_LIST_FOREACH(mesh->frames, l, f) + f->material = NULL; + } + } + eina_iterator_free(it); + eina_hash_free(pd->meshes); + } for (i = 0; i < EVAS_3D_MATERIAL_ATTRIB_COUNT; i++) { if (pd->attribs[i].texture) { evas_3d_texture_material_del(pd->attribs[i].texture, obj); - //eo_unref(pd->attribs[i].texture); } } eo_do_super(obj, MY_CLASS, eo_destructor()); diff --git a/src/lib/evas/canvas/evas_3d_mesh.c b/src/lib/evas/canvas/evas_3d_mesh.c index 4430438054..27006f46a8 100644 --- a/src/lib/evas/canvas/evas_3d_mesh.c +++ b/src/lib/evas/canvas/evas_3d_mesh.c @@ -259,7 +259,6 @@ _evas_3d_mesh_eo_base_constructor(Eo *obj, Evas_3D_Mesh_Data *pd) EOLIAN static void _evas_3d_mesh_eo_base_destructor(Eo *obj, Evas_3D_Mesh_Data *pd) { - //evas_3d_object_unreference(&pd->base); _mesh_fini(pd); eo_do_super(obj, MY_CLASS, eo_destructor()); } diff --git a/src/lib/evas/canvas/evas_3d_node.c b/src/lib/evas/canvas/evas_3d_node.c index 84f62045d6..af9188635b 100644 --- a/src/lib/evas/canvas/evas_3d_node.c +++ b/src/lib/evas/canvas/evas_3d_node.c @@ -628,7 +628,6 @@ _node_free(Evas_3D_Object *obj) EINA_LIST_FOREACH(pd->data.mesh.meshes, l, m) { - //evas_3d_mesh_node_del(m, node); eo_unref(m); } @@ -643,8 +642,6 @@ _node_free(Evas_3D_Object *obj) if (pd->scenes_camera) eina_hash_free(pd->scenes_camera); - - //free(node); } void @@ -1048,6 +1045,14 @@ _evas_3d_node_constructor(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node_Type type } } +EOLIAN static void +_evas_3d_node_eo_base_destructor(Eo *obj, Evas_3D_Node_Data *pd EINA_UNUSED) +{ + _node_free(obj); + + eo_do_super(obj, MY_CLASS, eo_destructor()); +} + EOLIAN static Evas_3D_Node_Type _evas_3d_node_type_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd) { diff --git a/src/lib/evas/canvas/evas_3d_node.eo b/src/lib/evas/canvas/evas_3d_node.eo index ae24823572..b602fd29bc 100644 --- a/src/lib/evas/canvas/evas_3d_node.eo +++ b/src/lib/evas/canvas/evas_3d_node.eo @@ -578,6 +578,7 @@ class Evas_3D_Node (Evas_3D_Object, Evas.Common_Interface) } } implements { + Eo.Base.destructor; Evas_3D_Object.update_notify; Evas_3D_Object.change_notify; Evas_3D_Object.callback_register; diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index 8945fadea8..e289d10a95 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -161,8 +161,14 @@ static void _texture_fini(Evas_3D_Texture *obj) { Eo *evas = NULL; + int i = 0; + Eina_Iterator *it = NULL; + void *data = NULL; + Evas_3D_Material_Data *material = NULL; + eo_do(obj, evas = evas_common_evas_get()); Evas_3D_Texture_Data *pd = eo_data_scope_get(obj, MY_CLASS); + if (pd->engine_data) { Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); @@ -173,6 +179,19 @@ _texture_fini(Evas_3D_Texture *obj) if (pd->materials) { + it = eina_hash_iterator_key_new(pd->materials); + EINA_ITERATOR_FOREACH(it, data) + { + material = eo_data_scope_get(data, EVAS_3D_MATERIAL_CLASS); + if (!material) continue; + for (i = 0; i < EVAS_3D_MATERIAL_ATTRIB_COUNT; i++) + { + if (material->attribs[i].texture) + evas_3d_texture_material_del(material->attribs[i].texture, data); + } + } + eina_iterator_free(it); + eina_hash_free(pd->materials); pd->materials = NULL; } @@ -311,7 +330,6 @@ _evas_3d_texture_eo_base_constructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUS EOLIAN static void _evas_3d_texture_eo_base_destructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUSED) { - //evas_3d_object_unreference(&pd->base); _texture_fini(obj); eo_do_super(obj, MY_CLASS, eo_destructor()); }