| 
    Nudge Physics
    
   A single file, header-only 3D physics library 
   | 
 
Namespaces | |
| namespace | extra | 
Classes | |
| struct | ActiveBodies | 
| The ActiveBodies struct.  More... | |
| struct | Arena | 
| The Arena struct used internally.  More... | |
| struct | BodyConnections | 
| [unused] The BodyConnections struct is actually just sketched in nudge (it was intended to add custom constraints)  More... | |
| struct | BodyData | 
| The main struct contained in context_t: it exposes every per-body data in the simulation, except collisions.  More... | |
| struct | BodyFilter | 
| The BodyFilter struct.  More... | |
| struct | BodyInfo | 
| The BodyInfo struct contains some read-only graphic properties of the body (e.g. axis aligned bounding box and center of mass offset), and plenty of per-body user available space, handy to bind user-side structs to a nudge physic body.  More... | |
| struct | BodyLayout | 
| Per-body struct that contains the indices of the body colliders inside ColliderData::boxes and ColliderData::spheres.  More... | |
| struct | BodyMomentum | 
| The BodyMomentum struct.  More... | |
| struct | BodyPair | 
| The BodyPair struct.  More... | |
| struct | BodyProperties | 
| The BodyProperties struct.  More... | |
| struct | BoxCollider | 
| The BoxCollider struct.  More... | |
| struct | CachedContactImpulse | 
| The CachedContactImpulse struct.  More... | |
| struct | ColliderData | 
| This struct is used to access all the colliders in the physic world.  More... | |
| struct | Contact | 
| The Contact struct.  More... | |
| struct | ContactCache | 
| The ContactCache struct contains the CachedContactImpulse and persists across frames.  More... | |
| struct | ContactData | 
| The ContactData class.  More... | |
| struct | context_t | 
| Main struct of the library.  More... | |
| struct | GlobalData | 
| The GlobalData struct inglobes global fields that could not fit in the SimulationParams struct.  More... | |
| struct | KinematicData | 
| The KinematicData is composed by two arrays: an array of global key frames and an array of animations. Each animation owns a (kinematic) body index and a range of key frames.  More... | |
| struct | SimulationParams | 
| The SimulationParams struct.  More... | |
| struct | SphereCollider | 
| The SphereCollider struct.  More... | |
| struct | Transform | 
| The Transform struct.  More... | |
| union | UserData32Bit | 
| Storage struct for user data (by default used inside BodyInfo): a per-body 32-bit user space in 7 different variable names that share the same space, so that ONLY one of them must be chosen and used.  More... | |
| union | UserData64Bit | 
| Storage struct for user data (by default used inside context_t): a per-context 64-bit user space in 11 different variable names that share the same space, so that ONLY one of them must be chosen and used.  More... | |
Typedefs | |
| typedef NUDGE_COLLISION_MASK_TYPE | CollisionMask | 
| The unsigned type used for the COLLISION_GROUP_ flags; it defaults to uint8_t (i.e. 8 groups available) if C++11 is supported and NUDGE_USE_INT32_ENUMS is not defined, and to uint32_t otherwise (i.e. 32 groups available)   | |
| typedef NUDGE_FLAG_MASK_TYPE | FlagMask | 
| The unsigned type used for the BF_ flags; it defaults to uint16_t (i.e. 16 flags available) if C++11 is supported and NUDGE_USE_INT32_ENUMS is not defined, and to uint32_t otherwise (i.e. 32 flags available)   | |
Functions | |
| void | show_info () | 
| Displays basic info at program startup; very important call to detect the SIMD configuration of the program.   | |
| void | init_context_with (context_t *c, unsigned MAX_NUM_BOXES, unsigned MAX_NUM_SPHERES) | 
| Mandatory function to be called at program startup.   | |
| void | init_context (context_t *c) | 
| Mandatory function to be called at program startup.   | |
| void | destroy_context (context_t *c) | 
| Mandatory function to be called at program exit.   | |
| void | restart_context (context_t *c) | 
| Optional function that restarts a valid context, preserving the simulation settings and the allocated memory.   | |
| void | save_context (FILE *f, const context_t *c) | 
| Saves the nudge context.   | |
| void | load_context (FILE *f, context_t *c) | 
| Loads a saved nudge context.   | |
| unsigned | pre_simulation_step (context_t *c, double elapsedSecondsFromLastCall) | 
| Mandatory function that must be called once per frame.   | |
| void | simulation_step (context_t *c) | 
| Mandatory function that must be called once per frame.   | |
| float * | calculate_graphic_transform_for_body (context_t *c, unsigned body, float *pModelMatrix16Out) | 
| Function that can be used to calculate the smoothed 16-float column-major model matrix of a single body.   | |
| void | calculate_graphic_transforms (context_t *c, float *pModelMatricesOut, unsigned modelMatrixStrideInFloatUnits, int loopActiveBodiesOnly=0) | 
| Function that can be used to calculate the smoothed 16-float column-major model matrices of all the bodies together.   | |
| unsigned | add_box (context_t *c, float mass, float hsizex, float hsizey, float hsizez, const Transform *T=NULL, const float comOffset[3]=NULL) | 
| Adds a new body to the simulation with a single box collider.   | |
| unsigned | add_box (context_t *c, float mass, float hsizex, float hsizey, float hsizez, const float *mMatrix16WithoutScaling, const float comOffset[3]=NULL) | 
| unsigned | add_sphere (context_t *c, float mass, float radius, const Transform *T=NULL, const float comOffset[3]=NULL) | 
| Adds a new body to the simulation with a single sphere collider.   | |
| unsigned | add_sphere (context_t *c, float mass, float radius, const float *mMatrix16WithoutScaling, const float comOffset[3]=NULL) | 
| unsigned | add_compound (context_t *c, float mass, float inertia[3], unsigned num_boxes, const float *hsizeTriplets, const Transform *boxOffsetTransforms, unsigned num_spheres, const float *radii, const Transform *sphereOffsetTransforms, const Transform *T=NULL, const float comOffset[3]=NULL, float *centerMeshAndRetrieveOldCenter3Out=NULL) | 
| Adds a new body to the simulation with a compound collider made up of num_boxes box colliders and num_spheres sphere colliders.   | |
| unsigned | add_compound (context_t *c, float mass, float inertia[3], unsigned num_boxes, const float *hsizeTriplets, const float *boxOffsetMatrices16WithoutScaling, unsigned num_spheres, const float *radii, const float *sphereOffsetMatrices16WithoutScaling, const float *mMatrix16WithoutScaling=NULL, const float comOffset[3]=NULL, float *centerMeshAndRetrieveOldCenter3Out=NULL) | 
| unsigned | add_clone (context_t *c, unsigned body_to_clone, float mass, const Transform *T=NULL, float scale_factor=1.f, const float newComOffsetInPreScaledUnits[3]=NULL) | 
| [Experimental] Adds a new body to the simulation cloning an existing body   | |
| unsigned | add_clone (context_t *c, unsigned body_to_clone, float mass, const float *mMatrix16WithoutScaling, float scale_factor=1.f, const float newComOffsetInPreScaledUnits[3]=NULL) | 
| void | remove_body (context_t *c, unsigned body) | 
| Removes a body from the simulation.   | |
| uint32_t | colliders_get_num_remaining_boxes (context_t *c) | 
| Return the number of box colliders that can still be added to the physic world.   | |
| uint32_t | colliders_get_num_remaining_spheres (context_t *c) | 
| Return the number of sphere colliders that can still be added to the physic world.   | |
| int | can_add_box (context_t *c) | 
| int | can_add_sphere (context_t *c) | 
| int | can_add_compound (context_t *c, unsigned num_boxes, unsigned num_spheres) | 
| int | can_add_clone (context_t *c, unsigned body_to_clone) | 
| unsigned | get_next_add_body_index (context_t *c) | 
| Allows to peek the body index that is going to be returned in next add_xxx(...) call.   | |
| void | body_recalculate_bounding_box (context_t *c, uint32_t body) | 
| Recalculates the bounding box of the body (BodyInfo::aabb_center and BodyInfo::aabb_extents)   | |
| void | body_change_motion_state (nudge::context_t *c, unsigned body, nudge::FlagMask new_motion_state, float mass_fallback=1.f) | 
| [Experimental] Changes the body motion state (i.e. the BF_IS_STATIC_OR_KINEMATIC_OR_DYNAMIC group of body flags)   | |
| void | body_scale (nudge::context_t *c, unsigned body, float scale_factor, float mass_scale_factor=0.f) | 
| [Experimental] Uniformly scales the specified body incrementally   | |
| float * | body_get_velocity (context_t *c, uint32_t body) | 
| Gets the pointer to the body linear velocity (3-floats)   | |
| float * | body_get_angular_velocity (context_t *c, uint32_t body) | 
| Gets the pointer to the body angular velocity (3-floats)   | |
| float * | body_get_position (context_t *c, uint32_t body) | 
| Gets the pointer to the body position (3-floats vector)   | |
| float * | body_get_orientation (context_t *c, uint32_t body) | 
| Gets the pointer to the body orientation (4-floats quaternion in {x,y,z,w} format)   | |
| void | body_set_collision_group_and_mask (context_t *c, uint32_t body, CollisionMask single_collision_group_body_belongs_to, CollisionMask collision_group_mask_body_can_collide_with=COLLISION_GROUP_ALL) | 
| Sets the body collision group (a single value of COLLISION_GROUP_) and mask (a combination of COLLISION_GROUP_ values)   | |
| CollisionMask * | body_get_collision_group (context_t *c, uint32_t body) | 
| Gets the body collision group (a single value of COLLISION_GROUP_)   | |
| CollisionMask * | body_get_collision_mask (context_t *c, uint32_t body) | 
| Gets the body collision mask (a combination of COLLISION_GROUP_ values)   | |
| FlagMask * | body_get_flags (context_t *c, uint32_t body) | 
| Shortcut that returns a pointer to the body flags (a combination of BF_ enums)   | |
| void | kinematic_data_reserve_key_frames (KinematicData *kd, size_t new_size) | 
| Reserves additional space for KinematicData key frames.   | |
| void | kinematic_data_reserve_animations (KinematicData *kd, size_t new_size) | 
| Reserves additional space for KinematicData animations.   | |
| int | log (const char *format,...) | 
| Logging function used by the library. It defaults to printf.   | |
| int | flush (void) | 
| Flushes the log. It defaults to fflush(NUDGE_LOG_FILE_PTR)   | |
| void | contact_data_find_colliders (const context_t *c, unsigned contact_data_index, int16_t *box_collider_index_for_body_a, int16_t *sphere_collider_index_for_body_a, int16_t *box_collider_index_for_body_b, int16_t *sphere_collider_index_for_body_b, int use_relative_values_for_output_indices=0) | 
| Find out which collider belonging to body_a and body_b is involved in the collision determined by a ContactData index.   | |
| Transform * | Mat4WithoutScalingToTransform (Transform *Tout, const float *matrix16WithoutScaling) | 
| Converts a column-major 16-floats matrix without any scaling applied to a nudge::Transform.   | |
| Transform | Mat4WithoutScalingToTransform (const float *matrix16WithoutScaling) | 
| Converts a column-major 16-floats matrix without any scaling applied to a nudge::Transform.   | |
| float * | TransformToMat4 (float *matrix16Out, const Transform *T) | 
| Converts a nudge::Transform to a column-major 16-floats matrix.   | |
| void | TransformAssignToBody (context_t *c, unsigned body, Transform newT, float deltaTime, int16_t aux_body=-1) | 
| Assigns a new Transform to a body, and sets its linear and angular velocities based on the differences between the new transform and the old one: this is essential when manually moving bodies by changing their transform.   | |
| void | TransformAdvanceBodyFromVelocities (context_t *c, unsigned body, float deltaTime) | 
| Advances the body's transform based on its linear and angular velocities.   | |
| Transform | TransformSlerp (Transform T0, Transform T1, float time) | 
| Applies (spherical) lerp between T0 and T1.   | |
| Transform | TransformMul (Transform T0, Transform T1) | 
| Multiplies two transforms.   | |
| void | nm_QuatAdvance (float *__restrict qOut4, const float *__restrict q4, const float *__restrict angVel3, float halfTimeStep) | 
| Advances a quaternion given an angular velocity and a (small) time step.   | |
| float * | nm_QuatFromMat4 (float *__restrict result4, const float *__restrict m16) | 
| Turns the 3x3 submatrix of a 16-floats column-major matrix (without scaling applied) into a quaternion.   | |
| float * | nm_Mat4SetRotationFromQuat (float *__restrict result16, const float *__restrict q4) | 
| Replaces the 3x3 submatrix of a 16-floats column-major matrix with the 3x3 matrix representing the given quaternion.   | |
| float * | nm_QuatFromMat3 (float *__restrict result4, const float *__restrict m9) | 
| Turns the 3x3 9-floats column-major rotation matrix (without scaling applied) into a quaternion.   | |
| float * | nm_Mat3FromQuat (float *__restrict result9, const float *__restrict q4) | 
| Converts the given quaternion the a 3x3 9-floats column-major rotation matrix.   | |
| void | nm_QuatGetAngularVelocity (float *__restrict angVel3, const float *newQuat4, const float *oldQuat4, float halfTimeStep) | 
| Given an old and a new quaternion and a small time step, it calculates the angular velocities.   | |
| float * | nm_QuatSlerp (float *__restrict result4, const float *__restrict a4, const float *__restrict b4, float slerpTime_In_0_1, int normalizeResult4AfterLerp) | 
| Performs a spherical lerp between two quaternions (in 4-floats format)   | |
| float * | nm_QuatMul (float *qOut4, const float *a4, const float *b4) | 
| Multiplies two 4-floats quaternions.   | |
| void | nm_QuatNormalize (float *__restrict q4) | 
| normalizes a 4-floats quaternion in place   | |
| float * | nm_QuatFromAngleAxis (float *__restrict qOut4, float rfAngle, float rkAxisX, float rkAxisY, float rkAxisZ) | 
| Generates a 4-floats quaternion based on an orientation arouns an axis.   | |
| void | nm_QuatToAngleAxis (const float *__restrict q4, float *__restrict rfAngleOut1, float *__restrict rkAxisOut3) | 
| Calculates the angle-axis representation of the given 4-float quaternion.   | |
| float | nm_Vec3Normalize (float *__restrict v3) | 
| Normalizes a 3-floats vector in place.   | |
| float | nm_Vec3Normalized (float *__restrict v3Out, const float *__restrict v3) | 
| Get a normalizes copy of an input 3-floats vector.   | |
| float | nm_Vec3Dot (const float *__restrict a3, const float *__restrict b3) | 
| Computes the dot product between two 3-floats vectors.   | |
| float * | nm_Vec3Cross (float *__restrict vOut3, const float *__restrict a3, const float *__restrict b3) | 
| Computes the cross product between two 3-floats vectors.   | |
| float * | nm_QuatMulVec3 (float *__restrict vOut3, const float *__restrict q4, const float *__restrict vIn3) | 
| Transforms a 3-floats vector by a 4-floats quaternion.   | |
| float * | nm_QuatGetAxis (float *__restrict vOut3, const float *__restrict q4, float axisX, float axisY, float axisZ) | 
| Transforms a particular axis from the input quaternion space to word space.   | |
| float * | nm_QuatGetAxisX (float *__restrict axisOut3, const float *__restrict q4) | 
| float * | nm_QuatGetAxisY (float *__restrict axisOut3, const float *__restrict q4) | 
| float * | nm_QuatGetAxisZ (float *__restrict axisOut3, const float *__restrict q4) | 
| float * | nm_QuatRotate (float *__restrict qInOut4, float angle, float axisX, float axisY, float axisZ) | 
| Rotates an input 4-floats unit quaternion by an angle in radians around a specified axis.   | |
| float * | nm_Mat4Mul (float *result16, const float *ml16, const float *mr16) | 
| Multiplies two column-major 16-floats 4x4 matrices.   | |
| void | calculate_box_inertia (float result[3], float mass, float hsizex, float hsizey, float hsizez, const float comOffset[3]=NULL) | 
| void | calculate_sphere_inertia (float result[3], float mass, float radius, const float comOffset[3]=NULL, bool hollow=false) | 
| void | calculate_cylinder_inertia (float result[3], float mass, float radius, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_capsule_inertia (float result[3], float mass, float radius, float halfCylinderHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_torus_inertia (float result[3], float mass, float majorRadius, float minorRadius, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_hollow_cylinder_inertia (float result[3], float mass, float R, float r, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_cone_inertia (float result[3], float mass, float radius, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_box_inertia_inverse (float result[3], float mass, float hsizex, float hsizey, float hsizez, const float comOffset[3]=NULL) | 
| void | calculate_sphere_inertia_inverse (float result[3], float mass, float radius, const float comOffset[3]=NULL, bool hollow=false) | 
| void | calculate_cylinder_inertia_inverse (float result[3], float mass, float radius, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_capsule_inertia_inverse (float result[3], float mass, float radius, float halfCylinderHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_torus_inertia_inverse (float result[3], float mass, float majorRadius, float minorRadius, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_hollow_cylinder_inertia_inverse (float result[3], float mass, float R, float r, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
| void | calculate_cone_inertia_inverse (float result[3], float mass, float radius, float halfHeight, AxisEnum upAxis=AXIS_Y, const float comOffset[3]=NULL) | 
The unsigned type used for the COLLISION_GROUP_ flags; it defaults to uint8_t (i.e. 8 groups available) if C++11 is supported and NUDGE_USE_INT32_ENUMS is not defined, and to uint32_t otherwise (i.e. 32 groups available)
| typedef NUDGE_FLAG_MASK_TYPE nudge::FlagMask | 
The unsigned type used for the BF_ flags; it defaults to uint16_t (i.e. 16 flags available) if C++11 is supported and NUDGE_USE_INT32_ENUMS is not defined, and to uint32_t otherwise (i.e. 32 flags available)
The CollisionMaskEnum enum.
| Enumerator | |
|---|---|
| COLLISION_GROUP_DEFAULT | |
| COLLISION_GROUP_A | |
| COLLISION_GROUP_B | |
| COLLISION_GROUP_C | |
| COLLISION_GROUP_D | |
| COLLISION_GROUP_E | |
| COLLISION_GROUP_F | |
| COLLISION_GROUP_G | |
| COLLISION_GROUP_ALL | |
| enum nudge::BodyFlagEnum : FlagMask | 
The BodyFlagEnum enum.
| Enumerator | |
|---|---|
| BF_HAS_COM_OFFSET | read-only [internal usage: automatically set when bodies are created]  | 
| BF_IS_DISABLED | [experimental] if used, it's better to set the body to static, reset its velocities and set its collision group and mask both to zero (TODO: test if this is really necessary)  | 
| BF_IS_REMOVED | read-only [internal flag added when bodies are removed]  | 
| BF_IS_DISABLED_OR_REMOVED | read-only flag useful to filter out bodies excluded from simulation  | 
| BF_IS_STATIC | read-only [internal flag added when bodies are added]  | 
| BF_IS_KINEMATIC | read-only [internal flag added when bodies are added]  | 
| BF_IS_DYNAMIC | read-only [internal flag added when bodies are added]  | 
| BF_NEVER_SLEEPING | [experimental] affects only dynamic bodies  | 
| BF_HAS_DIFFERENT_GRAVITY_MODE | [experimental] inverts the GF_USE_GLOBAL_GRAVITY mode in c->global_data.flags on a per-body base  | 
| BF_HAS_DIFFERENT_AUX_BODIES_RESET_MODE | [experimental] inverts the GF_DONT_RESET_AUX_BODIES mode in c->global_data.flags on a per-body base  | 
| BF_IS_CHARACTER | [unused, not implemented, removable] flag added for user convenience  | 
| BF_IS_PLATFORM | [unused, not implemented, removable] flag added for user convenience  | 
| BF_IS_SENSOR | [unused, not implemented, removable] flag added for user convenience  | 
| BF_IS_FRUSTUM_CULLED | [unused, not implemented, removable] flag added for user convenience  | 
| BF_IS_DISABLED_OR_REMOVED_OR_FRUSTUM_CULLED | [unused, not implemented, removable] flag added for user convenience  | 
| BF_IS_STATIC_OR_KINEMATIC | read-only [internal flag]  | 
| BF_IS_STATIC_OR_DYNAMIC | read-only [internal flag]  | 
| BF_IS_KINEMATIC_OR_DYNAMIC | read-only [internal flag]  | 
| BF_IS_STATIC_OR_KINEMATIC_OR_DYNAMIC | read-only [internal flag]  | 
| BF_IS_STATIC_OR_KINEMATIC_OR_DISABLED_OR_REMOVED | read-only [internal flag]  | 
The GlobalDataMaskEnum enum.
| Enumerator | |
|---|---|
| GF_USE_GLOBAL_GRAVITY | this flag disables per-body gravity and uses GlobalData::gravity instead (disabled by default)  | 
| GF_DONT_RESET_AUX_BODIES | if set nudge avoids resetting per-body BodyInfo::aux_bodies[] (to -1) every frame (valid for dynamic bodies in the c->active_bodies list only): this allows the use of the BodyInfo::sk_user field for dynamic bodies too (disabled by default)  | 
| enum nudge::AxisEnum | 
      
  | 
  inline | 
Gets the pointer to the body linear velocity (3-floats)
| c | the nudge context | 
| body | the index of the body | 
      
  | 
  inline | 
Gets the pointer to the body angular velocity (3-floats)
| c | the nudge context | 
| body | the index of the body | 
      
  | 
  inline | 
Gets the pointer to the body position (3-floats vector)
| c | the nudge context | 
| body | the index of the body | 
      
  | 
  inline | 
Gets the pointer to the body orientation (4-floats quaternion in {x,y,z,w} format)
| c | the nudge context | 
| body | the index of the body |