33 SWAP(
float, r_line[0], r_line[1]);
34 r_line[0] = -r_line[0];
39 if (r_line[2] > r_line[3]) {
40 SWAP(
float, r_line[2], r_line[3]);
50 const float up[3] = {0.0f, 0.0f, 1.0f};
72 float shadow_near_corners[4][3];
79 for (
int i = 0; i < 4; i++) {
84 shadow_near_corners[1],
85 shadow_near_corners[2],
88 shadow_near_corners[2],
89 shadow_near_corners[0],
98 float view_matrix[4][4];
135 #if DEBUG_SHADOW_VOLUME
150 for (
int manifold = 0; manifold < 2; manifold++) {
182 for (
int i = 0; i < 8; i++) {
193 for (
int i = 0; i < 8; i++) {
217 const int corners[4] = {0, 3, 4, 7};
218 float dist = 1e4f, dist_isect;
219 for (
int i = 0; i < 4; i++) {
225 if (dist_isect < dist) {
258 const float pts[4][2] = {
265 for (
int i = 0; i < 2; i++) {
266 float min_dst = FLT_MAX, max_dst = -FLT_MAX;
267 for (
int j = 0; j < 4; j++) {
289 data->shadow_bbox_dirty =
true;
298 if (geom_shadow ==
NULL) {
314 wpd, ob, engine_object_data);
317 if (has_transp_mat) {
318 use_shadow_pass_technique =
false;
322 if (use_shadow_pass_technique && !is_manifold && (wpd->
cull_state != 0)) {
323 use_shadow_pass_technique =
false;
326 if (use_shadow_pass_technique) {
331 #if DEBUG_SHADOW_VOLUME
337 wpd, ob, engine_object_data);
340 const bool need_caps =
true;
352 #if DEBUG_SHADOW_VOLUME
General operations, lookup, etc. for blender objects.
void BKE_boundbox_init_from_minmax(struct BoundBox *bb, const float min[3], const float max[3])
const struct BoundBox * BKE_object_boundbox_get(struct Object *ob)
MINLINE float clamp_f(float value, float min, float max)
MINLINE int max_ii(int a, int b)
bool isect_ray_plane_v3(const float ray_origin[3], const float ray_direction[3], const float plane[4], float *r_lambda, bool clip)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void unit_m4(float m[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
void mul_v3_mat3_m4v3(float r[3], const float M[4][4], const float v[3])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE bool compare_v3v3(const float a[3], const float b[3], float limit) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE float normalize_v3(float r[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
#define INIT_MINMAX(min, max)
#define DRW_shgroup_call_no_cull(shgroup, geom, ob)
@ DRW_STATE_STENCIL_ALWAYS
@ DRW_STATE_DEPTH_GREATER_EQUAL
@ DRW_STATE_WRITE_STENCIL_SHADOW_FAIL
@ DRW_STATE_BLEND_ADD_FULL
@ DRW_STATE_WRITE_STENCIL_SHADOW_PASS
#define DRW_PASS_CREATE(pass, state)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
struct GPUShader GPUShader
ATTR_WARN_UNUSED_RESULT const BMVert * v2
GPUBatch * DRW_cache_object_edge_detection_get(Object *ob, bool *r_is_manifold)
GPUBatch * DRW_cache_object_surface_get(Object *ob)
void DRW_debug_bbox(const BoundBox *bbox, const float color[4])
DrawData * DRW_drawdata_ensure(ID *id, DrawEngineType *engine_type, size_t size, DrawDataInitCb init_cb, DrawDataFreeCb free_cb)
const DRWContextState * DRW_context_state_get(void)
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
const DRWView * DRW_view_default_get(void)
void DRW_shgroup_uniform_vec3(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
DRWShadingGroup * DRW_shgroup_create_sub(DRWShadingGroup *shgroup)
void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask)
void DRW_view_viewmat_get(const DRWView *view, float mat[4][4], bool inverse)
void DRW_culling_frustum_planes_get(const DRWView *view, float planes[6][4])
void DRW_culling_frustum_corners_get(const DRWView *view, BoundBox *corners)
bool DRW_culling_box_test(const DRWView *view, const BoundBox *bbox)
ccl_gpu_kernel_postfix ccl_global float int int int int sh
struct SceneDisplay display
struct DRWPass * shadow_ps[2]
float shadow_far_plane[4]
struct DRWShadingGroup * shadow_fail_caps_grp[2]
struct DRWShadingGroup * shadow_pass_grp[2]
float shadow_direction_ws[3]
float shadow_cached_direction[3]
float shadow_near_sides[2][4]
struct DRWShadingGroup * shadow_fail_grp[2]
float shadow_direction_vs[4]
DrawEngineType draw_engine_workbench
GPUShader * workbench_shader_shadow_fail_get(bool manifold, bool cap)
GPUShader * workbench_shader_shadow_pass_get(bool manifold)
#define SHADOW_ENABLED(wpd)
void workbench_shadow_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd)
static bool workbench_shadow_object_cast_visible_shadow(WORKBENCH_PrivateData *wpd, Object *ob, WORKBENCH_ObjectData *oed)
static void compute_parallel_lines_nor_and_dist(const float v1[2], const float v2[2], const float v3[2], float r_line[4])
void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat)
static const BoundBox * workbench_shadow_object_shadow_bbox_get(WORKBENCH_PrivateData *wpd, Object *ob, WORKBENCH_ObjectData *oed)
static bool workbench_shadow_camera_in_object_shadow(WORKBENCH_PrivateData *wpd, Object *ob, WORKBENCH_ObjectData *oed)
static void workbench_init_object_data(DrawData *dd)
static float workbench_shadow_object_shadow_distance(WORKBENCH_PrivateData *wpd, Object *ob, WORKBENCH_ObjectData *oed)
void workbench_shadow_cache_init(WORKBENCH_Data *data)
static void workbench_shadow_update(WORKBENCH_PrivateData *wpd)