efl/src/lib/ephysics/ephysics_private.h

231 lines
6.7 KiB
C
Raw Normal View History

#ifndef _EPHYSICS_PRIVATE_H
#define _EPHYSICS_PRIVATE_H
#ifdef HAVE_EVIL
# include <Evil.h>
#endif
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#include <BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h>
#include <BulletSoftBody/btDefaultSoftBodySolver.h>
#include <BulletSoftBody/btSoftRigidDynamicsWorld.h>
#include <BulletSoftBody/btSoftBodyHelpers.h>
#include <btBulletDynamicsCommon.h>
#pragma GCC diagnostic pop
#include "EPhysics.h"
#ifdef EPHYSICS_LOG_COLOR
#undef EPHYSICS_LOG_COLOR
#endif
#define EPHYSICS_LOG_COLOR EINA_COLOR_BLUE
#ifdef ERR
# undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_ephysics_log_dom, __VA_ARGS__)
#ifdef DBG
# undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_ephysics_log_dom, __VA_ARGS__)
#ifdef INF
# undef INF
#endif
#define INF(...) EINA_LOG_DOM_INFO(_ephysics_log_dom, __VA_ARGS__)
#ifdef WRN
# undef WRN
#endif
#define WRN(...) EINA_LOG_DOM_WARN(_ephysics_log_dom, __VA_ARGS__)
#ifdef CRIT
# undef CRIT
#endif
#define CRIT(...) EINA_LOG_DOM_CRIT(_ephysics_log_dom, __VA_ARGS__)
#ifdef __cplusplus
extern "C" {
#endif
#define RAD_TO_DEG 57.29582 /* 2 * pi radians == 360 degree */
typedef struct _EPhysics_Force EPhysics_Force;
typedef struct _EPhysics_Body_Center_Mass EPhysics_Body_Center_Mass;
typedef struct _EPhysics_Body_Size EPhysics_Body_Size;
typedef struct _EPhysics_Body_Face_Slice EPhysics_Body_Face_Slice;
typedef struct _EPhysics_Point EPhysics_Point;
typedef struct _EPhysics_Dragging_Data EPhysics_Dragging_Data;
typedef enum _EPhysics_Body_Shape
{
EPHYSICS_BODY_SHAPE_BOX,
EPHYSICS_BODY_SHAPE_CUSTOM,
EPHYSICS_BODY_SHAPE_CYLINDER,
EPHYSICS_BODY_SHAPE_SPHERE,
EPHYSICS_BODY_SHAPE_LAST,
} EPhysics_Body_Shape;
typedef enum _EPhysics_World_Boundary
{
EPHYSICS_WORLD_BOUNDARY_TOP,
EPHYSICS_WORLD_BOUNDARY_BOTTOM,
EPHYSICS_WORLD_BOUNDARY_LEFT,
EPHYSICS_WORLD_BOUNDARY_RIGHT,
EPHYSICS_WORLD_BOUNDARY_FRONT,
EPHYSICS_WORLD_BOUNDARY_BACK,
EPHYSICS_WORLD_BOUNDARY_LAST
} EPhysics_World_Boundary;
typedef enum _EPhysics_Body_Type
{
EPHYSICS_BODY_TYPE_RIGID,
EPHYSICS_BODY_TYPE_SOFT,
EPHYSICS_BODY_TYPE_CLOTH,
} EPhysics_Body_Type;
struct _EPhysics_Point {
EINA_INLIST;
double x;
double y;
double z;
};
struct _EPhysics_Force {
double x;
double y;
double z;
double torque_x;
double torque_y;
double torque_z;
};
struct _EPhysics_Dragging_Data {
int triangle;
double mass;
Eina_Bool dragging:1;
};
struct _EPhysics_Body_Center_Mass {
double x;
double y;
double z;
};
struct _EPhysics_Body_Size {
Evas_Coord w;
Evas_Coord h;
Evas_Coord d;
};
struct _EPhysics_Body_Face_Slice {
EPhysics_Body *body;
EPhysics_Body_Face face;
int slices_cnt;
int *points_deform;
Eina_List *slices;
};
struct _EPhysics_Body {
EINA_INLIST;
btCollisionShape *collision_shape;
btRigidBody *rigid_body;
btSoftBody *soft_body;
Evas_Object *evas_obj;
EPhysics_World *world;
int walking;
EPhysics_Body_Size size;
btVector3 scale;
void *data;
Eina_Inlist *callbacks;
Eina_List *collision_groups;
Eina_List *to_delete;
Eina_List *face_objs;
EPhysics_Body_Material material;
double mass;
double density;
EPhysics_Force force;
EPhysics_Body_Center_Mass cm;
Eina_List *faces_slices;
EPhysics_Body_Face_Slice *default_face;
EPhysics_Body_Type type;
EPhysics_Body_Shape shape;
int cloth_columns;
int cloth_rows;
int material_index;
int collision_cb;
EPhysics_Dragging_Data dragging_data;
Eina_Bool active:1;
Eina_Bool deleted:1;
Eina_Bool light_apply:1;
Eina_Bool back_face_culling:1;
Eina_Bool clockwise:1;
Eina_Bool boundary:1;
int bending_constraints;
Eina_Bool anchor_hardness;
};
extern int _ephysics_log_dom;
/* Main */
void ephysics_dom_count_inc(void);
void ephysics_dom_count_dec(void);
/* World */
int ephysics_world_init(void);
int ephysics_world_shutdown(void);
Eina_Bool ephysics_world_body_add(EPhysics_World *world, EPhysics_Body *body);
Eina_Bool ephysics_world_body_del(EPhysics_World *world, EPhysics_Body *body);
Eina_Bool ephysics_world_soft_body_add(EPhysics_World *world, EPhysics_Body *body);
EPhysics: generic constraint This patch changes how constraints are created and configured, now we use a bullet generic implementation which let us operate on the 6 degrees of freedom(linear and angular ones). We have used 6dof for slider constraint but now we assume 2 types of constraints, single body - simply ephysics_constraint_add(body) - and a linked one - ephysics_constraint_linked_add(body1, body2) used to constrain 2 bodies linked together. Having said that we introduce the following changes: + migrate p2p constraint to 6Dof We want to have a constraint api generic enouth to allow many different constraint behaviour, 6Dof was picked to do that, so p2p needs a migration. + move ephysics_constraint_slider_* functions Since the whole constraint infra-sctructure is being migrated to 6Dof the linear and angular limit functions - previously used only by slider constraint - now looks more generic enough to be used by constraint in general. + add constraint anchor API Instead of telling the anchoring positioning in the constraint creating we have set it's default value to the the middle os the body and if the user wants to change it call ephysics_constraint_anchor_set and reset it. The ephysics_constraint_anchor_set() considers the canvas coordinate instead of using the body orientation. So now one can tell a constraints anchor is set to 100, 10, 0 in the canvas coordinate system and not (body_center.x - 20, body_center.y - 5, body_center.z - 1). + constraint migrate the bt_constraint Since we're working only with 6Dof constraints it is reasonable to change the constraints bt_constraint field to btGeneric6DofConstraint. + add 3 axes to constraints Now constraints API knows about x, y and z axes - linear and angular limiting, anchor setting and the constraint creation functions are fully supported. + constraint calls are renamed The constraint calls were renamed so ephysics_constraint_p2p_add() now is known as ephysics_constraint_linked_add() and ephysics_constraint_slider_add() became ephysics_constraint_add() where the first one is meant for constrain 2 bodies and the second one for single body constraints. --This line, and those below, will be ignored-- SVN revision: 79848
2012-11-29 10:51:51 -08:00
void ephysics_world_constraint_add(EPhysics_World *world, EPhysics_Constraint *constraint, btGeneric6DofConstraint *bt_constraint);
void ephysics_world_constraint_del(EPhysics_World *world, EPhysics_Constraint *constraint, btGeneric6DofConstraint *bt_constraint);
void ephysics_body_world_boundaries_resize(EPhysics_World *world);
void ephysics_world_boundary_set(EPhysics_World *world, EPhysics_World_Boundary boundary, EPhysics_Body *body);
EPhysics_Body *ephysics_world_boundary_get(const EPhysics_World *world, EPhysics_World_Boundary boundary);
Eina_Bool ephysics_world_bodies_outside_autodel_get(const EPhysics_World *world);
btSoftBodyWorldInfo *ephysics_world_info_get(const EPhysics_World *world);
void ephysics_world_lock_take(EPhysics_World *world);
void ephysics_world_lock_release(EPhysics_World *world);
Eina_List *ephysics_world_constraints_get(EPhysics_World *world);
void ephysics_world_force_update_set(EPhysics_World *world, Eina_Bool force_update);
/* Body */
Eina_Bool ephysics_body_filter_collision(EPhysics_Body *body0, EPhysics_Body *body1);
void ephysics_body_evas_object_update_select(EPhysics_Body *body);
void ephysics_orphan_body_del(EPhysics_Body *body);
void ephysics_body_contact_processed(EPhysics_Body *body, EPhysics_Body *contact_body, btVector3 position);
btRigidBody *ephysics_body_rigid_body_get(const EPhysics_Body *body);
btSoftBody *ephysics_body_soft_body_get(const EPhysics_Body *body);
void ephysics_body_active_set(EPhysics_Body *body, Eina_Bool active);
void ephysics_body_recalc(EPhysics_Body *body, double rate);
void ephysics_body_forces_apply(EPhysics_Body *body);
void ephysics_body_activate(const EPhysics_Body *body, Eina_Bool activate);
void ephysics_body_evas_objects_restack(EPhysics_World *world);
void ephysics_body_soft_body_dragging_apply(EPhysics_Body *body);
void ephysics_body_soft_body_bending_constraints_generate(EPhysics_Body *body);
void ephysics_constraint_body_del(EPhysics_Body *body);
/* Camera */
EPhysics_Camera *ephysics_camera_add(EPhysics_World *world);
void ephysics_camera_del(EPhysics_Camera *camera);
void ephysics_camera_moved_set(EPhysics_Camera *camera, Eina_Bool moved);
Eina_Bool ephysics_camera_moved_get(const EPhysics_Camera *camera);
void ephysics_camera_target_moved(EPhysics_Camera *camera, EPhysics_Body *body);
/* Shape */
const Eina_Inlist *ephysics_shape_points_get(const EPhysics_Shape *shape);
/* Constraint */
void ephysics_constraint_recalc(EPhysics_Constraint *constraint, double rate);
#ifdef __cplusplus
}
#endif
#endif