Skip to content

Commit 10e50f4

Browse files
WIP
1 parent f7d3c02 commit 10e50f4

10 files changed

Lines changed: 146 additions & 71 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
data/
77
out/
88
out-temp/
9+
shader-temp/
910
user/
1011
game/
1112
app/

editor/app.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
307307
gptVfs->mount_directory("/fonts", "../data/pilotlight-assets-master/fonts", PL_VFS_MOUNT_FLAGS_NONE);
308308
gptVfs->mount_directory("/environments", "../data/pilotlight-assets-master/environments", PL_VFS_MOUNT_FLAGS_NONE);
309309
gptVfs->mount_directory("/shaders", "../shaders", PL_VFS_MOUNT_FLAGS_NONE);
310-
gptVfs->mount_directory("/shaders-temp", "../out-temp", PL_VFS_MOUNT_FLAGS_NONE);
310+
gptVfs->mount_directory("/shader-temp", "../shader-temp", PL_VFS_MOUNT_FLAGS_NONE);
311+
gptFile->create_directory("../shader-temp");
311312

312313
// defaults
313314
ptAppData->tSelectedEntity.uData = UINT64_MAX;
@@ -336,7 +337,7 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
336337
},
337338
.apcDirectories = {
338339
"/shaders/",
339-
"/shaders-temp/",
340+
"/shader-temp/",
340341
},
341342
.pcCacheOutputDirectory = "/shaders-temp/",
342343
// .tFlags = PL_SHADER_FLAGS_AUTO_OUTPUT | PL_SHADER_FLAGS_INCLUDE_DEBUG | PL_SHADER_FLAGS_ALWAYS_COMPILE

editor/editor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
156156
gptVfs->mount_directory("/fonts", "../data/pilotlight-assets-master/fonts", PL_VFS_MOUNT_FLAGS_NONE);
157157
gptVfs->mount_directory("/environments", "../data/pilotlight-assets-master/environments", PL_VFS_MOUNT_FLAGS_NONE);
158158
gptVfs->mount_directory("/shaders", "../shaders", PL_VFS_MOUNT_FLAGS_NONE);
159-
gptVfs->mount_directory("/shaders-temp", "../out-temp", PL_VFS_MOUNT_FLAGS_NONE);
159+
gptVfs->mount_directory("/shader-temp", "../shader-temp", PL_VFS_MOUNT_FLAGS_NONE);
160+
gptFile->create_directory("../shader-temp");
160161

161162
// defaults
162163
ptAppData->tSelectedEntity.uData = UINT64_MAX;

scripts/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
lines.append(' "program": "${workspaceFolder}/out/pilot_light",')
7070

7171
lines.append(' "request": "launch",')
72-
lines.append(' "args": ["-a", "app"],')
72+
lines.append(' "args": ["-a", "app", "-hr"],')
7373
lines.append(' "stopAtEntry": false,')
7474
lines.append(' "cwd": "${workspaceFolder}/out/",')
7575
lines.append(' "environment": []')

src/pl_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ Index of this file:
3131
// [SECTION] globals
3232
//-----------------------------------------------------------------------------
3333

34+
// options
35+
bool gbHotReloadActive = false;
36+
3437
// general
3538
plSharedLibrary* gptAppLibrary = NULL;
3639
void* gpUserData = NULL;

src/pl_main_glfw.cpp

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ int main(int argc, char *argv[])
201201
pcAppName = argv[i + 1];
202202
i++;
203203
}
204+
else if(strcmp(argv[i], "-hr") == 0 || strcmp(argv[i], "--hot-reload") == 0)
205+
{
206+
gbHotReloadActive = true;
207+
}
204208
else if(strcmp(argv[i], "--version") == 0)
205209
{
206210
printf("\nPilot Light - light weight game engine\n\n");
@@ -257,6 +261,8 @@ int main(int argc, char *argv[])
257261
printf("--apis %s\n", "Displays embedded apis.");
258262
printf("-a <app> %s\n", "Sets app to load. Default is 'editor'.");
259263
printf("--app <app> %s\n", "Sets app to load. Default is 'editor'.");
264+
printf("-hr %s\n", "Activates hot reloading.");
265+
printf("--hot-reload %s\n", "Activates hot reloading.");
260266
return 0;
261267
}
262268
}
@@ -448,7 +454,7 @@ int main(int argc, char *argv[])
448454
glfwPollEvents();
449455

