forked from enlightenment/efl
edje: add of edje-3d to edje_calc.c
Summary: Adding of Mesh_Node, Light and Camera to _edje_part_recalc. Reviewers: raster, Hermet, cedric Reviewed By: cedric Subscribers: cedric, artem.popov Differential Revision: https://phab.enlightenment.org/D2639 Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
parent
ac4b6422f4
commit
3671506ad3
|
@ -26,6 +26,71 @@ static void _edje_part_recalc_single(Edje *ed, Edje_Rea
|
||||||
#define EINA_COW_CALC_MAP_END(Calc, Write) \
|
#define EINA_COW_CALC_MAP_END(Calc, Write) \
|
||||||
EINA_COW_WRITE_END(_edje_calc_params_map_cow, Calc->map, Write);
|
EINA_COW_WRITE_END(_edje_calc_params_map_cow, Calc->map, Write);
|
||||||
|
|
||||||
|
#ifdef BUILD_EDJE_FP
|
||||||
|
|
||||||
|
#define TYPE_EPSILON FLT_EPSILON
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define TYPE_EPSILON DBL_EPSILON
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define SET_QUATERNION(type) \
|
||||||
|
double norm; \
|
||||||
|
Eina_Quaternion quaternion; \
|
||||||
|
\
|
||||||
|
eina_quaternion_set(&quaternion, pd_##type->type.orientation.data[0], \
|
||||||
|
pd_##type->type.orientation.data[1], \
|
||||||
|
pd_##type->type.orientation.data[2], \
|
||||||
|
pd_##type->type.orientation.data[3]); \
|
||||||
|
\
|
||||||
|
norm = eina_quaternion_norm(&quaternion); \
|
||||||
|
\
|
||||||
|
if ((norm - 0.0) <= TYPE_EPSILON) \
|
||||||
|
ERR("%s %s", \
|
||||||
|
"{0, 0, 0, 0} quaternion gives rotation on non-zero angle", \
|
||||||
|
"around axis without orientation"); \
|
||||||
|
\
|
||||||
|
eina_quaternion_scale(&quaternion, &quaternion, 1/norm); \
|
||||||
|
\
|
||||||
|
eo_do(ep->node, \
|
||||||
|
evas_canvas3d_node_orientation_set(quaternion.x, quaternion.y, \
|
||||||
|
quaternion.z, quaternion.w));
|
||||||
|
|
||||||
|
#define SET_LOOK_AT(type) \
|
||||||
|
eo_do(ep->node, \
|
||||||
|
evas_canvas3d_node_look_at_set(pd_##type->type.position.space, \
|
||||||
|
pd_##type->type.orientation.data[0], \
|
||||||
|
pd_##type->type.orientation.data[1], \
|
||||||
|
pd_##type->type.orientation.data[2], \
|
||||||
|
pd_##type->type.position.space, \
|
||||||
|
pd_##type->type.orientation.data[3], \
|
||||||
|
pd_##type->type.orientation.data[4], \
|
||||||
|
pd_##type->type.orientation.data[5]));
|
||||||
|
|
||||||
|
#define SET_LOOK_TO(type) \
|
||||||
|
Edje_Real_Part *look_to; \
|
||||||
|
Evas_Real x, y ,z; \
|
||||||
|
look_to = ed->table_parts[pd_##type->type.orientation.look_to % ed->table_parts_size]; \
|
||||||
|
eo_do(look_to->node, \
|
||||||
|
evas_canvas3d_node_position_get(pd_##type->type.position.space, &x, &y, &z)); \
|
||||||
|
eo_do(ep->node, \
|
||||||
|
evas_canvas3d_node_look_at_set(pd_##type->type.position.space, x, y, z, \
|
||||||
|
pd_##type->type.position.space, \
|
||||||
|
pd_##type->type.orientation.data[3], \
|
||||||
|
pd_##type->type.orientation.data[4], \
|
||||||
|
pd_##type->type.orientation.data[5]));
|
||||||
|
|
||||||
|
#define SET_ANGLE_AXIS(type) \
|
||||||
|
eo_do(ep->node, \
|
||||||
|
evas_canvas3d_node_orientation_angle_axis_set(pd_##type->type.orientation.data[0], \
|
||||||
|
pd_##type->type.orientation.data[1], \
|
||||||
|
pd_##type->type.orientation.data[2], \
|
||||||
|
pd_##type->type.orientation.data[3]));
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2, FLOAT_T v3, FLOAT_T v4)
|
_edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2, FLOAT_T v3, FLOAT_T v4)
|
||||||
{
|
{
|
||||||
|
@ -286,6 +351,9 @@ case EDJE_PART_TYPE_##Short: \
|
||||||
EDIT_ALLOC_POOL_RTL(BOX, Box, box);
|
EDIT_ALLOC_POOL_RTL(BOX, Box, box);
|
||||||
EDIT_ALLOC_POOL_RTL(TABLE, Table, table);
|
EDIT_ALLOC_POOL_RTL(TABLE, Table, table);
|
||||||
EDIT_ALLOC_POOL_RTL(EXTERNAL, External, external_params);
|
EDIT_ALLOC_POOL_RTL(EXTERNAL, External, external_params);
|
||||||
|
EDIT_ALLOC_POOL_RTL(CAMERA, Camera, camera);
|
||||||
|
EDIT_ALLOC_POOL_RTL(LIGHT, Light, light);
|
||||||
|
EDIT_ALLOC_POOL_RTL(MESH_NODE, Mesh_Node, mesh_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desc_rtl)
|
if (desc_rtl)
|
||||||
|
@ -2479,6 +2547,9 @@ _edje_part_recalc_single(Edje *ed,
|
||||||
case EDJE_PART_TYPE_SWALLOW:
|
case EDJE_PART_TYPE_SWALLOW:
|
||||||
case EDJE_PART_TYPE_GROUP:
|
case EDJE_PART_TYPE_GROUP:
|
||||||
case EDJE_PART_TYPE_PROXY:
|
case EDJE_PART_TYPE_PROXY:
|
||||||
|
case EDJE_PART_TYPE_MESH_NODE:
|
||||||
|
case EDJE_PART_TYPE_LIGHT:
|
||||||
|
case EDJE_PART_TYPE_CAMERA:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_TYPE_GRADIENT:
|
case EDJE_PART_TYPE_GRADIENT:
|
||||||
|
@ -4077,6 +4148,210 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
|
||||||
case EDJE_PART_TYPE_SPACER:
|
case EDJE_PART_TYPE_SPACER:
|
||||||
/* We really should do nothing on SPACER part */
|
/* We really should do nothing on SPACER part */
|
||||||
break;
|
break;
|
||||||
|
case EDJE_PART_TYPE_CAMERA:
|
||||||
|
{
|
||||||
|
Evas_Canvas3D_Camera *camera = NULL;
|
||||||
|
Edje_Part_Description_Camera *pd_camera;
|
||||||
|
|
||||||
|
pd_camera = (Edje_Part_Description_Camera*) ep->chosen_description;
|
||||||
|
eo_do(ep->node, camera = evas_canvas3d_node_camera_get());
|
||||||
|
|
||||||
|
eo_do(camera,
|
||||||
|
evas_canvas3d_camera_projection_perspective_set(pd_camera->camera.camera.fovy, pd_camera->camera.camera.aspect,
|
||||||
|
pd_camera->camera.camera.frustum_near, pd_camera->camera.camera.frustum_far));
|
||||||
|
|
||||||
|
eo_do(ep->node,
|
||||||
|
evas_canvas3d_node_position_set(pd_camera->camera.position.point.x, pd_camera->camera.position.point.y,
|
||||||
|
pd_camera->camera.position.point.z));
|
||||||
|
switch (pd_camera->camera.orientation.type)
|
||||||
|
{
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_QUATERNION:
|
||||||
|
{
|
||||||
|
SET_QUATERNION(camera)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_AT:
|
||||||
|
SET_LOOK_AT(camera)
|
||||||
|
break;
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_TO:
|
||||||
|
{
|
||||||
|
SET_LOOK_TO(camera)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_ANGLE_AXIS:
|
||||||
|
SET_ANGLE_AXIS(camera)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EDJE_PART_TYPE_LIGHT:
|
||||||
|
{
|
||||||
|
Evas_Canvas3D_Light *light = NULL;
|
||||||
|
Edje_Part_Description_Light *pd_light;
|
||||||
|
|
||||||
|
pd_light = (Edje_Part_Description_Light*) ep->chosen_description;
|
||||||
|
eo_do(ep->node, light = evas_canvas3d_node_light_get());
|
||||||
|
|
||||||
|
eo_do(light,
|
||||||
|
evas_canvas3d_light_ambient_set(pd_light->light.properties.ambient.r / 255, pd_light->light.properties.ambient.g / 255,
|
||||||
|
pd_light->light.properties.ambient.b / 255, pd_light->light.properties.ambient.a / 255),
|
||||||
|
evas_canvas3d_light_diffuse_set(pd_light->light.properties.diffuse.r / 255, pd_light->light.properties.diffuse.g / 255,
|
||||||
|
pd_light->light.properties.diffuse.b / 255, pd_light->light.properties.diffuse.a / 255),
|
||||||
|
evas_canvas3d_light_specular_set(pd_light->light.properties.specular.r / 255, pd_light->light.properties.specular.g / 255,
|
||||||
|
pd_light->light.properties.specular.b / 255, pd_light->light.properties.specular.a / 255),
|
||||||
|
evas_canvas3d_light_directional_set(EINA_TRUE));
|
||||||
|
|
||||||
|
eo_do(ep->node,
|
||||||
|
evas_canvas3d_node_position_set(pd_light->light.position.point.x, pd_light->light.position.point.y,
|
||||||
|
pd_light->light.position.point.z));
|
||||||
|
switch (pd_light->light.orientation.type)
|
||||||
|
{
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_QUATERNION:
|
||||||
|
{
|
||||||
|
SET_QUATERNION(light);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_AT:
|
||||||
|
SET_LOOK_AT(light)
|
||||||
|
break;
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_TO:
|
||||||
|
{
|
||||||
|
SET_LOOK_TO(light)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_ANGLE_AXIS:
|
||||||
|
SET_ANGLE_AXIS(light)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EDJE_PART_TYPE_MESH_NODE:
|
||||||
|
{
|
||||||
|
Evas_Canvas3D_Material *material = NULL;
|
||||||
|
Evas_Canvas3D_Texture *texture = NULL;
|
||||||
|
Evas_Canvas3D_Mesh *mesh = NULL;
|
||||||
|
const char *proxy;
|
||||||
|
Edje_Part_Description_Mesh_Node *pd_mesh_node;
|
||||||
|
const Eina_List *meshes;
|
||||||
|
const Eina_List *list;
|
||||||
|
|
||||||
|
eo_do(ep->node, meshes = evas_canvas3d_node_mesh_list_get());
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(meshes, list, mesh)
|
||||||
|
{
|
||||||
|
eo_do(mesh, material = evas_canvas3d_mesh_frame_material_get(0));
|
||||||
|
eo_do(material, texture = evas_canvas3d_material_texture_get(EVAS_CANVAS3D_MATERIAL_DIFFUSE));
|
||||||
|
|
||||||
|
pd_mesh_node = (Edje_Part_Description_Mesh_Node*) ep->chosen_description;
|
||||||
|
|
||||||
|
eo_do(material,
|
||||||
|
evas_canvas3d_material_enable_set(EVAS_CANVAS3D_MATERIAL_AMBIENT, EINA_TRUE),
|
||||||
|
evas_canvas3d_material_enable_set(EVAS_CANVAS3D_MATERIAL_DIFFUSE, EINA_TRUE),
|
||||||
|
evas_canvas3d_material_enable_set(EVAS_CANVAS3D_MATERIAL_SPECULAR, EINA_TRUE),
|
||||||
|
evas_canvas3d_material_enable_set(EVAS_CANVAS3D_MATERIAL_NORMAL, pd_mesh_node->mesh_node.properties.normal),
|
||||||
|
evas_canvas3d_material_color_set(EVAS_CANVAS3D_MATERIAL_AMBIENT,
|
||||||
|
pd_mesh_node->mesh_node.properties.ambient.r / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.ambient.g / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.ambient.b / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.ambient.a / 255),
|
||||||
|
evas_canvas3d_material_color_set(EVAS_CANVAS3D_MATERIAL_DIFFUSE,
|
||||||
|
pd_mesh_node->mesh_node.properties.diffuse.r / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.diffuse.g / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.diffuse.b / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.diffuse.a / 255),
|
||||||
|
evas_canvas3d_material_color_set(EVAS_CANVAS3D_MATERIAL_SPECULAR,
|
||||||
|
pd_mesh_node->mesh_node.properties.specular.r / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.specular.g / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.specular.b / 255,
|
||||||
|
pd_mesh_node->mesh_node.properties.specular.a / 255),
|
||||||
|
evas_canvas3d_material_shininess_set(pd_mesh_node->mesh_node.properties.shininess));
|
||||||
|
|
||||||
|
switch(pd_mesh_node->mesh_node.mesh.primitive)
|
||||||
|
{
|
||||||
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_CUBE:
|
||||||
|
{
|
||||||
|
Eo *primitive = NULL;
|
||||||
|
|
||||||
|
eo_do(primitive,
|
||||||
|
evas_canvas3d_primitive_form_set(EVAS_CANVAS3D_MESH_PRIMITIVE_CUBE));
|
||||||
|
|
||||||
|
eo_do(mesh,
|
||||||
|
evas_canvas3d_mesh_from_primitive_set(0, primitive));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_SPHERE:
|
||||||
|
{
|
||||||
|
Eo *primitive = NULL;
|
||||||
|
|
||||||
|
eo_do(primitive,
|
||||||
|
evas_canvas3d_primitive_form_set(EVAS_CANVAS3D_MESH_PRIMITIVE_SPHERE),
|
||||||
|
evas_canvas3d_primitive_precision_set(20));
|
||||||
|
|
||||||
|
eo_do(mesh,
|
||||||
|
evas_canvas3d_mesh_from_primitive_set(0, primitive));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pd_mesh_node->mesh_node.texture.need_texture && pd_mesh_node->mesh_node.texture.textured)
|
||||||
|
{
|
||||||
|
proxy = NULL;
|
||||||
|
|
||||||
|
eo_do(material,
|
||||||
|
texture = evas_canvas3d_material_texture_get(EVAS_CANVAS3D_MATERIAL_DIFFUSE));
|
||||||
|
|
||||||
|
//proxy = _edje_image_name_find(ed, pd_mesh_node->mesh_node.texture.id);
|
||||||
|
/*FIXME Conflict with function _edje_image_name_find (two places in edje_utils and edje_edit.c,
|
||||||
|
temporary desicion need to clarify up to commit to phab*/
|
||||||
|
proxy = ed->file->image_dir->entries[pd_mesh_node->mesh_node.texture.id].entry;
|
||||||
|
if (proxy)
|
||||||
|
{
|
||||||
|
eo_do(texture,
|
||||||
|
evas_canvas3d_texture_file_set(eina_stringshare_add(proxy), NULL),
|
||||||
|
evas_canvas3d_texture_filter_set(pd_mesh_node->mesh_node.texture.filter1,
|
||||||
|
pd_mesh_node->mesh_node.texture.filter2),
|
||||||
|
evas_canvas3d_texture_wrap_set(pd_mesh_node->mesh_node.texture.wrap1,
|
||||||
|
pd_mesh_node->mesh_node.texture.wrap2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eo_do(mesh,
|
||||||
|
evas_canvas3d_mesh_frame_material_set(0, material),
|
||||||
|
evas_canvas3d_mesh_shade_mode_set(pd_mesh_node->mesh_node.properties.shade),
|
||||||
|
evas_canvas3d_mesh_vertex_assembly_set(pd_mesh_node->mesh_node.mesh.assembly));
|
||||||
|
eo_do(ep->node,
|
||||||
|
evas_canvas3d_node_scale_set(ep->part->scale_3d.x, ep->part->scale_3d.y,
|
||||||
|
ep->part->scale_3d.z),
|
||||||
|
evas_canvas3d_node_position_set(pd_mesh_node->mesh_node.position.point.x,
|
||||||
|
pd_mesh_node->mesh_node.position.point.y,
|
||||||
|
pd_mesh_node->mesh_node.position.point.z));
|
||||||
|
switch (pd_mesh_node->mesh_node.orientation.type)
|
||||||
|
{
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_QUATERNION:
|
||||||
|
{
|
||||||
|
SET_QUATERNION(mesh_node)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_AT:
|
||||||
|
SET_LOOK_AT(mesh_node)
|
||||||
|
break;
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_TO:
|
||||||
|
{
|
||||||
|
SET_LOOK_TO(mesh_node)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_ANGLE_AXIS:
|
||||||
|
SET_ANGLE_AXIS(mesh_node)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Some object need special recalc. */
|
/* Some object need special recalc. */
|
||||||
|
|
|
@ -1823,6 +1823,7 @@ struct _Edje_Real_Part
|
||||||
Edje_Part *part; // 4
|
Edje_Part *part; // 4
|
||||||
Evas_Object *object; // 4
|
Evas_Object *object; // 4
|
||||||
Evas_Object *nested_smart; // 4
|
Evas_Object *nested_smart; // 4
|
||||||
|
Eo *node; // 4
|
||||||
Edje_Real_Part_Drag *drag; // 4
|
Edje_Real_Part_Drag *drag; // 4
|
||||||
Edje_Part_Description_Common *chosen_description; // 4
|
Edje_Part_Description_Common *chosen_description; // 4
|
||||||
// WITH EDJE_CALC_CACHE: 307
|
// WITH EDJE_CALC_CACHE: 307
|
||||||
|
|
Loading…
Reference in New Issue