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/select/select_engine.c')
-rw-r--r--source/blender/draw/engines/select/select_engine.c207
1 files changed, 3 insertions, 204 deletions
diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c
index 260fe8793e6..06998813830 100644
--- a/source/blender/draw/engines/select/select_engine.c
+++ b/source/blender/draw/engines/select/select_engine.c
@@ -24,59 +24,22 @@
#include "BLI_rect.h"
-#include "BKE_editmesh.h"
-
-#include "DNA_mesh_types.h"
#include "DNA_screen_types.h"
-#include "ED_view3d.h"
-
#include "GPU_shader.h"
#include "GPU_select.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "UI_resources.h"
#include "DRW_engine.h"
-#include "DRW_render.h"
-
-#include "draw_cache_impl.h"
+#include "select_private.h"
#include "select_engine.h"
-/* Shaders */
#define SELECT_ENGINE "SELECT_ENGINE"
-/* *********** LISTS *********** */
-
-/* GPUViewport.storage
- * Is freed everytime the viewport engine changes */
-typedef struct SELECTID_StorageList {
- struct SELECTID_PrivateData *g_data;
-} SELECTID_StorageList;
-
-typedef struct SELECTID_PassList {
- struct DRWPass *select_id_face_pass;
- struct DRWPass *select_id_edge_pass;
- struct DRWPass *select_id_vert_pass;
-} SELECTID_PassList;
-
-typedef struct SELECTID_Data {
- void *engine_type;
- DRWViewportEmptyList *fbl;
- DRWViewportEmptyList *txl;
- SELECTID_PassList *psl;
- SELECTID_StorageList *stl;
-} SELECTID_Data;
-
-typedef struct SELECTID_Shaders {
- /* Depth Pre Pass */
- struct GPUShader *select_id_flat;
- struct GPUShader *select_id_uniform;
-} SELECTID_Shaders;
-
/* *********** STATIC *********** */
static struct {
@@ -97,34 +60,6 @@ static struct {
} context;
} e_data = {{{NULL}}}; /* Engine data */
-typedef struct SELECTID_PrivateData {
- DRWShadingGroup *shgrp_face_unif;
- DRWShadingGroup *shgrp_face_flat;
- DRWShadingGroup *shgrp_edge;
- DRWShadingGroup *shgrp_vert;
-
- DRWView *view_faces;
- DRWView *view_edges;
- DRWView *view_verts;
-} SELECTID_PrivateData; /* Transient data */
-
-struct BaseOffset {
- /* For convenience only. */
- union {
- uint offset;
- uint face_start;
- };
- union {
- uint face;
- uint edge_start;
- };
- union {
- uint edge;
- uint vert_start;
- };
- uint vert;
-};
-
/* Shaders */
extern char datatoc_common_view_lib_glsl[];
extern char datatoc_selection_id_3D_vert_glsl[];
@@ -161,140 +96,6 @@ static void draw_select_framebuffer_select_id_setup(void)
}
}
-static void draw_select_id_object(void *vedata,
- Object *ob,
- short select_mode,
- bool draw_facedot,
- uint initial_offset,
- uint *r_vert_offset,
- uint *r_edge_offset,
- uint *r_face_offset)
-{
- SELECTID_StorageList *stl = ((SELECTID_Data *)vedata)->stl;
-
- BLI_assert(initial_offset > 0);
-
- switch (ob->type) {
- case OB_MESH:
- if (ob->mode & OB_MODE_EDIT) {
- Mesh *me = ob->data;
- BMEditMesh *em = me->edit_mesh;
- const bool use_faceselect = (select_mode & SCE_SELECT_FACE) != 0;
-
- DRW_mesh_batch_cache_validate(me);
-
- BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE | BM_FACE);
-
- struct GPUBatch *geom_faces, *geom_edges, *geom_verts, *geom_facedots;
- geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me);
- if (select_mode & SCE_SELECT_EDGE) {
- geom_edges = DRW_mesh_batch_cache_get_edges_with_select_id(me);
- }
- if (select_mode & SCE_SELECT_VERTEX) {
- geom_verts = DRW_mesh_batch_cache_get_verts_with_select_id(me);
- }
- if (use_faceselect && draw_facedot) {
- geom_facedots = DRW_mesh_batch_cache_get_facedots_with_select_id(me);
- }
-
- DRWShadingGroup *face_shgrp;
- if (use_faceselect) {
- face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_flat);
- DRW_shgroup_uniform_int_copy(face_shgrp, "offset", *(int *)&initial_offset);
-
- if (draw_facedot) {
- DRW_shgroup_call(face_shgrp, geom_facedots, ob);
- }
- *r_face_offset = initial_offset + em->bm->totface;
- }
- else {
- face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_unif);
- DRW_shgroup_uniform_int_copy(face_shgrp, "id", 0);
-
- *r_face_offset = initial_offset;
- }
- DRW_shgroup_call(face_shgrp, geom_faces, ob);
-
- /* Unlike faces, only draw edges if edge select mode. */
- if (select_mode & SCE_SELECT_EDGE) {
- DRWShadingGroup *edge_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_edge);
- DRW_shgroup_uniform_int_copy(edge_shgrp, "offset", *(int *)r_face_offset);
- DRW_shgroup_call(edge_shgrp, geom_edges, ob);
- *r_edge_offset = *r_face_offset + em->bm->totedge;
- }
- else {
- /* Note that `r_vert_offset` is calculated from `r_edge_offset`.
- * Otherwise the first vertex is never selected, see: T53512. */
- *r_edge_offset = *r_face_offset;
- }
-
- /* Unlike faces, only verts if vert select mode. */
- if (select_mode & SCE_SELECT_VERTEX) {
- DRWShadingGroup *vert_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_vert);
- DRW_shgroup_uniform_int_copy(vert_shgrp, "offset", *(int *)r_edge_offset);
- DRW_shgroup_call(vert_shgrp, geom_verts, ob);
- *r_vert_offset = *r_edge_offset + em->bm->totvert;
- }
- else {
- *r_vert_offset = *r_edge_offset;
- }
- }
- else {
- Mesh *me_orig = DEG_get_original_object(ob)->data;
- Mesh *me_eval = ob->data;
-
- struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me_eval);
- if ((me_orig->editflag & ME_EDIT_PAINT_VERT_SEL) &&
- /* Currently vertex select supports weight paint and vertex paint. */
- ((ob->mode & OB_MODE_WEIGHT_PAINT) || (ob->mode & OB_MODE_VERTEX_PAINT))) {
-
- struct GPUBatch *geom_verts = DRW_mesh_batch_cache_get_verts_with_select_id(me_eval);
-
- /* Only draw faces to mask out verts, we don't want their selection ID's. */
- DRWShadingGroup *face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_unif);
- DRW_shgroup_uniform_int_copy(face_shgrp, "id", 0);
- DRW_shgroup_call(face_shgrp, geom_faces, ob);
-
- DRWShadingGroup *vert_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_vert);
- DRW_shgroup_uniform_int_copy(vert_shgrp, "offset", 1);
- DRW_shgroup_call(vert_shgrp, geom_verts, ob);
-
- *r_face_offset = *r_edge_offset = initial_offset;
- *r_vert_offset = me_eval->totvert + 1;
- }
- else {
- DRWShadingGroup *face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_flat);
- DRW_shgroup_uniform_int_copy(face_shgrp, "offset", *(int *)&initial_offset);
- DRW_shgroup_call(face_shgrp, geom_faces, ob);
-
- *r_face_offset = initial_offset + me_eval->totpoly;
- *r_edge_offset = *r_vert_offset = *r_face_offset;
- }
- }
- break;
- case OB_CURVE:
- case OB_SURF:
- break;
- }
-}
-
-static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char dt)
-{
- if (select_mode & SCE_SELECT_FACE) {
- if ((dt < OB_SOLID) || XRAY_FLAG_ENABLED(v3d)) {
- return true;
- }
- if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) {
- return true;
- }
- if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
- /* Since we can't deduce face selection when edges aren't visible - show dots. */
- return true;
- }
- }
- return false;
-}
-
/** \} */
/* -------------------------------------------------------------------- */
@@ -395,17 +196,15 @@ static void select_cache_populate(void *vedata, Object *ob)
select_mode = ts->selectmode;
}
- bool draw_facedot = check_ob_drawface_dot(select_mode, draw_ctx->v3d, ob->dt);
-
struct BaseOffset *base_ofs =
&e_data.context.base_array_index_offsets[e_data.context.last_base_drawn++];
uint offset = e_data.context.last_index_drawn;
- draw_select_id_object(vedata,
+ select_id_draw_object(vedata,
+ draw_ctx->v3d,
ob,
select_mode,
- draw_facedot,
offset,
&base_ofs->vert,
&base_ofs->edge,