Blender V4.3
RBI_api.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2013 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10#ifndef __RB_API_H__
11#define __RB_API_H__
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17/* API Notes:
18 * Currently, this API is optimized for Bullet RigidBodies, and doesn't
19 * take into account other Physics Engines. Some tweaking may be necessary
20 * to allow other systems to be used, in particular there may be references
21 * to data-types that aren't used here...
22 *
23 * -- Joshua Leung (22 June 2010)
24 */
25
26/* ********************************** */
27/* Partial Type Defines - Aliases for the type of data we store */
28
29// ----------
30
31/* Dynamics World */
33
34/* Rigid Body */
35typedef struct rbRigidBody rbRigidBody;
36
37/* Collision Shape */
39
40/* Mesh Data (for Collision Shapes of Meshes) */
41typedef struct rbMeshData rbMeshData;
42
43/* Constraint */
45
46/* ********************************** */
47/* Dynamics World Methods */
48
49/* Setup ---------------------------- */
50
51/* Create a new dynamics world instance */
52/* TODO: add args to set the type of constraint solvers, etc. */
53rbDynamicsWorld *RB_dworld_new(const float gravity[3]);
54
55/* Delete the given dynamics world, and free any extra data it may require */
57
58/* Settings ------------------------- */
59
60/* Gravity */
61void RB_dworld_get_gravity(rbDynamicsWorld *world, float g_out[3]);
62void RB_dworld_set_gravity(rbDynamicsWorld *world, const float g_in[3]);
63
64/* Constraint Solver */
65void RB_dworld_set_solver_iterations(rbDynamicsWorld *world, int num_solver_iterations);
66/* Split Impulse */
67void RB_dworld_set_split_impulse(rbDynamicsWorld *world, int split_impulse);
68
69/* Simulation ----------------------- */
70
71/* Step the simulation by the desired amount (in seconds) with extra controls on substep sizes and
72 * maximum substeps */
74 float timeStep,
75 int maxSubSteps,
76 float timeSubStep);
77
78/* Export -------------------------- */
79
80/* Exports the dynamics world to physics simulator's serialisation format */
81void RB_dworld_export(rbDynamicsWorld *world, const char *filename);
82
83/* ********************************** */
84/* Rigid Body Methods */
85
86/* Setup ---------------------------- */
87
88/* Add RigidBody to dynamics world */
89void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_groups);
90
91/* Remove RigidBody from dynamics world */
93
94/* Collision detection */
95
97 rbRigidBody *object,
98 const float loc_start[3],
99 const float loc_end[3],
100 float v_location[3],
101 float v_hitpoint[3],
102 float v_normal[3],
103 int *r_hit);
104
105/* ............ */
106
107/* Create new RigidBody instance */
108rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4]);
109
110/* Delete the given RigidBody instance */
111void RB_body_delete(rbRigidBody *body);
112
113/* Settings ------------------------- */
114
115/* 'Type' */
116void RB_body_set_type(rbRigidBody *body, int type, float mass);
117
118/* ............ */
119
120/* Collision Shape */
122
123/* ............ */
124
125/* Mass */
126float RB_body_get_mass(rbRigidBody *body);
127void RB_body_set_mass(rbRigidBody *body, float value);
128
129/* Friction */
131void RB_body_set_friction(rbRigidBody *body, float value);
132
133/* Restitution */
135void RB_body_set_restitution(rbRigidBody *body, float value);
136
137/* Damping */
139void RB_body_set_linear_damping(rbRigidBody *body, float value);
140
142void RB_body_set_angular_damping(rbRigidBody *body, float value);
143
144void RB_body_set_damping(rbRigidBody *object, float linear, float angular);
145
146/* Sleeping Thresholds */
148void RB_body_set_linear_sleep_thresh(rbRigidBody *body, float value);
149
151void RB_body_set_angular_sleep_thresh(rbRigidBody *body, float value);
152
153void RB_body_set_sleep_thresh(rbRigidBody *body, float linear, float angular);
154
155/* Linear Velocity */
156void RB_body_get_linear_velocity(rbRigidBody *body, float v_out[3]);
157void RB_body_set_linear_velocity(rbRigidBody *body, const float v_in[3]);
158
159/* Angular Velocity */
160void RB_body_get_angular_velocity(rbRigidBody *body, float v_out[3]);
161void RB_body_set_angular_velocity(rbRigidBody *body, const float v_in[3]);
162
163/* Linear/Angular Factor, used to lock translation/rotation axes */
164void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z);
165void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z);
166
167/* Kinematic State */
168void RB_body_set_kinematic_state(rbRigidBody *body, int kinematic);
169
170/* RigidBody Interface - Rigid Body Activation States */
172void RB_body_set_activation_state(rbRigidBody *body, int use_deactivation);
173void RB_body_activate(rbRigidBody *body);
175
176/* Simulation ----------------------- */
177
178/* Get current transform matrix of RigidBody to use in Blender (OpenGL format) */
179void RB_body_get_transform_matrix(rbRigidBody *body, float m_out[4][4]);
180
181/* Set RigidBody's location and rotation */
182void RB_body_set_loc_rot(rbRigidBody *body, const float loc[3], const float rot[4]);
183/* Set RigidBody's local scaling */
184void RB_body_set_scale(rbRigidBody *body, const float scale[3]);
185
186/* ............ */
187
188/* Get RigidBody's position as a vector */
189void RB_body_get_position(rbRigidBody *body, float v_out[3]);
190/* Get RigidBody's orientation as a quaternion */
191void RB_body_get_orientation(rbRigidBody *body, float v_out[4]);
192/* Get RigidBody's local scale as a vector */
193void RB_body_get_scale(rbRigidBody *object, float v_out[3]);
194
195/* ............ */
196
197void RB_body_apply_central_force(rbRigidBody *body, const float v_in[3]);
198
199/* ********************************** */
200/* Collision Shape Methods */
201
202/* Setup (Standard Shapes) ----------- */
203
204rbCollisionShape *RB_shape_new_box(float x, float y, float z);
206rbCollisionShape *RB_shape_new_capsule(float radius, float height);
207rbCollisionShape *RB_shape_new_cone(float radius, float height);
208rbCollisionShape *RB_shape_new_cylinder(float radius, float height);
209
210/* Setup (Convex Hull) ------------ */
211
213 const float *verts, int stride, int count, float margin, bool *can_embed);
214
215/* Setup (Triangle Mesh) ---------- */
216
217/* 1 */
218rbMeshData *RB_trimesh_data_new(int num_tris, int num_verts);
219void RB_trimesh_add_vertices(rbMeshData *mesh, float *vertices, int num_verts, int vert_stride);
221 rbMeshData *mesh, int num, int index0, int index1, int index2);
222void RB_trimesh_finish(rbMeshData *mesh);
223/* 2a - Triangle Meshes */
225/* 2b - GImpact Meshes */
227
228/* Compound Shape ---------------- */
229
232 rbCollisionShape *shape,
233 const float loc[3],
234 const float rot[4]);
235
236/* Cleanup --------------------------- */
237
239
240/* Settings --------------------------- */
241
242/* Collision Margin */
244void RB_shape_set_margin(rbCollisionShape *shape, float value);
245
247 const float *vertices,
248 int num_verts,
249 int vert_stride,
250 const float min[3],
251 const float max[3]);
252
253/* ********************************** */
254/* Constraints */
255
256/* Setup ----------------------------- */
257
258/* Add Rigid Body Constraint to simulation world */
259void RB_dworld_add_constraint(rbDynamicsWorld *world, rbConstraint *con, int disable_collisions);
260
261/* Remove Rigid Body Constraint from simulation world */
263
264rbConstraint *RB_constraint_new_point(const float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2);
266 float orn[4],
267 rbRigidBody *rb1,
268 rbRigidBody *rb2);
270 float orn[4],
271 rbRigidBody *rb1,
272 rbRigidBody *rb2);
274 float orn[4],
275 rbRigidBody *rb1,
276 rbRigidBody *rb2);
278 float orn[4],
279 rbRigidBody *rb1,
280 rbRigidBody *rb2);
282 float orn[4],
283 rbRigidBody *rb1,
284 rbRigidBody *rb2);
286 float orn[4],
287 rbRigidBody *rb1,
288 rbRigidBody *rb2);
290 float orn[4],
291 rbRigidBody *rb1,
292 rbRigidBody *rb2);
294 float orn[4],
295 rbRigidBody *rb1,
296 rbRigidBody *rb2);
297
298/* ............ */
299
300/* Cleanup --------------------------- */
301
303
304/* Settings --------------------------- */
305
306/* Enable or disable constraint */
308
309/* Limits */
310#define RB_LIMIT_LIN_X 0
311#define RB_LIMIT_LIN_Y 1
312#define RB_LIMIT_LIN_Z 2
313#define RB_LIMIT_ANG_X 3
314#define RB_LIMIT_ANG_Y 4
315#define RB_LIMIT_ANG_Z 5
316/* Bullet uses the following convention:
317 * - lower limit == upper limit -> axis is locked
318 * - lower limit > upper limit -> axis is free
319 * - lower limit < upper limit -> axis is limited in given range
320 */
321void RB_constraint_set_limits_hinge(rbConstraint *con, float lower, float upper);
322void RB_constraint_set_limits_slider(rbConstraint *con, float lower, float upper);
324 rbConstraint *con, float lin_lower, float lin_upper, float ang_lower, float ang_upper);
325void RB_constraint_set_limits_6dof(rbConstraint *con, int axis, float lower, float upper);
326
327/* 6dof spring specific */
328void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int axis, float stiffness);
329void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float damping);
330void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int enable);
332
333/* 6dof spring 2 specific */
334void RB_constraint_set_limits_6dof_spring2(rbConstraint *con, int axis, float lower, float upper);
335void RB_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, float stiffness);
336void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float damping);
337void RB_constraint_set_spring_6dof_spring2(rbConstraint *con, int axis, int enable);
339
340/* motors */
341void RB_constraint_set_enable_motor(rbConstraint *con, int enable_lin, int enable_ang);
343 float max_impulse_lin,
344 float max_impulse_ang);
346 float velocity_lin,
347 float velocity_ang);
348
349/* Set number of constraint solver iterations made per step, this overrided world setting
350 * To use default set it to -1 */
351void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations);
352
353/* Set breaking impulse threshold, if constraint shouldn't break it can be set to FLT_MAX */
354void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold);
355
356/* ********************************** */
357
358#ifdef __cplusplus
359}
360#endif
361
362#endif /* __RB_API_H__ */
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between world
void RB_constraint_set_max_impulse_motor(rbConstraint *con, float max_impulse_lin, float max_impulse_ang)
void RB_dworld_set_solver_iterations(rbDynamicsWorld *world, int num_solver_iterations)
void RB_dworld_set_split_impulse(rbDynamicsWorld *world, int split_impulse)
void RB_dworld_delete(rbDynamicsWorld *world)
void RB_body_set_collision_shape(rbRigidBody *body, rbCollisionShape *shape)
void RB_body_set_sleep_thresh(rbRigidBody *body, float linear, float angular)
void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int axis, float stiffness)
rbCollisionShape * RB_shape_new_box(float x, float y, float z)
void RB_body_set_linear_velocity(rbRigidBody *body, const float v_in[3])
rbConstraint * RB_constraint_new_fixed(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
rbConstraint * RB_constraint_new_6dof_spring(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_dworld_add_constraint(rbDynamicsWorld *world, rbConstraint *con, int disable_collisions)
void RB_body_set_friction(rbRigidBody *body, float value)
void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float damping)
int RB_body_get_activation_state(rbRigidBody *body)
rbCollisionShape * RB_shape_new_gimpact_mesh(rbMeshData *mesh)
void RB_shape_delete(rbCollisionShape *shape)
rbCollisionShape * RB_shape_new_trimesh(rbMeshData *mesh)
rbConstraint * RB_constraint_new_slider(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_get_angular_velocity(rbRigidBody *body, float v_out[3])
float RB_body_get_angular_damping(rbRigidBody *body)
void RB_constraint_set_enabled(rbConstraint *con, int enabled)
void RB_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, float stiffness)
void RB_body_deactivate(rbRigidBody *body)
void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con)
float RB_body_get_linear_sleep_thresh(rbRigidBody *body)
void RB_constraint_set_limits_slider(rbConstraint *con, float lower, float upper)
rbConstraint * RB_constraint_new_piston(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
float RB_body_get_restitution(rbRigidBody *body)
void RB_body_set_kinematic_state(rbRigidBody *body, int kinematic)
void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold)
void RB_dworld_remove_constraint(rbDynamicsWorld *world, rbConstraint *con)
void RB_world_convex_sweep_test(rbDynamicsWorld *world, rbRigidBody *object, const float loc_start[3], const float loc_end[3], float v_location[3], float v_hitpoint[3], float v_normal[3], int *r_hit)
void RB_body_set_activation_state(rbRigidBody *body, int use_deactivation)
void RB_constraint_set_enable_motor(rbConstraint *con, int enable_lin, int enable_ang)
void RB_body_get_linear_velocity(rbRigidBody *body, float v_out[3])
void RB_dworld_set_gravity(rbDynamicsWorld *world, const float g_in[3])
rbDynamicsWorld * RB_dworld_new(const float gravity[3])
void RB_trimesh_add_triangle_indices(rbMeshData *mesh, int num, int index0, int index1, int index2)
rbMeshData * RB_trimesh_data_new(int num_tris, int num_verts)
void RB_trimesh_add_vertices(rbMeshData *mesh, float *vertices, int num_verts, int vert_stride)
void RB_constraint_set_limits_6dof_spring2(rbConstraint *con, int axis, float lower, float upper)
void RB_body_set_loc_rot(rbRigidBody *body, const float loc[3], const float rot[4])
rbConstraint * RB_constraint_new_6dof(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
float RB_body_get_angular_sleep_thresh(rbRigidBody *body)
void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations)
rbCollisionShape * RB_shape_new_cylinder(float radius, float height)
void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_groups)
void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float damping)
void RB_constraint_delete(rbConstraint *con)
void RB_body_apply_central_force(rbRigidBody *body, const float v_in[3])
void RB_body_set_damping(rbRigidBody *object, float linear, float angular)
void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body)
void RB_shape_trimesh_update(rbCollisionShape *shape, const float *vertices, int num_verts, int vert_stride, const float min[3], const float max[3])
void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int enable)
void RB_shape_set_margin(rbCollisionShape *shape, float value)
void RB_body_activate(rbRigidBody *body)
rbRigidBody * RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4])
rbConstraint * RB_constraint_new_6dof_spring2(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
float RB_body_get_linear_damping(rbRigidBody *body)
rbConstraint * RB_constraint_new_hinge(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_get_position(rbRigidBody *body, float v_out[3])
void RB_trimesh_finish(rbMeshData *mesh)
rbCollisionShape * RB_shape_new_convex_hull(const float *verts, int stride, int count, float margin, bool *can_embed)
void RB_body_delete(rbRigidBody *body)
void RB_dworld_export(rbDynamicsWorld *world, const char *filename)
rbConstraint * RB_constraint_new_point(const float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_set_type(rbRigidBody *body, int type, float mass)
float RB_shape_get_margin(rbCollisionShape *shape)
rbCollisionShape * RB_shape_new_cone(float radius, float height)
void RB_body_set_mass(rbRigidBody *body, float value)
void RB_constraint_set_limits_piston(rbConstraint *con, float lin_lower, float lin_upper, float ang_lower, float ang_upper)
void RB_dworld_get_gravity(rbDynamicsWorld *world, float g_out[3])
void RB_constraint_set_limits_6dof(rbConstraint *con, int axis, float lower, float upper)
void RB_body_set_restitution(rbRigidBody *body, float value)
void RB_compound_add_child_shape(rbCollisionShape *collisionShape, rbCollisionShape *shape, const float loc[3], const float rot[4])
void RB_body_get_orientation(rbRigidBody *body, float v_out[4])
void RB_constraint_set_limits_hinge(rbConstraint *con, float lower, float upper)
void RB_constraint_set_target_velocity_motor(rbConstraint *con, float velocity_lin, float velocity_ang)
rbCollisionShape * RB_shape_new_sphere(float radius)
float RB_body_get_friction(rbRigidBody *body)
void RB_body_set_angular_velocity(rbRigidBody *body, const float v_in[3])
void RB_body_set_angular_damping(rbRigidBody *body, float value)
void RB_body_set_linear_sleep_thresh(rbRigidBody *body, float value)
float RB_body_get_mass(rbRigidBody *body)
void RB_body_get_transform_matrix(rbRigidBody *body, float m_out[4][4])
void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z)
rbCollisionShape * RB_shape_new_compound(void)
void RB_dworld_step_simulation(rbDynamicsWorld *world, float timeStep, int maxSubSteps, float timeSubStep)
void RB_constraint_set_equilibrium_6dof_spring2(rbConstraint *con)
rbCollisionShape * RB_shape_new_capsule(float radius, float height)
rbConstraint * RB_constraint_new_motor(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_set_scale(rbRigidBody *body, const float scale[3])
void RB_body_get_scale(rbRigidBody *object, float v_out[3])
void RB_constraint_set_spring_6dof_spring2(rbConstraint *con, int axis, int enable)
void RB_body_set_angular_sleep_thresh(rbRigidBody *body, float value)
void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z)
void RB_body_set_linear_damping(rbRigidBody *body, float value)
struct rbConstraint rbConstraint
Definition RBI_api.h:44
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
#define rot(x, k)
static float verts[][3]
bool enabled
int count
#define min(a, b)
Definition sort.c:32
float max