From dac7efde266dd5b558bfc6fe8a65aa65dfc0916d Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 13 Apr 2024 17:54:00 +0300 Subject: [PATCH] IBL --- src/CRE/light_param.cpp | 18 ++++++++++-------- src/KKdLib/light_param/ibl.cpp | 4 +++- src/KKdLib/light_param/ibl.hpp | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index 974b1310..704dcf6d 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -38,7 +38,7 @@ struct light_param_data { static void set_glow(const light_param_glow* glow); static void set_fog(const light_param_fog* f); static void set_ibl(const light_param_ibl* ibl, const light_param_data_storage* storage); - static void set_ibl_diffuse(const light_param_ibl_diffuse* diffuse, const int32_t level); + static void set_ibl_diffuse(const light_param_ibl_diffuse* diffuse); static void set_ibl_specular(const light_param_ibl_specular* specular); static void set_light(const light_param_light* light); static void set_wind(const light_param_wind* w); @@ -520,8 +520,8 @@ void light_param_data::set_ibl(const light_param_ibl* ibl, const light_param_dat glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 1); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - light_param_data::set_ibl_diffuse(&ibl->diffuse[0], 0); - light_param_data::set_ibl_diffuse(&ibl->diffuse[1], 1); + light_param_data::set_ibl_diffuse(&ibl->diffuse[0]); + light_param_data::set_ibl_diffuse(&ibl->diffuse[1]); } else { glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, ibl->specular[j].max_level); @@ -559,11 +559,14 @@ void light_param_data::set_ibl(const light_param_ibl* ibl, const light_param_dat l->set_ibl_direction(ibl->lit_dir[1]); } -void light_param_data::set_ibl_diffuse(const light_param_ibl_diffuse* diffuse, const int32_t level) { +void light_param_data::set_ibl_diffuse(const light_param_ibl_diffuse* diffuse) { + if (!diffuse->data.size()) + return; + int32_t size = diffuse->size; + const int32_t level = diffuse->level; const half_t* data = diffuse->data.data(); - size_t data_size = size; - data_size = 4 * data_size * data_size; + size_t data_size = diffuse->data.size() / 6; glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, GL_RGBA16F, size, size, 0, GL_RGBA, GL_HALF_FLOAT, &data[data_size * 0]); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, GL_RGBA16F, @@ -583,8 +586,7 @@ void light_param_data::set_ibl_specular(const light_param_ibl_specular* specular int32_t max_level = specular->max_level; for (int32_t i = 0; i <= max_level; i++, size /= 2) { const half_t* data = specular->data[i].data(); - size_t data_size = size; - data_size = 4 * data_size * data_size; + size_t data_size = specular->data[i].size() / 6; glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, i, GL_RGBA16F, size, size, 0, GL_RGBA, GL_HALF_FLOAT, &data[data_size * 0]); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, i, GL_RGBA16F, diff --git a/src/KKdLib/light_param/ibl.cpp b/src/KKdLib/light_param/ibl.cpp index 9846c090..4083df38 100644 --- a/src/KKdLib/light_param/ibl.cpp +++ b/src/KKdLib/light_param/ibl.cpp @@ -67,7 +67,7 @@ bool light_param_ibl::load_file(void* data, const char* path, const char* file, return ibl->ready; } -light_param_ibl_diffuse::light_param_ibl_diffuse() : data(), size() { +light_param_ibl_diffuse::light_param_ibl_diffuse() : data(), size(), level() { } @@ -195,6 +195,8 @@ static void light_param_ibl_read_inner(light_param_ibl* ibl, stream& s) { light_param_ibl_diffuse* diffuse = &ibl->diffuse[i]; diffuse->data = std::vector(size * 6); diffuse->size = widths[i]; + diffuse->level = i; + for (int32_t k = 0; k < 6; k++, dh += size) memcpy(&diffuse->data[size * k], dh, sizeof(half_t) * size); } diff --git a/src/KKdLib/light_param/ibl.hpp b/src/KKdLib/light_param/ibl.hpp index 062d7037..a5066e69 100644 --- a/src/KKdLib/light_param/ibl.hpp +++ b/src/KKdLib/light_param/ibl.hpp @@ -14,6 +14,7 @@ struct light_param_ibl_diffuse { std::vector data; int32_t size; + int32_t level; light_param_ibl_diffuse(); ~light_param_ibl_diffuse();