1
1
#include " smol_cube.h"
2
2
#include < string>
3
+ #include < filesystem>
3
4
4
5
#define SOKOL_IMPL
5
6
#if defined(__APPLE__)
19
20
#define STBI_ONLY_JPEG
20
21
#include " ../libs/stb_image.h"
21
22
23
+ static std::vector<std::string> s_lut_files;
24
+ static int s_lut_index = 0 ;
25
+
26
+ static std::vector<std::string> find_lut_files (const std::string& directory, const std::string& extension1, const std::string& extension2)
27
+ {
28
+ std::vector<std::string> files;
29
+ for (const auto & entry : std::filesystem::directory_iterator (directory))
30
+ {
31
+ if (!entry.is_regular_file ())
32
+ continue ;
33
+ auto entry_ext = entry.path ().extension ();
34
+ if (entry_ext == extension1 || entry_ext == extension2)
35
+ {
36
+ files.push_back (entry.path ().string ());
37
+ }
38
+ }
39
+ return files;
40
+ }
41
+
22
42
static const char * kSokolVertexSource =
23
43
#if defined(SOKOL_METAL) || defined(SOKOL_D3D11)
24
44
// HLSL / Metal
@@ -157,7 +177,10 @@ static sg_image load_lut(const char* path, float& lut_size)
157
177
uint64_t t0 = stm_now ();
158
178
smcube_luts* luts = smcube_load_from_file (path);
159
179
if (luts == nullptr )
160
- return tex;
180
+ {
181
+ slog_func (" smol-cube" , 1 , 0 , " Failed to load LUT file" , 1 , path, nullptr );
182
+ return create_empty_lut (lut_size);
183
+ }
161
184
162
185
for (size_t li = 0 , ln = smcube_get_count (luts); li != ln; ++li)
163
186
{
@@ -251,12 +274,10 @@ static sg_image load_lut(const char* path, float& lut_size)
251
274
s_cur_lut_load_time = float (stm_ms (stm_diff (t1, t0)));
252
275
s_cur_lut_size = sizex;
253
276
254
- const char * fnamepos = strrchr (path, ' /' );
255
- if (fnamepos == nullptr )
256
- fnamepos = path;
257
- else
258
- fnamepos++;
259
- s_cur_lut_title = fnamepos;
277
+ s_cur_lut_title = path;
278
+ size_t fnamepos = s_cur_lut_title.find_last_of (" /\\ " );
279
+ if (fnamepos != std::string::npos)
280
+ s_cur_lut_title = s_cur_lut_title.substr (fnamepos + 1 );
260
281
break ;
261
282
}
262
283
smcube_free (luts);
@@ -276,6 +297,8 @@ struct frame_uniforms {
276
297
};
277
298
static frame_uniforms gr_uniforms = { 1 .0f , 4 .0f };
278
299
300
+ static bool s_do_quit = false ;
301
+
279
302
static void sapp_init (void )
280
303
{
281
304
// graphics
@@ -284,14 +307,22 @@ static void sapp_init(void)
284
307
setup_desc.logger .func = slog_func;
285
308
sg_setup (&setup_desc);
286
309
310
+ s_lut_files = find_lut_files (" ./tests/luts" , " .cube" , " .smcube" );
311
+ if (s_lut_files.empty ())
312
+ {
313
+ s_do_quit = true ;
314
+ return ;
315
+ }
316
+
287
317
// load images
288
318
gr_tex_photo1 = load_image (" tests/photo1.jpg" );
289
319
gr_tex_photo2 = load_image (" tests/photo2.jpg" );
290
320
gr_tex_photo3 = load_image (" tests/photo3.jpg" );
291
321
gr_tex_photo4 = load_image (" tests/photo4.jpg" );
292
322
293
323
// load LUT
294
- gr_tex_lut = load_lut (" tests/luts/tinyglade-Bluecine_75.cube" , gr_uniforms.lut_size );
324
+ s_lut_index = s_lut_files.size () - 1 ;
325
+ gr_tex_lut = load_lut (s_lut_files[s_lut_index].c_str (), gr_uniforms.lut_size );
295
326
296
327
// sampler
297
328
sg_sampler_desc smp_desc = {};
@@ -334,8 +365,13 @@ static void sapp_init(void)
334
365
335
366
static void sapp_frame (void )
336
367
{
368
+ if (s_do_quit)
369
+ {
370
+ sapp_quit ();
371
+ return ;
372
+ }
337
373
char buf[1000 ];
338
- snprintf (buf, sizeof (buf), " %s. Current LUT: %s (%i%%) size %i loaded in %.2fms" , kBaseWindowTitle , s_cur_lut_title.c_str (), (int )(gr_uniforms.lut_intensity * 100 .0f ), s_cur_lut_size, s_cur_lut_load_time );
374
+ snprintf (buf, sizeof (buf), " %s. LUT %i/%i: %s size %i load %.2fms (%i%%) " , kBaseWindowTitle , s_lut_index+ 1 , int (s_lut_files. size ()), s_cur_lut_title.c_str (), s_cur_lut_size, s_cur_lut_load_time, (int )(gr_uniforms.lut_intensity * 100 .0f ));
339
375
sapp_set_window_title (buf);
340
376
341
377
sg_pass pass = {};
@@ -365,6 +401,15 @@ static void sapp_cleanup(void)
365
401
sg_shutdown ();
366
402
}
367
403
404
+ static void reload_lut ()
405
+ {
406
+ sg_destroy_image (gr_tex_lut);
407
+ if (s_lut_index == -1 )
408
+ gr_tex_lut = create_empty_lut (gr_uniforms.lut_size );
409
+ else
410
+ gr_tex_lut = load_lut (s_lut_files[s_lut_index].c_str (), gr_uniforms.lut_size );
411
+ }
412
+
368
413
static void sapp_onevent (const sapp_event* evt)
369
414
{
370
415
if (evt->type == SAPP_EVENTTYPE_KEY_DOWN)
@@ -385,87 +430,36 @@ static void sapp_onevent(const sapp_event* evt)
385
430
if (gr_uniforms.lut_intensity < 0 .0f )
386
431
gr_uniforms.lut_intensity = 0 .0f ;
387
432
}
388
- if (evt->key_code == SAPP_KEYCODE_1)
389
- {
390
- sg_destroy_image (gr_tex_lut);
391
- gr_tex_lut = create_empty_lut (gr_uniforms.lut_size );
392
- }
393
- if (evt->key_code == SAPP_KEYCODE_2)
433
+ if (evt->key_code == SAPP_KEYCODE_LEFT)
394
434
{
395
- sg_destroy_image (gr_tex_lut);
396
- gr_tex_lut = load_lut (" tests/luts/tinyglade-Bluecine_75.cube" , gr_uniforms.lut_size );
435
+ s_lut_index--;
436
+ if (s_lut_index < -1 )
437
+ s_lut_index = -1 ;
438
+ reload_lut ();
397
439
}
398
- if (evt->key_code == SAPP_KEYCODE_3 )
440
+ if (evt->key_code == SAPP_KEYCODE_RIGHT )
399
441
{
400
- sg_destroy_image (gr_tex_lut);
401
- gr_tex_lut = load_lut (" tests/luts/tinyglade-Cold_Ice.cube" , gr_uniforms.lut_size );
442
+ s_lut_index++;
443
+ if (s_lut_index >= s_lut_files.size ())
444
+ s_lut_index = int (s_lut_files.size ())-1 ;
445
+ reload_lut ();
402
446
}
403
- if (evt->key_code == SAPP_KEYCODE_4 )
447
+ if (evt->key_code == SAPP_KEYCODE_SPACE )
404
448
{
405
- sg_destroy_image (gr_tex_lut);
406
- gr_tex_lut = load_lut (" tests/luts/tinyglade-LUNA_COLOR.cube" , gr_uniforms.lut_size );
449
+ reload_lut ();
407
450
}
408
- if (evt->key_code == SAPP_KEYCODE_R)
409
- {
410
- sg_destroy_image (gr_tex_lut);
411
- gr_tex_lut = load_lut (" tests/luts/tinyglade-LUNA_COLOR_float3.smcube" , gr_uniforms.lut_size );
412
- }
413
- if (evt->key_code == SAPP_KEYCODE_F)
414
- {
415
- sg_destroy_image (gr_tex_lut);
416
- gr_tex_lut = load_lut (" tests/luts/tinyglade-LUNA_COLOR_half4.smcube" , gr_uniforms.lut_size );
417
- }
418
- if (evt->key_code == SAPP_KEYCODE_5)
419
- {
420
- sg_destroy_image (gr_tex_lut);
421
- gr_tex_lut = load_lut (" tests/luts/tinyglade-Sam_Kolder.cube" , gr_uniforms.lut_size );
422
- }
423
- if (evt->key_code == SAPP_KEYCODE_6)
424
- {
425
- sg_destroy_image (gr_tex_lut);
426
- gr_tex_lut = load_lut (" tests/luts/khronos-pbrNeutral.cube" , gr_uniforms.lut_size );
427
- }
428
- if (evt->key_code == SAPP_KEYCODE_T)
429
- {
430
- sg_destroy_image (gr_tex_lut);
431
- gr_tex_lut = load_lut (" tests/luts/khronos-pbrNeutral_float3.smcube" , gr_uniforms.lut_size );
432
- }
433
- if (evt->key_code == SAPP_KEYCODE_G)
434
- {
435
- sg_destroy_image (gr_tex_lut);
436
- gr_tex_lut = load_lut (" tests/luts/khronos-pbrNeutral_half4.smcube" , gr_uniforms.lut_size );
437
- }
438
- if (evt->key_code == SAPP_KEYCODE_B)
439
- {
440
- sg_destroy_image (gr_tex_lut);
441
- gr_tex_lut = load_lut (" tests/luts/khronos-pbrNeutral_half4_nofilter.smcube" , gr_uniforms.lut_size );
442
- }
443
- if (evt->key_code == SAPP_KEYCODE_7)
444
- {
445
- sg_destroy_image (gr_tex_lut);
446
- gr_tex_lut = load_lut (" tests/luts/resolve-DCI-P3 Kodak 2383 D65.cube" , gr_uniforms.lut_size );
447
- }
448
- if (evt->key_code == SAPP_KEYCODE_8)
449
- {
450
- sg_destroy_image (gr_tex_lut);
451
- gr_tex_lut = load_lut (" tests/luts/resolve-LMT ACES v0.1.1.cube" , gr_uniforms.lut_size );
452
- }
453
- if (evt->key_code == SAPP_KEYCODE_I)
454
- {
455
- sg_destroy_image (gr_tex_lut);
456
- gr_tex_lut = load_lut (" tests/luts/resolve-LMT ACES v0.1.1_float3.smcube" , gr_uniforms.lut_size );
457
- }
458
- if (evt->key_code == SAPP_KEYCODE_K)
451
+ if (evt->key_code == SAPP_KEYCODE_1)
459
452
{
460
- sg_destroy_image (gr_tex_lut) ;
461
- gr_tex_lut = load_lut ( " tests/luts/resolve-LMT ACES v0.1.1_half4.smcube " , gr_uniforms. lut_size );
453
+ s_lut_index = - 1 ;
454
+ reload_lut ( );
462
455
}
463
456
}
464
457
}
465
458
466
459
sapp_desc sokol_main (int argc, char * argv[])
467
460
{
468
461
(void )argc; (void )argv;
462
+
469
463
stm_setup ();
470
464
471
465
// figure out where is the data folder
0 commit comments