Bladeren bron

Merge pull request #241 from raysan5/develop

Integrate develop branch
Ray 8 jaren geleden
bovenliggende
commit
6d1519c132
8 gewijzigde bestanden met toevoegingen van 83 en 86 verwijderingen
  1. 5 2
      examples/physics_demo.c
  2. 5 2
      examples/physics_friction.c
  3. 5 2
      examples/physics_movement.c
  4. 5 2
      examples/physics_restitution.c
  5. 5 2
      examples/physics_shatter.c
  6. 20 69
      src/physac.h
  7. 8 7
      src/raylib.h
  8. 30 0
      src/shapes.c

+ 5 - 2
examples/physics_demo.c

@@ -3,9 +3,12 @@
 *   Physac - Physics demo
 *
 *   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
-*   The file pthreadGC2.dll is required to run the program; you can find it in 'src\external'
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*   
+*   Copyright (c) 2017 Victor Fisac
 *
 ********************************************************************************************/
 

+ 5 - 2
examples/physics_friction.c

@@ -3,9 +3,12 @@
 *   Physac - Physics friction
 *
 *   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
-*   The file pthreadGC2.dll is required to run the program; you can find it in 'src\external'
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*   
+*   Copyright (c) 2017 Victor Fisac
 *
 ********************************************************************************************/
 

+ 5 - 2
examples/physics_movement.c

@@ -3,9 +3,12 @@
 *   Physac - Physics movement
 *
 *   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
-*   The file pthreadGC2.dll is required to run the program; you can find it in 'src\external'
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*   
+*   Copyright (c) 2017 Victor Fisac
 *
 ********************************************************************************************/
 

+ 5 - 2
examples/physics_restitution.c

@@ -3,9 +3,12 @@
 *   Physac - Physics restitution
 *
 *   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
-*   The file pthreadGC2.dll is required to run the program; you can find it in 'src\external'
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*   
+*   Copyright (c) 2017 Victor Fisac
 *
 ********************************************************************************************/
 

+ 5 - 2
examples/physics_shatter.c

@@ -3,9 +3,12 @@
 *   Physac - Body shatter
 *
 *   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
-*   The file pthreadGC2.dll is required to run the program; you can find it in 'src\external'
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*   
+*   Copyright (c) 2017 Victor Fisac
 *
 ********************************************************************************************/
 

+ 20 - 69
src/physac.h

@@ -38,13 +38,20 @@
 *       You can define your own malloc/free implementation replacing stdlib.h malloc()/free() functions.
 *       Otherwise it will include stdlib.h and use the C standard library malloc()/free() function.
 *
+*
+*   NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations.
+*
+*   Use the following code to compile (-static -lpthread):
+*   gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib_icon -static -lraylib -lpthread 
+*   -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition
+*
 *   VERY THANKS TO:
 *       Ramón Santamaria (@raysan5)
 *
 *
 *   LICENSE: zlib/libpng
 *
-*   Copyright (c) 2016 Victor Fisac
+*   Copyright (c) 2017 Victor Fisac
 *
 *   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.
@@ -361,70 +368,6 @@ PHYSACDEF PhysicsBody CreatePhysicsBodyCircle(Vector2 pos, float radius, float d
 {
     PhysicsBody newBody = CreatePhysicsBodyPolygon(pos, radius, PHYSAC_CIRCLE_VERTICES, density);
     return newBody;
-
-    /*PhysicsBody newBody = (PhysicsBody)PHYSAC_MALLOC(sizeof(PhysicsBodyData));
-    usedMemory += sizeof(PhysicsBodyData);
-
-    int newId = -1;
-    for (int i = 0; i < PHYSAC_MAX_BODIES; i++)
-    {
-        int currentId = i;
-
-        // Check if current id already exist in other physics body
-        for (int k = 0; k < physicsBodiesCount; k++)
-        {
-            if (bodies[k]->id == currentId)
-            {
-                currentId++;
-                break;
-            }
-        }
-
-        // If it is not used, use it as new physics body id
-        if (currentId == i)
-        {
-            newId = i;
-            break;
-        }
-    }
-
-    if (newId != -1)
-    {
-        // Initialize new body with generic values
-        newBody->id = newId;
-        newBody->enabled = true;
-        newBody->position = pos;    
-        newBody->velocity = (Vector2){ 0 };
-        newBody->force = (Vector2){ 0 };
-        newBody->angularVelocity = 0;
-        newBody->torque = 0;
-        newBody->orient = 0;
-        newBody->mass = PHYSAC_PI*radius*radius*density;
-        newBody->inverseMass = ((newBody->mass != 0.0f) ? 1.0f/newBody->mass : 0.0f);
-        newBody->inertia = newBody->mass*radius*radius;
-        newBody->inverseInertia = ((newBody->inertia != 0.0f) ? 1.0f/newBody->inertia : 0.0f);
-        newBody->staticFriction = 0;
-        newBody->dynamicFriction = 0;
-        newBody->restitution = 0;
-        newBody->useGravity = true;
-        newBody->freezeOrient = false;
-        newBody->shape.type = PHYSICS_CIRCLE;
-        newBody->shape.body = newBody;
-        newBody->shape.radius = radius;
-
-        // Add new body to bodies pointers array and update bodies count
-        bodies[physicsBodiesCount] = newBody;
-        physicsBodiesCount++;
-
-        #if defined(PHYSAC_DEBUG)
-            printf("[PHYSAC] created circle physics body id %i\n", newBody->id);
-        #endif
-    }
-    #if defined(PHYSAC_DEBUG)
-        else printf("[PHYSAC] new physics body creation failed because there is any available id to use\n");
-    #endif
-
-    return newBody;*/
 }
 
 // Creates a new rectangle physics body with generic parameters
@@ -1130,6 +1073,7 @@ static void *PhysicsLoop(void *arg)
 // Physics steps calculations (dynamics, collisions and position corrections)
 static void PhysicsStep(void)
 {
+    // Update current steps count
     stepsCount++;
 
     // Clear previous generated collisions information
@@ -1138,6 +1082,13 @@ static void PhysicsStep(void)
         PhysicsManifold manifold = contacts[i];
         if (manifold != NULL) DestroyPhysicsManifold(manifold);
     }
+    
+    // Reset physics bodies grounded state
+    for (int i = 0; i < physicsBodiesCount; i++)
+    {
+        PhysicsBody body = bodies[i];
+        body->isGrounded = false;
+    }
 
     // Generate new collision information
     for (int i = 0; i < physicsBodiesCount; i++)
@@ -1347,9 +1298,9 @@ static void SolvePhysicsManifold(PhysicsManifold manifold)
         } break;
         default: break;
     }
