[Bf-blender-cvs] [764cc75e1f9] master: Edit Mesh Selection: Move ED_view3d_select_ functions to bf_draw

mano-wii noreply at git.blender.org
Wed Aug 7 17:47:31 CEST 2019


Commit: 764cc75e1f92abefa3adf4ece3bbfe99e5227599
Author: mano-wii
Date:   Wed Aug 7 12:43:04 2019 -0300
Branches: master
https://developer.blender.org/rB764cc75e1f92abefa3adf4ece3bbfe99e5227599

Edit Mesh Selection: Move ED_view3d_select_ functions to bf_draw

It is easier to deal with private values of the DRW_select engine and gives room for improvement.

Reviewers: campbellbarton, fclem

Differential Revision: https://developer.blender.org/D5415

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
A	source/blender/draw/DRW_select_buffer.h
R053	source/blender/editors/util/select_buffer_utils.c	source/blender/draw/engines/select/select_buffer.c
M	source/blender/draw/engines/select/select_draw_utils.c
M	source/blender/draw/engines/select/select_engine.c
M	source/blender/draw/engines/select/select_private.h
M	source/blender/draw/intern/draw_manager.c
D	source/blender/editors/include/ED_select_buffer_utils.h
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/sculpt_paint/CMakeLists.txt
M	source/blender/editors/sculpt_paint/paint_utils.c
M	source/blender/editors/space_view3d/view3d_draw_legacy.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/util/CMakeLists.txt

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 8dc4972bcc1..27328084f31 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -129,8 +129,10 @@ set(SRC
   engines/gpencil/gpencil_shader_fx.c
   engines/select/select_engine.c
   engines/select/select_draw_utils.c
+  engines/select/select_buffer.c
 
   DRW_engine.h
+  DRW_select_buffer.h
   intern/DRW_render.h
   intern/draw_cache.h
   intern/draw_cache_impl.h
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 87a96740c56..53cec599b82 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -176,17 +176,4 @@ void DRW_deferred_shader_remove(struct GPUMaterial *mat);
 struct DrawDataList *DRW_drawdatalist_from_id(struct ID *id);
 void DRW_drawdata_free(struct ID *id);
 
-/* select_engine.c */
-void DRW_select_context_create(struct Base **bases, const uint bases_len, short select_mode);
-bool DRW_select_elem_get(const uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type);
-uint DRW_select_context_offset_for_object_elem(const uint base_index, char elem_type);
-uint DRW_select_context_elem_len(void);
-uint *DRW_framebuffer_select_id_read(const struct rcti *rect, uint *r_buf_len);
-void DRW_draw_select_id_object(struct Depsgraph *depsgraph,
-                               struct ViewLayer *view_layer,
-                               struct ARegion *ar,
-                               struct View3D *v3d,
-                               struct Object *ob,
-                               short select_mode);
-
 #endif /* __DRW_ENGINE_H__ */
diff --git a/source/blender/draw/DRW_select_buffer.h b/source/blender/draw/DRW_select_buffer.h
new file mode 100644
index 00000000000..cc3cb94175a
--- /dev/null
+++ b/source/blender/draw/DRW_select_buffer.h
@@ -0,0 +1,65 @@
+/*
+ * 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 2016, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw
+ */
+
+#ifndef __DRW_SELECT_BUFFER_H__
+#define __DRW_SELECT_BUFFER_H__
+
+#include "BLI_sys_types.h" /* for bool and uint */
+
+struct ARegion;
+struct Base;
+struct Depsgraph;
+struct Object;
+struct View3D;
+struct ViewLayer;
+struct rcti;
+
+/* select_buffer.c */
+void DRW_select_buffer_context_create(struct Base **bases,
+                                      const uint bases_len,
+                                      short select_mode);
+bool DRW_select_buffer_elem_get(const uint sel_id,
+                                uint *r_elem,
+                                uint *r_base_index,
+                                char *r_elem_type);
+uint DRW_select_buffer_context_offset_for_object_elem(const uint base_index, char elem_type);
+uint *DRW_select_buffer_read(const struct rcti *rect, uint *r_buf_len);
+void DRW_draw_select_id_object(struct Depsgraph *depsgraph,
+                               struct ViewLayer *view_layer,
+                               struct ARegion *ar,
+                               struct View3D *v3d,
+                               struct Object *ob,
+                               short select_mode);
+uint *DRW_select_buffer_bitmap_from_rect(const struct rcti *rect, uint *r_bitmap_len);
+uint *DRW_select_buffer_bitmap_from_circle(const int center[2],
+                                           const int radius,
+                                           uint *r_bitmap_len);
+uint *DRW_select_buffer_bitmap_from_poly(const int poly[][2],
+                                         const int poly_len,
+                                         const struct rcti *rect);
+uint DRW_select_buffer_sample_point(const int center[2]);
+uint DRW_select_buffer_find_nearest_to_point(const int center[2],
+                                             const uint id_min,
+                                             const uint id_max,
+                                             uint *dist);
+
+#endif /* __DRW_SELECT_BUFFER_H__ */
diff --git a/source/blender/editors/util/select_buffer_utils.c b/source/blender/draw/engines/select/select_buffer.c
similarity index 53%
rename from source/blender/editors/util/select_buffer_utils.c
rename to source/blender/draw/engines/select/select_buffer.c
index df5864d3dd1..6ee62a59cb5 100644
--- a/source/blender/editors/util/select_buffer_utils.c
+++ b/source/blender/draw/engines/select/select_buffer.c
@@ -13,17 +13,13 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
+ * Copyright 2019, Blender Foundation.
  */
 
 /** \file
- * \ingroup edutil
+ * \ingroup draw_engine
  *
- * Generic utilities for handling buffer selection where selection ID's are drawn onto
- * an off screen buffer.
- *
- * All coordinates are relative to the current region.
+ * Utilities to read id buffer created in select_engine.
  */
 
 #include "MEM_guardedalloc.h"
@@ -31,11 +27,67 @@
 #include "BLI_bitmap.h"
 #include "BLI_bitmap_draw_2d.h"
 #include "BLI_rect.h"
-#include "BLI_utildefines.h"
+
+#include "DNA_screen_types.h"
+
+#include "GPU_select.h"
 
 #include "DRW_engine.h"
+#include "DRW_select_buffer.h"
+
+#include "select_private.h"
+#include "select_engine.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Buffer of select ID's
+ * \{ */
+
+/* Read a block of pixels from the select frame buffer. */
+uint *DRW_select_buffer_read(const rcti *rect, uint *r_buf_len)
+{
+  struct SELECTID_Context *select_ctx = select_context_get();
+
+  /* clamp rect by texture */
+  rcti r = {
+      .xmin = 0,
+      .xmax = GPU_texture_width(select_ctx->texture_u32),
+      .ymin = 0,
+      .ymax = GPU_texture_height(select_ctx->texture_u32),
+  };
+
+  rcti rect_clamp = *rect;
+  if (BLI_rcti_isect(&r, &rect_clamp, &rect_clamp)) {
+    uint buf_len = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
+    uint *r_buf = MEM_mallocN(buf_len * sizeof(*r_buf), __func__);
+
+    DRW_opengl_context_enable();
+    GPU_framebuffer_bind(select_ctx->framebuffer_select_id);
+    glReadBuffer(GL_COLOR_ATTACHMENT0);
+    glReadPixels(rect_clamp.xmin,
+                 rect_clamp.ymin,
+                 BLI_rcti_size_x(&rect_clamp),
+                 BLI_rcti_size_y(&rect_clamp),
+                 GL_RED_INTEGER,
+                 GL_UNSIGNED_INT,
+                 r_buf);
+
+    GPU_framebuffer_restore();
+    DRW_opengl_context_disable();
+
+    if (!BLI_rcti_compare(rect, &rect_clamp)) {
+      GPU_select_buffer_stride_realign(rect, &rect_clamp, r_buf);
+    }
 
-#include "ED_select_buffer_utils.h"
+    if (r_buf_len) {
+      *r_buf_len = buf_len;
+    }
+
+    return r_buf;
+  }
+  return NULL;
+}
+
+/** \} */
 
 /* -------------------------------------------------------------------- */
 /** \name Select Bitmap from ID's
@@ -46,13 +98,15 @@
  * \{ */
 
 /**
- * \param bitmap_len: Number of indices in the selection id buffer.
  * \param rect: The rectangle to sample indices from (min/max inclusive).
+ * \param mask: Specifies the rect pixels (optional).
  * \returns a #BLI_bitmap the length of \a bitmap_len or NULL on failure.
  */
-uint *ED_select_buffer_bitmap_from_rect(const rcti *rect, uint *r_bitmap_len)
+uint *DRW_select_buffer_bitmap_from_rect(const rcti *rect, uint *r_bitmap_len)
 {
-  const uint bitmap_len = DRW_select_context_elem_len();
+  struct SELECTID_Context *select_ctx = select_context_get();
+
+  const uint bitmap_len = select_ctx->last_index_drawn;
   if (bitmap_len == 0) {
     return NULL;
   }
@@ -62,16 +116,13 @@ uint *ED_select_buffer_bitmap_from_rect(const rcti *rect, uint *r_bitmap_len)
   rect_px.ymax += 1;
 
   uint buf_len;
-  const uint *buf = DRW_framebuffer_select_id_read(&rect_px, &buf_len);
-
+  uint *buf = DRW_select_buffer_read(&rect_px, &buf_len);
   if (buf == NULL) {
     return NULL;
   }
 
-  const uint *buf_iter = buf;
-
   BLI_bitmap *bitmap_buf = BLI_BITMAP_NEW(bitmap_len, __func__);
-
+  const uint *buf_iter = buf;
   while (buf_len--) {
     const uint index = *buf_iter - 1;
     if (index < bitmap_len) {
@@ -79,12 +130,8 @@ uint *ED_select_buffer_bitmap_from_rect(const rcti *rect, uint *r_bitmap_len)
     }
     buf_iter++;
   }
-  MEM_freeN((void *)buf);
-
-  if (r_bitmap_len) {
-    *r_bitmap_len = bitmap_len;
-  }
 
+  MEM_freeN((void *)buf);
   return bitmap_buf;
 }
 
@@ -94,11 +141,13 @@ uint *ED_select_buffer_bitmap_from_rect(const rcti *rect, uint *r_bitmap_len)
  * \param radius: Circle radius.
  * \returns a #BLI_bitmap the length of \a bitmap_len or NULL on failure.
  */
-uint *ED_select_buffer_bitmap_from_circle(const int center[2],
-                                          const int radius,
-                                          uint *r_bitmap_len)
+uint *DRW_select_buffer_bitmap_from_circle(const int center[2],
+                                           const int radius,
+                                           uint *r_bitmap_len)
 {
-  const uint bitmap_len = DRW_select_context_elem_len();
+  struct SELECTID_Context *select_ctx = select_context_get();
+
+  const uint bitmap_len = select_ctx->last_index_drawn;
   if (bitmap_len == 0) {
     return NULL;
   }
@@ -110,7 +159,7 @@ uint *ED_select_buffer_bitmap_from_circle(const int center[2],
       .ymax = center[1] + radius + 1,
   };
 
-  const uint *buf = DRW_framebuffer_select_id_read(&rect, NULL);
+  const uint *buf = DRW_select_buffer_read(&rect

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list