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");
178 sub.push_constant(
"retopology_offset", retopology_offset);
179 select_face_flat = ⊂
182 auto &sub = select_face_ps.sub(
"FaceNoSelect");
184 sub.push_constant(
"select_id", 0);
185 sub.push_constant(
"retopology_offset", retopology_offset);
186 select_face_uniform = ⊂
189 select_edge_ps.init();
191 select_edge =
nullptr;
193 auto &sub = select_edge_ps.sub(
"Sub");
196 sub.push_constant(
"retopology_offset", retopology_offset);
200 select_id_vert_ps.init();
202 select_vert =
nullptr;
204 const float vertex_size =
U.pixelsize *
206 auto &sub = select_id_vert_ps.sub(
"Sub");
207 sub.state_set(
state, clipping_plane_count);
209 sub.push_constant(
"vertex_size",
float(2 * vertex_size));
210 sub.push_constant(
"retopology_offset", retopology_offset);
229 const uint initial_index)
246 face_sub->
draw(geom_faces, res_handle);
250 face_sub->
draw(geom_facedots, res_handle);
255#ifdef USE_CAGE_OCCLUSION
260 select_face_uniform->draw(geom_faces, res_handle);
269 select_edge->push_constant(
"offset",
int(ranges.
edge.
start()));
270 select_edge->draw(geom_edges, res_handle);
278 select_vert->push_constant(
"offset",
int(ranges.
vert.
start()));
279 select_vert->draw(geom_verts, res_handle);
287 const uint initial_index)
300 select_face_flat->push_constant(
"offset",
int(ranges.
face.
start()));
301 select_face_flat->draw(geom_faces, res_handle);
305 select_face_uniform->draw(geom_faces, res_handle);
312 select_edge->push_constant(
"offset",
int(ranges.
edge.
start()));
313 select_edge->draw(geom_edges, res_handle);
320 select_vert->push_constant(
"offset",
int(ranges.
vert.
start()));
321 select_vert->draw(geom_verts, res_handle);
330 BLI_assert_msg(index_start > 0,
"Index 0 is reserved for no selection");
339 BMEditMesh *em = (orig_edit_mesh) ? orig_edit_mesh->
runtime->edit_mesh.get() :
nullptr;
342 bool draw_facedot = check_ob_drawface_dot(select_mode, v3d,
eDrawType(ob->
dt));
343 return edit_mesh_sync(ob, em, res_handle, select_mode, draw_facedot, index_start);
345 return mesh_sync(ob, res_handle, select_mode, index_start);
357 Object *ob = ob_ref.object;
368 depth_occlude->draw(geom_faces, manager.unique_handle(ob_ref));
395 view_faces.sync(
view.viewmat(),
view.winmat());
404 manager.submit(depth_only_ps, view_faces);
410 manager.submit(select_face_ps, view_faces);
413 manager.submit(select_edge_ps, view_edges);
417 manager.submit(select_id_vert_ps, view_verts);
423 void framebuffer_setup()
431 if (e_data.framebuffer_select_id ==
nullptr) {
439 e_data.texture_u32 =
nullptr;
446 if (e_data.texture_u32 ==
nullptr) {
449 "select_buf_ids",
size[0],
size[1], 1, gpu::TextureFormat::UINT_32, usage,
nullptr);
456 short get_object_select_mode(
Scene *scene,
Object *ob)
458 short select_mode = 0;
481 bool check_ob_drawface_dot(
short select_mode,
const View3D *v3d,
eDrawType dt)
496 IndexRange alloc_range(IndexRange &total_range,
uint size)
512 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)
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
@ V3D_OVERLAY_EDIT_FACE_DOT
void DRW_submission_end()
void DRW_submission_start()
T & DRW_object_get_data_for_drawing(const Object &object)
#define XRAY_ENABLED(v3d)
#define RETOPOLOGY_ENABLED(v3d)
#define RETOPOLOGY_OFFSET(v3d)
#define XRAY_FLAG_ENABLED(v3d)
blender::gpu::FrameBuffer * GPU_framebuffer_create(const char *name)
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
void GPU_framebuffer_texture_attach(blender::gpu::FrameBuffer *fb, blender::gpu::Texture *texture, int slot, int mip)
bool GPU_framebuffer_check_valid(blender::gpu::FrameBuffer *fb, char err_out[256])
void GPU_framebuffer_clear_depth(blender::gpu::FrameBuffer *fb, float clear_depth)
void GPU_framebuffer_clear_color_depth(blender::gpu::FrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
#define GPU_SHADER_FREE_SAFE(shader)
blender::gpu::Shader * GPU_shader_create_from_info_name(const char *info_name)
#define GPU_SHADER_CFG_LEN
int GPU_texture_height(const blender::gpu::Texture *texture)
int GPU_texture_width(const blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
#define GPU_TEXTURE_FREE_SAFE(texture)
blender::gpu::Texture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(blender::gpu::Texture *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, ResourceIndexRange res_index={}, uint custom_id=0)
void push_constant(const char *name, const float &data)
detail::PassBase< command::DrawCommandBuf > Sub
const DRWContext * DRW_context_get()
#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
blender::gpu::Texture * DRW_engine_select_texture_get()
blender::gpu::FrameBuffer * DRW_engine_select_framebuffer_get()
SELECTID_Context * DRW_select_engine_context_get()
DefaultTextureList * viewport_texture_list_get() const
blender::gpu::FrameBuffer * depth_only_fb
blender::gpu::Texture * depth
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(const float4x4 &winmat, float offset)
DrawEngine * create_instance() final
static void free_static()
gpu::Shader * select_id_uniform
gpu::Shader * select_id_flat
gpu::FrameBuffer * framebuffer_select_id
blender::gpu::Texture * texture_u32
static StaticData & get()
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 object_sync(View3D *v3d, Object *ob, ResourceHandleRange res_handle, short select_mode, uint index_start)
ElemIndexRanges edit_mesh_sync(Object *ob, BMEditMesh *em, ResourceHandleRange res_handle, short select_mode, bool draw_facedot, const uint initial_index)
void draw(Manager &manager) final
ElemIndexRanges mesh_sync(Object *ob, ResourceHandleRange res_handle, short select_mode, const uint initial_index)
static float vertex_size_get()