27 PassMain outline_prepass_ps_ = {
"Prepass"};
44 PassMain outline_prepass_flat_ps_ = {
"PrepassFlat"};
52 flat_objects_.clear();
60 const bool do_expand = (
U.pixelsize > 1.0) || (outline_width > 2.0f);
64 auto &pass = outline_prepass_ps_;
68 pass.framebuffer_set(&prepass_fb_);
69 pass.clear_color_depth_stencil(
float4(0.0f), 1.0f, 0x0);
71 state.clipping_plane_count);
73 auto &sub = pass.sub(
"Curves");
74 sub.shader_set(res.shaders->outline_prepass_curves.get());
75 sub.push_constant(
"is_transform", is_transform);
76 prepass_curves_ps_ = ⊂
79 auto &sub = pass.sub(
"PointCloud");
80 sub.shader_set(res.shaders->outline_prepass_pointcloud.get());
81 sub.push_constant(
"is_transform", is_transform);
82 prepass_pointcloud_ps_ = ⊂
85 auto &sub = pass.sub(
"GreasePencil");
86 sub.shader_set(res.shaders->outline_prepass_gpencil.get());
87 sub.push_constant(
"is_transform", is_transform);
88 prepass_gpencil_ps_ = ⊂
91 auto &sub = pass.sub(
"Mesh");
92 sub.shader_set(res.shaders->outline_prepass_mesh.get());
93 sub.push_constant(
"is_transform", is_transform);
94 prepass_mesh_ps_ = ⊂
97 auto &sub = pass.sub(
"Volume");
98 sub.shader_set(res.shaders->outline_prepass_mesh.get());
99 sub.push_constant(
"is_transform", is_transform);
100 prepass_volume_ps_ = ⊂
103 auto &sub = pass.sub(
"Wire");
104 sub.shader_set(res.shaders->outline_prepass_wire.get());
105 sub.push_constant(
"is_transform", is_transform);
106 prepass_wire_ps_ = ⊂
110 auto &pass = outline_resolve_ps_;
113 pass.shader_set(res.shaders->outline_detect.get());
115 pass.push_constant(
"alpha_occlu",
state.xray_enabled ? 1.0f : 0.35f);
116 pass.push_constant(
"do_thick_outlines", do_expand);
117 pass.push_constant(
"do_anti_aliasing", do_smooth_lines);
118 pass.push_constant(
"is_xray_wires",
state.xray_enabled_and_not_wire);
119 pass.bind_texture(
"outline_id_tx", &object_id_tx_);
120 pass.bind_texture(
"scene_depth_tx", &res.depth_tx);
121 pass.bind_texture(
"outline_depth_tx", &tmp_depth_tx_);
143 switch (ob_ref.object->type) {
145 const char *
error =
nullptr;
149 prepass_curves_ps_->draw(geom, manager.unique_handle(ob_ref));
153 GreasePencil::draw_grease_pencil(
154 res, *prepass_gpencil_ps_,
state.scene, ob_ref.object, manager.unique_handle(ob_ref));
157 if (
state.xray_enabled_and_not_wire) {
159 prepass_wire_ps_->draw_expand(geom,
GPU_PRIM_LINES, 1, 1, manager.unique_handle(ob_ref));
163 prepass_mesh_ps_->draw(geom, manager.unique_handle(ob_ref));
168 if (flat_axis != -1) {
170 flat_objects_.append({geom, manager.unique_handle(ob_ref), flat_axis});
177 if (!
state.is_wireframe_mode) {
179 prepass_pointcloud_ps_->draw(geom, manager.unique_handle(ob_ref));
186 prepass_volume_ps_->draw(geom, manager.unique_handle(ob_ref));
197 outline_prepass_flat_ps_.init();
203 if (!
view.is_persp()) {
206 auto &pass = outline_prepass_flat_ps_;
209 pass.framebuffer_set(&prepass_fb_);
211 state.clipping_plane_count);
213 pass.push_constant(
"is_transform", is_transform);
216 flag_ob_ref.if_flat_axis_orthogonal_to_view(
230 manager.generate_commands(outline_prepass_ps_,
view);
231 manager.generate_commands(outline_prepass_flat_ps_,
view);
246 tmp_depth_tx_.acquire(render_size, gpu::TextureFormat::SFLOAT_32_DEPTH_UINT_8, usage);
247 object_id_tx_.acquire(render_size, gpu::TextureFormat::UINT_16, usage);
258 tmp_depth_tx_.release();
259 object_id_tx_.release();
@ USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
#define GPU_ATTACHMENT_TEXTURE(_texture)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
float UI_GetThemeValuef(int colorid)
void submit_only(PassMain &pass, View &view)
void submit(PassSimple &pass, View &view)
int3 size(int miplvl=0) const
detail::PassBase< command::DrawMultiBuf > Sub
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void flat_objects_pass_sync(Manager &manager, View &view, Resources &res, const State &state)
void pre_draw(Manager &manager, View &view) final
void begin_sync(Resources &res, const State &state) final
void draw_line_only_ex(Framebuffer &framebuffer, Resources &res, Manager &manager, View &view)
StaticShader outline_prepass_wire
blender::gpu::Shader * get()
#define DRW_CLIPPING_UBO_SLOT
#define OVERLAY_GLOBALS_SLOT
@ DRW_STATE_DEPTH_LESS_EQUAL
@ DRW_STATE_BLEND_ALPHA_PREMUL
static void error(const char *str)
detail::Pass< command::DrawCommandBuf > PassSimple
detail::Pass< command::DrawMultiBuf > PassMain
gpu::Batch * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, const char *&r_error, GPUMaterial *gpu_material=nullptr)
gpu::Batch * pointcloud_sub_pass_setup(PassMain::Sub &sub_ps, Object *object, GPUMaterial *gpu_material=nullptr)
gpu::Batch * DRW_cache_mesh_edge_detection_get(Object *ob, bool *r_is_manifold)
gpu::Batch * DRW_cache_volume_selection_surface_get(Object *ob)
gpu::Batch * DRW_cache_mesh_surface_get(Object *ob)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
static int flat_axis_index_get(const Object *ob)
draw::UniformArrayBuffer< float4, 6 > clip_planes_buf
draw::UniformBuffer< UniformData > globals_buf