On Mon, 26 Nov 2012 12:47:16 -0200 Bruno Dilly <[email protected]> said:

> Hey folks,
> 
> we're are now making ephysics API more stable, almost all the features
> intended to go in are already implemented, so we are moving to the
> next step:
> adding support to physics on Edje.
> 
> There are many ways of doing this, so I'm sending a proposal with some
> possibilities so we could discuss before we start to implement it.
> 
> Just to make it clearer. My proposal exposes a lot of ephysics,
> something very complete
> (for what I believe are valid use cases. Lot of things possible with
> ephysics API are not exposed),
> and that would require a lot of time to be completely done.
> So, it will be implemented gradually, covering the main use cases first.
> 
> So initially would be possible to create a new world with a list of
> bodies, with most properties set using ephysics default. Later we
> would expose
> some more relevant properties. Implement programs / scripts. Then
> adding support to constraints, camera, etc etc...
> 
> But would be good to define what would be the better, complete scenario.
> 
> Thanks in advance,
> 
> ======================================
> 
> PROPOSAL: SUPPORT PHYSICS ON EDJE
> 
> === CHOICES ===
> There are 3 main different ways to do it. The first one
> is described in details above, and has some alternatives explained.
> The other 2 can be understood with these details.
> 
> 1) A single physics block that would be set per group, and all the rendered
>    objects to be manipulated would be other groups.
> 2) A single physics block that would be set per group, and all the rendered
>    objects to be manipulated would be other parts of this group.
> 3) A physics block to describe world, camera and constraints,
>     that would be set per group. And extra physics blocks per part that
>     should be associated to a body. Example:
>     group {
>         physics {
>             world {
>                 ...
>             }
>         }
>         parts {
>             part {
>                 name: ..
>                 body_type: ...
>                 description {
>                     ...
>                     physics {
>                         // body props
>                     }
>                 }
>             }
>         }
>     }

option 3. definitely.

> Regarding programs, there are three main choices:
> 1) Physics world, camera, constraints and bodies have states with these
> objects attributes. Using STATE_SET as already exists on Edje would be the way
>    to change it. Bodies can handle actions that should be set only via
>    scripts, like apply_impulse, apply_force, set_velocity ...
> 2) No specific physics ACTIONs. Everything should be set via scripts.
> 3) Another types of ACTION would be declared, like PHYSICS_IMPULSE,
>    PHYSICS_FORCE, etc. So it could be used without scripts.

option 3. definitely. (i assume this ALSO allows the script stuff to work
too) :) (i'm loving your multi-choice thing here :)).

> The main argument in using scripts is that hardly a user will want
> just to set a hardcoded property. Usually it will be based on body's
> and other parts current state, like using geometry or velocity, etc.
> So it would be required to get properties, do some calculation, set to body.
> 
> PROGRAMS chapter exemplify it.
> 
> Initially I would go with choices 1) and 1), but I would like to see
> what you think about it.
> 
> 
> === OVERVIEW ===
> collections {
>     ...
>     group {
>         ...
>         parts {}
>         physics {
>             world {}
>             camera {}
>             bodies {
>                 body {}
>                 ...
>             }
>             constraints {
>                 constraint {}
>                 ...
>             }
>         }
>         programs {}
>         ...
> }
> 
> === PHYSICS ===
> The "physics" block contains all the other blocks related to physics. Blocks
> "world", "camera", "bodies" and "constraints" will be found inside it. Physics
> only will be enabled if at least one "body" is listed on "bodies" block.
> 
> It should be included in group's block, since a physics world won't be shared
> between groups.
> 
> === WORLD ===
> The "world" block can have one or more description blocks.
> It's required to simulate physics between bodies.
> Only one world can be declared per group.
> 
> Each "description" block is used to set all attributes required to configure a
> physics world.
> 
> ...
> physics {
>     world {
>         name: "name";
>         description {
>             state: "description_name" INDEX;
>             inherit: "another_description" INDEX;
>             rel1 {
>                 ..
>             }
>             rel2 {
>                 ..
>             }
>             rate: 30;
>             gravity: 0 294 0;
>             running: 1;
>             light {
>                 light: "part_name";
>                 all_bodies: 0;
>             }
>             simulation {
>                 fixed_time_step: 0.033;
>                 max_sub_steps: 3;
>             }
>             sleeping_time: 2.0;
>             solver_iterations: 10;
>             auto_delete {
>                 top: 1;
>                 bottom: 1;
>                 left: 1;
>                 right: 1;
>                 front: 0;
>                 back: 0;
>             }
>             stacking: 1;
>         }
>     }
>     ...
> }
> ...
> 
> ---
> 
> name [world name]
>     Define the name that refer to this world instance.
> 
> state [a name for the description] [an index]
>     Sets a name used to identify a description inside the world.
>     Multiple descriptions are used to declare different states of the same
>     world, like "paused" or "inverse gravity".
>     All states declarations are also coupled with an index number between 0.0
>     and 1.0. All "world" block  must have at least one description named
>     "default 0.0".
> 
> inherit [another description's name] [another description's index]
>     When set, the description will inherit all the properties from the named
>     description. The properties defined in this part will override the
>     inherited properties, reducing the amount of necessary code for simple
>     state changes. Note: inheritance in Edje is single level only.
> 
> rel1/rel2:
>   Almost the same used for parts.
>   Offset would have a third parameter, for z-axis.
>   >>> ALTERNATIVE:
>     render_geometry {
>         position: [x] [y] [z]
>         size [w] [h] [d]
>     }
>   Position relative to group geometry.
>   <<<
> 
> rate [rate pixel / meter]
>   Set rate between pixels on evas canvas and meters on physics world.
>   It will be used by automatic updates of evas objects associated to
>   physics bodies.
>   By default rate is 30 pixels per meter.
> 
> gravity [x] [y] [z]
>   Three double values defining the gravity vector. Each one is the component
> of this same vector over each axis. Its unit is Evas Coordinates per second ^
> 2. The default value is 0, 294, 0 since we've a default rate of 30 pixels.
> 
> running [0 or 1]
>   >>> It would be used to pause effects, not sure if would be useful here. <<<
>   Takes a boolean value specifying if the world is paused or running.
>   It's running by default (1).
> 
> light
>   This block configure the light to be used in the scene.
> 
>   It will perform lighting calculations on the evas map applied on evas
>   objects associated with all the bodies to have light applied over.
> 
>   There are two ways of setting a body to receive lighting. One is to simple
>   set all the bodies to be affected, with all_bodies. The other is disabling
>   it and setting "light" property on each "body" block which light should
>   be applied.
> 
>   light [part's name]
>     This sets the part that is used as the "light" for calculating the
>     brightness (based on how directly the part's surface is facing the light
>     source point). Like the perspective point part, the center point is used
>     and zplane is used for the z position (0 being the zero-plane where all 2D
>     objects normally live) and positive values being further away into the
>     distance.
> 
>     The light part color is used as the light color (alpha not used for light
>     color). The color2 color is used for the ambient lighting when calculating
>     brightness (alpha also not used).
> 
>   all_bodies [0 or 1]
>     If enabled it will apply light over all the bodies, not considering if
>     they have "light" property set or unset. If disabled, light still can be
>     applied at each body individually using body's properties.
> 
>   >>> ALTERNATIVE
>   light {
>       point {
>         position: x y z
>         color: r g b
>       }
>       ambient: rgb
>       all_bodies: [0 | 1]
>   }
>   First version é really cool, since you can animate the light part. Also,
>   it's already used by the "map" block.
>   <<<
> 
> simulation
>   <<< MUST PROBABLY WILL BE DROPPED SINCE IT'S REALLY CORNER CASE >>>
>   It's a block used to set world simulation's fixed time step
>   and max number of sub steps.
> 
>   Reducing the fixed time step improves collision quality, but impacts
>   performance. Also, when this value is changed, the max number of sub
>   steps need to be updated, otherwise the world may "lose time".
>   The following equation must to be assured:
> 
>   time step < max_sub_steps * fixed_time_step;
> 
>   By default fixed time step is 1/60 seconds and the sub steps maximum amount
>   is 3.
> 
>   fixed_time_step [time]
>     Time of the internal simulation step, in seconds. Default is 1/60 seconds.
> 
>   max_sub_steps [steps]
>     Integer used to specify the maximum number of steps that simulation
>     is allowed to take at each simulation tick. Default value is 3.
> 
> sleeping_time [max sleeping time]
>   A double determining the duration in seconds a body under the linear and
>   angular threshold is supposed to be marked as sleeping. Default is 2.0;
> 
> solver_iterations [number of iterations used by constraint solver]
>   <<< MUST PROBABLY WILL BE DROPPED SINCE IT'S REALLY CORNER CASE >>>
>   It's a integer to set the number of iterations the constraint solver will
>   will have for contact and joint constraints.
> 
>   The default value is set to 10. The greater number of iterations more
>   quality and precise the result but with performance penalty.
> 
>   Hardly a value different from default will be required.
> 
> linear_slop [linear slop used by the solver]
>   <<< MUST PROBABLY WILL BE DROPPED SINCE IT'S REALLY CORNER CASE >>>
>   Linear slop on sequential impulse
>   is used as a factor for penetration. The penetration will the manifold
>   distance + linear slop.
>   The default value is set to 0 with a small value results in a smoother
>   stabilization for stacking bodies.
> 
> auto_delete
>   This block lists all the boundaries of the world rendering area and should
>   be used to enable or disable automatic deletion of bodies outside this
>   area. All of them are disabled by default.
> 
>   top [0 or 1]
>     Delete bodies when they're outside of render area by the top.
> 
>   bottom [0 or 1]
>     Delete bodies when they're outside of render area by the bottom.
> 
>   right [0 or 1]
>     Delete bodies when they're outside of render area by the right.
> 
>   left [0 or 1]
>     Delete bodies when they're outside of render area by the left.
> 
>   front [0 or 1]
>     Delete bodies when they're outside of render area by the front.
> 
>   back [0 or 1]
>     Delete bodies when they're outside of render area by the back.
> 
> stacking [0 or 1]
>    Enable or disable stacking based on bodies z coordinates.
> 
>    Evas objects will be restacked at each simulation tick. It's enabled by
>    default, and disabling it can lead to wrong scenarios when movement
>    on Z axis is enabled or when cloths are used.
> 
>    But disabling it can save performance, so if you won't face these
>    scenarios, it safe to disable it, since no evas object will be moved to
>    be below or above others.
> 
> === CAMERA ===
> The "camera" block can have one or more description blocks. Only one
> "camera" block can be declared by group.
> 
> Camera is used to change the position of the frame to be rendered. By default
> it matches world's rendering area. But it can be modified passing another
> top-left point position, so another
> region of the physics world will be rendered on the render area.
> So if you have a scene larger than the render area, camera handling can
> be very useful. Also it can be set to track a body.
> 
> Each "description" block is used to set all attributes required to configure a
> camera.
> 
> ...
> physics {
>     camera {
>         name: "name";
>         description {
>             state: "description_name" INDEX;
>             inherit: "another_description" INDEX;
>             position: "part_name";
>             track {
>                 body: "name";
>                 axis: 1 0;
>             }
>             perspective: "part_name";
>         }
>     }
>     ...
> }
> ...
> 
> ---
> 
> name [camera name]
>     Define the name that refer to this camera instance.
> 
> state [a name for the description] [an index]
>     Sets a name used to identify a description inside the camera.
>     Multiple descriptions are used to declare different states of the same
>     camera, like "tracking a body" or "fixed at position X, Y, Z".
>     All states declarations are also coupled with an index number between 0.0
>     and 1.0. All "camera" block  must have at least one description named
>     "default 0.0".
> 
> inherit [another description's name] [another description's index]
>     When set, the description will inherit all the properties from the named
>     description. The properties defined in this part will override the
>     inherited properties, reducing the amount of necessary code for simple
>     state changes. Note: inheritance in Edje is single level only.
> 
> position [another part's name]
>     This sets the part that is used as the "central point of the camera".
>     The center of this part will
>     be used as the camera point, so size, color and visibility etc. are not
>     relevant just center point is used.
> 
> perspective [another part's name]
>     This sets the part that is used as the "perspective point" for giving a
>     scene a "3d look". The perspective point should have a perspective section
>     that provides zplane and focal properties. The center of this part will
>     be used as the focal point, so size, color and visibility etc. are not
>     relevant just center point, zplane and focal are used.
> 
>     >>> ALTERNATIVE:
>     First version is already used on map, and make it easy to be moved
>     around. But another version could be:
>     perspective {
>         distance: x y;
>         z0: z;
>         focal_distance: f;
>         enabled: [0 | 1]
>     }
>     <<<
> 
> track
>   It's a block used to set camera to track a body.
> 
>   When a body is tracked, the camera will move automatically, following
>   this body. It will keeps the body centralized on rendered area.
>   If it will be centralized horizontally and / or vertically depends
>   if parameters horizontal and vertical are enabled.
> 
>   body [body's name]
>     This sets the body to be tracked by the camera.
> 
>   axis [horizontal] [vertical]
>     Two boolean values [0 or 1].
> 
>     If horizontal is enabled the tracked body will be horizontally centralized
>     in the rendered area. Disabled by default.
> 
>     If vertical is enabled the tracked body will be vertically centralized
>     in the rendered area. Disabled by default.
> 
> === BODIES ===
> The "bodies" block is used to list the bodies that compose the world.
> 
> A body is a representation of an object inside a physics world.
> 
> It can be customized in many ways, setting collision shape, material,
> applying forces and velocity. It won't be visually represented per se.
> It need to be associated to one or more (using faces) parts so they will
> be rendered using it to be represented.
> 
> Each "description" block is used to set all attributes required to configure a
> physics body.
> 
> ...
> physics {
>     bodies {
>         body {
>             name: "name";
>             type: RIGID_BOX;
>             description {
>                 state: "description_name" INDEX;
>                 inherit: "another_description" INDEX;
>                 source: "group's name";
>                 material: IRON;
>                 density: 80.3;
>                 mass: 66.6;
>                 rel1 {
>                     ..
>                 }
>                 rel2 {
>                     ..
>                 }
>                 use_part_geometry: 0;
>                 rotation: 1 1 0 0;
>                 restitution: 0.7;
>                 friction: 0.45;
>                 damping: 0.4 20;
>                 sleeping_threshold: 0.5 0.5;
>                 collision_groups: "group1" "group2" ...;
>                 velocity {
>                     linear: 10.2 1.3 0;
>                     angular: 0 0 2.2;
>                 }
>                 forces {
>                     central: 0 2.5 5;
>                     torque: 0 1.3 0;
>                 }
>                 faces {
>                     face {
>                         face: BOX_RIGHT;
>                         source: "group's name";
>                     }
>                     face {
>                         face: BOX_LEFT;
>                         source: "group's name";
>                     }
>                     ...
>                 }
>                 movement_freedom {
>                     linear: 1 1 0;
>                     angular: 0 0 1;
>                 }
>                 light_on: 1;
>                 backface_cull: 0;
>                 hardness: 1.0; // for soft bodies and cloths only
>                 anchor { // for cloths only
>                     body: "name";
>                     side: ANCHOR_LEFT;
>                     nodes: 10 12 14 16 ...;
>                 }
>             }
>         }
>         body {}
>         ...
>     }
>     ...
> }
> ...
> 
> ---
> 
> name [body name]
>     Define the name that refer to this body instance.
> 
> type [TYPE]
>     Set the type (all caps) from among the available body's shape types.
>     It's set to RIGID_BOX by default. Valid types:
>        * RIGID_BOX
>        * RIGID_CIRCLE
>        * SOFT_BOX
>        * SOFT_CIRCLE
>        * CLOTH
>        * BOUNDARY_TOP
>        * BOUNDARY_BOTTOM
>        * BOUNDARY_RIGHT
>        * BOUNDARY_LEFT
>        * BOUNDARY_FRONT
>        * BOUNDARY_BACK
> 
> state [a name for the description] [an index]
>     Sets a name used to identify a description inside the body.
>     Multiple descriptions are used to declare different states of the same
>     body, like "moving", "rotating" or "heavier".
>     All states declarations are also coupled with an index number between 0.0
>     and 1.0. All "body" block must have at least one description named
>     "default 0.0".
> 
> inherit [another description's name] [another description's index]
>     When set, the description will inherit all the properties from the named
>     description. The properties defined in this part will override the
>     inherited properties, reducing the amount of necessary code for simple
>     state changes. Note: inheritance in Edje is single level only.
> 
> source [group's name]
>     This sets the group that is used as the object representing the physics
>     body. A physics body isn't rendered per se.
>     >>> ALTERNATIVE
>         Using parts is possible too, but since ephysics sets a map
>         and changes position, it could be harder to implement and
>         a bit more error prone. In cases of mapping wanted, the
>         user would need to set the part as group type, and
>         use map inside this group.
>         The negative point of using groups is that declaring groups is more
>         verbose. But a macro could be used. The positive is that it could
>         be set to many bodies.
> 
>     part [part's name]
>         This sets the part that is used as the object representing the physics
>         body. A physics body isn't rendered per se.
>     <<<
> 
> material [MATERIAL]
>     Set the type (all caps) from among the available material types, it's set
>     to CUSTOM by default.
> 
>     Each material has specific properties to be
>     applied on the body, as density, friction and restitution.
> 
>     Valid types:
>        * CUSTOM
>        * CONCRETE
>        * IRON
>        * PLASTIC
>        * POLYSTYRENE
>        * RUBBER
>        * WOOD
> 
> density [material's density]
>     The density of a material is its mass per unit volume.
> 
>     It will set the body mass considering its volume. While a density is set,
>     resizing a body will always recalculate its mass.
> 
>     When a mass is explicitely set the density will be unset.
> 
> mass [mass in kg]
>     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.
> 
> rel1/rel2:
>   Almost the same used for parts.
>   Offset would have a third parameter, for z-axis.
>   >>> ALTERNATIVE:
>     geometry {
>         use_part_geometry: [0 | 1]
>         position: [x] [y] [z]
>         size [w] [h] [d]
>     }
>   Position relative to group geometry.
>   <<<
> 
> use_part_geometry [0 or 1]
>     If enabled, rel1 / rel2 will be discarded and the body will be set
>     with the same geometry set to the part specified in "part" property.
>     If this part is resized later, body will be resized together.
> 
> rotation [w x y z]
>     Set body's rotation using quaternion representation.
> 
> restitution [coefficient of restitution]
>     The coefficient of restitution is proportion between speed after and
>     before a collision. It's 0 by default.
> 
>     COR = relative speed after collision / relative speed before collision
> 
>     * elastically collide for COR == 1;
>     * inelastically collide for 0 < COR < 1;
>     * completely stop (no bouncing at all) for COR == 0.
> 
> friction [coefficient of friction]
>     Friction is used to make objects slide along each other realistically.
> 
>     The friction parameter is usually set between 0 and 1, but can be any
>     non-negative value. A friction value of 0 turns off friction and a value
>     of 1 makes the friction strong.
> 
>     By default friction value is 0.5 and simulation results will be better
>     when friction in non-zero.
> 
> 
> damping [linear_damping] [angular_damping]
>     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.
> 
> sleeping_threshold [linear_threshold] [angular_threshold]
>     These 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.
> 
> collision_groups ["name_of_group_1"]  ["name_of_group_2"] ...
>     If not added to any group the body will collide against any other body.
>     Otherwise this body will collide only against those in the same groups.
>     Groups don't need to be previously declared anywhere. They are
>     created on demand when used by a body.
> 
>     <<< ALTERNATIVE
>         collision_groups {
>             group: "name_of_group_1";
>             group: "name_of_group_2";
>             group: "name_of_group_3";
>             ...
>         }
>     >>>
> 
> velocity
>     <<< PROBABLY IT WILL BE BETTER TO JUST SET IT VIA EMBRYO
>         IT DOESN'T FIT WELL IN STATE >>>
>     It's a block used to set body's angular and linear initial velocity.
>     This velocity will be set when this body state is set, but will
>     be increased or decreased considering many other properties and
>     interactions with the world and other bodies or constraints.
>     That's why it's said to be the INITIAL velocity. It's not necessarily
>     constant.
> 
>     linear [x] [y] [z]
>         Three double values for each component of linear velocity.
>         Unit for linear velocity is Evas coordinates per second.
> 
>     angular [x] [y] [z]
>         Three double values for angular velocity around each axis.
>         Unit for angular velocity is degrees per second.
> 
> forces
>     <<< PROBABLY IT WILL BE BETTER TO JUST SET IT VIA EMBRYO
>         IT DOESN'T FIT WELL IN STATE >>>
>     It's a block used to set forces applied over body.
>     Force is measured in kg * p / s / s.
> 
>     Force is the product of mass and acceleration. So, keeping the mass
>     fixed, when force is applied acceleration will change, and consequently,
>     velocity will gradually be changes.
> 
>     Force = mass * acceleration
> 
>     Final velocity = initial velocity + acceleration * time
> 
>     central [x] [y] [z]
>         Three double values for each component of the force to be applied
>         in the center of the body. It won't produce torque.
> 
>     torque [x] [y] [z]
>         A torque will be applied over the body to change the angular
>         acceleration of this body. It will leads to a change on angular
>         velocity over time.
> 
>         Three double values for torque to be applied around each axis.
>         Negative values will accelerate it on counter clockwise rotation.
> 
> faces
>     The "faces" block is used to list the faces that compose the body.
>     Each face is described by a "face" block, that associates a part
>     to a specific face of the body's shape.
> 
>     face [FACE]
>         Set the face (all caps) from among the available body's shape faces.
>         Valid faces:
>             * BOX_MIDDLE_FRONT,
>             * BOX_MIDDLE_BACK,
>             * BOX_FRONT,
>             * BOX_BACK,
>             * BOX_LEFT,
>             * BOX_RIGHT,
>             * BOX_TOP,
>             * BOX_BOTTOM,
>             * CYLINDER_MIDDLE_FRONT,
>             * CYLINDER_MIDDLE_BACK,
>             * CYLINDER_FRONT,
>             * CYLINDER_BACK,
>             * CYLINDER_CURVED,
>             * CLOTH_FRONT,
>             * CLOTH_BACK,
> 
>     source [group's name]
>         This sets the group that is used as the object representing the
> physics body face.
>         >>> ALTERNATIVE - the same explained above for body source <<<
> 
> movement_freedom
>     The "movement_freedom" block consists of two blocks to describe all
>     the allowed movements for a body.
>     It's set by default to allow just 2D movement (linear moves on
>     x and y axis and rotations on x-y plane).
> 
>     linear [x-axis] [y-axis] [z-axis]
>         Block "linear" can be used to allow linear movements in the three
>         axes. Allowed values are 0 or 1.
>         Axes x and y are enabled by default.
> 
>     angular [x-axis] [y-axis] [z-axis]
>         Block "angular" can be used to allow angular movements around the
> three axes. Allowed values are 0 or 1.
>         Z axis is enabled by default.
> 
> light_on [0 or 1]
>     Set body to be affected by world's light or not.
>     It won't be respected if world's property "all_bodies" is enabled.
> 
> backface_cull [0 or 1]
>     This enables backface culling (when the rotated part that normally faces
>     the camera is facing away after being rotated etc.).
>     This means that the object will be hidden when "backface culled".
> 
> hardness: [hardness]
>     The hardness is set with a double value (0.0 - 1.0), defining
>     how the soft body is supposed to deform.
>     Its default is set to 1.0. The soft body mass will also interfere on soft
>     body deformation, so bare in mind that the bodies mass must also be
> changed to have different deformation results.
> 
>     Valid values vary from 0.0 to 1.0. Only works on soft bodies and cloths.
> 
> anchor
>     Anchors are used to fix one or more cloth's nodes.
> 
>     body ["body's name"]
>         The body to be anchored to.
> 
>     side [ANCHOR_SIDE]
>         Set the side (all caps) from among the available cloth's sides.
>         All the nodes part of the specified side of the cloth will be anchored
>         to body. That is, all the nodes in the informed "edge".
> 
>         Valid sides:
>             * LEFT
>             * RIGHT
>             * TOP
>             * BOTTOM
> 
>      nodes [n1] [n2] [n3] ...
>         Instead of using sides it's possible to specify nodes by index to
>         anchor them.
>         <<< ALTERNATIVE
>         nodes {
>             node: n1;
>             node: n2;
>             node: n3;
>             ...
>         }
>         >>>
> 
> === CONSTRAINTS ===
> >> Constraints API is going to be heavily modified in the next days, so it's
> just illustrative. <<
> 
> The "constraints" block is used to list the constraints that compose the
> world.
> 
> Constraints can be used to limit bodies movements, between bodies or
> between bodies and the world. Constraints can limit movement angle,
> translation, or work like a motor.
> 
> Each "description" block is used to set all attributes required to configure a
> physics constraint.
> 
> ...
> physics {
>     constraints {
>         constraint {
>             name: "name";
>             type: POINT_TO_POINT;
>             description {
>                 state: "description_name" INDEX;
>                 inherit: "another_description" INDEX;
>                 anchor {
>                     p1 {
>                         body: "name";
>                         position: x y z;
>                     }
>                     p2 {
>                         body: "name";
>                         position: x y z;
>                     }
>                 }
>                 limit {
>                     linear {
>                         left_x: value;
>                         right_x: value;
>                         under_y: value;
>                         ...
>                     }
>                     angular {
>                         x: value;
>                         y: value;
>                         z: value;
>                     }
>                 }
>             }
>         }
>         constraint {}
>         ...
>     }
>     ...
> }
> ...
> 
> ---
> 
> name [constraint name]
>     Define the name that refer to this constraint instance.
> 
> type [TYPE]
>     Set the type (all caps) from among the available constraint types, it's
> set to POINT_TO_POINT by default. Valid types:
>        * POINT_TO_POINT
>        * SLIDER
> 
> state [a name for the description] [an index]
>     Sets a name used to identify a description inside the constraint.
>     All states declarations are also coupled with an index number between 0.0
>     and 1.0. All "constraint" block  must have at least one description named
>     "default 0.0".
> 
> inherit [another description's name] [another description's index]
>     When set, the description will inherit all the properties from the named
>     description. The properties defined in this part will override the
>     inherited properties, reducing the amount of necessary code for simple
>     state changes. Note: inheritance in Edje is single level only.
> 
> anchor
>     TODO
> 
> limit
>     TODO
> 
> === PROGRAMS (related to physics) ===
> 
> ...
> group {
>     programs {
>         program {
>             name: "change_physics_state";
>             action: STATE_SET "physics_state_name" 0.0;
>             transition: ACCEL 1;
>             target: "world";
>             target: "camera";
>             target: "body1";
>             target: "body2";
>             target: "constraint1";
>         }
>         program {
>             name: "body_actions";
>             script {
>                 apply_impulse(BODY:"body1", 10, -3.2, 0.0);
>                 set_velocity(BODY:"body2", 0, 10, 0.0);
>                 apply_force(BODY:"body3", -5, 0, 0);
>                 get_geometry(PART:"button", &x, &y, &w, &h);
>                 get_cursor(&px, &py);
>                 apply_impulse(BODY:"body3", (px - x), 100, 0);
>             }
>         }
>     }
> }
> 
> scripts API:
>     body_set_velocity
>     body_get_velocity
>     body_stop
> 
>     body_apply_impulse
>     body_apply_central_impulse
>     body_apply_torque_impulse
> 
>     body_apply_force
>     body_apply_central_force
>     body_apply_torque
>     body_clear_forces
> 
>     <<< ALTERNATIVE
>         Just make everything accessible via embryo.
>         Drop states completely.
>     >>>
> 
> 
> -- 
> Bruno Dilly
> Lead Developer
> ProFUSION embedded systems
> http://profusion.mobi
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to