Physac redesign (3/3)
Finally, physics update is handled in main thread using steps to get accuracy in collisions detection instead of moving it to a new thread. Examples are finished as simple and clear as I could. Finally, physac module is MORE simpler than in the first version, calculation everything by the same way for both types of physic objects. I tryed to add rotated physics a couple of times but I didn't get anything good to get a base to improve it. Maybe for the next version... No bugs or strange behaviours found during testing.
This commit is contained in:
parent
c453ac8265
commit
60223a358b
7 changed files with 68 additions and 40 deletions
49
src/physac.c
49
src/physac.c
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* [physac] raylib physics module - Basic functions to apply physics to 2D objects
|
||||
*
|
||||
* Copyright (c) 2015 Victor Fisac and Ramon Santamaria
|
||||
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria
|
||||
*
|
||||
* 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.
|
||||
|
@ -75,10 +75,7 @@ void InitPhysics(Vector2 gravity)
|
|||
void UpdatePhysics()
|
||||
{
|
||||
// Reset all physic objects is grounded state
|
||||
for (int i = 0; i < physicObjectsCount; i++)
|
||||
{
|
||||
if (physicObjects[i]->rigidbody.enabled) physicObjects[i]->rigidbody.isGrounded = false;
|
||||
}
|
||||
for (int i = 0; i < physicObjectsCount; i++) physicObjects[i]->rigidbody.isGrounded = false;
|
||||
|
||||
for (int steps = 0; steps < PHYSICS_STEPS; steps++)
|
||||
{
|
||||
|
@ -537,26 +534,32 @@ void ApplyForceAtPosition(Vector2 position, float force, float radius)
|
|||
{
|
||||
for(int i = 0; i < physicObjectsCount; i++)
|
||||
{
|
||||
// Calculate direction and distance between force and physic object pposition
|
||||
Vector2 distance = (Vector2){ physicObjects[i]->transform.position.x - position.x, physicObjects[i]->transform.position.y - position.y };
|
||||
if(physicObjects[i]->rigidbody.enabled)
|
||||
{
|
||||
// Calculate direction and distance between force and physic object pposition
|
||||
Vector2 distance = (Vector2){ physicObjects[i]->transform.position.x - position.x, physicObjects[i]->transform.position.y - position.y };
|
||||
|
||||
if(physicObjects[i]->collider.type == COLLIDER_RECTANGLE)
|
||||
{
|
||||
distance.x += physicObjects[i]->transform.scale.x/2;
|
||||
distance.y += physicObjects[i]->transform.scale.y/2;
|
||||
}
|
||||
|
||||
float distanceLength = Vector2Length(distance);
|
||||
|
||||
// Check if physic object is in force range
|
||||
if(distanceLength <= radius)
|
||||
{
|
||||
// Normalize force direction
|
||||
distance.x /= distanceLength;
|
||||
distance.y /= -distanceLength;
|
||||
if(physicObjects[i]->collider.type == COLLIDER_RECTANGLE)
|
||||
{
|
||||
distance.x += physicObjects[i]->transform.scale.x/2;
|
||||
distance.y += physicObjects[i]->transform.scale.y/2;
|
||||
}
|
||||
|
||||
// Apply force to the physic object
|
||||
ApplyForce(physicObjects[i], (Vector2){ distance.x*force, distance.y*force });
|
||||
float distanceLength = Vector2Length(distance);
|
||||
|
||||
// Check if physic object is in force range
|
||||
if(distanceLength <= radius)
|
||||
{
|
||||
// Normalize force direction
|
||||
distance.x /= distanceLength;
|
||||
distance.y /= -distanceLength;
|
||||
|
||||
// Calculate final force
|
||||
Vector2 finalForce = { distance.x*force, distance.y*force };
|
||||
|
||||
// Apply force to the physic object
|
||||
ApplyForce(physicObjects[i], finalForce);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* [physac] raylib physics module - Basic functions to apply physics to 2D objects
|
||||
*
|
||||
* Copyright (c) 2015 Victor Fisac and Ramon Santamaria
|
||||
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria
|
||||
*
|
||||
* 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.
|
||||
|
@ -44,8 +44,8 @@ typedef enum { COLLIDER_CIRCLE, COLLIDER_RECTANGLE } ColliderType;
|
|||
|
||||
typedef struct Transform {
|
||||
Vector2 position;
|
||||
float rotation;
|
||||
Vector2 scale;
|
||||
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 }
|
||||
} Transform;
|
||||
|
||||
typedef struct Rigidbody {
|
||||
|
|
|
@ -498,8 +498,8 @@ typedef enum { COLLIDER_CIRCLE, COLLIDER_RECTANGLE } ColliderType;
|
|||
|
||||
typedef struct Transform {
|
||||
Vector2 position;
|
||||
float rotation;
|
||||
Vector2 scale;
|
||||
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 }
|
||||
} Transform;
|
||||
|
||||
typedef struct Rigidbody {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue