51 tVfx &tgp_vfx = (*gp_vfx_pool)[id];
52 tgp_vfx.target_fb = vfx_swapchain_.
next().fb;
56 pass.state_set(
state);
58 pass.bind_texture(
"color_buf", vfx_swapchain_.
current().color_tx, sampler);
59 pass.bind_texture(
"reveal_buf", vfx_swapchain_.
current().reveal_tx, sampler);
61 vfx_swapchain_.
swap();
98 float distance_factor = world_pixel_scale *
scale * winmat[1][1] * vp_size[1] /
w;
105 if (blur_size[0] > 0.0f) {
106 auto &grp = vfx_pass_create(
"Fx Blur H",
state, sh, tgp_ob);
107 grp.push_constant(
"offset",
float2(blur_size[0] * c, blur_size[0] * s));
111 if (blur_size[1] > 0.0f) {
112 auto &grp = vfx_pass_create(
"Fx Blur V",
state, sh, tgp_ob);
113 grp.push_constant(
"offset",
float2(-blur_size[1] * s, blur_size[1] * c));
124 auto &grp = vfx_pass_create(
"Fx Colorize",
state, sh, tgp_ob);
127 grp.push_constant(
"factor", fx->
factor);
128 grp.push_constant(
"mode", fx->
mode);
141 auto &grp = vfx_pass_create(
"Fx Flip",
state, sh, tgp_ob);
142 grp.push_constant(
"axis_flip",
float2(axis_flip));
143 grp.push_constant(
"wave_offset",
float2(0.0f, 0.0f));
144 grp.push_constant(
"swirl_radius", 0.0f);
156 const float2 vp_size_inv = 1.0f / vp_size;
163 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
172 auto &grp = vfx_pass_create(
"Fx Rim H",
state, sh, tgp_ob);
173 grp.push_constant(
"blur_dir",
float2(blur_size[0] * vp_size_inv[0], 0.0f));
174 grp.push_constant(
"uv_offset",
float2(offset));
177 grp.push_constant(
"is_first_pass",
true);
202 auto &grp = vfx_pass_create(
"Fx Rim V",
state, sh, tgp_ob);
203 grp.push_constant(
"blur_dir",
float2(0.0f, blur_size[1] * vp_size_inv[1]));
204 grp.push_constant(
"uv_offset",
float2(offset));
207 grp.push_constant(
"blend_mode", fx->
mode);
208 grp.push_constant(
"is_first_pass",
false);
215 grp.push_constant(
"blend_mode", 999);
224 float ob_center[3], pixsize_uniform[2];
228 const float2 vp_size_inv = 1.0f / vp_size;
234 mul_v3_m4v3(ob_center, persmat.
ptr(), ob->object_to_world().location());
246 mul_v2_fl(pixel_size, (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w);
256 if (pixel_size[0] > vp_size_inv[0]) {
257 copy_v2_fl2(pixsize_uniform, pixel_size[0], vp_size_inv[1]);
261 auto &grp = vfx_pass_create(
"Fx Pixelize X",
state, sh, tgp_ob, sampler);
262 grp.push_constant(
"target_pixel_size",
float2(pixsize_uniform));
263 grp.push_constant(
"target_pixel_offset",
float2(ob_center));
264 grp.push_constant(
"accum_offset",
float2(pixel_size[0], 0.0f));
265 int samp_count = (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1;
266 grp.push_constant(
"samp_count", (use_antialiasing ? samp_count : 0));
270 if (pixel_size[1] > vp_size_inv[1]) {
273 copy_v2_fl2(pixsize_uniform, vp_size_inv[0], pixel_size[1]);
274 auto &grp = vfx_pass_create(
"Fx Pixelize Y",
state, sh, tgp_ob, sampler);
275 grp.push_constant(
"target_pixel_size",
float2(pixsize_uniform));
276 grp.push_constant(
"accum_offset",
float2(0.0f, pixel_size[1]));
277 int samp_count = (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1;
278 grp.push_constant(
"samp_count", (use_antialiasing ? samp_count : 0));
290 float wave_ofs[3], wave_dir[3], wave_phase, blur_dir[2], tmp[2];
296 const float2 vp_size_inv = 1.0f / vp_size;
297 const float ratio = vp_size_inv[1] / vp_size_inv[0];
300 (use_obj_pivot && fx->
object) ? fx->
object->object_to_world().location() :
301 ob->object_to_world().location());
310 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
315 rot_center[0] = rot_center[0] * 0.5f + 0.5f;
316 rot_center[1] = rot_center[1] * 0.5f + 0.5f;
342 std::swap(wave_ofs[0], wave_ofs[1]);
343 wave_ofs[1] *= -1.0f;
360 copy_v2_fl2(blur_dir, blur_size[0] * vp_size_inv[0], 0.0f);
364 auto &grp = vfx_pass_create(
"Fx Shadow H",
state, sh, tgp_ob);
365 grp.push_constant(
"blur_dir",
float2(blur_dir));
366 grp.push_constant(
"wave_dir",
float2(wave_dir));
367 grp.push_constant(
"wave_offset",
float2(wave_ofs));
368 grp.push_constant(
"wave_phase", wave_phase);
369 grp.push_constant(
"uv_rot_x",
float2(uv_mat[0]));
370 grp.push_constant(
"uv_rot_y",
float2(uv_mat[1]));
371 grp.push_constant(
"uv_offset",
float2(uv_mat[3]));
373 grp.push_constant(
"is_first_pass",
true);
387 auto &grp = vfx_pass_create(
"Fx Shadow V",
state, sh, tgp_ob);
389 grp.push_constant(
"blur_dir",
float2(blur_dir));
390 grp.push_constant(
"wave_offset",
float2(wave_ofs));
391 grp.push_constant(
"uv_rot_x",
float2(uv_mat[0]));
392 grp.push_constant(
"uv_rot_y",
float2(uv_mat[1]));
393 grp.push_constant(
"uv_offset",
float2(uv_mat[3]));
395 grp.push_constant(
"is_first_pass",
false);
424 auto &grp = vfx_pass_create(
"Fx Glow H",
state, sh, tgp_ob);
425 grp.push_constant(
"offset",
float2(fx->
blur[0] * c, fx->
blur[0] * s));
427 grp.push_constant(
"threshold",
float4(ref_col));
429 grp.push_constant(
"glow_under", use_glow_under);
430 grp.push_constant(
"first_pass",
true);
459 auto &grp = vfx_pass_create(
"Fx Glow V",
state, sh, tgp_ob);
460 grp.push_constant(
"offset",
float2(-fx->
blur[1] * s, fx->
blur[1] * c));
462 grp.push_constant(
"threshold",
float4{-1.0f, -1.0f, -1.0f, -1.0});
463 grp.push_constant(
"glow_color",
float4{1.0f, 1.0f, 1.0f, fx->
glow_color[3]});
464 grp.push_constant(
"first_pass",
false);
465 grp.push_constant(
"blend_mode", fx->
blend_mode);
473 float wave_center[3];
474 float wave_ofs[3], wave_dir[3], wave_phase;
478 const float2 vp_size_inv = 1.0f / vp_size;
481 mul_v3_m4v3(wave_center, persmat.
ptr(), ob->object_to_world().location());
487 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
489 wave_center[0] = wave_center[0] * 0.5f + 0.5f;
490 wave_center[1] = wave_center[1] * 0.5f + 0.5f;
502 std::swap(wave_ofs[0], wave_ofs[1]);
503 wave_ofs[1] *= -1.0f;
515 auto &grp = vfx_pass_create(
"Fx Wave",
state, sh, tgp_ob);
516 grp.push_constant(
"axis_flip",
float2(1.0f, 1.0f));
517 grp.push_constant(
"wave_dir",
float2(wave_dir));
518 grp.push_constant(
"wave_offset",
float2(wave_ofs));
519 grp.push_constant(
"wave_phase", wave_phase);
520 grp.push_constant(
"swirl_radius", 0.0f);
526 if (fx->
object ==
nullptr) {
531 float swirl_center[3];
545 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
551 float radius = fx->
radius * distance_factor;
559 auto &grp = vfx_pass_create(
"Fx Flip",
state, sh, tgp_ob);
560 grp.push_constant(
"axis_flip",
float2(1.0f, 1.0f));
561 grp.push_constant(
"wave_offset",
float2(0.0f, 0.0f));
562 grp.push_constant(
"swirl_center",
float2(swirl_center));
563 grp.push_constant(
"swirl_angle", fx->
angle);
564 grp.push_constant(
"swirl_radius", radius);
570 const bool is_edit_mode =
ELEM(
573 vfx_swapchain_.next().fb = &
layer_fb;
576 vfx_swapchain_.current().fb = &
object_fb;
619 if ((!this->
simplify_fx && tgp_ob->vfx.first !=
nullptr) || tgp_ob->do_mat_holdout) {
626 auto &grp = vfx_pass_create(
"GPencil Object Compose",
state, sh, tgp_ob);
627 grp.push_constant(
"is_first_pass",
true);
633 grp.push_constant(
"is_first_pass",
false);
Camera data-block and utility functions.
Single link-list utility macros. (header only API).
#define BLI_LINKS_APPEND(list, link)
#define LISTBASE_FOREACH(type, var, list)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
float mat4_to_scale(const float mat[4][4])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
void rescale_m4(float mat[4][4], const float scale[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
void rotate_m4(float mat[4][4], char axis, float angle)
void unit_m4(float m[4][4])
MINLINE void copy_v2_fl2(float v[2], float x, float y)
MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
MINLINE void mul_v2_v2(float r[2], const float a[2])
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
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_fl(float r[2], float f)
MINLINE void zero_v2(float r[2])
MINLINE float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
void rotate_v2_v2fl(float r[2], const float p[2], float angle)
MINLINE void copy_v2_fl(float r[2], float f)
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_WEIGHT_GREASE_PENCIL
struct RimShaderFxData RimShaderFxData
struct GlowShaderFxData GlowShaderFxData
struct FlipShaderFxData FlipShaderFxData
@ eShaderFxGlowMode_Luminance
struct WaveShaderFxData WaveShaderFxData
struct SwirlShaderFxData SwirlShaderFxData
@ eShaderFxRimMode_Multiply
@ eShaderFxRimMode_Normal
@ eShaderFxRimMode_Overlay
@ eShaderFxRimMode_Subtract
@ eShaderFxRimMode_Divide
@ FX_PIXEL_FILTER_NEAREST
struct BlurShaderFxData BlurShaderFxData
struct ColorizeShaderFxData ColorizeShaderFxData
struct ShaderFxData ShaderFxData
struct ShadowShaderFxData ShadowShaderFxData
struct PixelShaderFxData PixelShaderFxData
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
const float4x4 & winmat(int view_id=0) const
const float4x4 persmat(int view_id=0) const
static View & default_get()
int64_t append_and_get_index(T &&elem)
StaticShader fx_transform
StaticShader fx_composite
static ShaderCache & get()
blender::gpu::Shader * get()
@ DRW_STATE_BLEND_ADD_FULL
@ DRW_STATE_BLEND_ALPHA_PREMUL
#define GPENCIL_PIXEL_FACTOR
static bool effect_is_active(ShaderFxData *fx, bool is_edit, bool is_viewport)
detail::Pass< command::DrawCommandBuf > PassSimple
MatBase< T, NumCol, NumRow > scale(const MatBase< T, NumCol, NumRow > &mat, const VectorT &scale)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
static constexpr GPUSamplerState internal_sampler()
static constexpr GPUSamplerState default_sampler()
const c_style_mat & ptr() const
TextureFromPool color_object_tx
const DRWContext * draw_ctx
TextureFromPool color_layer_tx
TextureFromPool reveal_layer_tx
TextureFromPool reveal_object_tx