aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvictorfisac <victorfisac@gmail.com>2016-03-23 15:50:41 +0100
committervictorfisac <victorfisac@gmail.com>2016-03-23 15:50:41 +0100
commit60223a358b691c2769c362597c49e124b045209c (patch)
tree2850c0cbd1ec53e25cf70fd951518efd636b2066 /src
parentc453ac8265525fd7a88ed616c7e5bdf1e6d6b09f (diff)
downloadraylib-60223a358b691c2769c362597c49e124b045209c.tar.gz
raylib-60223a358b691c2769c362597c49e124b045209c.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/physac.c49
-rw-r--r--src/physac.h6
-rw-r--r--src/raylib.h4
3 files changed, 31 insertions, 28 deletions
diff --git a/src/physac.c b/src/physac.c
index 718a06bb..e3f956ba 100644
--- a/src/physac.c
+++ b/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]->collider.type == COLLIDER_RECTANGLE)
+ if(physicObjects[i]->rigidbody.enabled)
{
- 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;
+ // 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);
- // Apply force to the physic object
- ApplyForce(physicObjects[i], (Vector2){ distance.x*force, distance.y*force });
+ // 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);
+ }
}
}
}
diff --git a/src/physac.h b/src/physac.h
index c70dbbe2..37544686 100644
--- a/src/physac.h
+++ b/src/physac.h
@@ -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 {
diff --git a/src/raylib.h b/src/raylib.h
index a87b58da..1782fef3 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -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 {