45 layout->
label(
RPT_(
"Sun disc not available in EEVEE"), ICON_ERROR);
99 float ctheta =
cosf(theta);
100 float cgamma =
cosf(gamma);
102 return (1.0 + lam[0] *
expf(lam[1] / ctheta)) *
103 (1.0 + lam[2] *
expf(lam[3] * gamma) + lam[4] * cgamma * cgamma);
108 float theta = sun_angles[0];
109 float theta2 = theta * theta;
110 float theta3 = theta2 * theta;
113 float chi = (4.0f / 9.0f -
T / 120.0f) * (
M_PI - 2.0f * theta);
115 sunsky->
radiance[0] = (4.0453f *
T - 4.9710f) *
tanf(chi) - 0.2155f *
T + 2.4192f;
118 sunsky->
radiance[1] = (0.00166f * theta3 - 0.00375f * theta2 + 0.00209f * theta) *
T2 +
119 (-0.02903f * theta3 + 0.06377f * theta2 - 0.03202f * theta + 0.00394f) *
121 (0.11693f * theta3 - 0.21196f * theta2 + 0.06052f * theta + 0.25886f);
123 sunsky->
radiance[2] = (0.00275f * theta3 - 0.00610f * theta2 + 0.00317f * theta) *
T2 +
124 (-0.04214f * theta3 + 0.08970f * theta2 - 0.04153f * theta + 0.00516f) *
126 (0.15346f * theta3 - 0.26756f * theta2 + 0.06670f * theta + 0.26688f);
128 sunsky->
config_Y[0] = (0.1787f *
T - 1.4630f);
129 sunsky->
config_Y[1] = (-0.3554f *
T + 0.4275f);
130 sunsky->
config_Y[2] = (-0.0227f *
T + 5.3251f);
131 sunsky->
config_Y[3] = (0.1206f *
T - 2.5771f);
132 sunsky->
config_Y[4] = (-0.0670f *
T + 0.3703f);
134 sunsky->
config_x[0] = (-0.0193f *
T - 0.2592f);
135 sunsky->
config_x[1] = (-0.0665f *
T + 0.0008f);
136 sunsky->
config_x[2] = (-0.0004f *
T + 0.2125f);
137 sunsky->
config_x[3] = (-0.0641f *
T - 0.8989f);
138 sunsky->
config_x[4] = (-0.0033f *
T + 0.0452f);
140 sunsky->
config_y[0] = (-0.0167f *
T - 0.2608f);
141 sunsky->
config_y[1] = (-0.0950f *
T + 0.0092f);
142 sunsky->
config_y[2] = (-0.0079f *
T + 0.2102f);
143 sunsky->
config_y[3] = (-0.0441f *
T - 1.6537f);
144 sunsky->
config_y[4] = (-0.0109f *
T + 0.0529f);
155 float new_sun_elevation = sun_elevation;
156 float new_sun_rotation = sun_rotation;
159 new_sun_elevation =
fmodf(new_sun_elevation, 2.0f *
M_PI);
162 new_sun_elevation -=
copysignf(2.0f, new_sun_elevation) *
M_PI;
166 if (new_sun_elevation >=
M_PI / 2.0f || new_sun_elevation <= -
M_PI / 2.0f) {
167 new_sun_elevation =
copysignf(
M_PI, new_sun_elevation) - new_sun_elevation;
168 new_sun_rotation +=
M_PI;
172 new_sun_rotation =
fmodf(new_sun_rotation, 2.0f *
M_PI);
174 if (new_sun_rotation < 0.0f) {
175 new_sun_rotation += 2.0f *
M_PI;
177 new_sun_rotation = 2.0f *
M_PI - new_sun_rotation;
179 sun_elevation = new_sun_elevation;
180 sun_rotation = new_sun_rotation;
204 "node_tex_sky_preetham",
222 sun_angles[0] = fmin(
M_PI_2, sun_angles[0]);
226 float config_x07[8], config_y07[8], config_z07[8], config_xyz8[3];
227 for (
int i = 0;
i < 8; ++
i) {
232 for (
int i = 0;
i < 3; ++
i) {
236 for (
int i = 0;
i < 3;
i++) {
244 "node_tex_sky_hosekwilkie",
278 sun_rotation =
fmodf(sun_rotation, 2.0f *
M_PI);
279 if (sun_rotation < 0.0f) {
280 sun_rotation += 2.0f *
M_PI;
282 sun_rotation = 2.0f *
M_PI - sun_rotation;
311 "node_tex_sky_nishita",
349 params.update_and_connect_available_socket(node,
"Vector");
368 ntype.
declare = file_ns::node_declare;
371 ntype.
initfunc = file_ns::node_shader_init_tex_sky;
374 ntype.
gpu_fn = file_ns::node_shader_gpu_tex_sky;
375 ntype.
updatefunc = file_ns::node_shader_update_sky;
Scene * CTX_data_scene(const bContext *C)
#define NODE_CLASS_TEXTURE
bool BKE_scene_uses_blender_eevee(const Scene *scene)
void BKE_texture_mapping_default(struct TexMapping *texmap, int type)
void BKE_texture_colormapping_default(struct ColorMapping *colormap)
@ SHD_SKY_MULTIPLE_SCATTERING
@ SHD_SKY_SINGLE_SCATTERING
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
GPUNodeLink * GPU_constant(const float *num)
GPUNodeLink * GPU_image_sky(GPUMaterial *mat, int width, int height, const float *pixels, float *layer, GPUSamplerState sampler_state)
GPUNodeLink * GPU_uniform(const float *num)
@ GPU_SAMPLER_EXTEND_MODE_REPEAT
@ GPU_SAMPLER_EXTEND_MODE_EXTEND
@ GPU_SAMPLER_FILTERING_LINEAR
@ UI_ITEM_R_SPLIT_EMPTY_NAME
Vector< SocketDeclaration * > outputs
void * MEM_callocN(size_t len, const char *str)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_register_type(bNodeType &ntype)
void node_set_socket_availability(bNodeTree &ntree, bNodeSocket &sock, bool is_available)
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
void node_type_size_preset(bNodeType &ntype, eNodeSizePreset size)
static void sky_simplify_multiscatter_elevation_rotation(float &sun_elevation, float &sun_rotation)
static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms)
static void sky_precompute_old(SkyModelPreetham *sunsky, const float sun_angles[], float turbidity)
static void node_shader_init_tex_sky(bNodeTree *, bNode *node)
static int node_shader_gpu_tex_sky(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void node_shader_update_sky(bNodeTree *ntree, bNode *node)
static float sky_perez_function(const float *lam, float theta, float gamma)
static void node_declare(NodeDeclarationBuilder &b)
static void node_shader_buts_tex_sky(uiLayout *layout, bContext *C, PointerRNA *ptr)
void search_link_ops_for_declarations(GatherLinkSearchOpParams ¶ms, Span< SocketDeclaration * > declarations)
color xyz_to_rgb(float x, float y, float z)
void register_node_type_sh_tex_sky()
void node_shader_gpu_tex_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *)
void node_shader_gpu_default_tex_coord(GPUMaterial *mat, bNode *node, GPUNodeLink **link)
void sh_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data)
void node_free_standard_storage(bNode *node)
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
void SKY_arhosekskymodelstate_free(SKY_ArHosekSkyModelState *state)
SKY_ArHosekSkyModelState * SKY_arhosek_xyz_skymodelstate_alloc_init(const double turbidity, const double albedo, const double elevation)
void SKY_multiple_scattering_precompute_texture(float *pixels, int stride, int width, int height, float sun_elevation, float altitude, float air_density, float aerosol_density, float ozone_density)
void SKY_single_scattering_precompute_texture(float *pixels, int stride, int width, int height, float sun_elevation, float altitude, float air_density, float aerosol_density, float ozone_density)
ColorMapping color_mapping
SKY_ArHosekSkyModelConfiguration configs[11]
std::string ui_description
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGPUExecFunction gpu_fn
const char * enum_name_legacy
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
NodeGatherSocketLinkOperationsFunction gather_link_search_ops
NodeDeclareFunction declare
void(* updatefunc)(bNodeTree *ntree, bNode *node)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)