mirror of
https://github.com/raysan5/raylib.git
synced 2026-01-11 14:08:48 +01:00
Compare commits
6 Commits
470a326588
...
9fe3f7ca14
| Author | SHA1 | Date | |
|---|---|---|---|
| 9fe3f7ca14 | |||
| d26b17f320 | |||
| 6756e9d3d7 | |||
| 06589d3350 | |||
| 596d3bcb7e | |||
| 5c2747e3a8 |
@ -619,6 +619,7 @@ TEXTURES = \
|
|||||||
textures/textures_sprite_button \
|
textures/textures_sprite_button \
|
||||||
textures/textures_sprite_explosion \
|
textures/textures_sprite_explosion \
|
||||||
textures/textures_srcrec_dstrec \
|
textures/textures_srcrec_dstrec \
|
||||||
|
textures/textures_screen_buffer \
|
||||||
textures/textures_textured_curve \
|
textures/textures_textured_curve \
|
||||||
textures/textures_tiled_drawing \
|
textures/textures_tiled_drawing \
|
||||||
textures/textures_to_image
|
textures/textures_to_image
|
||||||
|
|||||||
@ -607,6 +607,7 @@ TEXTURES = \
|
|||||||
textures/textures_sprite_button \
|
textures/textures_sprite_button \
|
||||||
textures/textures_sprite_explosion \
|
textures/textures_sprite_explosion \
|
||||||
textures/textures_srcrec_dstrec \
|
textures/textures_srcrec_dstrec \
|
||||||
|
textures/textures_screen_buffer \
|
||||||
textures/textures_textured_curve \
|
textures/textures_textured_curve \
|
||||||
textures/textures_tiled_drawing \
|
textures/textures_tiled_drawing \
|
||||||
textures/textures_to_image
|
textures/textures_to_image
|
||||||
@ -1058,6 +1059,9 @@ textures/textures_srcrec_dstrec: textures/textures_srcrec_dstrec.c
|
|||||||
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
|
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
|
||||||
--preload-file textures/resources/scarfy.png@resources/scarfy.png
|
--preload-file textures/resources/scarfy.png@resources/scarfy.png
|
||||||
|
|
||||||
|
textures/textures_screen_buffer: textures/textures_screen_buffer.c
|
||||||
|
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
|
||||||
|
|
||||||
textures/textures_textured_curve: textures/textures_textured_curve.c
|
textures/textures_textured_curve: textures/textures_textured_curve.c
|
||||||
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
|
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
|
||||||
--preload-file textures/resources/road.png@resources/road.png
|
--preload-file textures/resources/road.png@resources/road.png
|
||||||
|
|||||||
@ -17,7 +17,7 @@ You may find it easier to use than other toolchains, especially when it comes to
|
|||||||
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
|
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
|
||||||
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
|
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
|
||||||
|
|
||||||
## EXAMPLES COLLECTION [TOTAL: 194]
|
## EXAMPLES COLLECTION [TOTAL: 195]
|
||||||
|
|
||||||
### category: core [47]
|
### category: core [47]
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
|
|||||||
| [shapes_lines_drawing](shapes/shapes_lines_drawing.c) | <img src="shapes/shapes_lines_drawing.png" alt="shapes_lines_drawing" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Robin](https://github.com/RobinsAviary) |
|
| [shapes_lines_drawing](shapes/shapes_lines_drawing.c) | <img src="shapes/shapes_lines_drawing.png" alt="shapes_lines_drawing" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Robin](https://github.com/RobinsAviary) |
|
||||||
| [shapes_math_angle_rotation](shapes/shapes_math_angle_rotation.c) | <img src="shapes/shapes_math_angle_rotation.png" alt="shapes_math_angle_rotation" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Kris](https://github.com/krispy-snacc) |
|
| [shapes_math_angle_rotation](shapes/shapes_math_angle_rotation.c) | <img src="shapes/shapes_math_angle_rotation.png" alt="shapes_math_angle_rotation" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Kris](https://github.com/krispy-snacc) |
|
||||||
|
|
||||||
### category: textures [26]
|
### category: textures [27]
|
||||||
|
|
||||||
Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/rtextures.c) module.
|
Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/rtextures.c) module.
|
||||||
|
|
||||||
@ -145,6 +145,7 @@ Examples using raylib textures functionality, including image/textures loading/g
|
|||||||
| [textures_image_kernel](textures/textures_image_kernel.c) | <img src="textures/textures_image_kernel.png" alt="textures_image_kernel" width="80"> | ⭐⭐⭐⭐️ | 1.3 | 1.3 | [Karim Salem](https://github.com/kimo-s) |
|
| [textures_image_kernel](textures/textures_image_kernel.c) | <img src="textures/textures_image_kernel.png" alt="textures_image_kernel" width="80"> | ⭐⭐⭐⭐️ | 1.3 | 1.3 | [Karim Salem](https://github.com/kimo-s) |
|
||||||
| [textures_image_channel](textures/textures_image_channel.c) | <img src="textures/textures_image_channel.png" alt="textures_image_channel" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Bruno Cabral](https://github.com/brccabral) |
|
| [textures_image_channel](textures/textures_image_channel.c) | <img src="textures/textures_image_channel.png" alt="textures_image_channel" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Bruno Cabral](https://github.com/brccabral) |
|
||||||
| [textures_image_rotate](textures/textures_image_rotate.c) | <img src="textures/textures_image_rotate.png" alt="textures_image_rotate" width="80"> | ⭐⭐☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
| [textures_image_rotate](textures/textures_image_rotate.c) | <img src="textures/textures_image_rotate.png" alt="textures_image_rotate" width="80"> | ⭐⭐☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_screen_buffer](textures/textures_screen_buffer.c) | <img src="textures/textures_screen_buffer.png" alt="textures_screen_buffer" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Agnis Aldins](https://github.com/nezvers) |
|
||||||
| [textures_textured_curve](textures/textures_textured_curve.c) | <img src="textures/textures_textured_curve.png" alt="textures_textured_curve" width="80"> | ⭐⭐⭐☆ | 4.5 | 4.5 | [Jeffery Myers](https://github.com/JeffM2501) |
|
| [textures_textured_curve](textures/textures_textured_curve.c) | <img src="textures/textures_textured_curve.png" alt="textures_textured_curve" width="80"> | ⭐⭐⭐☆ | 4.5 | 4.5 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
|
|
||||||
### category: text [15]
|
### category: text [15]
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
int main ()
|
int main(void)
|
||||||
{
|
{
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
@ -35,9 +35,9 @@ int main ()
|
|||||||
Camera2D camera = { 0 };
|
Camera2D camera = { 0 };
|
||||||
camera.zoom = 1.0f;
|
camera.zoom = 1.0f;
|
||||||
|
|
||||||
int zoomMode = 0; // 0-Mouse Wheel, 1-Mouse Move
|
int zoomMode = 0; // 0-Mouse Wheel, 1-Mouse Move
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
@ -93,6 +93,7 @@ int main ()
|
|||||||
// under the cursor to the screen space point under the cursor at any zoom
|
// under the cursor to the screen space point under the cursor at any zoom
|
||||||
camera.target = mouseWorldPos;
|
camera.target = mouseWorldPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
||||||
{
|
{
|
||||||
// Zoom increment
|
// Zoom increment
|
||||||
@ -110,7 +111,6 @@ int main ()
|
|||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
BeginMode2D(camera);
|
BeginMode2D(camera);
|
||||||
|
|
||||||
// Draw the 3d grid, rotated 90 degrees and centered around 0,0
|
// Draw the 3d grid, rotated 90 degrees and centered around 0,0
|
||||||
// just so we have something in the XY plane
|
// just so we have something in the XY plane
|
||||||
rlPushMatrix();
|
rlPushMatrix();
|
||||||
@ -121,7 +121,6 @@ int main ()
|
|||||||
|
|
||||||
// Draw a reference circle
|
// Draw a reference circle
|
||||||
DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 50, MAROON);
|
DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 50, MAROON);
|
||||||
|
|
||||||
EndMode2D();
|
EndMode2D();
|
||||||
|
|
||||||
// Draw mouse reference
|
// Draw mouse reference
|
||||||
@ -142,5 +141,6 @@ int main ()
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -69,7 +69,6 @@ int main(void)
|
|||||||
float angleLength = 90.0f;
|
float angleLength = 90.0f;
|
||||||
float currentAngleDegrees = 0.0f;
|
float currentAngleDegrees = 0.0f;
|
||||||
Vector2 finalVector = { 0.0f, 0.0f };
|
Vector2 finalVector = { 0.0f, 0.0f };
|
||||||
char currentAngleStr[7] = "";
|
|
||||||
Vector2 protractorPosition = { 266.0f, 315.0f };
|
Vector2 protractorPosition = { 266.0f, 315.0f };
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
|||||||
@ -113,6 +113,7 @@ textures;textures_gif_player;★★★☆;4.2;4.2;2021;2025;"Ramon Santamaria";@
|
|||||||
textures;textures_image_kernel;★★★★;1.3;1.3;2015;2025;"Karim Salem";@kimo-s
|
textures;textures_image_kernel;★★★★;1.3;1.3;2015;2025;"Karim Salem";@kimo-s
|
||||||
textures;textures_image_channel;★★☆☆;5.5;5.5;2024;2025;"Bruno Cabral";@brccabral
|
textures;textures_image_channel;★★☆☆;5.5;5.5;2024;2025;"Bruno Cabral";@brccabral
|
||||||
textures;textures_image_rotate;★★☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5
|
textures;textures_image_rotate;★★☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5
|
||||||
|
textures;textures_screen_buffer;★★☆☆;5.5;5.5;2014;2025;"Agnis Aldins";@nezvers
|
||||||
textures;textures_textured_curve;★★★☆;4.5;4.5;2022;2025;"Jeffery Myers";@JeffM2501
|
textures;textures_textured_curve;★★★☆;4.5;4.5;2022;2025;"Jeffery Myers";@JeffM2501
|
||||||
text;text_sprite_fonts;★☆☆☆;1.7;3.7;2017;2025;"Ramon Santamaria";@raysan5
|
text;text_sprite_fonts;★☆☆☆;1.7;3.7;2017;2025;"Ramon Santamaria";@raysan5
|
||||||
text;text_font_spritefont;★☆☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5
|
text;text_font_spritefont;★☆☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
#include "rlgl.h"
|
#include "rlgl.h"
|
||||||
#include "raymath.h"
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
@ -51,6 +50,18 @@ int main(void)
|
|||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
if (IsKeyPressed(KEY_SPACE)) linesMode = !linesMode;
|
if (IsKeyPressed(KEY_SPACE)) linesMode = !linesMode;
|
||||||
|
|
||||||
|
// Check selected vertex
|
||||||
|
for (unsigned int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
// If the mouse is within the handle circle
|
||||||
|
if (CheckCollisionPointCircle(GetMousePosition(), trianglePositions[i], handleRadius) &&
|
||||||
|
IsMouseButtonDown(MOUSE_BUTTON_LEFT))
|
||||||
|
{
|
||||||
|
triangleIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the user has selected a vertex, offset it by the mouse's delta this frame
|
// If the user has selected a vertex, offset it by the mouse's delta this frame
|
||||||
if (triangleIndex != -1)
|
if (triangleIndex != -1)
|
||||||
@ -126,30 +137,17 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render the vertex handles, reacting to mouse movement/input
|
// Render the vertex handles, reacting to mouse movement/input
|
||||||
// TODO: Vertex selection can be moved to update logic
|
|
||||||
for (unsigned int i = 0; i < 3; i++)
|
for (unsigned int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
Vector2 position = trianglePositions[i];
|
// Draw handle fill focused by mouse
|
||||||
Vector2 mousePosition = GetMousePosition();
|
if (CheckCollisionPointCircle(GetMousePosition(), trianglePositions[i], handleRadius))
|
||||||
|
DrawCircleV(trianglePositions[i], handleRadius, ColorAlpha(DARKGRAY, 0.5f));
|
||||||
// If the cursor is within the handle circle
|
|
||||||
if (Vector2Distance(mousePosition, position) < handleRadius)
|
// Draw handle fill selected
|
||||||
{
|
if (i == triangleIndex) DrawCircleV(trianglePositions[i], handleRadius, DARKGRAY);
|
||||||
float fillAlpha = 0.0f;
|
|
||||||
if (triangleIndex == -1) fillAlpha = 0.5f;
|
|
||||||
|
|
||||||
// If handle selected/clicked
|
|
||||||
if (i == triangleIndex) fillAlpha = 1.0f;
|
|
||||||
|
|
||||||
// If clicked, set selected index to handle index
|
|
||||||
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) triangleIndex = i;
|
|
||||||
|
|
||||||
// If visible, draw DARKGRAY circle with varying alpha.
|
|
||||||
if (fillAlpha > 0.0f) DrawCircleV(position, handleRadius, ColorAlpha(DARKGRAY, fillAlpha));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw handle outline
|
// Draw handle outline
|
||||||
DrawCircleLinesV(position, handleRadius, BLACK);
|
DrawCircleLinesV(trianglePositions[i], handleRadius, BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw controls
|
// Draw controls
|
||||||
|
|||||||
161
examples/textures/textures_screen_buffer.c
Normal file
161
examples/textures/textures_screen_buffer.c
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [textures] example - screen buffer / update Image as screen buffer and display with texture
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6
|
||||||
|
*
|
||||||
|
* Example contributed by Agnis Aldiņš (@nezvers) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Agnis Aldiņš (@nezvers)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#define MAX_COLORS 256
|
||||||
|
#define SCREEN_WIDTH 800
|
||||||
|
#define SCREEN_HEIGHT 450
|
||||||
|
#define SCALE_FACTOR 2
|
||||||
|
// buffer size at least for screenImage pixel count
|
||||||
|
#define INDEX_BUFFER_SIZE ((SCREEN_WIDTH * SCREEN_HEIGHT) / SCALE_FACTOR)
|
||||||
|
#define FLAME_WIDTH (SCREEN_WIDTH / SCALE_FACTOR)
|
||||||
|
|
||||||
|
static void GeneretePalette(Color *palette);
|
||||||
|
static void ClearIndexBuffer(unsigned char *buffer, int count);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = SCREEN_WIDTH;
|
||||||
|
const int screenHeight = SCREEN_HEIGHT;
|
||||||
|
const int pixelScale = SCALE_FACTOR;
|
||||||
|
const int imageWidth = screenWidth / pixelScale;
|
||||||
|
const int imageHeight = screenHeight / pixelScale;
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [<module>] example - <name>");
|
||||||
|
|
||||||
|
Color palette[MAX_COLORS] = {0};
|
||||||
|
unsigned char indexBuffer[INDEX_BUFFER_SIZE] = {0};
|
||||||
|
unsigned char flameRootBuffer[FLAME_WIDTH] = {0};
|
||||||
|
|
||||||
|
Image screenImage = GenImageColor(imageWidth, imageHeight, BLACK);
|
||||||
|
Texture screenTexture = LoadTextureFromImage(screenImage);
|
||||||
|
GeneretePalette(palette);
|
||||||
|
ClearIndexBuffer(indexBuffer, INDEX_BUFFER_SIZE);
|
||||||
|
ClearIndexBuffer(flameRootBuffer, FLAME_WIDTH);
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Grow flameRoot
|
||||||
|
for (int x = 2; x < FLAME_WIDTH; ++x)
|
||||||
|
{
|
||||||
|
unsigned short flame = flameRootBuffer[x];
|
||||||
|
if (flame == 255) continue;
|
||||||
|
flame += GetRandomValue(0, 2);
|
||||||
|
if (flame > 255) flame = 255;
|
||||||
|
flameRootBuffer[x] = flame;
|
||||||
|
}
|
||||||
|
|
||||||
|
// transfer flameRoot to indexBuffer
|
||||||
|
for (int x = 0; x < FLAME_WIDTH; ++x)
|
||||||
|
{
|
||||||
|
int i = x + (imageHeight - 1) * imageWidth;
|
||||||
|
indexBuffer[i] = flameRootBuffer[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear top row, because it can't move any higher
|
||||||
|
for (int x = 0; x < imageWidth; ++x)
|
||||||
|
{
|
||||||
|
if (indexBuffer[x] == 0) continue;
|
||||||
|
indexBuffer[x] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip top row, it is already cleared
|
||||||
|
for (int y = 1; y < imageHeight; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < imageWidth; ++x)
|
||||||
|
{
|
||||||
|
unsigned i = x + y * imageWidth;
|
||||||
|
unsigned char colorIndex = indexBuffer[i];
|
||||||
|
if (colorIndex == 0) continue;
|
||||||
|
|
||||||
|
// Move pixel a row above
|
||||||
|
indexBuffer[i] = 0;
|
||||||
|
int moveX = GetRandomValue(0, 2) - 1;
|
||||||
|
int newX = x + moveX;
|
||||||
|
if (newX < 0 || newX >= imageWidth) continue;
|
||||||
|
|
||||||
|
unsigned i_above = i - imageWidth + moveX;
|
||||||
|
int decay = GetRandomValue(0, 3);
|
||||||
|
colorIndex -= (decay < colorIndex) ? decay : colorIndex;
|
||||||
|
indexBuffer[i_above] = colorIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update screenImage with palette colors
|
||||||
|
for (int y = 1; y < imageHeight; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < imageWidth; ++x)
|
||||||
|
{
|
||||||
|
unsigned i = x + y * imageWidth;
|
||||||
|
unsigned char colorIndex = indexBuffer[i];
|
||||||
|
Color col = palette[colorIndex];
|
||||||
|
ImageDrawPixel(&screenImage, x, y, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateTexture(screenTexture, screenImage.data);
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
const Vector2 origin = (Vector2){0, 0};
|
||||||
|
const float rotation = 0.f;
|
||||||
|
DrawTextureEx(screenTexture, origin, rotation, pixelScale, WHITE);
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
UnloadTexture(screenTexture);
|
||||||
|
UnloadImage(screenImage);
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GeneretePalette(Color *palette)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_COLORS; ++i)
|
||||||
|
{
|
||||||
|
float t = (float)i/(float)(MAX_COLORS - 1);
|
||||||
|
float hue = t * t;
|
||||||
|
float saturation = t;
|
||||||
|
float value = t;
|
||||||
|
palette[i] = ColorFromHSV(250.f + 150.f * hue, saturation, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ClearIndexBuffer(unsigned char *buffer, int count)
|
||||||
|
{
|
||||||
|
// Use memset to set to ZERO, but for demonstration a plain for loop is used
|
||||||
|
for (int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
buffer[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
examples/textures/textures_screen_buffer.png
Normal file
BIN
examples/textures/textures_screen_buffer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
569
projects/VS2022/examples/textures_screen_buffer.vcxproj
Normal file
569
projects/VS2022/examples/textures_screen_buffer.vcxproj
Normal file
@ -0,0 +1,569 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug.DLL|ARM64">
|
||||||
|
<Configuration>Debug.DLL</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug.DLL|Win32">
|
||||||
|
<Configuration>Debug.DLL</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug.DLL|x64">
|
||||||
|
<Configuration>Debug.DLL</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release.DLL|ARM64">
|
||||||
|
<Configuration>Release.DLL</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release.DLL|Win32">
|
||||||
|
<Configuration>Release.DLL</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release.DLL|x64">
|
||||||
|
<Configuration>Release.DLL</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{6B1A933E-71B8-4C1F-9E79-02D98830E671}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>textures_screen_buffer</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
<ProjectName>textures_screen_buffer</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|x64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|ARM64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|Win32'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|x64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|ARM64'">
|
||||||
|
<LocalDebuggerWorkingDirectory>$(SolutionDir)..\..\examples\textures</LocalDebuggerWorkingDirectory>
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<AdditionalOptions>/FS %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<AdditionalOptions>/FS %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
<Message>Copy Debug DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
<Message>Copy Debug DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug.DLL|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
<Message>Copy Debug DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Message>Copy Release DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Message>Copy Release DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release.DLL|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir)..\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
|
<RemoveUnreferencedCodeData>true</RemoveUnreferencedCodeData>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>raylib.lib;opengl32.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>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Message>Copy Release DLL to output directory</Message>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\examples\textures\textures_screen_buffer.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\examples\examples.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\raylib\raylib.vcxproj">
|
||||||
|
<Project>{e89d61ac-55de-4482-afd4-df7242ebc859}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
@ -409,6 +409,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_viewport_scaling", "ex
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_compute_hash", "examples\core_compute_hash.vcxproj", "{6C897101-BE52-4387-8AA2-062123A76BA1}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_compute_hash", "examples\core_compute_hash.vcxproj", "{6C897101-BE52-4387-8AA2-062123A76BA1}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "textures_screen_buffer", "examples\textures_screen_buffer.vcxproj", "{6B1A933E-71B8-4C1F-9E79-02D98830E671}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug.DLL|ARM64 = Debug.DLL|ARM64
|
Debug.DLL|ARM64 = Debug.DLL|ARM64
|
||||||
@ -5079,6 +5081,30 @@ Global
|
|||||||
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x64.Build.0 = Release|x64
|
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x64.Build.0 = Release|x64
|
||||||
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x86.ActiveCfg = Release|Win32
|
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x86.Build.0 = Release|Win32
|
{6C897101-BE52-4387-8AA2-062123A76BA1}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|ARM64.ActiveCfg = Debug.DLL|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|ARM64.Build.0 = Debug.DLL|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|ARM64.ActiveCfg = Release.DLL|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|ARM64.Build.0 = Release.DLL|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|x64.Build.0 = Release.DLL|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release.DLL|x86.Build.0 = Release.DLL|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|x64.Build.0 = Release|x64
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -5285,6 +5311,7 @@ Global
|
|||||||
{666346D7-C84B-498D-AE17-53B20C62DB1A} = {278D8859-20B1-428F-8448-064F46E1F021}
|
{666346D7-C84B-498D-AE17-53B20C62DB1A} = {278D8859-20B1-428F-8448-064F46E1F021}
|
||||||
{AD66AA6A-1E36-4FF0-8670-4F9834BCDB91} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035}
|
{AD66AA6A-1E36-4FF0-8670-4F9834BCDB91} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035}
|
||||||
{6C897101-BE52-4387-8AA2-062123A76BA1} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035}
|
{6C897101-BE52-4387-8AA2-062123A76BA1} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035}
|
||||||
|
{6B1A933E-71B8-4C1F-9E79-02D98830E671} = {DA049009-21FF-4AC0-84E4-830DD1BCD0CE}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {E926C768-6307-4423-A1EC-57E95B1FAB29}
|
SolutionGuid = {E926C768-6307-4423-A1EC-57E95B1FAB29}
|
||||||
|
|||||||
@ -4,15 +4,17 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
Example automated testing elements validated:
|
Example automated testing elements validated:
|
||||||
|
|
||||||
- [WARN] : WARNING messages count
|
- [WARN] : WARNING messages count
|
||||||
- [INIT] : Initialization
|
- [INIT] : Initialization
|
||||||
- [CLOSE] : Closing
|
- [CLOSE] : Closing
|
||||||
- [ASSETS] : Assets loading
|
- [ASSETS] : Assets loading
|
||||||
- [OTHER] : Other types of warnings
|
- [RLGL] : OpenGL-wrapped initialization
|
||||||
- [RESULT] : Ending program result (0)
|
- [PLAT] : Platform initialization
|
||||||
|
- [FONT] : Font default initialization
|
||||||
|
- [TIMER] : Timer initialization
|
||||||
```
|
```
|
||||||
| **EXAMPLE NAME** | [WARN] | [INIT] | [CLOSE] | [ASSETS] | [OTHER] | [RESULT] |
|
| **EXAMPLE NAME** | [WARN] | [INIT] | [CLOSE] | [ASSETS] | [RLGL] | [PLAT] | [FONT] | [TIMER] |
|
||||||
|:---------------------------------|:------:|:------:|:-------:|:--------:|:-------:|:--------:|
|
|:---------------------------------|:------:|:------:|:-------:|:--------:|:------:|:------:|:------:|:-------:|
|
||||||
| core_highdpi_testbed | 2 | ✔ | ✔ | ✔ | ✔ | ✔ |
|
| core_custom_logging | 0 | ✔ | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ |
|
||||||
|
| core_custom_frame_control | 0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* rexm [raylib examples manager] - A simple command-line tool to manage raylib examples
|
* rexm [raylib examples manager] - A simple and easy-to-use raylib examples collection manager
|
||||||
*
|
*
|
||||||
* Supported processes:
|
* Supported processes:
|
||||||
* - create <new_example_name>
|
* - create <new_example_name>
|
||||||
@ -8,8 +8,9 @@
|
|||||||
* - rename <old_examples_name> <new_example_name>
|
* - rename <old_examples_name> <new_example_name>
|
||||||
* - remove <example_name>
|
* - remove <example_name>
|
||||||
* - build <example_name>
|
* - build <example_name>
|
||||||
* - validate
|
* - test <example_name>
|
||||||
* - update
|
* - validate // All examples
|
||||||
|
* - update // All examples
|
||||||
*
|
*
|
||||||
* Files involved in the processes:
|
* Files involved in the processes:
|
||||||
* - raylib/examples/<category>/<category>_example_name.c
|
* - raylib/examples/<category>/<category>_example_name.c
|
||||||
@ -86,11 +87,17 @@ typedef struct {
|
|||||||
char author[64]; // Example author
|
char author[64]; // Example author
|
||||||
char authorGitHub[64]; // Example author, GitHub user name
|
char authorGitHub[64]; // Example author, GitHub user name
|
||||||
|
|
||||||
int status; // Example validation status info
|
int status; // Example validation status flags
|
||||||
int resCount; // Example resources counter
|
int resCount; // Example resources counter
|
||||||
char **resPaths; // Example resources paths (MAX: 256)
|
char **resPaths; // Example resources paths (MAX: 256)
|
||||||
} rlExampleInfo;
|
} rlExampleInfo;
|
||||||
|
|
||||||
|
// Automated testing data
|
||||||
|
typedef struct {
|
||||||
|
int warnings; // Warnings counter
|
||||||
|
int status; // Testing status result flags
|
||||||
|
} rlExampleTesting;
|
||||||
|
|
||||||
// Validation status for a single example
|
// Validation status for a single example
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VALID_OK = 0, // All required files and entries are present
|
VALID_OK = 0, // All required files and entries are present
|
||||||
@ -111,6 +118,18 @@ typedef enum {
|
|||||||
VALID_UNKNOWN_ERROR = 1 << 14 // Unknown failure case (fallback)
|
VALID_UNKNOWN_ERROR = 1 << 14 // Unknown failure case (fallback)
|
||||||
} rlExampleValidationStatus;
|
} rlExampleValidationStatus;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TESTING_OK = 0, // All automated testing ok
|
||||||
|
TESTING_FAIL_INIT = 1 << 0, // Initialization (InitWindow()) -> "INFO: DISPLAY: Device initialized successfully"
|
||||||
|
TESTING_FAIL_CLOSE = 1 << 1, // Closing (CloseWindow()) -> "INFO: Window closed successfully"
|
||||||
|
TESTING_FAIL_ASSETS = 1 << 2, // Assets loading (WARNING: FILE:) -> "WARNING: FILEIO:"
|
||||||
|
TESTING_FAIL_RLGL = 1 << 3, // OpenGL-wrapped initialization -> "INFO: RLGL: Default OpenGL state initialized successfully"
|
||||||
|
TESTING_FAIL_PLATFORM = 1 << 4, // Platform initialization -> "INFO: PLATFORM: DESKTOP (GLFW - Win32): Initialized successfully"
|
||||||
|
TESTING_FAIL_FONT = 1 << 5, // Font deefault initialization -> "INFO: FONT: Default font loaded successfully (224 glyphs)"
|
||||||
|
TESTING_FAIL_TIMER = 1 << 6, // Timer initialization -> "INFO: TIMER: Target time per frame: 16.667 milliseconds"
|
||||||
|
TESTING_FAIL_OTHER = 1 << 7, // Other types of warnings (WARNING:)
|
||||||
|
} rlExampleTestingStatus;
|
||||||
|
|
||||||
// Example management operations
|
// Example management operations
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OP_NONE = 0, // No process to do
|
OP_NONE = 0, // No process to do
|
||||||
@ -119,9 +138,9 @@ typedef enum {
|
|||||||
OP_RENAME = 3, // Rename existing example
|
OP_RENAME = 3, // Rename existing example
|
||||||
OP_REMOVE = 4, // Remove existing example
|
OP_REMOVE = 4, // Remove existing example
|
||||||
OP_VALIDATE = 5, // Validate examples, using [examples_list.txt] as main source by default
|
OP_VALIDATE = 5, // Validate examples, using [examples_list.txt] as main source by default
|
||||||
OP_UPDATE = 6, // Validate and update required examples (as far as possible)
|
OP_UPDATE = 6, // Validate and update required examples (as far as possible): ALL
|
||||||
OP_BUILD = 7, // Build example for desktop and web, copy web output
|
OP_BUILD = 7, // Build example(s) for desktop and web, copy web output - Multiple examples supported
|
||||||
OP_TEST = 8, // Test example: check output LOG WARNINGS
|
OP_TEST = 8, // Test example(s), checking output log "WARNING" - Multiplee examples supported
|
||||||
} rlExampleOperation;
|
} rlExampleOperation;
|
||||||
|
|
||||||
static const char *exCategories[REXM_MAX_EXAMPLE_CATEGORIES] = { "core", "shapes", "textures", "text", "models", "shaders", "audio", "others" };
|
static const char *exCategories[REXM_MAX_EXAMPLE_CATEGORIES] = { "core", "shapes", "textures", "text", "models", "shaders", "audio", "others" };
|
||||||
@ -145,8 +164,8 @@ static int UpdateRequiredFiles(void);
|
|||||||
// Load examples collection information
|
// Load examples collection information
|
||||||
// NOTE 1: Load by category: "ALL", "core", "shapes", "textures", "text", "models", "shaders", others"
|
// NOTE 1: Load by category: "ALL", "core", "shapes", "textures", "text", "models", "shaders", others"
|
||||||
// NOTE 2: Sort examples list on request flag
|
// NOTE 2: Sort examples list on request flag
|
||||||
static rlExampleInfo *LoadExamplesData(const char *fileName, const char *category, bool sort, int *exCount);
|
static rlExampleInfo *LoadExampleData(const char *filter, bool sort, int *exCount);
|
||||||
static void UnloadExamplesData(rlExampleInfo *exInfo);
|
static void UnloadExampleData(rlExampleInfo *exInfo);
|
||||||
|
|
||||||
// Load example info from file header
|
// Load example info from file header
|
||||||
static rlExampleInfo *LoadExampleInfo(const char *exFileName);
|
static rlExampleInfo *LoadExampleInfo(const char *exFileName);
|
||||||
@ -161,10 +180,10 @@ static int ParseExampleInfoLine(const char *line, rlExampleInfo *entry);
|
|||||||
static void SortExampleByName(rlExampleInfo *items, int count);
|
static void SortExampleByName(rlExampleInfo *items, int count);
|
||||||
|
|
||||||
// Scan resource paths in example file
|
// Scan resource paths in example file
|
||||||
static char **ScanExampleResources(const char *filePath, int *resPathCount);
|
static char **LoadExampleResourcePaths(const char *filePath, int *resPathCount);
|
||||||
|
|
||||||
// Clear resource paths scanned
|
// Clear resource paths scanned
|
||||||
static void ClearExampleResources(char **resPaths);
|
static void UnloadExampleResourcePaths(char **resPaths);
|
||||||
|
|
||||||
// Add/remove VS project (.vcxproj) tofrom existing VS solution (.sln)
|
// Add/remove VS project (.vcxproj) tofrom existing VS solution (.sln)
|
||||||
static int AddVSProjectToSolution(const char *slnFile, const char *projFile, const char *category);
|
static int AddVSProjectToSolution(const char *slnFile, const char *projFile, const char *category);
|
||||||
@ -222,7 +241,8 @@ int main(int argc, char *argv[])
|
|||||||
char exRecategory[32] = { 0 }; // Example re-name category: shapes
|
char exRecategory[32] = { 0 }; // Example re-name category: shapes
|
||||||
char exRename[64] = { 0 }; // Example re-name, without extension
|
char exRename[64] = { 0 }; // Example re-name, without extension
|
||||||
|
|
||||||
char exRebuildRequested[16] = { 0 }; // Example category/full rebuild request
|
char *exBuildList[256] = { 0 }; // Example build list for: ALL, <category>, single-example
|
||||||
|
int exBuildListCount = 0; // Example build list file count
|
||||||
|
|
||||||
int opCode = OP_NONE; // Operation code: 0-None(Help), 1-Create, 2-Add, 3-Rename, 4-Remove
|
int opCode = OP_NONE; // Operation code: 0-None(Help), 1-Create, 2-Add, 3-Rename, 4-Remove
|
||||||
bool showUsage = false; // Flag to show usage help
|
bool showUsage = false; // Flag to show usage help
|
||||||
@ -382,80 +402,38 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
opCode = OP_UPDATE;
|
opCode = OP_UPDATE;
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[1], "build") == 0)
|
else if ((strcmp(argv[1], "build") == 0) || (strcmp(argv[1], "test") == 0))
|
||||||
{
|
{
|
||||||
// Build example for PLATFORM_DESKTOP and PLATFORM_WEB
|
// Build/Test example(s) for PLATFORM_DESKTOP and PLATFORM_WEB
|
||||||
// NOTE: Build outputs to default directory, usually where the .c file is located,
|
// NOTE: Build outputs to default directory, usually where the .c file is located,
|
||||||
// to avoid issues with copying resources (at least on Desktop)
|
// to avoid issues with copying resources (at least on Desktop)
|
||||||
// Web build files (.html, .wasm, .js, .data) are copied to raylib.com/examples repo
|
// Web build files (.html, .wasm, .js, .data) are copied to raylib.com/examples repo
|
||||||
// Check for valid upcoming argument
|
// Check for valid upcoming argument
|
||||||
if (argc == 2) LOG("WARNING: No example name provided to build\n");
|
if (argc == 2) LOG("WARNING: No example name/category provided\n");
|
||||||
else if (argc > 3) LOG("WARNING: Too many arguments provided\n");
|
else if (argc > 3) LOG("WARNING: Too many arguments provided\n");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Support building not only individual examples but categories and "ALL"
|
// Support building/testing not only individual examples but multiple: ALL/<category>
|
||||||
if ((strcmp(argv[2], "ALL") == 0) || TextInList(argv[2], exCategories, REXM_MAX_EXAMPLE_CATEGORIES))
|
rlExampleInfo *exBuildListInfo = LoadExampleData(argv[2], false, &exBuildListCount);
|
||||||
|
|
||||||
|
for (int i = 0; i < exBuildListCount; i++)
|
||||||
{
|
{
|
||||||
// Category/ALL rebuilt requested
|
exBuildList[i] = (char *)RL_CALLOC(256, sizeof(char));
|
||||||
strcpy(exRebuildRequested, argv[2]);
|
strcpy(exBuildList[i], exBuildListInfo[i].name);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Verify example exists in collection to be removed
|
|
||||||
char *exColInfo = LoadFileText(exCollectionFilePath);
|
|
||||||
if (TextFindIndex(exColInfo, argv[2]) != -1) // Example in the collection
|
|
||||||
{
|
|
||||||
strcpy(exName, argv[2]); // Register example name
|
|
||||||
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
|
|
||||||
opCode = OP_BUILD;
|
|
||||||
}
|
|
||||||
else LOG("WARNING: BUILD: Example requested not available in the collection\n");
|
|
||||||
UnloadFileText(exColInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcmp(argv[1], "test") == 0)
|
|
||||||
{
|
|
||||||
// Build and test example for PLATFORM_DESKTOP
|
|
||||||
// NOTE: Build outputs to default directory, usually where the .c file is located,
|
|
||||||
// to avoid issues with copying resources (at least on Desktop)
|
|
||||||
if (argc == 2) LOG("WARNING: No example name provided to test\n");
|
|
||||||
else if (argc > 3) LOG("WARNING: Too many arguments provided\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Support building not only individual examples but categories and "ALL"
|
|
||||||
if ((strcmp(argv[2], "ALL") == 0) || TextInList(argv[2], exCategories, REXM_MAX_EXAMPLE_CATEGORIES))
|
|
||||||
{
|
|
||||||
// Category/ALL rebuilt requested
|
|
||||||
strcpy(exRebuildRequested, argv[2]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Verify example exists in collection to be removed
|
|
||||||
char *exColInfo = LoadFileText(exCollectionFilePath);
|
|
||||||
if (TextFindIndex(exColInfo, argv[2]) != -1) // Example in the collection
|
|
||||||
{
|
|
||||||
strcpy(exName, argv[2]); // Register example name
|
|
||||||
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
|
|
||||||
opCode = OP_TEST;
|
|
||||||
}
|
|
||||||
else LOG("WARNING: TEST: Example requested not available in the collection\n");
|
|
||||||
UnloadFileText(exColInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UnloadExampleData(exBuildListInfo);
|
||||||
|
|
||||||
|
if (exBuildListCount == 0) LOG("WARNING: BUILD: Example requested not available in the collection\n");
|
||||||
|
else opCode = OP_TEST;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process command line options arguments
|
// Process command line options arguments
|
||||||
for (int i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0))
|
if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) showUsage = true;
|
||||||
{
|
else if ((strcmp(argv[i], "-v") == 0) || (strcmp(argv[i], "--verbose") == 0)) verbose = true;
|
||||||
showUsage = true;
|
|
||||||
}
|
|
||||||
else if ((strcmp(argv[i], "-v") == 0) || (strcmp(argv[i], "--verbose") == 0))
|
|
||||||
{
|
|
||||||
verbose = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,7 +490,7 @@ int main(int argc, char *argv[])
|
|||||||
// NOTE: resources path will be relative to example source file directory
|
// NOTE: resources path will be relative to example source file directory
|
||||||
int resPathCount = 0;
|
int resPathCount = 0;
|
||||||
LOG("INFO: [%s] Scanning file for resources...\n", GetFileName(inFileName));
|
LOG("INFO: [%s] Scanning file for resources...\n", GetFileName(inFileName));
|
||||||
char **resPaths = ScanExampleResources(TextFormat("%s/%s.c", GetDirectoryPath(inFileName), exName), &resPathCount);
|
char **resPaths = LoadExampleResourcePaths(TextFormat("%s/%s.c", GetDirectoryPath(inFileName), exName), &resPathCount);
|
||||||
|
|
||||||
if (resPathCount > 0)
|
if (resPathCount > 0)
|
||||||
{
|
{
|
||||||
@ -570,7 +548,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearExampleResources(resPaths);
|
UnloadExampleResourcePaths(resPaths);
|
||||||
// -----------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Add example to the collection list, if not already there
|
// Add example to the collection list, if not already there
|
||||||
@ -726,13 +704,13 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// Edit: Update example source code metadata
|
// Edit: Update example source code metadata
|
||||||
int exListCount = 0;
|
int exListCount = 0;
|
||||||
rlExampleInfo *exList = LoadExamplesData(exCollectionFilePath, exCategory, false, &exListCount);
|
rlExampleInfo *exList = LoadExampleData(exCategory, false, &exListCount);
|
||||||
for (int i = 0; i < exListCount; i++)
|
for (int i = 0; i < exListCount; i++)
|
||||||
{
|
{
|
||||||
if (strcmp(exList[i].name, exRename) == 0)
|
if (strcmp(exList[i].name, exRename) == 0)
|
||||||
UpdateSourceMetadata(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exRename), &exList[i]);
|
UpdateSourceMetadata(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exRename), &exList[i]);
|
||||||
}
|
}
|
||||||
UnloadExamplesData(exList);
|
UnloadExampleData(exList);
|
||||||
|
|
||||||
// NOTE: Example resource files do not need to be changed...
|
// NOTE: Example resource files do not need to be changed...
|
||||||
// unless the example is moved from one caegory to another
|
// unless the example is moved from one caegory to another
|
||||||
@ -918,79 +896,24 @@ int main(int argc, char *argv[])
|
|||||||
case OP_BUILD:
|
case OP_BUILD:
|
||||||
{
|
{
|
||||||
LOG("INFO: Command requested: BUILD\n");
|
LOG("INFO: Command requested: BUILD\n");
|
||||||
LOG("INFO: Example to be built: %s\n", exName);
|
LOG("INFO: Example(s) to be built: %i [%s]\n", exBuildListCount, (exBuildListCount == 1)? exBuildList[0] : argv[2]);
|
||||||
|
|
||||||
if ((exRebuildRequested[0] != '\0') &&
|
#if defined(_WIN32)
|
||||||
(strcmp(exRebuildRequested, "others") != 0) &&
|
// Set required environment variables
|
||||||
(strcmp(exCategory, "others") != 0)) // Skipping "others" category for rebuild: Special needs
|
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
|
||||||
|
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
||||||
|
//putenv("MAKE=mingw32-make");
|
||||||
|
//ChangeDirectory(exBasePath);
|
||||||
|
#endif
|
||||||
|
for (int i = 0; i < exBuildListCount; i++)
|
||||||
{
|
{
|
||||||
// TODO: Support building full categories: exRebuildRequested
|
// Get example name and category
|
||||||
|
memset(exName, 0, 64);
|
||||||
|
strcpy(exName, exBuildList[i]);
|
||||||
|
memset(exCategory, 0, 32);
|
||||||
|
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
|
||||||
|
|
||||||
int exRebuildCount = 0;
|
LOG("INFO: [%i/%i] Building example: [%s]\n", i + 1, exBuildListCount, exName);
|
||||||
rlExampleInfo *exRebuildList = LoadExamplesData(exCollectionFilePath, exRebuildRequested, false, &exRebuildCount);
|
|
||||||
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.html
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.data
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.wasm
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.js
|
|
||||||
#if defined(_WIN32)
|
|
||||||
// Set required environment variables
|
|
||||||
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
|
|
||||||
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
|
||||||
//putenv("MAKE=mingw32-make");
|
|
||||||
//ChangeDirectory(exBasePath);
|
|
||||||
#endif
|
|
||||||
for (int i = 0; i < exRebuildCount; i++)
|
|
||||||
{
|
|
||||||
// Build example for PLATFORM_DESKTOP
|
|
||||||
#if defined(_WIN32)
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: Win32)\n", exName);
|
|
||||||
system(TextFormat("mingw32-make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
#else
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: POSIX)\n", exName);
|
|
||||||
system(TextFormat("make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Build example for PLATFORM_WEB
|
|
||||||
#if defined(_WIN32)
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: Win32)\n", exName);
|
|
||||||
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
#else
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: POSIX)\n", exName);
|
|
||||||
system(TextFormat("make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
#endif
|
|
||||||
// Update generated .html metadata
|
|
||||||
LOG("INFO: [%s] Updating HTML Metadata...\n", TextFormat("%s.html", exRebuildList[i].name));
|
|
||||||
UpdateWebMetadata(TextFormat("%s/%s/%s.html", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
|
|
||||||
TextFormat("%s/%s/%s.c", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
|
|
||||||
// Copy results to web side
|
|
||||||
LOG("INFO: [%s] Copy example build to raylib.com\n", exRebuildList[i].name);
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
|
|
||||||
TextFormat("%s/%s/%s.html", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.data", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
|
|
||||||
TextFormat("%s/%s/%s.data", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.wasm", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
|
|
||||||
TextFormat("%s/%s/%s.wasm", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
|
|
||||||
TextFormat("%s/%s/%s.js", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
|
|
||||||
}
|
|
||||||
|
|
||||||
UnloadExamplesData(exRebuildList);
|
|
||||||
}
|
|
||||||
else // Build a single example
|
|
||||||
{
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.html
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.data
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.wasm
|
|
||||||
// Build: raylib.com/examples/<category>/<category>_example_name.js
|
|
||||||
#if defined(_WIN32)
|
|
||||||
// Set required environment variables
|
|
||||||
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
|
|
||||||
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
|
||||||
//putenv("MAKE=mingw32-make");
|
|
||||||
//ChangeDirectory(exBasePath);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Build example for PLATFORM_DESKTOP
|
// Build example for PLATFORM_DESKTOP
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -1002,6 +925,10 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Build example for PLATFORM_WEB
|
// Build example for PLATFORM_WEB
|
||||||
|
// Build: raylib.com/examples/<category>/<category>_example_name.html
|
||||||
|
// Build: raylib.com/examples/<category>/<category>_example_name.data
|
||||||
|
// Build: raylib.com/examples/<category>/<category>_example_name.wasm
|
||||||
|
// Build: raylib.com/examples/<category>/<category>_example_name.js
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: Win32)\n", exName);
|
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: Win32)\n", exName);
|
||||||
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exCategory, exName));
|
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exCategory, exName));
|
||||||
@ -1024,8 +951,10 @@ int main(int argc, char *argv[])
|
|||||||
TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
||||||
FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exCategory, exName),
|
FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exCategory, exName),
|
||||||
TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
|
TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
|
||||||
|
|
||||||
|
// Once example processed, free memory from list
|
||||||
|
RL_FREE(exBuildList[i]);
|
||||||
}
|
}
|
||||||
//LOG("WARNING: [others] category examples should be build manually, they could have specific build requirements\n");
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case OP_VALIDATE: // Validate: report and actions
|
case OP_VALIDATE: // Validate: report and actions
|
||||||
@ -1128,7 +1057,7 @@ int main(int argc, char *argv[])
|
|||||||
// Check all examples in collection [examples_list.txt] -> Source of truth!
|
// Check all examples in collection [examples_list.txt] -> Source of truth!
|
||||||
LOG("INFO: Validating examples in collection...\n");
|
LOG("INFO: Validating examples in collection...\n");
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, "ALL", false, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData("ALL", false, &exCollectionCount);
|
||||||
|
|
||||||
// Set status information for all examples, using "status" field in the struct
|
// Set status information for all examples, using "status" field in the struct
|
||||||
for (int i = 0; i < exCollectionCount; i++)
|
for (int i = 0; i < exCollectionCount; i++)
|
||||||
@ -1173,7 +1102,7 @@ int main(int argc, char *argv[])
|
|||||||
// Validate: raylib/examples/<category>/resources/.. -> Example resources available?
|
// Validate: raylib/examples/<category>/resources/.. -> Example resources available?
|
||||||
// Scan resources used in example to check for missing resource files
|
// Scan resources used in example to check for missing resource files
|
||||||
// WARNING: Some paths could be for files to save, not files to load, verify it
|
// WARNING: Some paths could be for files to save, not files to load, verify it
|
||||||
char **resPaths = ScanExampleResources(TextFormat("%s/%s/%s.c", exBasePath, exInfo->category, exInfo->name), &exInfo->resCount);
|
char **resPaths = LoadExampleResourcePaths(TextFormat("%s/%s/%s.c", exBasePath, exInfo->category, exInfo->name), &exInfo->resCount);
|
||||||
if (exInfo->resCount > 0)
|
if (exInfo->resCount > 0)
|
||||||
{
|
{
|
||||||
for (int r = 0; r < exInfo->resCount; r++)
|
for (int r = 0; r < exInfo->resCount; r++)
|
||||||
@ -1206,7 +1135,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ClearExampleResources(resPaths);
|
UnloadExampleResourcePaths(resPaths);
|
||||||
|
|
||||||
// Validate: raylib.com/examples/<category>/<category>_example_name.html -> File exists?
|
// Validate: raylib.com/examples/<category>/<category>_example_name.html -> File exists?
|
||||||
// Validate: raylib.com/examples/<category>/<category>_example_name.data -> File exists?
|
// Validate: raylib.com/examples/<category>/<category>_example_name.data -> File exists?
|
||||||
@ -1336,8 +1265,8 @@ int main(int argc, char *argv[])
|
|||||||
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
||||||
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exInfo->category, exInfo->name));
|
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exInfo->category, exInfo->name));
|
||||||
#else
|
#else
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: POSIX)\n", exInfo->name);
|
LOG("INFO: [%s] Building example for PLATFORM_WEB (Host: POSIX)\n", exInfo->filter);
|
||||||
system(TextFormat("make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exInfo->category, exInfo->name));
|
system(TextFormat("make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exInfo->category, exInfo->filter));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Update generated .html metadata
|
// Update generated .html metadata
|
||||||
@ -1410,7 +1339,7 @@ int main(int argc, char *argv[])
|
|||||||
| shapes_colors_palette | ✘ | ✔ | ✘ | ✔ | ✘ | ✔ | ✔ | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
| shapes_colors_palette | ✘ | ✔ | ✘ | ✔ | ✘ | ✔ | ✔ | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||||
| text_format_text | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ | ✘ | ✔ | ✔ | ✔ | ✔ |
|
| text_format_text | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ | ✘ | ✔ | ✔ | ✔ | ✔ |
|
||||||
*/
|
*/
|
||||||
LOG("INFO: [examples_report.md] Generating examples validation report...\n");
|
LOG("INFO: [examples_validation.md] Generating examples validation report...\n");
|
||||||
|
|
||||||
char *report = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
char *report = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
||||||
|
|
||||||
@ -1456,13 +1385,13 @@ int main(int argc, char *argv[])
|
|||||||
(exCollection[i].status & VALID_MISSING_WEB_METADATA)? "❌" : "✔");
|
(exCollection[i].status & VALID_MISSING_WEB_METADATA)? "❌" : "✔");
|
||||||
}
|
}
|
||||||
|
|
||||||
SaveFileText(TextFormat("%s/../tools/rexm/%s", exBasePath, "examples_report.md"), report);
|
SaveFileText(TextFormat("%s/../tools/rexm/reports/%s", exBasePath, "examples_validation.md"), report);
|
||||||
RL_FREE(report);
|
RL_FREE(report);
|
||||||
//-----------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Generate a report with only the examples missing some elements
|
// Generate a report with only the examples missing some elements
|
||||||
//-----------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------
|
||||||
LOG("INFO: [examples_report_issues.md] Generating examples issues report...\n");
|
LOG("INFO: [examples_issues.md] Generating examples issues report...\n");
|
||||||
|
|
||||||
char *reportIssues = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
char *reportIssues = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
||||||
|
|
||||||
@ -1511,100 +1440,193 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SaveFileText(TextFormat("%s/../tools/rexm/%s", exBasePath, "examples_report_issues.md"), reportIssues);
|
SaveFileText(TextFormat("%s/../tools/rexm/reports/%s", exBasePath, "examples_issues.md"), reportIssues);
|
||||||
RL_FREE(reportIssues);
|
RL_FREE(reportIssues);
|
||||||
//-----------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case OP_TEST:
|
case OP_TEST:
|
||||||
{
|
{
|
||||||
LOG("INFO: Command requested: TEST\n");
|
LOG("INFO: Command requested: TEST\n");
|
||||||
LOG("INFO: Example to be built and tested: %s\n", exName);
|
LOG("INFO: Example(s) to be build and tested: %i [%s]\n", exBuildListCount, (exBuildListCount == 1)? exBuildList[0] : argv[2]);
|
||||||
|
|
||||||
// Steps to follow
|
rlExampleTesting *testing = (rlExampleTesting *)RL_CALLOC(exBuildListCount, sizeof(rlExampleTesting));
|
||||||
// STEP 1: Load example.c and replace required code to inject basic testing code: frames to run
|
|
||||||
// OPTION 1: Code injection required multiple changes for testing but it does not require raylib changes!
|
|
||||||
// OPTION 2: Support testing on raylib side: Args processing and events injection: SUPPORT_AUTOMATD_TESTING_SYSTEM, EVENTS_TESTING_MODE
|
|
||||||
// STEP 2: Build example (PLATFORM_DESKTOP)
|
|
||||||
// STEP 3: Run example with arguments: --frames 2 > <example>.out.log
|
|
||||||
// STEP 4: Load <example>.out.log and check "WARNING:" messages -> Some could maybe be ignored
|
|
||||||
// STEP 5: Generate report with results
|
|
||||||
|
|
||||||
// STEP 1: Load example and inject required code
|
for (int i = 0; i < exBuildListCount; i++)
|
||||||
// PROBLEM: As we need to modify the example source code for building, we need to keep a copy or something
|
|
||||||
// WARNING: If we make a copy and something fails, it could not be restored at the end
|
|
||||||
// PROBLEM: Trying to build a copy won't work because Makefile is setup to look for specific example on specific path -> No output dir config
|
|
||||||
// IDEA: Create directory for testing data -> It implies moving files and set working dir...
|
|
||||||
// SOLUTION: Make a copy of original file -> Modify original -> Build -> Rename to <example>.test.exe
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName),
|
|
||||||
TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName));
|
|
||||||
char *srcText = LoadFileText(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
|
||||||
|
|
||||||
static const char *mainReplaceText =
|
|
||||||
"#include <string.h>\n"
|
|
||||||
"#include <stdlib.h>\n"
|
|
||||||
"int main(int argc, char *argv[])\n{\n"
|
|
||||||
" int requestedTestFrames = 0;\n"
|
|
||||||
" int testFramesCount = 0;\n"
|
|
||||||
" if ((argc > 1) && (argc == 3) && (strcmp(argv[1], \"--frames\") != 0)) requestedTestFrames = atoi(argv[2]);\n";
|
|
||||||
|
|
||||||
char *srcTextUpdated[3] = { 0 };
|
|
||||||
srcTextUpdated[0] = TextReplace(srcText, "int main(void)\n{", mainReplaceText);
|
|
||||||
srcTextUpdated[1] = TextReplace(srcTextUpdated[0], "WindowShouldClose()", "WindowShouldClose() && (testFramesCount < requestedTestFrames)");
|
|
||||||
srcTextUpdated[2] = TextReplace(srcTextUpdated[1], "EndDrawing();", "EndDrawing(); testFramesCount++;");
|
|
||||||
UnloadFileText(srcText);
|
|
||||||
|
|
||||||
SaveFileText(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName), srcTextUpdated[2]);
|
|
||||||
for (int i = 0; i < 3; i++) { MemFree(srcTextUpdated[i]); srcTextUpdated[i] = NULL; }
|
|
||||||
|
|
||||||
// STEP 2: Build example for DESKTOP platform
|
|
||||||
#if defined(_WIN32)
|
|
||||||
// Set required environment variables
|
|
||||||
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
|
|
||||||
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
|
||||||
//putenv("MAKE=mingw32-make");
|
|
||||||
//ChangeDirectory(exBasePath);
|
|
||||||
#endif
|
|
||||||
// Build example for PLATFORM_DESKTOP
|
|
||||||
#if defined(_WIN32)
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: Win32)\n", exName);
|
|
||||||
system(TextFormat("mingw32-make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
|
|
||||||
#else
|
|
||||||
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: POSIX)\n", exName);
|
|
||||||
system(TextFormat("make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
|
|
||||||
#endif
|
|
||||||
// Restore original source code before continue
|
|
||||||
FileCopy(TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName),
|
|
||||||
TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
|
||||||
FileRemove(TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName));
|
|
||||||
|
|
||||||
// STEP 3: Run example with required arguments
|
|
||||||
ChangeDirectory(TextFormat("%s/%s", exBasePath, exCategory));
|
|
||||||
system(TextFormat("%s --frames 2 > %s.log", exName, exName));
|
|
||||||
|
|
||||||
// STEP 4: Load and validate log -> WARNINGS
|
|
||||||
char *exTestLog = LoadFileText(TextFormat("%s/%s/%s.log", exBasePath, exCategory, exName));
|
|
||||||
int exTestLogLinesCount = 0;
|
|
||||||
char **exTestLogLines = LoadTextLines(exTestLog, &exTestLogLinesCount);
|
|
||||||
UnloadFileText(exTestLog);
|
|
||||||
|
|
||||||
int issueCounter = false;
|
|
||||||
for (int i = 0; i < exTestLogLinesCount; i++)
|
|
||||||
{
|
{
|
||||||
if (TextFindIndex(exTestLogLines[i], "WARNING") >= 0)
|
// Get example name and category
|
||||||
|
memset(exName, 0, 64);
|
||||||
|
strcpy(exName, exBuildList[i]);
|
||||||
|
memset(exCategory, 0, 32);
|
||||||
|
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
|
||||||
|
|
||||||
|
LOG("INFO: [%i/%i] Testing example: [%s]\n", i + 1, exBuildListCount, exName);
|
||||||
|
|
||||||
|
// Steps to follow
|
||||||
|
// STEP 1: Load example.c and replace required code to inject basic testing code: frames to run
|
||||||
|
// OPTION 1: Code injection required multiple changes for testing but it does not require raylib changes!
|
||||||
|
// OPTION 2: Support testing on raylib side: Args processing and events injection: SUPPORT_AUTOMATD_TESTING_SYSTEM, EVENTS_TESTING_MODE
|
||||||
|
// STEP 2: Build example (PLATFORM_DESKTOP)
|
||||||
|
// STEP 3: Run example with arguments: --frames 2 > <example>.out.log
|
||||||
|
// STEP 4: Load <example>.out.log and check "WARNING:" messages -> Some could maybe be ignored
|
||||||
|
// STEP 5: Generate report with results
|
||||||
|
|
||||||
|
// STEP 1: Load example and inject required code
|
||||||
|
// PROBLEM: As we need to modify the example source code for building, we need to keep a copy or something
|
||||||
|
// WARNING: If we make a copy and something fails, it could not be restored at the end
|
||||||
|
// PROBLEM: Trying to build a copy won't work because Makefile is setup to look for specific example on specific path -> No output dir config
|
||||||
|
// IDEA: Create directory for testing data -> It implies moving files and set working dir...
|
||||||
|
// SOLUTION: Make a copy of original file -> Modify original -> Build -> Rename to <example>.test.exe
|
||||||
|
FileCopy(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName),
|
||||||
|
TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName));
|
||||||
|
char *srcText = LoadFileText(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
||||||
|
|
||||||
|
static const char *mainReplaceText =
|
||||||
|
"#include <string.h>\n"
|
||||||
|
"#include <stdlib.h>\n"
|
||||||
|
"int main(int argc, char *argv[])\n{\n"
|
||||||
|
" int requestedTestFrames = 0;\n"
|
||||||
|
" int testFramesCount = 0;\n"
|
||||||
|
" if ((argc > 1) && (argc == 3) && (strcmp(argv[1], \"--frames\") != 0)) requestedTestFrames = atoi(argv[2]);\n";
|
||||||
|
|
||||||
|
char *srcTextUpdated[3] = { 0 };
|
||||||
|
srcTextUpdated[0] = TextReplace(srcText, "int main(void)\n{", mainReplaceText);
|
||||||
|
srcTextUpdated[1] = TextReplace(srcTextUpdated[0], "WindowShouldClose()", "WindowShouldClose() && (testFramesCount < requestedTestFrames)");
|
||||||
|
srcTextUpdated[2] = TextReplace(srcTextUpdated[1], "EndDrawing();", "EndDrawing(); testFramesCount++;");
|
||||||
|
UnloadFileText(srcText);
|
||||||
|
|
||||||
|
SaveFileText(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName), srcTextUpdated[2]);
|
||||||
|
for (int i = 0; i < 3; i++) { MemFree(srcTextUpdated[i]); srcTextUpdated[i] = NULL; }
|
||||||
|
|
||||||
|
// STEP 2: Build example for DESKTOP platform
|
||||||
|
#if defined(_WIN32)
|
||||||
|
// Set required environment variables
|
||||||
|
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
|
||||||
|
_putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
|
||||||
|
//putenv("MAKE=mingw32-make");
|
||||||
|
//ChangeDirectory(exBasePath);
|
||||||
|
#endif
|
||||||
|
// Build example for PLATFORM_DESKTOP
|
||||||
|
#if defined(_WIN32)
|
||||||
|
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: Win32)\n", exName);
|
||||||
|
system(TextFormat("mingw32-make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
|
||||||
|
#else
|
||||||
|
LOG("INFO: [%s] Building example for PLATFORM_DESKTOP (Host: POSIX)\n", exName);
|
||||||
|
system(TextFormat("make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
|
||||||
|
#endif
|
||||||
|
// Restore original source code before continue
|
||||||
|
FileCopy(TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName),
|
||||||
|
TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
||||||
|
FileRemove(TextFormat("%s/%s/%s.original.c", exBasePath, exCategory, exName));
|
||||||
|
|
||||||
|
// STEP 3: Run example with required arguments
|
||||||
|
// NOTE: Not easy to retrieve process return value from system(), it's platform dependant
|
||||||
|
ChangeDirectory(TextFormat("%s/%s", exBasePath, exCategory));
|
||||||
|
system(TextFormat("%s --frames 2 > %s.log", exName, exName));
|
||||||
|
|
||||||
|
// STEP 4: Load and validate log info
|
||||||
|
char *exTestLog = LoadFileText(TextFormat("%s/%s/%s.log", exBasePath, exCategory, exName));
|
||||||
|
int exTestLogLinesCount = 0;
|
||||||
|
char **exTestLogLines = LoadTextLines(exTestLog, &exTestLogLinesCount);
|
||||||
|
|
||||||
|
/*
|
||||||
|
TESTING_FAIL_INIT = 1 << 0, // Initialization (InitWindow()) -> "INFO: DISPLAY: Device initialized successfully"
|
||||||
|
TESTING_FAIL_CLOSE = 1 << 1, // Closing (CloseWindow()) -> "INFO: Window closed successfully"
|
||||||
|
TESTING_FAIL_ASSETS = 1 << 2, // Assets loading (WARNING: FILE:) -> "WARNING: FILEIO:"
|
||||||
|
TESTING_FAIL_RLGL = 1 << 3, // OpenGL-wrapped initialization -> "INFO: RLGL: Default OpenGL state initialized successfully"
|
||||||
|
TESTING_FAIL_PLATFORM = 1 << 4, // Platform initialization -> "INFO: PLATFORM: DESKTOP (GLFW - Win32): Initialized successfully"
|
||||||
|
TESTING_FAIL_FONT = 1 << 5, // Font default initialization -> "INFO: FONT: Default font loaded successfully (224 glyphs)"
|
||||||
|
TESTING_FAIL_TIMER = 1 << 6, // Timer initialization -> "INFO: TIMER: Target time per frame: 16.667 milliseconds"
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: DISPLAY: Device initialized successfully") == -1) testing[i].status |= TESTING_FAIL_INIT;
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: Window closed successfully") == -1) testing[i].status |= TESTING_FAIL_CLOSE;
|
||||||
|
if (TextFindIndex(exTestLog, "WARNING: FILEIO:") >= 0) testing[i].status |= TESTING_FAIL_ASSETS;
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: RLGL: Default OpenGL state initialized successfully") == -1) testing[i].status |= TESTING_FAIL_RLGL;
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: PLATFORM:") == -1) testing[i].status |= TESTING_FAIL_PLATFORM;
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: FONT: Default font loaded successfully") == -1) testing[i].status |= TESTING_FAIL_FONT;
|
||||||
|
if (TextFindIndex(exTestLog, "INFO: TIMER: Target time per frame:") == -1) testing[i].status |= TESTING_FAIL_TIMER;
|
||||||
|
|
||||||
|
for (int k = 0, index = 0; k < exTestLogLinesCount; k++)
|
||||||
{
|
{
|
||||||
LOG("TEST: [%s] %s\n", exName, exTestLogLines[i]);
|
if (TextFindIndex(exTestLogLines[k], "WARNING") >= 0) testing[i].warnings++;
|
||||||
issueCounter++;
|
}
|
||||||
|
|
||||||
|
UnloadTextLines(exTestLogLines, exTestLogLinesCount);
|
||||||
|
UnloadFileText(exTestLog);
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP 5: Generate testing report/table with results (.md)
|
||||||
|
//-----------------------------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
Columns:
|
||||||
|
- [WARN] : WARNING messages count
|
||||||
|
- [INIT] : Initialization
|
||||||
|
- [CLOSE] : Closing
|
||||||
|
- [ASSETS] : Assets loading
|
||||||
|
- [RLGL] : OpenGL-wrapped initialization
|
||||||
|
- [PLAT] : Platform initialization
|
||||||
|
- [FONT] : Font default initialization
|
||||||
|
- [TIMER] : Timer initialization
|
||||||
|
|
||||||
|
| **EXAMPLE NAME** | [WARN] | [INIT] | [CLOSE] | [ASSETS] | [RLGL] | [PLAT] | [FONT] | [TIMER] |
|
||||||
|
|:---------------------------------|:------:|:------:|:-------:|:--------:|:------:|:------:|:------:|:-------:|
|
||||||
|
| core_basic window | 0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||||
|
*/
|
||||||
|
LOG("INFO: [examples_testing.md] Generating examples testing report...\n");
|
||||||
|
|
||||||
|
char *report = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
||||||
|
|
||||||
|
int repIndex = 0;
|
||||||
|
repIndex += sprintf(report + repIndex, "# EXAMPLES COLLECTION - TESTING REPORT\n\n");
|
||||||
|
repIndex += sprintf(report + repIndex, "## Tested Platform: Windows\n\n");
|
||||||
|
|
||||||
|
repIndex += sprintf(report + repIndex, "```\nExample automated testing elements validated:\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [WARN] : WARNING messages count\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [INIT] : Initialization\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [CLOSE] : Closing\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [ASSETS] : Assets loading\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [RLGL] : OpenGL-wrapped initialization\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [PLAT] : Platform initialization\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [FONT] : Font default initialization\n");
|
||||||
|
repIndex += sprintf(report + repIndex, " - [TIMER] : Timer initialization\n```\n");
|
||||||
|
|
||||||
|
repIndex += sprintf(report + repIndex, "| **EXAMPLE NAME** | [WARN] | [INIT] | [CLOSE] | [ASSETS] | [RLGL] | [PLAT] | [FONT] | [TIMER] |\n");
|
||||||
|
repIndex += sprintf(report + repIndex, "|:---------------------------------|:------:|:------:|:-------:|:--------:|:------:|:------:|:------:|:-------:|\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
TESTING_FAIL_INIT = 1 << 0, // Initialization (InitWindow()) -> "INFO: DISPLAY: Device initialized successfully"
|
||||||
|
TESTING_FAIL_CLOSE = 1 << 1, // Closing (CloseWindow()) -> "INFO: Window closed successfully"
|
||||||
|
TESTING_FAIL_ASSETS = 1 << 2, // Assets loading (WARNING: FILE:) -> "WARNING: FILEIO:"
|
||||||
|
TESTING_FAIL_RLGL = 1 << 3, // OpenGL-wrapped initialization -> "INFO: RLGL: Default OpenGL state initialized successfully"
|
||||||
|
TESTING_FAIL_PLATFORM = 1 << 4, // Platform initialization -> "INFO: PLATFORM: DESKTOP (GLFW - Win32): Initialized successfully"
|
||||||
|
TESTING_FAIL_FONT = 1 << 5, // Font default initialization -> "INFO: FONT: Default font loaded successfully (224 glyphs)"
|
||||||
|
TESTING_FAIL_TIMER = 1 << 6, // Timer initialization -> "INFO: TIMER: Target time per frame: 16.667 milliseconds"
|
||||||
|
*/
|
||||||
|
for (int i = 0; i < exBuildListCount; i++)
|
||||||
|
{
|
||||||
|
if (testing[i].status > 0)
|
||||||
|
{
|
||||||
|
repIndex += sprintf(report + repIndex, "| %-32s | %i | %s | %s | %s | %s | %s | %s | %s |\n",
|
||||||
|
exBuildList[i], testing[i].warnings,
|
||||||
|
(testing[i].status & TESTING_FAIL_INIT)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_CLOSE)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_ASSETS)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_RLGL)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_PLATFORM)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_FONT)? "✔" : "❌",
|
||||||
|
(testing[i].status & TESTING_FAIL_TIMER)? "✔" : "❌");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadTextLines(exTestLogLines, exTestLogLinesCount);
|
repIndex += sprintf(report + repIndex, "\n");
|
||||||
|
|
||||||
// STEP 5: Generate auto-test report
|
SaveFileText(TextFormat("%s/../tools/rexm/reports/%s", exBasePath, "examples_testing_windows.md"), report);
|
||||||
//if (issueCounter > 0)
|
RL_FREE(report);
|
||||||
|
//-----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
default: // Help
|
default: // Help
|
||||||
@ -1667,13 +1689,13 @@ static int UpdateRequiredFiles(void)
|
|||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
LOG("INFO: Updating all examples metadata...\n");
|
LOG("INFO: Updating all examples metadata...\n");
|
||||||
int exListCount = 0;
|
int exListCount = 0;
|
||||||
rlExampleInfo *exList = LoadExamplesData(exCollectionFilePath, "ALL", true, &exListCount);
|
rlExampleInfo *exList = LoadExampleData("ALL", true, &exListCount);
|
||||||
for (int i = 0; i < exListCount; i++)
|
for (int i = 0; i < exListCount; i++)
|
||||||
{
|
{
|
||||||
rlExampleInfo *info = &exList[i];
|
rlExampleInfo *info = &exList[i];
|
||||||
UpdateSourceMetadata(TextFormat("%s/%s/%s.c", exBasePath, info->category, info->name), info);
|
UpdateSourceMetadata(TextFormat("%s/%s/%s.c", exBasePath, info->category, info->name), info);
|
||||||
}
|
}
|
||||||
UnloadExamplesData(exList);
|
UnloadExampleData(exList);
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Edit: raylib/examples/Makefile --> Update from collection
|
// Edit: raylib/examples/Makefile --> Update from collection
|
||||||
@ -1694,12 +1716,12 @@ static int UpdateRequiredFiles(void)
|
|||||||
mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
||||||
|
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, exCategories[i], true, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData(exCategories[i], true, &exCollectionCount);
|
||||||
|
|
||||||
for (int x = 0; x < exCollectionCount - 1; x++) mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s \\\n", exCollection[x].category, exCollection[x].name));
|
for (int x = 0; x < exCollectionCount - 1; x++) mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s \\\n", exCollection[x].category, exCollection[x].name));
|
||||||
mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s\n\n", exCollection[exCollectionCount - 1].category, exCollection[exCollectionCount - 1].name));
|
mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s\n\n", exCollection[exCollectionCount - 1].category, exCollection[exCollectionCount - 1].name));
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the remaining part of the original file
|
// Add the remaining part of the original file
|
||||||
@ -1731,12 +1753,12 @@ static int UpdateRequiredFiles(void)
|
|||||||
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
||||||
|
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, exCategories[i], true, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData(exCategories[i], true, &exCollectionCount);
|
||||||
|
|
||||||
for (int x = 0; x < exCollectionCount - 1; x++) mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s \\\n", exCollection[x].category, exCollection[x].name));
|
for (int x = 0; x < exCollectionCount - 1; x++) mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s \\\n", exCollection[x].category, exCollection[x].name));
|
||||||
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s\n\n", exCollection[exCollectionCount - 1].category, exCollection[exCollectionCount - 1].name));
|
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s\n\n", exCollection[exCollectionCount - 1].category, exCollection[exCollectionCount - 1].name));
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add examples individual targets, considering every example resources
|
// Add examples individual targets, considering every example resources
|
||||||
@ -1757,13 +1779,13 @@ static int UpdateRequiredFiles(void)
|
|||||||
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("# Compile %s examples\n", TextToUpper(exCategories[i])));
|
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("# Compile %s examples\n", TextToUpper(exCategories[i])));
|
||||||
|
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, exCategories[i], true, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData(exCategories[i], true, &exCollectionCount);
|
||||||
|
|
||||||
for (int x = 0; x < exCollectionCount; x++)
|
for (int x = 0; x < exCollectionCount; x++)
|
||||||
{
|
{
|
||||||
// Scan resources used in example to list
|
// Scan resources used in example to list
|
||||||
int resPathCount = 0;
|
int resPathCount = 0;
|
||||||
char **resPaths = ScanExampleResources(TextFormat("%s/%s/%s.c", exBasePath, exCollection[x].category, exCollection[x].name), &resPathCount);
|
char **resPaths = LoadExampleResourcePaths(TextFormat("%s/%s/%s.c", exBasePath, exCollection[x].category, exCollection[x].name), &resPathCount);
|
||||||
|
|
||||||
if (resPathCount > 0)
|
if (resPathCount > 0)
|
||||||
{
|
{
|
||||||
@ -1816,10 +1838,10 @@ static int UpdateRequiredFiles(void)
|
|||||||
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, " $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)\n\n");
|
mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, " $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearExampleResources(resPaths);
|
UnloadExampleResourcePaths(resPaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the remaining part of the original file
|
// Add the remaining part of the original file
|
||||||
@ -1845,8 +1867,8 @@ static int UpdateRequiredFiles(void)
|
|||||||
memcpy(mdTextUpdated, mdText, mdListStartIndex);
|
memcpy(mdTextUpdated, mdText, mdListStartIndex);
|
||||||
|
|
||||||
int exCollectionFullCount = 0;
|
int exCollectionFullCount = 0;
|
||||||
rlExampleInfo *exCollectionFull = LoadExamplesData(exCollectionFilePath, "ALL", false, &exCollectionFullCount);
|
rlExampleInfo *exCollectionFull = LoadExampleData("ALL", false, &exCollectionFullCount);
|
||||||
UnloadExamplesData(exCollectionFull);
|
UnloadExampleData(exCollectionFull);
|
||||||
|
|
||||||
mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, TextFormat("## EXAMPLES COLLECTION [TOTAL: %i]\n", exCollectionFullCount));
|
mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, TextFormat("## EXAMPLES COLLECTION [TOTAL: %i]\n", exCollectionFullCount));
|
||||||
|
|
||||||
@ -1854,7 +1876,7 @@ static int UpdateRequiredFiles(void)
|
|||||||
for (int i = 0; i < REXM_MAX_EXAMPLE_CATEGORIES; i++)
|
for (int i = 0; i < REXM_MAX_EXAMPLE_CATEGORIES; i++)
|
||||||
{
|
{
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, exCategories[i], false, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData(exCategories[i], false, &exCollectionCount);
|
||||||
|
|
||||||
// Every category includes some introductory text, as it is quite short, just copying it here
|
// Every category includes some introductory text, as it is quite short, just copying it here
|
||||||
if (i == 0) // "core"
|
if (i == 0) // "core"
|
||||||
@ -1925,7 +1947,7 @@ static int UpdateRequiredFiles(void)
|
|||||||
starsText, exCollection[x].verCreated, exCollection[x].verUpdated, exCollection[x].author, exCollection[x].authorGitHub));
|
starsText, exCollection[x].verCreated, exCollection[x].verUpdated, exCollection[x].author, exCollection[x].authorGitHub));
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
||||||
@ -1971,7 +1993,7 @@ static int UpdateRequiredFiles(void)
|
|||||||
for (int i = 0; i < REXM_MAX_EXAMPLE_CATEGORIES - 1; i++)
|
for (int i = 0; i < REXM_MAX_EXAMPLE_CATEGORIES - 1; i++)
|
||||||
{
|
{
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, exCategories[i], false, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExampleData(exCategories[i], false, &exCollectionCount);
|
||||||
for (int x = 0; x < exCollectionCount; x++)
|
for (int x = 0; x < exCollectionCount; x++)
|
||||||
{
|
{
|
||||||
for (int s = 0; s < 4; s++)
|
for (int s = 0; s < 4; s++)
|
||||||
@ -1993,7 +2015,7 @@ static int UpdateRequiredFiles(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadExamplesData(exCollection);
|
UnloadExampleData(exCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the remaining part of the original file
|
// Add the remaining part of the original file
|
||||||
@ -2010,8 +2032,8 @@ static int UpdateRequiredFiles(void)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load examples collection information
|
// Load examples information from collection data
|
||||||
static rlExampleInfo *LoadExamplesData(const char *fileName, const char *category, bool sort, int *exCount)
|
static rlExampleInfo *LoadExampleData(const char *filter, bool sort, int *exCount)
|
||||||
{
|
{
|
||||||
#define MAX_EXAMPLES_INFO 256
|
#define MAX_EXAMPLES_INFO 256
|
||||||
|
|
||||||
@ -2019,7 +2041,8 @@ static rlExampleInfo *LoadExamplesData(const char *fileName, const char *categor
|
|||||||
int exCounter = 0;
|
int exCounter = 0;
|
||||||
*exCount = 0;
|
*exCount = 0;
|
||||||
|
|
||||||
char *text = LoadFileText(fileName);
|
// Load main collection list file: "raylib/examples/examples_list.txt"
|
||||||
|
char *text = LoadFileText(exCollectionFilePath);
|
||||||
|
|
||||||
if (text != NULL)
|
if (text != NULL)
|
||||||
{
|
{
|
||||||
@ -2041,18 +2064,25 @@ static rlExampleInfo *LoadExamplesData(const char *fileName, const char *categor
|
|||||||
int result = ParseExampleInfoLine(lines[i], &info);
|
int result = ParseExampleInfoLine(lines[i], &info);
|
||||||
if (result == 1) // Success on parsing
|
if (result == 1) // Success on parsing
|
||||||
{
|
{
|
||||||
if (strcmp(category, "ALL") == 0)
|
if (strcmp(filter, "ALL") == 0)
|
||||||
{
|
{
|
||||||
// Add all examples to the list
|
// Add all examples to the list
|
||||||
memcpy(&exInfo[exCounter], &info, sizeof(rlExampleInfo));
|
memcpy(&exInfo[exCounter], &info, sizeof(rlExampleInfo));
|
||||||
exCounter++;
|
exCounter++;
|
||||||
}
|
}
|
||||||
else if (strcmp(info.category, category) == 0)
|
else if (strcmp(info.category, filter) == 0)
|
||||||
{
|
{
|
||||||
// Get only specific category examples
|
// Get only specific category examples
|
||||||
memcpy(&exInfo[exCounter], &info, sizeof(rlExampleInfo));
|
memcpy(&exInfo[exCounter], &info, sizeof(rlExampleInfo));
|
||||||
exCounter++;
|
exCounter++;
|
||||||
}
|
}
|
||||||
|
else if (strcmp(info.name, filter) == 0)
|
||||||
|
{
|
||||||
|
// Get only requested example
|
||||||
|
memcpy(&exInfo[exCounter], &info, sizeof(rlExampleInfo));
|
||||||
|
exCounter++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2069,7 +2099,7 @@ static rlExampleInfo *LoadExamplesData(const char *fileName, const char *categor
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Unload examples collection data
|
// Unload examples collection data
|
||||||
static void UnloadExamplesData(rlExampleInfo *exInfo)
|
static void UnloadExampleData(rlExampleInfo *exInfo)
|
||||||
{
|
{
|
||||||
RL_FREE(exInfo);
|
RL_FREE(exInfo);
|
||||||
}
|
}
|
||||||
@ -2159,7 +2189,7 @@ static rlExampleInfo *LoadExampleInfo(const char *exFileName)
|
|||||||
|
|
||||||
UnloadFileText(exText);
|
UnloadFileText(exText);
|
||||||
|
|
||||||
exInfo->resPaths = ScanExampleResources(exFileName, &exInfo->resCount);
|
exInfo->resPaths = LoadExampleResourcePaths(exFileName, &exInfo->resCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exInfo;
|
return exInfo;
|
||||||
@ -2168,7 +2198,7 @@ static rlExampleInfo *LoadExampleInfo(const char *exFileName)
|
|||||||
// Unload example information
|
// Unload example information
|
||||||
static void UnloadExampleInfo(rlExampleInfo *exInfo)
|
static void UnloadExampleInfo(rlExampleInfo *exInfo)
|
||||||
{
|
{
|
||||||
ClearExampleResources(exInfo->resPaths);
|
UnloadExampleResourcePaths(exInfo->resPaths);
|
||||||
RL_FREE(exInfo);
|
RL_FREE(exInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2244,7 +2274,7 @@ static void SortExampleByName(rlExampleInfo *items, int count)
|
|||||||
// but new examples could require other file extensions to be added,
|
// but new examples could require other file extensions to be added,
|
||||||
// maybe it should look for '.xxx")' patterns instead
|
// maybe it should look for '.xxx")' patterns instead
|
||||||
// TODO: WARNING: Some resources could require linked resources: .fnt --> .png, .mtl --> .png, .gltf --> .png, ...
|
// TODO: WARNING: Some resources could require linked resources: .fnt --> .png, .mtl --> .png, .gltf --> .png, ...
|
||||||
static char **ScanExampleResources(const char *filePath, int *resPathCount)
|
static char **LoadExampleResourcePaths(const char *filePath, int *resPathCount)
|
||||||
{
|
{
|
||||||
#define REXM_MAX_RESOURCE_PATH_LEN 256
|
#define REXM_MAX_RESOURCE_PATH_LEN 256
|
||||||
|
|
||||||
@ -2326,7 +2356,7 @@ static char **ScanExampleResources(const char *filePath, int *resPathCount)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Clear resource paths scanned
|
// Clear resource paths scanned
|
||||||
static void ClearExampleResources(char **resPaths)
|
static void UnloadExampleResourcePaths(char **resPaths)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < REXM_MAX_RESOURCE_PATHS; i++) RL_FREE(resPaths[i]);
|
for (int i = 0; i < REXM_MAX_RESOURCE_PATHS; i++) RL_FREE(resPaths[i]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user