ephysics: break up light functions
authorBruno Dilly <bdilly@profusion.mobi>
Tue, 30 Oct 2012 18:31:32 +0000 (18:31 +0000)
committerBruno Dilly <bdilly@profusion.mobi>
Tue, 30 Oct 2012 18:31:32 +0000 (18:31 +0000)
Long list of same typed parameters is very error prone.
Not the scene will have a initial light configuration, that can
be enabled and modified.

SVN revision: 78678

legacy/ephysics/src/bin/test_bouncing_ball.c
legacy/ephysics/src/bin/test_flag.c
legacy/ephysics/src/bin/test_light.c
legacy/ephysics/src/lib/EPhysics.h
legacy/ephysics/src/lib/ephysics_body.cpp
legacy/ephysics/src/lib/ephysics_world.cpp

index 799157150265055aa5283b006692a49ceef485e6..acf21f8cfc9f4a16e8ab421ce8ef0df7cfd184f6 100644 (file)
@@ -88,6 +88,7 @@ test_bouncing_ball(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *eve
    elm_object_signal_emit(test_data->layout, "arrows,show", "ephysics_test");
 
    world = ephysics_world_new();
+   ephysics_world_light_all_bodies_set(world, EINA_TRUE);
    ephysics_world_render_geometry_set(world, 50, 40, -50,
                                       WIDTH - 100, FLOOR_Y - 40, DEPTH);
    test_data->world = world;
index 1094c08009660c3c816e1ef930124f8c6753e5b0..c843ecd77b08251ffd163c4c88274497dd364094 100644 (file)
@@ -154,7 +154,7 @@ test_flag(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info _
                                       WIDTH - 100, FLOOR_Y - 40, DEPTH);
    test_data->world = world;
 
-   ephysics_world_light_set(world, 300, 50, -200, 255, 255, 255, 0, 0, 0);
+   ephysics_world_point_light_position_set(world, 300, 50, -200);
    ephysics_world_light_all_bodies_set(world, EINA_TRUE);
    ephysics_camera_perspective_enabled_set(ephysics_world_camera_get(world),
                                            EINA_TRUE);
index c0733d23931e7190ab822446806fba79440bea9b..e597fe480c15ff34a45c1f196c8e406efc37ff52 100644 (file)
@@ -75,9 +75,10 @@ test_light(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info
    ephysics_body_restitution_set(boundary, 0.65);
    ephysics_body_friction_set(boundary, 4);
 
-   ephysics_world_light_set(world, 200, 300, -120, 255, 120, 120, 40, 40, 40);
+   ephysics_world_point_light_position_set(world, 200, 300, -120);
+   ephysics_world_point_light_color_set(world, 255, 120, 120);
+   ephysics_world_ambient_light_color_set(world, 40, 40, 40);
    ephysics_world_light_all_bodies_set(world, EINA_TRUE);
 
    _world_populate(test_data);
 }
-
index b6d739bdd2c7411c3a45c26d4c5871b9977f37d4..2d869783af5d60493f22815f7b3092f47876135e 100644 (file)
@@ -1413,7 +1413,7 @@ EAPI void ephysics_world_simulation_get(const EPhysics_World *world, double *fix
 
 /**
  * @brief
- * Set light properties to be applied on the scene.
+ * Set position of point light to be applied on 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.
@@ -1434,63 +1434,110 @@ EAPI void ephysics_world_simulation_get(const EPhysics_World *world, double *fix
  * @ref ephysics_world_light_all_bodies_set(). The other, is to set each body
  * individually, with @ref ephysics_body_light_set().
  *
- * By default, no light is set. And after a light is set, by default,
- * no body will be affected. No change will be visible until
+ * By default, point light is set to position (0, 0, -200) and has white color
+ * (r=255, g=255, b=255). The ambient color is black (r=0, g=0, b=0).
+ * But no body will be affected. No change will be visible until
  * some bodies are set to be enlightened.
  *
  * @param world The physics world.
  * @param lx X coordinate in space of light point
  * @param ly Y coordinate in space of light point
  * @param lz Z coordinate in space of light point
+ *
+ * @see ephysics_world_point_light_position_get().
+ * @see ephysics_world_point_light_color_set().
+ * @see ephysics_world_ambient_light_color_set().
+ *
+ * @ingroup EPhysics_World
+ */
+EAPI void ephysics_world_point_light_position_set(EPhysics_World *world, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz);
+
+/**
+ * @brief
+ * Set color of point light to be applied on the scene.
+ *
+ * By default color of point light is r=255, g=255, b=255.
+ *
+ * @param world The physics world.
  * @param lr light red value (0 - 255)
  * @param lg light green value (0 - 255)
  * @param lb light blue value (0 - 255)
+ *
+ * @see ephysics_world_point_light_position_set() for more details.
+ * @see ephysics_world_point_light_color_get().
+ *
+ * @ingroup EPhysics_World
+ */
+EAPI void ephysics_world_point_light_color_set(EPhysics_World *world, int lr, int lg, int lb);
+
+/**
+ * @brief
+ * Set color of the ambient light to be applied on the scene.
+ *
+ * By default, ambient color is set to r=0, g=0, b=0.
+ *
+ * @param world The physics world.
  * @param ar ambient color red value (0 - 255)
  * @param ag ambient color green value (0 - 255)
  * @param ab ambient color blue value (0 - 255)
  *
- * @see ephysics_world_light_get().
+ * @see ephysics_world_point_light_position_set() for more details.
+ * @see ephysics_world_ambient_light_color_get().
  *
  * @ingroup EPhysics_World
  */
-EAPI void ephysics_world_light_set(EPhysics_World *world, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab);
+EAPI void ephysics_world_ambient_light_color_set(EPhysics_World *world, int ar, int ag, int ab);
 
 /**
  * @brief
- * Get light properties.
+ * Get position of point light applied on the scene.
  *
  * @param world The physics world.
  * @param lx X coordinate in space of light point
  * @param ly Y coordinate in space of light point
  * @param lz Z coordinate in space of light point
+ *
+ * @see ephysics_world_point_light_position_set() for details.
+ *
+ * @ingroup EPhysics_World
+ */
+EAPI void ephysics_world_point_light_position_get(const EPhysics_World *world, Evas_Coord *lx, Evas_Coord *ly, Evas_Coord *lz);
+
+/**
+ * @brief
+ * Get color of point light applied on the scene.
+ *
+ * By default color of point light is r=255, g=255, b=255.
+ *
+ * @param world The physics world.
  * @param lr light red value (0 - 255)
  * @param lg light green value (0 - 255)
  * @param lb light blue value (0 - 255)
- * @param ar ambient color red value (0 - 255)
- * @param ag ambient color green value (0 - 255)
- * @param ab ambient color blue value (0 - 255)
- * @return @c EINA_TRUE if light is set, or @c EINA_FALSE if it isn't set,
- * or on error. On this case the other parameters won't be set.
  *
- * @see ephysics_world_light_set() for more details.
+ * @see ephysics_world_point_light_position_set() for more details.
+ * @see ephysics_world_point_light_color_set().
  *
  * @ingroup EPhysics_World
  */
-EAPI Eina_Bool ephysics_world_light_get(const EPhysics_World *world, Evas_Coord *lx, Evas_Coord *ly, Evas_Coord *lz, int *lr, int *lg, int *lb, int *ar, int *ag, int *ab);
+EAPI void ephysics_world_point_light_color_get(const EPhysics_World *world, int *lr, int *lg, int *lb);
 
 /**
  * @brief
- * Unset light on the scene.
+ * Set color of the ambient light to be applied on the scene.
  *
- * It will unset light, so no body will be enlightened anymore.
+ * By default, ambient color is set to r=0, g=0, b=0.
  *
  * @param world The physics world.
+ * @param ar ambient color red value (0 - 255)
+ * @param ag ambient color green value (0 - 255)
+ * @param ab ambient color blue value (0 - 255)
  *
- * @see ephysics_world_light_set() for more details.
+ * @see ephysics_world_point_light_position_set() for more details.
+ * @see ephysics_world_ambient_light_color_set().
  *
  * @ingroup EPhysics_World
  */
-EAPI void ephysics_world_light_unset(EPhysics_World *world);
+EAPI void ephysics_world_ambient_light_color_get(const EPhysics_World *world, int *ar, int *ag, int *ab);
 
 /**
  * @brief
@@ -1501,7 +1548,7 @@ EAPI void ephysics_world_light_unset(EPhysics_World *world);
  * all the bodies, or @c EINA_FALSE if it only should be applied on bodies with
  * light property set.
  *
- * @see ephysics_world_light_set() for more details.
+ * @see ephysics_world_point_light_position_set() for more details.
  * @see ephysics_world_light_all_bodies_get().
  *
  * @ingroup EPhysics_World
index b02f00663b42bd2c8d1898551d4b0fe129280f0a..d3186798c2d473743dda5f282422a29ef6ffebed 100644 (file)
@@ -92,10 +92,10 @@ _ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__,
    if ((body->light_apply) ||
        (ephysics_world_light_all_bodies_get(body->world)))
      {
-
-        if (ephysics_world_light_get(body->world, &lx, &ly, &lz,
-                                     &lr, &lg, &lb, &ar, &ag, &ab))
-          light = EINA_TRUE;
+        ephysics_world_point_light_position_get(body->world, &lx, &ly, &lz);
+        ephysics_world_point_light_color_get(body->world, &lr, &lg, &lb);
+        ephysics_world_ambient_light_color_get(body->world, &ar, &ag, &ab);
+        light = EINA_TRUE;
      }
 
    if (ephysics_camera_perspective_enabled_get(camera))
@@ -1160,9 +1160,10 @@ _ephysics_body_evas_object_default_update(EPhysics_Body *body)
         int lr, lg, lb, ar, ag, ab;
         Evas_Coord lx, ly, lz;
 
-        if (ephysics_world_light_get(body->world, &lx, &ly, &lz,
-                                     &lr, &lg, &lb, &ar, &ag, &ab))
-          evas_map_util_3d_lighting(map, lx, ly, lz, lr, lg, lb, ar, ag, ab);
+        ephysics_world_point_light_position_get(body->world, &lx, &ly, &lz);
+        ephysics_world_point_light_color_get(body->world, &lr, &lg, &lb);
+        ephysics_world_ambient_light_color_get(body->world, &ar, &ag, &ab);
+        evas_map_util_3d_lighting(map, lx, ly, lz, lr, lg, lb, ar, ag, ab);
      }
 
    evas_object_map_set(body->evas_obj, map);
index 41d089eea75e004a01d763bcd9b840969011afd3..68054e2ad4f775bb83ab45f97fd0e0d9e67430b0 100644 (file)
@@ -32,21 +32,6 @@ struct _EPhysics_World_Callback {
      Eina_Bool deleted:1;
 };
 
-typedef struct _EPhysics_Light EPhysics_Light;
-
-struct _EPhysics_Light {
-     Evas_Coord lx;
-     Evas_Coord ly;
-     Evas_Coord lz;
-     int lr;
-     int lg;
-     int lb;
-     int ar;
-     int ag;
-     int ab;
-     Eina_Bool all_bodies:1;
-};
-
 struct _EPhysics_World {
      EINA_INLIST;
 
@@ -70,7 +55,6 @@ struct _EPhysics_World {
 
      EPhysics_Body *boundaries[6];
      EPhysics_Camera *camera;
-     EPhysics_Light *light;
      Eina_Inlist *callbacks;
      Eina_Inlist *bodies;
      Eina_List *to_delete;
@@ -89,6 +73,19 @@ struct _EPhysics_World {
      Eina_Lock mutex;
      Eina_Condition condition;
 
+     struct {
+          Evas_Coord lx;
+          Evas_Coord ly;
+          Evas_Coord lz;
+          int lr;
+          int lg;
+          int lb;
+          int ar;
+          int ag;
+          int ab;
+          Eina_Bool all_bodies:1;
+     } light;
+
      Eina_Bool running:1;
      Eina_Bool ticked:1;
      Eina_Bool active:1;
@@ -381,9 +378,6 @@ _ephysics_world_free(EPhysics_World *world)
    eina_condition_free(&world->condition);
    eina_lock_free(&world->mutex);
 
-   if (world->light)
-     free(world->light);
-
    free(world);
    INF("World %p deleted.", world);
    ephysics_dom_count_dec();
@@ -756,6 +750,11 @@ ephysics_world_new(void)
      world->dynamics_world->getPairCache()->setOverlapFilterCallback(
         world->filter_cb);
 
+   world->light.lr = 255;
+   world->light.lg = 255;
+   world->light.lb = 255;
+   world->light.lz = -200;
+
    world->stacking = EINA_TRUE;
    world->rate = 30;
    world->max_sub_steps = 3;
@@ -1518,101 +1517,99 @@ ephysics_world_lock_release(EPhysics_World *world)
 }
 
 EAPI void
-ephysics_world_light_set(EPhysics_World *world,
-                         Evas_Coord lx, Evas_Coord ly, Evas_Coord lz,
-                         int lr, int lg, int lb,
-                         int ar, int ag, int ab)
+ephysics_world_point_light_position_set(EPhysics_World *world, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz)
 {
    if (!world)
      {
-       ERR("No world, can't set light.");
+       ERR("No world, can't set light properties.");
        return;
      }
 
-   if (!world->light)
-     world->light = (EPhysics_Light *) calloc(1, sizeof(EPhysics_Light));
+   world->light.lx = lx;
+   world->light.ly = ly;
+   world->light.lz = lz;
+}
 
-   if (!world->light)
+EAPI void
+ephysics_world_point_light_color_set(EPhysics_World *world, int lr, int lg, int lb)
+{
+   if (!world)
      {
-       ERR("Failed to create light.");
+       ERR("No world, can't set light properties.");
        return;
      }
 
-   world->light->lx = lx;
-   world->light->ly = ly;
-   world->light->lz = lz;
-   world->light->lr = lr;
-   world->light->lg = lg;
-   world->light->lb = lb;
-   world->light->ar = ar;
-   world->light->ag = ag;
-   world->light->ab = ab;
-   world->light->all_bodies = EINA_FALSE;
+   world->light.lr = lr;
+   world->light.lg = lg;
+   world->light.lb = lb;
 }
 
-EAPI Eina_Bool
-ephysics_world_light_get(const EPhysics_World *world,
-                         Evas_Coord *lx, Evas_Coord *ly, Evas_Coord *lz,
-                         int *lr, int *lg, int *lb,
-                         int *ar, int *ag, int *ab)
+EAPI void
+ephysics_world_ambient_light_color_set(EPhysics_World *world, int ar, int ag, int ab)
 {
    if (!world)
      {
-       ERR("No world, can't get light.");
-       return EINA_FALSE;
+       ERR("No world, can't set light properties.");
+       return;
      }
 
-   if (!world->light)
+   world->light.ar = ar;
+   world->light.ag = ag;
+   world->light.ab = ab;
+}
+
+EAPI void
+ephysics_world_ambient_light_color_get(const EPhysics_World *world, int *ar, int *ag, int *ab)
+{
+   if (!world)
      {
-       INF("Light isn't set.");
-       return EINA_FALSE;
+       ERR("No world, can't get light properties.");
+       return;
      }
 
-   if (lx) *lx = world->light->lx;
-   if (ly) *ly = world->light->ly;
-   if (lz) *lz = world->light->lz;
-   if (lr) *lr = world->light->lr;
-   if (lg) *lg = world->light->lg;
-   if (lb) *lb = world->light->lb;
-   if (ar) *ar = world->light->ar;
-   if (ag) *ag = world->light->ag;
-   if (ab) *ab = world->light->ab;
-
-   return EINA_TRUE;
+   if (ar) *ar = world->light.ar;
+   if (ag) *ag = world->light.ag;
+   if (ab) *ab = world->light.ab;
 }
 
 EAPI void
-ephysics_world_light_unset(EPhysics_World *world)
+ephysics_world_point_light_color_get(const EPhysics_World *world, int *lr, int *lg, int *lb)
 {
    if (!world)
      {
-       ERR("No world, can't unset light.");
+       ERR("No world, can't get light properties.");
        return;
      }
 
-   if (!world->light)
-     return;
-
-   free(world->light);
-   world->light = NULL;
+   if (lr) *lr = world->light.lr;
+   if (lg) *lg = world->light.lg;
+   if (lb) *lb = world->light.lb;
 }
 
 EAPI void
-ephysics_world_light_all_bodies_set(EPhysics_World *world, Eina_Bool enable)
+ephysics_world_point_light_position_get(const EPhysics_World *world, Evas_Coord *lx, Evas_Coord *ly, Evas_Coord *lz)
 {
    if (!world)
      {
-       ERR("No world, can't set light property.");
+       ERR("No world, can't get light properties.");
        return;
      }
 
-   if (!world->light)
+   if (lx) *lx = world->light.lx;
+   if (ly) *ly = world->light.ly;
+   if (lz) *lz = world->light.lz;
+}
+
+EAPI void
+ephysics_world_light_all_bodies_set(EPhysics_World *world, Eina_Bool enable)
+{
+   if (!world)
      {
-       ERR("Light isn't set, can't apply on bodies");
+       ERR("No world, can't set light property.");
        return;
      }
 
-   world->light->all_bodies = !!enable;
+   world->light.all_bodies = !!enable;
 }
 
 EAPI Eina_Bool
@@ -1624,10 +1621,7 @@ ephysics_world_light_all_bodies_get(const EPhysics_World *world)
        return EINA_FALSE;
      }
 
-   if (!world->light)
-     return EINA_FALSE;
-
-   return world->light->all_bodies;
+   return world->light.all_bodies;
 }
 
 EAPI void