diff options
Diffstat (limited to 'source/blender/draw/engines/overlay')
9 files changed, 64 insertions, 156 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index e76b3c82c1d..bc96a03da31 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -182,7 +182,6 @@ static void OVERLAY_cache_init(void *vedata) OVERLAY_motion_path_cache_init(vedata); OVERLAY_outline_cache_init(vedata); OVERLAY_particle_cache_init(vedata); - OVERLAY_pointcloud_cache_init(vedata); OVERLAY_wireframe_cache_init(vedata); } @@ -403,12 +402,6 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob) OVERLAY_particle_cache_populate(vedata, ob); } - /* TODO: these should not be overlays, just here for testing since it's - * easier to implement than integrating it into eevee/workbench. */ - if (ob->type == OB_POINTCLOUD) { - OVERLAY_pointcloud_cache_populate(vedata, ob); - } - /* Relationship, object center, bounbox ... */ if (!pd->hide_overlays) { OVERLAY_extra_cache_populate(vedata, ob); @@ -482,7 +475,6 @@ static void OVERLAY_draw_scene(void *vedata) OVERLAY_armature_draw(vedata); OVERLAY_particle_draw(vedata); OVERLAY_metaball_draw(vedata); - OVERLAY_pointcloud_draw(vedata); OVERLAY_gpencil_draw(vedata); OVERLAY_extra_draw(vedata); diff --git a/source/blender/draw/engines/overlay/overlay_outline.c b/source/blender/draw/engines/overlay/overlay_outline.c index e00ebe12cd6..214322c4adc 100644 --- a/source/blender/draw/engines/overlay/overlay_outline.c +++ b/source/blender/draw/engines/overlay/overlay_outline.c @@ -138,6 +138,11 @@ void OVERLAY_outline_cache_init(OVERLAY_Data *vedata) pd->outlines_grp = grp = DRW_shgroup_create(sh_geom, psl->outlines_prepass_ps); DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0); + GPUShader *sh_geom_ptcloud = OVERLAY_shader_outline_prepass_pointcloud(); + + pd->outlines_ptcloud_grp = grp = DRW_shgroup_create(sh_geom_ptcloud, psl->outlines_prepass_ps); + DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0); + GPUShader *sh_gpencil = OVERLAY_shader_outline_prepass_gpencil(); pd->outlines_gpencil_grp = grp = DRW_shgroup_create(sh_gpencil, psl->outlines_prepass_ps); @@ -288,6 +293,12 @@ void OVERLAY_outline_cache_populate(OVERLAY_Data *vedata, return; } + if (ob->type == OB_POINTCLOUD && pd->wireframe_mode) { + /* Looks bad in this case. Could be relaxed if we draw a + * wireframe of some sort in the future. */ + return; + } + if (dupli && !init_dupli) { geom = dupli->outline_geom; shgroup = dupli->outline_shgrp; @@ -307,12 +318,18 @@ void OVERLAY_outline_cache_populate(OVERLAY_Data *vedata, } if (geom) { - shgroup = pd->outlines_grp; + shgroup = (ob->type == OB_POINTCLOUD) ? pd->outlines_ptcloud_grp : pd->outlines_grp; } } if (shgroup && geom) { - DRW_shgroup_call(shgroup, geom, ob); + if (ob->type == OB_POINTCLOUD) { + /* Draw range to avoid drawcall batching messing up the instance attrib. */ + DRW_shgroup_call_instance_range(shgroup, ob, geom, 0, 0); + } + else { + DRW_shgroup_call(shgroup, geom, ob); + } } if (init_dupli) { diff --git a/source/blender/draw/engines/overlay/overlay_pointcloud.c b/source/blender/draw/engines/overlay/overlay_pointcloud.c deleted file mode 100644 index b2a2d44bf73..00000000000 --- a/source/blender/draw/engines/overlay/overlay_pointcloud.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright 2020, Blender Foundation. - */ - -/** \file - * \ingroup draw_engine - */ - -#include "DRW_render.h" - -#include "DEG_depsgraph_query.h" - -#include "DNA_pointcloud_types.h" - -#include "BKE_pointcache.h" - -#include "overlay_private.h" - -/* -------------------------------------------------------------------- */ -/** \name PointCloud - * \{ */ - -void OVERLAY_pointcloud_cache_init(OVERLAY_Data *vedata) -{ - OVERLAY_PassList *psl = vedata->psl; - OVERLAY_PrivateData *pd = vedata->stl->pd; - GPUShader *sh; - DRWShadingGroup *grp; - - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL; - DRW_PASS_CREATE(psl->pointcloud_ps, state | pd->clipping_state); - - sh = OVERLAY_shader_pointcloud_dot(); - pd->pointcloud_dots_grp = grp = DRW_shgroup_create(sh, psl->pointcloud_ps); - DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); -} - -void OVERLAY_pointcloud_cache_populate(OVERLAY_Data *vedata, Object *ob) -{ - OVERLAY_PrivateData *pd = vedata->stl->pd; - - struct GPUBatch *geom = DRW_cache_pointcloud_get_dots(ob); - - const float color[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - - DRWShadingGroup *grp = DRW_shgroup_create_sub(pd->pointcloud_dots_grp); - DRW_shgroup_uniform_vec4_copy(grp, "color", color); - DRW_shgroup_call(grp, geom, ob); -} - -void OVERLAY_pointcloud_draw(OVERLAY_Data *vedata) -{ - OVERLAY_PassList *psl = vedata->psl; - - DRW_draw_pass(psl->pointcloud_ps); -} - -/** \} */ diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index 59fa58c0c03..027478c3e3c 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -243,6 +243,7 @@ typedef struct OVERLAY_PrivateData { DRWShadingGroup *motion_path_lines_grp; DRWShadingGroup *motion_path_points_grp; DRWShadingGroup *outlines_grp; + DRWShadingGroup *outlines_ptcloud_grp; DRWShadingGroup *outlines_gpencil_grp; DRWShadingGroup *paint_depth_grp; DRWShadingGroup *paint_surf_grp; @@ -550,10 +551,6 @@ void OVERLAY_particle_cache_init(OVERLAY_Data *vedata); void OVERLAY_particle_cache_populate(OVERLAY_Data *vedata, Object *ob); void OVERLAY_particle_draw(OVERLAY_Data *vedata); -void OVERLAY_pointcloud_cache_init(OVERLAY_Data *vedata); -void OVERLAY_pointcloud_cache_populate(OVERLAY_Data *vedata, Object *ob); -void OVERLAY_pointcloud_draw(OVERLAY_Data *vedata); - void OVERLAY_sculpt_cache_init(OVERLAY_Data *vedata); void OVERLAY_sculpt_cache_populate(OVERLAY_Data *vedata, Object *ob); void OVERLAY_sculpt_draw(OVERLAY_Data *vedata); @@ -610,6 +607,7 @@ GPUShader *OVERLAY_shader_motion_path_vert(void); GPUShader *OVERLAY_shader_uniform_color(void); GPUShader *OVERLAY_shader_outline_prepass(bool use_wire); GPUShader *OVERLAY_shader_outline_prepass_gpencil(void); +GPUShader *OVERLAY_shader_outline_prepass_pointcloud(void); GPUShader *OVERLAY_shader_extra_grid(void); GPUShader *OVERLAY_shader_outline_detect(void); GPUShader *OVERLAY_shader_paint_face(void); @@ -620,7 +618,6 @@ GPUShader *OVERLAY_shader_paint_weight(void); GPUShader *OVERLAY_shader_paint_wire(void); GPUShader *OVERLAY_shader_particle_dot(void); GPUShader *OVERLAY_shader_particle_shape(void); -GPUShader *OVERLAY_shader_pointcloud_dot(void); GPUShader *OVERLAY_shader_sculpt_mask(void); GPUShader *OVERLAY_shader_volume_velocity(bool use_needle); GPUShader *OVERLAY_shader_wireframe(bool custom_bias); diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index edf91c99531..87f4642809b 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -103,8 +103,6 @@ extern char datatoc_paint_weight_vert_glsl[]; extern char datatoc_paint_wire_vert_glsl[]; extern char datatoc_particle_vert_glsl[]; extern char datatoc_particle_frag_glsl[]; -extern char datatoc_pointcloud_vert_glsl[]; -extern char datatoc_pointcloud_frag_glsl[]; extern char datatoc_sculpt_mask_vert_glsl[]; extern char datatoc_sculpt_mask_frag_glsl[]; extern char datatoc_volume_velocity_vert_glsl[]; @@ -127,6 +125,7 @@ extern char datatoc_common_fullscreen_vert_glsl[]; extern char datatoc_common_fxaa_lib_glsl[]; extern char datatoc_common_smaa_lib_glsl[]; extern char datatoc_common_globals_lib_glsl[]; +extern char datatoc_common_pointcloud_lib_glsl[]; extern char datatoc_common_view_lib_glsl[]; typedef struct OVERLAY_Shaders { @@ -181,6 +180,7 @@ typedef struct OVERLAY_Shaders { GPUShader *motion_path_vert; GPUShader *outline_prepass; GPUShader *outline_prepass_gpencil; + GPUShader *outline_prepass_pointcloud; GPUShader *outline_prepass_wire; GPUShader *outline_detect; GPUShader *paint_face; @@ -1135,6 +1135,33 @@ GPUShader *OVERLAY_shader_outline_prepass_gpencil(void) return sh_data->outline_prepass_gpencil; } +GPUShader *OVERLAY_shader_outline_prepass_pointcloud(void) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; + OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; + if (!sh_data->outline_prepass_pointcloud) { + sh_data->outline_prepass_pointcloud = GPU_shader_create_from_arrays({ + .vert = (const char *[]){sh_cfg->lib, + datatoc_common_view_lib_glsl, + datatoc_common_pointcloud_lib_glsl, + datatoc_gpu_shader_common_obinfos_lib_glsl, + datatoc_outline_prepass_vert_glsl, + NULL}, + .frag = (const char *[]){datatoc_common_view_lib_glsl, + datatoc_gpencil_common_lib_glsl, + datatoc_outline_prepass_frag_glsl, + NULL}, + .defs = (const char *[]){sh_cfg->def, + "#define POINTCLOUD\n", + "#define INSTANCED_ATTR\n", + "#define UNIFORM_RESOURCE_ID\n", + NULL}, + }); + } + return sh_data->outline_prepass_pointcloud; +} + GPUShader *OVERLAY_shader_outline_detect(void) { OVERLAY_Shaders *sh_data = &e_data.sh_data[0]; @@ -1306,25 +1333,6 @@ GPUShader *OVERLAY_shader_particle_shape(void) return sh_data->particle_shape; } -GPUShader *OVERLAY_shader_pointcloud_dot(void) -{ - const DRWContextState *draw_ctx = DRW_context_state_get(); - const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; - OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; - if (!sh_data->pointcloud_dot) { - sh_data->pointcloud_dot = GPU_shader_create_from_arrays({ - .vert = (const char *[]){sh_cfg->lib, - datatoc_common_globals_lib_glsl, - datatoc_common_view_lib_glsl, - datatoc_pointcloud_vert_glsl, - NULL}, - .frag = (const char *[]){datatoc_pointcloud_frag_glsl, NULL}, - .defs = (const char *[]){sh_cfg->def, "#define USE_DOTS\n", NULL}, - }); - } - return sh_data->pointcloud_dot; -} - GPUShader *OVERLAY_shader_sculpt_mask(void) { const DRWContextState *draw_ctx = DRW_context_state_get(); diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c index ea45ad5190c..2135e13ffe0 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.c +++ b/source/blender/draw/engines/overlay/overlay_wireframe.c @@ -235,10 +235,15 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, } } - if (use_wire && ob->type == OB_VOLUME) { - /* Volume object as points exception. */ - Volume *volume = ob->data; - if (volume->display.wireframe_type == VOLUME_WIREFRAME_POINTS) { + if (use_wire && ELEM(ob->type, OB_VOLUME, OB_POINTCLOUD)) { + bool draw_as_points = true; + if (ob->type == OB_VOLUME) { + /* Volume object as points exception. */ + Volume *volume = ob->data; + draw_as_points = volume->display.wireframe_type == VOLUME_WIREFRAME_POINTS; + } + + if (draw_as_points) { float *color; OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob); DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); diff --git a/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl b/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl index a2021759196..582a7c6cae2 100644 --- a/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl @@ -1,7 +1,7 @@ uniform bool isTransform; -#ifndef USE_GPENCIL +#if !defined(USE_GPENCIL) && !defined(POINTCLOUD) in vec3 pos; #endif @@ -56,7 +56,11 @@ void main() # endif #else +# ifdef POINTCLOUD + vec3 world_pos = pointcloud_get_pos(); +# else vec3 world_pos = point_object_to_world(pos); +# endif gl_Position = point_world_to_ndc(world_pos); # ifdef USE_GEOM vPos = point_world_to_view(world_pos); diff --git a/source/blender/draw/engines/overlay/shaders/pointcloud_frag.glsl b/source/blender/draw/engines/overlay/shaders/pointcloud_frag.glsl deleted file mode 100644 index 36928d0c776..00000000000 --- a/source/blender/draw/engines/overlay/shaders/pointcloud_frag.glsl +++ /dev/null @@ -1,16 +0,0 @@ - -in vec4 finalColor; - -out vec4 fragColor; - -void main() -{ - float dist = length(gl_PointCoord - vec2(0.5)); - - if (dist > 0.5) { - discard; - } - /* Nice sphere falloff. */ - float intensity = sqrt(1.0 - dist * 2.0) * 0.5 + 0.5; - fragColor = finalColor * vec4(intensity, intensity, intensity, 1.0); -} diff --git a/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl b/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl deleted file mode 100644 index d71ccee5159..00000000000 --- a/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl +++ /dev/null @@ -1,27 +0,0 @@ - -uniform vec4 color; - -/* ---- Per instance Attrs ---- */ -in vec3 pointcloud_pos; -in vec3 pointcloud_radius; - -out vec4 finalColor; - -void main() -{ - vec3 world_pos = point_object_to_world(pointcloud_pos); - - vec3 world_size = abs(mat3(ModelMatrix) * vec3(pointcloud_radius)); - float world_radius = (world_size.x + world_size.y + world_size.z) / 3.0; - - gl_Position = point_world_to_ndc(world_pos); - /* World sized points. */ - gl_PointSize = sizePixel * world_radius * ProjectionMatrix[1][1] * sizeViewport.y / - gl_Position.w; - - finalColor = color; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} |