edje: implement more description physics attributes

* Damping
 * Sleeping Threshold



SVN revision: 80501
This commit is contained in:
Bruno Dilly 2012-12-07 21:19:31 +00:00
parent ddba28a921
commit c206188db4
8 changed files with 164 additions and 3 deletions

View File

@ -213,7 +213,9 @@ enum State_Param
STATE_PERSP_FOCAL = 42,
STATE_PHYSICS_MASS = 43,
STATE_PHYSICS_FRICTION = 44,
STATE_PHYSICS_RESTITUTION = 45
STATE_PHYSICS_RESTITUTION = 45,
STATE_PHYSICS_DAMPING = 46,
STATE_PHYSICS_SLEEP = 47
};
native set_state_val(part_id, State_Param:p, ...);

View File

@ -313,6 +313,8 @@ static void st_collections_group_parts_part_description_table_min(void);
static void st_collections_group_parts_part_description_physics_mass(void);
static void st_collections_group_parts_part_description_physics_restitution(void);
static void st_collections_group_parts_part_description_physics_friction(void);
static void st_collections_group_parts_part_description_physics_damping(void);
static void st_collections_group_parts_part_description_physics_sleep(void);
static void st_collections_group_parts_part_description_physics_ignore_part_position(void);
#endif
static void st_collections_group_parts_part_description_map_perspective(void);
@ -599,6 +601,8 @@ New_Statement_Handler statement_handlers[] =
{"collections.group.parts.part.description.physics.mass", st_collections_group_parts_part_description_physics_mass},
{"collections.group.parts.part.description.physics.restitution", st_collections_group_parts_part_description_physics_restitution},
{"collections.group.parts.part.description.physics.friction", st_collections_group_parts_part_description_physics_friction},
{"collections.group.parts.part.description.physics.damping", st_collections_group_parts_part_description_physics_damping},
{"collections.group.parts.part.description.physics.sleep", st_collections_group_parts_part_description_physics_sleep},
{"collections.group.parts.part.description.physics.ignore_part_position", st_collections_group_parts_part_description_physics_ignore_part_position},
#endif
{"collections.group.parts.part.description.map.perspective", st_collections_group_parts_part_description_map_perspective},
@ -1091,6 +1095,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
#ifdef HAVE_EPHYSICS
result->physics.mass = FROM_DOUBLE(1.0);
result->physics.friction = FROM_DOUBLE(0.5);
result->physics.sleep.linear = FROM_DOUBLE(24);
result->physics.sleep.angular = FROM_DOUBLE(57.29);
result->physics.ignore_part_position = 1;
#endif
@ -7183,6 +7189,8 @@ st_collections_group_parts_part_description_table_min(void)
mass: 5.31;
friction: 0.5;
restitution: 0.82;
damping: 0.4 0.24;
sleep: 32 18.9;
}
..
}
@ -7298,6 +7306,65 @@ st_collections_group_parts_part_description_physics_ignore_part_position(void)
}
#endif
/**
@page edcref
@property
damping
@parameters
[linear damping] [angular damping]
@effect
Damping(linear and angular) values are applied to body's linear and
angular velocity.
By applying a bodies damping factor the user will face a velocity
reduction, with a force applied to it - "like" air resistance.
The force is applied to slow it down.
Values should be between 0.0 and 1.0, and are set to 0 by default.
@endproperty
@since 1.8.0
*/
#ifdef HAVE_EPHYSICS
static void
st_collections_group_parts_part_description_physics_damping(void)
{
check_arg_count(2);
current_desc->physics.damping.linear = parse_float_range(0, 0, 1.0);
current_desc->physics.damping.angular = parse_float_range(1, 0, 1.0);
}
#endif
/**
@page edcref
@property
sleep
@parameters
[linear sleeping threshold] [angular sleeping threshold]
@effect
Sleeping threshold factors are used to determine whenever a rigid body
is supposed to increment the sleeping time. Linear threshold is
measured in Evas coordinates per second and angular threshold is
measured in degrees per second.
After every tick the sleeping time is incremented, if the body's
linear and angular speed is less than the respective thresholds
the sleeping time is incremented by the current time step (delta time).
Reaching the max sleeping time the body is marked to sleep, that means
the rigid body is to be deactivated.
By default linear threshold is 24 pixels / second and angular is
57.29 degrees / sec (1 rad/sec).
@endproperty
@since 1.8.0
*/
#ifdef HAVE_EPHYSICS
static void
st_collections_group_parts_part_description_physics_sleep(void)
{
check_arg_count(2);
current_desc->physics.sleep.linear = parse_float(0);
current_desc->physics.sleep.angular = parse_float(1);
}
#endif
/**
@edcsubsection{collections_group_parts_description_map,Map}
*/

