|
@@ -86,6 +86,14 @@ typedef enum {
|
|
|
|
|
|
static const char *exCategories[MAX_EXAMPLE_CATEGORIES] = { "core", "shapes", "textures", "text", "models", "shaders", "audio", "others" };
|
|
|
|
|
|
+// Paths required for examples management
|
|
|
+// TODO: Avoid hardcoding path values...
|
|
|
+static const char *exBasePath = "C:/GitHub/raylib/examples";
|
|
|
+static const char *exWebPath = "C:/GitHub/raylib.com/examples";
|
|
|
+static const char *exTemplateFilePath = "C:/GitHub/raylib/examples/examples_template.c";
|
|
|
+static const char *exTemplateScreenshot = "C:/GitHub/raylib/examples/examples_template.png";
|
|
|
+static const char *exCollectionListPath = "C:/GitHub/raylib/examples/examples_list.txt";
|
|
|
+
|
|
|
//----------------------------------------------------------------------------------
|
|
|
// Module specific functions declaration
|
|
|
//----------------------------------------------------------------------------------
|
|
@@ -94,6 +102,10 @@ static int FileCopy(const char *srcPath, const char *dstPath);
|
|
|
static int FileRename(const char *fileName, const char *fileRename);
|
|
|
static int FileRemove(const char *fileName);
|
|
|
|
|
|
+// Update required files from examples collection
|
|
|
+// UPDATES: Makefile, Makefile.Web, README.md, examples.js
|
|
|
+static int UpdateRequiredFiles(void);
|
|
|
+
|
|
|
// Load examples collection information
|
|
|
// NOTE 1: Load by category: "ALL", "core", "shapes", "textures", "text", "models", "shaders", others"
|
|
|
// NOTE 2: Sort examples list on request flag
|
|
@@ -118,18 +130,11 @@ static void SortExampleByName(rlExampleInfo *items, int count);
|
|
|
//------------------------------------------------------------------------------------
|
|
|
int main(int argc, char *argv[])
|
|
|
{
|
|
|
- // Paths required for examples management
|
|
|
- // TODO: Avoid hardcoding path values...
|
|
|
- char *exBasePath = "C:/GitHub/raylib/examples";
|
|
|
- char *exWebPath = "C:/GitHub/raylib.com/examples";
|
|
|
- char *exTemplateFilePath = "C:/GitHub/raylib/examples/examples_template.c";
|
|
|
- char *exTemplateScreenshot = "C:/GitHub/raylib/examples/examples_template.png";
|
|
|
- char *exCollectionListPath = "C:/GitHub/raylib/examples/examples_list.txt";
|
|
|
-
|
|
|
char inFileName[1024] = { 0 }; // Example input filename (to be added)
|
|
|
|
|
|
char exName[64] = { 0 }; // Example name, without extension: core_basic_window
|
|
|
char exCategory[32] = { 0 }; // Example category: core
|
|
|
+ char exRecategory[32] = { 0 }; // Example re-name category: shapes
|
|
|
char exRename[64] = { 0 }; // Example re-name, without extension
|
|
|
|
|
|
int opCode = OP_NONE; // Operation code: 0-None(Help), 1-Create, 2-Add, 3-Rename, 4-Remove
|
|
@@ -227,16 +232,7 @@ int main(int argc, char *argv[])
|
|
|
strcpy(exName, argv[2]); // Register example name
|
|
|
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
|
|
|
strcpy(exRename, argv[3]);
|
|
|
- char exReCategory[32] = { 0 };
|
|
|
- strncpy(exReCategory, exRename, TextFindIndex(exRename, "_"));
|
|
|
-
|
|
|
- if (strcmp(exCategory, exReCategory) != 0)
|
|
|
- {
|
|
|
- // TODO: Consider rename with change of category
|
|
|
- // Remove previous one from collection
|
|
|
- // Add new one (copy) to collection
|
|
|
- }
|
|
|
-
|
|
|
+ strncpy(exRecategory, exRename, TextFindIndex(exRename, "_"));
|
|
|
opCode = OP_RENAME;
|
|
|
}
|
|
|
else LOG("WARNING: RENAME: Example not available in the collection\n");
|
|
@@ -358,168 +354,9 @@ int main(int argc, char *argv[])
|
|
|
UnloadFileText(exColInfo);
|
|
|
//------------------------------------------------------------------------------------------------
|
|
|
|
|
|
- // Edit: raylib/examples/Makefile --> Add new example
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
- char *mkText = LoadFileText(TextFormat("%s/Makefile", exBasePath));
|
|
|
- char *mkTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated Makefile copy, 2MB
|
|
|
-
|
|
|
- int mkListStartIndex = TextFindIndex(mkText, "#EXAMPLES_LIST_START");
|
|
|
- int mkListEndIndex = TextFindIndex(mkText, "#EXAMPLES_LIST_END");
|
|
|
-
|
|
|
- int mkIndex = 0;
|
|
|
- memcpy(mkTextUpdated, mkText, mkListStartIndex);
|
|
|
- mkIndex = sprintf(mkTextUpdated + mkListStartIndex, "#EXAMPLES_LIST_START\n");
|
|
|
-
|
|
|
- for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
- {
|
|
|
- mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
|
|
-
|
|
|
- int exCount = 0;
|
|
|
- rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], true, &exCount);
|
|
|
-
|
|
|
- for (int x = 0; x < exCount - 1; x++) mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s \\\n", exCatList[x].category, exCatList[x].name));
|
|
|
- mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s\n\n", exCatList[exCount - 1].category, exCatList[exCount - 1].name));
|
|
|
-
|
|
|
- UnloadExamplesData(exCatList);
|
|
|
- }
|
|
|
-
|
|
|
- // Add the remaining part of the original file
|
|
|
- memcpy(mkTextUpdated + mkListStartIndex + mkIndex, mkText + mkListEndIndex, strlen(mkText) - mkListEndIndex);
|
|
|
-
|
|
|
- // Save updated file
|
|
|
- SaveFileText(TextFormat("%s/Makefile", exBasePath), mkTextUpdated);
|
|
|
- UnloadFileText(mkText);
|
|
|
- RL_FREE(mkTextUpdated);
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
-
|
|
|
- // Edit: raylib/examples/Makefile.Web --> Add new example
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
- char *mkwText = LoadFileText(TextFormat("%s/Makefile.Web", exBasePath));
|
|
|
- char *mkwTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated Makefile copy, 2MB
|
|
|
-
|
|
|
- int mkwListStartIndex = TextFindIndex(mkwText, "#EXAMPLES_LIST_START");
|
|
|
- int mkwListEndIndex = TextFindIndex(mkwText, "#EXAMPLES_LIST_END");
|
|
|
-
|
|
|
- int mkwIndex = 0;
|
|
|
- memcpy(mkwTextUpdated, mkwText, mkwListStartIndex);
|
|
|
- mkwIndex = sprintf(mkwTextUpdated + mkwListStartIndex, "#EXAMPLES_LIST_START\n");
|
|
|
-
|
|
|
- for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
- {
|
|
|
- mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
|
|
-
|
|
|
- int exCount = 0;
|
|
|
- rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], true, &exCount);
|
|
|
-
|
|
|
- for (int x = 0; x < exCount - 1; x++) mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s \\\n", exCatList[x].category, exCatList[x].name));
|
|
|
- mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s\n\n", exCatList[exCount - 1].category, exCatList[exCount - 1].name));
|
|
|
-
|
|
|
- UnloadExamplesData(exCatList);
|
|
|
- }
|
|
|
-
|
|
|
- // Add the remaining part of the original file
|
|
|
- memcpy(mkwTextUpdated + mkwListStartIndex + mkwIndex, mkwText + mkwListEndIndex, strlen(mkwText) - mkwListEndIndex);
|
|
|
-
|
|
|
- // TODO: Add new example target, considering resources
|
|
|
-
|
|
|
- // Save updated file
|
|
|
- SaveFileText(TextFormat("%s/Makefile.Web", exBasePath), mkwTextUpdated);
|
|
|
- UnloadFileText(mkwText);
|
|
|
- RL_FREE(mkwTextUpdated);
|
|
|
+ // Update: Makefile, Makefile.Web, README.md, examples.js
|
|
|
//------------------------------------------------------------------------------------------------
|
|
|
-
|
|
|
- // Edit: raylib/examples/README.md --> Add new example
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
- // NOTE: Using [examples_list.txt] to update/regen README.md
|
|
|
- // Lines format: | 01 | [core_basic_window](core/core_basic_window.c) | <img src="core/core_basic_window.png" alt="core_basic_window" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
|
|
- char *mdText = LoadFileText(TextFormat("%s/README.md", exBasePath));
|
|
|
- char *mdTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated examples.js copy, 2MB
|
|
|
-
|
|
|
- int mdListStartIndex = TextFindIndex(mdText, "| 01 | ");
|
|
|
-
|
|
|
- int mdIndex = 0;
|
|
|
- memcpy(mdTextUpdated, mdText, mdListStartIndex);
|
|
|
-
|
|
|
- // NOTE: We keep a global examples counter
|
|
|
- for (int i = 0, catCount = 0, gCount = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
- {
|
|
|
- // Every category includes some introductory text, as it is quite short, just copying it here
|
|
|
- // NOTE: "core" text already placed in the file
|
|
|
- if (i == 1) // "shapes"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: shapes\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.\n\n");
|
|
|
- }
|
|
|
- else if (i == 2) // "textures"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: textures\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/rtextures.c) module.\n\n");
|
|
|
- }
|
|
|
- else if (i == 3) // "text"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: text\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib text functionality, including sprite fonts loading/generation and text drawing, provided by raylib [text](../src/rtext.c) module.\n\n");
|
|
|
- }
|
|
|
- else if (i == 4) // "models"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: models\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib models functionality, including models loading/generation and drawing, provided by raylib [models](../src/rmodels.c) module.\n\n");
|
|
|
- }
|
|
|
- else if (i == 5) // "shaders"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: shaders\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib shaders functionality, including shaders loading, parameters configuration and drawing using them (model shaders and postprocessing shaders). This functionality is directly provided by raylib [rlgl](../src/rlgl.c) module.\n\n");
|
|
|
- }
|
|
|
- else if (i == 6) // "audio"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: audio\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples using raylib audio functionality, including sound/music loading and playing. This functionality is provided by raylib [raudio](../src/raudio.c) module. Note this module can be used standalone independently of raylib.\n\n");
|
|
|
- }
|
|
|
- else if (i == 7) // "others"
|
|
|
- {
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: others\n\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- "Examples showing raylib misc functionality that does not fit in other categories, like standalone modules usage or examples integrating external libraries.\n\n");
|
|
|
- }
|
|
|
-
|
|
|
- if (i > 0)
|
|
|
- {
|
|
|
- // Table header required
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |\n");
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|\n");
|
|
|
- }
|
|
|
-
|
|
|
- rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], false, &catCount);
|
|
|
- for (int x = 0; x < catCount; x++)
|
|
|
- {
|
|
|
- char stars[16] = { 0 };
|
|
|
- for (int s = 0; s < 4; s++)
|
|
|
- {
|
|
|
- if (s < exCatList[x].stars) strcpy(stars + 3*s, "⭐️");
|
|
|
- else strcpy(stars + 3*s, "☆");
|
|
|
- }
|
|
|
-
|
|
|
- mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
- TextFormat("| %02i | [%s](%s/%s.c) | <img src=\"%s/%s.png\" alt=\"%s\" width=\"80\"> | %s | %.1f | %.1f | [%s](https://github.com/%s) |\n",
|
|
|
- gCount + 1, exCatList[x].name, exCatList[x].category, exCatList[x].name, exCatList[x].category, exCatList[x].name, exCatList[x].name,
|
|
|
- stars, exCatList[x].verCreated, exCatList[x].verUpdated, exCatList[x].author, exCatList[x].authorGitHub + 1));
|
|
|
-
|
|
|
- gCount++;
|
|
|
- }
|
|
|
-
|
|
|
- UnloadExamplesData(exCatList);
|
|
|
- }
|
|
|
-
|
|
|
- // Save updated file
|
|
|
- SaveFileText(TextFormat("%s/README.md", exBasePath), mdTextUpdated);
|
|
|
- UnloadFileText(mdText);
|
|
|
- RL_FREE(mdTextUpdated);
|
|
|
+ UpdateRequiredFiles();
|
|
|
//------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// Create: raylib/projects/VS2022/examples/<category>_example_name.vcxproj
|
|
@@ -534,58 +371,6 @@ int main(int argc, char *argv[])
|
|
|
// Edit: raylib/projects/VS2022/raylib.sln --> Add new example project
|
|
|
system(TextFormat("dotnet solution %s/../projects/VS2022/raylib.sln add %s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exBasePath, exName));
|
|
|
//------------------------------------------------------------------------------------------------
|
|
|
-
|
|
|
- // Edit: raylib.com/common/examples.js --> Add new example
|
|
|
- // NOTE: Entries format: exampleEntry('⭐️☆☆☆' , 'core' , 'basic_window'),
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
- char *jsText = LoadFileText(TextFormat("%s/../common/examples.js", exWebPath));
|
|
|
- char *jsTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated examples.js copy, 2MB
|
|
|
-
|
|
|
- int jsListStartIndex = TextFindIndex(jsText, "//EXAMPLE_DATA_LIST_START");
|
|
|
- int jsListEndIndex = TextFindIndex(jsText, "//EXAMPLE_DATA_LIST_END");
|
|
|
-
|
|
|
- int jsIndex = 0;
|
|
|
- memcpy(jsTextUpdated, jsText, jsListStartIndex);
|
|
|
- jsIndex = sprintf(jsTextUpdated + jsListStartIndex, "//EXAMPLE_DATA_LIST_START\n");
|
|
|
- jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex, " var exampleData = [\n");
|
|
|
-
|
|
|
- // NOTE: We avoid "others" category
|
|
|
- for (int i = 0, exCount = 0; i < MAX_EXAMPLE_CATEGORIES - 1; i++)
|
|
|
- {
|
|
|
- rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], false, &exCount);
|
|
|
- for (int x = 0; x < exCount; x++)
|
|
|
- {
|
|
|
- char stars[16] = { 0 };
|
|
|
- for (int s = 0; s < 4; s++)
|
|
|
- {
|
|
|
- if (s < exCatList[x].stars) strcpy(stars + 3*s, "⭐️");
|
|
|
- else strcpy(stars + 3*s, "☆");
|
|
|
- }
|
|
|
-
|
|
|
- if ((i == 6) && (x == (exCount - 1)))
|
|
|
- {
|
|
|
- // NOTE: Last line to add, special case to consider
|
|
|
- jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex,
|
|
|
- TextFormat(" exampleEntry('%s', '%s', '%s')];\n", stars, exCatList[x].category, exCatList[x].name + strlen(exCatList[x].category) + 1));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex,
|
|
|
- TextFormat(" exampleEntry('%s', '%s', '%s'),\n", stars, exCatList[x].category, exCatList[x].name + strlen(exCatList[x].category) + 1));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- UnloadExamplesData(exCatList);
|
|
|
- }
|
|
|
-
|
|
|
- // Add the remaining part of the original file
|
|
|
- memcpy(jsTextUpdated + jsListStartIndex + jsIndex, jsText + jsListEndIndex, strlen(jsText) - jsListEndIndex);
|
|
|
-
|
|
|
- // Save updated file
|
|
|
- SaveFileText(TextFormat("%s/../common/examples.js", exWebPath), jsTextUpdated);
|
|
|
- UnloadFileText(jsText);
|
|
|
- RL_FREE(jsTextUpdated);
|
|
|
- //------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// Recompile example (on raylib side)
|
|
|
// NOTE: Tools requirements: emscripten, w64devkit
|
|
@@ -593,6 +378,7 @@ int main(int argc, char *argv[])
|
|
|
// Compile to: raylib.com/examples/<category>/<category>_example_name.data
|
|
|
// Compile to: raylib.com/examples/<category>/<category>_example_name.wasm
|
|
|
// Compile to: raylib.com/examples/<category>/<category>_example_name.js
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
// TODO: WARNING: This .BAT is not portable and it does not consider RESOURCES for Web properly,
|
|
|
// Makefile.Web should be used... but it requires proper editing first!
|
|
|
system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exCategory, exName));
|
|
@@ -606,25 +392,56 @@ int main(int argc, char *argv[])
|
|
|
TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
|
|
FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exCategory, exName),
|
|
|
TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
} break;
|
|
|
case 3: // Rename
|
|
|
{
|
|
|
- // Rename all required files
|
|
|
- rename(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.c", exBasePath, exCategory, exRename));
|
|
|
- rename(TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.png", exBasePath, exCategory, exRename));
|
|
|
+ // NOTE: At this point provided values have been validated:
|
|
|
+ // exName, exCategory, exRename, exRecategory
|
|
|
+ if (strcmp(exCategory, exRecategory) == 0)
|
|
|
+ {
|
|
|
+ // Rename example on collection
|
|
|
+ FileTextReplace(exCollectionListPath, TextFormat("%s;%s", exCategory, exName),
|
|
|
+ TextFormat("%s;%s", exRecategory, exRename));
|
|
|
+
|
|
|
+ // Rename all required files
|
|
|
+ rename(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName),
|
|
|
+ TextFormat("%s/%s/%s.c", exBasePath, exCategory, exRename));
|
|
|
+ rename(TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName),
|
|
|
+ TextFormat("%s/%s/%s.png", exBasePath, exCategory, exRename));
|
|
|
+
|
|
|
+ // Rename example on required files
|
|
|
+ FileTextReplace(TextFormat("%s/Makefile", exBasePath), exName, exRename);
|
|
|
+ FileTextReplace(TextFormat("%s/Makefile.Web", exBasePath), exName, exRename);
|
|
|
+ FileTextReplace(TextFormat("%s/README.md", exBasePath), exName, exRename);
|
|
|
+ FileTextReplace(TextFormat("%s/../common/examples.js", exWebPath), exName, exRename);
|
|
|
+
|
|
|
+ // Rename example project and solution
|
|
|
+ rename(TextFormat("%s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exName),
|
|
|
+ TextFormat("%s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exRename));
|
|
|
+ FileTextReplace(TextFormat("%s/../projects/VS2022/raylib.sln", exBasePath), exName, exRename);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Rename with change of category
|
|
|
+ // TODO: Reorder collection as required
|
|
|
+ FileTextReplace(exCollectionListPath, TextFormat("%s;%s", exCategory, exName),
|
|
|
+ TextFormat("%s;%s", exRecategory, exRename));
|
|
|
+
|
|
|
+ // Rename all required files
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName),
|
|
|
+ TextFormat("%s/%s/%s.c", exBasePath, exCategory, exRename));
|
|
|
+ remove(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
|
|
|
|
|
- FileTextReplace(TextFormat("%s/Makefile", exBasePath), exName, exRename);
|
|
|
- FileTextReplace(TextFormat("%s/Makefile.Web", exBasePath), exName, exRename);
|
|
|
- FileTextReplace(TextFormat("%s/README.md", exBasePath), exName, exRename);
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName),
|
|
|
+ TextFormat("%s/%s/%s.png", exBasePath, exCategory, exRename));
|
|
|
+ remove(TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName));
|
|
|
|
|
|
- rename(TextFormat("%s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exName),
|
|
|
- TextFormat("%s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exRename));
|
|
|
- FileTextReplace(TextFormat("%s/../projects/VS2022/raylib.sln", exBasePath), exName, exRename);
|
|
|
+ UpdateRequiredFiles();
|
|
|
+ }
|
|
|
|
|
|
// Remove old web compilation
|
|
|
- FileTextReplace(TextFormat("%s/../common/examples.js", exWebPath), exName, exRename);
|
|
|
remove(TextFormat("%s/%s/%s.html", exWebPath, exCategory, exName));
|
|
|
remove(TextFormat("%s/%s/%s.data", exWebPath, exCategory, exName));
|
|
|
remove(TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
|
@@ -633,22 +450,72 @@ int main(int argc, char *argv[])
|
|
|
// Recompile example (on raylib side)
|
|
|
// NOTE: Tools requirements: emscripten, w64devkit
|
|
|
// TODO: Avoid platform-specific .BAT file
|
|
|
- system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exCategory, exName));
|
|
|
+ system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exRecategory, exRename));
|
|
|
|
|
|
// Copy results to web side
|
|
|
- FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.html", exWebPath, exCategory, exName));
|
|
|
- FileCopy(TextFormat("%s/%s/%s.data", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.data", exWebPath, exCategory, exName));
|
|
|
- FileCopy(TextFormat("%s/%s/%s.wasm", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
|
|
- FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exCategory, exName),
|
|
|
- TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exRecategory, exRename),
|
|
|
+ TextFormat("%s/%s/%s.html", exWebPath, exRecategory, exRename));
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.data", exBasePath, exRecategory, exRename),
|
|
|
+ TextFormat("%s/%s/%s.data", exWebPath, exRecategory, exRename));
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.wasm", exBasePath, exRecategory, exRename),
|
|
|
+ TextFormat("%s/%s/%s.wasm", exWebPath, exRecategory, exRename));
|
|
|
+ FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exRecategory, exRename),
|
|
|
+ TextFormat("%s/%s/%s.js", exWebPath, exRecategory, exRename));
|
|
|
+
|
|
|
} break;
|
|
|
case 4: // Remove
|
|
|
{
|
|
|
// TODO: Remove and update all required files...
|
|
|
|
|
|
+ // Remove: raylib/examples/<category>/<category>_example_name.c
|
|
|
+ // Remove: raylib/examples/<category>/<category>_example_name.png
|
|
|
+ remove(TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
|
|
|
+ remove(TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName));
|
|
|
+
|
|
|
+ // TODO: Remove: raylib/examples/<category>/resources/..
|
|
|
+
|
|
|
+ // Edit: raylib/examples/Makefile
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+ //
|
|
|
+ //
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib/examples/Makefile.Web
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+ //
|
|
|
+ //
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib/examples/README.md
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+ //
|
|
|
+ //
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Remove: raylib/projects/VS2022/examples/<category>_example_name.vcxproj
|
|
|
+ remove(TextFormat("%s/../projects/VS2022/examples/%s.vcxproj", exBasePath, exName));
|
|
|
+
|
|
|
+ // Edit: raylib/projects/VS2022/raylib.sln
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+ //
|
|
|
+ //
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib.com/common/examples.js
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+
|
|
|
+ //---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Remove: raylib.com/examples/<category>/<category>_example_name.html
|
|
|
+ // Remove: raylib.com/examples/<category>/<category>_example_name.data
|
|
|
+ // Remove: raylib.com/examples/<category>/<category>_example_name.wasm
|
|
|
+ // Remove: raylib.com/examples/<category>/<category>_example_name.js
|
|
|
+ remove(TextFormat("%s/%s/%s.html", exWebPath, exCategory, exName));
|
|
|
+ remove(TextFormat("%s/%s/%s.data", exWebPath, exCategory, exName));
|
|
|
+ remove(TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
|
|
|
+ remove(TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
|
|
|
+
|
|
|
} break;
|
|
|
case 5: // Validate
|
|
|
{
|
|
@@ -711,6 +578,232 @@ int main(int argc, char *argv[])
|
|
|
//----------------------------------------------------------------------------------
|
|
|
// Module specific functions definition
|
|
|
//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Update required files from examples collection
|
|
|
+static int UpdateRequiredFiles(void)
|
|
|
+{
|
|
|
+ int result = 0;
|
|
|
+
|
|
|
+ // Edit: raylib/examples/Makefile --> Update from collection
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+ char *mkText = LoadFileText(TextFormat("%s/Makefile", exBasePath));
|
|
|
+ char *mkTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated Makefile copy, 2MB
|
|
|
+
|
|
|
+ int mkListStartIndex = TextFindIndex(mkText, "#EXAMPLES_LIST_START");
|
|
|
+ int mkListEndIndex = TextFindIndex(mkText, "#EXAMPLES_LIST_END");
|
|
|
+
|
|
|
+ int mkIndex = 0;
|
|
|
+ memcpy(mkTextUpdated, mkText, mkListStartIndex);
|
|
|
+ mkIndex = sprintf(mkTextUpdated + mkListStartIndex, "#EXAMPLES_LIST_START\n");
|
|
|
+
|
|
|
+ for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
+ {
|
|
|
+ mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
|
|
+
|
|
|
+ int exCount = 0;
|
|
|
+ rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], true, &exCount);
|
|
|
+
|
|
|
+ for (int x = 0; x < exCount - 1; x++) mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s \\\n", exCatList[x].category, exCatList[x].name));
|
|
|
+ mkIndex += sprintf(mkTextUpdated + mkListStartIndex + mkIndex, TextFormat(" %s/%s\n\n", exCatList[exCount - 1].category, exCatList[exCount - 1].name));
|
|
|
+
|
|
|
+ UnloadExamplesData(exCatList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add the remaining part of the original file
|
|
|
+ memcpy(mkTextUpdated + mkListStartIndex + mkIndex, mkText + mkListEndIndex, strlen(mkText) - mkListEndIndex);
|
|
|
+
|
|
|
+ // Save updated file
|
|
|
+ SaveFileText(TextFormat("%s/Makefile", exBasePath), mkTextUpdated);
|
|
|
+ UnloadFileText(mkText);
|
|
|
+ RL_FREE(mkTextUpdated);
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib/examples/Makefile.Web --> Update from collection
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+ char *mkwText = LoadFileText(TextFormat("%s/Makefile.Web", exBasePath));
|
|
|
+ char *mkwTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated Makefile copy, 2MB
|
|
|
+
|
|
|
+ int mkwListStartIndex = TextFindIndex(mkwText, "#EXAMPLES_LIST_START");
|
|
|
+ int mkwListEndIndex = TextFindIndex(mkwText, "#EXAMPLES_LIST_END");
|
|
|
+
|
|
|
+ int mkwIndex = 0;
|
|
|
+ memcpy(mkwTextUpdated, mkwText, mkwListStartIndex);
|
|
|
+ mkwIndex = sprintf(mkwTextUpdated + mkwListStartIndex, "#EXAMPLES_LIST_START\n");
|
|
|
+
|
|
|
+ for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
+ {
|
|
|
+ mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat("%s = \\\n", TextToUpper(exCategories[i])));
|
|
|
+
|
|
|
+ int exCount = 0;
|
|
|
+ rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], true, &exCount);
|
|
|
+
|
|
|
+ for (int x = 0; x < exCount - 1; x++) mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s \\\n", exCatList[x].category, exCatList[x].name));
|
|
|
+ mkwIndex += sprintf(mkwTextUpdated + mkwListStartIndex + mkwIndex, TextFormat(" %s/%s\n\n", exCatList[exCount - 1].category, exCatList[exCount - 1].name));
|
|
|
+
|
|
|
+ UnloadExamplesData(exCatList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add the remaining part of the original file
|
|
|
+ memcpy(mkwTextUpdated + mkwListStartIndex + mkwIndex, mkwText + mkwListEndIndex, strlen(mkwText) - mkwListEndIndex);
|
|
|
+
|
|
|
+ // TODO: Add new example target, considering resources
|
|
|
+
|
|
|
+ // Save updated file
|
|
|
+ SaveFileText(TextFormat("%s/Makefile.Web", exBasePath), mkwTextUpdated);
|
|
|
+ UnloadFileText(mkwText);
|
|
|
+ RL_FREE(mkwTextUpdated);
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib/examples/README.md --> Update from collection
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+ // NOTE: Using [examples_list.txt] to update/regen README.md
|
|
|
+ // Lines format: | 01 | [core_basic_window](core/core_basic_window.c) | <img src="core/core_basic_window.png" alt="core_basic_window" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
|
|
+ char *mdText = LoadFileText(TextFormat("%s/README.md", exBasePath));
|
|
|
+ char *mdTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated examples.js copy, 2MB
|
|
|
+
|
|
|
+ int mdListStartIndex = TextFindIndex(mdText, "| 01 | ");
|
|
|
+
|
|
|
+ int mdIndex = 0;
|
|
|
+ memcpy(mdTextUpdated, mdText, mdListStartIndex);
|
|
|
+
|
|
|
+ // NOTE: We keep a global examples counter
|
|
|
+ for (int i = 0, catCount = 0, gCount = 0; i < MAX_EXAMPLE_CATEGORIES; i++)
|
|
|
+ {
|
|
|
+ // Every category includes some introductory text, as it is quite short, just copying it here
|
|
|
+ // NOTE: "core" text already placed in the file
|
|
|
+ if (i == 1) // "shapes"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: shapes\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 2) // "textures"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: textures\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/rtextures.c) module.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 3) // "text"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: text\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib text functionality, including sprite fonts loading/generation and text drawing, provided by raylib [text](../src/rtext.c) module.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 4) // "models"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: models\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib models functionality, including models loading/generation and drawing, provided by raylib [models](../src/rmodels.c) module.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 5) // "shaders"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: shaders\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib shaders functionality, including shaders loading, parameters configuration and drawing using them (model shaders and postprocessing shaders). This functionality is directly provided by raylib [rlgl](../src/rlgl.c) module.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 6) // "audio"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: audio\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples using raylib audio functionality, including sound/music loading and playing. This functionality is provided by raylib [raudio](../src/raudio.c) module. Note this module can be used standalone independently of raylib.\n\n");
|
|
|
+ }
|
|
|
+ else if (i == 7) // "others"
|
|
|
+ {
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "\n### category: others\n\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ "Examples showing raylib misc functionality that does not fit in other categories, like standalone modules usage or examples integrating external libraries.\n\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (i > 0)
|
|
|
+ {
|
|
|
+ // Table header required
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |\n");
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex, "|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], false, &catCount);
|
|
|
+ for (int x = 0; x < catCount; x++)
|
|
|
+ {
|
|
|
+ char stars[16] = { 0 };
|
|
|
+ for (int s = 0; s < 4; s++)
|
|
|
+ {
|
|
|
+ if (s < exCatList[x].stars) strcpy(stars + 3*s, "⭐️");
|
|
|
+ else strcpy(stars + 3*s, "☆");
|
|
|
+ }
|
|
|
+
|
|
|
+ mdIndex += sprintf(mdTextUpdated + mdListStartIndex + mdIndex,
|
|
|
+ TextFormat("| %02i | [%s](%s/%s.c) | <img src=\"%s/%s.png\" alt=\"%s\" width=\"80\"> | %s | %.1f | %.1f | [%s](https://github.com/%s) |\n",
|
|
|
+ gCount + 1, exCatList[x].name, exCatList[x].category, exCatList[x].name, exCatList[x].category, exCatList[x].name, exCatList[x].name,
|
|
|
+ stars, exCatList[x].verCreated, exCatList[x].verUpdated, exCatList[x].author, exCatList[x].authorGitHub + 1));
|
|
|
+
|
|
|
+ gCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ UnloadExamplesData(exCatList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Save updated file
|
|
|
+ SaveFileText(TextFormat("%s/README.md", exBasePath), mdTextUpdated);
|
|
|
+ UnloadFileText(mdText);
|
|
|
+ RL_FREE(mdTextUpdated);
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // Edit: raylib.com/common/examples.js --> Update from collection
|
|
|
+ // NOTE: Entries format: exampleEntry('⭐️☆☆☆' , 'core' , 'basic_window'),
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+ char *jsText = LoadFileText(TextFormat("%s/../common/examples.js", exWebPath));
|
|
|
+ char *jsTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated examples.js copy, 2MB
|
|
|
+
|
|
|
+ int jsListStartIndex = TextFindIndex(jsText, "//EXAMPLE_DATA_LIST_START");
|
|
|
+ int jsListEndIndex = TextFindIndex(jsText, "//EXAMPLE_DATA_LIST_END");
|
|
|
+
|
|
|
+ int jsIndex = 0;
|
|
|
+ memcpy(jsTextUpdated, jsText, jsListStartIndex);
|
|
|
+ jsIndex = sprintf(jsTextUpdated + jsListStartIndex, "//EXAMPLE_DATA_LIST_START\n");
|
|
|
+ jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex, " var exampleData = [\n");
|
|
|
+
|
|
|
+ // NOTE: We avoid "others" category
|
|
|
+ for (int i = 0, exCount = 0; i < MAX_EXAMPLE_CATEGORIES - 1; i++)
|
|
|
+ {
|
|
|
+ rlExampleInfo *exCatList = LoadExamplesData(exCollectionListPath, exCategories[i], false, &exCount);
|
|
|
+ for (int x = 0; x < exCount; x++)
|
|
|
+ {
|
|
|
+ char stars[16] = { 0 };
|
|
|
+ for (int s = 0; s < 4; s++)
|
|
|
+ {
|
|
|
+ if (s < exCatList[x].stars) strcpy(stars + 3*s, "⭐️");
|
|
|
+ else strcpy(stars + 3*s, "☆");
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((i == 6) && (x == (exCount - 1)))
|
|
|
+ {
|
|
|
+ // NOTE: Last line to add, special case to consider
|
|
|
+ jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex,
|
|
|
+ TextFormat(" exampleEntry('%s', '%s', '%s')];\n", stars, exCatList[x].category, exCatList[x].name + strlen(exCatList[x].category) + 1));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex,
|
|
|
+ TextFormat(" exampleEntry('%s', '%s', '%s'),\n", stars, exCatList[x].category, exCatList[x].name + strlen(exCatList[x].category) + 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ UnloadExamplesData(exCatList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add the remaining part of the original file
|
|
|
+ memcpy(jsTextUpdated + jsListStartIndex + jsIndex, jsText + jsListEndIndex, strlen(jsText) - jsListEndIndex);
|
|
|
+
|
|
|
+ // Save updated file
|
|
|
+ SaveFileText(TextFormat("%s/../common/examples.js", exWebPath), jsTextUpdated);
|
|
|
+ UnloadFileText(jsText);
|
|
|
+ RL_FREE(jsTextUpdated);
|
|
|
+ //------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
// Load examples collection information
|
|
|
static rlExampleInfo *LoadExamplesData(const char *fileName, const char *category, bool sort, int *exCount)
|
|
|
{
|