2015-12-21 23:12:35 +03:00
|
|
|
/**********************************************************************************************
|
|
|
|
*
|
2016-03-05 19:05:02 +03:00
|
|
|
* [physac] raylib physics module - Basic functions to apply physics to 2D objects
|
2015-12-21 23:12:35 +03:00
|
|
|
*
|
2016-03-23 17:50:41 +03:00
|
|
|
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria
|
2015-12-21 23:12:35 +03:00
|
|
|
*
|
|
|
|
* This software is provided "as-is", without any express or implied warranty. In no event
|
|
|
|
* will the authors be held liable for any damages arising from the use of this software.
|
|
|
|
*
|
|
|
|
* Permission is granted to anyone to use this software for any purpose, including commercial
|
|
|
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
|
|
*
|
|
|
|
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
|
|
* wrote the original software. If you use this software in a product, an acknowledgment
|
|
|
|
* in the product documentation would be appreciated but is not required.
|
|
|
|
*
|
|
|
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
|
|
* as being the original software.
|
|
|
|
*
|
|
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
|
|
*
|
|
|
|
**********************************************************************************************/
|
|
|
|
|
2015-12-30 15:42:59 +03:00
|
|
|
#ifndef PHYSAC_H
|
|
|
|
#define PHYSAC_H
|
2015-12-21 23:12:35 +03:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// Defines and Macros
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// ...
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// Types and Structures Definition
|
2016-03-05 19:05:02 +03:00
|
|
|
// NOTE: Below types are required for PHYSAC_STANDALONE usage
|
2015-12-21 23:12:35 +03:00
|
|
|
//----------------------------------------------------------------------------------
|
2016-03-05 19:05:02 +03:00
|
|
|
|
|
|
|
// Vector2 type
|
|
|
|
typedef struct Vector2 {
|
|
|
|
float x;
|
|
|
|
float y;
|
|
|
|
} Vector2;
|
|
|
|
|
2016-03-16 14:45:01 +03:00
|
|
|
typedef enum { COLLIDER_CIRCLE, COLLIDER_RECTANGLE } ColliderType;
|
2015-12-21 23:12:35 +03:00
|
|
|
|
|
|
|
typedef struct Transform {
|
|
|
|
Vector2 position;
|
2016-03-23 17:50:41 +03:00
|
|
|
float rotation; // Radians (not used)
|
|
|
|
Vector2 scale; // Just for rectangle physic objects, for circle physic objects use collider radius and keep scale as { 0, 0 }
|
2015-12-21 23:12:35 +03:00
|
|
|
} Transform;
|
|
|
|
|
|
|
|
typedef struct Rigidbody {
|
2016-03-05 19:05:02 +03:00
|
|
|
bool enabled; // Acts as kinematic state (collisions are calculated anyway)
|
2015-12-21 23:12:35 +03:00
|
|
|
float mass;
|
|
|
|
Vector2 acceleration;
|
|
|
|
Vector2 velocity;
|
|
|
|
bool applyGravity;
|
2016-03-05 19:05:02 +03:00
|
|
|
bool isGrounded;
|
|
|
|
float friction; // Normalized value
|
2016-03-16 14:45:01 +03:00
|
|
|
float bounciness;
|
2015-12-21 23:12:35 +03:00
|
|
|
} Rigidbody;
|
|
|
|
|
|
|
|
typedef struct Collider {
|
|
|
|
bool enabled;
|
|
|
|
ColliderType type;
|
2016-03-16 14:48:30 +03:00
|
|
|
Rectangle bounds; // Used for COLLIDER_RECTANGLE
|
|
|
|
int radius; // Used for COLLIDER_CIRCLE
|
2015-12-21 23:12:35 +03:00
|
|
|
} Collider;
|
|
|
|
|
2016-05-20 11:53:58 +03:00
|
|
|
typedef struct PhysicObjectData {
|
2016-03-05 19:05:02 +03:00
|
|
|
unsigned int id;
|
|
|
|
Transform transform;
|
|
|
|
Rigidbody rigidbody;
|
|
|
|
Collider collider;
|
|
|
|
bool enabled;
|
2016-05-20 11:53:58 +03:00
|
|
|
} PhysicObjectData, *PhysicObject;
|
2016-03-05 19:05:02 +03:00
|
|
|
|
2015-12-21 23:12:35 +03:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" { // Prevents name mangling of functions
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
2016-03-05 19:05:02 +03:00
|
|
|
// Module Functions Declaration
|
2015-12-21 23:12:35 +03:00
|
|
|
//----------------------------------------------------------------------------------
|
2016-03-16 14:45:01 +03:00
|
|
|
void InitPhysics(Vector2 gravity); // Initializes pointers array (just pointers, fixed size)
|
2016-03-05 19:05:02 +03:00
|
|
|
void UpdatePhysics(); // Update physic objects, calculating physic behaviours and collisions detection
|
|
|
|
void ClosePhysics(); // Unitialize all physic objects and empty the objects pool
|
2015-12-21 23:12:35 +03:00
|
|
|
|
2016-05-20 11:53:58 +03:00
|
|
|
PhysicObject CreatePhysicObject(Vector2 position, float rotation, Vector2 scale); // Create a new physic object dinamically, initialize it and add to pool
|
|
|
|
void DestroyPhysicObject(PhysicObject pObj); // Destroy a specific physic object and take it out of the list
|
2015-12-21 23:12:35 +03:00
|
|
|
|
2016-05-20 11:53:58 +03:00
|
|
|
void ApplyForce(PhysicObject pObj, Vector2 force); // Apply directional force to a physic object
|
2016-03-16 14:45:01 +03:00
|
|
|
void ApplyForceAtPosition(Vector2 position, float force, float radius); // Apply radial force to all physic objects in range
|
|
|
|
|
2016-03-05 19:05:02 +03:00
|
|
|
Rectangle TransformToRectangle(Transform transform); // Convert Transform data type to Rectangle (position and scale)
|
2015-12-21 23:12:35 +03:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-12-30 15:42:59 +03:00
|
|
|
#endif // PHYSAC_H
|