53 tVfx &tgp_vfx = (*gp_vfx_pool)[id];
54 tgp_vfx.target_fb = vfx_swapchain_.
next().fb;
58 pass.state_set(
state);
60 pass.bind_texture(
"color_buf", vfx_swapchain_.
current().color_tx, sampler);
61 pass.bind_texture(
"reveal_buf", vfx_swapchain_.
current().reveal_tx, sampler);
63 vfx_swapchain_.
swap();
100 float distance_factor = world_pixel_scale *
scale * winmat[1][1] * vp_size[1] /
w;
107 if (blur_size[0] > 0.0f) {
108 auto &grp = vfx_pass_create(
"Fx Blur H",
state, sh, tgp_ob);
109 grp.push_constant(
"offset",
float2(blur_size[0] * c, blur_size[0] * s));
113 if (blur_size[1] > 0.0f) {
114 auto &grp = vfx_pass_create(
"Fx Blur V",
state, sh, tgp_ob);
115 grp.push_constant(
"offset",
float2(-blur_size[1] * s, blur_size[1] * c));
126 auto &grp = vfx_pass_create(
"Fx Colorize",
state, sh, tgp_ob);
129 grp.push_constant(
"factor", fx->
factor);
130 grp.push_constant(
"mode", fx->
mode);
143 auto &grp = vfx_pass_create(
"Fx Flip",
state, sh, tgp_ob);
144 grp.push_constant(
"axis_flip",
float2(axis_flip));
145 grp.push_constant(
"wave_offset",
float2(0.0f, 0.0f));
146 grp.push_constant(
"swirl_radius", 0.0f);
153 float offset[2] = {float(fx->
offset[0]), float(fx->
offset[1])};
154 float blur_size[2] = {float(fx->
blur[0]), float(fx->
blur[1])};
158 const float2 vp_size_inv = 1.0f / vp_size;
165 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
174 auto &grp = vfx_pass_create(
"Fx Rim H",
state, sh, tgp_ob);
175 grp.push_constant(
"blur_dir",
float2(blur_size[0] * vp_size_inv[0], 0.0f));
176 grp.push_constant(
"uv_offset",
float2(offset));
179 grp.push_constant(
"is_first_pass",
true);
204 auto &grp = vfx_pass_create(
"Fx Rim V",
state, sh, tgp_ob);
205 grp.push_constant(
"blur_dir",
float2(0.0f, blur_size[1] * vp_size_inv[1]));
206 grp.push_constant(
"uv_offset",
float2(offset));
209 grp.push_constant(
"blend_mode", fx->
mode);
210 grp.push_constant(
"is_first_pass",
false);
217 grp.push_constant(
"blend_mode", 999);
226 float ob_center[3], pixsize_uniform[2];
230 const float2 vp_size_inv = 1.0f / vp_size;
231 float pixel_size[2] = {float(fx->
size[0]), float(fx->
size[1])};
236 mul_v3_m4v3(ob_center, persmat.
ptr(), ob->object_to_world().location());
248 mul_v2_fl(pixel_size, (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w);
258 if (pixel_size[0] > vp_size_inv[0]) {
259 copy_v2_fl2(pixsize_uniform, pixel_size[0], vp_size_inv[1]);
263 auto &grp = vfx_pass_create(
"Fx Pixelize X",
state, sh, tgp_ob, sampler);
264 grp.push_constant(
"target_pixel_size",
float2(pixsize_uniform));
265 grp.push_constant(
"target_pixel_offset",
float2(ob_center));
266 grp.push_constant(
"accum_offset",
float2(pixel_size[0], 0.0f));
267 int samp_count = (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1;
268 grp.push_constant(
"samp_count", (use_antialiasing ? samp_count : 0));
272 if (pixel_size[1] > vp_size_inv[1]) {
275 copy_v2_fl2(pixsize_uniform, vp_size_inv[0], pixel_size[1]);
276 auto &grp = vfx_pass_create(
"Fx Pixelize Y",
state, sh, tgp_ob, sampler);
277 grp.push_constant(
"target_pixel_size",
float2(pixsize_uniform));
278 grp.push_constant(
"accum_offset",
float2(0.0f, pixel_size[1]));
279 int samp_count = (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1;
280 grp.push_constant(
"samp_count", (use_antialiasing ? samp_count : 0));
292 float wave_ofs[3], wave_dir[3], wave_phase, blur_dir[2], tmp[2];
293 float offset[2] = {float(fx->
offset[0]), float(fx->
offset[1])};
294 float blur_size[2] = {float(fx->
blur[0]), float(fx->
blur[1])};
298 const float2 vp_size_inv = 1.0f / vp_size;
299 const float ratio = vp_size_inv[1] / vp_size_inv[0];
302 (use_obj_pivot && fx->
object) ? fx->
object->object_to_world().location() :
303 ob->object_to_world().location());
312 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
317 rot_center[0] = rot_center[0] * 0.5f + 0.5f;
318 rot_center[1] = rot_center[1] * 0.5f + 0.5f;
344 std::swap(wave_ofs[0], wave_ofs[1]);
345 wave_ofs[1] *= -1.0f;
362 copy_v2_fl2(blur_dir, blur_size[0] * vp_size_inv[0], 0.0f);
366 auto &grp = vfx_pass_create(
"Fx Shadow H",
state, sh, tgp_ob);
367 grp.push_constant(
"blur_dir",
float2(blur_dir));
368 grp.push_constant(
"wave_dir",
float2(wave_dir));
369 grp.push_constant(
"wave_offset",
float2(wave_ofs));
370 grp.push_constant(
"wave_phase", wave_phase);
371 grp.push_constant(
"uv_rot_x",
float2(uv_mat[0]));
372 grp.push_constant(
"uv_rot_y",
float2(uv_mat[1]));
373 grp.push_constant(
"uv_offset",
float2(uv_mat[3]));
375 grp.push_constant(
"is_first_pass",
true);
389 auto &grp = vfx_pass_create(
"Fx Shadow V",
state, sh, tgp_ob);
391 grp.push_constant(
"blur_dir",
float2(blur_dir));
392 grp.push_constant(
"wave_offset",
float2(wave_ofs));
393 grp.push_constant(
"uv_rot_x",
float2(uv_mat[0]));
394 grp.push_constant(
"uv_rot_y",
float2(uv_mat[1]));
395 grp.push_constant(
"uv_offset",
float2(uv_mat[3]));
397 grp.push_constant(
"is_first_pass",
false);
426 auto &grp = vfx_pass_create(
"Fx Glow H",
state, sh, tgp_ob);
427 grp.push_constant(
"offset",
float2(fx->
blur[0] * c, fx->
blur[0] * s));
429 grp.push_constant(
"threshold",
float4(ref_col));
431 grp.push_constant(
"glow_under", use_glow_under);
432 grp.push_constant(
"first_pass",
true);
461 auto &grp = vfx_pass_create(
"Fx Glow V",
state, sh, tgp_ob);
462 grp.push_constant(
"offset",
float2(-fx->
blur[1] * s, fx->
blur[1] * c));
464 grp.push_constant(
"threshold",
float4{-1.0f, -1.0f, -1.0f, -1.0});
465 grp.push_constant(
"glow_color",
float4{1.0f, 1.0f, 1.0f, fx->
glow_color[3]});
466 grp.push_constant(
"first_pass",
false);
467 grp.push_constant(
"blend_mode", fx->
blend_mode);
475 float wave_center[3];
476 float wave_ofs[3], wave_dir[3], wave_phase;
480 const float2 vp_size_inv = 1.0f / vp_size;
483 mul_v3_m4v3(wave_center, persmat.
ptr(), ob->object_to_world().location());
489 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
491 wave_center[0] = wave_center[0] * 0.5f + 0.5f;
492 wave_center[1] = wave_center[1] * 0.5f + 0.5f;
504 std::swap(wave_ofs[0], wave_ofs[1]);
505 wave_ofs[1] *= -1.0f;
517 auto &grp = vfx_pass_create(
"Fx Wave",
state, sh, tgp_ob);
518 grp.push_constant(
"axis_flip",
float2(1.0f, 1.0f));
519 grp.push_constant(
"wave_dir",
float2(wave_dir));
520 grp.push_constant(
"wave_offset",
float2(wave_ofs));
521 grp.push_constant(
"wave_phase", wave_phase);
522 grp.push_constant(
"swirl_radius", 0.0f);
528 if (fx->
object ==
nullptr) {
533 float swirl_center[3];
547 float distance_factor = (world_pixel_scale *
scale * winmat[1][1] * vp_size[1]) /
w;
553 float radius = fx->
radius * distance_factor;
561 auto &grp = vfx_pass_create(
"Fx Flip",
state, sh, tgp_ob);
562 grp.push_constant(
"axis_flip",
float2(1.0f, 1.0f));
563 grp.push_constant(
"wave_offset",
float2(0.0f, 0.0f));
564 grp.push_constant(
"swirl_center",
float2(swirl_center));
565 grp.push_constant(
"swirl_angle", fx->
angle);
566 grp.push_constant(
"swirl_radius", radius);
572 const bool is_edit_mode =
ELEM(
575 vfx_swapchain_.next().fb = &
layer_fb;
578 vfx_swapchain_.current().fb = &
object_fb;
621 if ((!this->
simplify_fx && tgp_ob->vfx.first !=
nullptr) || tgp_ob->do_mat_holdout) {
628 auto &grp = vfx_pass_create(
"GPencil Object Compose",
state, sh, tgp_ob);
629 grp.push_constant(
"is_first_pass",
true);
635 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()
@ 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