diff --git a/legacy/ephysics/src/bin/test_bouncing_ball.c b/legacy/ephysics/src/bin/test_bouncing_ball.c index 7991571502..acf21f8cfc 100644 --- a/legacy/ephysics/src/bin/test_bouncing_ball.c +++ b/legacy/ephysics/src/bin/test_bouncing_ball.c @@ -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; diff --git a/legacy/ephysics/src/bin/test_flag.c b/legacy/ephysics/src/bin/test_flag.c index 1094c08009..c843ecd77b 100644 --- a/legacy/ephysics/src/bin/test_flag.c +++ b/legacy/ephysics/src/bin/test_flag.c @@ -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); diff --git a/legacy/ephysics/src/bin/test_light.c b/legacy/ephysics/src/bin/test_light.c index c0733d2393..e597fe480c 100644 --- a/legacy/ephysics/src/bin/test_light.c +++ b/legacy/ephysics/src/bin/test_light.c @@ -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); } - diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index b6d739bdd2..2d869783af 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -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 - * @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 details. * * @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_position_get(const EPhysics_World *world, Evas_Coord *lx, Evas_Coord *ly, Evas_Coord *lz); /** * @brief - * Unset light on the scene. + * Get color of point light applied on the scene. * - * It will unset light, so no body will be enlightened anymore. + * 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_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 void ephysics_world_light_unset(EPhysics_World *world); +EAPI void ephysics_world_point_light_color_get(const 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_point_light_position_set() for more details. + * @see ephysics_world_ambient_light_color_set(). + * + * @ingroup EPhysics_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 diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index b02f00663b..d3186798c2 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -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); diff --git a/legacy/ephysics/src/lib/ephysics_world.cpp b/legacy/ephysics/src/lib/ephysics_world.cpp index 41d089eea7..68054e2ad4 100644 --- a/legacy/ephysics/src/lib/ephysics_world.cpp +++ b/legacy/ephysics/src/lib/ephysics_world.cpp @@ -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,83 +1517,87 @@ 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)); - - if (!world->light) - { - ERR("Failed to create light."); - 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; -} - -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) -{ - if (!world) - { - ERR("No world, can't get light."); - return EINA_FALSE; - } - - if (!world->light) - { - INF("Light isn't set."); - return EINA_FALSE; - } - - 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; + world->light.lx = lx; + world->light.ly = ly; + world->light.lz = lz; } EAPI void -ephysics_world_light_unset(EPhysics_World *world) +ephysics_world_point_light_color_set(EPhysics_World *world, int lr, int lg, int lb) { if (!world) { - ERR("No world, can't unset light."); + ERR("No world, can't set light properties."); return; } - if (!world->light) - return; + world->light.lr = lr; + world->light.lg = lg; + world->light.lb = lb; +} - free(world->light); - world->light = NULL; +EAPI void +ephysics_world_ambient_light_color_set(EPhysics_World *world, int ar, int ag, int ab) +{ + if (!world) + { + ERR("No world, can't set light properties."); + return; + } + + 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) + { + ERR("No world, can't get light properties."); + return; + } + + if (ar) *ar = world->light.ar; + if (ag) *ag = world->light.ag; + if (ab) *ab = world->light.ab; +} + +EAPI void +ephysics_world_point_light_color_get(const EPhysics_World *world, int *lr, int *lg, int *lb) +{ + if (!world) + { + ERR("No world, can't get light properties."); + return; + } + + if (lr) *lr = world->light.lr; + if (lg) *lg = world->light.lg; + if (lb) *lb = world->light.lb; +} + +EAPI void +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 get light properties."); + return; + } + + if (lx) *lx = world->light.lx; + if (ly) *ly = world->light.ly; + if (lz) *lz = world->light.lz; } EAPI void @@ -1606,13 +1609,7 @@ ephysics_world_light_all_bodies_set(EPhysics_World *world, Eina_Bool enable) return; } - if (!world->light) - { - ERR("Light isn't set, can't apply on bodies"); - 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