Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/gpencil/gpencil_shader_fx.c
| Show First 20 Lines • Show All 256 Lines • ▼ Show 20 Lines | static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxData *iter) | ||||
| float pixel_size[2] = {fx->size[0], fx->size[1]}; | float pixel_size[2] = {fx->size[0], fx->size[1]}; | ||||
| mul_v2_v2(pixel_size, vp_size_inv); | mul_v2_v2(pixel_size, vp_size_inv); | ||||
| /* Fixed pixelisation center from object center. */ | /* Fixed pixelisation center from object center. */ | ||||
| const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->obmat[3])); | const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->obmat[3])); | ||||
| mul_v3_m4v3(ob_center, persmat, ob->obmat[3]); | mul_v3_m4v3(ob_center, persmat, ob->obmat[3]); | ||||
| mul_v3_fl(ob_center, 1.0f / w); | mul_v3_fl(ob_center, 1.0f / w); | ||||
| const bool use_antialiasing = ((fx->flag & FX_PIXEL_FILTER_NEAREST) == 0); | |||||
| /* Convert to uvs. */ | /* Convert to uvs. */ | ||||
| mul_v2_fl(ob_center, 0.5f); | mul_v2_fl(ob_center, 0.5f); | ||||
| add_v2_fl(ob_center, 0.5f); | add_v2_fl(ob_center, 0.5f); | ||||
| /* Modify by distance to camera and object scale. */ | /* Modify by distance to camera and object scale. */ | ||||
| float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; | float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; | ||||
| float scale = mat4_to_scale(ob->obmat); | float scale = mat4_to_scale(ob->obmat); | ||||
| mul_v2_fl(pixel_size, (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w); | mul_v2_fl(pixel_size, (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w); | ||||
| /* Center to texel */ | /* Center to texel */ | ||||
| madd_v2_v2fl(ob_center, pixel_size, -0.5f); | madd_v2_v2fl(ob_center, pixel_size, -0.5f); | ||||
| GPUShader *sh = GPENCIL_shader_fx_pixelize_get(); | GPUShader *sh = GPENCIL_shader_fx_pixelize_get(); | ||||
| DRWState state = DRW_STATE_WRITE_COLOR; | DRWState state = DRW_STATE_WRITE_COLOR; | ||||
| /* Only if pixelated effect is bigger than 1px. */ | /* Only if pixelated effect is bigger than 1px. */ | ||||
| if (pixel_size[0] > vp_size_inv[0]) { | if (pixel_size[0] > vp_size_inv[0]) { | ||||
| copy_v2_fl2(pixsize_uniform, pixel_size[0], vp_size_inv[1]); | copy_v2_fl2(pixsize_uniform, pixel_size[0], vp_size_inv[1]); | ||||
| grp = gpencil_vfx_pass_create("Fx Pixelize X", state, iter, sh); | grp = gpencil_vfx_pass_create("Fx Pixelize X", state, iter, sh); | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform); | DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform); | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "targetPixelOffset", ob_center); | DRW_shgroup_uniform_vec2_copy(grp, "targetPixelOffset", ob_center); | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){pixel_size[0], 0.0f}); | DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){pixel_size[0], 0.0f}); | ||||
| DRW_shgroup_uniform_int_copy(grp, "sampCount", (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1); | int samp_count = (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1; | ||||
| DRW_shgroup_uniform_int_copy(grp, "sampCount", use_antialiasing ? samp_count : 0); | |||||
| DRW_shgroup_call_procedural_triangles(grp, NULL, 1); | DRW_shgroup_call_procedural_triangles(grp, NULL, 1); | ||||
| } | } | ||||
| if (pixel_size[1] > vp_size_inv[1]) { | if (pixel_size[1] > vp_size_inv[1]) { | ||||
| copy_v2_fl2(pixsize_uniform, vp_size_inv[0], pixel_size[1]); | copy_v2_fl2(pixsize_uniform, vp_size_inv[0], pixel_size[1]); | ||||
| grp = gpencil_vfx_pass_create("Fx Pixelize Y", state, iter, sh); | grp = gpencil_vfx_pass_create("Fx Pixelize Y", state, iter, sh); | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform); | DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform); | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){0.0f, pixel_size[1]}); | DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){0.0f, pixel_size[1]}); | ||||
| DRW_shgroup_uniform_int_copy(grp, "sampCount", (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1); | int samp_count = (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1; | ||||
| DRW_shgroup_uniform_int_copy(grp, "sampCount", use_antialiasing ? samp_count : 0); | |||||
| DRW_shgroup_call_procedural_triangles(grp, NULL, 1); | DRW_shgroup_call_procedural_triangles(grp, NULL, 1); | ||||
| } | } | ||||
| } | } | ||||
| static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData *iter) | static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData *iter) | ||||
| { | { | ||||
| DRWShadingGroup *grp; | DRWShadingGroup *grp; | ||||
| ▲ Show 20 Lines • Show All 354 Lines • Show Last 20 Lines | |||||