diff --git a/raylib/build.py b/raylib/build.py index 670e741..13e02a4 100644 --- a/raylib/build.py +++ b/raylib/build.py @@ -22,62 +22,89 @@ import os import platform import sys import subprocess +import time ffibuilder = FFI() +def check_raylib_installed(): + return subprocess.run(['pkg-config', '--exists', 'raylib'], text=True, stdout=subprocess.PIPE).returncode == 0 def get_the_include_path(): - return subprocess.run(['pkg-config', '--variable=includedir', 'raylib'], stdout=subprocess.PIPE).stdout.decode( - 'utf-8').strip() + return subprocess.run(['pkg-config', '--variable=includedir', 'raylib'], text=True, stdout=subprocess.PIPE).stdout.strip() def get_the_lib_path(): - return subprocess.run(['pkg-config', '--variable=libdir', 'raylib'], stdout=subprocess.PIPE).stdout.decode( - 'utf-8').strip() + return subprocess.run(['pkg-config', '--variable=libdir', 'raylib'], text=True, stdout=subprocess.PIPE).stdout.strip() + + +def pre_process_header(filename): + print("Pre-processing "+filename) + file = open(filename, "r") + filetext = "".join([ line for line in file if '#include' not in line]) + command =['gcc', '-CC', '-P' ,'-undef', '-nostdinc', '-DRLAPI=', '-DPHYSACDEF=', '-DRAYGUIDEF=', + '-dDI', '-E', '-'] + filetext2 = subprocess.run(command, text=True, input=filetext, stdout=subprocess.PIPE).stdout + filetext3 = filetext2.replace("va_list", "void *") + filetext4 = "\n".join([ line for line in filetext3.splitlines() if not line.startswith("#")]) + #print(r) + return filetext4 + +def check_header_exists(file): + if not os.path.isfile(file): + print("\n\n*************** WARNING ***************\n\n") + print(file+" not found. Build will not contain these extra functions.\n\nPlease copy file from src/extras to "+file+" if you want them.\n\n") + print("**************************************\n\n") + time.sleep(1) + return False + return True + +def mangle(string): + return string + +if not check_raylib_installed(): + raise Exception("ERROR: raylib not found by pkg-config. Please install pkg-config and Raylib.") + +raylib_h = get_the_include_path() + "/raylib.h" + +if not os.path.isfile(raylib_h): + raise Exception("ERROR: "+raylib_h+" not found. Please install Raylib.") + + ffi_includes = """ #include "raylib.h" -#define RAYGUI_IMPLEMENTATION -#define RAYGUI_SUPPORT_RICONS -#include "raygui.h" -#define PHYSAC_IMPLEMENTATION -#include "physac.h" """ +raygui_h = get_the_include_path() + "/raygui.h" +if check_header_exists(raygui_h): + ffi_includes += """ + #define RAYGUI_IMPLEMENTATION + #define RAYGUI_SUPPORT_RICONS + #include "raygui.h" + """ + + +physac_h = get_the_include_path() + "/physac.h" +if check_header_exists(physac_h): + ffi_includes += """ + #define PHYSAC_IMPLEMENTATION + #include "physac.h" + """ + + + + -def mangle(file): - result = "" - skip = False - for line in open(file): - line = line.strip().replace("va_list", "void *") + "\n" - if skip: - if line.startswith("#endif"): - skip = False - continue - if line.startswith("#if defined(__cplusplus)"): - skip = True - continue - if line.startswith("#endif // RAYGUI_H"): - break - if line.startswith("#"): - continue - if line.startswith("RLAPI"): - line = line.replace('RLAPI ', '') - if line.startswith("RAYGUIDEF"): - line = line.replace('RAYGUIDEF ', '') - if line.startswith("PHYSACDEF"): - line = line.replace('PHYSACDEF ', '') - result += line - # print(line) - return result def build_linux(): print("BUILDING FOR LINUX") - ffibuilder.cdef(mangle(get_the_include_path() + "/raylib.h")) - ffibuilder.cdef(open("raylib/raygui_modified.h").read().replace('RAYGUIDEF ', '')) - ffibuilder.cdef(open("raylib/physac_modified.h").read().replace('PHYSACDEF ', '')) + ffibuilder.cdef(pre_process_header(raylib_h)) + if os.path.isfile(raygui_h): + ffibuilder.cdef(pre_process_header(raygui_h)) + if os.path.isfile(physac_h): + ffibuilder.cdef(pre_process_header(physac_h)) ffibuilder.set_source("raylib._raylib_cffi", ffi_includes, extra_link_args=[get_the_lib_path() + '/libraylib.a', '-lm', '-lpthread', '-lGLU', '-lGL', '-lrt', @@ -92,8 +119,8 @@ def build_linux(): def build_windows(): print("BUILDING FOR WINDOWS") ffibuilder.cdef(mangle("raylib/raylib.h")) - ffibuilder.cdef(open("raylib/raygui_modified.h").read().replace('RAYGUIDEF ', '').replace('bool', 'int')) - ffibuilder.cdef(open("raylib/physac_modified.h").read().replace('PHYSACDEF ', '').replace('bool', 'int')) + ffibuilder.cdef(open("raylib/raygui_modified.h").read().replace('RAYGUIDEF ', '')) + ffibuilder.cdef(open("raylib/physac_modified.h").read().replace('PHYSACDEF ', '')) ffibuilder.set_source("raylib._raylib_cffi", ffi_includes, extra_link_args=['/NODEFAULTLIB:MSVCRTD'], libraries=['raylib', 'gdi32', 'shell32', 'user32', 'OpenGL32', 'winmm'], @@ -105,9 +132,11 @@ def build_windows(): def build_mac(): print("BUILDING FOR MAC") - ffibuilder.cdef(mangle(get_the_include_path() + "/raylib.h")) - ffibuilder.cdef(open("raylib/raygui_modified.h").read().replace('RAYGUIDEF ', '')) - ffibuilder.cdef(open("raylib/physac_modified.h").read().replace('PHYSACDEF ', '')) + ffibuilder.cdef(pre_process_header(raylib_h)) + if os.path.isfile(raygui_h): + ffibuilder.cdef(pre_process_header(raygui_h)) + if os.path.isfile(physac_h): + ffibuilder.cdef(pre_process_header(physac_h)) ffibuilder.set_source("raylib._raylib_cffi", ffi_includes, extra_link_args=[get_the_lib_path() + '/libraylib.a', '-framework', 'OpenGL', '-framework', 'Cocoa', '-framework', 'IOKit', '-framework', 'CoreFoundation', '-framework', @@ -121,9 +150,11 @@ def build_mac(): def build_rpi_nox(): print("BUILDING FOR RASPBERRY PI") - ffibuilder.cdef(mangle(get_the_include_path() + "/raylib.h")) - ffibuilder.cdef(open("raylib/raygui_modified.h").read().replace('RAYGUIDEF ', '')) - ffibuilder.cdef(open("raylib/physac_modified.h").read().replace('PHYSACDEF ', '')) + ffibuilder.cdef(pre_process_header(raylib_h)) + if os.path.isfile(raygui_h): + ffibuilder.cdef(pre_process_header(raygui_h)) + if os.path.isfile(physac_h): + ffibuilder.cdef(pre_process_header(physac_h)) ffibuilder.set_source("raylib._raylib_cffi", ffi_includes, extra_link_args=[get_the_lib_path() + '/libraylib.a', '/opt/vc/lib/libEGL_static.a', '/opt/vc/lib/libGLESv2_static.a', diff --git a/test_physac.py b/test_physac.py deleted file mode 100644 index 2564f74..0000000 --- a/test_physac.py +++ /dev/null @@ -1,70 +0,0 @@ -from raylib import * - -screenWidth = 800 -screenHeight = 450 - -SetConfigFlags(FLAG_MSAA_4X_HINT) -InitWindow(screenWidth, screenHeight, b"[physac] Basic demo") - - -logoX = screenWidth - MeasureText(b"Physac", 30) - 10 -logoY = 15 - - -InitPhysics() - - -floor = CreatePhysicsBodyRectangle([screenWidth/2, screenHeight ], 500, 100, 10) -floor.enabled = False - - -circle = CreatePhysicsBodyCircle([screenWidth/2, screenHeight/2], 45, 10) -circle.enabled = False - -SetTargetFPS(60) - -while not WindowShouldClose(): - - UpdatePhysics(); - - if IsMouseButtonPressed(MOUSE_LEFT_BUTTON): - body = CreatePhysicsBodyPolygon(GetMousePosition(), GetRandomValue(20, 80), GetRandomValue(3, 8), 10) - - elif IsMouseButtonPressed(MOUSE_RIGHT_BUTTON): - CreatePhysicsBodyCircle(GetMousePosition(), GetRandomValue(10, 45), 10) - - - bodiesCount = GetPhysicsBodiesCount() - for i in range(bodiesCount): - body = GetPhysicsBody(i) - if body and (body.position.y > screenHeight*2): - DestroyPhysicsBody(body) - - - BeginDrawing() - ClearBackground(BLACK) - DrawFPS(screenWidth - 90, screenHeight - 30) - - - bodiesCount = GetPhysicsBodiesCount() - for i in range(bodiesCount): - body = GetPhysicsBody(i) - if body: - vertexCount = GetPhysicsShapeVerticesCount(i) - for j in range(vertexCount): - vertexA = GetPhysicsShapeVertex(body, j) - jj = j + 1 if (j + 1) < vertexCount else 0 - vertexB = GetPhysicsShapeVertex(body, jj) - DrawLineV(vertexA, vertexB, GREEN) - - DrawText(b"Left mouse button to create a polygon", 10, 10, 10, WHITE) - DrawText(b"Right mouse button to create a circle", 10, 25, 10, WHITE) - - DrawText(b"Physac", logoX, logoY, 30, WHITE) - DrawText(b"Powered by", logoX + 50, logoY - 7, 10, WHITE) - - EndDrawing() - -ClosePhysics() - -CloseWindow() \ No newline at end of file diff --git a/test_physac2.py b/test_physac2.py deleted file mode 100644 index ff5749a..0000000 --- a/test_physac2.py +++ /dev/null @@ -1,76 +0,0 @@ -from raylib import * - -VELOCITY = 0.5 - -screenWidth = 800 -screenHeight = 450 - -SetConfigFlags(FLAG_MSAA_4X_HINT) -InitWindow(screenWidth, screenHeight, b"[physac] Basic demo") -logoX = screenWidth - MeasureText(b"Physac", 30) - 10 -logoY = 15 - - -InitPhysics() - -floor = CreatePhysicsBodyRectangle([screenWidth/2, screenHeight ], screenWidth, 100, 10) -platformLeft = CreatePhysicsBodyRectangle([screenWidth*0.25, screenHeight*0.6 ], screenWidth*0.25, 10, 10) -platformRight = CreatePhysicsBodyRectangle([screenWidth*0.75, screenHeight*0.6 ], screenWidth*0.25, 10, 10) -wallLeft = CreatePhysicsBodyRectangle([-5, screenHeight/2 ], 10, screenHeight, 10) -wallRight = CreatePhysicsBodyRectangle([screenWidth + 5, screenHeight/2 ], 10, screenHeight, 10) - - -floor.enabled = False -platformLeft.enabled = False -platformRight.enabled = False -wallLeft.enabled = False -wallRight.enabled = False - - -body = CreatePhysicsBodyRectangle([screenWidth/2, screenHeight/2 ], 50, 50, 1) -body.freezeOrient = True - -SetTargetFPS(60) - -while not WindowShouldClose(): - - UpdatePhysics(); - - if IsKeyDown(KEY_RIGHT): - body.velocity.x = VELOCITY - elif IsKeyDown(KEY_LEFT): - body.velocity.x = -VELOCITY - - - if IsKeyDown(KEY_UP) and body.isGrounded: - body.velocity.y = -VELOCITY*4 - - BeginDrawing() - - ClearBackground(BLACK) - - DrawFPS(screenWidth - 90, screenHeight - 30) - - - bodiesCount = GetPhysicsBodiesCount() - for i in range(bodiesCount): - body = GetPhysicsBody(i) - vertexCount = GetPhysicsShapeVerticesCount(i) - for j in range(vertexCount): - vertexA = GetPhysicsShapeVertex(body, j) - - jj = j + 1 if j + 1 < vertexCount else 0 - vertexB = GetPhysicsShapeVertex(body, jj) - - DrawLineV(vertexA, vertexB, GREEN) - - DrawText(b"Use 'ARROWS' to move player", 10, 10, 10, WHITE) - - DrawText(b"Physac", logoX, logoY, 30, WHITE) - DrawText(b"Powered by", logoX + 50, logoY - 7, 10, WHITE) - - EndDrawing() - -ClosePhysics() - -CloseWindow() \ No newline at end of file diff --git a/version.py b/version.py index b9d9451..4358d9c 100644 --- a/version.py +++ b/version.py @@ -1 +1 @@ -__version__ = "4.0a5" \ No newline at end of file +__version__ = "4.0a6" \ No newline at end of file