-
-    // Update physics body grounded state if normal direction is downside
-    manifold->bodyB->isGrounded = (manifold->normal.y < 0);
+    
+    // Update physics body grounded state if normal direction is down and grounded state is not set yet in previous manifolds
+    if (!manifold->bodyB->isGrounded) manifold->bodyB->isGrounded = (manifold->normal.y < 0);
 }
 
 // Solves collision between two circle shape physics bodies
@@ -1388,7 +1339,7 @@ static void SolveCircleToCircle(PhysicsManifold manifold)
     }
 
     // Update physics body grounded state if normal direction is down
-    if (manifold->normal.y < 0) bodyA->isGrounded = true;
+    if (!bodyA->isGrounded) bodyA->isGrounded = (manifold->normal.y < 0);
 }
 
 // Solves collision between a circle to a polygon shape physics bodies

+ 8 - 7
src/raylib.h

@@ -98,13 +98,13 @@
 #define RAD2DEG (180.0f/PI)
 
 // raylib Config Flags
-#define FLAG_SHOW_LOGO              1       // Set this flag to show raylib logo at startup
-#define FLAG_FULLSCREEN_MODE        2       // Set this flag to run program in fullscreen
-#define FLAG_WINDOW_RESIZABLE       4       // Set this flag to allow resizable window
-#define FLAG_WINDOW_DECORATED       8       // Set this flag to show window decoration (frame and buttons)
-#define FLAG_WINDOW_TRANSPARENT    16       // Set this flag to allow transparent window
-#define FLAG_MSAA_4X_HINT          32       // Set this flag to try enabling MSAA 4X
-#define FLAG_VSYNC_HINT            64       // Set this flag to try enabling V-Sync on GPU
+#define FLAG_SHOW_LOGO              1       // Set to show raylib logo at startup
+#define FLAG_FULLSCREEN_MODE        2       // Set to run program in fullscreen
+#define FLAG_WINDOW_RESIZABLE       4       // Set to allow resizable window
+#define FLAG_WINDOW_DECORATED       8       // Set to show window decoration (frame and buttons)
+#define FLAG_WINDOW_TRANSPARENT    16       // Set to allow transparent window
+#define FLAG_MSAA_4X_HINT          32       // Set to try enabling MSAA 4X
+#define FLAG_VSYNC_HINT            64       // Set to try enabling V-Sync on GPU
 
 // Keyboard Function Keys
 #define KEY_SPACE            32
@@ -763,6 +763,7 @@ RLAPI void DrawPixel(int posX, int posY, Color color);
 RLAPI void DrawPixelV(Vector2 position, Color color);                                                    // Draw a pixel (Vector version)
 RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color);                // Draw a line
 RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color);                                     // Draw a line (Vector version)
+RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color);                       // Draw a line defining thickness
 RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color);                              // Draw a color-filled circle
 RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2);       // Draw a gradient-filled circle
 RLAPI void DrawCircleV(Vector2 center, float radius, Color color);                                       // Draw a color-filled circle (Vector version)

+ 30 - 0
src/shapes.c

@@ -103,6 +103,36 @@ void DrawLineV(Vector2 startPos, Vector2 endPos, Color color)
     rlEnd();
 }
 
+// Draw a line defining thickness
+void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color)
+{
+    float dx = endPos.x - startPos.x;
+    float dy = endPos.y - startPos.y;
+    
+    float d = sqrtf(dx*dx + dy*dy);
+    float angle = asinf(dy/d);
+    
+    rlEnableTexture(GetDefaultTexture().id);
+
+    rlPushMatrix();
+        rlTranslatef((float)startPos.x, (float)startPos.y, 0);
+        rlRotatef(-RAD2DEG*angle, 0, 0, 1);
+        rlTranslatef(0, -thick/2.0f, 0);
+
+        rlBegin(RL_QUADS);
+            rlColor4ub(color.r, color.g, color.b, color.a);
+            rlNormal3f(0.0f, 0.0f, 1.0f);
+
+            rlVertex2f(0.0f, 0.0f);
+            rlVertex2f(0.0f, thick);
+            rlVertex2f(d, thick);
+            rlVertex2f(d, 0.0f);
+        rlEnd();
+    rlPopMatrix();
+
+    rlDisableTexture();
+}
+
 // Draw a color-filled circle
 void DrawCircle(int centerX, int centerY, float radius, Color color)
 {