[Bf-blender-cvs] [d16c0501bda] tmp-overlay-engine: Overlay Engine: More Extra overlays
Clément Foucault
noreply at git.blender.org
Fri Nov 15 01:35:12 CET 2019
Commit: d16c0501bdab772e2bc4bf2c7d4c7c4a11d26fd2
Author: Clément Foucault
Date: Fri Nov 8 22:50:39 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBd16c0501bdab772e2bc4bf2c7d4c7c4a11d26fd2
Overlay Engine: More Extra overlays
- Stippled Relationship Lines (without geometry shader)
- Object centers
- Objects Names
- Bounds
- A bit of code reorganisation
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/extra_point_vert.glsl
M source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
M source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
M source/blender/draw/intern/draw_common.c
M source/blender/draw/intern/draw_common.h
M source/blender/draw/modes/shaders/common_globals_lib.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 3ef8ccdd575..7f370219b0f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -397,6 +397,7 @@ data_to_c_simple(engines/overlay/shaders/edit_mesh_skin_root_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/edit_mesh_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_groundline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_point_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_wire_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_wire_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 49c1d34604e..d45eae4c56c 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -195,6 +195,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
(pd->v3d_flag & V3D_SELECT_OUTLINE) &&
((ob->base_flag & BASE_SELECTED) ||
(DRW_state_is_select() && ob->type == OB_LIGHTPROBE));
+ const bool draw_extras =
+ ((pd->overlay.flag & V3D_OVERLAY_HIDE_OBJECT_XTRAS) == 0) ||
+ /* Show if this is the camera we're looking through since it's useful for selecting. */
+ ((draw_ctx->rv3d->persp == RV3D_CAMOB) && ((ID *)draw_ctx->v3d->camera == ob->id.orig_id));
bool init;
OVERLAY_DupliData *dupli = OVERLAY_duplidata_get(ob, vedata, &init);
@@ -240,7 +244,7 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
// OVERLAY_wireframe_cache_populate();
// }
// }
- /* Non-Meshes */
+
switch (ob->type) {
// case OB_ARMATURE:
// OVERLAY_armature_cache_populate();
@@ -251,17 +255,30 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
// case OB_FONT:
// OVERLAY_font_cache_populate();
// break;
- case OB_EMPTY:
- case OB_LAMP:
- case OB_CAMERA:
- case OB_SPEAKER:
- case OB_LIGHTPROBE:
- OVERLAY_extra_cache_populate(vedata, ob, dupli, init);
+ case OB_GPENCIL:
+ OVERLAY_gpencil_cache_populate(vedata, ob);
break;
}
- // if (draw_extra) {
- // OVERLAY_extra_cache_populate();
- // }
+ /* Non-Meshes */
+ if (draw_extras) {
+ switch (ob->type) {
+ case OB_EMPTY:
+ OVERLAY_empty_cache_populate(vedata, ob);
+ break;
+ case OB_LAMP:
+ OVERLAY_light_cache_populate(vedata, ob);
+ break;
+ case OB_CAMERA:
+ OVERLAY_camera_cache_populate(vedata, ob);
+ break;
+ case OB_SPEAKER:
+ case OB_LIGHTPROBE:
+ break;
+ }
+ }
+
+ /* Relationship, object center, bounbox ... */
+ OVERLAY_extra_cache_populate(vedata, ob);
if (dupli) {
dupli->base_flag = ob->base_flag;
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index f175e4bf11e..eedc6986f2a 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -25,11 +25,20 @@
#include "UI_resources.h"
#include "BKE_camera.h"
+#include "BKE_constraint.h"
+#include "BKE_curve.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
#include "BKE_movieclip.h"
#include "BKE_object.h"
#include "BKE_tracking.h"
#include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_rigidbody_types.h"
#include "DEG_depsgraph_query.h"
@@ -45,9 +54,11 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
OVERLAY_PassList *psl = vedata->psl;
OVERLAY_PrivateData *pd = vedata->stl->pd;
+ DRW_PASS_CREATE(psl->extra_blend_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA);
+ DRW_PASS_CREATE(psl->extra_centers_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA);
+
for (int i = 0; i < 2; i++) {
/* Non Meshes Pass (Camera, empties, lights ...) */
- // struct GPUBatch *geom;
struct GPUShader *sh;
struct GPUVertFormat *format;
DRWShadingGroup *grp, *grp_sub;
@@ -230,7 +241,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
}
{
format = formats->instance_pos;
- sh = OVERLAY_shader_extra_grounline();
+ sh = OVERLAY_shader_extra_groundline();
grp = DRW_shgroup_create(sh, extra_ps);
DRW_shgroup_uniform_float_copy(grp, "pixel_size", pixelsize);
@@ -245,12 +256,38 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
grp = DRW_shgroup_create(sh, extra_ps);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_uniform_vec2(grp, "viewport_size", DRW_viewport_size_get(), 1);
+
+ cb->extra_dashed_lines = BUF_LINE(grp, formats->wire_dashed_extra);
+ cb->extra_lines = BUF_LINE(grp, formats->wire_extra);
+ }
+ {
+ format = formats->pos;
+ sh = OVERLAY_shader_extra_point();
+
+ grp = DRW_shgroup_create(sh, psl->extra_centers_ps);
+ DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+
+ grp_sub = DRW_shgroup_create_sub(grp);
+ DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorActive);
+ cb->center_active = BUF_POINT(grp_sub, format);
+
+ grp_sub = DRW_shgroup_create_sub(grp);
+ DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorSelect);
+ cb->center_selected = BUF_POINT(grp_sub, format);
+
+ grp_sub = DRW_shgroup_create_sub(grp);
+ DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorDeselect);
+ cb->center_deselected = BUF_POINT(grp_sub, format);
- /* This one is suboptimal (gl_lines instead of gl_line_strip)
- * but we keep this for simplicity */
- cb->camera_path = DRW_shgroup_call_buffer(grp, formats->wire_extra, GPU_PRIM_LINES);
+ grp_sub = DRW_shgroup_create_sub(grp);
+ DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorLibrarySelect);
+ cb->center_selected_lib = BUF_POINT(grp_sub, format);
+
+ grp_sub = DRW_shgroup_create_sub(grp);
+ DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorLibrary);
+ cb->center_deselected_lib = BUF_POINT(grp_sub, format);
}
- // sh = OVERLAY_shader_extra_points();
#if 0
/* -------- STIPPLES ------- */
@@ -287,15 +324,40 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
}
}
+static void OVERLAY_extra_line_dashed(OVERLAY_ExtraCallBuffers *cb,
+ const float start[3],
+ const float end[3],
+ const float color[4])
+{
+ DRW_buffer_add_entry(cb->extra_dashed_lines, start, start, color);
+ DRW_buffer_add_entry(cb->extra_dashed_lines, end, start, color);
+}
+
+static void OVERLAY_extra_line(OVERLAY_ExtraCallBuffers *cb,
+ const float start[3],
+ const float end[3],
+ const int color_id)
+{
+ DRW_buffer_add_entry(cb->extra_lines, start, &color_id);
+ DRW_buffer_add_entry(cb->extra_lines, end, &color_id);
+}
+
+static OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
+{
+ bool do_in_front = (ob->dtx & OB_DRAWXRAY) != 0;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ return &pd->extra_call_buffers[do_in_front];
+}
+
/* -------------------------------------------------------------------- */
/** \name Empties
* \{ */
-static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
- const float mat[4][4],
- const float *draw_size,
- char draw_type,
- const float color[4])
+static void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
+ const float mat[4][4],
+ const float *draw_size,
+ char draw_type,
+ const float color[4])
{
float instdata[4][4];
copy_m4_m4(instdata, mat);
@@ -329,13 +391,17 @@ static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
}
}
-static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLayer *view_layer)
+void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
{
if (((ob->base_flag & BASE_FROM_DUPLI) != 0) && ((ob->transflag & OB_DUPLICOLLECTION) != 0) &&
ob->instance_collection) {
return;
}
+ OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob);
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+
float *color;
DRW_object_wire_theme_get(ob, view_layer, &color);
@@ -347,7 +413,7 @@ static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLaye
case OB_EMPTY_SPHERE:
case OB_EMPTY_CONE:
case OB_ARROWS:
- DRW_shgroup_empty_ex(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
+ OVERLAY_empty_shape(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
break;
case OB_EMPTY_IMAGE:
// DRW_shgroup_empty_image(sh_data, sgl, ob, color, rv3d, sh_cfg);
@@ -355,14 +421,170 @@ static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLaye
}
}
+static void OVERLAY_bounds(
+ OVERLAY_ExtraCallBuffers *cb, Object *ob, int theme_id, char boundtype, bool around_origin)
+{
+ float color[4], center[3], size[3], tmp[4][4], final_mat[4][4];
+ BoundBox bb_local;
+
+ if (ob->type == OB_MBALL && !BKE_mball_is_basis(ob)) {
+ return;
+ }
+
+ BoundBox *bb = BKE_object_boundbox_get(ob);
+
+ if (!ELEM(ob->type,
+ OB_MESH,
+ OB_CURVE,
+ OB_SURF,
+ OB_FONT,
+ OB_MBALL,
+ OB_ARMATURE,
+ OB_LATTICE,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list