You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1791 lines
54 KiB

/**
* @page ephysics_examples EPhysics Examples
*
* Examples:
* @li @ref tutorial_ephysics_bouncing_ball
* @li @ref tutorial_ephysics_bouncing_text
* @li @ref tutorial_ephysics_camera
* @li @ref tutorial_ephysics_camera_track
* @li @ref tutorial_ephysics_collision_detection
* @li @ref tutorial_ephysics_collision_filter
* @li @ref tutorial_ephysics_delete_body
* @li @ref tutorial_ephysics_constraint
* @li @ref tutorial_ephysics_forces
* @li @ref tutorial_ephysics_growing_balls
* @li @ref tutorial_ephysics_gravity
* @li @ref tutorial_ephysics_logo
* @li @ref tutorial_ephysics_rotating_forever
* @li @ref tutorial_ephysics_velocity
* @li @ref tutorial_ephysics_shapes
* @li @ref tutorial_ephysics_sleeping_threshold
* @li @ref tutorial_ephysics_slider
*/
/**
* @page tutorial_ephysics_bouncing_ball EPhysics - Bouncing Ball
*
* The purpose of this example is to show how to write an simple application -
* as the name suggests - with a small ball bouncing on the ground and
* responding to users events by making it jump - applying a central impulse on
* it.
*
* @image html bouncing_ball.png
* @image latex bouncing_ball.eps
*
* We'll guide you on defining a EPhysics world, defining its render geometry
* and the physics limiting boundaries, you'll learn how to add EPhysics bodies
* and how to associate it to evas objects. We also explain how to change
* restitution and friction properties. We see how to apply central impulse on
* a EPhysics_Body by implementing an elementary input event callback and
* calling the proper function.
*
* @section test-structure A test struct
* @dontinclude ephysics_test.h
*
* While in this example we'll be working with a struct to hold some objects in
* our code. For clarity sake we present you the struct declaration in the
* following block.
*
*
* @skip struct _Test_Data
* @until };
*
* @section world-new World Initialization
* @dontinclude test_bouncing_ball.c
*
* Calling ephysics_world_new()
* will create a new physics world with its collision configuration, constraint
* solver, broadphase interface and dispatcher.
*
* The default gravity is set to -9.81. It's possible to stop a running world
* but its default status is running. Take a look at
* ephysics_world_running_set() for further informations about world running
* status.
*
* @skipline ephysics_world_new
*
* @section render-geometry Render geometry
*
* By setting the render geometry you tell ephysics the dimensions of rendered
* area to be take on account by default updates.
*
* By default it starts with null x, y, z, width, height and depth. Initially
* there's no physics limits but - as we'll see later in this example -
* boundaries can be added by issuing either ephysics_body_top_boundary_add(),
* ephysics_body_bottom_boundary_add(), ephysics_body_left_boundary_add() and
* ephysics_body_right_boundary_add().
*
* While setting the worlds render geometry the first parameter is our just
* created world, the following parameters indicate the x, y, z, width, height
* and depth of our area of interest.
*
* @skip ephysics_world_render_geometry_set
* @until DEPTH);
*
* @section boundaries Adding boundaries
*
* Boundaries are physics limits added by EPhysics which you can use to limit
* the area where your objects can move around. Bear in mind that those
* boundaries are created by EPhysics taking in account the render geometry you
* have previously defined by calling ephysics_world_render_geometry_set().
*
* In our example we start by adding a bottom boundary. This EPhysics_Body
* represents a physics limit under the world render geometry.
*
* The second line states the restitution factor for that bottom boundary, and
* the third line its friction. These changes will make our ball to bounce
* whenever it hits the ground.
*
* @skip ephysics_body_bottom_boundary_add
* @until ephysics_body_friction_set
*
* Then we add a right boundary limiting the physics world on the left side, we
* also change its restitution and friction factors but with a smaller value,
* we don't want to make it bounce as much as it is when hits the ground.
*
* @skip ephysics_body_right_boundary_add
* @until ephysics_body_friction_set
*
* We also add a left boundary taking the same considerations for right
* boundary.
*
* @skip ephysics_body_left_boundary_add
* @until ephysics_body_friction_set
*
* One of this examples requirements is to make the ball jump after a specific
* user event, so the ball can suffer an impulse for any direction.
*
* With an upper impulse we don't want our ball to fly all over there, we want
* to limit its upper movements, it's intended to limit the ball movement
* within a box, it should not leave the render geometry area, for that purpose
* we must define a top boundary.
*
* @skipline ephysics_body_top_boundary_add
* @dontinclude test_bouncing_ball.c
*
* @section world-populate Adding a ball
*
* Since we have defined the physics limits with our boundaries it's time to
* add some fun. Here we add a ball as an elementary image widget and tell
* ephysics about it.
*
* After setting the file that will be used as the image's source of our elm
* image we move it to the center of render geometry and resize it to 70x70
* pixels and show it.
*
* @skip elm_image_add
* @until evas_object_show
*
* The evas object is just set and we must tell EPhysics about it, creating the
* EPhysics_Body representing our ball and associating it to the just created
* evas object.
*
* Once the ball has been moved to the center of render geometry it should
* start falling after associating it to the EPhysics_Body. By default its mass
* is initially set to 1 kilo, but it can be changed by calling
* ephysics_body_mass_set(). Bear in mind that if you change its mass to 0
* kilos it becomes a static body and will not move at all, the body will
* remain fixed in the initial position.
*
* In the following code the first line adds a circle body, then we associate
* the evas object to EPhysics_Body, EPhysics will map every changes on physics
* object simulation to its evas object. Some restitution and friction factors
* are added as well.
*
* @skip ephysics_body_cylinder_add
* @until ephysics_body_friction_set
*
* @section jumping-ball Making it jump
*
* The next step is to give us the ability to make our ball to jump - actually
* apply some impulse whenever a key has been pressed. Then we add a elementary
* input callback to the window widget.
*
* @skipline elm_object_event_callback_add
*
* @dontinclude test_bouncing_ball.c
*
* The jumping callback implementation consists on handling only key up events
* and discarding any other input event we get. We're interested on keyboard
* events only. All the operations done in the following lines are done on
* sphere EPhysics_Body previously created.
*
* We mainly use the ephysics_body_central_impulse_apply() function. This
* function applies an impulse on the center of a body.
*
* Once pressed \<Up> key it applies a central impulse of 0 kilos on X axis,
* 10 kilos on Y and 0 kilos on Z - so the ball is forced up.
*
* If \<Down> key has been pressed we apply an impulse of 0 kilos on X axis,
* -10 kilos on Y and 0 kilos on Z - here the ball is forced down.
*
* In the case of \<Right> key pressing it's applied an impulse of 10 kilos on X
* axis, 0 kilos on Y and 0 kilos on Z - which applies a force to the right side.
* But if the key being pressed is \<Left> the opposite is done, and an impulse
* of -10 kilos is applied on X, 0 kilos on Y and 0 kilos on Z - and the ball is
* forced to the left.
*
* @skip _on_keydown
* @until }
*
* Here we finish the very simple bouncing ball example. The full source code
* can be found at @ref test_bouncing_ball_c.
*
*/
/**
* @page test_bouncing_ball_c test_bouncing_ball.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-bouncing-ball-c test_bouncing_ball.c
* @dontinclude test.c
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_bouncing_ball.c
*
*
* @example test_bouncing_ball.c
*/
/**
* @page tutorial_ephysics_bouncing_text EPhysics - Bouncing Text
*
* The purpose of this example is to demonstrate the EPhysics_Body binding to
* a text (Evas_Object)
*
* @image html bouncing_text.png
* @image latex bouncing_text.eps
*
* For this example we'll have an EPhysics_World and one basic EPhysics_Body.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, were already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-text Creating the text
* @dontinclude test_bouncing_text.c
*
* Create a basic evas_object_text.
*
* @skipline Evas_Object *text;
*
* @skip text =
* @until text);
*
* @section add-textbody Creating the body
*
* Create a simple EPhysics_Body.
*
* Note that we use ephysics_body_geometry_set() to define its size because
* the evas_object has a different size that we want to represent physically.
* The text may have accent or letters like j and g.
*
* @skipline text_body =
* @skip ephysics_body_geometry_set(text_body
* @until 0.1);
*
* @section text-binding Binding
* @dontinclude test_bouncing_text.c
*
* After creating the body and the text, now we need to bind them.
*
* We set the last parameter as EINA_FALSE because in this example we don't
* want to set the physics body position to match evas object position.
*
* @skipline ephysics_body_evas_object_set
*
* Here we finish the example. The full source code can be found at
* @ref test_bouncing_text_c.
*
*/
/**
* @page test_bouncing_text_c test_bouncing_text.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-bouncing_text-c test_bouncing_text.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_bouncing_text.c
*
* @example test_bouncing_text.c
*/
/**
* @page tutorial_ephysics_camera EPhysics - Camera
*
* The purpose of this example is to demonstrate the EPhysics_Camera usage.
*
* The EPhysics_Camera facilitates the usage of scenarios bigger than the
* viewport, thats because the EPhysics handles the position of objects
* which has control.
*
* @image html camera.png
* @image latex camera.eps
*
* For this example we'll have an EPhysics_World, two distant EPhysics_Bodys,
* one with an impulse to collide each other and an EPhysics_Camera that
* follows the moving body using an animator.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, add an Ephysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-camstruct Camera Data Struct
* @dontinclude test_camera.c
*
* While in this example we'll be working with a struct to hold some objects
* in our code. For clarity sake we present you the struct declaration in the
* following block.
*
* @skip struct _Camera_Data {
* @until };
*
* @section add-camera Adding a Camera
*
* To move the camera in this example, we'll use an animator.
*
* @skipline camera_data->animator = ecore_animator_add
*
* In the animators function, we'll have to create a specific type of variable:
* @ref EPhysics_Camera
* And also get the worlds rendered area width to define a limit to the camera.
*
* @dontinclude test_camera.c
*
* @skip _camera_move_cb(void *data
* @until &w, NULL, NULL);
*
* Every world has a camera, so here we get this camera used by our
* EPhysics_World.
*
* @skipline camera = ephysics_world_camera_get
*
* Here we get the cameras position to after set the position based on previous.
*
* @skipline ephysics_camera_position_get(camera
*
* Here we check if the camera reached the end of scenario (define the limit
* to the camera) then we stop the animator, else we move the camera + 2
* pixel positions to the right.
*
* @skip if (x + w > WIDTH * 2)
* @until ephysics_camera_position_set(camera, x, y
* @skipline }
*
* @section add-uptfloor Updating the floor
*
* Here we'll use 2 floor images to give the impression of an infinite ground.
*
* Calling ephysics_world_event_callback_add()
* will register a callback to a type of physics world event.
*
* @ref EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED : called if the camera position
* changed on physics simulation tick.
*
* @skip ephysics_world_event_callback_add(world,
* @until _camera_moved_cb, camera_data);
*
* In the function, we just get the cameras position to know how much
* the camera moved and move the same value to the floor passing it as
* delta_x to the function, note that we use an old_x variable to do this
* calculation.
* @dontinclude test_camera.c
*
* @skip _camera_moved_cb(void *data
* @until }
*
* Here we get the floors position and plus the delta_x value to move the
* floor in the same "velocity".
*
* @dontinclude test_camera.c
*
* @skip _update_floor
* @until fx = x + delta
*
* We use 2 floor images because whenever one exits the screen by the left
* side, another is being shown, when it happens the one which exit the screen
* is sent to the right side, entering into an infinite loop, giving the
* impression of an infinite ground image. Its important to note that we need
* to use the fx to don't gap the images.
*
* @skip if (fx < -FLOOR_WIDTH
* @until }
*
* Here we finish the example. The full source code can be found at
* @ref test_camera_c.
*
*/
/**
* @page test_camera_c test_camera.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-camera-c test_camera.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_camera.c
*
* @example test_camera.c
*/
/**
* @page tutorial_ephysics_camera_track EPhysics - Camera Track
*
* The purpose of this example is to demonstrate the EPhysics_Camera Track
* usage.
*
* The EPhysics_Camera facilitates the usage of scenarios bigger than the
* viewport, thats because the EPhysics handles the position of objects
* which has control.
*
* @image html camera_track.png
* @image latex camera_track.eps
*
* For this example we'll have an EPhysics_World, one main EPhysics_Body that
* will be tracked by an EPhysics_Camera on three ways, horizontal, vertical
* and full tracking. Also nine EPhysics_Bodys with mass 0, that will be used
* as scenario in order to our main body change its position on x and y axes
* when passes through this scenario.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, add an Ephysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-trkstruct Track Data Struct
* @dontinclude test_camera_track.c
*
* While in this example we'll be working with a struct to hold some objects
* in our code. For clarity sake we present you the struct declaration in the
* following block.
*
* @skip struct _Track_Data {
* @until };
*
* @section add-camera Adding a Camera
*
* In this example we'll use 3 kinds of tracking, to change this values we'll
* have an Elementary spinner widget and handle it on this function.
*
* Every world has a camera, so here we get this camera used by our
* EPhysics_World.
*
* @skip _track_apply(Track_Data *track
* @until camera = ephysics_world_camera_get(track_data->base.world
*
* Here we'll get the elm_spinner value to the tracking base on this
* value
*
* @skip mode =
* @until }
*
* Here we'll set the camera to track the 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 set
* to EINA_TRUE, in this case we based these values on elm_spinner.
*
* @skip ephysics_camera_body_track(camera, body
* @until }
*
* @section add-uptfloor Updating the floor
*
* Here we'll use 2 floor images to give the impression of an infinite ground.
*
* Calling ephysics_world_event_callback_add()
* will register a callback to a type of physics world event.
*
* @ref EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED : called if the camera position
* changed on physics simulation tick.
*
* @skip ephysics_world_event_callback_add(world,
* @until _camera_moved_cb, track_data);
*
* In the function, we'll get the cameras position to know how much the camera
* moved and move the same value to the floor passing it as delta_x to the
* function, note that we use an old_x variable to do this calculation.
*
* We'll get also if the body is being tracked on x and y axes. If the body
* isn't being tracked on x axis the floors x position won't change, delta_x
* will be zero.
*
* @dontinclude test_camera_track.c
*
* @skip _camera_moved_cb(void *data
* @until }
*
* Here we get the floors position and plus the delta_x value to move the
* floor in the same "velocity".
*
* @dontinclude test_camera_track.c
*
* @skip _update_floor
* @until fx = x + delta
*
* We use 2 floor images because whenever one exits the screen by the left
* side, another is being shown, when it happens the one which exit the screen
* is sent to the right side, entering into an infinite loop, giving the
* impression of an infinite ground image. Its important to note that we need
* to use the fx to don't gap the images.
*
* Note that the fy is being defined considering its offsets, -20 is to the
* floor image be above the floor, thus having an border above the collision
* point, +40 is the render area height, to offset the cameras y, basically
* to draw in the correct position in the canvas.
*
* @skip if (fx < -FLOOR_WIDTH
* @until }
*
* Here we finish the example. The full source code can be found at
* @ref test_camera_track_c.
*
*/
/**
* @page test_camera_track_c test_camera_track.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-camera-track-c test_camera_track.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_camera_track.c
*
* @example test_camera_track.c
*/
/**
* @page tutorial_ephysics_collision_detection EPhysics - Collision Detection
*
* The purpose of this example is to demonstrate the EPhysics Collision
* Detection usage - The code adds two balls, one with impulse and the second
* with a collision detection callback, to show an effect.
*
* @image html collision_detection.png
* @image latex collision_detection.eps
*
* For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys,
* we'll apply an impulse in one of then and the other will be stopped
* "waiting" for a collision.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, add an Ephysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-collstruct Collision Data Struct
* @dontinclude test_collision_detection.c
*
* While in this example we'll be working with a struct to hold some objects
* in our code. For clarity sake we present you the struct declaration in the
* following block.
*
* @skip struct _Collision_Data {
* @until };
*
* @section add-callbacks Adding the Callback
*
* Calling ephysics_body_event_callback_add()
* will register a callback to a type of physics body event.
*
* @ref EPHYSICS_CALLBACK_BODY_COLLISION : called just after the collision has
* been actually processed by the physics engine. In other words, to be
* notified about a collision between two physical bodies.
*
* @skip ephysics_body_event_callback_add(collision_data->sphere
* @until );
*
* See
* @ref _EPhysics_Callback_Body_Type
* for more event types.
*
* @section add-collcb Collision Function
*
* The callback function will filter the collision to be sure if that body is
* which we want and then show the effect.
*
* First we need to create a specific variable type to get collision infos:
* @ref EPhysics_Body_Collision
*
* @dontinclude test_collision_detection.c
*
* @skip _collision_cb
* @until int x, y, z;
*
* Now we want to know which body collides with and filter it.
*
* @skip contact_body =
* @until return;
*
* We just get the collision position, move the impact effect to this
* coordinate and send a signal to edje to show it.
*
* @skip ephysics_body_collision_position_get
* @until "ephysics_test");
* @skipline }
*
* Here we finish the example. The full source code can be found at
* @ref test_collision_detection_c.
*
*/
/**
* @page test_collision_detection_c test_collision_detection.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-collision_detection-c test_collision_detection.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_collision_detection.c
*
* @example test_collision_detection.c
*/
/**
* @page tutorial_ephysics_collision_filter EPhysics - Collision Filter
*
* The purpose of this example is to demonstrate the EPhysics Collision Filter
* usage - The code adds four balls in 2 rows and 2 columns, two on each
* collision group, the collision only happens when the balls are in the
* same group (row),to make it easier, balls in the same group has the same
* color and size.
*
* @image html collision_filter.png
* @image latex collision_filter.eps
*
* For this example we'll have an EPhysics_World and four basic EPhysics_Bodys,
* we'll apply an impulse on then and see what happens when they're in other
* collision group.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, add an Ephysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-callbacks Adding the balls
* @dontinclude test_collision_filter.c
*
* We'll use two arrays (color and size) to distinguish the groups.
*
* @skip _world_populate
* @until row;
*
* The balls declaration was placed into a For loop, just to simplify the
* coding and divide them in two groups.
*
* @skip for (i = 0; i < 4
* @until 0.1);
*
* Note in this part we divide the balls in two groups by color (row).
*
* @skipline ephysics_body_collision_group_add(fall_body
*
* The impulse will be applied in only 1 ball per group, in this case:
*
* The 1st row 2nd column ball will be applied an impulse to the
* left (-300kg * p/s).
*
* The 2nd row 1st column ball will be applied an impulse to the
* right (300kg * p/s).
*
* And then saving the body into a list.
*
* @skip if (column + row == 1
* @until }
* @skipline }
*
* Here we finish the example. The full source code can be found at
* @ref test_collision_filter_c.
*
*/
/**
* @page test_collision_filter_c test_collision_filter.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-collision_filter-c test_collision_filter.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_collision_filter.c
*
* @example test_collision_filter.c
*/
/**
* @page tutorial_ephysics_delete_body EPhysics - Delete Body
*
* The purpose of this example is to demonstrate the EPhysics Callbacks usage -
* The code adds two balls, one with impulse and the second with a collision
* detection callback, to delete the body.
*
* For this example we'll have an EPhysics_World and two basic EPhysics_Bodys,
* we'll apply an impulse in one of then and the other will be stopped
* "waiting" for a collision.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, add an EPhysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were already
* covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-callbacks Adding Callbacks
* @dontinclude test_delete.c
*
* Calling ephysics_body_event_callback_add()
* registers a callback to a given EPhysics_Body event type.
*
* We'll use two types:
*
* @ref EPHYSICS_CALLBACK_BODY_DEL : called when a body deletion has been issued
* and just before the deletion actually happens. In other words, to know that
* body has been marked for
* deletion. Typically to free some data associated with the body.
*
* @skipline ephysics_body_event_callback_add(sphere_body1,
* @skip EPHYSICS_CALLBACK_BODY_DEL
* @until );
*
* The callback function will receive the collision_data and free some data
* associated with the body.
*
* @dontinclude test_delete.c
*
* @skip _del_cb(void *data,
* @until }
*
* @ref EPHYSICS_CALLBACK_BODY_COLLISION : called just after the collision has
* been actually processed by the physics engine. In other words, to be notified
* about a collision between two physical bodies.
*
* @skip ephysics_body_event_callback_add(collision_data->sphere,
* @until );
*
* The callback function will get the collision body and check if its body is
* equal to which we want to delete.
*
* @dontinclude test_delete.c
*
* @skip _collision_cb(void *data,
* @until }
*
* See
* @ref _EPhysics_Callback_Body_Type
* for more event types.
*
* Here we finish the example. The full source code can be found at
* @ref test_delete_c.
*
*/
/**
* @page test_delete_c test_delete.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-delete-c test_delete.c
* @dontinclude test.c
* @skip test_clean
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_delete.c
*
* @example test_delete.c
*/
/**
* @page tutorial_ephysics_constraint EPhysics - Constraint
*
* The purpose of this example is to demonstrate the EPhysics Constraint usage -
* The code apply a constraint between two cubes.
*
* For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
*
* The basic concepts like - defining an EPhysics_World, render geometry,
* physics limiting boundaries, add an EPhysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* You can use also a slider constraint:
* @ref tutorial_ephysics_slider
*
* @section add-constraint Adding a constraint
* @dontinclude test_constraint.c
*
* Constraint is a specific type of variable in EPhysics.
*
* @skipline EPhysics_Constraint
*
* Here we're working with a point-to-point constraint, its purpose is to join
* two bodies limiting their movements based on specified anchors.
*
* After we create our 2 EPhysics_Bodys, now we'll add a constraint between
* them and setting an anchor to first body's Y using a p2p constraint
* (point to point).
*
* @skip constraint = ephysics_constraint_p2p
* @until );
*
* Here we finish the example. The full source code can be found at
* @ref test_constraint_c.
*
*/
/**
* @page test_constraint_c test_constraint.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-constraint-c test_constraint.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_constraint.c
*
* @example test_constraint.c
*/
/**
* @page tutorial_ephysics_forces EPhysics - Forces
*
* The purpose of this example is to demonstrate the EPhysics Force usage -
* The code applies force over two cubes.
*
* @image html forces.png
* @image latex forces.eps
*
* For this example we'll have an EPhysics_World with gravity setted to zero,
* and two basic EPhysics_Bodys.
*
* The basic concepts like - defining an EPhysics_World, render geometry,
* physics limiting boundaries, add an EPhysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-force Adding a Force
* @dontinclude test_forces.c
*
* We apply a force over the first body to change its linear and angular
* accelerations. Applying a force to a body will lead it to change its
* velocity gradually.
*
* Note that in this blue cube we use an offset to apply the force, the two
* last parameters are responsible to set a relative position to apply the
* force.In other words, the force applied with an offset will make the body
* rotates. Otherwise (0, 0, 0) the force would be applied on the center of the
* body, in this case its recommended use the
* ephysics_body_central_force_apply();
*
* @skipline ephysics_body_force_apply(box_body1
*
* Here we apply a central force over the second body avoiding affect the
* angular acceleration (rotate).
*
* @skipline ephysics_body_central_force_apply(box_body2
*
* We can also get all the forces applied over a body, including gravity, but
* in this case we setted to zero.
*
* @dontinclude test_forces.c
*
* @skipline ephysics_body_forces_get(
*
* Here we finish the example. The full source code can be found at
* @ref test_forces_c.
*
*/
/**
* @page test_forces_c test_forces.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-forces-c test_forces.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_forces.c
*
* @example test_forces.c
*/
/**
* @page tutorial_ephysics_growing_balls EPhysics - Growing Balls
*
* The purpose of this example is to demonstrate the dynamically growing
* and shrinking of an EPhysics_Body - The code applies the growth of a ball
* and the shrink of another.
*
* @image html growing_balls.png
* @image latex growing_balls.eps
*
* For this example we'll have an EPhysics_World and three EPhysics_Bodys
* with different sizes associated with an evas_object.
*
* The basic concepts like - defining an EPhysics_World, render geometry,
* physics limiting boundaries, add an EPhysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-growshrink Adding the growing/shrinking
* @dontinclude test_growing_balls.c
*
* In this example we'll use a timer to handle the callback function.
*
* @skipline test_data->data = ecore_timer_add
*
* In this callback, we'll pass through a list with 3 balls and apply the
* growth and the shrink between the limit we'll set. Note that the variable
* i receives different values on each iteration (-1, 0, 1). For the first
* iteration it will decrease the size variable, the second will keep the
* same value, and the last one will increase the size variable.
*
* @dontinclude test_growing_balls.c
*
* @skip _grow_cb(void *data
* @until return EINA_TRUE;
* @skipline }
*
* Here we finish the example. The full source code can be found at
* @ref test_growing_balls_c.
*
*/
/**
* @page test_growing_balls_c test_growing_balls.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-growing-balls-c test_growing_balls.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_growing_balls.c
*
* @example test_growing_balls.c
*/
/**
* @page tutorial_ephysics_gravity EPhysics - Gravity
*
* The purpose of this example is to demonstrate the EPhysics Gravity usage -
* The code apply gravity in an EPhysics_World with two cubes in movement.
*
* @image html no_gravity.png
* @image latex no_gravity.eps
*
* For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
*
* The basic concepts like - defining an EPhysics_World, render geometry,
* physics limiting boundaries, add an EPhysics_Body, associate it to evas
* objects, change restitution, friction and impulse properties, were
* already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* Concepts like velocity and sleeping threshold were already
* covered in:
* @li @ref tutorial_ephysics_velocity
* @li @ref tutorial_ephysics_sleeping_threshold
*
* @section add-gravity Setting Gravity
* @dontinclude test_no_gravity.c
*
* Here we set gravity on 3 axes (x, y, z) to (0, 0, 0). Gravity will act
* over bodies with mass over all the time.
*
* @skipline ephysics_world_gravity_set
*
* @section add-stopbody Stopping a Body
* @dontinclude test_no_gravity.c
*
* We're using a button to call this function that receives test_data to stop
* the chosen body.
*
* Stop angular and linear body movement, its equivalent to set linear velocity
* to 0 on both axis and angular velocity to 0 as well.
*
* @skip _stop(void *data
* @until body);
* @skipline }
*
* Here we finish the example. The full source code can be found at
* @ref test_no_gravity_c.
*
*/
/**
* @page test_no_gravity_c test_no_gravity.c
*
* @section ephysics-test-h ephysics_test.h
* @include ephysics_test.h
*
* @section test-no-gravity-c test_no_gravity.c
* @dontinclude test.c
*
* @skip test_clean
* @until }
*
* @skip test_data_new
* @until }
*
* @skip test_win_add
* @until }
*
* @include test_no_gravity.c
*
* @example test_no_gravity.c
*/
/**
* @page tutorial_ephysics_logo EPhysics - Logo
*
* The purpose of this example is to demonstrate the EPhysics_Logo.
*
* For this example we'll have an EPhysics_World.
*
* The basic concepts like - initializing an EPhysics_World, render geometry,
* physics limiting boundaries, were already covered in
* @ref tutorial_ephysics_bouncing_ball
*
* @section add-logostruct Logo Data Struct
* @dontinclude ephysics_logo.c
*
* While in this example we'll be working with a struct to hold some objects