38 csm_render->original_bias =
max_ff(la->
bias, 0.0f);
46 #ifndef DEBUG_SHADOW_DISTRIBUTION
49 for (
int i = 0; i <= sample_ofs; i++) {
53 DRW_debug_sphere(p, 0.01f, (
float[4]){1.0f, (sample_ofs == i) ? 1.0f : 0.0f, 0.0f, 1.0f});
62 double factor =
pow(10.0, digits -
ceil(log10(
fabs(value))));
63 return round(value * factor) / factor;
71 float minvec[3], maxvec[3];
75 for (
int i = 0; i < 8; i++) {
80 r_radius =
len_v3v3(minvec, maxvec) * 0.5f;
86 for (
int i = 0; i < 8; i++) {
93 for (
int i = 0; i < 8; i++) {
95 if (rad > *r_radius) {
126 double ht_offset[2] = {0.0, 0.0};
127 const uint ht_primes[2] = {2, 3};
132 jitter_ofs[0] = (ht_point[0] * 2.0 - 1.0) * 4.0 / linfo->shadow_cascade_size;
133 jitter_ofs[1] = (ht_point[1] * 2.0 - 1.0) * 4.0 / linfo->shadow_cascade_size;
136 float persinv[4][4], vp_projmat[4][4];
143 float(*viewmat)[4] = csm_render->viewmat;
147 if (linfo->soft_shadows) {
154 copy_v3_v3(csm_data->shadow_vec, csm_render->viewinv[2]);
157 float sh_near = -1.0e30f, sh_far = 1.0e30f;
160 &shcaster_bounds, linfo->shcaster_aabb.min, linfo->shcaster_aabb.max);
162 float dbg_col1[4] = {1.0f, 0.5f, 0.6f, 1.0f};
165 for (
int i = 0; i < 8; i++) {
167 sh_near =
max_ff(sh_near, shcaster_bounds.
vec[i][2]);
168 sh_far =
min_ff(sh_far, shcaster_bounds.
vec[i][2]);
171 float dbg_col2[4] = {0.5f, 1.0f, 0.6f, 1.0f};
172 float pts[2][3] = {{0.0, 0.0, sh_near}, {0.0, 0.0, sh_far}};
180 sh_far = -(sh_far - 1
e-3);
187 float csm_start, csm_end;
190 csm_start = view_near;
191 csm_end =
max_ff(view_far, -cascade_max_dist);
193 csm_end =
min_ff(view_near, csm_end);
196 csm_start = -view_far;
202 csm_data->split_start[
c] = csm_end;
203 csm_data->split_end[
c] = csm_end;
212 float p[4] = {1.0f, 1.0f, csm_start, 1.0f};
215 splits_start_ndc[0] = p[2];
217 splits_start_ndc[0] /= p[3];
223 float p[4] = {1.0f, 1.0f, csm_end, 1.0f};
226 splits_end_ndc[cascade_count - 1] = p[2];
228 splits_end_ndc[cascade_count - 1] /= p[3];
232 csm_data->split_start[0] = csm_start;
233 csm_data->split_end[cascade_count - 1] = csm_end;
235 for (
int c = 1;
c < cascade_count;
c++) {
237 float linear_split =
interpf(csm_end, csm_start,
c / (
float)cascade_count);
238 float exp_split = csm_start *
powf(csm_end / csm_start,
c / (
float)cascade_count);
241 csm_data->split_start[
c] =
interpf(exp_split, linear_split, cascade_exponent);
244 csm_data->split_start[
c] = linear_split;
246 csm_data->split_end[
c - 1] = csm_data->split_start[
c];
249 csm_data->split_start[
c] =
interpf((
c > 1) ? csm_data->split_end[
c - 2] :
250 csm_data->split_start[0],
251 csm_data->split_end[
c - 1],
256 float p[4] = {1.0f, 1.0f, csm_data->split_start[
c], 1.0f};
259 splits_start_ndc[
c] = p[2];
262 splits_start_ndc[
c] /= p[3];
267 float p[4] = {1.0f, 1.0f, csm_data->split_end[
c - 1], 1.0f};
270 splits_end_ndc[
c - 1] = p[2];
273 splits_end_ndc[
c - 1] /= p[3];
279 float prev_split = (cascade_count > 1) ? csm_data->split_end[cascade_count - 2] :
280 csm_data->split_start[0];
281 csm_data->split_start[0] =
interpf(
282 prev_split, csm_data->split_end[cascade_count - 1], cascade_fade);
285 for (
int c = 0;
c < cascade_count;
c++) {
286 float(*projmat)[4] = csm_render->projmat[
c];
288 float corners[8][3] = {
290 {1.0f, -1.0f, splits_start_ndc[
c]},
291 {-1.0f, -1.0f, splits_start_ndc[
c]},
292 {-1.0f, 1.0f, splits_start_ndc[
c]},
293 {1.0f, 1.0f, splits_start_ndc[
c]},
295 {1.0f, -1.0f, splits_end_ndc[
c]},
296 {-1.0f, -1.0f, splits_end_ndc[
c]},
297 {-1.0f, 1.0f, splits_end_ndc[
c]},
298 {1.0f, 1.0f, splits_end_ndc[
c]},
302 for (
int i = 0; i < 8; i++) {
310 float dbg_col[4] = {0.0f, 0.0f, 0.0f, 1.0f};
322 float shadow_origin[2], shadow_texco[2];
325 shadow_origin,
center, linfo->shadow_cascade_size / (2.0f * csm_render->radius[
c]));
328 shadow_texco[0] = roundf(shadow_origin[0]);
329 shadow_texco[1] = roundf(shadow_origin[1]);
334 mul_v2_fl(shadow_texco, (2.0f * csm_render->radius[
c]) / linfo->shadow_cascade_size);
351 if (linfo->soft_shadows) {
355 float viewprojmat[4][4];
365 shdw_data->bias = csm_render->original_bias * 0.05f /
fabsf(sh_far - sh_near);
366 shdw_data->near = sh_near;
367 shdw_data->far = sh_far;
415 int layer = csm_data->tex_id + j;
419 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], float left, float right, float bottom, float top, float nearClip, 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_draw_pass(DRWPass *pass)
void DRW_view_set_active(const DRWView *view)
static struct @318 g_data
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)
ccl_device_inline float2 fabs(const float2 &a)
ccl_device_inline float3 ceil(const float3 &a)
ccl_device_inline float3 pow(float3 v, float e)
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
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