53 csm_render->original_bias =
max_ff(la->
bias, 0.0f);
61 #ifndef DEBUG_SHADOW_DISTRIBUTION
64 for (
int i = 0; i <= sample_ofs; i++) {
68 DRW_debug_sphere(p, 0.01f, (
float[4]){1.0f, (sample_ofs == i) ? 1.0f : 0.0f, 0.0f, 1.0f});
77 double factor =
pow(10.0, digits -
ceil(log10(
fabs(value))));
78 return round(value * factor) / factor;
86 float minvec[3], maxvec[3];
90 for (
int i = 0; i < 8; i++) {
95 r_radius =
len_v3v3(minvec, maxvec) * 0.5f;
101 for (
int i = 0; i < 8; i++) {
108 for (
int i = 0; i < 8; i++) {
110 if (rad > *r_radius) {
141 double ht_offset[2] = {0.0, 0.0};
142 const uint ht_primes[2] = {2, 3};
147 jitter_ofs[0] = (ht_point[0] * 2.0 - 1.0) * 4.0 / linfo->shadow_cascade_size;
148 jitter_ofs[1] = (ht_point[1] * 2.0 - 1.0) * 4.0 / linfo->shadow_cascade_size;
151 float persinv[4][4], vp_projmat[4][4];
158 float(*viewmat)[4] = csm_render->viewmat;
162 if (linfo->soft_shadows) {
169 copy_v3_v3(csm_data->shadow_vec, csm_render->viewinv[2]);
172 float sh_near = -1.0e30f, sh_far = 1.0e30f;
175 &shcaster_bounds, linfo->shcaster_aabb.min, linfo->shcaster_aabb.max);
177 float dbg_col1[4] = {1.0f, 0.5f, 0.6f, 1.0f};
180 for (
int i = 0; i < 8; i++) {
182 sh_near =
max_ff(sh_near, shcaster_bounds.
vec[i][2]);
183 sh_far =
min_ff(sh_far, shcaster_bounds.
vec[i][2]);
186 float dbg_col2[4] = {0.5f, 1.0f, 0.6f, 1.0f};
187 float pts[2][3] = {{0.0, 0.0, sh_near}, {0.0, 0.0, sh_far}};
195 sh_far = -(sh_far - 1
e-3);
202 float csm_start, csm_end;
205 csm_start = view_near;
206 csm_end =
max_ff(view_far, -cascade_max_dist);
208 csm_end =
min_ff(view_near, csm_end);
211 csm_start = -view_far;
217 csm_data->split_start[
c] = csm_end;
218 csm_data->split_end[
c] = csm_end;
227 float p[4] = {1.0f, 1.0f, csm_start, 1.0f};
230 splits_start_ndc[0] = p[2];
232 splits_start_ndc[0] /= p[3];
238 float p[4] = {1.0f, 1.0f, csm_end, 1.0f};
241 splits_end_ndc[cascade_nbr - 1] = p[2];
243 splits_end_ndc[cascade_nbr - 1] /= p[3];
247 csm_data->split_start[0] = csm_start;
248 csm_data->split_end[cascade_nbr - 1] = csm_end;
250 for (
int c = 1;
c < cascade_nbr;
c++) {
252 float linear_split =
interpf(csm_end, csm_start,
c / (
float)cascade_nbr);
253 float exp_split = csm_start *
powf(csm_end / csm_start,
c / (
float)cascade_nbr);
256 csm_data->split_start[
c] =
interpf(exp_split, linear_split, cascade_exponent);
259 csm_data->split_start[
c] = linear_split;
261 csm_data->split_end[
c - 1] = csm_data->split_start[
c];
264 csm_data->split_start[
c] =
interpf((
c > 1) ? csm_data->split_end[
c - 2] :
265 csm_data->split_start[0],
266 csm_data->split_end[
c - 1],
271 float p[4] = {1.0f, 1.0f, csm_data->split_start[
c], 1.0f};
274 splits_start_ndc[
c] = p[2];
277 splits_start_ndc[
c] /= p[3];
282 float p[4] = {1.0f, 1.0f, csm_data->split_end[
c - 1], 1.0f};
285 splits_end_ndc[
c - 1] = p[2];
288 splits_end_ndc[
c - 1] /= p[3];
294 float prev_split = (cascade_nbr > 1) ? csm_data->split_end[cascade_nbr - 2] :
295 csm_data->split_start[0];
296 csm_data->split_start[0] =
interpf(
297 prev_split, csm_data->split_end[cascade_nbr - 1], cascade_fade);
300 for (
int c = 0;
c < cascade_nbr;
c++) {
301 float(*projmat)[4] = csm_render->projmat[
c];
303 float corners[8][3] = {
305 {1.0f, -1.0f, splits_start_ndc[
c]},
306 {-1.0f, -1.0f, splits_start_ndc[
c]},
307 {-1.0f, 1.0f, splits_start_ndc[
c]},
308 {1.0f, 1.0f, splits_start_ndc[
c]},
310 {1.0f, -1.0f, splits_end_ndc[
c]},
311 {-1.0f, -1.0f, splits_end_ndc[
c]},
312 {-1.0f, 1.0f, splits_end_ndc[
c]},
313 {1.0f, 1.0f, splits_end_ndc[
c]},
317 for (
int i = 0; i < 8; i++) {
325 float dbg_col[4] = {0.0f, 0.0f, 0.0f, 1.0f};
337 float shadow_origin[2], shadow_texco[2];
340 shadow_origin,
center, linfo->shadow_cascade_size / (2.0f * csm_render->radius[
c]));
343 shadow_texco[0] = roundf(shadow_origin[0]);
344 shadow_texco[1] = roundf(shadow_origin[1]);
349 mul_v2_fl(shadow_texco, (2.0f * csm_render->radius[
c]) / linfo->shadow_cascade_size);
366 if (linfo->soft_shadows) {
370 float viewprojmat[4][4];
380 shdw_data->bias = csm_render->original_bias * 0.05f /
fabsf(sh_far - sh_near);
381 shdw_data->near = sh_near;
382 shdw_data->far = sh_far;
430 int layer = csm_data->tex_id + j;
434 GPU_framebuffer_clear_depth(sldata->
shadow_fb, 1.0f);
typedef float(TangentPoint)[2]
General operations, lookup, etc. for blender objects.
void BKE_boundbox_init_from_minmax(struct BoundBox *bb, const float min[3], const float max[3])
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
MINLINE float interpf(float a, float b, float t)
void orthographic_m4(float mat[4][4], const float left, const float right, const float bottom, const float top, const float nearClip, const float farClip)
void mul_project_m4_v3(const float M[4][4], float vec[3])
void orthogonalize_m4(float R[4][4], int axis)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4(float R[4][4])
void mul_m4_v4(const float M[4][4], float r[4])
void mul_m4_v3(const float M[4][4], float r[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
void BLI_halton_2d(const unsigned int prime[2], double offset[2], int n, double *r)
void BLI_rctf_init_pt_radius(struct rctf *rect, const float xy[2], float size)
#define INIT_MINMAX(min, max)
NSNotificationCenter * center
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
BASIC_Shaders sh_data[GPU_SHADER_CFG_LEN]
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
void DRW_debug_m4_as_bbox(const float m[4][4], const float color[4], const bool invert)
void DRW_debug_sphere(const float center[3], const float radius, const float color[4])
void DRW_debug_bbox(const BoundBox *bbox, const float color[4])
float DRW_view_near_distance_get(const DRWView *view)
void DRW_view_persmat_get(const DRWView *view, float mat[4][4], bool inverse)
bool DRW_view_is_persp_get(const DRWView *view)
void DRW_view_winmat_get(const DRWView *view, float mat[4][4], bool inverse)
DRWView * DRW_view_create(const float viewmat[4][4], const float winmat[4][4], const float(*culling_viewmat)[4], const float(*culling_winmat)[4], DRWCallVisibilityFn *visibility_fn)
void DRW_view_update(DRWView *view, const float viewmat[4][4], const float winmat[4][4], const float(*culling_viewmat)[4], const float(*culling_winmat)[4])
float DRW_view_far_distance_get(const DRWView *view)
void DRW_view_set_active(DRWView *view)
void DRW_draw_pass(DRWPass *pass)
void eevee_light_matrix_get(const EEVEE_Light *evli, float r_mat[4][4])
#define MAX_SHADOW_CASCADE
void EEVEE_sample_ellipse(int sample_ofs, const float x_axis[3], const float y_axis[3], float size_x, float size_y, float rsample[3])
static const float texcomat[4][4]
void eevee_contact_shadow_setup(const Light *la, EEVEE_Shadow *evsh)
static void eevee_ensure_cascade_views(EEVEE_ShadowCascadeRender *csm_render, DRWView *view[MAX_CASCADE_NUM])
static void eevee_shadow_cascade_setup(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, DRWView *view, float view_near, float view_far, int sample_ofs)
static double round_to_digits(double value, int digits)
void EEVEE_shadows_draw_cascades(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWView *view, int cascade_index)
void EEVEE_shadows_cascade_add(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, Object *ob)
static void frustum_min_bounding_sphere(const float corners[8][3], float r_center[3], float *r_radius)
static void shadow_cascade_random_matrix_set(float mat[4][4], float radius, int sample_ofs)
void GPU_framebuffer_texture_layer_attach(GPUFrameBuffer *fb, GPUTexture *tex, int slot, int layer, int mip)
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
struct EEVEE_Light light_data[MAX_LIGHT]
uchar shadow_cascade_light_indices[MAX_SHADOW_CASCADE]
struct EEVEE_Shadow shadow_data[MAX_SHADOW]
struct EEVEE_ShadowCascadeRender shadow_cascade_render[MAX_SHADOW_CASCADE]
struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE]
struct DRWPass * shadow_pass
struct DRWView * cube_views[6]
float projmat[MAX_CASCADE_NUM][4][4]
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUFrameBuffer * shadow_fb
struct GPUTexture * shadow_cascade_pool
struct EEVEE_LightsInfo * lights
ccl_device_inline float2 fabs(const float2 &a)
ccl_device_inline float3 ceil(const float3 &a)