View File

@ -456,12 +456,17 @@ collections {
signal: "custom";
script {
new Float: mass, Float:rest, Float:fric;
new Float: linear, Float:angular;
custom_state(PART:"red_circle", "default", 0.0);
set_state_val(PART:"red_circle", STATE_COLOR, 0, 0, 0, 255);
set_state_val(PART:"red_circle", STATE_PHYSICS_MASS, 4.5);
set_state_val(PART:"red_circle", STATE_PHYSICS_RESTITUTION, 0.1);
set_state_val(PART:"red_circle", STATE_PHYSICS_FRICTION, 0.345);
set_state_val(PART:"red_circle", STATE_PHYSICS_DAMPING, 0.3,
0.1);
set_state_val(PART:"red_circle", STATE_PHYSICS_SLEEP, 34.1,
12.83);
set_state(PART:"red_circle", "custom", 0.0);
get_state_val(PART:"red_circle", STATE_PHYSICS_MASS, mass);
@ -472,6 +477,16 @@ collections {
send_message(MSG_STRING_FLOAT_SET, 1, "Mass", mass);
send_message(MSG_STRING_FLOAT_SET, 1, "Friction", fric);
send_message(MSG_STRING_FLOAT_SET, 1, "Restitution", rest);
get_state_val(PART:"red_circle", STATE_PHYSICS_DAMPING,
linear, angular);
send_message(MSG_STRING_FLOAT_SET, 1, "Damping", linear,
angular);
get_state_val(PART:"red_circle", STATE_PHYSICS_SLEEP,
linear, angular);
send_message(MSG_STRING_FLOAT_SET, 1, "Sleep", linear,
angular);
}
}

View File

@ -43,6 +43,8 @@ collections {
physics {
mass: 30;
restitution: 0;
damping: 0.4 0.2;
sleep: 18 13.4;
}
}
}

View File

@ -2293,6 +2293,10 @@ _edje_part_recalc_single(Edje *ed,
params->physics.mass = desc->physics.mass;
params->physics.restitution = desc->physics.restitution;
params->physics.friction = desc->physics.friction;
params->physics.damping.linear = desc->physics.damping.linear;
params->physics.damping.angular = desc->physics.damping.angular;
params->physics.sleep.linear = desc->physics.sleep.linear;
params->physics.sleep.angular = desc->physics.sleep.angular;
params->ignore_part_position = desc->physics.ignore_part_position;
#endif
_edje_part_recalc_single_map(ed, ep, center, light, persp, desc, chosen_desc, params);
@ -2466,6 +2470,10 @@ _edje_physics_body_props_update(Edje_Real_Part *ep, Edje_Calc_Params *pf, Eina_B
ephysics_body_restitution_set(ep->body, pf->physics.restitution);
ephysics_body_friction_set(ep->body, pf->physics.friction);
ephysics_body_damping_set(ep->body, pf->physics.damping.linear,
pf->physics.damping.angular);
ephysics_body_sleeping_threshold_set(ep->body, pf->physics.sleep.linear,
pf->physics.sleep.angular);
}
static void
@ -2917,6 +2925,17 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
pos));
p3->physics.friction = TO_DOUBLE(FINTP(p1->physics.friction,
p2->physics.friction, pos));
p3->physics.damping.linear = TO_DOUBLE(FINTP(
p1->physics.damping.linear, p2->physics.damping.linear, pos));
p3->physics.damping.angular = TO_DOUBLE(FINTP(
p1->physics.damping.angular, p2->physics.damping.angular, pos));
p3->physics.sleep.linear = TO_DOUBLE(FINTP(
p1->physics.sleep.linear, p2->physics.sleep.linear, pos));
p3->physics.sleep.angular = TO_DOUBLE(FINTP(
p1->physics.sleep.angular, p2->physics.sleep.angular, pos));
if ((p1->ignore_part_position) && (p2->ignore_part_position))
p3->ignore_part_position = 1;
else

