| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -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 |