diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c
index bc95a03acc..f6cd40b0da 100644
--- a/legacy/edje/src/bin/edje_cc_handlers.c
+++ b/legacy/edje/src/bin/edje_cc_handlers.c
@@ -96,6 +96,7 @@
*
@ref sec_collections_group_parts_items "Items"
*
* @ref sec_collections_group_parts_description_table "Table"
+ * @ref sec_collections_group_parts_description_physics "Physics"
* @ref sec_collections_group_parts_description_map "Map (3d/transformations)"
*
* - @ref sec_collections_group_parts_description_map_rotation "Rotation"
@@ -308,6 +309,9 @@ static void st_collections_group_parts_part_description_table_homogeneous(void);
static void st_collections_group_parts_part_description_table_align(void);
static void st_collections_group_parts_part_description_table_padding(void);
static void st_collections_group_parts_part_description_table_min(void);
+#ifdef HAVE_EPHYSICS
+static void st_collections_group_parts_part_description_physics_mass(void);
+#endif
static void st_collections_group_parts_part_description_map_perspective(void);
static void st_collections_group_parts_part_description_map_light(void);
static void st_collections_group_parts_part_description_map_rotation_center(void);
@@ -588,6 +592,9 @@ New_Statement_Handler statement_handlers[] =
{"collections.group.parts.part.description.table.align", st_collections_group_parts_part_description_table_align},
{"collections.group.parts.part.description.table.padding", st_collections_group_parts_part_description_table_padding},
{"collections.group.parts.part.description.table.min", st_collections_group_parts_part_description_table_min},
+#ifdef HAVE_EPHYSICS
+ {"collections.group.parts.part.description.physics.mass", st_collections_group_parts_part_description_physics_mass},
+#endif
{"collections.group.parts.part.description.map.perspective", st_collections_group_parts_part_description_map_perspective},
{"collections.group.parts.part.description.map.light", st_collections_group_parts_part_description_map_light},
{"collections.group.parts.part.description.map.rotation.center", st_collections_group_parts_part_description_map_rotation_center},
@@ -833,6 +840,9 @@ New_Object_Handler object_handlers[] =
{"collections.group.parts.part.description.styles.style", ob_styles_style}, /* dup */
{"collections.group.parts.part.description.box", NULL},
{"collections.group.parts.part.description.table", NULL},
+#ifdef HAVE_EPHYSICS
+ {"collections.group.parts.part.description.physics", NULL},
+#endif
{"collections.group.parts.part.description.map", NULL},
{"collections.group.parts.part.description.map.rotation", NULL},
{"collections.group.parts.part.description.perspective", NULL},
@@ -1072,6 +1082,10 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
exit(-1);
}
+#ifdef HAVE_EPHYSICS
+ result->physics.mass = FROM_DOUBLE(1.0);
+#endif
+
return result;
}
@@ -3328,7 +3342,6 @@ st_collections_group_parts_part_type(void)
current_part->type = type;
}
-#ifdef HAVE_EPHYSICS
/**
@page edcref
@property
@@ -3355,6 +3368,7 @@ st_collections_group_parts_part_type(void)
@endproperty
@since 1.8.0
*/
+#ifdef HAVE_EPHYSICS
static void
st_collections_group_parts_part_physics_body(void)
{
@@ -7145,6 +7159,49 @@ st_collections_group_parts_part_description_table_min(void)
ed->table.min.v = parse_bool(1);
}
+/**
+ @edcsubsection{collections_group_parts_description_physics,Physics}
+ */
+
+/**
+ @page edcref
+ @block
+ physics
+ @context
+ description {
+ ..
+ physics {
+ mass: 5.31;
+ }
+ ..
+ }
+
+ @description
+ @endblock
+
+ @property
+ mass
+ @parameters
+ [body's mass in kilograms]
+ @effect
+ Double value used to set inertial mass of the body.
+ It is a quantitative measure of an object's resistance to the change of
+ its speed. If mass is set to 0 the body will have infinite mass,
+ so it will be immovable, static.
+ @endproperty
+ @since 1.8.0
+*/
+
+#ifdef HAVE_EPHYSICS
+static void
+st_collections_group_parts_part_description_physics_mass(void)
+{
+ check_arg_count(1);
+
+ current_desc->physics.mass = parse_float(0);
+}
+#endif
+
/**
@edcsubsection{collections_group_parts_description_map,Map}
*/
diff --git a/legacy/edje/src/examples/physics_basic.edc b/legacy/edje/src/examples/physics_basic.edc
index cc98fdc170..e613aed6ef 100644
--- a/legacy/edje/src/examples/physics_basic.edc
+++ b/legacy/edje/src/examples/physics_basic.edc
@@ -31,6 +31,16 @@ collections {
rel1.relative: 0.55 0.1;
rel2.relative: 0.75 0.3;
aspect: 1 1;
+ physics {
+ mass: 10.8;
+ }
+ }
+ description {
+ state: "light" 0.0;
+ inherit: "default" 0.0;
+ physics {
+ mass: 6.66;
+ }
}
}
@@ -60,5 +70,16 @@ collections {
}
}
+ programs {
+ program {
+ name: "load";
+ signal: "load";
+ in: 2 0;
+ action: STATE_SET "light" 0.0;
+ transition: LINEAR 0.5;
+ target: "red_box";
+ }
+ }
+
}
}
diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c
index 618f3c74b6..97d884089e 100644
--- a/legacy/edje/src/lib/edje_calc.c
+++ b/legacy/edje/src/lib/edje_calc.c
@@ -2289,6 +2289,9 @@ _edje_part_recalc_single(Edje *ed,
break;
}
+#ifdef HAVE_EPHYSICS
+ params->physics.mass = desc->physics.mass;
+#endif
_edje_part_recalc_single_map(ed, ep, center, light, persp, desc, chosen_desc, params);
}
@@ -2802,6 +2805,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
p3->color.b = INTP(p1->color.b, p2->color.b, pos2);
p3->color.a = INTP(p1->color.a, p2->color.a, pos2);
+#ifdef HAVE_EPHYSICS
+ p3->physics.mass = TO_DOUBLE(FINTP(p1->physics.mass, p2->physics.mass,
+ pos));
+#endif
+
switch (part_type)
{
case EDJE_PART_TYPE_IMAGE:
@@ -2992,6 +3000,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
NULL, NULL, NULL);
ephysics_body_move(ep->body,
ed->x + pf->x, ed->y + pf->y, z);
+ ephysics_body_mass_set(ep->body, pf->physics.mass);
}
else
#endif
diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c
index 6eca7729c4..da879ba942 100644
--- a/legacy/edje/src/lib/edje_data.c
+++ b/legacy/edje/src/lib/edje_data.c
@@ -451,8 +451,7 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "d", d, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "s", s, EET_T_STRING);
-#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON(Edd, Type) \
- { \
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_FIELDS(Edd, Type) \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.name", state.name, EET_T_STRING); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.value", state.value, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "visible", visible, EET_T_CHAR); \
@@ -508,11 +507,22 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.persp_on", map.persp_on, EET_T_UCHAR); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.backcull", map.backcull, EET_T_UCHAR); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.zplane", persp.zplane, EET_T_INT); \
- EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", persp.focal, EET_T_INT); \
- }
+ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", persp.focal, EET_T_INT);
-#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB(Edd, Type, Dec) \
- { \
+#ifdef HAVE_EPHYSICS
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON(Edd, Type) \
+ { \
+ EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_FIELDS(Edd, Type) \
+ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.mass", physics.mass, EET_T_DOUBLE); \
+ }
+#else
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON(Edd, Type) \
+ { \
+ EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_FIELDS(Edd, Type) \
+ }
+#endif
+
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB_FIELDS(Edd, Type, Dec) \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.name", Dec.state.name, EET_T_STRING); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.value", Dec.state.value, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "visible", Dec.visible, EET_T_CHAR); \
@@ -563,7 +573,19 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.backcull", Dec.map.backcull, EET_T_UCHAR); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.zplane", Dec.persp.zplane, EET_T_INT); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", Dec.persp.focal, EET_T_INT); \
+
+#ifdef HAVE_EPHYSICS
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB(Edd, Type, Dec) \
+ { \
+ EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB_FIELDS(Edd, Type, Dec) \
+ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.mass", Dec.physics.mass, EET_T_DOUBLE); \
}
+#else
+#define EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB(Edd, Type, Dec) \
+ { \
+ EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB_FIELDS(Edd, Type, Dec) \
+ }
+#endif
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Common);
eddc.func.mem_free = mem_free_rectangle;
diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h
index 26adfaa190..76a3ab0e83 100644
--- a/legacy/edje/src/lib/edje_private.h
+++ b/legacy/edje/src/lib/edje_private.h
@@ -958,6 +958,12 @@ struct _Edje_Part_Description_Common
int focal;
} persp;
+#ifdef HAVE_EPHYSICS
+ struct {
+ double mass;
+ } physics;
+#endif
+
unsigned char visible; /* is it shown */
unsigned char limit; /* 0 == no, 1 = width, 2 = height, 3 = both */
};
@@ -1286,6 +1292,11 @@ struct _Edje_Calc_Params
int focal;
} persp;
} map;
+#ifdef HAVE_EPHYSICS
+ struct {
+ double mass; // 8
+ } physics; // 8
+#endif
unsigned char persp_on : 1;
unsigned char lighted : 1;
unsigned char mapped : 1;