View File

@ -522,6 +522,10 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.mass", physics.mass, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.restitution", physics.restitution, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.friction", physics.friction, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.damping.linear", physics.damping.linear, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.damping.angular", physics.damping.angular, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.sleep.linear", physics.sleep.linear, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.sleep.angular", physics.sleep.angular, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.ignore_part_position", physics.ignore_part_position, EET_T_UCHAR); \
}
#else
@ -590,6 +594,10 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.mass", Dec.physics.mass, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.restitution", Dec.physics.restitution, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.friction", Dec.physics.friction, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.damping.linear", Dec.physics.damping.linear, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.damping.angular", Dec.physics.damping.angular, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.sleep.linear", Dec.physics.sleep.linear, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.sleep.angular", Dec.physics.sleep.angular, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "physics.ignore_part_position", Dec.physics.ignore_part_position, EET_T_UCHAR); \
}
#else

View File

@ -2276,6 +2276,21 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
GETFLOAT_T(rp->custom->description->physics.friction, params[3]);
break;
case EDJE_STATE_PARAM_PHYSICS_DAMPING:
CHKPARAM(4);
GETFLOAT_T(rp->custom->description->physics.damping.linear, params[3]);
GETFLOAT_T(rp->custom->description->physics.damping.angular,
params[4]);
break;
case EDJE_STATE_PARAM_PHYSICS_SLEEP:
CHKPARAM(4);
GETFLOAT_T(rp->custom->description->physics.sleep.linear, params[3]);
GETFLOAT_T(rp->custom->description->physics.sleep.angular, params[4]);
break;
#endif
default:
@ -2745,6 +2760,21 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
SETFLOAT_T(rp->custom->description->physics.friction, params[3]);
break;
case EDJE_STATE_PARAM_PHYSICS_DAMPING:
CHKPARAM(4);
SETFLOAT_T(rp->custom->description->physics.damping.linear, params[3]);
SETFLOAT_T(rp->custom->description->physics.damping.angular,
params[4]);
break;
case EDJE_STATE_PARAM_PHYSICS_SLEEP:
CHKPARAM(4);
SETFLOAT_T(rp->custom->description->physics.sleep.linear, params[3]);
SETFLOAT_T(rp->custom->description->physics.sleep.angular, params[4]);
break;
#endif
default:

View File

@ -417,7 +417,9 @@ typedef struct _Edje_Markup_Filter_Callback Edje_Markup_Filter_Callback;
#define EDJE_STATE_PARAM_PHYSICS_MASS 43
#define EDJE_STATE_PARAM_PHYSICS_FRICTION 44
#define EDJE_STATE_PARAM_PHYSICS_RESTITUTION 45
#define EDJE_STATE_PARAM_LAST 46
#define EDJE_STATE_PARAM_PHYSICS_DAMPING 46
#define EDJE_STATE_PARAM_PHYSICS_SLEEP 47
#define EDJE_STATE_PARAM_LAST 48
#define EDJE_ENTRY_EDIT_MODE_NONE 0
#define EDJE_ENTRY_EDIT_MODE_SELECTABLE 1
@ -973,6 +975,14 @@ struct _Edje_Part_Description_Common
double mass;
double restitution;
double friction;
struct {
double linear;
double angular;
} damping;
struct {
double linear;
double angular;
} sleep;
unsigned char ignore_part_position;
} physics;
#endif
@ -1310,7 +1320,15 @@ struct _Edje_Calc_Params
double mass; // 8
double restitution; // 8
double friction; // 8
} physics; // 24
struct {
double linear; //8
double angular; //8
} damping; // 16
struct {
double linear; //8
double angular; //8
} sleep; // 16
} physics; // 56
unsigned char ignore_part_position : 1;
#endif
unsigned char persp_on : 1;