From 1b3c792d8532c2e88b53c05706d0a4f61a2d1206 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Fri, 14 Jun 2024 09:27:57 -0700 Subject: [PATCH] Add default material palette to cubegen --- dev/src/cubegen.cpp | 31 +++++++++++++++++++++---------- dev/src/lobster/cubegen.h | 1 + 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/dev/src/cubegen.cpp b/dev/src/cubegen.cpp index c87baaf6..0d133b61 100644 --- a/dev/src/cubegen.cpp +++ b/dev/src/cubegen.cpp @@ -197,6 +197,15 @@ uint8_t FindClosestNormalCached(float3 normal) { const size_t palette_size = 256 * sizeof(byte4); +size_t NewPaletteInit(const byte4 *p) { + auto hash = FNV1A64(string_view((const char *)p, palette_size)); + palettes.emplace_back(Palette{}); + auto &palette = palettes.back(); + palette.hash = hash; + palette.colors.insert(palette.colors.end(), p, p + 256); + return palettes.size() - 1; +} + size_t NewPalette(const byte4 *p) { auto hash = FNV1A64(string_view((const char *)p, palette_size)); // See if there's an existing matching palette. @@ -207,24 +216,28 @@ size_t NewPalette(const byte4 *p) { } } // Need to create a new one. - palettes.emplace_back(Palette{}); - auto &palette = palettes.back(); - palette.hash = hash; - palette.colors.insert(palette.colors.end(), p, p + 256); - return palettes.size() - 1; + return NewPaletteInit(p); +} + +void MaterialPalette(vector &pal) { + for (auto &c : pal) { + if (c.w) c.w = 0x80; // High bit is alpha, low bits are material properties. + } } Voxels *NewWorld(const int3 &size, size_t palette_idx) { auto v = new Voxels(size, palette_idx); if (palettes.empty()) { // Guarantees init of default_palette_idx (0) and normal_palette_idx (1). - NewPalette((byte4 *)default_palette); + NewPaletteInit((byte4 *)default_palette); vector normal_palette; normal_palette.resize(256, quantizec(float3(0.5), 0)); for (uint8_t i = 0; i < normal_table_size; i++) { normal_palette[i] = quantizec((default_normals[i] + 1) / 2, 0); } - NewPalette(normal_palette.data()); + NewPaletteInit(normal_palette.data()); + NewPaletteInit((byte4 *)default_palette); + MaterialPalette(palettes[2].colors); } return v; } @@ -631,9 +644,7 @@ nfr("load_vox", "name,material_palette", "SI?", "R:voxels]S?", vector palette; auto palette_init_materials = [&]() { if (material_palette.True()) { - for (auto &c : palette) { - if (c.w) c.w = 0x80; // High bit is alpha, low bits are material properties. - } + MaterialPalette(palette); } }; auto clone_if_default = [&]() { diff --git a/dev/src/lobster/cubegen.h b/dev/src/lobster/cubegen.h index 770627bd..13cb7c28 100644 --- a/dev/src/lobster/cubegen.h +++ b/dev/src/lobster/cubegen.h @@ -24,6 +24,7 @@ struct Palette { const size_t default_palette_idx = 0; const size_t normal_palette_idx = 1; +const size_t default_material_palette_idx = 2; extern vector palettes;