diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-06 16:07:30 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-06 16:07:30 +0300 |
commit | e8292466bcb69282798bba5dd701fff514cb0b78 (patch) | |
tree | adfb00123c003b8d984a20b14f1e32c6af8086db | |
parent | 3e6ebdd2a6b5b7563e9c45dae3c65ebf7d629544 (diff) |
DRW: Support edit-metaball clipping
-rw-r--r-- | source/blender/draw/intern/draw_common.c | 19 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.h | 2 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_metaball_mode.c | 17 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 2 | ||||
-rw-r--r-- | source/blender/draw/modes/shaders/object_mball_handles_vert.glsl | 5 |
5 files changed, 35 insertions, 10 deletions
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 01e3264c54e..73371d5bf94 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -696,13 +696,18 @@ DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass, bool transp return grp; } -DRWShadingGroup *shgroup_instance_mball_handles(DRWPass *pass) +DRWShadingGroup *shgroup_instance_mball_handles(DRWPass *pass, eGPUShaderConfig shader_cfg) { - COMMON_Shaders *sh_data = &g_shaders[GPU_SHADER_CFG_DEFAULT]; + COMMON_Shaders *sh_data = &g_shaders[shader_cfg]; if (sh_data->mball_handles == NULL) { - sh_data->mball_handles = DRW_shader_create( - datatoc_object_mball_handles_vert_glsl, NULL, - datatoc_gpu_shader_flat_color_frag_glsl, NULL); + bool is_clip = (shader_cfg == GPU_SHADER_CFG_CLIPPED); + const char *world_clip_lib_or_empty = is_clip ? datatoc_gpu_shader_cfg_world_clip_lib_glsl : ""; + const char *world_clip_def_or_empty = is_clip ? "#define USE_WORLD_CLIP_PLANES\n" : ""; + sh_data->mball_handles = GPU_shader_create_from_arrays({ + .vert = (const char *[]){world_clip_lib_or_empty, datatoc_object_mball_handles_vert_glsl, NULL}, + .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL}, + .defs = (const char *[]){world_clip_def_or_empty, NULL}, + }); } DRW_shgroup_instance_format(g_formats.instance_mball_handles, { @@ -716,7 +721,9 @@ DRWShadingGroup *shgroup_instance_mball_handles(DRWPass *pass) DRW_cache_screenspace_circle_get(), g_formats.instance_mball_handles); DRW_shgroup_uniform_vec3(grp, "screen_vecs[0]", DRW_viewport_screenvecs_get(), 2); - + if (shader_cfg == GPU_SHADER_CFG_CLIPPED) { + DRW_shgroup_world_clip_planes_from_rv3d(grp, DRW_context_state_get()->rv3d); + } return grp; } diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index 3a5237d8af8..af240809ded 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -140,7 +140,7 @@ struct DRWShadingGroup *shgroup_instance_outline(struct DRWPass *pass, struct GP struct DRWShadingGroup *shgroup_camera_instance(struct DRWPass *pass, struct GPUBatch *geom, eGPUShaderConfig shader_cfg); struct DRWShadingGroup *shgroup_distance_lines_instance(struct DRWPass *pass, struct GPUBatch *geom, eGPUShaderConfig shader_cfg); struct DRWShadingGroup *shgroup_spot_instance(struct DRWPass *pass, struct GPUBatch *geom, eGPUShaderConfig shader_cfg); -struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass); +struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass, eGPUShaderConfig shader_cfg); struct DRWShadingGroup *shgroup_instance_bone_axes(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_distance(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_outline(struct DRWPass *pass); diff --git a/source/blender/draw/modes/edit_metaball_mode.c b/source/blender/draw/modes/edit_metaball_mode.c index d6f5307c6d4..a61745b09ad 100644 --- a/source/blender/draw/modes/edit_metaball_mode.c +++ b/source/blender/draw/modes/edit_metaball_mode.c @@ -90,12 +90,23 @@ typedef struct EDIT_METABALL_PrivateData { /* *********** FUNCTIONS *********** */ +static void EDIT_METABALL_engine_init(void *UNUSED(vedata)) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; + if (is_clip) { + DRW_state_clip_planes_set_from_rv3d(draw_ctx->rv3d); + } +} + /* Here init all passes and shading groups * Assume that all Passes are NULL */ static void EDIT_METABALL_cache_init(void *vedata) { EDIT_METABALL_PassList *psl = ((EDIT_METABALL_Data *)vedata)->psl; EDIT_METABALL_StorageList *stl = ((EDIT_METABALL_Data *)vedata)->stl; + const DRWContextState *draw_ctx = DRW_context_state_get(); + if (!stl->g_data) { /* Alloc transient pointers */ @@ -110,7 +121,7 @@ static void EDIT_METABALL_cache_init(void *vedata) psl->pass = DRW_pass_create("My Pass", state); /* Create a shadingGroup using a function in draw_common.c or custom one */ - stl->g_data->group = shgroup_instance_mball_handles(psl->pass); + stl->g_data->group = shgroup_instance_mball_handles(psl->pass, draw_ctx->shader_cfg); } } @@ -192,6 +203,8 @@ static void EDIT_METABALL_draw_scene(void *vedata) /* If you changed framebuffer, double check you rebind * the default one with its textures attached before finishing */ + + DRW_state_clip_planes_reset(); } /* Cleanup when destroying the engine. @@ -208,7 +221,7 @@ DrawEngineType draw_engine_edit_metaball_type = { NULL, NULL, N_("EditMetaballMode"), &EDIT_METABALL_data_size, - NULL, + &EDIT_METABALL_engine_init, &EDIT_METABALL_engine_free, &EDIT_METABALL_cache_init, &EDIT_METABALL_cache_populate, diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 561998bda73..7b5b83ca328 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1298,7 +1298,7 @@ static void OBJECT_cache_init(void *vedata) DRW_shgroup_state_disable(sgl->points_dupli_select, DRW_STATE_BLEND); /* Metaballs Handles */ - sgl->mball_handle = shgroup_instance_mball_handles(sgl->non_meshes); + sgl->mball_handle = shgroup_instance_mball_handles(sgl->non_meshes, draw_ctx->shader_cfg); /* Lamps */ /* TODO diff --git a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl b/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl index 294a95db381..a2bd08be3c1 100644 --- a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl +++ b/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl @@ -5,6 +5,7 @@ uniform mat4 ViewProjectionMatrix; +uniform mat4 ModelMatrix; uniform vec3 screen_vecs[2]; /* ---- Instantiated Attrs ---- */ @@ -31,4 +32,8 @@ void main() gl_Position = ViewProjectionMatrix * world_pos; finalColor = vec4(color, 1.0); + +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance((ModelMatrix * world_pos).xyz); +#endif } |