|
@@ -196,6 +196,7 @@ extern "C" { // Prevents name mangling of fun
|
|
|
// Module Functions Declaration
|
|
|
//----------------------------------------------------------------------------------
|
|
|
PHYSACDEF void InitPhysics(void); // Initializes physics values, pointers and creates physics loop thread
|
|
|
+PHYSACDEF void RunPhysicsStep(void); // Run physics step, to be used if PHYSICS_NO_THREADS is set in your main loop
|
|
|
PHYSACDEF bool IsPhysicsEnabled(void); // Returns true if physics thread is currently enabled
|
|
|
PHYSACDEF void SetPhysicsGravity(float x, float y); // Sets physics global gravity force
|
|
|
PHYSACDEF PhysicsBody CreatePhysicsBodyCircle(Vector2 pos, float radius, float density); // Creates a new circle physics body with generic parameters
|
|
@@ -245,19 +246,18 @@ PHYSACDEF void ClosePhysics(void);
|
|
|
#endif
|
|
|
|
|
|
// Time management functionality
|
|
|
+#include <time.h> // Required for: time(), clock_gettime()
|
|
|
#if defined(_WIN32)
|
|
|
// Functions required to query time on Windows
|
|
|
int __stdcall QueryPerformanceCounter(unsigned long long int *lpPerformanceCount);
|
|
|
int __stdcall QueryPerformanceFrequency(unsigned long long int *lpFrequency);
|
|
|
- #include <time.h>
|
|
|
#elif defined(__linux__)
|
|
|
#if _POSIX_C_SOURCE < 199309L
|
|
|
#undef _POSIX_C_SOURCE
|
|
|
#define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
|
|
#endif
|
|
|
#include <sys/time.h> // Required for: timespec
|
|
|
- #include <time.h> // Required for: clock_gettime()
|
|
|
-#elif defined(__APPLE__) // macOS also defines __MACH__
|
|
|
+#elif defined(__APPLE__) // macOS also defines __MACH__
|
|
|
#include <mach/mach_time.h> // Required for: mach_absolute_time()
|
|
|
#endif
|
|
|
|
|
@@ -356,7 +356,10 @@ PHYSACDEF void InitPhysics(void)
|
|
|
// Create physics thread using POSIXS thread libraries
|
|
|
pthread_create(&physicsThreadId, NULL, &PhysicsLoop, NULL);
|
|
|
#endif
|
|
|
-
|
|
|
+
|
|
|
+ // Initialize high resolution timer
|
|
|
+ InitTimer();
|
|
|
+
|
|
|
#if defined(PHYSAC_DEBUG)
|
|
|
printf("[PHYSAC] physics module initialized successfully\n");
|
|
|
#endif
|
|
@@ -1010,33 +1013,10 @@ static void *PhysicsLoop(void *arg)
|
|
|
physicsThreadEnabled = true;
|
|
|
accumulator = 0;
|
|
|
|
|
|
- // Initialize high resolution timer
|
|
|
- InitTimer();
|
|
|
-
|
|
|
// Physics update loop
|
|
|
while (physicsThreadEnabled)
|
|
|
{
|
|
|
- // Calculate current time
|
|
|
- currentTime = GetCurrentTime();
|
|
|
-
|
|
|
- // Calculate current delta time
|
|
|
- deltaTime = currentTime - startTime;
|
|
|
-
|
|
|
- // Store the time elapsed since the last frame began
|
|
|
- accumulator += deltaTime;
|
|
|
-
|
|
|
- // Clamp accumulator to max time step to avoid bad performance
|
|
|
- MathClamp(&accumulator, 0.0, PHYSAC_MAX_TIMESTEP);
|
|
|
-
|
|
|
- // Fixed time stepping loop
|
|
|
- while (accumulator >= PHYSAC_DESIRED_DELTATIME)
|
|
|
- {
|
|
|
- PhysicsStep();
|
|
|
- accumulator -= deltaTime;
|
|
|
- }
|
|
|
-
|
|
|
- // Record the starting of this frame
|
|
|
- startTime = currentTime;
|
|
|
+ RunPhysicsStep();
|
|
|
}
|
|
|
|
|
|
// Unitialize physics manifolds dynamic memory allocations
|
|
@@ -1160,6 +1140,32 @@ static void PhysicsStep(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// Wrapper to ensure PhysicsStep is run with at a fixed time step
|
|
|
+PHYSACDEF void RunPhysicsStep(void)
|
|
|
+{
|
|
|
+ // Calculate current time
|
|
|
+ currentTime = GetCurrentTime();
|
|
|
+
|
|
|
+ // Calculate current delta time
|
|
|
+ deltaTime = currentTime - startTime;
|
|
|
+
|
|
|
+ // Store the time elapsed since the last frame began
|
|
|
+ accumulator += deltaTime;
|
|
|
+
|
|
|
+ // Clamp accumulator to max time step to avoid bad performance
|
|
|
+ MathClamp(&accumulator, 0.0, PHYSAC_MAX_TIMESTEP);
|
|
|
+
|
|
|
+ // Fixed time stepping loop
|
|
|
+ while (accumulator >= PHYSAC_DESIRED_DELTATIME)
|
|
|
+ {
|
|
|
+ PhysicsStep();
|
|
|
+ accumulator -= deltaTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Record the starting of this frame
|
|
|
+ startTime = currentTime;
|
|
|
+}
|
|
|
+
|
|
|
// Finds a valid index for a new manifold initialization
|
|
|
static int FindAvailableManifoldIndex()
|
|
|
{
|
|
@@ -2048,4 +2054,4 @@ static inline Vector2 Mat2MultiplyVector2(Mat2 matrix, Vector2 vector)
|
|
|
return (Vector2){ matrix.m00*vector.x + matrix.m01*vector.y, matrix.m10*vector.x + matrix.m11*vector.y };
|
|
|
}
|
|
|
|
|
|
-#endif // PHYSAC_IMPLEMENTATION
|
|
|
+#endif // PHYSAC_IMPLEMENTATION
|