2012-06-26 15:36:12 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "ephysics_test.h"
|
|
|
|
|
EPhysics: generic constraint
This patch changes how constraints are created and configured, now we
use a bullet generic implementation which let us operate on the 6
degrees of freedom(linear and angular ones).
We have used 6dof for slider constraint but now we assume 2 types of
constraints, single body - simply ephysics_constraint_add(body) - and a linked
one - ephysics_constraint_linked_add(body1, body2) used to constrain 2 bodies
linked together.
Having said that we introduce the following changes:
+ migrate p2p constraint to 6Dof
We want to have a constraint api generic enouth to allow many different
constraint behaviour, 6Dof was picked to do that, so p2p needs a migration.
+ move ephysics_constraint_slider_* functions
Since the whole constraint infra-sctructure is being migrated to 6Dof the
linear and angular limit functions - previously used only by slider constraint -
now looks more generic enough to be used by constraint in general.
+ add constraint anchor API
Instead of telling the anchoring positioning in the constraint creating we have
set it's default value to the the middle os the body and if the user wants to change
it call ephysics_constraint_anchor_set and reset it.
The ephysics_constraint_anchor_set() considers the canvas coordinate instead of using
the body orientation. So now one can tell a constraints anchor is set to 100, 10, 0
in the canvas coordinate system and not (body_center.x - 20, body_center.y - 5, body_center.z - 1).
+ constraint migrate the bt_constraint
Since we're working only with 6Dof constraints it is reasonable to change the constraints
bt_constraint field to btGeneric6DofConstraint.
+ add 3 axes to constraints
Now constraints API knows about x, y and z axes - linear and angular limiting, anchor
setting and the constraint creation functions are fully supported.
+ constraint calls are renamed
The constraint calls were renamed so ephysics_constraint_p2p_add() now is known as
ephysics_constraint_linked_add() and ephysics_constraint_slider_add() became
ephysics_constraint_add() where the first one is meant for constrain 2 bodies and
the second one for single body constraints.
--This line, and those below, will be ignored--
SVN revision: 79848
2012-11-29 10:51:51 -08:00
|
|
|
static void
|
|
|
|
_constraint_set(Test_Data *test_data, EPhysics_Body *body1, EPhysics_Body *body2)
|
|
|
|
{
|
|
|
|
EPhysics_Constraint *constraint;
|
|
|
|
Evas_Coord b1x, b1y, b1z, b1w, b1h, b1d, b2x, b2y, b2z, b2w, b2h, b2d;
|
|
|
|
|
|
|
|
ephysics_body_geometry_get(body1, &b1x, &b1y, &b1z, &b1w, &b1h, &b1d);
|
|
|
|
ephysics_body_geometry_get(body2, &b2x, &b2y, &b2z, &b2w, &b2h, &b2d);
|
|
|
|
|
|
|
|
constraint = ephysics_constraint_linked_add(body1, body2);
|
|
|
|
|
|
|
|
ephysics_constraint_anchor_set(constraint, b1x + b1w / 2, b1y + b1h / 2 + 100,
|
|
|
|
b1z, b2x + b2w / 2, b2y + b2h / 2, b2z);
|
|
|
|
test_data->constraints = eina_list_append(test_data->constraints, constraint);
|
|
|
|
}
|
|
|
|
|
2012-06-26 15:36:12 -07:00
|
|
|
static void
|
|
|
|
_world_populate(Test_Data *test_data)
|
|
|
|
{
|
|
|
|
EPhysics_Body *box_body1, *box_body2;
|
|
|
|
Evas_Object *box1, *box2, *sh1, *sh2;
|
|
|
|
|
|
|
|
sh1 = elm_layout_add(test_data->win);
|
|
|
|
elm_layout_file_set(
|
|
|
|
sh1, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "shadow-cube");
|
|
|
|
evas_object_move(sh1, WIDTH / 3, FLOOR_Y);
|
|
|
|
evas_object_resize(sh1, 70, 3);
|
|
|
|
evas_object_show(sh1);
|
|
|
|
test_data->evas_objs = eina_list_append(test_data->evas_objs, sh1);
|
|
|
|
|
|
|
|
box1 = elm_image_add(test_data->win);
|
|
|
|
elm_image_file_set(
|
|
|
|
box1, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "blue-cube");
|
|
|
|
evas_object_move(box1, WIDTH / 3, HEIGHT / 8);
|
|
|
|
evas_object_resize(box1, 70, 70);
|
|
|
|
evas_object_show(box1);
|
|
|
|
test_data->evas_objs = eina_list_append(test_data->evas_objs, box1);
|
|
|
|
|
|
|
|
box_body1 = ephysics_body_box_add(test_data->world);
|
|
|
|
ephysics_body_evas_object_set(box_body1, box1, EINA_TRUE);
|
|
|
|
ephysics_body_event_callback_add(box_body1, EPHYSICS_CALLBACK_BODY_UPDATE,
|
|
|
|
update_object_cb, sh1);
|
|
|
|
ephysics_body_restitution_set(box_body1, 0.3);
|
|
|
|
ephysics_body_friction_set(box_body1, 0.1);
|
|
|
|
test_data->bodies = eina_list_append(test_data->bodies, box_body1);
|
|
|
|
|
|
|
|
sh2 = elm_layout_add(test_data->win);
|
|
|
|
elm_layout_file_set(
|
|
|
|
sh2, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "shadow-cube");
|
|
|
|
evas_object_move(sh2, WIDTH / 3 + 110, FLOOR_Y);
|
|
|
|
evas_object_resize(sh2, 70, 3);
|
|
|
|
evas_object_show(sh2);
|
|
|
|
test_data->evas_objs = eina_list_append(test_data->evas_objs, sh2);
|
|
|
|
|
|
|
|
box2 = elm_image_add(test_data->win);
|
|
|
|
elm_image_file_set(
|
|
|
|
box2, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "purple-cube");
|
|
|
|
evas_object_move(box2, WIDTH / 3 + 110, HEIGHT / 8);
|
|
|
|
evas_object_resize(box2, 70, 70);
|
|
|
|
evas_object_show(box2);
|
|
|
|
test_data->evas_objs = eina_list_append(test_data->evas_objs, box2);
|
|
|
|
|
|
|
|
box_body2 = ephysics_body_box_add(test_data->world);
|
|
|
|
ephysics_body_evas_object_set(box_body2, box2, EINA_TRUE);
|
EPhysics: generic constraint
This patch changes how constraints are created and configured, now we
use a bullet generic implementation which let us operate on the 6
degrees of freedom(linear and angular ones).
We have used 6dof for slider constraint but now we assume 2 types of
constraints, single body - simply ephysics_constraint_add(body) - and a linked
one - ephysics_constraint_linked_add(body1, body2) used to constrain 2 bodies
linked together.
Having said that we introduce the following changes:
+ migrate p2p constraint to 6Dof
We want to have a constraint api generic enouth to allow many different
constraint behaviour, 6Dof was picked to do that, so p2p needs a migration.
+ move ephysics_constraint_slider_* functions
Since the whole constraint infra-sctructure is being migrated to 6Dof the
linear and angular limit functions - previously used only by slider constraint -
now looks more generic enough to be used by constraint in general.
+ add constraint anchor API
Instead of telling the anchoring positioning in the constraint creating we have
set it's default value to the the middle os the body and if the user wants to change
it call ephysics_constraint_anchor_set and reset it.
The ephysics_constraint_anchor_set() considers the canvas coordinate instead of using
the body orientation. So now one can tell a constraints anchor is set to 100, 10, 0
in the canvas coordinate system and not (body_center.x - 20, body_center.y - 5, body_center.z - 1).
+ constraint migrate the bt_constraint
Since we're working only with 6Dof constraints it is reasonable to change the constraints
bt_constraint field to btGeneric6DofConstraint.
+ add 3 axes to constraints
Now constraints API knows about x, y and z axes - linear and angular limiting, anchor
setting and the constraint creation functions are fully supported.
+ constraint calls are renamed
The constraint calls were renamed so ephysics_constraint_p2p_add() now is known as
ephysics_constraint_linked_add() and ephysics_constraint_slider_add() became
ephysics_constraint_add() where the first one is meant for constrain 2 bodies and
the second one for single body constraints.
--This line, and those below, will be ignored--
SVN revision: 79848
2012-11-29 10:51:51 -08:00
|
|
|
ephysics_body_mass_set(box_body2, 5);
|
2012-06-26 15:36:12 -07:00
|
|
|
ephysics_body_event_callback_add(box_body2, EPHYSICS_CALLBACK_BODY_UPDATE,
|
|
|
|
update_object_cb, sh2);
|
|
|
|
ephysics_body_restitution_set(box_body2, 0.5);
|
|
|
|
ephysics_body_friction_set(box_body2, 0.1);
|
|
|
|
test_data->bodies = eina_list_append(test_data->bodies, box_body2);
|
|
|
|
|
EPhysics: generic constraint
This patch changes how constraints are created and configured, now we
use a bullet generic implementation which let us operate on the 6
degrees of freedom(linear and angular ones).
We have used 6dof for slider constraint but now we assume 2 types of
constraints, single body - simply ephysics_constraint_add(body) - and a linked
one - ephysics_constraint_linked_add(body1, body2) used to constrain 2 bodies
linked together.
Having said that we introduce the following changes:
+ migrate p2p constraint to 6Dof
We want to have a constraint api generic enouth to allow many different
constraint behaviour, 6Dof was picked to do that, so p2p needs a migration.
+ move ephysics_constraint_slider_* functions
Since the whole constraint infra-sctructure is being migrated to 6Dof the
linear and angular limit functions - previously used only by slider constraint -
now looks more generic enough to be used by constraint in general.
+ add constraint anchor API
Instead of telling the anchoring positioning in the constraint creating we have
set it's default value to the the middle os the body and if the user wants to change
it call ephysics_constraint_anchor_set and reset it.
The ephysics_constraint_anchor_set() considers the canvas coordinate instead of using
the body orientation. So now one can tell a constraints anchor is set to 100, 10, 0
in the canvas coordinate system and not (body_center.x - 20, body_center.y - 5, body_center.z - 1).
+ constraint migrate the bt_constraint
Since we're working only with 6Dof constraints it is reasonable to change the constraints
bt_constraint field to btGeneric6DofConstraint.
+ add 3 axes to constraints
Now constraints API knows about x, y and z axes - linear and angular limiting, anchor
setting and the constraint creation functions are fully supported.
+ constraint calls are renamed
The constraint calls were renamed so ephysics_constraint_p2p_add() now is known as
ephysics_constraint_linked_add() and ephysics_constraint_slider_add() became
ephysics_constraint_add() where the first one is meant for constrain 2 bodies and
the second one for single body constraints.
--This line, and those below, will be ignored--
SVN revision: 79848
2012-11-29 10:51:51 -08:00
|
|
|
_constraint_set(test_data, box_body1, box_body2);
|
2012-06-26 15:36:12 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_restart(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
|
|
|
|
{
|
|
|
|
Test_Data *test_data = data;
|
|
|
|
|
|
|
|
DBG("Restart pressed");
|
|
|
|
test_clean(test_data);
|
|
|
|
_world_populate(test_data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
test_constraint(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
|
|
|
{
|
|
|
|
EPhysics_Body *boundary;
|
|
|
|
EPhysics_World *world;
|
|
|
|
Test_Data *test_data;
|
|
|
|
|
|
|
|
if (!ephysics_init())
|
|
|
|
return;
|
|
|
|
|
|
|
|
test_data = test_data_new();
|
|
|
|
test_win_add(test_data, "Constraint", EINA_TRUE);
|
2012-08-10 14:02:25 -07:00
|
|
|
elm_object_signal_emit(test_data->layout, "borders,show", "ephysics_test");
|
2012-07-03 16:23:53 -07:00
|
|
|
elm_layout_signal_callback_add(test_data->layout, "restart", "test-theme",
|
|
|
|
_restart, test_data);
|
2012-06-26 15:36:12 -07:00
|
|
|
|
|
|
|
world = ephysics_world_new();
|
2012-10-15 14:54:29 -07:00
|
|
|
ephysics_world_render_geometry_set(world, 50, 40, -50,
|
|
|
|
WIDTH - 100, FLOOR_Y - 40, DEPTH);
|
2012-06-26 15:36:12 -07:00
|
|
|
test_data->world = world;
|
|
|
|
|
2012-10-15 14:54:14 -07:00
|
|
|
boundary = ephysics_body_bottom_boundary_add(test_data->world);
|
2012-06-26 15:36:12 -07:00
|
|
|
ephysics_body_restitution_set(boundary, 0.65);
|
|
|
|
ephysics_body_friction_set(boundary, 3);
|
|
|
|
|
|
|
|
_world_populate(test_data);
|
|
|
|
}
|