/* This example demonstrates the usage of physics faces. * * Faces references other groups of the collection. The same group * can be used for many faces, but to illustrate it we are adding * a rectangle of different color for each face of a cube. * It will apply impulses on the cube when receiving messages, so * it's possible to see the cube rotating and moving. * * It can be tested with edje_player slave mode * $ edje_player -S -p -g example_group physics_3d.edj * * message 1 FLOAT_SET 3 80 -100 0 -> apply an impulse on red box with * x = 50, y = -100, z = 0, for example * message 2 FLOAT_SET 3 0 100 0 -> apply a torque impulse on red box with * x = 4, y = 0, z = 0.8, for example */ #define ID_IMPULSE (1) #define ID_TORQUE_IMPULSE (2) collections { group { name: "right"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 0 0 255 255; /* blue */ } } } } group { name: "left"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 0 255 0 255; /* green */ } } } } group { name: "front"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 0 0 0 255; /* black */ } } } } group { name: "back"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 120 120 120 255; /* gray */ } } } } group { name: "top"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 255 0 255 255; /* purple */ } } } } group { name: "bottom"; parts { part { name: "face"; type: RECT; description { state: "default" 0.0; color: 0 255 255 255; /* yellow */ } } } } group { name: "example_group"; physics { world { gravity: 0 80 0; rate: 30; z: -100; depth: 200; } } script { public message(Msg_Type:type, id, ...) { if ((id == ID_IMPULSE) && (type == MSG_FLOAT_SET)) { new Float:x, Float:y, Float:z; new n = numargs(); if (n < 5) return; x = getfarg(2); y = getfarg(3); z = getfarg(4); physics_impulse(PART:"red_box", x, y, z); } else if ((id == ID_TORQUE_IMPULSE) && (type == MSG_FLOAT_SET)) { new Float:x, Float:y, Float:z; new n = numargs(); if (n < 5) return; x = getfarg(2); y = getfarg(3); z = getfarg(4); physics_torque_impulse(PART:"red_box", x, y, z); } } } parts { part { name: "background"; type: RECT; physics_body: NONE; description { state: "default" 0.0; color: 255 255 255 255; /* white */ rel1.relative: 0.0 0.0; rel2.relative: 1.0 1.0; } } part { name: "red_box"; type: RECT; physics_body: RIGID_BOX; description { state: "default" 0.0; color: 255 0 0 255; /* light red */ rel1.relative: 0.4 0.1; rel2.relative: 0.55 0.3; aspect: 1 1; physics { mass: 30; z: -24; depth: 48; restitution: 0.85; movement_freedom { linear: 1 1 1; angular: 1 1 1; } faces { face { type: BOX_FRONT; source: "front"; } face { type: BOX_BACK; source: "back"; } face { type: BOX_TOP; source: "top"; } face { type: BOX_BOTTOM; source: "bottom"; } face { type: BOX_LEFT; source: "left"; } face { type: BOX_RIGHT; source: "right"; } } } } } part { name: "floor"; type: RECT; physics_body: BOUNDARY_BOTTOM; description { state: "default" 0.0; visible: 0; physics { restitution: 0.8; } } } part { name: "front"; type: RECT; physics_body: BOUNDARY_FRONT; description { state: "default" 0.0; visible: 0; physics { restitution: 0.4; } } } part { name: "back"; type: RECT; physics_body: BOUNDARY_BACK; description { state: "default" 0.0; visible: 0; physics { restitution: 0.4; } } } part { name: "left"; type: RECT; physics_body: BOUNDARY_LEFT; description { state: "default" 0.0; visible: 0; physics { restitution: 0.4; } } } part { name: "right"; type: RECT; physics_body: BOUNDARY_RIGHT; description { state: "default" 0.0; visible: 0; physics { restitution: 0.4; } } } } } }