diff options
Diffstat (limited to 'source/blender/nodes/shader/nodes/node_shader_tex_sky.cc')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_tex_sky.cc | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc b/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc index f5a4d087dbd..faa0c0f0888 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc @@ -4,6 +4,8 @@ #include "node_shader_util.hh" #include "sky_model.h" +#include "BLI_task.hh" + #include "BKE_context.h" #include "BKE_scene.h" @@ -36,7 +38,7 @@ static void node_shader_buts_tex_sky(uiLayout *layout, bContext *C, PointerRNA * if (RNA_enum_get(ptr, "sky_type") == SHD_SKY_NISHITA) { Scene *scene = CTX_data_scene(C); if (BKE_scene_uses_blender_eevee(scene)) { - uiItemL(layout, TIP_("Nishita not available in Eevee"), ICON_ERROR); + uiItemL(layout, TIP_("Sun disc not available in Eevee"), ICON_ERROR); } uiItemR(layout, ptr, "sun_disc", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, 0); @@ -60,7 +62,7 @@ static void node_shader_buts_tex_sky(uiLayout *layout, bContext *C, PointerRNA * } } -static void node_shader_init_tex_sky(bNodeTree *UNUSED(ntree), bNode *node) +static void node_shader_init_tex_sky(bNodeTree * /*ntree*/, bNode *node) { NodeTexSky *tex = MEM_cnew<NodeTexSky>("NodeTexSky"); BKE_texture_mapping_default(&tex->base.tex_mapping, TEXMAP_TYPE_POINT); @@ -144,7 +146,7 @@ static void sky_precompute_old(SkyModelPreetham *sunsky, const float sun_angles[ static int node_shader_gpu_tex_sky(GPUMaterial *mat, bNode *node, - bNodeExecData *UNUSED(execdata), + bNodeExecData * /*execdata*/, GPUNodeStack *in, GPUNodeStack *out) { @@ -179,7 +181,7 @@ static int node_shader_gpu_tex_sky(GPUMaterial *mat, GPU_uniform(xyz_to_rgb.g), GPU_uniform(xyz_to_rgb.b)); } - if (tex->sky_model == 1) { + else if (tex->sky_model == 1) { /* Hosek / Wilkie */ sun_angles[0] = fmin(M_PI_2, sun_angles[0]); /* clamp to horizon */ SKY_ArHosekSkyModelState *sky_state = SKY_arhosek_xyz_skymodelstate_alloc_init( @@ -187,12 +189,12 @@ static int node_shader_gpu_tex_sky(GPUMaterial *mat, /* Pass sky_state->configs[3][9] as 3*(vec4+vec4)+vec3 */ float config_x07[8], config_y07[8], config_z07[8], config_xyz8[3]; for (int i = 0; i < 8; ++i) { - config_x07[i] = (float)sky_state->configs[0][i]; - config_y07[i] = (float)sky_state->configs[1][i]; - config_z07[i] = (float)sky_state->configs[2][i]; + config_x07[i] = float(sky_state->configs[0][i]); + config_y07[i] = float(sky_state->configs[1][i]); + config_z07[i] = float(sky_state->configs[2][i]); } for (int i = 0; i < 3; ++i) { - config_xyz8[i] = (float)sky_state->configs[i][8]; + config_xyz8[i] = float(sky_state->configs[i][8]); } float radiance[3]; for (int i = 0; i < 3; i++) { @@ -219,8 +221,52 @@ static int node_shader_gpu_tex_sky(GPUMaterial *mat, GPU_uniform(xyz_to_rgb.g), GPU_uniform(xyz_to_rgb.b)); } + else { + /* Nishita */ + + Array<float> pixels(4 * GPU_SKY_WIDTH * GPU_SKY_HEIGHT); + + threading::parallel_for(IndexRange(GPU_SKY_HEIGHT), 2, [&](IndexRange range) { + SKY_nishita_skymodel_precompute_texture(pixels.data(), + 4, + range.first(), + range.one_after_last(), + GPU_SKY_WIDTH, + GPU_SKY_HEIGHT, + tex->sun_elevation, + tex->altitude, + tex->air_density, + tex->dust_density, + tex->ozone_density); + }); + + float sun_rotation = fmodf(tex->sun_rotation, 2.0f * M_PI); + if (sun_rotation < 0.0f) { + sun_rotation += 2.0f * M_PI; + } + sun_rotation = 2.0f * M_PI - sun_rotation; + + XYZ_to_RGB xyz_to_rgb; + get_XYZ_to_RGB_for_gpu(&xyz_to_rgb); - return GPU_stack_link(mat, node, "node_tex_sky_nishita", in, out); + eGPUSamplerState sampler = GPU_SAMPLER_REPEAT | GPU_SAMPLER_FILTER; + /* To fix pole issue we clamp the v coordinate. */ + sampler &= ~GPU_SAMPLER_REPEAT_T; + float layer; + GPUNodeLink *sky_texture = GPU_image_sky( + mat, GPU_SKY_WIDTH, GPU_SKY_HEIGHT, pixels.data(), &layer, sampler); + return GPU_stack_link(mat, + node, + "node_tex_sky_nishita", + in, + out, + GPU_constant(&sun_rotation), + GPU_uniform(xyz_to_rgb.r), + GPU_uniform(xyz_to_rgb.g), + GPU_uniform(xyz_to_rgb.b), + sky_texture, + GPU_constant(&layer)); + } } static void node_shader_update_sky(bNodeTree *ntree, bNode *node) @@ -262,11 +308,11 @@ void register_node_type_sh_tex_sky() ntype.declare = file_ns::node_declare; ntype.draw_buttons = file_ns::node_shader_buts_tex_sky; node_type_size_preset(&ntype, NODE_SIZE_MIDDLE); - node_type_init(&ntype, file_ns::node_shader_init_tex_sky); + ntype.initfunc = file_ns::node_shader_init_tex_sky; node_type_storage(&ntype, "NodeTexSky", node_free_standard_storage, node_copy_standard_storage); - node_type_gpu(&ntype, file_ns::node_shader_gpu_tex_sky); + ntype.gpu_fn = file_ns::node_shader_gpu_tex_sky; /* Remove vector input for Nishita sky model. */ - node_type_update(&ntype, file_ns::node_shader_update_sky); + ntype.updatefunc = file_ns::node_shader_update_sky; ntype.gather_link_search_ops = file_ns::node_gather_link_searches; nodeRegisterType(&ntype); |