Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
7e0324859a
|
|
@ -20,7 +20,7 @@ Here it is a list with the ones I'm aware of:
|
||||||
| raylib-goplus | 2.6-dev | [Go](https://golang.org/) | https://github.com/Lachee/raylib-goplus |
|
| raylib-goplus | 2.6-dev | [Go](https://golang.org/) | https://github.com/Lachee/raylib-goplus |
|
||||||
| ray-go | 2.6-dev | [Go](https://golang.org/) | https://github.com/hecate-tech/ray-go |
|
| ray-go | 2.6-dev | [Go](https://golang.org/) | https://github.com/hecate-tech/ray-go |
|
||||||
| go-raylib | 3.5 | [Go](https://golang.org/) | https://github.com/chunqian/go-raylib |
|
| go-raylib | 3.5 | [Go](https://golang.org/) | https://github.com/chunqian/go-raylib |
|
||||||
| raylib-rs | 3.0 | [Rust](https://www.rust-lang.org/) | https://github.com/deltaphc/raylib-rs |
|
| raylib-rs | 3.5 | [Rust](https://www.rust-lang.org/) | https://github.com/deltaphc/raylib-rs |
|
||||||
| raylib-lua | 1.7 | [Lua](http://www.lua.org/) | https://github.com/raysan5/raylib-lua |
|
| raylib-lua | 1.7 | [Lua](http://www.lua.org/) | https://github.com/raysan5/raylib-lua |
|
||||||
| raylib-lua-ffi | 2.0 | [Lua](http://www.lua.org/) | https://github.com/raysan5/raylib/issues/693 |
|
| raylib-lua-ffi | 2.0 | [Lua](http://www.lua.org/) | https://github.com/raysan5/raylib/issues/693 |
|
||||||
| raylib-lua-sol | 2.5 | [Lua](http://www.lua.org/) | https://github.com/RobLoach/raylib-lua-sol |
|
| raylib-lua-sol | 2.5 | [Lua](http://www.lua.org/) | https://github.com/RobLoach/raylib-lua-sol |
|
||||||
|
|
@ -53,7 +53,8 @@ Here it is a list with the ones I'm aware of:
|
||||||
| clj-raylib | 3.0 | [Clojure](https://clojure.org/) | https://github.com/lsevero/clj-raylib |
|
| clj-raylib | 3.0 | [Clojure](https://clojure.org/) | https://github.com/lsevero/clj-raylib |
|
||||||
| node-raylib | 3.5 | [Node.js](https://nodejs.org/en/) | https://github.com/RobLoach/node-raylib |
|
| node-raylib | 3.5 | [Node.js](https://nodejs.org/en/) | https://github.com/RobLoach/node-raylib |
|
||||||
| QuickJS-raylib | 3.0 | [QuickJS](https://bellard.org/quickjs/) | https://github.com/sntg-p/QuickJS-raylib |
|
| QuickJS-raylib | 3.0 | [QuickJS](https://bellard.org/quickjs/) | https://github.com/sntg-p/QuickJS-raylib |
|
||||||
| raylib-js | 2.6 | [JavaScript](https://en.wikipedia.org/wiki/JavaScript) | https://github.com/RobLoach/raylib-js |
|
| raylib-duktape | 2.6 | [JavaScript (Duktape)](https://en.wikipedia.org/wiki/JavaScript) | https://github.com/RobLoach/raylib-duktape |
|
||||||
|
| raylib-v7 | 3.5 | [JavaScript (v7)](https://en.wikipedia.org/wiki/JavaScript) | https://github.com/Rabios/raylib-v7 |
|
||||||
| raylib-chaiscript | 2.6 | [ChaiScript](http://chaiscript.com/) | https://github.com/RobLoach/raylib-chaiscript |
|
| raylib-chaiscript | 2.6 | [ChaiScript](http://chaiscript.com/) | https://github.com/RobLoach/raylib-chaiscript |
|
||||||
| raylib-squirrel | 2.5 | [Squirrel](http://www.squirrel-lang.org/) | https://github.com/RobLoach/raylib-squirrel |
|
| raylib-squirrel | 2.5 | [Squirrel](http://www.squirrel-lang.org/) | https://github.com/RobLoach/raylib-squirrel |
|
||||||
| racket-raylib-2d | 2.5 | [Racket](https://racket-lang.org/) | https://github.com/arvyy/racket-raylib-2d |
|
| racket-raylib-2d | 2.5 | [Racket](https://racket-lang.org/) | https://github.com/arvyy/racket-raylib-2d |
|
||||||
|
|
@ -77,7 +78,7 @@ Here it is a list with the ones I'm aware of:
|
||||||
| raylib-Ada | 3.0 | [Ada](https://www.adacore.com/about-ada) | https://github.com/mimo/raylib-Ada |
|
| raylib-Ada | 3.0 | [Ada](https://www.adacore.com/about-ada) | https://github.com/mimo/raylib-Ada |
|
||||||
| jaylib | 3.0 | [Janet](https://janet-lang.org/) | https://github.com/janet-lang/jaylib |
|
| jaylib | 3.0 | [Janet](https://janet-lang.org/) | https://github.com/janet-lang/jaylib |
|
||||||
| raykit | ? | [Kit](https://www.kitlang.org/) | https://github.com/Gamerfiend/raykit |
|
| raykit | ? | [Kit](https://www.kitlang.org/) | https://github.com/Gamerfiend/raykit |
|
||||||
| vraylib | 2.5 | [V](https://vlang.io/) | https://github.com/MajorHard/vraylib |
|
| vraylib | 3.5 | [V](https://vlang.io/) | https://github.com/waotzi/vraylib |
|
||||||
| ray.mod | 3.0 | [BlitzMax](https://blitzmax.org/) | https://github.com/bmx-ng/ray.mod |
|
| ray.mod | 3.0 | [BlitzMax](https://blitzmax.org/) | https://github.com/bmx-ng/ray.mod |
|
||||||
| ray-ocaml | 3.0 | [OCaml](https://ocaml.org/) | https://github.com/tjammer/raylib-ocaml |
|
| ray-ocaml | 3.0 | [OCaml](https://ocaml.org/) | https://github.com/tjammer/raylib-ocaml |
|
||||||
| raylib-mosaic | 3.0 | [Mosaic](https://github.com/sal55/langs/tree/master/Mosaic) | https://github.com/pluckyporcupine/raylib-mosaic |
|
| raylib-mosaic | 3.0 | [Mosaic](https://github.com/sal55/langs/tree/master/Mosaic) | https://github.com/pluckyporcupine/raylib-mosaic |
|
||||||
|
|
@ -90,6 +91,8 @@ Here it is a list with the ones I'm aware of:
|
||||||
| raylib-beef | 3.0 | [Beef](https://www.beeflang.org/) | https://github.com/M0n7y5/raylib-beef |
|
| raylib-beef | 3.0 | [Beef](https://www.beeflang.org/) | https://github.com/M0n7y5/raylib-beef |
|
||||||
| raylib-never | 3.0 | [Never](https://github.com/never-lang/never) | https://github.com/never-lang/raylib-never |
|
| raylib-never | 3.0 | [Never](https://github.com/never-lang/never) | https://github.com/never-lang/raylib-never |
|
||||||
| raylib.cbl | 2.0 | [COBOL](https://en.wikipedia.org/wiki/COBOL) | *[code examples](https://github.com/Martinfx/Cobol/tree/master/OpenCobol/Games/raylib)* |
|
| raylib.cbl | 2.0 | [COBOL](https://en.wikipedia.org/wiki/COBOL) | *[code examples](https://github.com/Martinfx/Cobol/tree/master/OpenCobol/Games/raylib)* |
|
||||||
|
| Relib | 3.5 | [ReCT](https://github.com/RedCubeDev-ByteSpace/ReCT) | https://github.com/RedCubeDev-ByteSpace/Relib |
|
||||||
|
| Harbour | 3.5 | [Harbour](https://harbour.github.io) | https://github.com/MarcosLeonardoMendezGerencir/hb-raylib |
|
||||||
|
|
||||||
|
|
||||||
Missing some language? Feel free to create a new binding! :)
|
Missing some language? Feel free to create a new binding! :)
|
||||||
|
|
|
||||||
|
|
@ -43,9 +43,9 @@ int main(void)
|
||||||
for (int i = MAX_CIRCLES - 1; i >= 0; i--)
|
for (int i = MAX_CIRCLES - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
circles[i].alpha = 0.0f;
|
circles[i].alpha = 0.0f;
|
||||||
circles[i].radius = GetRandomValue(10, 40);
|
circles[i].radius = (float)GetRandomValue(10, 40);
|
||||||
circles[i].position.x = GetRandomValue(circles[i].radius, screenWidth - circles[i].radius);
|
circles[i].position.x = (float)GetRandomValue((int)circles[i].radius, (int)(screenWidth - circles[i].radius));
|
||||||
circles[i].position.y = GetRandomValue(circles[i].radius, screenHeight - circles[i].radius);
|
circles[i].position.y = (float)GetRandomValue((int)circles[i].radius, (int)(screenHeight - circles[i].radius));
|
||||||
circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
|
circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
|
||||||
circles[i].color = colors[GetRandomValue(0, 13)];
|
circles[i].color = colors[GetRandomValue(0, 13)];
|
||||||
}
|
}
|
||||||
|
|
@ -104,9 +104,9 @@ int main(void)
|
||||||
if (circles[i].alpha <= 0.0f)
|
if (circles[i].alpha <= 0.0f)
|
||||||
{
|
{
|
||||||
circles[i].alpha = 0.0f;
|
circles[i].alpha = 0.0f;
|
||||||
circles[i].radius = GetRandomValue(10, 40);
|
circles[i].radius = (float)GetRandomValue(10, 40);
|
||||||
circles[i].position.x = GetRandomValue(circles[i].radius, screenWidth - circles[i].radius);
|
circles[i].position.x = (float)GetRandomValue((int)circles[i].radius, (int)(screenWidth - circles[i].radius));
|
||||||
circles[i].position.y = GetRandomValue(circles[i].radius, screenHeight - circles[i].radius);
|
circles[i].position.y = (float)GetRandomValue((int)circles[i].radius, (int)(screenHeight - circles[i].radius));
|
||||||
circles[i].color = colors[GetRandomValue(0, 13)];
|
circles[i].color = colors[GetRandomValue(0, 13)];
|
||||||
circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
|
circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ int main(void)
|
||||||
Sound fxWav = LoadSound("resources/sound.wav"); // Load WAV audio file
|
Sound fxWav = LoadSound("resources/sound.wav"); // Load WAV audio file
|
||||||
Sound fxOgg = LoadSound("resources/target.ogg"); // Load OGG audio file
|
Sound fxOgg = LoadSound("resources/target.ogg"); // Load OGG audio file
|
||||||
|
|
||||||
SetSoundVolume(fxWav, 0.2);
|
SetSoundVolume(fxWav, 0.2f);
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -140,8 +140,8 @@ int main(void)
|
||||||
// Draw the current buffer state proportionate to the screen
|
// Draw the current buffer state proportionate to the screen
|
||||||
for (int i = 0; i < screenWidth; i++)
|
for (int i = 0; i < screenWidth; i++)
|
||||||
{
|
{
|
||||||
position.x = i;
|
position.x = (float)i;
|
||||||
position.y = 250 + 50*data[i*MAX_SAMPLES/screenWidth]/32000;
|
position.y = 250 + 50*data[i*MAX_SAMPLES/screenWidth]/32000.0f;
|
||||||
|
|
||||||
DrawPixelV(position, RED);
|
DrawPixelV(position, RED);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,19 +30,19 @@ int main(void)
|
||||||
|
|
||||||
for (int i = 0; i < MAX_BUILDINGS; i++)
|
for (int i = 0; i < MAX_BUILDINGS; i++)
|
||||||
{
|
{
|
||||||
buildings[i].width = GetRandomValue(50, 200);
|
buildings[i].width = (float)GetRandomValue(50, 200);
|
||||||
buildings[i].height = GetRandomValue(100, 800);
|
buildings[i].height = (float)GetRandomValue(100, 800);
|
||||||
buildings[i].y = screenHeight - 130 - buildings[i].height;
|
buildings[i].y = screenHeight - 130.0f - buildings[i].height;
|
||||||
buildings[i].x = -6000 + spacing;
|
buildings[i].x = -6000.0f + spacing;
|
||||||
|
|
||||||
spacing += buildings[i].width;
|
spacing += (int)buildings[i].width;
|
||||||
|
|
||||||
buildColors[i] = (Color){ GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 };
|
buildColors[i] = (Color){ GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 };
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera2D camera = { 0 };
|
Camera2D camera = { 0 };
|
||||||
camera.target = (Vector2){ player.x + 20, player.y + 20 };
|
camera.target = (Vector2){ player.x + 20.0f, player.y + 20.0f };
|
||||||
camera.offset = (Vector2){ screenWidth/2, screenHeight/2 };
|
camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
|
||||||
camera.rotation = 0.0f;
|
camera.rotation = 0.0f;
|
||||||
camera.zoom = 1.0f;
|
camera.zoom = 1.0f;
|
||||||
|
|
||||||
|
|
@ -98,8 +98,8 @@ int main(void)
|
||||||
|
|
||||||
DrawRectangleRec(player, RED);
|
DrawRectangleRec(player, RED);
|
||||||
|
|
||||||
DrawLine(camera.target.x, -screenHeight*10, camera.target.x, screenHeight*10, GREEN);
|
DrawLine((int)camera.target.x, -screenHeight*10, (int)camera.target.x, screenHeight*10, GREEN);
|
||||||
DrawLine(-screenWidth*10, camera.target.y, screenWidth*10, camera.target.y, GREEN);
|
DrawLine(-screenWidth*10, (int)camera.target.y, screenWidth*10, (int)camera.target.y, GREEN);
|
||||||
|
|
||||||
EndMode2D();
|
EndMode2D();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ int main(void)
|
||||||
|
|
||||||
Camera2D camera = { 0 };
|
Camera2D camera = { 0 };
|
||||||
camera.target = player.position;
|
camera.target = player.position;
|
||||||
camera.offset = (Vector2){ screenWidth/2, screenHeight/2 };
|
camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
|
||||||
camera.rotation = 0.0f;
|
camera.rotation = 0.0f;
|
||||||
camera.zoom = 1.0f;
|
camera.zoom = 1.0f;
|
||||||
|
|
||||||
|
|
@ -191,14 +191,14 @@ void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float d
|
||||||
|
|
||||||
void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
|
void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
|
||||||
{
|
{
|
||||||
camera->offset = (Vector2){ width/2, height/2 };
|
camera->offset = (Vector2){ width/2.0f, height/2.0f };
|
||||||
camera->target = player->position;
|
camera->target = player->position;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
|
void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
|
||||||
{
|
{
|
||||||
camera->target = player->position;
|
camera->target = player->position;
|
||||||
camera->offset = (Vector2){ width/2, height/2 };
|
camera->offset = (Vector2){ width/2.0f, height/2.0f };
|
||||||
float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
|
float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
|
||||||
|
|
||||||
for (int i = 0; i < envItemsLength; i++)
|
for (int i = 0; i < envItemsLength; i++)
|
||||||
|
|
@ -225,7 +225,7 @@ void UpdateCameraCenterSmoothFollow(Camera2D *camera, Player *player, EnvItem *e
|
||||||
static float minEffectLength = 10;
|
static float minEffectLength = 10;
|
||||||
static float fractionSpeed = 0.8f;
|
static float fractionSpeed = 0.8f;
|
||||||
|
|
||||||
camera->offset = (Vector2){ width/2, height/2 };
|
camera->offset = (Vector2){ width/2.0f, height/2.0f };
|
||||||
Vector2 diff = Vector2Subtract(player->position, camera->target);
|
Vector2 diff = Vector2Subtract(player->position, camera->target);
|
||||||
float length = Vector2Length(diff);
|
float length = Vector2Length(diff);
|
||||||
|
|
||||||
|
|
@ -242,7 +242,7 @@ void UpdateCameraEvenOutOnLanding(Camera2D *camera, Player *player, EnvItem *env
|
||||||
static int eveningOut = false;
|
static int eveningOut = false;
|
||||||
static float evenOutTarget;
|
static float evenOutTarget;
|
||||||
|
|
||||||
camera->offset = (Vector2){ width/2, height/2 };
|
camera->offset = (Vector2){ width/2.0f, height/2.0f };
|
||||||
camera->target.x = player->position.x;
|
camera->target.x = player->position.x;
|
||||||
|
|
||||||
if (eveningOut)
|
if (eveningOut)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ int main(void)
|
||||||
for (int i = 0; i < MAX_COLUMNS; i++)
|
for (int i = 0; i < MAX_COLUMNS; i++)
|
||||||
{
|
{
|
||||||
heights[i] = (float)GetRandomValue(1, 12);
|
heights[i] = (float)GetRandomValue(1, 12);
|
||||||
positions[i] = (Vector3){ GetRandomValue(-15, 15), heights[i]/2, GetRandomValue(-15, 15) };
|
positions[i] = (Vector3){ (float)GetRandomValue(-15, 15), heights[i]/2.0f, (float)GetRandomValue(-15, 15) };
|
||||||
colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 };
|
colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ int main(void)
|
||||||
|
|
||||||
DrawText("Try selecting the box with mouse!", 240, 10, 20, DARKGRAY);
|
DrawText("Try selecting the box with mouse!", 240, 10, 20, DARKGRAY);
|
||||||
|
|
||||||
if(collision) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, screenHeight * 0.1f, 30, GREEN);
|
if(collision) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, (int)(screenHeight * 0.1f), 30, GREEN);
|
||||||
|
|
||||||
DrawFPS(10, 10);
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,12 @@
|
||||||
|
|
||||||
// NOTE: Gamepad name ID depends on drivers and OS
|
// NOTE: Gamepad name ID depends on drivers and OS
|
||||||
#if defined(PLATFORM_RPI)
|
#if defined(PLATFORM_RPI)
|
||||||
#define XBOX360_NAME_ID "Microsoft X-Box 360 pad"
|
#define XBOX360_NAME_ID "Microsoft X-Box 360 pad"
|
||||||
#define PS3_NAME_ID "PLAYSTATION(R)3 Controller"
|
#define PS3_NAME_ID "PLAYSTATION(R)3 Controller"
|
||||||
#else
|
#else
|
||||||
#define XBOX360_NAME_ID "Xbox 360 Controller"
|
#define XBOX360_NAME_ID "Xbox 360 Controller"
|
||||||
#define PS3_NAME_ID "PLAYSTATION(R)3 Controller"
|
#define XBOX360_LEGACY_NAME_ID "Xbox Controller"
|
||||||
|
#define PS3_NAME_ID "PLAYSTATION(R)3 Controller"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|
@ -61,7 +62,7 @@ int main(void)
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("GP1: %s", GetGamepadName(GAMEPAD_PLAYER1)), 10, 10, 10, BLACK);
|
DrawText(TextFormat("GP1: %s", GetGamepadName(GAMEPAD_PLAYER1)), 10, 10, 10, BLACK);
|
||||||
|
|
||||||
if (IsGamepadName(GAMEPAD_PLAYER1, XBOX360_NAME_ID))
|
if (IsGamepadName(GAMEPAD_PLAYER1, XBOX360_NAME_ID) || IsGamepadName(GAMEPAD_PLAYER1, XBOX360_LEGACY_NAME_ID))
|
||||||
{
|
{
|
||||||
DrawTexture(texXboxPad, 0, 0, DARKGRAY);
|
DrawTexture(texXboxPad, 0, 0, DARKGRAY);
|
||||||
|
|
||||||
|
|
@ -191,4 +192,4 @@ int main(void)
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@ int main(void)
|
||||||
UnloadImage(imMap); // Unload image from RAM
|
UnloadImage(imMap); // Unload image from RAM
|
||||||
|
|
||||||
Vector3 mapPosition = { -16.0f, 0.0f, -8.0f }; // Set model position
|
Vector3 mapPosition = { -16.0f, 0.0f, -8.0f }; // Set model position
|
||||||
Vector3 playerPosition = camera.position; // Set player position
|
|
||||||
|
|
||||||
SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set camera mode
|
SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set camera mode
|
||||||
|
|
||||||
|
|
@ -93,10 +92,7 @@ int main(void)
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
BeginMode3D(camera);
|
BeginMode3D(camera);
|
||||||
|
|
||||||
DrawModel(model, mapPosition, 1.0f, WHITE); // Draw maze map
|
DrawModel(model, mapPosition, 1.0f, WHITE); // Draw maze map
|
||||||
//DrawCubeV(playerPosition, (Vector3){ 0.2f, 0.4f, 0.2f }, RED); // Draw player
|
|
||||||
|
|
||||||
EndMode3D();
|
EndMode3D();
|
||||||
|
|
||||||
DrawTextureEx(cubicmap, (Vector2){ GetScreenWidth() - cubicmap.width*4 - 20, 20 }, 0.0f, 4.0f, WHITE);
|
DrawTextureEx(cubicmap, (Vector2){ GetScreenWidth() - cubicmap.width*4 - 20, 20 }, 0.0f, 4.0f, WHITE);
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness)
|
||||||
|
|
||||||
// Generate cubemap from panorama texture
|
// Generate cubemap from panorama texture
|
||||||
//--------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------
|
||||||
Texture2D panorama = LoadTexture("resources/dresden_square.hdr");
|
Texture2D panorama = LoadTexture("resources/dresden_square_2k.hdr");
|
||||||
// Load equirectangular to cubemap shader
|
// Load equirectangular to cubemap shader
|
||||||
#if defined(PLATFORM_DESKTOP)
|
#if defined(PLATFORM_DESKTOP)
|
||||||
Shader shdrCubemap = LoadShader("resources/shaders/glsl330/cubemap.vs", "resources/shaders/glsl330/cubemap.fs");
|
Shader shdrCubemap = LoadShader("resources/shaders/glsl330/cubemap.vs", "resources/shaders/glsl330/cubemap.fs");
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,9 @@
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
#include "rlgl.h"
|
||||||
|
|
||||||
|
bool useHDR = false;
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
|
@ -35,7 +38,8 @@ int main(void)
|
||||||
skybox.materials[0].shader = LoadShader("resources/shaders/glsl100/skybox.vs", "resources/shaders/glsl100/skybox.fs");
|
skybox.materials[0].shader = LoadShader("resources/shaders/glsl100/skybox.vs", "resources/shaders/glsl100/skybox.fs");
|
||||||
#endif
|
#endif
|
||||||
SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "environmentMap"), (int[1]){ MAP_CUBEMAP }, UNIFORM_INT);
|
SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "environmentMap"), (int[1]){ MAP_CUBEMAP }, UNIFORM_INT);
|
||||||
SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "vflipped"), (int[1]){ 1 }, UNIFORM_INT);
|
SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "doGamma"), (int[1]) { useHDR ? 1 : 0 }, UNIFORM_INT);
|
||||||
|
SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "vflipped"), (int[1]){ useHDR ? 1 : 0 }, UNIFORM_INT);
|
||||||
|
|
||||||
// Load cubemap shader and setup required shader locations
|
// Load cubemap shader and setup required shader locations
|
||||||
#if defined(PLATFORM_DESKTOP)
|
#if defined(PLATFORM_DESKTOP)
|
||||||
|
|
@ -45,18 +49,29 @@ int main(void)
|
||||||
#endif
|
#endif
|
||||||
SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, UNIFORM_INT);
|
SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, UNIFORM_INT);
|
||||||
|
|
||||||
// Load HDR panorama (sphere) texture
|
char skyboxFileName[256] = { 0 };
|
||||||
char panoFileName[256] = { 0 };
|
|
||||||
TextCopy(panoFileName, "resources/dresden_square_2k.hdr");
|
|
||||||
Texture2D panorama = LoadTexture(panoFileName);
|
|
||||||
|
|
||||||
// Generate cubemap (texture with 6 quads-cube-mapping) from panorama HDR texture
|
if (useHDR)
|
||||||
// NOTE 1: New texture is generated rendering to texture, shader calculates the sphere->cube coordinates mapping
|
{
|
||||||
// NOTE 2: It seems on some Android devices WebGL, fbo does not properly support a FLOAT-based attachment,
|
TextCopy(skyboxFileName, "resources/dresden_square_2k.hdr");
|
||||||
// despite texture can be successfully created.. so using UNCOMPRESSED_R8G8B8A8 instead of UNCOMPRESSED_R32G32B32A32
|
|
||||||
skybox.materials[0].maps[MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, UNCOMPRESSED_R8G8B8A8);
|
|
||||||
|
|
||||||
UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
|
// Load HDR panorama (sphere) texture
|
||||||
|
Texture2D panorama = panorama = LoadTexture(skyboxFileName);
|
||||||
|
|
||||||
|
// Generate cubemap (texture with 6 quads-cube-mapping) from panorama HDR texture
|
||||||
|
// NOTE 1: New texture is generated rendering to texture, shader calculates the sphere->cube coordinates mapping
|
||||||
|
// NOTE 2: It seems on some Android devices WebGL, fbo does not properly support a FLOAT-based attachment,
|
||||||
|
// despite texture can be successfully created.. so using UNCOMPRESSED_R8G8B8A8 instead of UNCOMPRESSED_R32G32B32A32
|
||||||
|
skybox.materials[0].maps[MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, UNCOMPRESSED_R8G8B8A8);
|
||||||
|
|
||||||
|
UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Image img = LoadImage("resources/skybox.png");
|
||||||
|
skybox.materials[0].maps[MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT); // CUBEMAP_LAYOUT_PANORAMA
|
||||||
|
UnloadImage(img);
|
||||||
|
}
|
||||||
|
|
||||||
SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set a first person camera mode
|
SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set a first person camera mode
|
||||||
|
|
||||||
|
|
@ -82,12 +97,22 @@ int main(void)
|
||||||
{
|
{
|
||||||
// Unload current cubemap texture and load new one
|
// Unload current cubemap texture and load new one
|
||||||
UnloadTexture(skybox.materials[0].maps[MAP_CUBEMAP].texture);
|
UnloadTexture(skybox.materials[0].maps[MAP_CUBEMAP].texture);
|
||||||
panorama = LoadTexture(droppedFiles[0]);
|
if (useHDR)
|
||||||
TextCopy(panoFileName, droppedFiles[0]);
|
{
|
||||||
|
Texture2D panorama = LoadTexture(droppedFiles[0]);
|
||||||
// Generate cubemap from panorama texture
|
|
||||||
skybox.materials[0].maps[MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, UNCOMPRESSED_R8G8B8A8);
|
// Generate cubemap from panorama texture
|
||||||
UnloadTexture(panorama);
|
skybox.materials[0].maps[MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, UNCOMPRESSED_R8G8B8A8);
|
||||||
|
UnloadTexture(panorama);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Image img = LoadImage(droppedFiles[0]);
|
||||||
|
skybox.materials[0].maps[MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT);
|
||||||
|
UnloadImage(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
TextCopy(skyboxFileName, droppedFiles[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,11 +127,19 @@ int main(void)
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
BeginMode3D(camera);
|
BeginMode3D(camera);
|
||||||
DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE);
|
rlDisableBackfaceCulling();
|
||||||
|
rlDisableDepthMask();
|
||||||
|
DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE);
|
||||||
|
rlEnableBackfaceCulling();
|
||||||
|
rlEnableDepthMask();
|
||||||
DrawGrid(10, 1.0f);
|
DrawGrid(10, 1.0f);
|
||||||
EndMode3D();
|
EndMode3D();
|
||||||
|
|
||||||
DrawText(TextFormat("Panorama image from hdrihaven.com: %s", GetFileName(panoFileName)), 10, GetScreenHeight() - 20, 10, BLACK);
|
if (useHDR)
|
||||||
|
DrawText(TextFormat("Panorama image from hdrihaven.com: %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK);
|
||||||
|
else
|
||||||
|
DrawText(TextFormat(": %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK);
|
||||||
|
|
||||||
DrawFPS(10, 10);
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ varying vec3 fragPosition;
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
uniform samplerCube environmentMap;
|
uniform samplerCube environmentMap;
|
||||||
uniform bool vflipped;
|
uniform bool vflipped;
|
||||||
|
uniform bool doGamma;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
|
@ -19,9 +20,11 @@ void main()
|
||||||
|
|
||||||
vec3 color = vec3(texelColor.x, texelColor.y, texelColor.z);
|
vec3 color = vec3(texelColor.x, texelColor.y, texelColor.z);
|
||||||
|
|
||||||
// Apply gamma correction
|
if (doGamma)// Apply gamma correction
|
||||||
color = color/(color + vec3(1.0));
|
{
|
||||||
color = pow(color, vec3(1.0/2.2));
|
color = color/(color + vec3(1.0));
|
||||||
|
color = pow(color, vec3(1.0/2.2));
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate final fragment color
|
// Calculate final fragment color
|
||||||
gl_FragColor = vec4(color, 1.0);
|
gl_FragColor = vec4(color, 1.0);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ in vec3 fragPosition;
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
uniform samplerCube environmentMap;
|
uniform samplerCube environmentMap;
|
||||||
uniform bool vflipped;
|
uniform bool vflipped;
|
||||||
|
uniform bool doGamma;
|
||||||
|
|
||||||
// Output fragment color
|
// Output fragment color
|
||||||
out vec4 finalColor;
|
out vec4 finalColor;
|
||||||
|
|
@ -28,9 +29,11 @@ void main()
|
||||||
if (vflipped) color = texture(environmentMap, vec3(fragPosition.x, -fragPosition.y, fragPosition.z)).rgb;
|
if (vflipped) color = texture(environmentMap, vec3(fragPosition.x, -fragPosition.y, fragPosition.z)).rgb;
|
||||||
else color = texture(environmentMap, fragPosition).rgb;
|
else color = texture(environmentMap, fragPosition).rgb;
|
||||||
|
|
||||||
// Apply gamma correction
|
if (doGamma)// Apply gamma correction
|
||||||
color = color/(color + vec3(1.0));
|
{
|
||||||
color = pow(color, vec3(1.0/2.2));
|
color = color/(color + vec3(1.0));
|
||||||
|
color = pow(color, vec3(1.0/2.2));
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate final fragment color
|
// Calculate final fragment color
|
||||||
finalColor = vec4(color, 1.0);
|
finalColor = vec4(color, 1.0);
|
||||||
|
|
|
||||||
BIN
examples/models/resources/skybox.png
Normal file
BIN
examples/models/resources/skybox.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
|
|
@ -80,7 +80,7 @@ int main(void)
|
||||||
|
|
||||||
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
||||||
int bytesRecv = 0;
|
int bytesRecv = 0;
|
||||||
if (IsSocketReady(clientResult->socket)) bytesRecv = SocketReceive(clientResult->socket, receiveBuffer, strlen(pingmsg) + 1);
|
if (IsSocketReady(clientResult->socket)) bytesRecv = SocketReceive(clientResult->socket, receiveBuffer, (int)strlen(pingmsg) + 1);
|
||||||
|
|
||||||
// If we received data, was that data a "Ping!" or a "Pong!"
|
// If we received data, was that data a "Ping!" or a "Pong!"
|
||||||
if (bytesRecv > 0)
|
if (bytesRecv > 0)
|
||||||
|
|
@ -96,12 +96,12 @@ int main(void)
|
||||||
if (ping)
|
if (ping)
|
||||||
{
|
{
|
||||||
ping = false;
|
ping = false;
|
||||||
SocketSend(clientResult->socket, pingmsg, strlen(pingmsg) + 1);
|
SocketSend(clientResult->socket, pingmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
else if (pong)
|
else if (pong)
|
||||||
{
|
{
|
||||||
pong = false;
|
pong = false;
|
||||||
SocketSend(clientResult->socket, pongmsg, strlen(pingmsg) + 1);
|
SocketSend(clientResult->socket, pongmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed = 0.0f;
|
elapsed = 0.0f;
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ int main(void)
|
||||||
|
|
||||||
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
||||||
int bytesRecv = 0;
|
int bytesRecv = 0;
|
||||||
if (IsSocketReady(connection)) bytesRecv = SocketReceive(connection, receiveBuffer, strlen(pingmsg) + 1);
|
if (IsSocketReady(connection)) bytesRecv = SocketReceive(connection, receiveBuffer, (int)strlen(pingmsg) + 1);
|
||||||
|
|
||||||
// If we received data, was that data a "Ping!" or a "Pong!"
|
// If we received data, was that data a "Ping!" or a "Pong!"
|
||||||
if (bytesRecv > 0)
|
if (bytesRecv > 0)
|
||||||
|
|
@ -110,12 +110,12 @@ int main(void)
|
||||||
if (ping)
|
if (ping)
|
||||||
{
|
{
|
||||||
ping = false;
|
ping = false;
|
||||||
SocketSend(connection, pingmsg, strlen(pingmsg) + 1);
|
SocketSend(connection, pingmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
else if (pong)
|
else if (pong)
|
||||||
{
|
{
|
||||||
pong = false;
|
pong = false;
|
||||||
SocketSend(connection, pongmsg, strlen(pingmsg) + 1);
|
SocketSend(connection, pongmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed = 0.0f;
|
elapsed = 0.0f;
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ int main(void)
|
||||||
|
|
||||||
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
|
||||||
int bytesRecv = 0;
|
int bytesRecv = 0;
|
||||||
if (IsSocketReady(clientResult->socket)) bytesRecv = SocketReceive(clientResult->socket, receiveBuffer, strlen(pingmsg) + 1);
|
if (IsSocketReady(clientResult->socket)) bytesRecv = SocketReceive(clientResult->socket, receiveBuffer, (int)strlen(pingmsg) + 1);
|
||||||
|
|
||||||
// If we received data, was that data a "Ping!" or a "Pong!"
|
// If we received data, was that data a "Ping!" or a "Pong!"
|
||||||
if (bytesRecv > 0)
|
if (bytesRecv > 0)
|
||||||
|
|
@ -89,12 +89,12 @@ int main(void)
|
||||||
if (ping)
|
if (ping)
|
||||||
{
|
{
|
||||||
ping = false;
|
ping = false;
|
||||||
SocketSend(clientResult->socket, pingmsg, strlen(pingmsg) + 1);
|
SocketSend(clientResult->socket, pingmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
else if (pong)
|
else if (pong)
|
||||||
{
|
{
|
||||||
pong = false;
|
pong = false;
|
||||||
SocketSend(clientResult->socket, pongmsg, strlen(pongmsg) + 1);
|
SocketSend(clientResult->socket, pongmsg, (int)strlen(pongmsg) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed = 0.0f;
|
elapsed = 0.0f;
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ int main(void)
|
||||||
// if (IsSocketReady(serverResult->socket)) {
|
// if (IsSocketReady(serverResult->socket)) {
|
||||||
// bytesRecv = SocketReceive(serverResult->socket, receiveBuffer, msglen);
|
// bytesRecv = SocketReceive(serverResult->socket, receiveBuffer, msglen);
|
||||||
// }
|
// }
|
||||||
int bytesRecv = SocketReceive(serverResult->socket, receiveBuffer, strlen(pingmsg) + 1);
|
int bytesRecv = SocketReceive(serverResult->socket, receiveBuffer, (int)strlen(pingmsg) + 1);
|
||||||
|
|
||||||
// If we received data, is that data a "Ping!" or a "Pong!"?
|
// If we received data, is that data a "Ping!" or a "Pong!"?
|
||||||
if (bytesRecv > 0)
|
if (bytesRecv > 0)
|
||||||
|
|
@ -93,12 +93,12 @@ int main(void)
|
||||||
if (ping)
|
if (ping)
|
||||||
{
|
{
|
||||||
ping = false;
|
ping = false;
|
||||||
SocketSend(serverResult->socket, pingmsg, strlen(pingmsg) + 1);
|
SocketSend(serverResult->socket, pingmsg, (int)strlen(pingmsg) + 1);
|
||||||
}
|
}
|
||||||
else if (pong)
|
else if (pong)
|
||||||
{
|
{
|
||||||
pong = false;
|
pong = false;
|
||||||
SocketSend(serverResult->socket, pongmsg, strlen(pongmsg) + 1);
|
SocketSend(serverResult->socket, pongmsg, (int)strlen(pongmsg) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed = 0.0f;
|
elapsed = 0.0f;
|
||||||
|
|
|
||||||
|
|
@ -112,12 +112,12 @@ EASEDEF float EaseSineOut(float t, float b, float c, float d) { return (c*sinf(t
|
||||||
EASEDEF float EaseSineInOut(float t, float b, float c, float d) { return (-c/2.0f*(cosf(PI*t/d) - 1.0f) + b); }
|
EASEDEF float EaseSineInOut(float t, float b, float c, float d) { return (-c/2.0f*(cosf(PI*t/d) - 1.0f) + b); }
|
||||||
|
|
||||||
// Circular Easing functions
|
// Circular Easing functions
|
||||||
EASEDEF float EaseCircIn(float t, float b, float c, float d) { t /= d; return (-c*(sqrt(1.0f - t*t) - 1.0f) + b); }
|
EASEDEF float EaseCircIn(float t, float b, float c, float d) { t /= d; return (-c*(sqrtf(1.0f - t*t) - 1.0f) + b); }
|
||||||
EASEDEF float EaseCircOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*sqrt(1.0f - t*t) + b); }
|
EASEDEF float EaseCircOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*sqrtf(1.0f - t*t) + b); }
|
||||||
EASEDEF float EaseCircInOut(float t, float b, float c, float d)
|
EASEDEF float EaseCircInOut(float t, float b, float c, float d)
|
||||||
{
|
{
|
||||||
if ((t/=d/2.0f) < 1.0f) return (-c/2.0f*(sqrt(1.0f - t*t) - 1.0f) + b);
|
if ((t/=d/2.0f) < 1.0f) return (-c/2.0f*(sqrtf(1.0f - t*t) - 1.0f) + b);
|
||||||
t -= 2.0f; return (c/2.0f*(sqrt(1.0f - t*t) + 1.0f) + b);
|
t -= 2.0f; return (c/2.0f*(sqrtf(1.0f - t*t) + 1.0f) + b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cubic Easing functions
|
// Cubic Easing functions
|
||||||
|
|
@ -139,15 +139,15 @@ EASEDEF float EaseQuadInOut(float t, float b, float c, float d)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exponential Easing functions
|
// Exponential Easing functions
|
||||||
EASEDEF float EaseExpoIn(float t, float b, float c, float d) { return (t == 0.0f) ? b : (c*pow(2.0f, 10.0f*(t/d - 1.0f)) + b); }
|
EASEDEF float EaseExpoIn(float t, float b, float c, float d) { return (t == 0.0f) ? b : (c * powf(2.0f, 10.0f*(t/d - 1.0f)) + b); }
|
||||||
EASEDEF float EaseExpoOut(float t, float b, float c, float d) { return (t == d) ? (b + c) : (c*(-pow(2.0f, -10.0f*t/d) + 1.0f) + b); }
|
EASEDEF float EaseExpoOut(float t, float b, float c, float d) { return (t == d) ? (b + c) : (c * (-powf(2.0f, -10.0f*t/d) + 1.0f) + b); }
|
||||||
EASEDEF float EaseExpoInOut(float t, float b, float c, float d)
|
EASEDEF float EaseExpoInOut(float t, float b, float c, float d)
|
||||||
{
|
{
|
||||||
if (t == 0.0f) return b;
|
if (t == 0.0f) return b;
|
||||||
if (t == d) return (b + c);
|
if (t == d) return (b + c);
|
||||||
if ((t/=d/2.0f) < 1.0f) return (c/2.0f*pow(2.0f, 10.0f*(t - 1.0f)) + b);
|
if ((t/=d/2.0f) < 1.0f) return (c/2.0f* powf(2.0f, 10.0f*(t - 1.0f)) + b);
|
||||||
|
|
||||||
return (c/2.0f*(-pow(2.0f, -10.0f*(t - 1.0f)) + 2.0f) + b);
|
return (c/2.0f*(-powf(2.0f, -10.0f*(t - 1.0f)) + 2.0f) + b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Back Easing functions
|
// Back Easing functions
|
||||||
|
|
@ -219,7 +219,7 @@ EASEDEF float EaseElasticIn(float t, float b, float c, float d)
|
||||||
float p = d*0.3f;
|
float p = d*0.3f;
|
||||||
float a = c;
|
float a = c;
|
||||||
float s = p/4.0f;
|
float s = p/4.0f;
|
||||||
float postFix = a*pow(2.0f, 10.0f*(t-=1.0f));
|
float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
|
||||||
|
|
||||||
return (-(postFix*sinf((t*d-s)*(2.0f*PI)/p )) + b);
|
return (-(postFix*sinf((t*d-s)*(2.0f*PI)/p )) + b);
|
||||||
}
|
}
|
||||||
|
|
@ -233,7 +233,7 @@ EASEDEF float EaseElasticOut(float t, float b, float c, float d)
|
||||||
float a = c;
|
float a = c;
|
||||||
float s = p/4.0f;
|
float s = p/4.0f;
|
||||||
|
|
||||||
return (a*pow(2.0f,-10.0f*t)*sinf((t*d-s)*(2.0f*PI)/p) + c + b);
|
return (a*powf(2.0f,-10.0f*t)*sinf((t*d-s)*(2.0f*PI)/p) + c + b);
|
||||||
}
|
}
|
||||||
|
|
||||||
EASEDEF float EaseElasticInOut(float t, float b, float c, float d)
|
EASEDEF float EaseElasticInOut(float t, float b, float c, float d)
|
||||||
|
|
@ -247,11 +247,11 @@ EASEDEF float EaseElasticInOut(float t, float b, float c, float d)
|
||||||
|
|
||||||
if (t < 1.0f)
|
if (t < 1.0f)
|
||||||
{
|
{
|
||||||
float postFix = a*pow(2.0f, 10.0f*(t-=1.0f));
|
float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
|
||||||
return -0.5f*(postFix*sinf((t*d-s)*(2.0f*PI)/p)) + b;
|
return -0.5f*(postFix*sinf((t*d-s)*(2.0f*PI)/p)) + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
float postFix = a*pow(2.0f, -10.0f*(t-=1.0f));
|
float postFix = a*powf(2.0f, -10.0f*(t-=1.0f));
|
||||||
|
|
||||||
return (postFix*sinf((t*d-s)*(2.0f*PI)/p)*0.5f + c + b);
|
return (postFix*sinf((t*d-s)*(2.0f*PI)/p)*0.5f + c + b);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,12 @@
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Declaration
|
// Module Functions Declaration
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#if !defined(_WIN32)
|
#if !defined(_MSC_VER)
|
||||||
static int kbhit(void); // Check if a key has been pressed
|
static int kbhit(void); // Check if a key has been pressed
|
||||||
static char getch(); // Get pressed character
|
static char getch(); // Get pressed character
|
||||||
|
#else
|
||||||
|
#define kbhit _kbhit
|
||||||
|
#define getch _getch
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
#define GLFW_INCLUDE_ES2
|
#define GLFW_INCLUDE_ES2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <GLFW/glfw3.h> // Windows/Context and inputs management
|
#include "GLFW/glfw3.h" // Windows/Context and inputs management
|
||||||
|
|
||||||
#include <stdio.h> // Required for: printf()
|
#include <stdio.h> // Required for: printf()
|
||||||
|
|
||||||
|
|
@ -246,13 +246,13 @@ static void DrawRectangleV(Vector2 position, Vector2 size, Color color)
|
||||||
rlBegin(RL_TRIANGLES);
|
rlBegin(RL_TRIANGLES);
|
||||||
rlColor4ub(color.r, color.g, color.b, color.a);
|
rlColor4ub(color.r, color.g, color.b, color.a);
|
||||||
|
|
||||||
rlVertex2i(position.x, position.y);
|
rlVertex2f(position.x, position.y);
|
||||||
rlVertex2i(position.x, position.y + size.y);
|
rlVertex2f(position.x, position.y + size.y);
|
||||||
rlVertex2i(position.x + size.x, position.y + size.y);
|
rlVertex2f(position.x + size.x, position.y + size.y);
|
||||||
|
|
||||||
rlVertex2i(position.x, position.y);
|
rlVertex2f(position.x, position.y);
|
||||||
rlVertex2i(position.x + size.x, position.y + size.y);
|
rlVertex2f(position.x + size.x, position.y + size.y);
|
||||||
rlVertex2i(position.x + size.x, position.y);
|
rlVertex2f(position.x + size.x, position.y);
|
||||||
rlEnd();
|
rlEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ int main(void)
|
||||||
}
|
}
|
||||||
else if (state == 4) // State 4: Reset and Replay
|
else if (state == 4) // State 4: Reset and Replay
|
||||||
{
|
{
|
||||||
if (IsKeyPressed('R'))
|
if (IsKeyPressed(KEY_R))
|
||||||
{
|
{
|
||||||
framesCounter = 0;
|
framesCounter = 0;
|
||||||
lettersCount = 0;
|
lettersCount = 0;
|
||||||
|
|
@ -157,4 +157,4 @@ int main(void)
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,8 @@ int main(void)
|
||||||
Vector2 textSize = { 0.0f, 0.0f };
|
Vector2 textSize = { 0.0f, 0.0f };
|
||||||
|
|
||||||
// Setup texture scaling filter
|
// Setup texture scaling filter
|
||||||
SetTextureFilter(font.texture, FILTER_POINT);
|
SetTextureFilter(font.texture, TEXTURE_FILTER_POINT);
|
||||||
int currentFontFilter = 0; // FILTER_POINT
|
int currentFontFilter = 0; // TEXTURE_FILTER_POINT
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
@ -56,18 +56,18 @@ int main(void)
|
||||||
// Choose font texture filter method
|
// Choose font texture filter method
|
||||||
if (IsKeyPressed(KEY_ONE))
|
if (IsKeyPressed(KEY_ONE))
|
||||||
{
|
{
|
||||||
SetTextureFilter(font.texture, FILTER_POINT);
|
SetTextureFilter(font.texture, TEXTURE_FILTER_POINT);
|
||||||
currentFontFilter = 0;
|
currentFontFilter = 0;
|
||||||
}
|
}
|
||||||
else if (IsKeyPressed(KEY_TWO))
|
else if (IsKeyPressed(KEY_TWO))
|
||||||
{
|
{
|
||||||
SetTextureFilter(font.texture, FILTER_BILINEAR);
|
SetTextureFilter(font.texture, TEXTURE_FILTER_BILINEAR);
|
||||||
currentFontFilter = 1;
|
currentFontFilter = 1;
|
||||||
}
|
}
|
||||||
else if (IsKeyPressed(KEY_THREE))
|
else if (IsKeyPressed(KEY_THREE))
|
||||||
{
|
{
|
||||||
// NOTE: Trilinear filter won't be noticed on 2D drawing
|
// NOTE: Trilinear filter won't be noticed on 2D drawing
|
||||||
SetTextureFilter(font.texture, FILTER_TRILINEAR);
|
SetTextureFilter(font.texture, TEXTURE_FILTER_TRILINEAR);
|
||||||
currentFontFilter = 2;
|
currentFontFilter = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
||||||
Texture texPattern = LoadTexture("resources/patterns.png");
|
Texture texPattern = LoadTexture("resources/patterns.png");
|
||||||
SetTextureFilter(texPattern, FILTER_TRILINEAR); // Makes the texture smoother when upscaled
|
SetTextureFilter(texPattern, TEXTURE_FILTER_TRILINEAR); // Makes the texture smoother when upscaled
|
||||||
|
|
||||||
// Coordinates for all patterns inside the texture
|
// Coordinates for all patterns inside the texture
|
||||||
const Rectangle recPattern[] = {
|
const Rectangle recPattern[] = {
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ int main(void)
|
||||||
Image parrots = LoadImage("resources/parrots.png"); // Load image in CPU memory (RAM)
|
Image parrots = LoadImage("resources/parrots.png"); // Load image in CPU memory (RAM)
|
||||||
|
|
||||||
// Draw one image over the other with a scaling of 1.5f
|
// Draw one image over the other with a scaling of 1.5f
|
||||||
ImageDraw(&parrots, cat, (Rectangle){ 0, 0, cat.width, cat.height }, (Rectangle){ 30, 40, cat.width*1.5f, cat.height*1.5f }, WHITE);
|
ImageDraw(&parrots, cat, (Rectangle){ 0, 0, (float)cat.width, (float)cat.height }, (Rectangle){ 30, 40, cat.width*1.5f, cat.height*1.5f }, WHITE);
|
||||||
ImageCrop(&parrots, (Rectangle){ 0, 50, parrots.width, parrots.height - 100 }); // Crop resulting image
|
ImageCrop(&parrots, (Rectangle){ 0, 50, (float)parrots.width, (float)parrots.height - 100 }); // Crop resulting image
|
||||||
|
|
||||||
// Draw on the image with a few image draw methods
|
// Draw on the image with a few image draw methods
|
||||||
ImageDrawPixel(&parrots, 10, 10, RAYWHITE);
|
ImageDrawPixel(&parrots, 10, 10, RAYWHITE);
|
||||||
|
|
@ -46,7 +46,7 @@ int main(void)
|
||||||
Font font = LoadFont("resources/custom_jupiter_crash.png");
|
Font font = LoadFont("resources/custom_jupiter_crash.png");
|
||||||
|
|
||||||
// Draw over image using custom font
|
// Draw over image using custom font
|
||||||
ImageDrawTextEx(&parrots, font, "PARROTS & CAT", (Vector2){ 300, 230 }, font.baseSize, -2, WHITE);
|
ImageDrawTextEx(&parrots, font, "PARROTS & CAT", (Vector2){ 300, 230 }, (float)font.baseSize, -2, WHITE);
|
||||||
|
|
||||||
UnloadFont(font); // Unload custom spritefont (already drawn used on image)
|
UnloadFont(font); // Unload custom spritefont (already drawn used on image)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#define MAX_COLORS_COUNT 23 // Number of colors available
|
#define MAX_COLORS_COUNT 23 // Number of colors available
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
@ -29,7 +29,7 @@ int main(void)
|
||||||
RAYWHITE, YELLOW, GOLD, ORANGE, PINK, RED, MAROON, GREEN, LIME, DARKGREEN,
|
RAYWHITE, YELLOW, GOLD, ORANGE, PINK, RED, MAROON, GREEN, LIME, DARKGREEN,
|
||||||
SKYBLUE, BLUE, DARKBLUE, PURPLE, VIOLET, DARKPURPLE, BEIGE, BROWN, DARKBROWN,
|
SKYBLUE, BLUE, DARKBLUE, PURPLE, VIOLET, DARKPURPLE, BEIGE, BROWN, DARKBROWN,
|
||||||
LIGHTGRAY, GRAY, DARKGRAY, BLACK };
|
LIGHTGRAY, GRAY, DARKGRAY, BLACK };
|
||||||
|
|
||||||
// Define colorsRecs data (for every rectangle)
|
// Define colorsRecs data (for every rectangle)
|
||||||
Rectangle colorsRecs[MAX_COLORS_COUNT] = { 0 };
|
Rectangle colorsRecs[MAX_COLORS_COUNT] = { 0 };
|
||||||
|
|
||||||
|
|
@ -45,7 +45,8 @@ int main(void)
|
||||||
int colorSelectedPrev = colorSelected;
|
int colorSelectedPrev = colorSelected;
|
||||||
int colorMouseHover = 0;
|
int colorMouseHover = 0;
|
||||||
int brushSize = 20;
|
int brushSize = 20;
|
||||||
|
bool mouseWasPressed = false;
|
||||||
|
|
||||||
Rectangle btnSaveRec = { 750, 10, 40, 30 };
|
Rectangle btnSaveRec = { 750, 10, 40, 30 };
|
||||||
bool btnSaveMouseHover = false;
|
bool btnSaveMouseHover = false;
|
||||||
bool showSaveMessage = false;
|
bool showSaveMessage = false;
|
||||||
|
|
@ -68,11 +69,11 @@ int main(void)
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
Vector2 mousePos = GetMousePosition();
|
Vector2 mousePos = GetMousePosition();
|
||||||
|
|
||||||
// Move between colors with keys
|
// Move between colors with keys
|
||||||
if (IsKeyPressed(KEY_RIGHT)) colorSelected++;
|
if (IsKeyPressed(KEY_RIGHT)) colorSelected++;
|
||||||
else if (IsKeyPressed(KEY_LEFT)) colorSelected--;
|
else if (IsKeyPressed(KEY_LEFT)) colorSelected--;
|
||||||
|
|
||||||
if (colorSelected >= MAX_COLORS_COUNT) colorSelected = MAX_COLORS_COUNT - 1;
|
if (colorSelected >= MAX_COLORS_COUNT) colorSelected = MAX_COLORS_COUNT - 1;
|
||||||
else if (colorSelected < 0) colorSelected = 0;
|
else if (colorSelected < 0) colorSelected = 0;
|
||||||
|
|
||||||
|
|
@ -86,8 +87,8 @@ int main(void)
|
||||||
}
|
}
|
||||||
else colorMouseHover = -1;
|
else colorMouseHover = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((colorMouseHover >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
|
if ((colorMouseHover >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
|
||||||
{
|
{
|
||||||
colorSelected = colorMouseHover;
|
colorSelected = colorMouseHover;
|
||||||
colorSelectedPrev = colorSelected;
|
colorSelectedPrev = colorSelected;
|
||||||
|
|
@ -98,7 +99,7 @@ int main(void)
|
||||||
if (brushSize < 2) brushSize = 2;
|
if (brushSize < 2) brushSize = 2;
|
||||||
if (brushSize > 50) brushSize = 50;
|
if (brushSize > 50) brushSize = 50;
|
||||||
|
|
||||||
if (IsKeyPressed(KEY_C))
|
if (IsKeyPressed(KEY_C))
|
||||||
{
|
{
|
||||||
// Clear render texture to clear color
|
// Clear render texture to clear color
|
||||||
BeginTextureMode(target);
|
BeginTextureMode(target);
|
||||||
|
|
@ -118,19 +119,29 @@ int main(void)
|
||||||
|
|
||||||
if (IsMouseButtonDown(MOUSE_RIGHT_BUTTON))
|
if (IsMouseButtonDown(MOUSE_RIGHT_BUTTON))
|
||||||
{
|
{
|
||||||
colorSelected = 0;
|
if (!mouseWasPressed)
|
||||||
|
{
|
||||||
|
colorSelectedPrev = colorSelected;
|
||||||
|
colorSelected = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mouseWasPressed = true;
|
||||||
|
|
||||||
// Erase circle from render texture
|
// Erase circle from render texture
|
||||||
BeginTextureMode(target);
|
BeginTextureMode(target);
|
||||||
if (mousePos.y > 50) DrawCircle(mousePos.x, mousePos.y, brushSize, colors[0]);
|
if (mousePos.y > 50) DrawCircle(mousePos.x, mousePos.y, brushSize, colors[0]);
|
||||||
EndTextureMode();
|
EndTextureMode();
|
||||||
}
|
}
|
||||||
else colorSelected = colorSelectedPrev;
|
else if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON) && mouseWasPressed)
|
||||||
|
{
|
||||||
|
colorSelected = colorSelectedPrev;
|
||||||
|
mouseWasPressed = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Check mouse hover save button
|
// Check mouse hover save button
|
||||||
if (CheckCollisionPointRec(mousePos, btnSaveRec)) btnSaveMouseHover = true;
|
if (CheckCollisionPointRec(mousePos, btnSaveRec)) btnSaveMouseHover = true;
|
||||||
else btnSaveMouseHover = false;
|
else btnSaveMouseHover = false;
|
||||||
|
|
||||||
// Image saving logic
|
// Image saving logic
|
||||||
// NOTE: Saving painted texture to a default named image
|
// NOTE: Saving painted texture to a default named image
|
||||||
if ((btnSaveMouseHover && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) || IsKeyPressed(KEY_S))
|
if ((btnSaveMouseHover && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) || IsKeyPressed(KEY_S))
|
||||||
|
|
@ -141,7 +152,7 @@ int main(void)
|
||||||
UnloadImage(image);
|
UnloadImage(image);
|
||||||
showSaveMessage = true;
|
showSaveMessage = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showSaveMessage)
|
if (showSaveMessage)
|
||||||
{
|
{
|
||||||
// On saving, show a full screen message for 2 seconds
|
// On saving, show a full screen message for 2 seconds
|
||||||
|
|
@ -158,42 +169,42 @@ int main(void)
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
BeginDrawing();
|
BeginDrawing();
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
// NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
|
// NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
|
||||||
DrawTextureRec(target.texture, (Rectangle){ 0, 0, target.texture.width, -target.texture.height }, (Vector2){ 0, 0 }, WHITE);
|
DrawTextureRec(target.texture, (Rectangle) { 0, 0, target.texture.width, -target.texture.height }, (Vector2) { 0, 0 }, WHITE);
|
||||||
|
|
||||||
// Draw drawing circle for reference
|
// Draw drawing circle for reference
|
||||||
if (mousePos.y > 50)
|
if (mousePos.y > 50)
|
||||||
{
|
{
|
||||||
if (IsMouseButtonDown(MOUSE_RIGHT_BUTTON)) DrawCircleLines(mousePos.x, mousePos.y, brushSize, GRAY);
|
if (IsMouseButtonDown(MOUSE_RIGHT_BUTTON)) DrawCircleLines(mousePos.x, mousePos.y, brushSize, GRAY);
|
||||||
else DrawCircle(GetMouseX(), GetMouseY(), brushSize, colors[colorSelected]);
|
else DrawCircle(GetMouseX(), GetMouseY(), brushSize, colors[colorSelected]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw top panel
|
|
||||||
DrawRectangle(0, 0, GetScreenWidth(), 50, RAYWHITE);
|
|
||||||
DrawLine(0, 50, GetScreenWidth(), 50, LIGHTGRAY);
|
|
||||||
|
|
||||||
// Draw color selection rectangles
|
// Draw top panel
|
||||||
for (int i = 0; i < MAX_COLORS_COUNT; i++) DrawRectangleRec(colorsRecs[i], colors[i]);
|
DrawRectangle(0, 0, GetScreenWidth(), 50, RAYWHITE);
|
||||||
DrawRectangleLines(10, 10, 30, 30, LIGHTGRAY);
|
DrawLine(0, 50, GetScreenWidth(), 50, LIGHTGRAY);
|
||||||
|
|
||||||
if (colorMouseHover >= 0) DrawRectangleRec(colorsRecs[colorMouseHover], Fade(WHITE, 0.6f));
|
// Draw color selection rectangles
|
||||||
|
for (int i = 0; i < MAX_COLORS_COUNT; i++) DrawRectangleRec(colorsRecs[i], colors[i]);
|
||||||
|
DrawRectangleLines(10, 10, 30, 30, LIGHTGRAY);
|
||||||
|
|
||||||
DrawRectangleLinesEx((Rectangle){ colorsRecs[colorSelected].x - 2, colorsRecs[colorSelected].y - 2,
|
if (colorMouseHover >= 0) DrawRectangleRec(colorsRecs[colorMouseHover], Fade(WHITE, 0.6f));
|
||||||
colorsRecs[colorSelected].width + 4, colorsRecs[colorSelected].height + 4 }, 2, BLACK);
|
|
||||||
|
|
||||||
// Draw save image button
|
DrawRectangleLinesEx((Rectangle){ colorsRecs[colorSelected].x - 2, colorsRecs[colorSelected].y - 2,
|
||||||
DrawRectangleLinesEx(btnSaveRec, 2, btnSaveMouseHover? RED : BLACK);
|
colorsRecs[colorSelected].width + 4, colorsRecs[colorSelected].height + 4 }, 2, BLACK);
|
||||||
DrawText("SAVE!", 755, 20, 10, btnSaveMouseHover? RED : BLACK);
|
|
||||||
|
// Draw save image button
|
||||||
// Draw save image message
|
DrawRectangleLinesEx(btnSaveRec, 2, btnSaveMouseHover ? RED : BLACK);
|
||||||
if (showSaveMessage)
|
DrawText("SAVE!", 755, 20, 10, btnSaveMouseHover ? RED : BLACK);
|
||||||
{
|
|
||||||
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
|
// Draw save image message
|
||||||
DrawRectangle(0, 150, GetScreenWidth(), 80, BLACK);
|
if (showSaveMessage)
|
||||||
DrawText("IMAGE SAVED: my_amazing_texture_painting.png", 150, 180, 20, RAYWHITE);
|
{
|
||||||
}
|
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
|
||||||
|
DrawRectangle(0, 150, GetScreenWidth(), 80, BLACK);
|
||||||
|
DrawText("IMAGE SAVED: my_amazing_texture_painting.png", 150, 180, 20, RAYWHITE);
|
||||||
|
}
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
@ -202,7 +213,7 @@ int main(void)
|
||||||
// De-Initialization
|
// De-Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
UnloadRenderTexture(target); // Unload render texture
|
UnloadRenderTexture(target); // Unload render texture
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,15 +36,15 @@ int main(void)
|
||||||
Rectangle dstRecH = { 160.0f, 93.0f, 32.0f, 32.0f };
|
Rectangle dstRecH = { 160.0f, 93.0f, 32.0f, 32.0f };
|
||||||
Rectangle dstRecV = { 92.0f, 160.0f, 32.0f, 32.0f };
|
Rectangle dstRecV = { 92.0f, 160.0f, 32.0f, 32.0f };
|
||||||
|
|
||||||
// A 9-patch (NPT_9PATCH) changes its sizes in both axis
|
// A 9-patch (NPATCH_NINE_PATCH) changes its sizes in both axis
|
||||||
NPatchInfo ninePatchInfo1 = { (Rectangle){ 0.0f, 0.0f, 64.0f, 64.0f }, 12, 40, 12, 12, NPT_9PATCH };
|
NPatchInfo ninePatchInfo1 = { (Rectangle){ 0.0f, 0.0f, 64.0f, 64.0f }, 12, 40, 12, 12, NPATCH_NINE_PATCH };
|
||||||
NPatchInfo ninePatchInfo2 = { (Rectangle){ 0.0f, 128.0f, 64.0f, 64.0f }, 16, 16, 16, 16, NPT_9PATCH };
|
NPatchInfo ninePatchInfo2 = { (Rectangle){ 0.0f, 128.0f, 64.0f, 64.0f }, 16, 16, 16, 16, NPATCH_NINE_PATCH };
|
||||||
|
|
||||||
// A horizontal 3-patch (NPT_3PATCH_HORIZONTAL) changes its sizes along the x axis only
|
// A horizontal 3-patch (NPATCH_THREE_PATCH_HORIZONTAL) changes its sizes along the x axis only
|
||||||
NPatchInfo h3PatchInfo = { (Rectangle){ 0.0f, 64.0f, 64.0f, 64.0f }, 8, 8, 8, 8, NPT_3PATCH_HORIZONTAL };
|
NPatchInfo h3PatchInfo = { (Rectangle){ 0.0f, 64.0f, 64.0f, 64.0f }, 8, 8, 8, 8, NPATCH_THREE_PATCH_HORIZONTAL };
|
||||||
|
|
||||||
// A vertical 3-patch (NPT_3PATCH_VERTICAL) changes its sizes along the y axis only
|
// A vertical 3-patch (NPATCH_THREE_PATCH_VERTICAL) changes its sizes along the y axis only
|
||||||
NPatchInfo v3PatchInfo = { (Rectangle){ 0.0f, 192.0f, 64.0f, 64.0f }, 6, 6, 6, 6, NPT_3PATCH_VERTICAL };
|
NPatchInfo v3PatchInfo = { (Rectangle){ 0.0f, 192.0f, 64.0f, 64.0f }, 6, 6, 6, 6, NPATCH_THREE_PATCH_VERTICAL };
|
||||||
|
|
||||||
SetTargetFPS(60);
|
SetTargetFPS(60);
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ int main(void)
|
||||||
|
|
||||||
DrawTexture(scarfy, 15, 40, WHITE);
|
DrawTexture(scarfy, 15, 40, WHITE);
|
||||||
DrawRectangleLines(15, 40, scarfy.width, scarfy.height, LIME);
|
DrawRectangleLines(15, 40, scarfy.width, scarfy.height, LIME);
|
||||||
DrawRectangleLines(15 + frameRec.x, 40 + frameRec.y, frameRec.width, frameRec.height, RED);
|
DrawRectangleLines(15 + (int)frameRec.x, 40 + (int)frameRec.y, (int)frameRec.width, (int)frameRec.height, RED);
|
||||||
|
|
||||||
DrawText("FRAME SPEED: ", 165, 210, 10, DARKGRAY);
|
DrawText("FRAME SPEED: ", 165, 210, 10, DARKGRAY);
|
||||||
DrawText(TextFormat("%02i FPS", framesSpeed), 575, 210, 10, DARKGRAY);
|
DrawText(TextFormat("%02i FPS", framesSpeed), 575, 210, 10, DARKGRAY);
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,13 @@ int main(void)
|
||||||
int frameHeight = scarfy.height;
|
int frameHeight = scarfy.height;
|
||||||
|
|
||||||
// Source rectangle (part of the texture to use for drawing)
|
// Source rectangle (part of the texture to use for drawing)
|
||||||
Rectangle sourceRec = { 0.0f, 0.0f, frameWidth, frameHeight };
|
Rectangle sourceRec = { 0.0f, 0.0f, (float)frameWidth, (float)frameHeight };
|
||||||
|
|
||||||
// Destination rectangle (screen rectangle where drawing part of texture)
|
// Destination rectangle (screen rectangle where drawing part of texture)
|
||||||
Rectangle destRec = { screenWidth/2, screenHeight/2, frameWidth*2, frameHeight*2 };
|
Rectangle destRec = { screenWidth/2.0f, screenHeight/2.0f, frameWidth*2.0f, frameHeight*2.0f };
|
||||||
|
|
||||||
// Origin of the texture (rotation/scale point), it's relative to destination rectangle size
|
// Origin of the texture (rotation/scale point), it's relative to destination rectangle size
|
||||||
Vector2 origin = { frameWidth, frameHeight };
|
Vector2 origin = { (float)frameWidth, (float)frameHeight };
|
||||||
|
|
||||||
int rotation = 0;
|
int rotation = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
|
@ -228,7 +228,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
|
@ -245,7 +245,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -266,7 +266,7 @@
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
|
@ -291,7 +291,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -313,7 +313,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
@ -335,7 +335,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>raylib.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>raylib.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,7 @@
|
||||||
#define DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture)
|
#define DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture)
|
||||||
|
|
||||||
#define MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack
|
#define MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack
|
||||||
|
#define MAX_MESH_VERTEX_BUFFERS 7 // Maximum vertex buffers (VBO) per mesh
|
||||||
#define MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
|
#define MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
|
||||||
#define MAX_MATERIAL_MAPS 12 // Maximum number of shader maps supported
|
#define MAX_MATERIAL_MAPS 12 // Maximum number of shader maps supported
|
||||||
|
|
||||||
|
|
@ -186,7 +187,7 @@
|
||||||
#define SUPPORT_FILEFORMAT_WAV 1
|
#define SUPPORT_FILEFORMAT_WAV 1
|
||||||
#define SUPPORT_FILEFORMAT_OGG 1
|
#define SUPPORT_FILEFORMAT_OGG 1
|
||||||
#define SUPPORT_FILEFORMAT_XM 1
|
#define SUPPORT_FILEFORMAT_XM 1
|
||||||
//#define SUPPORT_FILEFORMAT_MOD 1
|
#define SUPPORT_FILEFORMAT_MOD 1
|
||||||
#define SUPPORT_FILEFORMAT_MP3 1
|
#define SUPPORT_FILEFORMAT_MP3 1
|
||||||
//#define SUPPORT_FILEFORMAT_FLAC 1
|
//#define SUPPORT_FILEFORMAT_FLAC 1
|
||||||
|
|
||||||
|
|
@ -202,6 +203,8 @@
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Module: utils - Configuration Flags
|
// Module: utils - Configuration Flags
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
// Standard file io library (stdio.h) included
|
||||||
|
#define SUPPORT_STANDARD_FILEIO
|
||||||
// Show TRACELOG() output messages
|
// Show TRACELOG() output messages
|
||||||
// NOTE: By default LOG_DEBUG traces not shown
|
// NOTE: By default LOG_DEBUG traces not shown
|
||||||
#define SUPPORT_TRACELOG 1
|
#define SUPPORT_TRACELOG 1
|
||||||
|
|
|
||||||
131
src/core.c
131
src/core.c
|
|
@ -202,15 +202,16 @@
|
||||||
unsigned int __stdcall timeBeginPeriod(unsigned int uPeriod);
|
unsigned int __stdcall timeBeginPeriod(unsigned int uPeriod);
|
||||||
unsigned int __stdcall timeEndPeriod(unsigned int uPeriod);
|
unsigned int __stdcall timeEndPeriod(unsigned int uPeriod);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#elif defined(__linux__)
|
#if defined(__linux__) || defined(__FreeBSD__)
|
||||||
#include <sys/time.h> // Required for: timespec, nanosleep(), select() - POSIX
|
#include <sys/time.h> // Required for: timespec, nanosleep(), select() - POSIX
|
||||||
|
|
||||||
//#define GLFW_EXPOSE_NATIVE_X11 // WARNING: Exposing Xlib.h > X.h results in dup symbols for Font type
|
//#define GLFW_EXPOSE_NATIVE_X11 // WARNING: Exposing Xlib.h > X.h results in dup symbols for Font type
|
||||||
//#define GLFW_EXPOSE_NATIVE_WAYLAND
|
//#define GLFW_EXPOSE_NATIVE_WAYLAND
|
||||||
//#define GLFW_EXPOSE_NATIVE_MIR
|
//#define GLFW_EXPOSE_NATIVE_MIR
|
||||||
#include "GLFW/glfw3native.h" // Required for: glfwGetX11Window()
|
#include "GLFW/glfw3native.h" // Required for: glfwGetX11Window()
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
#include <unistd.h> // Required for: usleep()
|
#include <unistd.h> // Required for: usleep()
|
||||||
|
|
||||||
//#define GLFW_EXPOSE_NATIVE_COCOA // WARNING: Fails due to type redefinition
|
//#define GLFW_EXPOSE_NATIVE_COCOA // WARNING: Fails due to type redefinition
|
||||||
|
|
@ -753,7 +754,7 @@ void InitWindow(int width, int height, const char *title)
|
||||||
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0)
|
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0)
|
||||||
{
|
{
|
||||||
// Set default font texture filter for HighDPI (blurry)
|
// Set default font texture filter for HighDPI (blurry)
|
||||||
SetTextureFilter(GetFontDefault().texture, FILTER_BILINEAR);
|
SetTextureFilter(GetFontDefault().texture, TEXTURE_FILTER_BILINEAR);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -1429,13 +1430,13 @@ void SetWindowSize(int width, int height)
|
||||||
// Get current screen width
|
// Get current screen width
|
||||||
int GetScreenWidth(void)
|
int GetScreenWidth(void)
|
||||||
{
|
{
|
||||||
return CORE.Window.screen.width;
|
return CORE.Window.currentFbo.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get current screen height
|
// Get current screen height
|
||||||
int GetScreenHeight(void)
|
int GetScreenHeight(void)
|
||||||
{
|
{
|
||||||
return CORE.Window.screen.height;
|
return CORE.Window.currentFbo.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get native window handle
|
// Get native window handle
|
||||||
|
|
@ -1444,18 +1445,20 @@ void *GetWindowHandle(void)
|
||||||
#if defined(PLATFORM_DESKTOP) && defined(_WIN32)
|
#if defined(PLATFORM_DESKTOP) && defined(_WIN32)
|
||||||
// NOTE: Returned handle is: void *HWND (windows.h)
|
// NOTE: Returned handle is: void *HWND (windows.h)
|
||||||
return glfwGetWin32Window(CORE.Window.handle);
|
return glfwGetWin32Window(CORE.Window.handle);
|
||||||
#elif defined(__linux__)
|
#endif
|
||||||
|
#if defined(__linux__)
|
||||||
// NOTE: Returned handle is: unsigned long Window (X.h)
|
// NOTE: Returned handle is: unsigned long Window (X.h)
|
||||||
// typedef unsigned long XID;
|
// typedef unsigned long XID;
|
||||||
// typedef XID Window;
|
// typedef XID Window;
|
||||||
//unsigned long id = (unsigned long)glfwGetX11Window(window);
|
//unsigned long id = (unsigned long)glfwGetX11Window(window);
|
||||||
return NULL; // TODO: Find a way to return value... cast to void *?
|
return NULL; // TODO: Find a way to return value... cast to void *?
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
// NOTE: Returned handle is: (objc_object *)
|
// NOTE: Returned handle is: (objc_object *)
|
||||||
return NULL; // TODO: return (void *)glfwGetCocoaWindow(window);
|
return NULL; // TODO: return (void *)glfwGetCocoaWindow(window);
|
||||||
#else
|
|
||||||
return NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get number of monitors
|
// Get number of monitors
|
||||||
|
|
@ -1987,9 +1990,9 @@ void EndTextureMode(void)
|
||||||
// Set viewport to default framebuffer size
|
// Set viewport to default framebuffer size
|
||||||
SetupViewport(CORE.Window.render.width, CORE.Window.render.height);
|
SetupViewport(CORE.Window.render.width, CORE.Window.render.height);
|
||||||
|
|
||||||
// Reset current screen size
|
// Reset current fbo to screen size
|
||||||
CORE.Window.currentFbo.width = GetScreenWidth();
|
CORE.Window.currentFbo.width = CORE.Window.screen.width;
|
||||||
CORE.Window.currentFbo.height = GetScreenHeight();
|
CORE.Window.currentFbo.height = CORE.Window.screen.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Begin scissor mode (define screen area for following drawing)
|
// Begin scissor mode (define screen area for following drawing)
|
||||||
|
|
@ -2322,7 +2325,7 @@ bool IsFileExtension(const char *fileName, const char *ext)
|
||||||
|
|
||||||
for (int i = 0; i < extCount; i++)
|
for (int i = 0; i < extCount; i++)
|
||||||
{
|
{
|
||||||
if (TextIsEqual(fileExtLower, TextToLower(checkExts[i] + 1)))
|
if (TextIsEqual(fileExtLower, TextToLower(checkExts[i])))
|
||||||
{
|
{
|
||||||
result = true;
|
result = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -2351,14 +2354,14 @@ bool DirectoryExists(const char *dirPath)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get pointer to extension for a filename string
|
// Get pointer to extension for a filename string (includes the dot: .png)
|
||||||
const char *GetFileExtension(const char *fileName)
|
const char *GetFileExtension(const char *fileName)
|
||||||
{
|
{
|
||||||
const char *dot = strrchr(fileName, '.');
|
const char *dot = strrchr(fileName, '.');
|
||||||
|
|
||||||
if (!dot || dot == fileName) return NULL;
|
if (!dot || dot == fileName) return NULL;
|
||||||
|
|
||||||
return (dot + 1);
|
return dot;
|
||||||
}
|
}
|
||||||
|
|
||||||
// String pointer reverse break: returns right-most occurrence of charset in s
|
// String pointer reverse break: returns right-most occurrence of charset in s
|
||||||
|
|
@ -2716,6 +2719,7 @@ bool SaveStorageValue(unsigned int position, int value)
|
||||||
int LoadStorageValue(unsigned int position)
|
int LoadStorageValue(unsigned int position)
|
||||||
{
|
{
|
||||||
int value = 0;
|
int value = 0;
|
||||||
|
|
||||||
#if defined(SUPPORT_DATA_STORAGE)
|
#if defined(SUPPORT_DATA_STORAGE)
|
||||||
char path[512] = { 0 };
|
char path[512] = { 0 };
|
||||||
#if defined(PLATFORM_ANDROID)
|
#if defined(PLATFORM_ANDROID)
|
||||||
|
|
@ -2767,9 +2771,11 @@ void OpenURL(const char *url)
|
||||||
char *cmd = (char *)RL_CALLOC(strlen(url) + 10, sizeof(char));
|
char *cmd = (char *)RL_CALLOC(strlen(url) + 10, sizeof(char));
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
sprintf(cmd, "explorer %s", url);
|
sprintf(cmd, "explorer %s", url);
|
||||||
#elif defined(__linux__)
|
#endif
|
||||||
|
#if defined(__linux__) || defined(__FreeBSD__)
|
||||||
sprintf(cmd, "xdg-open '%s'", url); // Alternatives: firefox, x-www-browser
|
sprintf(cmd, "xdg-open '%s'", url); // Alternatives: firefox, x-www-browser
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
sprintf(cmd, "open '%s'", url);
|
sprintf(cmd, "open '%s'", url);
|
||||||
#endif
|
#endif
|
||||||
system(cmd);
|
system(cmd);
|
||||||
|
|
@ -2903,13 +2909,12 @@ const char *GetGamepadName(int gamepad)
|
||||||
#if defined(PLATFORM_DESKTOP)
|
#if defined(PLATFORM_DESKTOP)
|
||||||
if (CORE.Input.Gamepad.ready[gamepad]) return glfwGetJoystickName(gamepad);
|
if (CORE.Input.Gamepad.ready[gamepad]) return glfwGetJoystickName(gamepad);
|
||||||
else return NULL;
|
else return NULL;
|
||||||
#elif defined(PLATFORM_RPI) || defined(PLATFORM_DRM)
|
|
||||||
if (CORE.Input.Gamepad.ready[gamepad]) ioctl(CORE.Input.Gamepad.streamId[gamepad], JSIOCGNAME(64), &CORE.Input.Gamepad.name);
|
|
||||||
|
|
||||||
return CORE.Input.Gamepad.name;
|
|
||||||
#else
|
|
||||||
return NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PLATFORM_RPI) || defined(PLATFORM_DRM)
|
||||||
|
if (CORE.Input.Gamepad.ready[gamepad]) ioctl(CORE.Input.Gamepad.streamId[gamepad], JSIOCGNAME(64), &CORE.Input.Gamepad.name);
|
||||||
|
return CORE.Input.Gamepad.name;
|
||||||
|
#endif
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return gamepad axis count
|
// Return gamepad axis count
|
||||||
|
|
@ -3111,11 +3116,12 @@ float GetMouseWheelMove(void)
|
||||||
{
|
{
|
||||||
#if defined(PLATFORM_ANDROID)
|
#if defined(PLATFORM_ANDROID)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
#elif defined(PLATFORM_WEB)
|
|
||||||
return CORE.Input.Mouse.previousWheelMove/100.0f;
|
|
||||||
#else
|
|
||||||
return CORE.Input.Mouse.previousWheelMove;
|
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PLATFORM_WEB)
|
||||||
|
return CORE.Input.Mouse.previousWheelMove/100.0f;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return CORE.Input.Mouse.previousWheelMove;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns mouse cursor
|
// Returns mouse cursor
|
||||||
|
|
@ -3165,11 +3171,16 @@ Vector2 GetTouchPosition(int index)
|
||||||
{
|
{
|
||||||
Vector2 position = { -1.0f, -1.0f };
|
Vector2 position = { -1.0f, -1.0f };
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP)
|
#if defined(PLATFORM_DESKTOP)
|
||||||
|
// TODO: GLFW does not support multi-touch input just yet
|
||||||
|
// https://www.codeproject.com/Articles/668404/Programming-for-Multi-Touch
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/wintouch/getting-started-with-multi-touch-messages
|
||||||
|
if (index == 0) position = GetMousePosition();
|
||||||
|
#endif
|
||||||
|
#if defined(PLATFORM_ANDROID)
|
||||||
if (index < MAX_TOUCH_POINTS) position = CORE.Input.Touch.position[index];
|
if (index < MAX_TOUCH_POINTS) position = CORE.Input.Touch.position[index];
|
||||||
else TRACELOG(LOG_WARNING, "INPUT: Required touch point out of range (Max touch points: %i)", MAX_TOUCH_POINTS);
|
else TRACELOG(LOG_WARNING, "INPUT: Required touch point out of range (Max touch points: %i)", MAX_TOUCH_POINTS);
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID)
|
|
||||||
if ((CORE.Window.screen.width > CORE.Window.display.width) || (CORE.Window.screen.height > CORE.Window.display.height))
|
if ((CORE.Window.screen.width > CORE.Window.display.width) || (CORE.Window.screen.height > CORE.Window.display.height))
|
||||||
{
|
{
|
||||||
position.x = position.x*((float)CORE.Window.screen.width/(float)(CORE.Window.display.width - CORE.Window.renderOffset.x)) - CORE.Window.renderOffset.x/2;
|
position.x = position.x*((float)CORE.Window.screen.width/(float)(CORE.Window.display.width - CORE.Window.renderOffset.x)) - CORE.Window.renderOffset.x/2;
|
||||||
|
|
@ -3180,13 +3191,12 @@ Vector2 GetTouchPosition(int index)
|
||||||
position.x = position.x*((float)CORE.Window.render.width/(float)CORE.Window.display.width) - CORE.Window.renderOffset.x/2;
|
position.x = position.x*((float)CORE.Window.render.width/(float)CORE.Window.display.width) - CORE.Window.renderOffset.x/2;
|
||||||
position.y = position.y*((float)CORE.Window.render.height/(float)CORE.Window.display.height) - CORE.Window.renderOffset.y/2;
|
position.y = position.y*((float)CORE.Window.render.height/(float)CORE.Window.display.height) - CORE.Window.renderOffset.y/2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP)
|
||||||
#elif defined(PLATFORM_DESKTOP)
|
if (index < MAX_TOUCH_POINTS) position = CORE.Input.Touch.position[index];
|
||||||
// TODO: GLFW is not supporting multi-touch input just yet
|
else TRACELOG(LOG_WARNING, "INPUT: Required touch point out of range (Max touch points: %i)", MAX_TOUCH_POINTS);
|
||||||
// https://www.codeproject.com/Articles/668404/Programming-for-Multi-Touch
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/wintouch/getting-started-with-multi-touch-messages
|
// TODO: Touch position scaling required?
|
||||||
if (index == 0) position = GetMousePosition();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return position;
|
return position;
|
||||||
|
|
@ -3879,7 +3889,7 @@ static bool InitGraphicsDevice(int width, int height)
|
||||||
|
|
||||||
TRACELOG(LOG_TRACE, "DISPLAY: EGL configs available: %d", numConfigs);
|
TRACELOG(LOG_TRACE, "DISPLAY: EGL configs available: %d", numConfigs);
|
||||||
|
|
||||||
EGLConfig *configs = calloc(numConfigs, sizeof(*configs));
|
EGLConfig *configs = RL_CALLOC(numConfigs, sizeof(*configs));
|
||||||
if (!configs)
|
if (!configs)
|
||||||
{
|
{
|
||||||
TRACELOG(LOG_WARNING, "DISPLAY: Failed to get memory for EGL configs");
|
TRACELOG(LOG_WARNING, "DISPLAY: Failed to get memory for EGL configs");
|
||||||
|
|
@ -3916,7 +3926,7 @@ static bool InitGraphicsDevice(int width, int height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(configs);
|
RL_FREE(configs);
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
|
|
@ -4234,7 +4244,8 @@ static void Wait(float ms)
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
Sleep((unsigned int)ms);
|
Sleep((unsigned int)ms);
|
||||||
#elif defined(__linux__) || defined(PLATFORM_WEB)
|
#endif
|
||||||
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__)
|
||||||
struct timespec req = { 0 };
|
struct timespec req = { 0 };
|
||||||
time_t sec = (int)(ms/1000.0f);
|
time_t sec = (int)(ms/1000.0f);
|
||||||
ms -= (sec*1000);
|
ms -= (sec*1000);
|
||||||
|
|
@ -4243,7 +4254,8 @@ static void Wait(float ms)
|
||||||
|
|
||||||
// NOTE: Use nanosleep() on Unix platforms... usleep() it's deprecated.
|
// NOTE: Use nanosleep() on Unix platforms... usleep() it's deprecated.
|
||||||
while (nanosleep(&req, &req) == -1) continue;
|
while (nanosleep(&req, &req) == -1) continue;
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
usleep(ms*1000.0f);
|
usleep(ms*1000.0f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -5753,8 +5765,9 @@ static void *EventThread(void *arg)
|
||||||
// Basic movement
|
// Basic movement
|
||||||
if (event.code == ABS_X)
|
if (event.code == ABS_X)
|
||||||
{
|
{
|
||||||
CORE.Input.Mouse.position.x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width; // Scale acording to absRange
|
CORE.Input.Mouse.position.x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width; // Scale acording to absRange
|
||||||
|
CORE.Input.Touch.position[0].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width; // Scale acording to absRange
|
||||||
|
|
||||||
#if defined(SUPPORT_GESTURES_SYSTEM)
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
touchAction = TOUCH_MOVE;
|
touchAction = TOUCH_MOVE;
|
||||||
gestureUpdate = true;
|
gestureUpdate = true;
|
||||||
|
|
@ -5763,7 +5776,8 @@ static void *EventThread(void *arg)
|
||||||
|
|
||||||
if (event.code == ABS_Y)
|
if (event.code == ABS_Y)
|
||||||
{
|
{
|
||||||
CORE.Input.Mouse.position.y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height; // Scale acording to absRange
|
CORE.Input.Mouse.position.y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height; // Scale acording to absRange
|
||||||
|
CORE.Input.Touch.position[0].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height; // Scale acording to absRange
|
||||||
|
|
||||||
#if defined(SUPPORT_GESTURES_SYSTEM)
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
touchAction = TOUCH_MOVE;
|
touchAction = TOUCH_MOVE;
|
||||||
|
|
@ -5772,7 +5786,7 @@ static void *EventThread(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multitouch movement
|
// Multitouch movement
|
||||||
if (event.code == ABS_MT_SLOT) worker->touchSlot = event.value; // Remeber the slot number for the folowing events
|
if (event.code == ABS_MT_SLOT) worker->touchSlot = event.value; // Remember the slot number for the folowing events
|
||||||
|
|
||||||
if (event.code == ABS_MT_POSITION_X)
|
if (event.code == ABS_MT_POSITION_X)
|
||||||
{
|
{
|
||||||
|
|
@ -5793,6 +5807,33 @@ static void *EventThread(void *arg)
|
||||||
CORE.Input.Touch.position[worker->touchSlot].y = -1;
|
CORE.Input.Touch.position[worker->touchSlot].y = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Touchscreen tap
|
||||||
|
if(event.code == ABS_PRESSURE)
|
||||||
|
{
|
||||||
|
int previousMouseLeftButtonState = CORE.Input.Mouse.currentButtonStateEvdev[MOUSE_LEFT_BUTTON];
|
||||||
|
|
||||||
|
if(!event.value && previousMouseLeftButtonState)
|
||||||
|
{
|
||||||
|
CORE.Input.Mouse.currentButtonStateEvdev[MOUSE_LEFT_BUTTON] = 0;
|
||||||
|
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
touchAction = TOUCH_UP;
|
||||||
|
gestureUpdate = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if(event.value && !previousMouseLeftButtonState)
|
||||||
|
{
|
||||||
|
CORE.Input.Mouse.currentButtonStateEvdev[MOUSE_LEFT_BUTTON] = 1;
|
||||||
|
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
touchAction = TOUCH_DOWN;
|
||||||
|
gestureUpdate = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Button parsing
|
// Button parsing
|
||||||
|
|
|
||||||
4
src/external/jar_xm.h
vendored
4
src/external/jar_xm.h
vendored
|
|
@ -696,7 +696,9 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz
|
||||||
}
|
}
|
||||||
|
|
||||||
void jar_xm_free_context(jar_xm_context_t* ctx) {
|
void jar_xm_free_context(jar_xm_context_t* ctx) {
|
||||||
JARXM_FREE(ctx->allocated_memory);
|
if (ctx != NULL) {
|
||||||
|
JARXM_FREE(ctx->allocated_memory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt) {
|
void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt) {
|
||||||
|
|
|
||||||
240
src/models.c
240
src/models.c
|
|
@ -92,9 +92,7 @@
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Defines and Macros
|
// Defines and Macros
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#ifndef DEFAULT_MESH_VERTEX_BUFFERS
|
// ...
|
||||||
#define DEFAULT_MESH_VERTEX_BUFFERS 7 // Number of vertex buffers (VBO) per mesh
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Types and Structures Definition
|
// Types and Structures Definition
|
||||||
|
|
@ -860,8 +858,21 @@ void UploadMesh(Mesh *mesh)
|
||||||
// Unload mesh from memory (RAM and/or VRAM)
|
// Unload mesh from memory (RAM and/or VRAM)
|
||||||
void UnloadMesh(Mesh mesh)
|
void UnloadMesh(Mesh mesh)
|
||||||
{
|
{
|
||||||
rlUnloadMesh(mesh);
|
// Unload rlgl mesh vboId data
|
||||||
RL_FREE(mesh.vboId);
|
rlUnloadMesh(&mesh);
|
||||||
|
|
||||||
|
RL_FREE(mesh.vertices);
|
||||||
|
RL_FREE(mesh.texcoords);
|
||||||
|
RL_FREE(mesh.normals);
|
||||||
|
RL_FREE(mesh.colors);
|
||||||
|
RL_FREE(mesh.tangents);
|
||||||
|
RL_FREE(mesh.texcoords2);
|
||||||
|
RL_FREE(mesh.indices);
|
||||||
|
|
||||||
|
RL_FREE(mesh.animVertices);
|
||||||
|
RL_FREE(mesh.animNormals);
|
||||||
|
RL_FREE(mesh.boneWeights);
|
||||||
|
RL_FREE(mesh.boneIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Export mesh data to file
|
// Export mesh data to file
|
||||||
|
|
@ -1128,8 +1139,6 @@ Mesh GenMeshPoly(int sides, float radius)
|
||||||
|
|
||||||
if (sides < 3) return mesh;
|
if (sides < 3) return mesh;
|
||||||
|
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
int vertexCount = sides*3;
|
int vertexCount = sides*3;
|
||||||
|
|
||||||
// Vertices definition
|
// Vertices definition
|
||||||
|
|
@ -1186,6 +1195,7 @@ Mesh GenMeshPoly(int sides, float radius)
|
||||||
RL_FREE(texcoords);
|
RL_FREE(texcoords);
|
||||||
|
|
||||||
// Upload vertex data to GPU (static mesh)
|
// Upload vertex data to GPU (static mesh)
|
||||||
|
// NOTE: mesh.vboId array is allocated inside rlLoadMesh()
|
||||||
rlLoadMesh(&mesh, false);
|
rlLoadMesh(&mesh, false);
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
|
|
@ -1195,7 +1205,6 @@ Mesh GenMeshPoly(int sides, float radius)
|
||||||
Mesh GenMeshPlane(float width, float length, int resX, int resZ)
|
Mesh GenMeshPlane(float width, float length, int resX, int resZ)
|
||||||
{
|
{
|
||||||
Mesh mesh = { 0 };
|
Mesh mesh = { 0 };
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
#define CUSTOM_MESH_GEN_PLANE
|
#define CUSTOM_MESH_GEN_PLANE
|
||||||
#if defined(CUSTOM_MESH_GEN_PLANE)
|
#if defined(CUSTOM_MESH_GEN_PLANE)
|
||||||
|
|
@ -1329,7 +1338,6 @@ Mesh GenMeshPlane(float width, float length, int resX, int resZ)
|
||||||
Mesh GenMeshCube(float width, float height, float length)
|
Mesh GenMeshCube(float width, float height, float length)
|
||||||
{
|
{
|
||||||
Mesh mesh = { 0 };
|
Mesh mesh = { 0 };
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
#define CUSTOM_MESH_GEN_CUBE
|
#define CUSTOM_MESH_GEN_CUBE
|
||||||
#if defined(CUSTOM_MESH_GEN_CUBE)
|
#if defined(CUSTOM_MESH_GEN_CUBE)
|
||||||
|
|
@ -1498,8 +1506,6 @@ RLAPI Mesh GenMeshSphere(float radius, int rings, int slices)
|
||||||
|
|
||||||
if ((rings >= 3) && (slices >= 3))
|
if ((rings >= 3) && (slices >= 3))
|
||||||
{
|
{
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
par_shapes_mesh *sphere = par_shapes_create_parametric_sphere(slices, rings);
|
par_shapes_mesh *sphere = par_shapes_create_parametric_sphere(slices, rings);
|
||||||
par_shapes_scale(sphere, radius, radius, radius);
|
par_shapes_scale(sphere, radius, radius, radius);
|
||||||
// NOTE: Soft normals are computed internally
|
// NOTE: Soft normals are computed internally
|
||||||
|
|
@ -1544,8 +1550,6 @@ RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices)
|
||||||
{
|
{
|
||||||
if (radius < 0.0f) radius = 0.0f;
|
if (radius < 0.0f) radius = 0.0f;
|
||||||
|
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
par_shapes_mesh *sphere = par_shapes_create_hemisphere(slices, rings);
|
par_shapes_mesh *sphere = par_shapes_create_hemisphere(slices, rings);
|
||||||
par_shapes_scale(sphere, radius, radius, radius);
|
par_shapes_scale(sphere, radius, radius, radius);
|
||||||
// NOTE: Soft normals are computed internally
|
// NOTE: Soft normals are computed internally
|
||||||
|
|
@ -1588,8 +1592,6 @@ Mesh GenMeshCylinder(float radius, float height, int slices)
|
||||||
|
|
||||||
if (slices >= 3)
|
if (slices >= 3)
|
||||||
{
|
{
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
// Instance a cylinder that sits on the Z=0 plane using the given tessellation
|
// Instance a cylinder that sits on the Z=0 plane using the given tessellation
|
||||||
// levels across the UV domain. Think of "slices" like a number of pizza
|
// levels across the UV domain. Think of "slices" like a number of pizza
|
||||||
// slices, and "stacks" like a number of stacked rings.
|
// slices, and "stacks" like a number of stacked rings.
|
||||||
|
|
@ -1653,8 +1655,6 @@ Mesh GenMeshTorus(float radius, float size, int radSeg, int sides)
|
||||||
|
|
||||||
if ((sides >= 3) && (radSeg >= 3))
|
if ((sides >= 3) && (radSeg >= 3))
|
||||||
{
|
{
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
if (radius > 1.0f) radius = 1.0f;
|
if (radius > 1.0f) radius = 1.0f;
|
||||||
else if (radius < 0.1f) radius = 0.1f;
|
else if (radius < 0.1f) radius = 0.1f;
|
||||||
|
|
||||||
|
|
@ -1701,8 +1701,6 @@ Mesh GenMeshKnot(float radius, float size, int radSeg, int sides)
|
||||||
|
|
||||||
if ((sides >= 3) && (radSeg >= 3))
|
if ((sides >= 3) && (radSeg >= 3))
|
||||||
{
|
{
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
if (radius > 3.0f) radius = 3.0f;
|
if (radius > 3.0f) radius = 3.0f;
|
||||||
else if (radius < 0.5f) radius = 0.5f;
|
else if (radius < 0.5f) radius = 0.5f;
|
||||||
|
|
||||||
|
|
@ -1747,7 +1745,6 @@ Mesh GenMeshHeightmap(Image heightmap, Vector3 size)
|
||||||
#define GRAY_VALUE(c) ((c.r+c.g+c.b)/3)
|
#define GRAY_VALUE(c) ((c.r+c.g+c.b)/3)
|
||||||
|
|
||||||
Mesh mesh = { 0 };
|
Mesh mesh = { 0 };
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
int mapX = heightmap.width;
|
int mapX = heightmap.width;
|
||||||
int mapZ = heightmap.height;
|
int mapZ = heightmap.height;
|
||||||
|
|
@ -1883,7 +1880,6 @@ Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)
|
||||||
#define COLOR_EQUAL(col1, col2) ((col1.r == col2.r)&&(col1.g == col2.g)&&(col1.b == col2.b)&&(col1.a == col2.a))
|
#define COLOR_EQUAL(col1, col2) ((col1.r == col2.r)&&(col1.g == col2.g)&&(col1.b == col2.b)&&(col1.a == col2.a))
|
||||||
|
|
||||||
Mesh mesh = { 0 };
|
Mesh mesh = { 0 };
|
||||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
Color *pixels = LoadImageColors(cubicmap);
|
Color *pixels = LoadImageColors(cubicmap);
|
||||||
|
|
||||||
|
|
@ -2842,7 +2838,6 @@ static Model LoadOBJ(const char *fileName)
|
||||||
model.meshes[mi].vertices = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
model.meshes[mi].vertices = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
||||||
model.meshes[mi].texcoords = (float *)RL_CALLOC(model.meshes[mi].vertexCount*2, sizeof(float));
|
model.meshes[mi].texcoords = (float *)RL_CALLOC(model.meshes[mi].vertexCount*2, sizeof(float));
|
||||||
model.meshes[mi].normals = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
model.meshes[mi].normals = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
||||||
model.meshes[mi].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
model.meshMaterial[mi] = mi;
|
model.meshMaterial[mi] = mi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3108,8 +3103,6 @@ static Model LoadIQM(const char *fileName)
|
||||||
// NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning)
|
// NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning)
|
||||||
model.meshes[i].animVertices = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
model.meshes[i].animVertices = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
||||||
model.meshes[i].animNormals = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
model.meshes[i].animNormals = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
||||||
|
|
||||||
model.meshes[i].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Triangles data processing
|
// Triangles data processing
|
||||||
|
|
@ -3723,63 +3716,64 @@ static Model LoadGLTF(const char *fileName)
|
||||||
model.materialCount = (int)data->materials_count + 1;
|
model.materialCount = (int)data->materials_count + 1;
|
||||||
model.materials = RL_MALLOC(model.materialCount*sizeof(Material));
|
model.materials = RL_MALLOC(model.materialCount*sizeof(Material));
|
||||||
model.meshMaterial = RL_MALLOC(model.meshCount*sizeof(int));
|
model.meshMaterial = RL_MALLOC(model.meshCount*sizeof(int));
|
||||||
model.boneCount = data->nodes_count;
|
model.boneCount = (int)data->nodes_count;
|
||||||
model.bones = RL_CALLOC(model.boneCount, sizeof(BoneInfo));
|
model.bones = RL_CALLOC(model.boneCount, sizeof(BoneInfo));
|
||||||
model.bindPose = RL_CALLOC(model.boneCount, sizeof(Transform));
|
model.bindPose = RL_CALLOC(model.boneCount, sizeof(Transform));
|
||||||
|
|
||||||
for (int i = 0; i < model.meshCount; i++)
|
|
||||||
model.meshes[i].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
|
||||||
|
|
||||||
for (unsigned int j = 0; j < data->nodes_count; j++)
|
for (unsigned int j = 0; j < data->nodes_count; j++)
|
||||||
{
|
{
|
||||||
strcpy(model.bones[j].name, data->nodes[j].name == 0 ? "ANIMJOINT" : data->nodes[j].name);
|
strcpy(model.bones[j].name, data->nodes[j].name == 0 ? "ANIMJOINT" : data->nodes[j].name);
|
||||||
model.bones[j].parent = j != 0 ? data->nodes[j].parent - data->nodes : 0;
|
model.bones[j].parent = (data->nodes[j].parent != NULL) ? data->nodes[j].parent - data->nodes : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < data->nodes_count; i++)
|
for (unsigned int i = 0; i < data->nodes_count; i++)
|
||||||
{
|
{
|
||||||
if (data->nodes[i].has_translation)
|
if (data->nodes[i].has_translation) memcpy(&model.bindPose[i].translation, data->nodes[i].translation, 3 * sizeof(float));
|
||||||
{
|
else model.bindPose[i].translation = Vector3Zero();
|
||||||
memcpy(&model.bindPose[i].translation, data->nodes[i].translation, 3 * sizeof(float));
|
|
||||||
}
|
if (data->nodes[i].has_rotation) memcpy(&model.bindPose[i].rotation, data->nodes[i].rotation, 4 * sizeof(float));
|
||||||
else
|
else model.bindPose[i].rotation = QuaternionIdentity();
|
||||||
{
|
|
||||||
model.bindPose[i].translation = Vector3Zero();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->nodes[i].has_rotation)
|
|
||||||
{
|
|
||||||
memcpy(&model.bindPose[i].rotation, data->nodes[i].rotation, 4 * sizeof(float));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
model.bindPose[i].rotation = QuaternionIdentity();
|
|
||||||
}
|
|
||||||
model.bindPose[i].rotation = QuaternionNormalize(model.bindPose[i].rotation);
|
model.bindPose[i].rotation = QuaternionNormalize(model.bindPose[i].rotation);
|
||||||
|
|
||||||
if (data->nodes[i].has_scale)
|
if (data->nodes[i].has_scale) memcpy(&model.bindPose[i].scale, data->nodes[i].scale, 3 * sizeof(float));
|
||||||
{
|
else model.bindPose[i].scale = Vector3One();
|
||||||
memcpy(&model.bindPose[i].scale, data->nodes[i].scale, 3 * sizeof(float));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
model.bindPose[i].scale = Vector3One();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < model.boneCount; i++)
|
|
||||||
{
|
{
|
||||||
Transform* currentTransform = model.bindPose + i;
|
bool* completedBones = RL_CALLOC(model.boneCount, sizeof(bool));
|
||||||
BoneInfo* currentBone = model.bones + i;
|
int numberCompletedBones = 0;
|
||||||
Transform* parentTransform = model.bindPose + currentBone->parent;
|
|
||||||
|
while (numberCompletedBones < model.boneCount) {
|
||||||
if (currentBone->parent >= 0)
|
for (int i = 0; i < model.boneCount; i++)
|
||||||
{
|
{
|
||||||
currentTransform->rotation = QuaternionMultiply(parentTransform->rotation, currentTransform->rotation);
|
if (completedBones[i]) continue;
|
||||||
currentTransform->translation = Vector3RotateByQuaternion(currentTransform->translation, parentTransform->rotation);
|
|
||||||
currentTransform->translation = Vector3Add(currentTransform->translation, parentTransform->translation);
|
if (model.bones[i].parent < 0) {
|
||||||
currentTransform->scale = Vector3Multiply(parentTransform->scale, parentTransform->scale);
|
completedBones[i] = true;
|
||||||
|
numberCompletedBones++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!completedBones[model.bones[i].parent]) continue;
|
||||||
|
|
||||||
|
Transform* currentTransform = &model.bindPose[i];
|
||||||
|
BoneInfo* currentBone = &model.bones[i];
|
||||||
|
int root = currentBone->parent;
|
||||||
|
if (root >= model.boneCount)
|
||||||
|
root = 0;
|
||||||
|
Transform* parentTransform = &model.bindPose[root];
|
||||||
|
|
||||||
|
currentTransform->rotation = QuaternionMultiply(parentTransform->rotation, currentTransform->rotation);
|
||||||
|
currentTransform->translation = Vector3RotateByQuaternion(currentTransform->translation, parentTransform->rotation);
|
||||||
|
currentTransform->translation = Vector3Add(currentTransform->translation, parentTransform->translation);
|
||||||
|
currentTransform->scale = Vector3Multiply(parentTransform->scale, parentTransform->scale);
|
||||||
|
completedBones[i] = true;
|
||||||
|
numberCompletedBones++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RL_FREE(completedBones);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < model.materialCount - 1; i++)
|
for (int i = 0; i < model.materialCount - 1; i++)
|
||||||
|
|
@ -3788,7 +3782,7 @@ static Model LoadGLTF(const char *fileName)
|
||||||
Color tint = (Color){ 255, 255, 255, 255 };
|
Color tint = (Color){ 255, 255, 255, 255 };
|
||||||
const char *texPath = GetDirectoryPath(fileName);
|
const char *texPath = GetDirectoryPath(fileName);
|
||||||
|
|
||||||
//Ensure material follows raylib support for PBR (metallic/roughness flow)
|
// Ensure material follows raylib support for PBR (metallic/roughness flow)
|
||||||
if (data->materials[i].has_pbr_metallic_roughness)
|
if (data->materials[i].has_pbr_metallic_roughness)
|
||||||
{
|
{
|
||||||
tint.r = (unsigned char)(data->materials[i].pbr_metallic_roughness.base_color_factor[0] * 255);
|
tint.r = (unsigned char)(data->materials[i].pbr_metallic_roughness.base_color_factor[0] * 255);
|
||||||
|
|
@ -3872,7 +3866,7 @@ static Model LoadGLTF(const char *fileName)
|
||||||
else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_normal)
|
else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_normal)
|
||||||
{
|
{
|
||||||
cgltf_accessor *acc = data->meshes[i].primitives[p].attributes[j].data;
|
cgltf_accessor *acc = data->meshes[i].primitives[p].attributes[j].data;
|
||||||
int bufferSize = acc->count*3*sizeof(float);
|
int bufferSize = (int)(acc->count*3*sizeof(float));
|
||||||
model.meshes[primitiveIndex].normals = RL_MALLOC(bufferSize);
|
model.meshes[primitiveIndex].normals = RL_MALLOC(bufferSize);
|
||||||
model.meshes[primitiveIndex].animNormals = RL_MALLOC(bufferSize);
|
model.meshes[primitiveIndex].animNormals = RL_MALLOC(bufferSize);
|
||||||
|
|
||||||
|
|
@ -3904,7 +3898,28 @@ static Model LoadGLTF(const char *fileName)
|
||||||
short* bones = RL_MALLOC(sizeof(short) * acc->count * 4);
|
short* bones = RL_MALLOC(sizeof(short) * acc->count * 4);
|
||||||
|
|
||||||
LOAD_ACCESSOR(short, 4, acc, bones);
|
LOAD_ACCESSOR(short, 4, acc, bones);
|
||||||
for (unsigned int a = 0; a < acc->count * 4; a ++)
|
for (unsigned int a = 0; a < acc->count * 4; a++)
|
||||||
|
{
|
||||||
|
cgltf_node* skinJoint = data->skins->joints[bones[a]];
|
||||||
|
|
||||||
|
for (unsigned int k = 0; k < data->nodes_count; k++)
|
||||||
|
{
|
||||||
|
if (&(data->nodes[k]) == skinJoint)
|
||||||
|
{
|
||||||
|
model.meshes[primitiveIndex].boneIds[a] = k;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RL_FREE(bones);
|
||||||
|
}
|
||||||
|
else if (acc->component_type == cgltf_component_type_r_8u)
|
||||||
|
{
|
||||||
|
model.meshes[primitiveIndex].boneIds = RL_MALLOC(sizeof(int) * acc->count * 4);
|
||||||
|
unsigned char* bones = RL_MALLOC(sizeof(unsigned char) * acc->count * 4);
|
||||||
|
|
||||||
|
LOAD_ACCESSOR(unsigned char, 4, acc, bones);
|
||||||
|
for (unsigned int a = 0; a < acc->count * 4; a++)
|
||||||
{
|
{
|
||||||
cgltf_node* skinJoint = data->skins->joints[bones[a]];
|
cgltf_node* skinJoint = data->skins->joints[bones[a]];
|
||||||
|
|
||||||
|
|
@ -4004,7 +4019,7 @@ static bool GltfReadFloat(cgltf_accessor* acc, unsigned int index, float* variab
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadGLTF loads in animation data from given filename
|
// LoadGLTF loads in animation data from given filename
|
||||||
static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCount)
|
static ModelAnimation *LoadGLTFModelAnimations(const char *fileName, int *animCount)
|
||||||
{
|
{
|
||||||
/***********************************************************************************
|
/***********************************************************************************
|
||||||
|
|
||||||
|
|
@ -4017,6 +4032,7 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
*************************************************************************************/
|
*************************************************************************************/
|
||||||
|
|
||||||
// glTF file loading
|
// glTF file loading
|
||||||
unsigned int dataSize = 0;
|
unsigned int dataSize = 0;
|
||||||
unsigned char *fileData = LoadFileData(fileName, &dataSize);
|
unsigned char *fileData = LoadFileData(fileName, &dataSize);
|
||||||
|
|
@ -4034,6 +4050,9 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
{
|
{
|
||||||
TRACELOG(LOG_INFO, "MODEL: [%s] glTF animations (%s) count: %i", fileName, (data->file_type == 2)? "glb" :
|
TRACELOG(LOG_INFO, "MODEL: [%s] glTF animations (%s) count: %i", fileName, (data->file_type == 2)? "glb" :
|
||||||
"gltf", data->animations_count);
|
"gltf", data->animations_count);
|
||||||
|
|
||||||
|
result = cgltf_load_buffers(&options, data, fileName);
|
||||||
|
if (result != cgltf_result_success) TRACELOG(LOG_WARNING, "MODEL: [%s] unable to load glTF animations data", fileName);
|
||||||
|
|
||||||
animations = RL_MALLOC(data->animations_count*sizeof(ModelAnimation));
|
animations = RL_MALLOC(data->animations_count*sizeof(ModelAnimation));
|
||||||
|
|
||||||
|
|
@ -4061,8 +4080,9 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
for (unsigned int i = 0; i < animation->channels_count; i++)
|
for (unsigned int i = 0; i < animation->channels_count; i++)
|
||||||
{
|
{
|
||||||
cgltf_animation_channel* channel = animation->channels + i;
|
cgltf_animation_channel* channel = animation->channels + i;
|
||||||
int frameCounts = channel->sampler->input->count;
|
int frameCounts = (int)channel->sampler->input->count;
|
||||||
float lastFrameTime = 0.0f;
|
float lastFrameTime = 0.0f;
|
||||||
|
|
||||||
if (GltfReadFloat(channel->sampler->input, frameCounts - 1, &lastFrameTime, 1))
|
if (GltfReadFloat(channel->sampler->input, frameCounts - 1, &lastFrameTime, 1))
|
||||||
{
|
{
|
||||||
animationDuration = fmaxf(lastFrameTime, animationDuration);
|
animationDuration = fmaxf(lastFrameTime, animationDuration);
|
||||||
|
|
@ -4070,7 +4090,7 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
}
|
}
|
||||||
|
|
||||||
output->frameCount = (int)(animationDuration / TIMESTEP);
|
output->frameCount = (int)(animationDuration / TIMESTEP);
|
||||||
output->boneCount = data->nodes_count;
|
output->boneCount = (int)data->nodes_count;
|
||||||
output->bones = RL_MALLOC(output->boneCount*sizeof(BoneInfo));
|
output->bones = RL_MALLOC(output->boneCount*sizeof(BoneInfo));
|
||||||
output->framePoses = RL_MALLOC(output->frameCount*sizeof(Transform *));
|
output->framePoses = RL_MALLOC(output->frameCount*sizeof(Transform *));
|
||||||
// output->framerate = // TODO: Use framerate instead of const timestep
|
// output->framerate = // TODO: Use framerate instead of const timestep
|
||||||
|
|
@ -4079,7 +4099,7 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
for (unsigned int j = 0; j < data->nodes_count; j++)
|
for (unsigned int j = 0; j < data->nodes_count; j++)
|
||||||
{
|
{
|
||||||
strcpy(output->bones[j].name, data->nodes[j].name == 0 ? "ANIMJOINT" : data->nodes[j].name);
|
strcpy(output->bones[j].name, data->nodes[j].name == 0 ? "ANIMJOINT" : data->nodes[j].name);
|
||||||
output->bones[j].parent = j != 0 ? (int)(data->nodes[j].parent - data->nodes) : 0;
|
output->bones[j].parent = (data->nodes[j].parent != NULL) ? (int)(data->nodes[j].parent - data->nodes) : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate data for frames
|
// Allocate data for frames
|
||||||
|
|
@ -4103,7 +4123,7 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
cgltf_animation_channel* channel = animation->channels + channelId;
|
cgltf_animation_channel* channel = animation->channels + channelId;
|
||||||
cgltf_animation_sampler* sampler = channel->sampler;
|
cgltf_animation_sampler* sampler = channel->sampler;
|
||||||
|
|
||||||
int boneId = channel->target_node - data->nodes;
|
int boneId = (int)(channel->target_node - data->nodes);
|
||||||
|
|
||||||
for (int frame = 0; frame < output->frameCount; frame++)
|
for (int frame = 0; frame < output->frameCount; frame++)
|
||||||
{
|
{
|
||||||
|
|
@ -4119,68 +4139,62 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
for (unsigned int j = 0; j < sampler->input->count; j++)
|
for (unsigned int j = 0; j < sampler->input->count; j++)
|
||||||
{
|
{
|
||||||
float inputFrameTime;
|
float inputFrameTime;
|
||||||
if (GltfReadFloat(sampler->input, j, (float*)&inputFrameTime, 1))
|
if (GltfReadFloat(sampler->input, j, (float *)&inputFrameTime, 1))
|
||||||
{
|
{
|
||||||
if (frameTime < inputFrameTime)
|
if (frameTime < inputFrameTime)
|
||||||
{
|
{
|
||||||
shouldSkipFurtherTransformation = false;
|
shouldSkipFurtherTransformation = false;
|
||||||
outputMin = j - 1;
|
outputMin = (j == 0) ? 0 : j - 1;
|
||||||
outputMax = j;
|
outputMax = j;
|
||||||
|
|
||||||
float previousInputTime = 0.0f;
|
float previousInputTime = 0.0f;
|
||||||
if (GltfReadFloat(sampler->input, j - 1, (float*)&previousInputTime, 1))
|
if (GltfReadFloat(sampler->input, outputMin, (float *)&previousInputTime, 1))
|
||||||
{
|
{
|
||||||
lerpPercent = (frameTime - previousInputTime) / (inputFrameTime - previousInputTime);
|
lerpPercent = (frameTime - previousInputTime)/(inputFrameTime - previousInputTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
break;
|
else break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the current transformation has no information for the current frame time point
|
// If the current transformation has no information for the current frame time point
|
||||||
if (shouldSkipFurtherTransformation) {
|
if (shouldSkipFurtherTransformation) continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (channel->target_path == cgltf_animation_path_type_translation) {
|
if (channel->target_path == cgltf_animation_path_type_translation)
|
||||||
|
{
|
||||||
Vector3 translationStart;
|
Vector3 translationStart;
|
||||||
Vector3 translationEnd;
|
Vector3 translationEnd;
|
||||||
|
|
||||||
bool success = GltfReadFloat(sampler->output, outputMin, (float*)&translationStart, 3);
|
bool success = GltfReadFloat(sampler->output, outputMin, (float *)&translationStart, 3);
|
||||||
success = GltfReadFloat(sampler->output, outputMax, (float*)&translationEnd, 3) || success;
|
success = GltfReadFloat(sampler->output, outputMax, (float *)&translationEnd, 3) || success;
|
||||||
|
|
||||||
if (success)
|
if (success) output->framePoses[frame][boneId].translation = Vector3Lerp(translationStart, translationEnd, lerpPercent);
|
||||||
{
|
|
||||||
output->framePoses[frame][boneId].translation = Vector3Lerp(translationStart, translationEnd, lerpPercent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (channel->target_path == cgltf_animation_path_type_rotation) {
|
if (channel->target_path == cgltf_animation_path_type_rotation)
|
||||||
|
{
|
||||||
Quaternion rotationStart;
|
Quaternion rotationStart;
|
||||||
Quaternion rotationEnd;
|
Quaternion rotationEnd;
|
||||||
|
|
||||||
bool success = GltfReadFloat(sampler->output, outputMin, (float*)&rotationStart, 4);
|
bool success = GltfReadFloat(sampler->output, outputMin, (float *)&rotationStart, 4);
|
||||||
success = GltfReadFloat(sampler->output, outputMax, (float*)&rotationEnd, 4) || success;
|
success = GltfReadFloat(sampler->output, outputMax, (float *)&rotationEnd, 4) || success;
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
output->framePoses[frame][boneId].rotation = QuaternionLerp(rotationStart, rotationEnd, lerpPercent);
|
output->framePoses[frame][boneId].rotation = QuaternionLerp(rotationStart, rotationEnd, lerpPercent);
|
||||||
output->framePoses[frame][boneId].rotation = QuaternionNormalize(output->framePoses[frame][boneId].rotation);
|
output->framePoses[frame][boneId].rotation = QuaternionNormalize(output->framePoses[frame][boneId].rotation);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (channel->target_path == cgltf_animation_path_type_scale) {
|
if (channel->target_path == cgltf_animation_path_type_scale)
|
||||||
|
{
|
||||||
Vector3 scaleStart;
|
Vector3 scaleStart;
|
||||||
Vector3 scaleEnd;
|
Vector3 scaleEnd;
|
||||||
|
|
||||||
bool success = GltfReadFloat(sampler->output, outputMin, (float*)&scaleStart, 3);
|
bool success = GltfReadFloat(sampler->output, outputMin, (float *)&scaleStart, 3);
|
||||||
success = GltfReadFloat(sampler->output, outputMax, (float*)&scaleEnd, 3) || success;
|
success = GltfReadFloat(sampler->output, outputMax, (float *)&scaleEnd, 3) || success;
|
||||||
|
|
||||||
if (success)
|
if (success) output->framePoses[frame][boneId].scale = Vector3Lerp(scaleStart, scaleEnd, lerpPercent);
|
||||||
{
|
|
||||||
output->framePoses[frame][boneId].scale = Vector3Lerp(scaleStart, scaleEnd, lerpPercent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4188,16 +4202,34 @@ static ModelAnimation* LoadGLTFModelAnimations(const char *fileName, int *animCo
|
||||||
// Build frameposes
|
// Build frameposes
|
||||||
for (int frame = 0; frame < output->frameCount; frame++)
|
for (int frame = 0; frame < output->frameCount; frame++)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < output->boneCount; i++)
|
bool *completedBones = RL_CALLOC(output->boneCount, sizeof(bool));
|
||||||
|
int numberCompletedBones = 0;
|
||||||
|
|
||||||
|
while (numberCompletedBones < output->boneCount)
|
||||||
{
|
{
|
||||||
if (output->bones[i].parent >= 0)
|
for (int i = 0; i < output->boneCount; i++)
|
||||||
{
|
{
|
||||||
|
if (completedBones[i]) continue;
|
||||||
|
|
||||||
|
if (output->bones[i].parent < 0)
|
||||||
|
{
|
||||||
|
completedBones[i] = true;
|
||||||
|
numberCompletedBones++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!completedBones[output->bones[i].parent]) continue;
|
||||||
|
|
||||||
output->framePoses[frame][i].rotation = QuaternionMultiply(output->framePoses[frame][output->bones[i].parent].rotation, output->framePoses[frame][i].rotation);
|
output->framePoses[frame][i].rotation = QuaternionMultiply(output->framePoses[frame][output->bones[i].parent].rotation, output->framePoses[frame][i].rotation);
|
||||||
output->framePoses[frame][i].translation = Vector3RotateByQuaternion(output->framePoses[frame][i].translation, output->framePoses[frame][output->bones[i].parent].rotation);
|
output->framePoses[frame][i].translation = Vector3RotateByQuaternion(output->framePoses[frame][i].translation, output->framePoses[frame][output->bones[i].parent].rotation);
|
||||||
output->framePoses[frame][i].translation = Vector3Add(output->framePoses[frame][i].translation, output->framePoses[frame][output->bones[i].parent].translation);
|
output->framePoses[frame][i].translation = Vector3Add(output->framePoses[frame][i].translation, output->framePoses[frame][output->bones[i].parent].translation);
|
||||||
output->framePoses[frame][i].scale = Vector3Multiply(output->framePoses[frame][i].scale, output->framePoses[frame][output->bones[i].parent].scale);
|
output->framePoses[frame][i].scale = Vector3Multiply(output->framePoses[frame][i].scale, output->framePoses[frame][output->bones[i].parent].scale);
|
||||||
|
completedBones[i] = true;
|
||||||
|
numberCompletedBones++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RL_FREE(completedBones);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
192
src/physac.h
192
src/physac.h
|
|
@ -112,7 +112,7 @@
|
||||||
#define PHYSAC_PENETRATION_ALLOWANCE 0.05f
|
#define PHYSAC_PENETRATION_ALLOWANCE 0.05f
|
||||||
#define PHYSAC_PENETRATION_CORRECTION 0.4f
|
#define PHYSAC_PENETRATION_CORRECTION 0.4f
|
||||||
|
|
||||||
#define PHYSAC_PI 3.14159265358979323846
|
#define PHYSAC_PI 3.14159265358979323846f
|
||||||
#define PHYSAC_DEG2RAD (PHYSAC_PI/180.0f)
|
#define PHYSAC_DEG2RAD (PHYSAC_PI/180.0f)
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
@ -258,13 +258,15 @@ PHYSACDEF Vector2 GetPhysicsShapeVertex(PhysicsBody body, int vertex);
|
||||||
// Functions required to query time on Windows
|
// Functions required to query time on Windows
|
||||||
int __stdcall QueryPerformanceCounter(unsigned long long int *lpPerformanceCount);
|
int __stdcall QueryPerformanceCounter(unsigned long long int *lpPerformanceCount);
|
||||||
int __stdcall QueryPerformanceFrequency(unsigned long long int *lpFrequency);
|
int __stdcall QueryPerformanceFrequency(unsigned long long int *lpFrequency);
|
||||||
#elif defined(__linux__)
|
#endif
|
||||||
|
#if defined(__linux__) || defined(__FreeBSD__)
|
||||||
#if _POSIX_C_SOURCE < 199309L
|
#if _POSIX_C_SOURCE < 199309L
|
||||||
#undef _POSIX_C_SOURCE
|
#undef _POSIX_C_SOURCE
|
||||||
#define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
#define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
||||||
#endif
|
#endif
|
||||||
#include <sys/time.h> // Required for: timespec
|
#include <sys/time.h> // Required for: timespec
|
||||||
#elif defined(__APPLE__) // macOS also defines __MACH__
|
#endif
|
||||||
|
#if defined(__APPLE__) // macOS also defines __MACH__
|
||||||
#include <mach/mach_time.h> // Required for: mach_absolute_time()
|
#include <mach/mach_time.h> // Required for: mach_absolute_time()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -412,11 +414,11 @@ PHYSACDEF PhysicsBody CreatePhysicsBodyRectangle(Vector2 pos, float width, float
|
||||||
float area = 0.0f;
|
float area = 0.0f;
|
||||||
float inertia = 0.0f;
|
float inertia = 0.0f;
|
||||||
|
|
||||||
for (int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
// Triangle vertices, third vertex implied as (0, 0)
|
// Triangle vertices, third vertex implied as (0, 0)
|
||||||
Vector2 p1 = body->shape.vertexData.positions[i];
|
Vector2 p1 = body->shape.vertexData.positions[i];
|
||||||
int nextIndex = (((i + 1) < body->shape.vertexData.vertexCount) ? (i + 1) : 0);
|
unsigned int nextIndex = (((i + 1) < body->shape.vertexData.vertexCount) ? (i + 1) : 0);
|
||||||
Vector2 p2 = body->shape.vertexData.positions[nextIndex];
|
Vector2 p2 = body->shape.vertexData.positions[nextIndex];
|
||||||
|
|
||||||
float D = MathVector2CrossProduct(p1, p2);
|
float D = MathVector2CrossProduct(p1, p2);
|
||||||
|
|
@ -438,7 +440,7 @@ PHYSACDEF PhysicsBody CreatePhysicsBodyRectangle(Vector2 pos, float width, float
|
||||||
|
|
||||||
// Translate vertices to centroid (make the centroid (0, 0) for the polygon in model space)
|
// Translate vertices to centroid (make the centroid (0, 0) for the polygon in model space)
|
||||||
// Note: this is not really necessary
|
// Note: this is not really necessary
|
||||||
for (int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
body->shape.vertexData.positions[i].x -= center.x;
|
body->shape.vertexData.positions[i].x -= center.x;
|
||||||
body->shape.vertexData.positions[i].y -= center.y;
|
body->shape.vertexData.positions[i].y -= center.y;
|
||||||
|
|
@ -494,11 +496,11 @@ PHYSACDEF PhysicsBody CreatePhysicsBodyPolygon(Vector2 pos, float radius, int si
|
||||||
float area = 0.0f;
|
float area = 0.0f;
|
||||||
float inertia = 0.0f;
|
float inertia = 0.0f;
|
||||||
|
|
||||||
for (int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
// Triangle vertices, third vertex implied as (0, 0)
|
// Triangle vertices, third vertex implied as (0, 0)
|
||||||
Vector2 position1 = body->shape.vertexData.positions[i];
|
Vector2 position1 = body->shape.vertexData.positions[i];
|
||||||
int nextIndex = (((i + 1) < body->shape.vertexData.vertexCount) ? (i + 1) : 0);
|
unsigned int nextIndex = (((i + 1) < body->shape.vertexData.vertexCount) ? (i + 1) : 0);
|
||||||
Vector2 position2 = body->shape.vertexData.positions[nextIndex];
|
Vector2 position2 = body->shape.vertexData.positions[nextIndex];
|
||||||
|
|
||||||
float cross = MathVector2CrossProduct(position1, position2);
|
float cross = MathVector2CrossProduct(position1, position2);
|
||||||
|
|
@ -520,7 +522,7 @@ PHYSACDEF PhysicsBody CreatePhysicsBodyPolygon(Vector2 pos, float radius, int si
|
||||||
|
|
||||||
// Translate vertices to centroid (make the centroid (0, 0) for the polygon in model space)
|
// Translate vertices to centroid (make the centroid (0, 0) for the polygon in model space)
|
||||||
// Note: this is not really necessary
|
// Note: this is not really necessary
|
||||||
for (int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < body->shape.vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
body->shape.vertexData.positions[i].x -= center.x;
|
body->shape.vertexData.positions[i].x -= center.x;
|
||||||
body->shape.vertexData.positions[i].y -= center.y;
|
body->shape.vertexData.positions[i].y -= center.y;
|
||||||
|
|
@ -570,11 +572,11 @@ PHYSACDEF void PhysicsShatter(PhysicsBody body, Vector2 position, float force)
|
||||||
PhysicsVertexData vertexData = body->shape.vertexData;
|
PhysicsVertexData vertexData = body->shape.vertexData;
|
||||||
bool collision = false;
|
bool collision = false;
|
||||||
|
|
||||||
for (int i = 0; i < vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
Vector2 positionA = body->position;
|
Vector2 positionA = body->position;
|
||||||
Vector2 positionB = MathMatVector2Product(body->shape.transform, MathVector2Add(body->position, vertexData.positions[i]));
|
Vector2 positionB = MathMatVector2Product(body->shape.transform, MathVector2Add(body->position, vertexData.positions[i]));
|
||||||
int nextIndex = (((i + 1) < vertexData.vertexCount) ? (i + 1) : 0);
|
unsigned int nextIndex = (((i + 1) < vertexData.vertexCount) ? (i + 1) : 0);
|
||||||
Vector2 positionC = MathMatVector2Product(body->shape.transform, MathVector2Add(body->position, vertexData.positions[nextIndex]));
|
Vector2 positionC = MathMatVector2Product(body->shape.transform, MathVector2Add(body->position, vertexData.positions[nextIndex]));
|
||||||
|
|
||||||
// Check collision between each triangle
|
// Check collision between each triangle
|
||||||
|
|
@ -629,9 +631,9 @@ PHYSACDEF void PhysicsShatter(PhysicsBody body, Vector2 position, float force)
|
||||||
vertexData.positions[2].y *= 0.95f;
|
vertexData.positions[2].y *= 0.95f;
|
||||||
|
|
||||||
// Calculate polygon faces normals
|
// Calculate polygon faces normals
|
||||||
for (int j = 0; j < vertexData.vertexCount; j++)
|
for (unsigned int j = 0; j < vertexData.vertexCount; j++)
|
||||||
{
|
{
|
||||||
int nextVertex = (((j + 1) < vertexData.vertexCount) ? (j + 1) : 0);
|
unsigned int nextVertex = (((j + 1) < vertexData.vertexCount) ? (j + 1) : 0);
|
||||||
Vector2 face = MathVector2Subtract(vertexData.positions[nextVertex], vertexData.positions[j]);
|
Vector2 face = MathVector2Subtract(vertexData.positions[nextVertex], vertexData.positions[j]);
|
||||||
|
|
||||||
vertexData.normals[j] = CLITERAL(Vector2){ face.y, -face.x };
|
vertexData.normals[j] = CLITERAL(Vector2){ face.y, -face.x };
|
||||||
|
|
@ -647,11 +649,11 @@ PHYSACDEF void PhysicsShatter(PhysicsBody body, Vector2 position, float force)
|
||||||
float area = 0.0f;
|
float area = 0.0f;
|
||||||
float inertia = 0.0f;
|
float inertia = 0.0f;
|
||||||
|
|
||||||
for (int j = 0; j < body->shape.vertexData.vertexCount; j++)
|
for (unsigned int j = 0; j < body->shape.vertexData.vertexCount; j++)
|
||||||
{
|
{
|
||||||
// Triangle vertices, third vertex implied as (0, 0)
|
// Triangle vertices, third vertex implied as (0, 0)
|
||||||
Vector2 p1 = body->shape.vertexData.positions[j];
|
Vector2 p1 = body->shape.vertexData.positions[j];
|
||||||
int nextVertex = (((j + 1) < body->shape.vertexData.vertexCount) ? (j + 1) : 0);
|
unsigned int nextVertex = (((j + 1) < body->shape.vertexData.vertexCount) ? (j + 1) : 0);
|
||||||
Vector2 p2 = body->shape.vertexData.positions[nextVertex];
|
Vector2 p2 = body->shape.vertexData.positions[nextVertex];
|
||||||
|
|
||||||
float D = MathVector2CrossProduct(p1, p2);
|
float D = MathVector2CrossProduct(p1, p2);
|
||||||
|
|
@ -708,7 +710,7 @@ PHYSACDEF PhysicsBody GetPhysicsBody(int index)
|
||||||
{
|
{
|
||||||
PhysicsBody body = NULL;
|
PhysicsBody body = NULL;
|
||||||
|
|
||||||
if (index < physicsBodiesCount)
|
if (index < (int)physicsBodiesCount)
|
||||||
{
|
{
|
||||||
body = bodies[index];
|
body = bodies[index];
|
||||||
|
|
||||||
|
|
@ -724,7 +726,7 @@ PHYSACDEF int GetPhysicsShapeType(int index)
|
||||||
{
|
{
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
if (index < physicsBodiesCount)
|
if (index < (int)physicsBodiesCount)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[index];
|
PhysicsBody body = bodies[index];
|
||||||
|
|
||||||
|
|
@ -741,7 +743,7 @@ PHYSACDEF int GetPhysicsShapeVerticesCount(int index)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
if (index < physicsBodiesCount)
|
if (index < (int)physicsBodiesCount)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[index];
|
PhysicsBody body = bodies[index];
|
||||||
|
|
||||||
|
|
@ -807,7 +809,7 @@ PHYSACDEF void DestroyPhysicsBody(PhysicsBody body)
|
||||||
int id = body->id;
|
int id = body->id;
|
||||||
int index = -1;
|
int index = -1;
|
||||||
|
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
if (bodies[i]->id == id)
|
if (bodies[i]->id == id)
|
||||||
{
|
{
|
||||||
|
|
@ -828,7 +830,7 @@ PHYSACDEF void DestroyPhysicsBody(PhysicsBody body)
|
||||||
bodies[index] = NULL;
|
bodies[index] = NULL;
|
||||||
|
|
||||||
// Reorder physics bodies pointers array and its catched index
|
// Reorder physics bodies pointers array and its catched index
|
||||||
for (int i = index; i < physicsBodiesCount; i++)
|
for (unsigned int i = index; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
if ((i + 1) < physicsBodiesCount) bodies[i] = bodies[i + 1];
|
if ((i + 1) < physicsBodiesCount) bodies[i] = bodies[i + 1];
|
||||||
}
|
}
|
||||||
|
|
@ -844,35 +846,41 @@ PHYSACDEF void DestroyPhysicsBody(PhysicsBody body)
|
||||||
// Destroys created physics bodies and manifolds and resets global values
|
// Destroys created physics bodies and manifolds and resets global values
|
||||||
PHYSACDEF void ResetPhysics(void)
|
PHYSACDEF void ResetPhysics(void)
|
||||||
{
|
{
|
||||||
// Unitialize physics bodies dynamic memory allocations
|
if (physicsBodiesCount > 0)
|
||||||
for (int i = physicsBodiesCount - 1; i >= 0; i--)
|
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[i];
|
// Unitialize physics bodies dynamic memory allocations
|
||||||
|
for (unsigned int i = physicsBodiesCount - 1; i >= 0; i--)
|
||||||
if (body != NULL)
|
|
||||||
{
|
{
|
||||||
PHYSAC_FREE(body);
|
PhysicsBody body = bodies[i];
|
||||||
bodies[i] = NULL;
|
|
||||||
usedMemory -= sizeof(PhysicsBodyData);
|
if (body != NULL)
|
||||||
|
{
|
||||||
|
PHYSAC_FREE(body);
|
||||||
|
bodies[i] = NULL;
|
||||||
|
usedMemory -= sizeof(PhysicsBodyData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
physicsBodiesCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
physicsBodiesCount = 0;
|
if (physicsManifoldsCount > 0)
|
||||||
|
|
||||||
// Unitialize physics manifolds dynamic memory allocations
|
|
||||||
for (int i = physicsManifoldsCount - 1; i >= 0; i--)
|
|
||||||
{
|
{
|
||||||
PhysicsManifold manifold = contacts[i];
|
// Unitialize physics manifolds dynamic memory allocations
|
||||||
|
for (unsigned int i = physicsManifoldsCount - 1; i >= 0; i--)
|
||||||
if (manifold != NULL)
|
|
||||||
{
|
{
|
||||||
PHYSAC_FREE(manifold);
|
PhysicsManifold manifold = contacts[i];
|
||||||
contacts[i] = NULL;
|
|
||||||
usedMemory -= sizeof(PhysicsManifoldData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
physicsManifoldsCount = 0;
|
if (manifold != NULL)
|
||||||
|
{
|
||||||
|
PHYSAC_FREE(manifold);
|
||||||
|
contacts[i] = NULL;
|
||||||
|
usedMemory -= sizeof(PhysicsManifoldData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
physicsManifoldsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
TRACELOG("[PHYSAC] Physics module reseted successfully\n");
|
TRACELOG("[PHYSAC] Physics module reseted successfully\n");
|
||||||
}
|
}
|
||||||
|
|
@ -881,10 +889,18 @@ PHYSACDEF void ResetPhysics(void)
|
||||||
PHYSACDEF void ClosePhysics(void)
|
PHYSACDEF void ClosePhysics(void)
|
||||||
{
|
{
|
||||||
// Unitialize physics manifolds dynamic memory allocations
|
// Unitialize physics manifolds dynamic memory allocations
|
||||||
for (int i = physicsManifoldsCount - 1; i >= 0; i--) DestroyPhysicsManifold(contacts[i]);
|
if (physicsManifoldsCount > 0)
|
||||||
|
{
|
||||||
|
for (unsigned int i = physicsManifoldsCount - 1; i >= 0; i--)
|
||||||
|
DestroyPhysicsManifold(contacts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// Unitialize physics bodies dynamic memory allocations
|
// Unitialize physics bodies dynamic memory allocations
|
||||||
for (int i = physicsBodiesCount - 1; i >= 0; i--) DestroyPhysicsBody(bodies[i]);
|
if (physicsBodiesCount > 0)
|
||||||
|
{
|
||||||
|
for (unsigned int i = physicsBodiesCount - 1; i >= 0; i--)
|
||||||
|
DestroyPhysicsBody(bodies[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// Trace log info
|
// Trace log info
|
||||||
if ((physicsBodiesCount > 0) || (usedMemory != 0))
|
if ((physicsBodiesCount > 0) || (usedMemory != 0))
|
||||||
|
|
@ -910,7 +926,7 @@ static int FindAvailableBodyIndex()
|
||||||
int currentId = i;
|
int currentId = i;
|
||||||
|
|
||||||
// Check if current id already exist in other physics body
|
// Check if current id already exist in other physics body
|
||||||
for (int k = 0; k < physicsBodiesCount; k++)
|
for (unsigned int k = 0; k < physicsBodiesCount; k++)
|
||||||
{
|
{
|
||||||
if (bodies[k]->id == currentId)
|
if (bodies[k]->id == currentId)
|
||||||
{
|
{
|
||||||
|
|
@ -920,9 +936,9 @@ static int FindAvailableBodyIndex()
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it is not used, use it as new physics body id
|
// If it is not used, use it as new physics body id
|
||||||
if (currentId == i)
|
if (currentId == (int)i)
|
||||||
{
|
{
|
||||||
index = i;
|
index = (int)i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -937,14 +953,14 @@ static PhysicsVertexData CreateDefaultPolygon(float radius, int sides)
|
||||||
data.vertexCount = sides;
|
data.vertexCount = sides;
|
||||||
|
|
||||||
// Calculate polygon vertices positions
|
// Calculate polygon vertices positions
|
||||||
for (int i = 0; i < data.vertexCount; i++)
|
for (unsigned int i = 0; i < data.vertexCount; i++)
|
||||||
{
|
{
|
||||||
data.positions[i].x = cosf(360.0f/sides*i*PHYSAC_DEG2RAD)*radius;
|
data.positions[i].x = (float)cosf(360.0f/sides*i*PHYSAC_DEG2RAD)*radius;
|
||||||
data.positions[i].y = sinf(360.0f/sides*i*PHYSAC_DEG2RAD)*radius;
|
data.positions[i].y = (float)sinf(360.0f/sides*i*PHYSAC_DEG2RAD)*radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate polygon faces normals
|
// Calculate polygon faces normals
|
||||||
for (int i = 0; i < data.vertexCount; i++)
|
for (int i = 0; i < (int)data.vertexCount; i++)
|
||||||
{
|
{
|
||||||
int nextIndex = (((i + 1) < sides) ? (i + 1) : 0);
|
int nextIndex = (((i + 1) < sides) ? (i + 1) : 0);
|
||||||
Vector2 face = MathVector2Subtract(data.positions[nextIndex], data.positions[i]);
|
Vector2 face = MathVector2Subtract(data.positions[nextIndex], data.positions[i]);
|
||||||
|
|
@ -969,7 +985,7 @@ static PhysicsVertexData CreateRectanglePolygon(Vector2 pos, Vector2 size)
|
||||||
data.positions[3] = CLITERAL(Vector2){ pos.x - size.x/2, pos.y - size.y/2 };
|
data.positions[3] = CLITERAL(Vector2){ pos.x - size.x/2, pos.y - size.y/2 };
|
||||||
|
|
||||||
// Calculate polygon faces normals
|
// Calculate polygon faces normals
|
||||||
for (int i = 0; i < data.vertexCount; i++)
|
for (unsigned int i = 0; i < data.vertexCount; i++)
|
||||||
{
|
{
|
||||||
int nextIndex = (((i + 1) < data.vertexCount) ? (i + 1) : 0);
|
int nextIndex = (((i + 1) < data.vertexCount) ? (i + 1) : 0);
|
||||||
Vector2 face = MathVector2Subtract(data.positions[nextIndex], data.positions[i]);
|
Vector2 face = MathVector2Subtract(data.positions[nextIndex], data.positions[i]);
|
||||||
|
|
@ -985,27 +1001,27 @@ static PhysicsVertexData CreateRectanglePolygon(Vector2 pos, Vector2 size)
|
||||||
void UpdatePhysicsStep(void)
|
void UpdatePhysicsStep(void)
|
||||||
{
|
{
|
||||||
// Clear previous generated collisions information
|
// Clear previous generated collisions information
|
||||||
for (int i = physicsManifoldsCount - 1; i >= 0; i--)
|
for (int i = (int)physicsManifoldsCount - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
PhysicsManifold manifold = contacts[i];
|
PhysicsManifold manifold = contacts[i];
|
||||||
if (manifold != NULL) DestroyPhysicsManifold(manifold);
|
if (manifold != NULL) DestroyPhysicsManifold(manifold);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset physics bodies grounded state
|
// Reset physics bodies grounded state
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[i];
|
PhysicsBody body = bodies[i];
|
||||||
body->isGrounded = false;
|
body->isGrounded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate new collision information
|
// Generate new collision information
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsBody bodyA = bodies[i];
|
PhysicsBody bodyA = bodies[i];
|
||||||
|
|
||||||
if (bodyA != NULL)
|
if (bodyA != NULL)
|
||||||
{
|
{
|
||||||
for (int j = i + 1; j < physicsBodiesCount; j++)
|
for (unsigned int j = i + 1; j < physicsBodiesCount; j++)
|
||||||
{
|
{
|
||||||
PhysicsBody bodyB = bodies[j];
|
PhysicsBody bodyB = bodies[j];
|
||||||
|
|
||||||
|
|
@ -1035,23 +1051,23 @@ void UpdatePhysicsStep(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Integrate forces to physics bodies
|
// Integrate forces to physics bodies
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[i];
|
PhysicsBody body = bodies[i];
|
||||||
if (body != NULL) IntegratePhysicsForces(body);
|
if (body != NULL) IntegratePhysicsForces(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize physics manifolds to solve collisions
|
// Initialize physics manifolds to solve collisions
|
||||||
for (int i = 0; i < physicsManifoldsCount; i++)
|
for (unsigned int i = 0; i < physicsManifoldsCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsManifold manifold = contacts[i];
|
PhysicsManifold manifold = contacts[i];
|
||||||
if (manifold != NULL) InitializePhysicsManifolds(manifold);
|
if (manifold != NULL) InitializePhysicsManifolds(manifold);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Integrate physics collisions impulses to solve collisions
|
// Integrate physics collisions impulses to solve collisions
|
||||||
for (int i = 0; i < PHYSAC_COLLISION_ITERATIONS; i++)
|
for (unsigned int i = 0; i < PHYSAC_COLLISION_ITERATIONS; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < physicsManifoldsCount; j++)
|
for (unsigned int j = 0; j < physicsManifoldsCount; j++)
|
||||||
{
|
{
|
||||||
PhysicsManifold manifold = contacts[i];
|
PhysicsManifold manifold = contacts[i];
|
||||||
if (manifold != NULL) IntegratePhysicsImpulses(manifold);
|
if (manifold != NULL) IntegratePhysicsImpulses(manifold);
|
||||||
|
|
@ -1059,21 +1075,21 @@ void UpdatePhysicsStep(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Integrate velocity to physics bodies
|
// Integrate velocity to physics bodies
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[i];
|
PhysicsBody body = bodies[i];
|
||||||
if (body != NULL) IntegratePhysicsVelocity(body);
|
if (body != NULL) IntegratePhysicsVelocity(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Correct physics bodies positions based on manifolds collision information
|
// Correct physics bodies positions based on manifolds collision information
|
||||||
for (int i = 0; i < physicsManifoldsCount; i++)
|
for (unsigned int i = 0; i < physicsManifoldsCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsManifold manifold = contacts[i];
|
PhysicsManifold manifold = contacts[i];
|
||||||
if (manifold != NULL) CorrectPhysicsPositions(manifold);
|
if (manifold != NULL) CorrectPhysicsPositions(manifold);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear physics bodies forces
|
// Clear physics bodies forces
|
||||||
for (int i = 0; i < physicsBodiesCount; i++)
|
for (unsigned int i = 0; i < physicsBodiesCount; i++)
|
||||||
{
|
{
|
||||||
PhysicsBody body = bodies[i];
|
PhysicsBody body = bodies[i];
|
||||||
if (body != NULL)
|
if (body != NULL)
|
||||||
|
|
@ -1128,7 +1144,7 @@ static int FindAvailableManifoldIndex()
|
||||||
int currentId = i;
|
int currentId = i;
|
||||||
|
|
||||||
// Check if current id already exist in other physics body
|
// Check if current id already exist in other physics body
|
||||||
for (int k = 0; k < physicsManifoldsCount; k++)
|
for (unsigned int k = 0; k < physicsManifoldsCount; k++)
|
||||||
{
|
{
|
||||||
if (contacts[k]->id == currentId)
|
if (contacts[k]->id == currentId)
|
||||||
{
|
{
|
||||||
|
|
@ -1187,7 +1203,7 @@ static void DestroyPhysicsManifold(PhysicsManifold manifold)
|
||||||
int id = manifold->id;
|
int id = manifold->id;
|
||||||
int index = -1;
|
int index = -1;
|
||||||
|
|
||||||
for (int i = 0; i < physicsManifoldsCount; i++)
|
for (unsigned int i = 0; i < physicsManifoldsCount; i++)
|
||||||
{
|
{
|
||||||
if (contacts[i]->id == id)
|
if (contacts[i]->id == id)
|
||||||
{
|
{
|
||||||
|
|
@ -1204,7 +1220,7 @@ static void DestroyPhysicsManifold(PhysicsManifold manifold)
|
||||||
contacts[index] = NULL;
|
contacts[index] = NULL;
|
||||||
|
|
||||||
// Reorder physics manifolds pointers array and its catched index
|
// Reorder physics manifolds pointers array and its catched index
|
||||||
for (int i = index; i < physicsManifoldsCount; i++)
|
for (unsigned int i = index; i < physicsManifoldsCount; i++)
|
||||||
{
|
{
|
||||||
if ((i + 1) < physicsManifoldsCount) contacts[i] = contacts[i + 1];
|
if ((i + 1) < physicsManifoldsCount) contacts[i] = contacts[i + 1];
|
||||||
}
|
}
|
||||||
|
|
@ -1306,7 +1322,7 @@ static void SolveCircleToPolygon(PhysicsManifold manifold)
|
||||||
int faceNormal = 0;
|
int faceNormal = 0;
|
||||||
PhysicsVertexData vertexData = bodyB->shape.vertexData;
|
PhysicsVertexData vertexData = bodyB->shape.vertexData;
|
||||||
|
|
||||||
for (int i = 0; i < vertexData.vertexCount; i++)
|
for (unsigned int i = 0; i < vertexData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
float currentSeparation = MathVector2DotProduct(vertexData.normals[i], MathVector2Subtract(center, vertexData.positions[i]));
|
float currentSeparation = MathVector2DotProduct(vertexData.normals[i], MathVector2Subtract(center, vertexData.positions[i]));
|
||||||
|
|
||||||
|
|
@ -1321,7 +1337,7 @@ static void SolveCircleToPolygon(PhysicsManifold manifold)
|
||||||
|
|
||||||
// Grab face's vertices
|
// Grab face's vertices
|
||||||
Vector2 v1 = vertexData.positions[faceNormal];
|
Vector2 v1 = vertexData.positions[faceNormal];
|
||||||
int nextIndex = (((faceNormal + 1) < vertexData.vertexCount) ? (faceNormal + 1) : 0);
|
int nextIndex = (((faceNormal + 1) < (int)vertexData.vertexCount) ? (faceNormal + 1) : 0);
|
||||||
Vector2 v2 = vertexData.positions[nextIndex];
|
Vector2 v2 = vertexData.positions[nextIndex];
|
||||||
|
|
||||||
// Check to see if center is within polygon
|
// Check to see if center is within polygon
|
||||||
|
|
@ -1443,7 +1459,7 @@ static void SolvePolygonToPolygon(PhysicsManifold manifold)
|
||||||
// Setup reference face vertices
|
// Setup reference face vertices
|
||||||
PhysicsVertexData refData = refPoly.vertexData;
|
PhysicsVertexData refData = refPoly.vertexData;
|
||||||
Vector2 v1 = refData.positions[referenceIndex];
|
Vector2 v1 = refData.positions[referenceIndex];
|
||||||
referenceIndex = (((referenceIndex + 1) < refData.vertexCount) ? (referenceIndex + 1) : 0);
|
referenceIndex = (((referenceIndex + 1) < (int)refData.vertexCount) ? (referenceIndex + 1) : 0);
|
||||||
Vector2 v2 = refData.positions[referenceIndex];
|
Vector2 v2 = refData.positions[referenceIndex];
|
||||||
|
|
||||||
// Transform vertices to world space
|
// Transform vertices to world space
|
||||||
|
|
@ -1500,16 +1516,16 @@ static void IntegratePhysicsForces(PhysicsBody body)
|
||||||
{
|
{
|
||||||
if ((body == NULL) || (body->inverseMass == 0.0f) || !body->enabled) return;
|
if ((body == NULL) || (body->inverseMass == 0.0f) || !body->enabled) return;
|
||||||
|
|
||||||
body->velocity.x += (body->force.x*body->inverseMass)*(deltaTime/2.0);
|
body->velocity.x += (float)((body->force.x*body->inverseMass)*(deltaTime/2.0));
|
||||||
body->velocity.y += (body->force.y*body->inverseMass)*(deltaTime/2.0);
|
body->velocity.y += (float)((body->force.y*body->inverseMass)*(deltaTime/2.0));
|
||||||
|
|
||||||
if (body->useGravity)
|
if (body->useGravity)
|
||||||
{
|
{
|
||||||
body->velocity.x += gravityForce.x*(deltaTime/1000/2.0);
|
body->velocity.x += (float)(gravityForce.x*(deltaTime/1000/2.0));
|
||||||
body->velocity.y += gravityForce.y*(deltaTime/1000/2.0);
|
body->velocity.y += (float)(gravityForce.y*(deltaTime/1000/2.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!body->freezeOrient) body->angularVelocity += body->torque*body->inverseInertia*(deltaTime/2.0);
|
if (!body->freezeOrient) body->angularVelocity += (float)(body->torque*body->inverseInertia*(deltaTime/2.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initializes physics manifolds to solve collisions
|
// Initializes physics manifolds to solve collisions
|
||||||
|
|
@ -1525,7 +1541,7 @@ static void InitializePhysicsManifolds(PhysicsManifold manifold)
|
||||||
manifold->staticFriction = sqrtf(bodyA->staticFriction*bodyB->staticFriction);
|
manifold->staticFriction = sqrtf(bodyA->staticFriction*bodyB->staticFriction);
|
||||||
manifold->dynamicFriction = sqrtf(bodyA->dynamicFriction*bodyB->dynamicFriction);
|
manifold->dynamicFriction = sqrtf(bodyA->dynamicFriction*bodyB->dynamicFriction);
|
||||||
|
|
||||||
for (int i = 0; i < manifold->contactsCount; i++)
|
for (unsigned int i = 0; i < manifold->contactsCount; i++)
|
||||||
{
|
{
|
||||||
// Caculate radius from center of mass to contact
|
// Caculate radius from center of mass to contact
|
||||||
Vector2 radiusA = MathVector2Subtract(manifold->contacts[i], bodyA->position);
|
Vector2 radiusA = MathVector2Subtract(manifold->contacts[i], bodyA->position);
|
||||||
|
|
@ -1540,7 +1556,7 @@ static void InitializePhysicsManifolds(PhysicsManifold manifold)
|
||||||
|
|
||||||
// Determine if we should perform a resting collision or not;
|
// Determine if we should perform a resting collision or not;
|
||||||
// The idea is if the only thing moving this object is gravity, then the collision should be performed without any restitution
|
// The idea is if the only thing moving this object is gravity, then the collision should be performed without any restitution
|
||||||
if (MathVector2SqrLen(radiusV) < (MathVector2SqrLen(CLITERAL(Vector2){ gravityForce.x*deltaTime/1000, gravityForce.y*deltaTime/1000 }) + PHYSAC_EPSILON)) manifold->restitution = 0;
|
if (MathVector2SqrLen(radiusV) < (MathVector2SqrLen(CLITERAL(Vector2){ (float)(gravityForce.x*deltaTime/1000), (float)(gravityForce.y*deltaTime/1000) }) + PHYSAC_EPSILON)) manifold->restitution = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1560,7 +1576,7 @@ static void IntegratePhysicsImpulses(PhysicsManifold manifold)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < manifold->contactsCount; i++)
|
for (unsigned int i = 0; i < manifold->contactsCount; i++)
|
||||||
{
|
{
|
||||||
// Calculate radius from center of mass to contact
|
// Calculate radius from center of mass to contact
|
||||||
Vector2 radiusA = MathVector2Subtract(manifold->contacts[i], bodyA->position);
|
Vector2 radiusA = MathVector2Subtract(manifold->contacts[i], bodyA->position);
|
||||||
|
|
@ -1616,7 +1632,7 @@ static void IntegratePhysicsImpulses(PhysicsManifold manifold)
|
||||||
impulseTangent /= inverseMassSum;
|
impulseTangent /= inverseMassSum;
|
||||||
impulseTangent /= (float)manifold->contactsCount;
|
impulseTangent /= (float)manifold->contactsCount;
|
||||||
|
|
||||||
float absImpulseTangent = fabs(impulseTangent);
|
float absImpulseTangent = (float)fabs(impulseTangent);
|
||||||
|
|
||||||
// Don't apply tiny friction impulses
|
// Don't apply tiny friction impulses
|
||||||
if (absImpulseTangent <= PHYSAC_EPSILON) return;
|
if (absImpulseTangent <= PHYSAC_EPSILON) return;
|
||||||
|
|
@ -1650,10 +1666,10 @@ static void IntegratePhysicsVelocity(PhysicsBody body)
|
||||||
{
|
{
|
||||||
if ((body == NULL) ||!body->enabled) return;
|
if ((body == NULL) ||!body->enabled) return;
|
||||||
|
|
||||||
body->position.x += body->velocity.x*deltaTime;
|
body->position.x += (float)(body->velocity.x*deltaTime);
|
||||||
body->position.y += body->velocity.y*deltaTime;
|
body->position.y += (float)(body->velocity.y*deltaTime);
|
||||||
|
|
||||||
if (!body->freezeOrient) body->orient += body->angularVelocity*deltaTime;
|
if (!body->freezeOrient) body->orient += (float)(body->angularVelocity*deltaTime);
|
||||||
body->shape.transform = MathMatFromRadians(body->orient);
|
body->shape.transform = MathMatFromRadians(body->orient);
|
||||||
|
|
||||||
IntegratePhysicsForces(body);
|
IntegratePhysicsForces(body);
|
||||||
|
|
@ -1691,7 +1707,7 @@ static Vector2 GetSupport(PhysicsShape shape, Vector2 dir)
|
||||||
Vector2 bestVertex = { 0.0f, 0.0f };
|
Vector2 bestVertex = { 0.0f, 0.0f };
|
||||||
PhysicsVertexData data = shape.vertexData;
|
PhysicsVertexData data = shape.vertexData;
|
||||||
|
|
||||||
for (int i = 0; i < data.vertexCount; i++)
|
for (unsigned int i = 0; i < data.vertexCount; i++)
|
||||||
{
|
{
|
||||||
Vector2 vertex = data.positions[i];
|
Vector2 vertex = data.positions[i];
|
||||||
float projection = MathVector2DotProduct(vertex, dir);
|
float projection = MathVector2DotProduct(vertex, dir);
|
||||||
|
|
@ -1715,7 +1731,7 @@ static float FindAxisLeastPenetration(int *faceIndex, PhysicsShape shapeA, Physi
|
||||||
PhysicsVertexData dataA = shapeA.vertexData;
|
PhysicsVertexData dataA = shapeA.vertexData;
|
||||||
//PhysicsVertexData dataB = shapeB.vertexData;
|
//PhysicsVertexData dataB = shapeB.vertexData;
|
||||||
|
|
||||||
for (int i = 0; i < dataA.vertexCount; i++)
|
for (unsigned int i = 0; i < dataA.vertexCount; i++)
|
||||||
{
|
{
|
||||||
// Retrieve a face normal from A shape
|
// Retrieve a face normal from A shape
|
||||||
Vector2 normal = dataA.normals[i];
|
Vector2 normal = dataA.normals[i];
|
||||||
|
|
@ -1766,7 +1782,7 @@ static void FindIncidentFace(Vector2 *v0, Vector2 *v1, PhysicsShape ref, Physics
|
||||||
int incidentFace = 0;
|
int incidentFace = 0;
|
||||||
float minDot = PHYSAC_FLT_MAX;
|
float minDot = PHYSAC_FLT_MAX;
|
||||||
|
|
||||||
for (int i = 0; i < incData.vertexCount; i++)
|
for (unsigned int i = 0; i < incData.vertexCount; i++)
|
||||||
{
|
{
|
||||||
float dot = MathVector2DotProduct(referenceNormal, incData.normals[i]);
|
float dot = MathVector2DotProduct(referenceNormal, incData.normals[i]);
|
||||||
|
|
||||||
|
|
@ -1780,7 +1796,7 @@ static void FindIncidentFace(Vector2 *v0, Vector2 *v1, PhysicsShape ref, Physics
|
||||||
// Assign face vertices for incident face
|
// Assign face vertices for incident face
|
||||||
*v0 = MathMatVector2Product(inc.transform, incData.positions[incidentFace]);
|
*v0 = MathMatVector2Product(inc.transform, incData.positions[incidentFace]);
|
||||||
*v0 = MathVector2Add(*v0, inc.body->position);
|
*v0 = MathVector2Add(*v0, inc.body->position);
|
||||||
incidentFace = (((incidentFace + 1) < incData.vertexCount) ? (incidentFace + 1) : 0);
|
incidentFace = (((incidentFace + 1) < (int)incData.vertexCount) ? (incidentFace + 1) : 0);
|
||||||
*v1 = MathMatVector2Product(inc.transform, incData.positions[incidentFace]);
|
*v1 = MathMatVector2Product(inc.transform, incData.positions[incidentFace]);
|
||||||
*v1 = MathVector2Add(*v1, inc.body->position);
|
*v1 = MathVector2Add(*v1, inc.body->position);
|
||||||
}
|
}
|
||||||
|
|
@ -1849,8 +1865,8 @@ static void InitTimer(void)
|
||||||
frequency = (timebase.denom*1e9)/timebase.numer;
|
frequency = (timebase.denom*1e9)/timebase.numer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
baseClockTicks = GetClockTicks(); // Get MONOTONIC clock time offset
|
baseClockTicks = (double)GetClockTicks(); // Get MONOTONIC clock time offset
|
||||||
startTime = GetCurrentTime(); // Get current time in milliseconds
|
startTime = GetCurrentTime(); // Get current time in milliseconds
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get hi-res MONOTONIC time measure in clock ticks
|
// Get hi-res MONOTONIC time measure in clock ticks
|
||||||
|
|
|
||||||
267
src/raudio.c
267
src/raudio.c
|
|
@ -275,7 +275,8 @@ typedef struct tagBITMAPINFOHEADER {
|
||||||
// NOTE: Depends on data structure provided by the library
|
// NOTE: Depends on data structure provided by the library
|
||||||
// in charge of reading the different file types
|
// in charge of reading the different file types
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MUSIC_AUDIO_WAV = 0,
|
MUSIC_AUDIO_NONE = 0,
|
||||||
|
MUSIC_AUDIO_WAV,
|
||||||
MUSIC_AUDIO_OGG,
|
MUSIC_AUDIO_OGG,
|
||||||
MUSIC_AUDIO_FLAC,
|
MUSIC_AUDIO_FLAC,
|
||||||
MUSIC_AUDIO_MP3,
|
MUSIC_AUDIO_MP3,
|
||||||
|
|
@ -342,8 +343,8 @@ typedef struct AudioData {
|
||||||
int defaultSize; // Default audio buffer size for audio streams
|
int defaultSize; // Default audio buffer size for audio streams
|
||||||
} Buffer;
|
} Buffer;
|
||||||
struct {
|
struct {
|
||||||
AudioBuffer *pool[MAX_AUDIO_BUFFER_POOL_CHANNELS]; // Multichannel AudioBuffer pointers pool
|
|
||||||
unsigned int poolCounter; // AudioBuffer pointers pool counter
|
unsigned int poolCounter; // AudioBuffer pointers pool counter
|
||||||
|
AudioBuffer *pool[MAX_AUDIO_BUFFER_POOL_CHANNELS]; // Multichannel AudioBuffer pointers pool
|
||||||
unsigned int channels[MAX_AUDIO_BUFFER_POOL_CHANNELS]; // AudioBuffer pool channels
|
unsigned int channels[MAX_AUDIO_BUFFER_POOL_CHANNELS]; // AudioBuffer pool channels
|
||||||
} MultiChannel;
|
} MultiChannel;
|
||||||
} AudioData;
|
} AudioData;
|
||||||
|
|
@ -465,7 +466,7 @@ void InitAudioDevice(void)
|
||||||
ma_context_uninit(&AUDIO.System.context);
|
ma_context_uninit(&AUDIO.System.context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init dummy audio buffers pool for multichannel sound playing
|
// Init dummy audio buffers pool for multichannel sound playing
|
||||||
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++)
|
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -491,7 +492,7 @@ void CloseAudioDevice(void)
|
||||||
{
|
{
|
||||||
// Unload dummy audio buffers pool
|
// Unload dummy audio buffers pool
|
||||||
// WARNING: They can be pointing to already unloaded data
|
// WARNING: They can be pointing to already unloaded data
|
||||||
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++)
|
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
//UnloadAudioBuffer(AUDIO.MultiChannel.pool[i]);
|
//UnloadAudioBuffer(AUDIO.MultiChannel.pool[i]);
|
||||||
if (AUDIO.MultiChannel.pool[i] != NULL)
|
if (AUDIO.MultiChannel.pool[i] != NULL)
|
||||||
|
|
@ -502,7 +503,7 @@ void CloseAudioDevice(void)
|
||||||
RL_FREE(AUDIO.MultiChannel.pool[i]);
|
RL_FREE(AUDIO.MultiChannel.pool[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_mutex_uninit(&AUDIO.System.lock);
|
ma_mutex_uninit(&AUDIO.System.lock);
|
||||||
ma_device_uninit(&AUDIO.System.device);
|
ma_device_uninit(&AUDIO.System.device);
|
||||||
ma_context_uninit(&AUDIO.System.context);
|
ma_context_uninit(&AUDIO.System.context);
|
||||||
|
|
@ -731,16 +732,16 @@ Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int
|
||||||
|
|
||||||
if (false) { }
|
if (false) { }
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
else if (TextIsEqual(fileExtLower, "wav")) wave = LoadWAV(fileData, dataSize);
|
else if (TextIsEqual(fileExtLower, ".wav")) wave = LoadWAV(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_OGG)
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
else if (TextIsEqual(fileExtLower, "ogg")) wave = LoadOGG(fileData, dataSize);
|
else if (TextIsEqual(fileExtLower, ".ogg")) wave = LoadOGG(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
else if (TextIsEqual(fileExtLower, "flac")) wave = LoadFLAC(fileData, dataSize);
|
else if (TextIsEqual(fileExtLower, ".flac")) wave = LoadFLAC(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
else if (TextIsEqual(fileExtLower, "mp3")) wave = LoadMP3(fileData, dataSize);
|
else if (TextIsEqual(fileExtLower, ".mp3")) wave = LoadMP3(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
else TRACELOG(LOG_WARNING, "WAVE: File format not supported");
|
else TRACELOG(LOG_WARNING, "WAVE: File format not supported");
|
||||||
|
|
||||||
|
|
@ -1112,9 +1113,9 @@ float *LoadWaveSamples(Wave wave)
|
||||||
|
|
||||||
for (unsigned int i = 0; i < wave.sampleCount; i++)
|
for (unsigned int i = 0; i < wave.sampleCount; i++)
|
||||||
{
|
{
|
||||||
if (wave.sampleSize == 8) samples[i] = (float)(((unsigned char *)wave.data)[i] - 127)/256.0f;
|
if (wave.sampleSize == 8) samples[i] = (float)(((unsigned char *)wave.data)[i] - 127)/256.0f;
|
||||||
else if (wave.sampleSize == 16) samples[i] = (float)(((short *)wave.data)[i])/32767.0f;
|
else if (wave.sampleSize == 16) samples[i] = (float)(((short *)wave.data)[i])/32767.0f;
|
||||||
else if (wave.sampleSize == 32) samples[i] = ((float *)wave.data)[i];
|
else if (wave.sampleSize == 32) samples[i] = ((float *)wave.data)[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return samples;
|
return samples;
|
||||||
|
|
@ -1140,14 +1141,14 @@ Music LoadMusicStream(const char *fileName)
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
else if (IsFileExtension(fileName, ".wav"))
|
else if (IsFileExtension(fileName, ".wav"))
|
||||||
{
|
{
|
||||||
drwav *ctxWav = RL_MALLOC(sizeof(drwav));
|
drwav *ctxWav = RL_CALLOC(1, sizeof(drwav));
|
||||||
bool success = drwav_init_file(ctxWav, fileName, NULL);
|
bool success = drwav_init_file(ctxWav, fileName, NULL);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_AUDIO_WAV;
|
||||||
|
music.ctxData = ctxWav;
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_AUDIO_WAV;
|
|
||||||
music.ctxData = ctxWav;
|
|
||||||
|
|
||||||
int sampleSize = ctxWav->bitsPerSample;
|
int sampleSize = ctxWav->bitsPerSample;
|
||||||
if (ctxWav->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
|
if (ctxWav->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
|
||||||
|
|
||||||
|
|
@ -1162,11 +1163,11 @@ Music LoadMusicStream(const char *fileName)
|
||||||
else if (IsFileExtension(fileName, ".ogg"))
|
else if (IsFileExtension(fileName, ".ogg"))
|
||||||
{
|
{
|
||||||
// Open ogg audio stream
|
// Open ogg audio stream
|
||||||
|
music.ctxType = MUSIC_AUDIO_OGG;
|
||||||
music.ctxData = stb_vorbis_open_filename(fileName, NULL, NULL);
|
music.ctxData = stb_vorbis_open_filename(fileName, NULL, NULL);
|
||||||
|
|
||||||
if (music.ctxData != NULL)
|
if (music.ctxData != NULL)
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_AUDIO_OGG;
|
|
||||||
stb_vorbis_info info = stb_vorbis_get_info((stb_vorbis *)music.ctxData); // Get Ogg file info
|
stb_vorbis_info info = stb_vorbis_get_info((stb_vorbis *)music.ctxData); // Get Ogg file info
|
||||||
|
|
||||||
// OGG bit rate defaults to 16 bit, it's enough for compressed format
|
// OGG bit rate defaults to 16 bit, it's enough for compressed format
|
||||||
|
|
@ -1182,11 +1183,11 @@ Music LoadMusicStream(const char *fileName)
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
else if (IsFileExtension(fileName, ".flac"))
|
else if (IsFileExtension(fileName, ".flac"))
|
||||||
{
|
{
|
||||||
|
music.ctxType = MUSIC_AUDIO_FLAC;
|
||||||
music.ctxData = drflac_open_file(fileName, NULL);
|
music.ctxData = drflac_open_file(fileName, NULL);
|
||||||
|
|
||||||
if (music.ctxData != NULL)
|
if (music.ctxData != NULL)
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_AUDIO_FLAC;
|
|
||||||
drflac *ctxFlac = (drflac *)music.ctxData;
|
drflac *ctxFlac = (drflac *)music.ctxData;
|
||||||
|
|
||||||
music.stream = InitAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels);
|
music.stream = InitAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels);
|
||||||
|
|
@ -1199,15 +1200,14 @@ Music LoadMusicStream(const char *fileName)
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
else if (IsFileExtension(fileName, ".mp3"))
|
else if (IsFileExtension(fileName, ".mp3"))
|
||||||
{
|
{
|
||||||
drmp3 *ctxMp3 = RL_MALLOC(sizeof(drmp3));
|
drmp3 *ctxMp3 = RL_CALLOC(1, sizeof(drmp3));
|
||||||
music.ctxData = ctxMp3;
|
|
||||||
|
|
||||||
int result = drmp3_init_file(ctxMp3, fileName, NULL);
|
int result = drmp3_init_file(ctxMp3, fileName, NULL);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_AUDIO_MP3;
|
||||||
|
music.ctxData = ctxMp3;
|
||||||
|
|
||||||
if (result > 0)
|
if (result > 0)
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_AUDIO_MP3;
|
|
||||||
|
|
||||||
music.stream = InitAudioStream(ctxMp3->sampleRate, 32, ctxMp3->channels);
|
music.stream = InitAudioStream(ctxMp3->sampleRate, 32, ctxMp3->channels);
|
||||||
music.sampleCount = (unsigned int)drmp3_get_pcm_frame_count(ctxMp3)*ctxMp3->channels;
|
music.sampleCount = (unsigned int)drmp3_get_pcm_frame_count(ctxMp3)*ctxMp3->channels;
|
||||||
music.looping = true; // Looping enabled by default
|
music.looping = true; // Looping enabled by default
|
||||||
|
|
@ -1219,12 +1219,13 @@ Music LoadMusicStream(const char *fileName)
|
||||||
else if (IsFileExtension(fileName, ".xm"))
|
else if (IsFileExtension(fileName, ".xm"))
|
||||||
{
|
{
|
||||||
jar_xm_context_t *ctxXm = NULL;
|
jar_xm_context_t *ctxXm = NULL;
|
||||||
|
|
||||||
int result = jar_xm_create_context_from_file(&ctxXm, 48000, fileName);
|
int result = jar_xm_create_context_from_file(&ctxXm, 48000, fileName);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_MODULE_XM;
|
||||||
|
music.ctxData = ctxXm;
|
||||||
|
|
||||||
if (result == 0) // XM AUDIO.System.context created successfully
|
if (result == 0) // XM AUDIO.System.context created successfully
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_MODULE_XM;
|
|
||||||
jar_xm_set_max_loop_count(ctxXm, 0); // Set infinite number of loops
|
jar_xm_set_max_loop_count(ctxXm, 0); // Set infinite number of loops
|
||||||
|
|
||||||
// NOTE: Only stereo is supported for XM
|
// NOTE: Only stereo is supported for XM
|
||||||
|
|
@ -1233,30 +1234,26 @@ Music LoadMusicStream(const char *fileName)
|
||||||
music.looping = true; // Looping enabled by default
|
music.looping = true; // Looping enabled by default
|
||||||
jar_xm_reset(ctxXm); // make sure we start at the beginning of the song
|
jar_xm_reset(ctxXm); // make sure we start at the beginning of the song
|
||||||
musicLoaded = true;
|
musicLoaded = true;
|
||||||
|
|
||||||
music.ctxData = ctxXm;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MOD)
|
#if defined(SUPPORT_FILEFORMAT_MOD)
|
||||||
else if (IsFileExtension(fileName, ".mod"))
|
else if (IsFileExtension(fileName, ".mod"))
|
||||||
{
|
{
|
||||||
jar_mod_context_t *ctxMod = RL_MALLOC(sizeof(jar_mod_context_t));
|
jar_mod_context_t *ctxMod = RL_CALLOC(1, sizeof(jar_mod_context_t));
|
||||||
|
|
||||||
jar_mod_init(ctxMod);
|
jar_mod_init(ctxMod);
|
||||||
int result = jar_mod_load_file(ctxMod, fileName);
|
int result = jar_mod_load_file(ctxMod, fileName);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_MODULE_MOD;
|
||||||
|
music.ctxData = ctxMod;
|
||||||
|
|
||||||
if (result > 0)
|
if (result > 0)
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_MODULE_MOD;
|
|
||||||
|
|
||||||
// NOTE: Only stereo is supported for MOD
|
// NOTE: Only stereo is supported for MOD
|
||||||
music.stream = InitAudioStream(48000, 16, 2);
|
music.stream = InitAudioStream(48000, 16, 2);
|
||||||
music.sampleCount = (unsigned int)jar_mod_max_samples(ctxMod)*2; // 2 channels
|
music.sampleCount = (unsigned int)jar_mod_max_samples(ctxMod)*2; // 2 channels
|
||||||
music.looping = true; // Looping enabled by default
|
music.looping = true; // Looping enabled by default
|
||||||
musicLoaded = true;
|
musicLoaded = true;
|
||||||
|
|
||||||
music.ctxData = ctxMod;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1284,6 +1281,7 @@ Music LoadMusicStream(const char *fileName)
|
||||||
else if (music.ctxType == MUSIC_MODULE_MOD) { jar_mod_unload((jar_mod_context_t *)music.ctxData); RL_FREE(music.ctxData); }
|
else if (music.ctxType == MUSIC_MODULE_MOD) { jar_mod_unload((jar_mod_context_t *)music.ctxData); RL_FREE(music.ctxData); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
music.ctxData = NULL;
|
||||||
TRACELOG(LOG_WARNING, "FILEIO: [%s] Music file could not be opened", fileName);
|
TRACELOG(LOG_WARNING, "FILEIO: [%s] Music file could not be opened", fileName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1299,30 +1297,221 @@ Music LoadMusicStream(const char *fileName)
|
||||||
return music;
|
return music;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extension including period ".mod"
|
||||||
|
Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int dataSize)
|
||||||
|
{
|
||||||
|
Music music = { 0 };
|
||||||
|
bool musicLoaded = false;
|
||||||
|
|
||||||
|
char fileExtLower[16] = { 0 };
|
||||||
|
strcpy(fileExtLower, TextToLower(fileType));
|
||||||
|
|
||||||
|
if (false) { }
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".wav"))
|
||||||
|
{
|
||||||
|
drwav *ctxWav = RL_CALLOC(1, sizeof(drwav));
|
||||||
|
|
||||||
|
bool success = drwav_init_memory(ctxWav, (const void*)data, dataSize, NULL);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_AUDIO_WAV;
|
||||||
|
music.ctxData = ctxWav;
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
int sampleSize = ctxWav->bitsPerSample;
|
||||||
|
if (ctxWav->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
|
||||||
|
|
||||||
|
music.stream = InitAudioStream(ctxWav->sampleRate, sampleSize, ctxWav->channels);
|
||||||
|
music.sampleCount = (unsigned int)ctxWav->totalPCMFrameCount*ctxWav->channels;
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".flac"))
|
||||||
|
{
|
||||||
|
music.ctxType = MUSIC_AUDIO_FLAC;
|
||||||
|
music.ctxData = drflac_open_memory((const void*)data, dataSize, NULL);
|
||||||
|
|
||||||
|
if (music.ctxData != NULL)
|
||||||
|
{
|
||||||
|
drflac *ctxFlac = (drflac *)music.ctxData;
|
||||||
|
|
||||||
|
music.stream = InitAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels);
|
||||||
|
music.sampleCount = (unsigned int)ctxFlac->totalPCMFrameCount*ctxFlac->channels;
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".mp3"))
|
||||||
|
{
|
||||||
|
drmp3 *ctxMp3 = RL_CALLOC(1, sizeof(drmp3));
|
||||||
|
int success = drmp3_init_memory(ctxMp3, (const void*)data, dataSize, NULL);
|
||||||
|
|
||||||
|
music.ctxType = MUSIC_AUDIO_MP3;
|
||||||
|
music.ctxData = ctxMp3;
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
music.stream = InitAudioStream(ctxMp3->sampleRate, 32, ctxMp3->channels);
|
||||||
|
music.sampleCount = (unsigned int)drmp3_get_pcm_frame_count(ctxMp3)*ctxMp3->channels;
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".ogg"))
|
||||||
|
{
|
||||||
|
// Open ogg audio stream
|
||||||
|
music.ctxType = MUSIC_AUDIO_OGG;
|
||||||
|
//music.ctxData = stb_vorbis_open_filename(fileName, NULL, NULL);
|
||||||
|
music.ctxData = stb_vorbis_open_memory((const unsigned char*)data, dataSize, NULL, NULL);
|
||||||
|
|
||||||
|
if (music.ctxData != NULL)
|
||||||
|
{
|
||||||
|
stb_vorbis_info info = stb_vorbis_get_info((stb_vorbis *)music.ctxData); // Get Ogg file info
|
||||||
|
|
||||||
|
// OGG bit rate defaults to 16 bit, it's enough for compressed format
|
||||||
|
music.stream = InitAudioStream(info.sample_rate, 16, info.channels);
|
||||||
|
|
||||||
|
// WARNING: It seems this function returns length in frames, not samples, so we multiply by channels
|
||||||
|
music.sampleCount = (unsigned int)stb_vorbis_stream_length_in_samples((stb_vorbis *)music.ctxData)*info.channels;
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_XM)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".xm"))
|
||||||
|
{
|
||||||
|
jar_xm_context_t *ctxXm = NULL;
|
||||||
|
int result = jar_xm_create_context_safe(&ctxXm, (const char*)data, dataSize, 48000);
|
||||||
|
if (result == 0) // XM AUDIO.System.context created successfully
|
||||||
|
{
|
||||||
|
music.ctxType = MUSIC_MODULE_XM;
|
||||||
|
jar_xm_set_max_loop_count(ctxXm, 0); // Set infinite number of loops
|
||||||
|
|
||||||
|
// NOTE: Only stereo is supported for XM
|
||||||
|
music.stream = InitAudioStream(48000, 16, 2);
|
||||||
|
music.sampleCount = (unsigned int)jar_xm_get_remaining_samples(ctxXm)*2; // 2 channels
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
jar_xm_reset(ctxXm); // make sure we start at the beginning of the song
|
||||||
|
|
||||||
|
music.ctxData = ctxXm;
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_MOD)
|
||||||
|
else if (TextIsEqual(fileExtLower, ".mod"))
|
||||||
|
{
|
||||||
|
jar_mod_context_t *ctxMod = RL_MALLOC(sizeof(jar_mod_context_t));
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
jar_mod_init(ctxMod);
|
||||||
|
|
||||||
|
// copy data to allocated memory for default UnloadMusicStream
|
||||||
|
unsigned char *newData = RL_MALLOC(dataSize);
|
||||||
|
int it = dataSize / sizeof(unsigned char);
|
||||||
|
for (int i = 0; i < it; i++){
|
||||||
|
newData[i] = data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory loaded version for jar_mod_load_file()
|
||||||
|
if (dataSize && dataSize < 32*1024*1024)
|
||||||
|
{
|
||||||
|
ctxMod->modfilesize = dataSize;
|
||||||
|
ctxMod->modfile = newData;
|
||||||
|
if(jar_mod_load(ctxMod, (void*)ctxMod->modfile, dataSize)) result = dataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result > 0)
|
||||||
|
{
|
||||||
|
music.ctxType = MUSIC_MODULE_MOD;
|
||||||
|
|
||||||
|
// NOTE: Only stereo is supported for MOD
|
||||||
|
music.stream = InitAudioStream(48000, 16, 2);
|
||||||
|
music.sampleCount = (unsigned int)jar_mod_max_samples(ctxMod)*2; // 2 channels
|
||||||
|
music.looping = true; // Looping enabled by default
|
||||||
|
musicLoaded = true;
|
||||||
|
|
||||||
|
music.ctxData = ctxMod;
|
||||||
|
musicLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else TRACELOG(LOG_WARNING, "STREAM: [%s] Fileformat not supported", fileType);
|
||||||
|
|
||||||
|
if (!musicLoaded)
|
||||||
|
{
|
||||||
|
if (false) { }
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
|
else if (music.ctxType == MUSIC_AUDIO_WAV) drwav_uninit((drwav *)music.ctxData);
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
|
else if (music.ctxType == MUSIC_AUDIO_FLAC) drflac_free((drflac *)music.ctxData, NULL);
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
|
else if (music.ctxType == MUSIC_AUDIO_MP3) { drmp3_uninit((drmp3 *)music.ctxData); RL_FREE(music.ctxData); }
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
|
else if (music.ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close((stb_vorbis *)music.ctxData);
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_XM)
|
||||||
|
else if (music.ctxType == MUSIC_MODULE_XM) jar_xm_free_context((jar_xm_context_t *)music.ctxData);
|
||||||
|
#endif
|
||||||
|
#if defined(SUPPORT_FILEFORMAT_MOD)
|
||||||
|
else if (music.ctxType == MUSIC_MODULE_MOD) { jar_mod_unload((jar_mod_context_t *)music.ctxData); RL_FREE(music.ctxData); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
music.ctxData = NULL;
|
||||||
|
TRACELOG(LOG_WARNING, "FILEIO: [%s] Music memory could not be opened", fileType);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Show some music stream info
|
||||||
|
TRACELOG(LOG_INFO, "FILEIO: [%s] Music memory successfully loaded:", fileType);
|
||||||
|
TRACELOG(LOG_INFO, " > Total samples: %i", music.sampleCount);
|
||||||
|
TRACELOG(LOG_INFO, " > Sample rate: %i Hz", music.stream.sampleRate);
|
||||||
|
TRACELOG(LOG_INFO, " > Sample size: %i bits", music.stream.sampleSize);
|
||||||
|
TRACELOG(LOG_INFO, " > Channels: %i (%s)", music.stream.channels, (music.stream.channels == 1)? "Mono" : (music.stream.channels == 2)? "Stereo" : "Multi");
|
||||||
|
}
|
||||||
|
|
||||||
|
return music;
|
||||||
|
}
|
||||||
|
|
||||||
// Unload music stream
|
// Unload music stream
|
||||||
void UnloadMusicStream(Music music)
|
void UnloadMusicStream(Music music)
|
||||||
{
|
{
|
||||||
CloseAudioStream(music.stream);
|
CloseAudioStream(music.stream);
|
||||||
|
|
||||||
if (false) { }
|
if (music.ctxData != NULL)
|
||||||
|
{
|
||||||
|
if (false) { }
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
else if (music.ctxType == MUSIC_AUDIO_WAV) drwav_uninit((drwav *)music.ctxData);
|
else if (music.ctxType == MUSIC_AUDIO_WAV) drwav_uninit((drwav *)music.ctxData);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_OGG)
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
else if (music.ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close((stb_vorbis *)music.ctxData);
|
else if (music.ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close((stb_vorbis *)music.ctxData);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
else if (music.ctxType == MUSIC_AUDIO_FLAC) drflac_free((drflac *)music.ctxData, NULL);
|
else if (music.ctxType == MUSIC_AUDIO_FLAC) drflac_free((drflac *)music.ctxData, NULL);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
else if (music.ctxType == MUSIC_AUDIO_MP3) { drmp3_uninit((drmp3 *)music.ctxData); RL_FREE(music.ctxData); }
|
else if (music.ctxType == MUSIC_AUDIO_MP3) { drmp3_uninit((drmp3 *)music.ctxData); RL_FREE(music.ctxData); }
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_XM)
|
#if defined(SUPPORT_FILEFORMAT_XM)
|
||||||
else if (music.ctxType == MUSIC_MODULE_XM) jar_xm_free_context((jar_xm_context_t *)music.ctxData);
|
else if (music.ctxType == MUSIC_MODULE_XM) jar_xm_free_context((jar_xm_context_t *)music.ctxData);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MOD)
|
#if defined(SUPPORT_FILEFORMAT_MOD)
|
||||||
else if (music.ctxType == MUSIC_MODULE_MOD) { jar_mod_unload((jar_mod_context_t *)music.ctxData); RL_FREE(music.ctxData); }
|
else if (music.ctxType == MUSIC_MODULE_MOD) { jar_mod_unload((jar_mod_context_t *)music.ctxData); RL_FREE(music.ctxData); }
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start music playing (open stream)
|
// Start music playing (open stream)
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,7 @@ float *GetWaveData(Wave wave); // Get samples d
|
||||||
|
|
||||||
// Music management functions
|
// Music management functions
|
||||||
Music LoadMusicStream(const char *fileName); // Load music stream from file
|
Music LoadMusicStream(const char *fileName); // Load music stream from file
|
||||||
|
Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int dataSize); // Load module music from data
|
||||||
void UnloadMusicStream(Music music); // Unload music stream
|
void UnloadMusicStream(Music music); // Unload music stream
|
||||||
void PlayMusicStream(Music music); // Start music playing
|
void PlayMusicStream(Music music); // Start music playing
|
||||||
void UpdateMusicStream(Music music); // Updates buffers for music streaming
|
void UpdateMusicStream(Music music); // Updates buffers for music streaming
|
||||||
|
|
|
||||||
76
src/raylib.h
76
src/raylib.h
|
|
@ -157,7 +157,8 @@
|
||||||
#define LoadText LoadFileText
|
#define LoadText LoadFileText
|
||||||
#define GetExtension GetFileExtension
|
#define GetExtension GetFileExtension
|
||||||
#define GetImageData LoadImageColors
|
#define GetImageData LoadImageColors
|
||||||
//#define Fade(c, a) ColorAlpha(c, a)
|
#define FILTER_POINT TEXTURE_FILTER_POINT
|
||||||
|
#define FILTER_BILINEAR TEXTURE_FILTER_BILINEAR
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Structures Definition
|
// Structures Definition
|
||||||
|
|
@ -791,30 +792,30 @@ typedef enum {
|
||||||
// NOTE 1: Filtering considers mipmaps if available in the texture
|
// NOTE 1: Filtering considers mipmaps if available in the texture
|
||||||
// NOTE 2: Filter is accordingly set for minification and magnification
|
// NOTE 2: Filter is accordingly set for minification and magnification
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FILTER_POINT = 0, // No filter, just pixel aproximation
|
TEXTURE_FILTER_POINT = 0, // No filter, just pixel aproximation
|
||||||
FILTER_BILINEAR, // Linear filtering
|
TEXTURE_FILTER_BILINEAR, // Linear filtering
|
||||||
FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
|
TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
|
||||||
FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
|
TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
|
||||||
FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
|
TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
|
||||||
FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
|
TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
|
||||||
} TextureFilterMode;
|
} TextureFilterMode;
|
||||||
|
|
||||||
// Texture parameters: wrap mode
|
// Texture parameters: wrap mode
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WRAP_REPEAT = 0, // Repeats texture in tiled mode
|
TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode
|
||||||
WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode
|
TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode
|
||||||
WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode
|
TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode
|
||||||
WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode
|
TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode
|
||||||
} TextureWrapMode;
|
} TextureWrapMode;
|
||||||
|
|
||||||
// Cubemap layouts
|
// Cubemap layouts
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CUBEMAP_AUTO_DETECT = 0, // Automatically detect layout type
|
CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type
|
||||||
CUBEMAP_LINE_VERTICAL, // Layout is defined by a vertical line with faces
|
CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces
|
||||||
CUBEMAP_LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces
|
CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces
|
||||||
CUBEMAP_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces
|
CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces
|
||||||
CUBEMAP_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces
|
CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces
|
||||||
CUBEMAP_PANORAMA // Layout is defined by a panorama image (equirectangular map)
|
CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirectangular map)
|
||||||
} CubemapLayoutType;
|
} CubemapLayoutType;
|
||||||
|
|
||||||
// Font type, defines generation method
|
// Font type, defines generation method
|
||||||
|
|
@ -867,18 +868,24 @@ typedef enum {
|
||||||
|
|
||||||
// N-patch types
|
// N-patch types
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NPT_9PATCH = 0, // Npatch defined by 3x3 tiles
|
NPATCH_NINE_PATCH = 0, // Npatch defined by 3x3 tiles
|
||||||
NPT_3PATCH_VERTICAL, // Npatch defined by 1x3 tiles
|
NPATCH_THREE_PATCH_VERTICAL, // Npatch defined by 1x3 tiles
|
||||||
NPT_3PATCH_HORIZONTAL // Npatch defined by 3x1 tiles
|
NPATCH_THREE_PATCH_HORIZONTAL // Npatch defined by 3x1 tiles
|
||||||
} NPatchType;
|
} NPatchType;
|
||||||
|
|
||||||
// Callbacks to be implemented by users
|
// Callbacks to hook some internal functions
|
||||||
typedef void (*TraceLogCallback)(int logType, const char *text, va_list args);
|
// WARNING: This callbacks are intended for advance users
|
||||||
typedef void *(*MemAllocCallback)(int size);
|
typedef void (*TraceLogCallback)(int logType, const char *text, va_list args); // Logging: Redirect trace log messages
|
||||||
typedef void *(*MemReallocCallback)(int size);
|
|
||||||
typedef void (*MemFreeCallback)(void *ptr);
|
typedef void *(*MemAllocCallback)(int size); // Memory: Custom allocator
|
||||||
typedef unsigned char* (*LoadFileDataCallback)(const char* fileName, unsigned int* bytesRead); // Load file data as byte array (read)
|
typedef void *(*MemReallocCallback)(void *ptr, int size); // Memory: Custom re-allocator
|
||||||
typedef char* (*LoadFileTextCallback)(const char* fileName); // Load text data from file (read), returns a '\0' terminated string
|
typedef void (*MemFreeCallback)(void *ptr); // Memory: Custom free
|
||||||
|
|
||||||
|
typedef unsigned char* (*LoadFileDataCallback)(const char* fileName, unsigned int* bytesRead); // FileIO: Load binary data
|
||||||
|
typedef void (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); // FileIO: Save binary data
|
||||||
|
typedef char *(*LoadFileTextCallback)(const char* fileName); // FileIO: Load text data
|
||||||
|
typedef void (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" { // Prevents name mangling of functions
|
extern "C" { // Prevents name mangling of functions
|
||||||
|
|
@ -978,15 +985,19 @@ RLAPI void SetConfigFlags(unsigned int flags); // Setup init
|
||||||
RLAPI void TraceLog(int logType, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR)
|
RLAPI void TraceLog(int logType, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR)
|
||||||
RLAPI void SetTraceLogLevel(int logType); // Set the current threshold (minimum) log level
|
RLAPI void SetTraceLogLevel(int logType); // Set the current threshold (minimum) log level
|
||||||
RLAPI void *MemAlloc(int size); // Internal memory allocator
|
RLAPI void *MemAlloc(int size); // Internal memory allocator
|
||||||
|
RLAPI void *MemRealloc(void *ptr, int size); // Internal memory reallocator
|
||||||
RLAPI void MemFree(void *ptr); // Internal memory free
|
RLAPI void MemFree(void *ptr); // Internal memory free
|
||||||
|
|
||||||
// Set system callbacks
|
// Set custom callbacks
|
||||||
RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set a trace log callback to enable custom logging
|
// WARNING: Callbacks setup is intended for advance users
|
||||||
|
RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log
|
||||||
RLAPI void SetMemAllocCallback(MemAllocCallback callback); // Set custom memory allocator
|
RLAPI void SetMemAllocCallback(MemAllocCallback callback); // Set custom memory allocator
|
||||||
RLAPI void SetMemReallocCallback(MemReallocCallback callback); // Set custom memory reallocator
|
RLAPI void SetMemReallocCallback(MemReallocCallback callback); // Set custom memory reallocator
|
||||||
RLAPI void SetMemFreeCallback(MemFreeCallback callback); // Set custom memory free
|
RLAPI void SetMemFreeCallback(MemFreeCallback callback); // Set custom memory free
|
||||||
RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // override default file access functions
|
RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader
|
||||||
RLAPI void SetLoadFileTextCallback(LoadFileDataCallback callback); // override default file access functions
|
RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver
|
||||||
|
RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader
|
||||||
|
RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver
|
||||||
|
|
||||||
// Files management functions
|
// Files management functions
|
||||||
RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read)
|
RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read)
|
||||||
|
|
@ -998,7 +1009,7 @@ RLAPI bool SaveFileText(const char *fileName, char *text); // Save text d
|
||||||
RLAPI bool FileExists(const char *fileName); // Check if file exists
|
RLAPI bool FileExists(const char *fileName); // Check if file exists
|
||||||
RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists
|
RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists
|
||||||
RLAPI bool IsFileExtension(const char *fileName, const char *ext);// Check file extension (including point: .png, .wav)
|
RLAPI bool IsFileExtension(const char *fileName, const char *ext);// Check file extension (including point: .png, .wav)
|
||||||
RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (including point: ".png")
|
RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: ".png")
|
||||||
RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string
|
RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string
|
||||||
RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string)
|
RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string)
|
||||||
RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string)
|
RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string)
|
||||||
|
|
@ -1495,6 +1506,7 @@ RLAPI void UnloadWaveSamples(float *samples); // Unload
|
||||||
|
|
||||||
// Music management functions
|
// Music management functions
|
||||||
RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file
|
RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file
|
||||||
|
RLAPI Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int dataSize); // Load module music from data
|
||||||
RLAPI void UnloadMusicStream(Music music); // Unload music stream
|
RLAPI void UnloadMusicStream(Music music); // Unload music stream
|
||||||
RLAPI void PlayMusicStream(Music music); // Start music playing
|
RLAPI void PlayMusicStream(Music music); // Start music playing
|
||||||
RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming
|
RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@
|
||||||
// Defines and Macros
|
// Defines and Macros
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#ifndef PI
|
#ifndef PI
|
||||||
#define PI 3.14159265358979323846
|
#define PI 3.14159265358979323846f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DEG2RAD
|
#ifndef DEG2RAD
|
||||||
|
|
@ -1162,7 +1162,7 @@ RMDEF Quaternion QuaternionIdentity(void)
|
||||||
// Computes the length of a quaternion
|
// Computes the length of a quaternion
|
||||||
RMDEF float QuaternionLength(Quaternion q)
|
RMDEF float QuaternionLength(Quaternion q)
|
||||||
{
|
{
|
||||||
float result = (float)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w);
|
float result = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1271,6 +1271,12 @@ RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
|
||||||
|
|
||||||
float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w;
|
float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w;
|
||||||
|
|
||||||
|
if (cosHalfTheta < 0)
|
||||||
|
{
|
||||||
|
q2.x = -q2.x; q2.y = -q2.y; q2.z = -q2.z; q2.w = -q2.w;
|
||||||
|
cosHalfTheta = -cosHalfTheta;
|
||||||
|
}
|
||||||
|
|
||||||
if (fabs(cosHalfTheta) >= 1.0f) result = q1;
|
if (fabs(cosHalfTheta) >= 1.0f) result = q1;
|
||||||
else if (cosHalfTheta > 0.95f) result = QuaternionNlerp(q1, q2, amount);
|
else if (cosHalfTheta > 0.95f) result = QuaternionNlerp(q1, q2, amount);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
209
src/rlgl.h
209
src/rlgl.h
|
|
@ -136,7 +136,8 @@
|
||||||
// This is the maximum amount of elements (quads) per batch
|
// This is the maximum amount of elements (quads) per batch
|
||||||
// NOTE: Be careful with text, every letter maps to a quad
|
// NOTE: Be careful with text, every letter maps to a quad
|
||||||
#define DEFAULT_BATCH_BUFFER_ELEMENTS 8192
|
#define DEFAULT_BATCH_BUFFER_ELEMENTS 8192
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
// We reduce memory sizes for embedded systems (RPI and HTML5)
|
// We reduce memory sizes for embedded systems (RPI and HTML5)
|
||||||
// NOTE: On HTML5 (emscripten) this is allocated on heap,
|
// NOTE: On HTML5 (emscripten) this is allocated on heap,
|
||||||
// by default it's only 16MB!...just take care...
|
// by default it's only 16MB!...just take care...
|
||||||
|
|
@ -158,6 +159,11 @@
|
||||||
#define MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack
|
#define MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Vertex buffers id limit
|
||||||
|
#ifndef MAX_MESH_VERTEX_BUFFERS
|
||||||
|
#define MAX_MESH_VERTEX_BUFFERS 7 // Maximum vertex buffers (VBO) per mesh
|
||||||
|
#endif
|
||||||
|
|
||||||
// Shader and material limits
|
// Shader and material limits
|
||||||
#ifndef MAX_SHADER_LOCATIONS
|
#ifndef MAX_SHADER_LOCATIONS
|
||||||
#define MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
|
#define MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
|
||||||
|
|
@ -179,19 +185,19 @@
|
||||||
#define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T
|
#define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T
|
||||||
#define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER
|
#define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER
|
||||||
#define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER
|
#define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER
|
||||||
#define RL_TEXTURE_ANISOTROPIC_FILTER 0x3000 // Anisotropic filter (custom identifier)
|
|
||||||
|
|
||||||
#define RL_FILTER_NEAREST 0x2600 // GL_NEAREST
|
#define RL_TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST
|
||||||
#define RL_FILTER_LINEAR 0x2601 // GL_LINEAR
|
#define RL_TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR
|
||||||
#define RL_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST
|
#define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST
|
||||||
#define RL_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR
|
#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR
|
||||||
#define RL_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST
|
#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST
|
||||||
#define RL_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR
|
#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR
|
||||||
|
#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier)
|
||||||
|
|
||||||
#define RL_WRAP_REPEAT 0x2901 // GL_REPEAT
|
#define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT
|
||||||
#define RL_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE
|
#define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE
|
||||||
#define RL_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT
|
#define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT
|
||||||
#define RL_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT
|
#define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT
|
||||||
|
|
||||||
// Matrix modes (equivalent to OpenGL)
|
// Matrix modes (equivalent to OpenGL)
|
||||||
#define RL_MODELVIEW 0x1700 // GL_MODELVIEW
|
#define RL_MODELVIEW 0x1700 // GL_MODELVIEW
|
||||||
|
|
@ -385,12 +391,12 @@ typedef enum {
|
||||||
// NOTE 1: Filtering considers mipmaps if available in the texture
|
// NOTE 1: Filtering considers mipmaps if available in the texture
|
||||||
// NOTE 2: Filter is accordingly set for minification and magnification
|
// NOTE 2: Filter is accordingly set for minification and magnification
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FILTER_POINT = 0, // No filter, just pixel aproximation
|
TEXTURE_FILTER_POINT = 0, // No filter, just pixel aproximation
|
||||||
FILTER_BILINEAR, // Linear filtering
|
TEXTURE_FILTER_BILINEAR, // Linear filtering
|
||||||
FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
|
TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
|
||||||
FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
|
TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
|
||||||
FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
|
TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
|
||||||
FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
|
TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
|
||||||
} TextureFilterMode;
|
} TextureFilterMode;
|
||||||
|
|
||||||
// Color blending modes (pre-defined)
|
// Color blending modes (pre-defined)
|
||||||
|
|
@ -570,7 +576,7 @@ RLAPI void rlUpdateMesh(Mesh mesh, int buffer, int count); // Upd
|
||||||
RLAPI void rlUpdateMeshAt(Mesh mesh, int buffer, int count, int index); // Update vertex or index data on GPU, at index
|
RLAPI void rlUpdateMeshAt(Mesh mesh, int buffer, int count, int index); // Update vertex or index data on GPU, at index
|
||||||
RLAPI void rlDrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform
|
RLAPI void rlDrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform
|
||||||
RLAPI void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int count); // Draw a 3d mesh with material and transform
|
RLAPI void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int count); // Draw a 3d mesh with material and transform
|
||||||
RLAPI void rlUnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU
|
RLAPI void rlUnloadMesh(Mesh *mesh); // Unload mesh data from CPU and GPU
|
||||||
|
|
||||||
// NOTE: There is a set of shader related functions that are available to end user,
|
// NOTE: There is a set of shader related functions that are available to end user,
|
||||||
// to avoid creating function wrappers through core module, they have been directly declared in raylib.h
|
// to avoid creating function wrappers through core module, they have been directly declared in raylib.h
|
||||||
|
|
@ -806,7 +812,8 @@ typedef struct VertexBuffer {
|
||||||
unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
|
unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
|
||||||
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
|
||||||
unsigned int *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
|
unsigned int *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
unsigned short *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
|
unsigned short *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
|
||||||
#endif
|
#endif
|
||||||
unsigned int vaoId; // OpenGL Vertex Array Object id
|
unsigned int vaoId; // OpenGL Vertex Array Object id
|
||||||
|
|
@ -965,7 +972,6 @@ static Color *GenNextMipmap(Color *srcData, int srcWidth, int srcHeight);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_11)
|
#if defined(GRAPHICS_API_OPENGL_11)
|
||||||
|
|
||||||
// Fallback to OpenGL 1.1 function calls
|
// Fallback to OpenGL 1.1 function calls
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
void rlMatrixMode(int mode)
|
void rlMatrixMode(int mode)
|
||||||
|
|
@ -996,9 +1002,8 @@ void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); }
|
||||||
void rlRotatef(float angleDeg, float x, float y, float z) { glRotatef(angleDeg, x, y, z); }
|
void rlRotatef(float angleDeg, float x, float y, float z) { glRotatef(angleDeg, x, y, z); }
|
||||||
void rlScalef(float x, float y, float z) { glScalef(x, y, z); }
|
void rlScalef(float x, float y, float z) { glScalef(x, y, z); }
|
||||||
void rlMultMatrixf(float *matf) { glMultMatrixf(matf); }
|
void rlMultMatrixf(float *matf) { glMultMatrixf(matf); }
|
||||||
|
#endif
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
|
|
||||||
// Choose the current matrix to be transformed
|
// Choose the current matrix to be transformed
|
||||||
void rlMatrixMode(int mode)
|
void rlMatrixMode(int mode)
|
||||||
{
|
{
|
||||||
|
|
@ -1119,7 +1124,6 @@ void rlViewport(int x, int y, int width, int height)
|
||||||
// Module Functions Definition - Vertex level operations
|
// Module Functions Definition - Vertex level operations
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#if defined(GRAPHICS_API_OPENGL_11)
|
#if defined(GRAPHICS_API_OPENGL_11)
|
||||||
|
|
||||||
// Fallback to OpenGL 1.1 function calls
|
// Fallback to OpenGL 1.1 function calls
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
void rlBegin(int mode)
|
void rlBegin(int mode)
|
||||||
|
|
@ -1142,9 +1146,8 @@ void rlNormal3f(float x, float y, float z) { glNormal3f(x, y, z); }
|
||||||
void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); }
|
void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); }
|
||||||
void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); }
|
void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); }
|
||||||
void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); }
|
void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); }
|
||||||
|
#endif
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
|
|
||||||
// Initialize drawing mode (how to organize vertex)
|
// Initialize drawing mode (how to organize vertex)
|
||||||
void rlBegin(int mode)
|
void rlBegin(int mode)
|
||||||
{
|
{
|
||||||
|
|
@ -1379,7 +1382,7 @@ void rlTextureParameters(unsigned int id, int param, int value)
|
||||||
case RL_TEXTURE_WRAP_S:
|
case RL_TEXTURE_WRAP_S:
|
||||||
case RL_TEXTURE_WRAP_T:
|
case RL_TEXTURE_WRAP_T:
|
||||||
{
|
{
|
||||||
if (value == RL_WRAP_MIRROR_CLAMP)
|
if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP)
|
||||||
{
|
{
|
||||||
#if !defined(GRAPHICS_API_OPENGL_11)
|
#if !defined(GRAPHICS_API_OPENGL_11)
|
||||||
if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value);
|
if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value);
|
||||||
|
|
@ -1391,7 +1394,7 @@ void rlTextureParameters(unsigned int id, int param, int value)
|
||||||
} break;
|
} break;
|
||||||
case RL_TEXTURE_MAG_FILTER:
|
case RL_TEXTURE_MAG_FILTER:
|
||||||
case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break;
|
case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break;
|
||||||
case RL_TEXTURE_ANISOTROPIC_FILTER:
|
case RL_TEXTURE_FILTER_ANISOTROPIC:
|
||||||
{
|
{
|
||||||
#if !defined(GRAPHICS_API_OPENGL_11)
|
#if !defined(GRAPHICS_API_OPENGL_11)
|
||||||
if (value <= RLGL.ExtSupported.maxAnisotropicLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
if (value <= RLGL.ExtSupported.maxAnisotropicLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
||||||
|
|
@ -1893,15 +1896,18 @@ int rlGetVersion(void)
|
||||||
{
|
{
|
||||||
#if defined(GRAPHICS_API_OPENGL_11)
|
#if defined(GRAPHICS_API_OPENGL_11)
|
||||||
return OPENGL_11;
|
return OPENGL_11;
|
||||||
#elif defined(GRAPHICS_API_OPENGL_21)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
return OPENGL_33; // NOTE: Force OpenGL 3.3 on OSX
|
return OPENGL_33; // NOTE: Force OpenGL 3.3 on OSX
|
||||||
#else
|
#else
|
||||||
return OPENGL_21;
|
return OPENGL_21;
|
||||||
#endif
|
#endif
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
return OPENGL_33;
|
return OPENGL_33;
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
return OPENGL_ES_20;
|
return OPENGL_ES_20;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -1946,7 +1952,8 @@ void rlLoadExtensions(void *loader)
|
||||||
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
if (GLAD_GL_VERSION_2_1) TRACELOG(LOG_INFO, "GL: OpenGL 2.1 profile supported");
|
if (GLAD_GL_VERSION_2_1) TRACELOG(LOG_INFO, "GL: OpenGL 2.1 profile supported");
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
if (GLAD_GL_VERSION_3_3) TRACELOG(LOG_INFO, "GL: OpenGL 3.3 Core profile supported");
|
if (GLAD_GL_VERSION_3_3) TRACELOG(LOG_INFO, "GL: OpenGL 3.3 Core profile supported");
|
||||||
else TRACELOG(LOG_ERROR, "GL: OpenGL 3.3 Core profile not supported");
|
else TRACELOG(LOG_ERROR, "GL: OpenGL 3.3 Core profile not supported");
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -2046,7 +2053,8 @@ unsigned int rlLoadTexture(void *data, int width, int height, int format, int mi
|
||||||
{
|
{
|
||||||
#if defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
|
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
|
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
|
||||||
#endif
|
#endif
|
||||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||||
|
|
@ -2213,7 +2221,8 @@ unsigned int rlLoadTextureCubemap(void *data, int size, int format)
|
||||||
{
|
{
|
||||||
#if defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
|
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
|
GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
|
||||||
#endif
|
#endif
|
||||||
glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||||
|
|
@ -2279,7 +2288,8 @@ void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned
|
||||||
case UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
|
case UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
|
||||||
case UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
|
case UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
|
||||||
#endif
|
#endif
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
case UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break;
|
case UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break;
|
||||||
case UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break;
|
case UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break;
|
||||||
case UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break;
|
case UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break;
|
||||||
|
|
@ -2291,7 +2301,7 @@ void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned
|
||||||
case UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break;
|
case UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break;
|
||||||
case UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break;
|
case UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break;
|
||||||
#endif
|
#endif
|
||||||
#if !defined(GRAPHICS_API_OPENGL_11)
|
#if !defined(GRAPHICS_API_OPENGL_11)
|
||||||
case COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break;
|
case COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break;
|
||||||
case COMPRESSED_DXT1_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
|
case COMPRESSED_DXT1_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
|
||||||
case COMPRESSED_DXT3_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
|
case COMPRESSED_DXT3_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
|
||||||
|
|
@ -2303,7 +2313,7 @@ void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned
|
||||||
case COMPRESSED_PVRT_RGBA: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU
|
case COMPRESSED_PVRT_RGBA: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU
|
||||||
case COMPRESSED_ASTC_4x4_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
|
case COMPRESSED_ASTC_4x4_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
|
||||||
case COMPRESSED_ASTC_8x8_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
|
case COMPRESSED_ASTC_8x8_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
|
||||||
#endif
|
#endif
|
||||||
default: TRACELOG(LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break;
|
default: TRACELOG(LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2420,11 +2430,11 @@ void rlGenerateMipmaps(Texture2D *texture)
|
||||||
if (texture->format == UNCOMPRESSED_R8G8B8A8)
|
if (texture->format == UNCOMPRESSED_R8G8B8A8)
|
||||||
{
|
{
|
||||||
// Retrieve texture data from VRAM
|
// Retrieve texture data from VRAM
|
||||||
void *data = rlReadTexturePixels(*texture);
|
void *texData = rlReadTexturePixels(*texture);
|
||||||
|
|
||||||
// NOTE: data size is reallocated to fit mipmaps data
|
// NOTE: Texture data size is reallocated to fit mipmaps data
|
||||||
// NOTE: CPU mipmap generation only supports RGBA 32bit data
|
// NOTE: CPU mipmap generation only supports RGBA 32bit data
|
||||||
int mipmapCount = GenerateMipmaps(data, texture->width, texture->height);
|
int mipmapCount = GenerateMipmaps(texData, texture->width, texture->height);
|
||||||
|
|
||||||
int size = texture->width*texture->height*4;
|
int size = texture->width*texture->height*4;
|
||||||
int offset = size;
|
int offset = size;
|
||||||
|
|
@ -2435,7 +2445,7 @@ void rlGenerateMipmaps(Texture2D *texture)
|
||||||
// Load the mipmaps
|
// Load the mipmaps
|
||||||
for (int level = 1; level < mipmapCount; level++)
|
for (int level = 1; level < mipmapCount; level++)
|
||||||
{
|
{
|
||||||
glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, mipWidth, mipHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char *)data + offset);
|
glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, mipWidth, mipHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char *)texData + offset);
|
||||||
|
|
||||||
size = mipWidth*mipHeight*4;
|
size = mipWidth*mipHeight*4;
|
||||||
offset += size;
|
offset += size;
|
||||||
|
|
@ -2445,13 +2455,14 @@ void rlGenerateMipmaps(Texture2D *texture)
|
||||||
}
|
}
|
||||||
|
|
||||||
texture->mipmaps = mipmapCount + 1;
|
texture->mipmaps = mipmapCount + 1;
|
||||||
RL_FREE(data); // Once mipmaps have been generated and data has been uploaded to GPU VRAM, we can discard RAM data
|
RL_FREE(texData); // Once mipmaps have been generated and data has been uploaded to GPU VRAM, we can discard RAM data
|
||||||
|
|
||||||
TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Mipmaps generated manually on CPU side, total: %i", texture->id, texture->mipmaps);
|
TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Mipmaps generated manually on CPU side, total: %i", texture->id, texture->mipmaps);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps for provided texture format", texture->id);
|
else TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps for provided texture format", texture->id);
|
||||||
}
|
}
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
if ((texIsPOT) || (RLGL.ExtSupported.texNPOT))
|
if ((texIsPOT) || (RLGL.ExtSupported.texNPOT))
|
||||||
{
|
{
|
||||||
//glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorythm: GL_FASTEST, GL_NICEST, GL_DONT_CARE
|
//glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorythm: GL_FASTEST, GL_NICEST, GL_DONT_CARE
|
||||||
|
|
@ -2481,6 +2492,8 @@ void rlLoadMesh(Mesh *mesh, bool dynamic)
|
||||||
TRACELOG(LOG_WARNING, "VAO: [ID %i] Trying to re-load an already loaded mesh", mesh->vaoId);
|
TRACELOG(LOG_WARNING, "VAO: [ID %i] Trying to re-load an already loaded mesh", mesh->vaoId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mesh->vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||||
|
|
||||||
mesh->vaoId = 0; // Vertex Array Object
|
mesh->vaoId = 0; // Vertex Array Object
|
||||||
mesh->vboId[0] = 0; // Vertex positions VBO
|
mesh->vboId[0] = 0; // Vertex positions VBO
|
||||||
|
|
@ -2952,9 +2965,9 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false,
|
glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false,
|
||||||
MatrixToFloat(MatrixMultiply(MatrixMultiply(RLGL.State.transform, RLGL.State.modelview), RLGL.State.projection)));
|
MatrixToFloat(MatrixMultiply(MatrixMultiply(RLGL.State.transform, RLGL.State.modelview), RLGL.State.projection)));
|
||||||
|
|
||||||
float16* instances = RL_MALLOC(count*sizeof(float16));
|
float16* instanceTransforms = RL_MALLOC(count*sizeof(float16));
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) instances[i] = MatrixToFloatV(transforms[i]);
|
for (int i = 0; i < count; i++) instanceTransforms[i] = MatrixToFloatV(transforms[i]);
|
||||||
|
|
||||||
// This could alternatively use a static VBO and either glMapBuffer or glBufferSubData.
|
// This could alternatively use a static VBO and either glMapBuffer or glBufferSubData.
|
||||||
// It isn't clear which would be reliably faster in all cases and on all platforms, and
|
// It isn't clear which would be reliably faster in all cases and on all platforms, and
|
||||||
|
|
@ -2963,7 +2976,7 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
unsigned int instancesB = 0;
|
unsigned int instancesB = 0;
|
||||||
glGenBuffers(1, &instancesB);
|
glGenBuffers(1, &instancesB);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, instancesB);
|
glBindBuffer(GL_ARRAY_BUFFER, instancesB);
|
||||||
glBufferData(GL_ARRAY_BUFFER, count*sizeof(float16), instances, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, count*sizeof(float16), instanceTransforms, GL_STATIC_DRAW);
|
||||||
|
|
||||||
// Instances are put in LOC_MATRIX_MODEL attribute location with space for 4x Vector4, eg:
|
// Instances are put in LOC_MATRIX_MODEL attribute location with space for 4x Vector4, eg:
|
||||||
// layout (location = 12) in mat4 instance;
|
// layout (location = 12) in mat4 instance;
|
||||||
|
|
@ -2983,7 +2996,7 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
else glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
else glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
||||||
|
|
||||||
glDeleteBuffers(1, &instancesB);
|
glDeleteBuffers(1, &instancesB);
|
||||||
RL_FREE(instances);
|
RL_FREE(instanceTransforms);
|
||||||
|
|
||||||
// Unbind all binded texture maps
|
// Unbind all binded texture maps
|
||||||
for (int i = 0; i < MAX_MATERIAL_MAPS; i++)
|
for (int i = 0; i < MAX_MATERIAL_MAPS; i++)
|
||||||
|
|
@ -3005,31 +3018,21 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unload mesh data from CPU and GPU
|
// Unload mesh data from CPU and GPU
|
||||||
void rlUnloadMesh(Mesh mesh)
|
void rlUnloadMesh(Mesh *mesh)
|
||||||
{
|
{
|
||||||
RL_FREE(mesh.vertices);
|
|
||||||
RL_FREE(mesh.texcoords);
|
|
||||||
RL_FREE(mesh.normals);
|
|
||||||
RL_FREE(mesh.colors);
|
|
||||||
RL_FREE(mesh.tangents);
|
|
||||||
RL_FREE(mesh.texcoords2);
|
|
||||||
RL_FREE(mesh.indices);
|
|
||||||
|
|
||||||
RL_FREE(mesh.animVertices);
|
|
||||||
RL_FREE(mesh.animNormals);
|
|
||||||
RL_FREE(mesh.boneWeights);
|
|
||||||
RL_FREE(mesh.boneIds);
|
|
||||||
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
for (int i = 0; i < 7; i++) glDeleteBuffers(1, &mesh.vboId[i]); // DEFAULT_MESH_VERTEX_BUFFERS (model.c)
|
for (int i = 0; i < 7; i++) glDeleteBuffers(1, &mesh->vboId[i]); // DEFAULT_MESH_VERTEX_BUFFERS (model.c)
|
||||||
if (RLGL.ExtSupported.vao)
|
if (RLGL.ExtSupported.vao)
|
||||||
{
|
{
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
glDeleteVertexArrays(1, &mesh.vaoId);
|
glDeleteVertexArrays(1, &mesh->vaoId);
|
||||||
TRACELOG(LOG_INFO, "VAO: [ID %i] Unloaded vertex data from VRAM (GPU)", mesh.vaoId);
|
TRACELOG(LOG_INFO, "VAO: [ID %i] Unloaded vertex data from VRAM (GPU)", mesh->vaoId);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)");
|
else TRACELOG(LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
RL_FREE(mesh->vboId);
|
||||||
|
mesh->vboId = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read screen pixel data (color buffer)
|
// Read screen pixel data (color buffer)
|
||||||
|
|
@ -3534,7 +3537,7 @@ TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, in
|
||||||
|
|
||||||
// Reset viewport dimensions to default
|
// Reset viewport dimensions to default
|
||||||
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
||||||
//rlEnableBackfaceCulling();
|
rlEnableBackfaceCulling();
|
||||||
//------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
cubemap.width = size;
|
cubemap.width = size;
|
||||||
|
|
@ -3607,7 +3610,7 @@ TextureCubemap GenTextureIrradiance(Shader shader, TextureCubemap cubemap, int s
|
||||||
|
|
||||||
// Reset viewport dimensions to default
|
// Reset viewport dimensions to default
|
||||||
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
||||||
//rlEnableBackfaceCulling();
|
rlEnableBackfaceCulling();
|
||||||
//------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
irradiance.width = size;
|
irradiance.width = size;
|
||||||
|
|
@ -3630,7 +3633,7 @@ TextureCubemap GenTexturePrefilter(Shader shader, TextureCubemap cubemap, int si
|
||||||
//------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------
|
||||||
unsigned int rbo = rlLoadTextureDepth(size, size, true);
|
unsigned int rbo = rlLoadTextureDepth(size, size, true);
|
||||||
prefilter.id = rlLoadTextureCubemap(NULL, size, UNCOMPRESSED_R32G32B32);
|
prefilter.id = rlLoadTextureCubemap(NULL, size, UNCOMPRESSED_R32G32B32);
|
||||||
rlTextureParameters(prefilter.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_MIP_LINEAR);
|
rlTextureParameters(prefilter.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_MIP_LINEAR);
|
||||||
|
|
||||||
unsigned int fbo = rlLoadFramebuffer(size, size);
|
unsigned int fbo = rlLoadFramebuffer(size, size);
|
||||||
rlFramebufferAttach(fbo, rbo, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER);
|
rlFramebufferAttach(fbo, rbo, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER);
|
||||||
|
|
@ -3705,7 +3708,7 @@ TextureCubemap GenTexturePrefilter(Shader shader, TextureCubemap cubemap, int si
|
||||||
|
|
||||||
// Reset viewport dimensions to default
|
// Reset viewport dimensions to default
|
||||||
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
|
||||||
//rlEnableBackfaceCulling();
|
rlEnableBackfaceCulling();
|
||||||
//------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
prefilter.width = size;
|
prefilter.width = size;
|
||||||
|
|
@ -4054,25 +4057,21 @@ static unsigned int CompileShader(const char *shaderStr, int type)
|
||||||
glCompileShader(shader);
|
glCompileShader(shader);
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||||
|
|
||||||
if (success != GL_TRUE)
|
if (success == GL_FALSE)
|
||||||
{
|
{
|
||||||
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile shader code", shader);
|
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile shader code", shader);
|
||||||
|
|
||||||
int maxLength = 0;
|
int maxLength = 0;
|
||||||
int length;
|
|
||||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
if (maxLength > 0)
|
||||||
char *log = RL_MALLOC(maxLength);
|
{
|
||||||
#else
|
int length = 0;
|
||||||
char log[maxLength];
|
char *log = RL_CALLOC(maxLength, sizeof(char));
|
||||||
#endif
|
glGetShaderInfoLog(shader, maxLength, &length, log);
|
||||||
glGetShaderInfoLog(shader, maxLength, &length, log);
|
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log);
|
||||||
|
RL_FREE(log);
|
||||||
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log);
|
}
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
RL_FREE(log);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_INFO, "SHADER: [ID %i] Compiled successfully", shader);
|
else TRACELOG(LOG_INFO, "SHADER: [ID %i] Compiled successfully", shader);
|
||||||
|
|
||||||
|
|
@ -4116,7 +4115,7 @@ static unsigned int LoadShaderProgram(unsigned int vShaderId, unsigned int fShad
|
||||||
|
|
||||||
if (maxLength > 0)
|
if (maxLength > 0)
|
||||||
{
|
{
|
||||||
int length;
|
int length = 0;
|
||||||
char *log = RL_CALLOC(maxLength, sizeof(char));
|
char *log = RL_CALLOC(maxLength, sizeof(char));
|
||||||
glGetProgramInfoLog(program, maxLength, &length, log);
|
glGetProgramInfoLog(program, maxLength, &length, log);
|
||||||
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log);
|
TRACELOG(LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log);
|
||||||
|
|
@ -4147,7 +4146,8 @@ static Shader LoadShaderDefault(void)
|
||||||
const char *defaultVShaderStr =
|
const char *defaultVShaderStr =
|
||||||
#if defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
"#version 120 \n"
|
"#version 120 \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
"#version 100 \n"
|
"#version 100 \n"
|
||||||
#endif
|
#endif
|
||||||
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
||||||
|
|
@ -4156,7 +4156,8 @@ static Shader LoadShaderDefault(void)
|
||||||
"attribute vec4 vertexColor; \n"
|
"attribute vec4 vertexColor; \n"
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
"varying vec4 fragColor; \n"
|
"varying vec4 fragColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
"#version 330 \n"
|
"#version 330 \n"
|
||||||
"in vec3 vertexPosition; \n"
|
"in vec3 vertexPosition; \n"
|
||||||
"in vec2 vertexTexCoord; \n"
|
"in vec2 vertexTexCoord; \n"
|
||||||
|
|
@ -4176,14 +4177,16 @@ static Shader LoadShaderDefault(void)
|
||||||
const char *defaultFShaderStr =
|
const char *defaultFShaderStr =
|
||||||
#if defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_21)
|
||||||
"#version 120 \n"
|
"#version 120 \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
"#version 100 \n"
|
"#version 100 \n"
|
||||||
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
|
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
|
||||||
#endif
|
#endif
|
||||||
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
"varying vec4 fragColor; \n"
|
"varying vec4 fragColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
"#version 330 \n"
|
"#version 330 \n"
|
||||||
"in vec2 fragTexCoord; \n"
|
"in vec2 fragTexCoord; \n"
|
||||||
"in vec4 fragColor; \n"
|
"in vec4 fragColor; \n"
|
||||||
|
|
@ -4196,7 +4199,8 @@ static Shader LoadShaderDefault(void)
|
||||||
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
||||||
" vec4 texelColor = texture2D(texture0, fragTexCoord); \n" // NOTE: texture2D() is deprecated on OpenGL 3.3 and ES 3.0
|
" vec4 texelColor = texture2D(texture0, fragTexCoord); \n" // NOTE: texture2D() is deprecated on OpenGL 3.3 and ES 3.0
|
||||||
" gl_FragColor = texelColor*colDiffuse*fragColor; \n"
|
" gl_FragColor = texelColor*colDiffuse*fragColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
||||||
" finalColor = texelColor*colDiffuse*fragColor; \n"
|
" finalColor = texelColor*colDiffuse*fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -4296,7 +4300,8 @@ static RenderBatch LoadRenderBatch(int numBuffers, int bufferElements)
|
||||||
batch.vertexBuffer[i].colors = (unsigned char *)RL_MALLOC(bufferElements*4*4*sizeof(unsigned char)); // 4 float by color, 4 colors by quad
|
batch.vertexBuffer[i].colors = (unsigned char *)RL_MALLOC(bufferElements*4*4*sizeof(unsigned char)); // 4 float by color, 4 colors by quad
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
batch.vertexBuffer[i].indices = (unsigned int *)RL_MALLOC(bufferElements*6*sizeof(unsigned int)); // 6 int by quad (indices)
|
batch.vertexBuffer[i].indices = (unsigned int *)RL_MALLOC(bufferElements*6*sizeof(unsigned int)); // 6 int by quad (indices)
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
batch.vertexBuffer[i].indices = (unsigned short *)RL_MALLOC(bufferElements*6*sizeof(unsigned short)); // 6 int by quad (indices)
|
batch.vertexBuffer[i].indices = (unsigned short *)RL_MALLOC(bufferElements*6*sizeof(unsigned short)); // 6 int by quad (indices)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -4365,7 +4370,8 @@ static RenderBatch LoadRenderBatch(int numBuffers, int bufferElements)
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]);
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -4526,7 +4532,8 @@ static void DrawRenderBatch(RenderBatch *batch)
|
||||||
// NOTE: The final parameter tells the GPU the offset in bytes from the
|
// NOTE: The final parameter tells the GPU the offset in bytes from the
|
||||||
// start of the index buffer to the location of the first index to process
|
// start of the index buffer to the location of the first index to process
|
||||||
glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*sizeof(GLuint)));
|
glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*sizeof(GLuint)));
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#endif
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*sizeof(GLushort)));
|
glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*sizeof(GLushort)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -4908,21 +4915,21 @@ char *LoadFileText(const char *fileName)
|
||||||
|
|
||||||
if (fileName != NULL)
|
if (fileName != NULL)
|
||||||
{
|
{
|
||||||
FILE *textFile = fopen(fileName, "rt");
|
FILE *file = fopen(fileName, "rt");
|
||||||
|
|
||||||
if (textFile != NULL)
|
if (file != NULL)
|
||||||
{
|
{
|
||||||
// WARNING: When reading a file as 'text' file,
|
// WARNING: When reading a file as 'text' file,
|
||||||
// text mode causes carriage return-linefeed translation...
|
// text mode causes carriage return-linefeed translation...
|
||||||
// ...but using fseek() should return correct byte-offset
|
// ...but using fseek() should return correct byte-offset
|
||||||
fseek(textFile, 0, SEEK_END);
|
fseek(file, 0, SEEK_END);
|
||||||
int size = ftell(textFile);
|
int size = ftell(file);
|
||||||
fseek(textFile, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
text = (char *)RL_MALLOC((size + 1)*sizeof(char));
|
text = (char *)RL_MALLOC((size + 1)*sizeof(char));
|
||||||
int count = fread(text, sizeof(char), size, textFile);
|
int count = (int)fread(text, sizeof(char), size, file);
|
||||||
|
|
||||||
// WARNING: \r\n is converted to \n on reading, so,
|
// WARNING: \r\n is converted to \n on reading, so,
|
||||||
// read bytes count gets reduced by the number of lines
|
// read bytes count gets reduced by the number of lines
|
||||||
|
|
@ -4935,7 +4942,7 @@ char *LoadFileText(const char *fileName)
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to read text file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to read text file", fileName);
|
||||||
|
|
||||||
fclose(textFile);
|
fclose(file);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
src/rnet.h
16
src/rnet.h
|
|
@ -231,11 +231,15 @@ typedef int socklen_t;
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Boolean type
|
// Boolean type
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <stdbool.h>
|
||||||
|
#else
|
||||||
#if defined(__STDC__) && __STDC_VERSION__ >= 199901L
|
#if defined(__STDC__) && __STDC_VERSION__ >= 199901L
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#elif !defined(__cplusplus) && !defined(bool)
|
#elif !defined(__cplusplus) && !defined(bool)
|
||||||
typedef enum { false, true } bool;
|
typedef enum { false, true } bool;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SOCKET_TCP = 0, // SOCK_STREAM
|
SOCKET_TCP = 0, // SOCK_STREAM
|
||||||
|
|
@ -347,7 +351,7 @@ int GetAddressFamily(AddressInformation address);
|
||||||
int GetAddressSocketType(AddressInformation address);
|
int GetAddressSocketType(AddressInformation address);
|
||||||
int GetAddressProtocol(AddressInformation address);
|
int GetAddressProtocol(AddressInformation address);
|
||||||
char *GetAddressCanonName(AddressInformation address);
|
char *GetAddressCanonName(AddressInformation address);
|
||||||
char *GetAddressHostAndPort(AddressInformation address, char *outhost, int *outport);
|
char *GetAddressHostAndPort(AddressInformation address, char *outhost, unsigned short *outport);
|
||||||
|
|
||||||
// Address Memory API
|
// Address Memory API
|
||||||
AddressInformation LoadAddress(void);
|
AddressInformation LoadAddress(void);
|
||||||
|
|
@ -365,7 +369,7 @@ Socket *SocketAccept(Socket *server, SocketConfig *config);
|
||||||
int SocketSend(Socket *sock, const void *datap, int len);
|
int SocketSend(Socket *sock, const void *datap, int len);
|
||||||
int SocketReceive(Socket *sock, void *data, int maxlen);
|
int SocketReceive(Socket *sock, void *data, int maxlen);
|
||||||
SocketAddressStorage SocketGetPeerAddress(Socket *sock);
|
SocketAddressStorage SocketGetPeerAddress(Socket *sock);
|
||||||
char *GetSocketAddressHost(SocketAddressStorage storage);
|
const char *GetSocketAddressHost(SocketAddressStorage storage);
|
||||||
short GetSocketAddressPort(SocketAddressStorage storage);
|
short GetSocketAddressPort(SocketAddressStorage storage);
|
||||||
void SocketClose(Socket *sock);
|
void SocketClose(Socket *sock);
|
||||||
|
|
||||||
|
|
@ -1340,7 +1344,7 @@ bool SocketConnect(SocketConfig *config, SocketResult *result)
|
||||||
ip4addr.sin_family = AF_INET;
|
ip4addr.sin_family = AF_INET;
|
||||||
unsigned long hport;
|
unsigned long hport;
|
||||||
hport = strtoul(config->port, NULL, 0);
|
hport = strtoul(config->port, NULL, 0);
|
||||||
ip4addr.sin_port = htons(hport);
|
ip4addr.sin_port = (unsigned short)(hport);
|
||||||
|
|
||||||
// TODO: Changed the code to avoid the usage of inet_pton and inet_ntop replacing them with getnameinfo (that should have a better support on windows).
|
// TODO: Changed the code to avoid the usage of inet_pton and inet_ntop replacing them with getnameinfo (that should have a better support on windows).
|
||||||
|
|
||||||
|
|
@ -1376,7 +1380,7 @@ bool SocketConnect(SocketConfig *config, SocketResult *result)
|
||||||
ip6addr.sin6_family = AF_INET6;
|
ip6addr.sin6_family = AF_INET6;
|
||||||
unsigned long hport;
|
unsigned long hport;
|
||||||
hport = strtoul(config->port, NULL, 0);
|
hport = strtoul(config->port, NULL, 0);
|
||||||
ip6addr.sin6_port = htons(hport);
|
ip6addr.sin6_port = htons((unsigned short)hport);
|
||||||
//inet_pton(AF_INET6, config->host, &ip6addr.sin6_addr); // TODO.
|
//inet_pton(AF_INET6, config->host, &ip6addr.sin6_addr); // TODO.
|
||||||
int connect_result = connect(result->socket->channel, (struct sockaddr *)&ip6addr, sizeof(ip6addr));
|
int connect_result = connect(result->socket->channel, (struct sockaddr *)&ip6addr, sizeof(ip6addr));
|
||||||
|
|
||||||
|
|
@ -1439,7 +1443,7 @@ SocketAddressStorage SocketGetPeerAddress(Socket *sock)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the address-type appropriate host portion of a socket address
|
// Return the address-type appropriate host portion of a socket address
|
||||||
char *GetSocketAddressHost(SocketAddressStorage storage)
|
const char *GetSocketAddressHost(SocketAddressStorage storage)
|
||||||
{
|
{
|
||||||
assert(storage->address.ss_family == AF_INET || storage->address.ss_family == AF_INET6);
|
assert(storage->address.ss_family == AF_INET || storage->address.ss_family == AF_INET6);
|
||||||
return SocketAddressToString((struct sockaddr_storage *)storage);
|
return SocketAddressToString((struct sockaddr_storage *)storage);
|
||||||
|
|
@ -2117,7 +2121,7 @@ char *GetAddressCanonName(AddressInformation address)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opaque datatype accessor addrinfo->ai_addr
|
// Opaque datatype accessor addrinfo->ai_addr
|
||||||
char *GetAddressHostAndPort(AddressInformation address, char *outhost, int *outport)
|
char *GetAddressHostAndPort(AddressInformation address, char *outhost, unsigned short *outport)
|
||||||
{
|
{
|
||||||
//char *ip[INET6_ADDRSTRLEN];
|
//char *ip[INET6_ADDRSTRLEN];
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
|
|
|
||||||
49
src/shapes.c
49
src/shapes.c
|
|
@ -116,45 +116,18 @@ void DrawLineV(Vector2 startPos, Vector2 endPos, Color color)
|
||||||
// Draw a line defining thickness
|
// Draw a line defining thickness
|
||||||
void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color)
|
void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color)
|
||||||
{
|
{
|
||||||
if (startPos.x > endPos.x)
|
Vector2 delta = {endPos.x-startPos.x, endPos.y-startPos.y};
|
||||||
|
float length = sqrtf(delta.x*delta.x + delta.y*delta.y);
|
||||||
|
|
||||||
|
if (length > 0 && thick > 0)
|
||||||
{
|
{
|
||||||
Vector2 tempPos = startPos;
|
float scale = thick/(2*length);
|
||||||
startPos = endPos;
|
Vector2 radius = {-scale*delta.y, scale*delta.x};
|
||||||
endPos = tempPos;
|
Vector2 strip[] = {{startPos.x-radius.x, startPos.y-radius.y}, {startPos.x+radius.x, startPos.y+radius.y},
|
||||||
|
{endPos.x-radius.x, endPos.y-radius.y}, {endPos.x+radius.x, endPos.y+radius.y}};
|
||||||
|
|
||||||
|
DrawTriangleStrip(strip, 4, 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(GetShapesTexture().id);
|
|
||||||
|
|
||||||
rlPushMatrix();
|
|
||||||
rlTranslatef((float)startPos.x, (float)startPos.y, 0.0f);
|
|
||||||
rlRotatef(RAD2DEG*angle, 0.0f, 0.0f, 1.0f);
|
|
||||||
rlTranslatef(0, (thick > 1.0f)? -thick/2.0f : -1.0f, 0.0f);
|
|
||||||
|
|
||||||
rlBegin(RL_QUADS);
|
|
||||||
rlColor4ub(color.r, color.g, color.b, color.a);
|
|
||||||
rlNormal3f(0.0f, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height);
|
|
||||||
rlVertex2f(0.0f, 0.0f);
|
|
||||||
|
|
||||||
rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height);
|
|
||||||
rlVertex2f(0.0f, thick);
|
|
||||||
|
|
||||||
rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height);
|
|
||||||
rlVertex2f(d, thick);
|
|
||||||
|
|
||||||
rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height);
|
|
||||||
rlVertex2f(d, 0.0f);
|
|
||||||
rlEnd();
|
|
||||||
rlPopMatrix();
|
|
||||||
|
|
||||||
rlDisableTexture();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw line using cubic-bezier curves in-out
|
// Draw line using cubic-bezier curves in-out
|
||||||
|
|
@ -1504,7 +1477,7 @@ bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2,
|
||||||
|
|
||||||
if (div == 0.0f) return false; // WARNING: This check could not work due to float precision rounding issues...
|
if (div == 0.0f) return false; // WARNING: This check could not work due to float precision rounding issues...
|
||||||
|
|
||||||
const float xi = ((startPos2.x - startPos2.x)*(startPos1.x*endPos1.y - startPos1.y*endPos1.x) - (startPos1.x - endPos1.x)*(startPos2.x*endPos2.y - startPos2.y*endPos2.x))/div;
|
const float xi = ((startPos2.x - endPos2.x)*(startPos1.x*endPos1.y - startPos1.y*endPos1.x) - (startPos1.x - endPos1.x)*(startPos2.x*endPos2.y - startPos2.y*endPos2.x))/div;
|
||||||
const float yi = ((startPos2.y - endPos2.y)*(startPos1.x*endPos1.y - startPos1.y*endPos1.x) - (startPos1.y - endPos1.y)*(startPos2.x*endPos2.y - startPos2.y*endPos2.x))/div;
|
const float yi = ((startPos2.y - endPos2.y)*(startPos1.x*endPos1.y - startPos1.y*endPos1.x) - (startPos1.y - endPos1.y)*(startPos2.x*endPos2.y - startPos2.y*endPos2.x))/div;
|
||||||
|
|
||||||
if (xi < fminf(startPos1.x, endPos1.x) || xi > fmaxf(startPos1.x, endPos1.x)) return false;
|
if (xi < fminf(startPos1.x, endPos1.x) || xi > fmaxf(startPos1.x, endPos1.x)) return false;
|
||||||
|
|
|
||||||
12
src/text.c
12
src/text.c
|
|
@ -328,7 +328,7 @@ Font LoadFont(const char *fileName)
|
||||||
TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
|
TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
|
||||||
font = GetFontDefault();
|
font = GetFontDefault();
|
||||||
}
|
}
|
||||||
else SetTextureFilter(font.texture, FILTER_POINT); // By default we set point filter (best performance)
|
else SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); // By default we set point filter (best performance)
|
||||||
|
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
@ -432,7 +432,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: We need to remove key color borders from image to avoid weird
|
// NOTE: We need to remove key color borders from image to avoid weird
|
||||||
// artifacts on texture scaling when using FILTER_BILINEAR or FILTER_TRILINEAR
|
// artifacts on texture scaling when using TEXTURE_FILTER_BILINEAR or TEXTURE_FILTER_TRILINEAR
|
||||||
for (int i = 0; i < image.height*image.width; i++) if (COLOR_EQUAL(pixels[i], key)) pixels[i] = BLANK;
|
for (int i = 0; i < image.height*image.width; i++) if (COLOR_EQUAL(pixels[i], key)) pixels[i] = BLANK;
|
||||||
|
|
||||||
// Create a new image with the processed color data (key color replaced by BLANK)
|
// Create a new image with the processed color data (key color replaced by BLANK)
|
||||||
|
|
@ -479,7 +479,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load font from memory buffer, fileType refers to extension: i.e. "ttf"
|
// Load font from memory buffer, fileType refers to extension: i.e. ".ttf"
|
||||||
Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount)
|
Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount)
|
||||||
{
|
{
|
||||||
Font font = { 0 };
|
Font font = { 0 };
|
||||||
|
|
@ -488,8 +488,8 @@ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int
|
||||||
strcpy(fileExtLower, TextToLower(fileType));
|
strcpy(fileExtLower, TextToLower(fileType));
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_TTF)
|
#if defined(SUPPORT_FILEFORMAT_TTF)
|
||||||
if (TextIsEqual(fileExtLower, "ttf") ||
|
if (TextIsEqual(fileExtLower, ".ttf") ||
|
||||||
TextIsEqual(fileExtLower, "otf"))
|
TextIsEqual(fileExtLower, ".otf"))
|
||||||
{
|
{
|
||||||
font.baseSize = fontSize;
|
font.baseSize = fontSize;
|
||||||
font.charsCount = (charsCount > 0)? charsCount : 95;
|
font.charsCount = (charsCount > 0)? charsCount : 95;
|
||||||
|
|
@ -1175,7 +1175,7 @@ const char *TextFormat(const char *text, ...)
|
||||||
|
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, text);
|
va_start(args, text);
|
||||||
vsprintf(currentBuffer, text, args);
|
vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
index += 1; // Move to next buffer for next function call
|
index += 1; // Move to next buffer for next function call
|
||||||
|
|
|
||||||
137
src/textures.c
137
src/textures.c
|
|
@ -65,7 +65,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h> // Required for: malloc(), free()
|
#include <stdlib.h> // Required for: malloc(), free()
|
||||||
#include <stdio.h> // Required for: FILE, fopen(), fclose(), fread()
|
|
||||||
#include <string.h> // Required for: strlen() [Used in ImageTextEx()]
|
#include <string.h> // Required for: strlen() [Used in ImageTextEx()]
|
||||||
#include <math.h> // Required for: fabsf()
|
#include <math.h> // Required for: fabsf()
|
||||||
|
|
||||||
|
|
@ -294,7 +293,7 @@ Image LoadImageAnim(const char *fileName, int *frames)
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load image from memory buffer, fileType refers to extension: i.e. "png"
|
// Load image from memory buffer, fileType refers to extension: i.e. ".png"
|
||||||
Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)
|
Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)
|
||||||
{
|
{
|
||||||
Image image = { 0 };
|
Image image = { 0 };
|
||||||
|
|
@ -303,28 +302,28 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
||||||
strcpy(fileExtLower, TextToLower(fileType));
|
strcpy(fileExtLower, TextToLower(fileType));
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_PNG)
|
#if defined(SUPPORT_FILEFORMAT_PNG)
|
||||||
if ((TextIsEqual(fileExtLower, "png"))
|
if ((TextIsEqual(fileExtLower, ".png"))
|
||||||
#else
|
#else
|
||||||
if ((false)
|
if ((false)
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_BMP)
|
#if defined(SUPPORT_FILEFORMAT_BMP)
|
||||||
|| (TextIsEqual(fileExtLower, "bmp"))
|
|| (TextIsEqual(fileExtLower, ".bmp"))
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_TGA)
|
#if defined(SUPPORT_FILEFORMAT_TGA)
|
||||||
|| (TextIsEqual(fileExtLower, "tga"))
|
|| (TextIsEqual(fileExtLower, ".tga"))
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_JPG)
|
#if defined(SUPPORT_FILEFORMAT_JPG)
|
||||||
|| (TextIsEqual(fileExtLower, "jpg") ||
|
|| (TextIsEqual(fileExtLower, ".jpg") ||
|
||||||
TextIsEqual(fileExtLower, "jpeg"))
|
TextIsEqual(fileExtLower, ".jpeg"))
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_GIF)
|
#if defined(SUPPORT_FILEFORMAT_GIF)
|
||||||
|| (TextIsEqual(fileExtLower, "gif"))
|
|| (TextIsEqual(fileExtLower, ".gif"))
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_PIC)
|
#if defined(SUPPORT_FILEFORMAT_PIC)
|
||||||
|| (TextIsEqual(fileExtLower, "pic"))
|
|| (TextIsEqual(fileExtLower, ".pic"))
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_PSD)
|
#if defined(SUPPORT_FILEFORMAT_PSD)
|
||||||
|| (TextIsEqual(fileExtLower, "psd"))
|
|| (TextIsEqual(fileExtLower, ".psd"))
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
@ -2749,25 +2748,25 @@ TextureCubemap LoadTextureCubemap(Image image, int layoutType)
|
||||||
{
|
{
|
||||||
TextureCubemap cubemap = { 0 };
|
TextureCubemap cubemap = { 0 };
|
||||||
|
|
||||||
if (layoutType == CUBEMAP_AUTO_DETECT) // Try to automatically guess layout type
|
if (layoutType == CUBEMAP_LAYOUT_AUTO_DETECT) // Try to automatically guess layout type
|
||||||
{
|
{
|
||||||
// Check image width/height to determine the type of cubemap provided
|
// Check image width/height to determine the type of cubemap provided
|
||||||
if (image.width > image.height)
|
if (image.width > image.height)
|
||||||
{
|
{
|
||||||
if ((image.width/6) == image.height) { layoutType = CUBEMAP_LINE_HORIZONTAL; cubemap.width = image.width/6; }
|
if ((image.width/6) == image.height) { layoutType = CUBEMAP_LAYOUT_LINE_HORIZONTAL; cubemap.width = image.width/6; }
|
||||||
else if ((image.width/4) == (image.height/3)) { layoutType = CUBEMAP_CROSS_FOUR_BY_THREE; cubemap.width = image.width/4; }
|
else if ((image.width/4) == (image.height/3)) { layoutType = CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE; cubemap.width = image.width/4; }
|
||||||
else if (image.width >= (int)((float)image.height*1.85f)) { layoutType = CUBEMAP_PANORAMA; cubemap.width = image.width/4; }
|
else if (image.width >= (int)((float)image.height*1.85f)) { layoutType = CUBEMAP_LAYOUT_PANORAMA; cubemap.width = image.width/4; }
|
||||||
}
|
}
|
||||||
else if (image.height > image.width)
|
else if (image.height > image.width)
|
||||||
{
|
{
|
||||||
if ((image.height/6) == image.width) { layoutType = CUBEMAP_LINE_VERTICAL; cubemap.width = image.height/6; }
|
if ((image.height/6) == image.width) { layoutType = CUBEMAP_LAYOUT_LINE_VERTICAL; cubemap.width = image.height/6; }
|
||||||
else if ((image.width/3) == (image.height/4)) { layoutType = CUBEMAP_CROSS_THREE_BY_FOUR; cubemap.width = image.width/3; }
|
else if ((image.width/3) == (image.height/4)) { layoutType = CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR; cubemap.width = image.width/3; }
|
||||||
}
|
}
|
||||||
|
|
||||||
cubemap.height = cubemap.width;
|
cubemap.height = cubemap.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layoutType != CUBEMAP_AUTO_DETECT)
|
if (layoutType != CUBEMAP_LAYOUT_AUTO_DETECT)
|
||||||
{
|
{
|
||||||
int size = cubemap.width;
|
int size = cubemap.width;
|
||||||
|
|
||||||
|
|
@ -2775,20 +2774,20 @@ TextureCubemap LoadTextureCubemap(Image image, int layoutType)
|
||||||
Rectangle faceRecs[6] = { 0 }; // Face source rectangles
|
Rectangle faceRecs[6] = { 0 }; // Face source rectangles
|
||||||
for (int i = 0; i < 6; i++) faceRecs[i] = (Rectangle){ 0, 0, (float)size, (float)size };
|
for (int i = 0; i < 6; i++) faceRecs[i] = (Rectangle){ 0, 0, (float)size, (float)size };
|
||||||
|
|
||||||
if (layoutType == CUBEMAP_LINE_VERTICAL)
|
if (layoutType == CUBEMAP_LAYOUT_LINE_VERTICAL)
|
||||||
{
|
{
|
||||||
faces = image;
|
faces = image;
|
||||||
for (int i = 0; i < 6; i++) faceRecs[i].y = (float)size*i;
|
for (int i = 0; i < 6; i++) faceRecs[i].y = (float)size*i;
|
||||||
}
|
}
|
||||||
else if (layoutType == CUBEMAP_PANORAMA)
|
else if (layoutType == CUBEMAP_LAYOUT_PANORAMA)
|
||||||
{
|
{
|
||||||
// TODO: Convert panorama image to square faces...
|
// TODO: Convert panorama image to square faces...
|
||||||
// Ref: https://github.com/denivip/panorama/blob/master/panorama.cpp
|
// Ref: https://github.com/denivip/panorama/blob/master/panorama.cpp
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (layoutType == CUBEMAP_LINE_HORIZONTAL) for (int i = 0; i < 6; i++) faceRecs[i].x = (float)size*i;
|
if (layoutType == CUBEMAP_LAYOUT_LINE_HORIZONTAL) for (int i = 0; i < 6; i++) faceRecs[i].x = (float)size*i;
|
||||||
else if (layoutType == CUBEMAP_CROSS_THREE_BY_FOUR)
|
else if (layoutType == CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR)
|
||||||
{
|
{
|
||||||
faceRecs[0].x = (float)size; faceRecs[0].y = (float)size;
|
faceRecs[0].x = (float)size; faceRecs[0].y = (float)size;
|
||||||
faceRecs[1].x = (float)size; faceRecs[1].y = (float)size*3;
|
faceRecs[1].x = (float)size; faceRecs[1].y = (float)size*3;
|
||||||
|
|
@ -2797,7 +2796,7 @@ TextureCubemap LoadTextureCubemap(Image image, int layoutType)
|
||||||
faceRecs[4].x = 0; faceRecs[4].y = (float)size;
|
faceRecs[4].x = 0; faceRecs[4].y = (float)size;
|
||||||
faceRecs[5].x = (float)size*2; faceRecs[5].y = (float)size;
|
faceRecs[5].x = (float)size*2; faceRecs[5].y = (float)size;
|
||||||
}
|
}
|
||||||
else if (layoutType == CUBEMAP_CROSS_FOUR_BY_THREE)
|
else if (layoutType == CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE)
|
||||||
{
|
{
|
||||||
faceRecs[0].x = (float)size*2; faceRecs[0].y = (float)size;
|
faceRecs[0].x = (float)size*2; faceRecs[0].y = (float)size;
|
||||||
faceRecs[1].x = 0; faceRecs[1].y = (float)size;
|
faceRecs[1].x = 0; faceRecs[1].y = (float)size;
|
||||||
|
|
@ -2967,63 +2966,63 @@ void SetTextureFilter(Texture2D texture, int filterMode)
|
||||||
{
|
{
|
||||||
switch (filterMode)
|
switch (filterMode)
|
||||||
{
|
{
|
||||||
case FILTER_POINT:
|
case TEXTURE_FILTER_POINT:
|
||||||
{
|
{
|
||||||
if (texture.mipmaps > 1)
|
if (texture.mipmaps > 1)
|
||||||
{
|
{
|
||||||
// RL_FILTER_MIP_NEAREST - tex filter: POINT, mipmaps filter: POINT (sharp switching between mipmaps)
|
// RL_TEXTURE_FILTER_MIP_NEAREST - tex filter: POINT, mipmaps filter: POINT (sharp switching between mipmaps)
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_MIP_NEAREST);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_MIP_NEAREST);
|
||||||
|
|
||||||
// RL_FILTER_NEAREST - tex filter: POINT (no filter), no mipmaps
|
// RL_TEXTURE_FILTER_NEAREST - tex filter: POINT (no filter), no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_NEAREST);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_NEAREST);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// RL_FILTER_NEAREST - tex filter: POINT (no filter), no mipmaps
|
// RL_TEXTURE_FILTER_NEAREST - tex filter: POINT (no filter), no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_NEAREST);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_NEAREST);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_NEAREST);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_NEAREST);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case FILTER_BILINEAR:
|
case TEXTURE_FILTER_BILINEAR:
|
||||||
{
|
{
|
||||||
if (texture.mipmaps > 1)
|
if (texture.mipmaps > 1)
|
||||||
{
|
{
|
||||||
// RL_FILTER_LINEAR_MIP_NEAREST - tex filter: BILINEAR, mipmaps filter: POINT (sharp switching between mipmaps)
|
// RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST - tex filter: BILINEAR, mipmaps filter: POINT (sharp switching between mipmaps)
|
||||||
// Alternative: RL_FILTER_NEAREST_MIP_LINEAR - tex filter: POINT, mipmaps filter: BILINEAR (smooth transition between mipmaps)
|
// Alternative: RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR - tex filter: POINT, mipmaps filter: BILINEAR (smooth transition between mipmaps)
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_LINEAR_MIP_NEAREST);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST);
|
||||||
|
|
||||||
// RL_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// RL_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case FILTER_TRILINEAR:
|
case TEXTURE_FILTER_TRILINEAR:
|
||||||
{
|
{
|
||||||
if (texture.mipmaps > 1)
|
if (texture.mipmaps > 1)
|
||||||
{
|
{
|
||||||
// RL_FILTER_MIP_LINEAR - tex filter: BILINEAR, mipmaps filter: BILINEAR (smooth transition between mipmaps)
|
// RL_TEXTURE_FILTER_MIP_LINEAR - tex filter: BILINEAR, mipmaps filter: BILINEAR (smooth transition between mipmaps)
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_MIP_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_MIP_LINEAR);
|
||||||
|
|
||||||
// RL_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] No mipmaps available for TRILINEAR texture filtering", texture.id);
|
TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] No mipmaps available for TRILINEAR texture filtering", texture.id);
|
||||||
|
|
||||||
// RL_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_FILTER_LINEAR);
|
rlTextureParameters(texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case FILTER_ANISOTROPIC_4X: rlTextureParameters(texture.id, RL_TEXTURE_ANISOTROPIC_FILTER, 4); break;
|
case TEXTURE_FILTER_ANISOTROPIC_4X: rlTextureParameters(texture.id, RL_TEXTURE_FILTER_ANISOTROPIC, 4); break;
|
||||||
case FILTER_ANISOTROPIC_8X: rlTextureParameters(texture.id, RL_TEXTURE_ANISOTROPIC_FILTER, 8); break;
|
case TEXTURE_FILTER_ANISOTROPIC_8X: rlTextureParameters(texture.id, RL_TEXTURE_FILTER_ANISOTROPIC, 8); break;
|
||||||
case FILTER_ANISOTROPIC_16X: rlTextureParameters(texture.id, RL_TEXTURE_ANISOTROPIC_FILTER, 16); break;
|
case TEXTURE_FILTER_ANISOTROPIC_16X: rlTextureParameters(texture.id, RL_TEXTURE_FILTER_ANISOTROPIC, 16); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3033,25 +3032,25 @@ void SetTextureWrap(Texture2D texture, int wrapMode)
|
||||||
{
|
{
|
||||||
switch (wrapMode)
|
switch (wrapMode)
|
||||||
{
|
{
|
||||||
case WRAP_REPEAT:
|
case TEXTURE_WRAP_REPEAT:
|
||||||
{
|
{
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_WRAP_REPEAT);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_TEXTURE_WRAP_REPEAT);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_WRAP_REPEAT);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_TEXTURE_WRAP_REPEAT);
|
||||||
} break;
|
} break;
|
||||||
case WRAP_CLAMP:
|
case TEXTURE_WRAP_CLAMP:
|
||||||
{
|
{
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_WRAP_CLAMP);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_TEXTURE_WRAP_CLAMP);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_WRAP_CLAMP);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_TEXTURE_WRAP_CLAMP);
|
||||||
} break;
|
} break;
|
||||||
case WRAP_MIRROR_REPEAT:
|
case TEXTURE_WRAP_MIRROR_REPEAT:
|
||||||
{
|
{
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_WRAP_MIRROR_REPEAT);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_TEXTURE_WRAP_MIRROR_REPEAT);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_WRAP_MIRROR_REPEAT);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_TEXTURE_WRAP_MIRROR_REPEAT);
|
||||||
} break;
|
} break;
|
||||||
case WRAP_MIRROR_CLAMP:
|
case TEXTURE_WRAP_MIRROR_CLAMP:
|
||||||
{
|
{
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_WRAP_MIRROR_CLAMP);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_S, RL_TEXTURE_WRAP_MIRROR_CLAMP);
|
||||||
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_WRAP_MIRROR_CLAMP);
|
rlTextureParameters(texture.id, RL_TEXTURE_WRAP_T, RL_TEXTURE_WRAP_MIRROR_CLAMP);
|
||||||
} break;
|
} break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
@ -3251,8 +3250,8 @@ void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest,
|
||||||
|
|
||||||
if (nPatchInfo.source.width < 0) nPatchInfo.source.x -= nPatchInfo.source.width;
|
if (nPatchInfo.source.width < 0) nPatchInfo.source.x -= nPatchInfo.source.width;
|
||||||
if (nPatchInfo.source.height < 0) nPatchInfo.source.y -= nPatchInfo.source.height;
|
if (nPatchInfo.source.height < 0) nPatchInfo.source.y -= nPatchInfo.source.height;
|
||||||
if (nPatchInfo.type == NPT_3PATCH_HORIZONTAL) patchHeight = nPatchInfo.source.height;
|
if (nPatchInfo.type == NPATCH_THREE_PATCH_HORIZONTAL) patchHeight = nPatchInfo.source.height;
|
||||||
if (nPatchInfo.type == NPT_3PATCH_VERTICAL) patchWidth = nPatchInfo.source.width;
|
if (nPatchInfo.type == NPATCH_THREE_PATCH_VERTICAL) patchWidth = nPatchInfo.source.width;
|
||||||
|
|
||||||
bool drawCenter = true;
|
bool drawCenter = true;
|
||||||
bool drawMiddle = true;
|
bool drawMiddle = true;
|
||||||
|
|
@ -3262,14 +3261,14 @@ void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest,
|
||||||
float bottomBorder = (float)nPatchInfo.bottom;
|
float bottomBorder = (float)nPatchInfo.bottom;
|
||||||
|
|
||||||
// adjust the lateral (left and right) border widths in case patchWidth < texture.width
|
// adjust the lateral (left and right) border widths in case patchWidth < texture.width
|
||||||
if (patchWidth <= (leftBorder + rightBorder) && nPatchInfo.type != NPT_3PATCH_VERTICAL)
|
if (patchWidth <= (leftBorder + rightBorder) && nPatchInfo.type != NPATCH_THREE_PATCH_VERTICAL)
|
||||||
{
|
{
|
||||||
drawCenter = false;
|
drawCenter = false;
|
||||||
leftBorder = (leftBorder/(leftBorder + rightBorder))*patchWidth;
|
leftBorder = (leftBorder/(leftBorder + rightBorder))*patchWidth;
|
||||||
rightBorder = patchWidth - leftBorder;
|
rightBorder = patchWidth - leftBorder;
|
||||||
}
|
}
|
||||||
// adjust the lateral (top and bottom) border heights in case patchHeight < texture.height
|
// adjust the lateral (top and bottom) border heights in case patchHeight < texture.height
|
||||||
if (patchHeight <= (topBorder + bottomBorder) && nPatchInfo.type != NPT_3PATCH_HORIZONTAL)
|
if (patchHeight <= (topBorder + bottomBorder) && nPatchInfo.type != NPATCH_THREE_PATCH_HORIZONTAL)
|
||||||
{
|
{
|
||||||
drawMiddle = false;
|
drawMiddle = false;
|
||||||
topBorder = (topBorder/(topBorder + bottomBorder))*patchHeight;
|
topBorder = (topBorder/(topBorder + bottomBorder))*patchHeight;
|
||||||
|
|
@ -3307,7 +3306,7 @@ void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest,
|
||||||
rlColor4ub(tint.r, tint.g, tint.b, tint.a);
|
rlColor4ub(tint.r, tint.g, tint.b, tint.a);
|
||||||
rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer
|
rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer
|
||||||
|
|
||||||
if (nPatchInfo.type == NPT_9PATCH)
|
if (nPatchInfo.type == NPATCH_NINE_PATCH)
|
||||||
{
|
{
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// TOP-LEFT QUAD
|
// TOP-LEFT QUAD
|
||||||
|
|
@ -3373,7 +3372,7 @@ void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest,
|
||||||
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad
|
||||||
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Top-left corner for texture and quad
|
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Top-left corner for texture and quad
|
||||||
}
|
}
|
||||||
else if (nPatchInfo.type == NPT_3PATCH_VERTICAL)
|
else if (nPatchInfo.type == NPATCH_THREE_PATCH_VERTICAL)
|
||||||
{
|
{
|
||||||
// TOP QUAD
|
// TOP QUAD
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
|
|
@ -3400,7 +3399,7 @@ void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest,
|
||||||
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad
|
||||||
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Top-left corner for texture and quad
|
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Top-left corner for texture and quad
|
||||||
}
|
}
|
||||||
else if (nPatchInfo.type == NPT_3PATCH_HORIZONTAL)
|
else if (nPatchInfo.type == NPATCH_THREE_PATCH_HORIZONTAL)
|
||||||
{
|
{
|
||||||
// LEFT QUAD
|
// LEFT QUAD
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
|
|
|
||||||
115
src/utils.c
115
src/utils.c
|
|
@ -46,7 +46,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h> // Required for: exit()
|
#include <stdlib.h> // Required for: exit()
|
||||||
#include <stdio.h> // Required for: vprintf()
|
#include <stdio.h> // Required for: FILE, fopen(), fseek(), ftell(), fread(), fwrite(), fprintf(), vprintf(), fclose()
|
||||||
#include <stdarg.h> // Required for: va_list, va_start(), va_end()
|
#include <stdarg.h> // Required for: va_list, va_start(), va_end()
|
||||||
#include <string.h> // Required for: strcpy(), strcat()
|
#include <string.h> // Required for: strcpy(), strcat()
|
||||||
|
|
||||||
|
|
@ -65,9 +65,29 @@
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Log types messages
|
// Log types messages
|
||||||
static int logTypeLevel = LOG_INFO; // Minimum log type level
|
static int logTypeLevel = LOG_INFO; // Minimum log type level
|
||||||
static int logTypeExit = LOG_ERROR; // Log type that exits
|
|
||||||
static TraceLogCallback logCallback = NULL; // Log callback function pointer
|
static TraceLogCallback traceLog = NULL; // TraceLog callback function pointer
|
||||||
|
static MemAllocCallback memAlloc = NULL; // MemAlloc callback function pointer
|
||||||
|
static MemReallocCallback memRealloc = NULL; // MemRealloc callback funtion pointer
|
||||||
|
static MemFreeCallback memFree = NULL; // MemFree callback funtion pointer
|
||||||
|
static LoadFileDataCallback loadFileData = NULL; // LoadFileData callback funtion pointer
|
||||||
|
static SaveFileDataCallback saveFileData = NULL; // SaveFileText callback funtion pointer
|
||||||
|
static LoadFileTextCallback loadFileText = NULL; // LoadFileText callback funtion pointer
|
||||||
|
static SaveFileTextCallback saveFileText = NULL; // SaveFileText callback funtion pointer
|
||||||
|
|
||||||
|
//void *MemAllocDefault(unsigned int size) { return RL_MALLOC(size); }
|
||||||
|
//void MemFreeDefault(void *ptr) { RL_FREE(ptr); }
|
||||||
|
|
||||||
|
void SetTraceLogCallback(TraceLogCallback callback) { traceLog = callback; } // Set custom trace log
|
||||||
|
void SetMemAllocCallback(MemAllocCallback callback) { memAlloc = callback; } // Set custom memory allocator
|
||||||
|
void SetMemReallocCallback(MemReallocCallback callback) { memRealloc = callback; } // Set custom memory reallocator
|
||||||
|
void SetMemFreeCallback(MemFreeCallback callback) { memFree = callback; } // Set custom memory free
|
||||||
|
void SetLoadFileDataCallback(LoadFileDataCallback callback) { loadFileData = callback; } // Set custom file data loader
|
||||||
|
void SetSaveFileDataCallback(SaveFileDataCallback callback) { saveFileData = callback; } // Set custom file data saver
|
||||||
|
void SetLoadFileTextCallback(LoadFileTextCallback callback) { loadFileText = callback; } // Set custom file text loader
|
||||||
|
void SetSaveFileTextCallback(SaveFileTextCallback callback) { saveFileText = callback; } // Set custom file text saver
|
||||||
|
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID)
|
#if defined(PLATFORM_ANDROID)
|
||||||
static AAssetManager *assetManager = NULL; // Android assets manager pointer
|
static AAssetManager *assetManager = NULL; // Android assets manager pointer
|
||||||
|
|
@ -92,16 +112,7 @@ static int android_close(void *cookie);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Set the current threshold (minimum) log level
|
// Set the current threshold (minimum) log level
|
||||||
void SetTraceLogLevel(int logType)
|
void SetTraceLogLevel(int logType) { logTypeLevel = logType; }
|
||||||
{
|
|
||||||
logTypeLevel = logType;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a trace log callback to enable custom logging
|
|
||||||
void SetTraceLogCallback(TraceLogCallback callback)
|
|
||||||
{
|
|
||||||
logCallback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show trace log messages (LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_DEBUG)
|
// Show trace log messages (LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_DEBUG)
|
||||||
void TraceLog(int logType, const char *text, ...)
|
void TraceLog(int logType, const char *text, ...)
|
||||||
|
|
@ -113,9 +124,9 @@ void TraceLog(int logType, const char *text, ...)
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, text);
|
va_start(args, text);
|
||||||
|
|
||||||
if (logCallback)
|
if (traceLog)
|
||||||
{
|
{
|
||||||
logCallback(logType, text, args);
|
traceLog(logType, text, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -152,21 +163,37 @@ void TraceLog(int logType, const char *text, ...)
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
if (logType >= logTypeExit) exit(1); // If exit message, exit program
|
if (logType == LOG_ERROR) exit(1); // If error, exit program
|
||||||
|
|
||||||
#endif // SUPPORT_TRACELOG
|
#endif // SUPPORT_TRACELOG
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal memory allocator
|
// Internal memory allocator
|
||||||
|
// NOTE: Initializes to zero by default
|
||||||
void *MemAlloc(int size)
|
void *MemAlloc(int size)
|
||||||
{
|
{
|
||||||
return RL_MALLOC(size);
|
// WARNING: This implementation allows changing memAlloc at any
|
||||||
|
// point during program execution, it could be a security risk
|
||||||
|
void *ptr = NULL;
|
||||||
|
if (memAlloc) ptr = memAlloc(size);
|
||||||
|
else ptr = RL_CALLOC(size, 1);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internal memory reallocator
|
||||||
|
void *MemRealloc(void *ptr, int size)
|
||||||
|
{
|
||||||
|
void *ret = NULL;
|
||||||
|
if (memRealloc) ret = memRealloc(ptr, size);
|
||||||
|
else ret = RL_REALLOC(ptr, size);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal memory free
|
// Internal memory free
|
||||||
void MemFree(void *ptr)
|
void MemFree(void *ptr)
|
||||||
{
|
{
|
||||||
RL_FREE(ptr);
|
if (memFree) memFree(ptr);
|
||||||
|
else RL_FREE(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load data from file into a buffer
|
// Load data from file into a buffer
|
||||||
|
|
@ -177,6 +204,12 @@ unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead)
|
||||||
|
|
||||||
if (fileName != NULL)
|
if (fileName != NULL)
|
||||||
{
|
{
|
||||||
|
if (loadFileData)
|
||||||
|
{
|
||||||
|
data = loadFileData(fileName, bytesRead);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
#if defined(SUPPORT_STANDARD_FILEIO)
|
||||||
FILE *file = fopen(fileName, "rb");
|
FILE *file = fopen(fileName, "rb");
|
||||||
|
|
||||||
if (file != NULL)
|
if (file != NULL)
|
||||||
|
|
@ -203,6 +236,9 @@ unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead)
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "FILEIO: Standard file io not supported, use custom file callback");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||||
|
|
||||||
|
|
@ -222,6 +258,12 @@ bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite)
|
||||||
|
|
||||||
if (fileName != NULL)
|
if (fileName != NULL)
|
||||||
{
|
{
|
||||||
|
if (saveFileData)
|
||||||
|
{
|
||||||
|
saveFileData(fileName, data, bytesToWrite);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
#if defined(SUPPORT_STANDARD_FILEIO)
|
||||||
FILE *file = fopen(fileName, "wb");
|
FILE *file = fopen(fileName, "wb");
|
||||||
|
|
||||||
if (file != NULL)
|
if (file != NULL)
|
||||||
|
|
@ -236,6 +278,9 @@ bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite)
|
||||||
if (result == 0) success = true;
|
if (result == 0) success = true;
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "FILEIO: Standard file io not supported, use custom file callback");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||||
|
|
||||||
|
|
@ -250,21 +295,27 @@ char *LoadFileText(const char *fileName)
|
||||||
|
|
||||||
if (fileName != NULL)
|
if (fileName != NULL)
|
||||||
{
|
{
|
||||||
FILE *textFile = fopen(fileName, "rt");
|
if (loadFileText)
|
||||||
|
{
|
||||||
|
text = loadFileText(fileName);
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
#if defined(SUPPORT_STANDARD_FILEIO)
|
||||||
|
FILE *file = fopen(fileName, "rt");
|
||||||
|
|
||||||
if (textFile != NULL)
|
if (file != NULL)
|
||||||
{
|
{
|
||||||
// WARNING: When reading a file as 'text' file,
|
// WARNING: When reading a file as 'text' file,
|
||||||
// text mode causes carriage return-linefeed translation...
|
// text mode causes carriage return-linefeed translation...
|
||||||
// ...but using fseek() should return correct byte-offset
|
// ...but using fseek() should return correct byte-offset
|
||||||
fseek(textFile, 0, SEEK_END);
|
fseek(file, 0, SEEK_END);
|
||||||
unsigned int size = (unsigned int)ftell(textFile);
|
unsigned int size = (unsigned int)ftell(file);
|
||||||
fseek(textFile, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
text = (char *)RL_MALLOC((size + 1)*sizeof(char));
|
text = (char *)RL_MALLOC((size + 1)*sizeof(char));
|
||||||
unsigned int count = (unsigned int)fread(text, sizeof(char), size, textFile);
|
unsigned int count = (unsigned int)fread(text, sizeof(char), size, file);
|
||||||
|
|
||||||
// WARNING: \r\n is converted to \n on reading, so,
|
// WARNING: \r\n is converted to \n on reading, so,
|
||||||
// read bytes count gets reduced by the number of lines
|
// read bytes count gets reduced by the number of lines
|
||||||
|
|
@ -277,9 +328,12 @@ char *LoadFileText(const char *fileName)
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to read text file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to read text file", fileName);
|
||||||
|
|
||||||
fclose(textFile);
|
fclose(file);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "FILEIO: Standard file io not supported, use custom file callback");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||||
|
|
||||||
|
|
@ -299,6 +353,12 @@ bool SaveFileText(const char *fileName, char *text)
|
||||||
|
|
||||||
if (fileName != NULL)
|
if (fileName != NULL)
|
||||||
{
|
{
|
||||||
|
if (saveFileText)
|
||||||
|
{
|
||||||
|
saveFileText(fileName, text);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
#if defined(SUPPORT_STANDARD_FILEIO)
|
||||||
FILE *file = fopen(fileName, "wt");
|
FILE *file = fopen(fileName, "wt");
|
||||||
|
|
||||||
if (file != NULL)
|
if (file != NULL)
|
||||||
|
|
@ -312,6 +372,9 @@ bool SaveFileText(const char *fileName, char *text)
|
||||||
if (result == 0) success = true;
|
if (result == 0) success = true;
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "FILEIO: Standard file io not supported, use custom file callback");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user