39#define USE_CAGE_OCCLUSION
47 PassSimple select_edge_ps = {
"select_id_edge_ps"};
50 PassSimple select_id_vert_ps = {
"select_id_vert_ps"};
53 PassSimple select_face_ps = {
"select_id_face_ps"};
57 View view_faces = {
"view_faces"};
58 View view_edges = {
"view_edges"};
59 View view_verts = {
"view_verts"};
121 e_data.
context.
select_mode = get_object_select_mode(draw_ctx->scene, draw_ctx->obact);
134 clip_planes_buf[
i] =
float4(0);
141 clipping_plane_count);
144 clip_planes_buf[
i] = draw_ctx->rv3d->clip[
i];
147 clip_planes_buf.push_update();
150 depth_only_ps.init();
151 depth_only_ps.state_set(
state, clipping_plane_count);
153 depth_only =
nullptr;
154 depth_occlude =
nullptr;
156 auto &sub = depth_only_ps.sub(
"DepthOnly");
158 sub.push_constant(
"retopology_offset", retopology_offset);
159 sub.push_constant(
"select_id", 0);
162 if (retopology_occlusion) {
163 auto &sub = depth_only_ps.sub(
"Occlusion");
165 sub.push_constant(
"retopology_offset", 0.0f);
166 sub.push_constant(
"select_id", 0);
167 depth_occlude = ⊂
170 select_face_ps.init();
171 select_face_ps.state_set(
state, clipping_plane_count);
173 select_face_uniform =
nullptr;
174 select_face_flat =
nullptr;
176 auto &sub = select_face_ps.sub(
"Face");
177 const float vertex_size =
U.pixelsize *
180 sub.push_constant(
"vertex_size",
float(2 * vertex_size));
181 sub.push_constant(
"retopology_offset", retopology_offset);
182 select_face_flat = ⊂
185 auto &sub = select_face_ps.sub(
"FaceNoSelect");
187 sub.push_constant(
"select_id", 0);
188 sub.push_constant(
"retopology_offset", retopology_offset);
189 select_face_uniform = ⊂
192 select_edge_ps.init();
194 select_edge =
nullptr;
196 auto &sub = select_edge_ps.sub(
"Sub");
199 sub.push_constant(
"retopology_offset", retopology_offset);
203 select_id_vert_ps.init();
205 select_vert =
nullptr;
207 const float vertex_size =
U.pixelsize *
209 auto &sub = select_id_vert_ps.sub(
"Sub");
210 sub.state_set(
state, clipping_plane_count);
212 sub.push_constant(
"vertex_size",
float(2 * vertex_size));
213 sub.push_constant(
"retopology_offset", retopology_offset);
232 const uint initial_index)
249 face_sub->
draw(geom_faces, res_handle);
253 face_sub->
draw(geom_facedots, res_handle);
258#ifdef USE_CAGE_OCCLUSION
263 select_face_uniform->draw(geom_faces, res_handle);
272 select_edge->push_constant(
"offset",
int(ranges.
edge.
start()));
273 select_edge->draw(geom_edges, res_handle);
281 select_vert->push_constant(
"offset",
int(ranges.
vert.
start()));
282 select_vert->draw(geom_verts, res_handle);
290 const uint initial_index)
303 select_face_flat->push_constant(
"offset",
int(ranges.
face.
start()));
304 select_face_flat->draw(geom_faces, res_handle);
308 select_face_uniform->draw(geom_faces, res_handle);
315 select_edge->push_constant(
"offset",
int(ranges.
edge.
start()));
316 select_edge->draw(geom_edges, res_handle);
323 select_vert->push_constant(
"offset",
int(ranges.
vert.
start()));
324 select_vert->draw(geom_verts, res_handle);
333 BLI_assert_msg(index_start > 0,
"Index 0 is reserved for no selection");
342 BMEditMesh *em = (orig_edit_mesh) ? orig_edit_mesh->
runtime->edit_mesh.get() :
nullptr;
345 bool draw_facedot = check_ob_drawface_dot(select_mode, v3d,
eDrawType(ob->
dt));
346 return edit_mesh_sync(ob, em, res_handle, select_mode, draw_facedot, index_start);
348 return mesh_sync(ob, res_handle, select_mode, index_start);
360 Object *ob = ob_ref.object;
371 depth_occlude->draw(geom_faces, manager.resource_handle(ob_ref));
398 view_faces.sync(
view.viewmat(),
view.winmat());
407 manager.submit(depth_only_ps, view_faces);
413 manager.submit(select_face_ps, view_faces);
416 manager.submit(select_edge_ps, view_edges);
420 manager.submit(select_id_vert_ps, view_verts);
426 void framebuffer_setup()
434 if (e_data.framebuffer_select_id ==
nullptr) {
442 e_data.texture_u32 =
nullptr;
449 if (e_data.texture_u32 ==
nullptr) {
459 short get_object_select_mode(
Scene *scene,
Object *ob)
461 short r_select_mode = 0;
481 return r_select_mode;
484 bool check_ob_drawface_dot(
short select_mode,
const View3D *v3d,
eDrawType dt)
499 IndexRange alloc_range(IndexRange &total_range,
uint size)
515 for (
int sh_data_index = 0; sh_data_index <
ARRAY_SIZE(e_data.
sh_data); sh_data_index++) {
const Mesh * BKE_object_get_pre_modified_mesh(const Object *object)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
T * DEG_get_original(T *id)
#define RV3D_LOCK_FLAGS(rv3d)
@ V3D_OVERLAY_EDIT_FACE_DOT
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
void DRW_submission_end()
void DRW_submission_start()
#define XRAY_ENABLED(v3d)
#define RETOPOLOGY_ENABLED(v3d)
#define RETOPOLOGY_OFFSET(v3d)
#define XRAY_FLAG_ENABLED(v3d)
GPUFrameBuffer * GPU_framebuffer_create(const char *name)
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
bool GPU_framebuffer_check_valid(GPUFrameBuffer *fb, char err_out[256])
void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
void GPU_framebuffer_clear_depth(GPUFrameBuffer *fb, float clear_depth)
void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *texture, int slot, int mip)
#define GPU_SHADER_FREE_SAFE(shader)
GPUShader * GPU_shader_create_from_info_name(const char *info_name)
#define GPU_SHADER_CFG_LEN
int GPU_texture_height(const GPUTexture *texture)
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(GPUTexture *texture)
int GPU_texture_width(const GPUTexture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
#define GPU_TEXTURE_FREE_SAFE(texture)
BMesh const char void * data
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
constexpr IndexRange after(int64_t n) const
constexpr int64_t start() const
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
bool contains(const T &value) const
constexpr int64_t one_after_last() const
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
constexpr int64_t start() const
static View & default_get()
void draw(gpu::Batch *batch, uint instance_len=-1, uint vertex_len=-1, uint vertex_first=-1, ResourceHandleRange handle={0}, uint custom_id=0)
void push_constant(const char *name, const float &data)
detail::PassBase< command::DrawCommandBuf > Sub
const DRWContext * DRW_context_get()
Mesh & DRW_object_get_data_for_drawing(const Object &object)
#define DRW_CLIPPING_UBO_SLOT
@ DRW_STATE_FIRST_VERTEX_CONVENTION
#define DRW_STATE_DEFAULT
blender::gpu::Batch * DRW_mesh_batch_cache_get_facedots_with_select_id(Mesh &mesh)
detail::Pass< command::DrawCommandBuf > PassSimple
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_triangles_with_select_id(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_verts_with_select_id(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edges_with_select_id(Mesh &mesh)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
SELECTID_Context * DRW_select_engine_context_get()
GPUFrameBuffer * DRW_engine_select_framebuffer_get()
GPUTexture * DRW_engine_select_texture_get()
DefaultTextureList * viewport_texture_list_get() const
GPUFrameBuffer * depth_only_fb
blender::IndexRange total
MeshRuntimeHandle * runtime
blender::Map< Object *, ElemIndexRanges > elem_ranges
blender::Vector< Object * > objects
blender::float4x4 persmat
struct ToolSettings * toolsettings
float4x4 winmat_polygon_offset(float4x4 winmat, float offset)
DrawEngine * create_instance() final
static void free_static()
GPUShader * select_id_flat
GPUShader * select_id_uniform
static StaticData & get()
GPUFrameBuffer * framebuffer_select_id
struct blender::draw::edit_select::Instance::StaticData::Shaders sh_data[GPU_SHADER_CFG_LEN]
blender::StringRefNull name_get() final
void object_sync(ObjectRef &ob_ref, Manager &manager) final
ElemIndexRanges edit_mesh_sync(Object *ob, BMEditMesh *em, ResourceHandle res_handle, short select_mode, bool draw_facedot, const uint initial_index)
void draw(Manager &manager) final
ElemIndexRanges mesh_sync(Object *ob, ResourceHandle res_handle, short select_mode, const uint initial_index)
ElemIndexRanges object_sync(View3D *v3d, Object *ob, ResourceHandle res_handle, short select_mode, uint index_start)
static float vertex_size_get()