Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/overlay')
-rw-r--r--source/blender/draw/engines/overlay/overlay_edit_curves.cc92
-rw-r--r--source/blender/draw/engines/overlay/overlay_engine.c14
-rw-r--r--source/blender/draw/engines/overlay/overlay_private.h11
3 files changed, 116 insertions, 1 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_edit_curves.cc b/source/blender/draw/engines/overlay/overlay_edit_curves.cc
new file mode 100644
index 00000000000..02e40ea0304
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_edit_curves.cc
@@ -0,0 +1,92 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "ED_view3d.h"
+
+#include "draw_cache_impl.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_edit_curves_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+
+ pd->edit_curves.do_zbufclip = XRAY_FLAG_ENABLED(draw_ctx->v3d);
+
+ /* Create view with depth offset. */
+ DRWView *default_view = (DRWView *)DRW_view_default_get();
+ pd->view_edit_curves_points = default_view;
+}
+
+void OVERLAY_edit_curves_cache_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_TextureList *txl = vedata->txl;
+ OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+ /* Desired masks (write to color and depth) and blend mode for rendering. */
+ DRWState state = (DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA |
+ DRW_STATE_WRITE_DEPTH);
+
+ /* Common boilerplate for shading groups. */
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const View3D *v3d = draw_ctx->v3d;
+ GPUTexture **depth_tex = (pd->edit_curves.do_zbufclip) ? &dtxl->depth : &txl->dummy_depth_tx;
+ const float backwire_opacity = (pd->edit_curves.do_zbufclip) ? v3d->overlay.backwire_opacity :
+ 1.0f;
+
+ /* Run Twice for in-front passes. */
+ for (int i = 0; i < 2; i++) {
+ DRW_PASS_CREATE(psl->edit_curves_points_ps[i], (state | pd->clipping_state));
+
+ GPUShader *sh = OVERLAY_shader_edit_curve_point();
+ DRWShadingGroup *grp = pd->edit_curves_points_grp[i] = DRW_shgroup_create(
+ sh, psl->edit_curves_points_ps[i]);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity);
+ DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex);
+ }
+}
+
+static void overlay_edit_curves_add_ob_to_pass(OVERLAY_PrivateData *pd, Object *ob, bool in_front)
+{
+ Curves *curves = static_cast<Curves *>(ob->data);
+ DRWShadingGroup *point_shgrp = pd->edit_curves_points_grp[in_front];
+ struct GPUBatch *geom_points = DRW_curves_batch_cache_get_edit_points(curves);
+ DRW_shgroup_call_no_cull(point_shgrp, geom_points, ob);
+}
+
+void OVERLAY_edit_curves_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+ if (pd->edit_curves.do_zbufclip) {
+ overlay_edit_curves_add_ob_to_pass(pd, ob, false);
+ }
+ else {
+ overlay_edit_curves_add_ob_to_pass(pd, ob, true);
+ }
+}
+
+void OVERLAY_edit_curves_draw(OVERLAY_Data *vedata)
+{
+ OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+ if (pd->edit_curves.do_zbufclip) {
+ DRW_view_set_active(pd->view_edit_curves_points);
+ DRW_draw_pass(psl->edit_curves_points_ps[NOT_IN_FRONT]);
+ }
+ else {
+ DRW_view_set_active(pd->view_edit_curves_points);
+ DRW_draw_pass(psl->edit_curves_points_ps[IN_FRONT]);
+ }
+}
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index f9fec171ddd..64bd34c2a23 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -111,6 +111,9 @@ static void OVERLAY_engine_init(void *vedata)
case CTX_MODE_EDIT_MESH:
OVERLAY_edit_mesh_init(vedata);
break;
+ case CTX_MODE_EDIT_CURVES:
+ OVERLAY_edit_curves_init(vedata);
+ break;
default:
/* Nothing to do. */
break;
@@ -182,9 +185,11 @@ static void OVERLAY_cache_init(void *vedata)
case CTX_MODE_WEIGHT_GPENCIL:
OVERLAY_edit_gpencil_cache_init(vedata);
break;
+ case CTX_MODE_EDIT_CURVES:
+ OVERLAY_edit_curves_cache_init(vedata);
+ break;
case CTX_MODE_SCULPT_CURVES:
case CTX_MODE_OBJECT:
- case CTX_MODE_EDIT_CURVES:
break;
default:
BLI_assert_msg(0, "Draw mode invalid");
@@ -250,6 +255,7 @@ static bool overlay_object_is_edit_mode(const OVERLAY_PrivateData *pd, const Obj
case OB_FONT:
return pd->ctx_mode == CTX_MODE_EDIT_TEXT;
case OB_CURVES:
+ return pd->ctx_mode == CTX_MODE_EDIT_CURVES;
case OB_POINTCLOUD:
case OB_VOLUME:
/* No edit mode yet. */
@@ -389,6 +395,9 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
case OB_FONT:
OVERLAY_edit_text_cache_populate(vedata, ob);
break;
+ case OB_CURVES:
+ OVERLAY_edit_curves_cache_populate(vedata, ob);
+ break;
}
}
else if (in_pose_mode && draw_bones) {
@@ -671,6 +680,9 @@ static void OVERLAY_draw_scene(void *vedata)
break;
case CTX_MODE_SCULPT_CURVES:
break;
+ case CTX_MODE_EDIT_CURVES:
+ OVERLAY_edit_curves_draw(vedata);
+ break;
default:
break;
}
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 94eccbcb1f3..71b6c9424e6 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -72,6 +72,7 @@ typedef struct OVERLAY_PassList {
DRWPass *edit_mesh_edges_ps[2];
DRWPass *edit_mesh_faces_ps[2];
DRWPass *edit_mesh_faces_cage_ps[2];
+ DRWPass *edit_curves_points_ps[2];
DRWPass *edit_mesh_analysis_ps;
DRWPass *edit_mesh_normals_ps;
DRWPass *edit_particle_ps;
@@ -266,6 +267,7 @@ typedef struct OVERLAY_PrivateData {
DRWShadingGroup *edit_uv_faces_grp;
DRWShadingGroup *edit_uv_face_dots_grp;
DRWShadingGroup *edit_uv_stretching_grp;
+ DRWShadingGroup *edit_curves_points_grp[2];
DRWShadingGroup *extra_grid_grp;
DRWShadingGroup *facing_grp[2];
DRWShadingGroup *fade_grp[2];
@@ -299,6 +301,7 @@ typedef struct OVERLAY_PrivateData {
DRWView *view_edit_verts;
DRWView *view_edit_text;
DRWView *view_reference_images;
+ DRWView *view_edit_curves_points;
/** TODO: get rid of this. */
ListBase smoke_domains;
@@ -347,6 +350,9 @@ typedef struct OVERLAY_PrivateData {
int flag; /** Copy of #v3d->overlay.edit_flag. */
} edit_mesh;
struct {
+ bool do_zbufclip;
+ } edit_curves;
+ struct {
bool use_weight;
int select_mode;
} edit_particle;
@@ -669,6 +675,11 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
void OVERLAY_wireframe_draw(OVERLAY_Data *vedata);
void OVERLAY_wireframe_in_front_draw(OVERLAY_Data *vedata);
+void OVERLAY_edit_curves_init(OVERLAY_Data *vedata);
+void OVERLAY_edit_curves_cache_init(OVERLAY_Data *vedata);
+void OVERLAY_edit_curves_cache_populate(OVERLAY_Data *vedata, Object *ob);
+void OVERLAY_edit_curves_draw(OVERLAY_Data *vedata);
+
void OVERLAY_shader_library_ensure(void);
GPUShader *OVERLAY_shader_antialiasing(void);
GPUShader *OVERLAY_shader_armature_degrees_of_freedom_wire(void);