450456
// reload library
451-
if(ptLibraryApi->has_changed(gptAppLibrary))
457+
if(gbHotReloadActive && ptLibraryApi->has_changed(gptAppLibrary))
452458
{
453459
pl_reload_library(gptAppLibrary);
454460
#ifdef _WIN32
@@ -1111,15 +1117,18 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
11111117
if(*pptLibraryOut == NULL)
11121118
{
11131119

1114-
DWORD dwAttrib = GetFileAttributes(pcCacheDirectory);
1115-
1116-
if(dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
1117-
{
1118-
// do nothing
1119-
}
1120-
else
1120+
if(gbHotReloadActive)
11211121
{
1122-
CreateDirectoryA(pcCacheDirectory, NULL);
1122+
DWORD dwAttrib = GetFileAttributes(pcCacheDirectory);
1123+
1124+
if(dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
1125+
{
1126+
// do nothing
1127+
}
1128+
else
1129+
{
1130+
CreateDirectoryA(pcCacheDirectory, NULL);
1131+
}
11231132
}
11241133

11251134
*pptLibraryOut = (plSharedLibrary*)PL_ALLOC(sizeof(plSharedLibrary));
@@ -1132,13 +1141,17 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
11321141
pl_str_get_directory(tDesc.pcName, ptLibrary->acDirectory, PL_MAX_PATH_LENGTH);
11331142

11341143
if(pl_str_get_file_extension(tDesc.pcName, ptLibrary->acFileExtension, 16) == NULL)
1135-
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
1144+
strncpy(ptLibrary->acFileExtension, "dll", 16);
11361145

11371146
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
1138-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1139-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1147+
1148+
if(gbHotReloadActive)
1149+
{
1150+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1151+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1152+
}
11401153

1141-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
1154+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
11421155
{
11431156

11441157
char acTemporaryName[PL_MAX_PATH_LENGTH] = {0};
@@ -1164,7 +1177,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
11641177
ptLibrary = *pptLibraryOut;
11651178

11661179

1167-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
1180+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
11681181
{
11691182

11701183
ptLibrary->bValid = false;
@@ -1235,10 +1248,13 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
12351248
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
12361249

12371250
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
1238-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1239-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1251+
if(gbHotReloadActive)
1252+
{
1253+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1254+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1255+
}
12401256

1241-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
1257+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
12421258
{
12431259
ptLibrary->tLastWriteTime = pl__get_last_write_time(ptLibrary->acPath);
12441260
ptLibrary->handle = NULL;
@@ -1254,7 +1270,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
12541270
else
12551271
ptLibrary = *pptLibraryOut;
12561272

1257-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
1273+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
12581274
{
12591275
ptLibrary->bValid = false;
12601276

@@ -1320,10 +1336,13 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
13201336
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
13211337

13221338
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
1323-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1324-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1339+
if(gbHotReloadActive)
1340+
{
1341+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
1342+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
1343+
}
13251344

1326-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
1345+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
13271346
{
13281347
ptLibrary->tLastWriteTime = pl__get_last_write_time(ptLibrary->acPath);
13291348
ptLibrary->handle = NULL;
@@ -1339,7 +1358,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
13391358
else
13401359
ptLibrary = *pptLibraryOut;
13411360

1342-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
1361+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
13431362
{
13441363
ptLibrary->bValid = false;
13451364

src/pl_main_macos.m

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ int main(int argc, char *argv[])
160160
pcAppName = argv[i + 1];
161161
i++;
162162
}
163+
else if(strcmp(argv[i], "-hr") == 0 || strcmp(argv[i], "--hot-reload") == 0)
164+
{
165+
gbHotReloadActive = true;
166+
}
163167
else if(strcmp(argv[i], "--version") == 0)
164168
{
165169
printf("\nPilot Light - light weight game engine\n\n");
@@ -216,6 +220,8 @@ int main(int argc, char *argv[])
216220
printf("--apis %s\n", "Displays embedded apis.");
217221
printf("-a <app> %s\n", "Sets app to load. Default is 'app'.");
218222
printf("--app <app> %s\n", "Sets app to load. Default is 'app'.");
223+
printf("-hr %s\n", "Activates hot reloading.");
224+
printf("--hot-reload %s\n", "Activates hot reloading.");
219225
return 0;
220226
}
221227
}
@@ -561,7 +567,7 @@ - (void)renderToMetalLayer:(nonnull CAMetalLayer *)layer
561567
gptIOCtx->bCursorChanged = false;
562568

563569
// reload library
564-
if(gptLibraryApi->has_changed(gptAppLibrary))
570+
if(gbHotReloadActive && gptLibraryApi->has_changed(gptAppLibrary))
565571
{
566572
pl_reload_library(gptAppLibrary);
567573
pl_app_load = (void* (__attribute__(()) *)(const plApiRegistryI*, void*)) gptLibraryApi->load_function(gptAppLibrary, "pl_app_load");
@@ -953,10 +959,13 @@ - (void)unmarkText
953959
strncpy(ptLibrary->acFileExtension, "dylib", 16);
954960

955961
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
956-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
957-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
962+
if(gbHotReloadActive)
963+
{
964+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
965+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
966+
}
958967

959-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
968+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
960969
{
961970
ptLibrary->tLastWriteTime = pl__get_last_write_time(ptLibrary->acPath);
962971
ptLibrary->handle = NULL;
@@ -972,7 +981,7 @@ - (void)unmarkText
972981
else
973982
ptLibrary = *pptLibraryOut;
974983

975-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
984+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
976985
{
977986
ptLibrary->bValid = false;
978987

src/pl_main_null.c

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ int main(int argc, char *argv[])
120120
pcAppName = argv[i + 1];
121121
i++;
122122
}
123+
else if(strcmp(argv[i], "-hr") == 0 || strcmp(argv[i], "--hot-reload") == 0)
124+
{
125+
gbHotReloadActive = true;
126+
}
123127
else if(strcmp(argv[i], "--version") == 0)
124128
{
125129
printf("\nPilot Light - light weight game engine\n\n");
@@ -176,6 +180,8 @@ int main(int argc, char *argv[])
176180
printf("--extensions %s\n", "Displays embedded extensions.");
177181
printf("-a <app> %s\n", "Sets app to load. Default is 'app'.");
178182
printf("--app <app> %s\n", "Sets app to load. Default is 'app'.");
183+
printf("-hr %s\n", "Activates hot reloading.");
184+
printf("--hot-reload %s\n", "Activates hot reloading.");
179185
return 0;
180186
}
181187
}
@@ -418,15 +424,18 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
418424
if(*pptLibraryOut == NULL)
419425
{
420426

421-
DWORD dwAttrib = GetFileAttributes(pcCacheDirectory);
422-
423-
if(dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
424-
{
425-
// do nothing
426-
}
427-
else
427+
if(gbHotReloadActive)
428428
{
429-
CreateDirectoryA(pcCacheDirectory, NULL);
429+
DWORD dwAttrib = GetFileAttributes(pcCacheDirectory);
430+
431+
if(dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
432+
{
433+
// do nothing
434+
}
435+
else
436+
{
437+
CreateDirectoryA(pcCacheDirectory, NULL);
438+
}
430439
}
431440

432441
*pptLibraryOut = PL_ALLOC(sizeof(plSharedLibrary));
@@ -439,13 +448,17 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
439448
pl_str_get_directory(tDesc.pcName, ptLibrary->acDirectory, PL_MAX_PATH_LENGTH);
440449

441450
if(pl_str_get_file_extension(tDesc.pcName, ptLibrary->acFileExtension, 16) == NULL)
442-
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
451+
strncpy(ptLibrary->acFileExtension, "dll", 16);
443452

444453
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
445-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
446-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
454+
455+
if(gbHotReloadActive)
456+
{
457+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
458+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
459+
}
447460

448-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
461+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
449462
{
450463

451464
char acTemporaryName[PL_MAX_PATH_LENGTH] = {0};
@@ -471,7 +484,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
471484
ptLibrary = *pptLibraryOut;
472485

473486

474-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
487+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
475488
{
476489

477490
ptLibrary->bValid = false;
@@ -542,10 +555,13 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
542555
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
543556

544557
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
545-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
546-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
558+
if(gbHotReloadActive)
559+
{
560+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
561+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
562+
}
547563

548-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
564+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
549565
{
550566
ptLibrary->tLastWriteTime = pl__get_last_write_time(ptLibrary->acPath);
551567
ptLibrary->handle = NULL;
@@ -561,7 +577,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
561577
else
562578
ptLibrary = *pptLibraryOut;
563579

564-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
580+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
565581
{
566582
ptLibrary->bValid = false;
567583

@@ -627,10 +643,13 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
627643
strncpy(ptLibrary->acFileExtension, gpcLibraryExtension, 16);
628644

629645
pl_sprintf(ptLibrary->acPath, "%s%s.%s", ptLibrary->acDirectory, ptLibrary->acName, ptLibrary->acFileExtension);
630-
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
631-
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
646+
if(gbHotReloadActive)
647+
{
648+
pl_sprintf(ptLibrary->acLockFile, "%s%s", ptLibrary->acDirectory, pcLockFile);
649+
pl_sprintf(ptLibrary->acTransitionalPath, "%s/%s_", pcCacheDirectory, ptLibrary->acName);
650+
}
632651

633-
if(!(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
652+
if(!gbHotReloadActive || !(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE))
634653
{
635654
ptLibrary->tLastWriteTime = pl__get_last_write_time(ptLibrary->acPath);
636655
ptLibrary->handle = NULL;
@@ -646,7 +665,7 @@ pl_load_library(plLibraryDesc tDesc, plSharedLibrary** pptLibraryOut)
646665
else
647666
ptLibrary = *pptLibraryOut;
648667

649-
if(tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
668+
if(gbHotReloadActive && tDesc.tFlags & PL_LIBRARY_FLAGS_RELOADABLE)
650669
{
651670
ptLibrary->bValid = false;
652671

0 commit comments

Comments
 (0)