efl/src/examples/edje/physics_3d.edc

272 lines
6.5 KiB
Plaintext

/* 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;
}
}
}
}
}
}