Skip to content

Commit 1406e92

Browse files
committed
Viewer: show all LUTs
1 parent fd6a72c commit 1406e92

File tree

3 files changed

+73
-79
lines changed

3 files changed

+73
-79
lines changed

.gitignore

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
out/*
33
build/*
44
.DS_Store
5-
tests/luts/*.out.cube
6-
tests/luts/*/*.out.cube
5+
*.cube.txt
6+
*.smcube

src/smol_cube_conv_app.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ int main(int argc, const char** argv)
175175
}
176176
}
177177
}
178-
output_file = input_file.substr(0, last_dot_pos) + ".out.cube";
178+
output_file = input_file.substr(0, last_dot_pos) + ".cube.txt";
179179
if (verbose)
180180
{
181181
printf("- Output roundtrip file '%s'\n", output_file.c_str());

src/smol_cube_viewer_app.cpp

+70-76
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "smol_cube.h"
22
#include <string>
3+
#include <filesystem>
34

45
#define SOKOL_IMPL
56
#if defined(__APPLE__)
@@ -19,6 +20,25 @@
1920
#define STBI_ONLY_JPEG
2021
#include "../libs/stb_image.h"
2122

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+
2242
static const char* kSokolVertexSource =
2343
#if defined(SOKOL_METAL) || defined(SOKOL_D3D11)
2444
// HLSL / Metal
@@ -157,7 +177,10 @@ static sg_image load_lut(const char* path, float& lut_size)
157177
uint64_t t0 = stm_now();
158178
smcube_luts* luts = smcube_load_from_file(path);
159179
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+
}
161184

162185
for (size_t li = 0, ln = smcube_get_count(luts); li != ln; ++li)
163186
{
@@ -251,12 +274,10 @@ static sg_image load_lut(const char* path, float& lut_size)
251274
s_cur_lut_load_time = float(stm_ms(stm_diff(t1, t0)));
252275
s_cur_lut_size = sizex;
253276

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);
260281
break;
261282
}
262283
smcube_free(luts);
@@ -276,6 +297,8 @@ struct frame_uniforms {
276297
};
277298
static frame_uniforms gr_uniforms = { 1.0f, 4.0f };
278299

300+
static bool s_do_quit = false;
301+
279302
static void sapp_init(void)
280303
{
281304
// graphics
@@ -284,14 +307,22 @@ static void sapp_init(void)
284307
setup_desc.logger.func = slog_func;
285308
sg_setup(&setup_desc);
286309

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+
287317
// load images
288318
gr_tex_photo1 = load_image("tests/photo1.jpg");
289319
gr_tex_photo2 = load_image("tests/photo2.jpg");
290320
gr_tex_photo3 = load_image("tests/photo3.jpg");
291321
gr_tex_photo4 = load_image("tests/photo4.jpg");
292322

293323
// 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);
295326

296327
// sampler
297328
sg_sampler_desc smp_desc = {};
@@ -334,8 +365,13 @@ static void sapp_init(void)
334365

335366
static void sapp_frame(void)
336367
{
368+
if (s_do_quit)
369+
{
370+
sapp_quit();
371+
return;
372+
}
337373
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));
339375
sapp_set_window_title(buf);
340376

341377
sg_pass pass = {};
@@ -365,6 +401,15 @@ static void sapp_cleanup(void)
365401
sg_shutdown();
366402
}
367403

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+
368413
static void sapp_onevent(const sapp_event* evt)
369414
{
370415
if (evt->type == SAPP_EVENTTYPE_KEY_DOWN)
@@ -385,87 +430,36 @@ static void sapp_onevent(const sapp_event* evt)
385430
if (gr_uniforms.lut_intensity < 0.0f)
386431
gr_uniforms.lut_intensity = 0.0f;
387432
}
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)
394434
{
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();
397439
}
398-
if (evt->key_code == SAPP_KEYCODE_3)
440+
if (evt->key_code == SAPP_KEYCODE_RIGHT)
399441
{
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();
402446
}
403-
if (evt->key_code == SAPP_KEYCODE_4)
447+
if (evt->key_code == SAPP_KEYCODE_SPACE)
404448
{
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();
407450
}
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)
459452
{
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();
462455
}
463456
}
464457
}
465458

466459
sapp_desc sokol_main(int argc, char* argv[])
467460
{
468461
(void)argc; (void)argv;
462+
469463
stm_setup();
470464

471465
// figure out where is the data folder

0 commit comments

Comments
 (0)