48 state.show_text =
false;
51 state.clipping_plane_count = clipping_enabled_ ? 6 : 0;
56 if (
state.v3d !=
nullptr) {
61 state.use_in_front =
true;
68 !
state.is_depth_only_drawing;
72 const bool viewport_uses_workbench =
state.v3d->shading.type <=
OB_SOLID ||
74 const bool viewport_uses_eevee =
STREQ(
81 state.is_render_depth_available = viewport_uses_workbench ||
82 (viewport_uses_eevee && !use_resolution_scaling);
86 state.is_render_depth_available |=
state.is_depth_only_drawing;
88 if (!
state.hide_overlays) {
96 memset(&
state.overlay, 0,
sizeof(
state.overlay));
98 state.v3d_gridflag = 0;
102 state.overlay.wireframe_threshold =
state.v3d->overlay.wireframe_threshold;
103 state.overlay.wireframe_opacity =
state.v3d->overlay.wireframe_opacity;
106 state.do_pose_xray =
state.show_bone_selection();
110 else if (
state.is_space_image()) {
113 state.clear_in_front =
false;
114 state.use_in_front =
false;
115 state.is_wireframe_mode =
false;
117 state.xray_enabled =
false;
119 state.is_render_depth_available =
true;
124 state.is_image_valid = bool(space_image->
image);
133 ensure_weight_ramp_texture();
137 if (
resources.dummy_depth_tx.ensure_2d(gpu::TextureFormat::SFLOAT_32_DEPTH,
int2(1, 1), usage))
145void Instance::ensure_weight_ramp_texture()
158 return a.
r ==
b.r && a.
g ==
b.g && a.
b ==
b.b && a.
a ==
b.a && a.
pos ==
b.pos &&
163 if (!is_equal_cbd(a.data[
i],
b.data[
i])) {
179 if (
resources.weight_ramp_tx.is_valid()) {
184 auto evaluate_weight_to_color = [&](
const float weight,
float result[4]) {
185 if (user_weight_ramp) {
192 const float gamma = 1.5f;
193 const float hsv[3] = {
194 (2.0f / 3.0f) * (1.0f - weight), 1.0f,
pow(0.5f + 0.5f * weight, gamma)};
198 for (
int i = 0;
i < 3;
i++) {
204 constexpr int res = 256;
206 float pixels[res][4];
207 for (
int i = 0;
i < res;
i++) {
208 evaluate_weight_to_color(
i / 255.0f, pixels[
i]);
213 for (
int i = 0;
i < res;
i++) {
224 if (!
state.is_space_v3d() ||
state.clipping_plane_count == 0) {
244 using namespace math;
248 return float4(r, g,
b, a) / 255.0f;
297 gb.colors.edit_mesh_middle =
interpolate(gb.colors.vert_select, gb.colors.wire_edit, 0.35f);
299 gb.colors.edit_mesh_middle =
float4(
301 gb.colors.edit_mesh_middle.w);
307 gb.colors.edge_freestyle =
float4(0.0f);
308 gb.colors.face_freestyle =
float4(0.0f);
328 gb.colors.bone_ik_line =
float4(0.8f, 0.8f, 0.0f, 1.0f);
329 gb.colors.bone_ik_line_no_target =
float4(0.8f, 0.5f, 0.2f, 1.0f);
330 gb.colors.bone_ik_line_spline =
float4(0.8f, 0.8f, 0.2f, 1.0f);
361 const bool is_bg_darker =
reduce_add(gb.colors.grid.xyz()) + 0.12f >
383 }
while (++
color <= color_end);
386 gb.sizes.pixel = 1.0f;
389 gb.sizes.light_circle = 9.0f;
390 gb.sizes.light_circle_shadow = (gb.sizes.light_circle + 3.0f);
400 float *
size =
reinterpret_cast<float *
>(&gb.sizes);
401 float *size_end =
size + (
sizeof(gb.sizes) /
sizeof(
float));
403 *
size *=
U.pixelsize;
404 }
while (++
size <= size_end);
407 gb.pixel_fac = (
state.rv3d) ?
state.rv3d->pixsize : 1.0f;
409 gb.size_viewport_inv = 1.0f / gb.size_viewport;
424 gb.backface_culling =
false;
434 state.camera_position =
view.viewinv().location();
435 state.camera_forward =
view.viewinv().z_axis();
481 begin_sync_layer(regular);
482 begin_sync_layer(infront);
494 const bool in_paint_mode = object_is_paint_mode(ob_ref.
object);
495 const bool in_sculpt_mode = object_is_sculpt_mode(ob_ref);
496 const bool in_particle_edit_mode = object_is_particle_edit_mode(ob_ref);
497 const bool in_edit_paint_mode = object_is_edit_paint_mode(
498 ob_ref, in_edit_mode, in_paint_mode, in_sculpt_mode);
499 const bool needs_prepass = object_needs_prepass(ob_ref, in_paint_mode);
509 if (in_particle_edit_mode) {
514 if (!
state.hide_overlays &&
state.is_space_image()) {
517 if (in_edit_paint_mode) {
521 else if (in_object_mode) {
529 if (in_paint_mode && !
state.hide_overlays) {
543 if (in_sculpt_mode) {
558 if (in_edit_mode && !
state.hide_overlays) {
591 if (
state.is_wireframe_mode || !
state.hide_overlays) {
593 manager, ob_ref,
resources,
state, in_edit_paint_mode, in_edit_mode);
596 if (!
state.hide_overlays) {
647 if (object_is_selected(ob_ref) && !in_edit_paint_mode) {
674 end_sync_layer(regular);
675 end_sync_layer(infront);
692 gpu::TextureFormat::SFLOAT_32_DEPTH_UINT_8,
699 {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
712 if (
state.is_depth_only_drawing) {
723 state.ndc_offset_factor =
state.offset_data_get().polygon_offset_factor(
view.winmat());
736 layer.attribute_viewer.pre_draw(manager,
view);
737 layer.cameras.pre_draw(manager,
view);
738 layer.empties.pre_draw(manager,
view);
739 layer.facing.pre_draw(manager,
view);
740 layer.fade.pre_draw(manager,
view);
741 layer.lattices.pre_draw(manager,
view);
742 layer.light_probes.pre_draw(manager,
view);
743 layer.particles.pre_draw(manager,
view);
744 layer.pointclouds.pre_draw(manager,
view);
745 layer.prepass.pre_draw(manager,
view);
746 layer.wireframe.pre_draw(manager,
view);
760 switch (
state.space_type) {
762 draw_node(manager,
view);
765 draw_v2d(manager,
view);
768 draw_v3d(manager,
view);
780 if (
state.is_depth_only_drawing) {
813void Instance::draw_v3d(Manager &manager,
View &
view)
817 auto draw = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
820 layer.fade.draw(framebuffer, manager,
view);
821 layer.mode_transfer.draw(framebuffer, manager,
view);
822 layer.text.draw(framebuffer, manager,
view);
823 layer.paints.draw(framebuffer, manager,
view);
824 layer.particles.draw(framebuffer, manager,
view);
827 auto draw_line = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
828 layer.bounds.draw_line(framebuffer, manager,
view);
829 layer.wireframe.draw_line(framebuffer, manager,
view);
830 layer.cameras.draw_line(framebuffer, manager,
view);
831 layer.empties.draw_line(framebuffer, manager,
view);
832 layer.axes.draw_line(framebuffer, manager,
view);
833 layer.force_fields.draw_line(framebuffer, manager,
view);
834 layer.lights.draw_line(framebuffer, manager,
view);
835 layer.light_probes.draw_line(framebuffer, manager,
view);
836 layer.speakers.draw_line(framebuffer, manager,
view);
837 layer.lattices.draw_line(framebuffer, manager,
view);
838 layer.metaballs.draw_line(framebuffer, manager,
view);
839 layer.pointclouds.draw_line(framebuffer, manager,
view);
840 layer.relations.draw_line(framebuffer, manager,
view);
841 layer.fluids.draw_line(framebuffer, manager,
view);
842 layer.particles.draw_line(framebuffer, manager,
view);
843 layer.attribute_viewer.draw_line(framebuffer, manager,
view);
844 layer.armatures.draw_line(framebuffer, manager,
view);
845 layer.sculpts.draw_line(framebuffer, manager,
view);
846 layer.grease_pencil.draw_line(framebuffer, manager,
view);
849 layer.curves.draw_line(framebuffer, manager,
view);
852 auto draw_color_only = [&](
OverlayLayer &layer, Framebuffer &framebuffer) {
853 layer.light_probes.draw_color_only(framebuffer, manager,
view);
854 layer.meshes.draw_color_only(framebuffer, manager,
view);
855 layer.curves.draw_color_only(framebuffer, manager,
view);
856 layer.grease_pencil.draw_color_only(framebuffer, manager,
view);
862 regular.cameras.draw_scene_background_images(
resources.render_fb, manager,
view);
863 infront.cameras.draw_scene_background_images(
resources.render_in_front_fb, manager,
view);
865 regular.sculpts.draw_on_render(
resources.render_fb, manager,
view);
866 infront.sculpts.draw_on_render(
resources.render_in_front_fb, manager,
view);
871 if (
state.xray_enabled) {
876 if (!
state.is_render_depth_available) {
890 regular.prepass.draw_line(
resources.overlay_line_fb, manager,
view);
894 regular.empties.draw_images(
resources.overlay_fb, manager,
view);
902 infront.prepass.draw_line(
resources.overlay_line_in_front_fb, manager,
view);
907 regular.wireframe.copy_depth(
resources.depth_target_tx);
908 infront.wireframe.copy_depth(
resources.depth_target_in_front_tx);
923 draw_line(regular,
resources.overlay_line_fb);
929 draw_line(infront,
resources.overlay_line_in_front_fb);
937 regular.meshes.draw_line(
resources.overlay_line_fb, manager,
view);
938 infront.meshes.draw_line(
resources.overlay_line_in_front_fb, manager,
view);
940 draw_color_only(regular,
resources.overlay_color_only_fb);
941 draw_color_only(infront,
resources.overlay_color_only_fb);
944 regular.empties.draw_in_front_images(
resources.overlay_color_only_fb, manager,
view);
945 infront.empties.draw_in_front_images(
resources.overlay_color_only_fb, manager,
view);
946 regular.cameras.draw_in_front(
resources.overlay_color_only_fb, manager,
view);
947 infront.cameras.draw_in_front(
resources.overlay_color_only_fb, manager,
view);
952 if (
state.is_depth_only_drawing ==
false) {
958 regular.cameras.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
959 infront.cameras.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
960 regular.empties.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
966 draw_text(
resources.overlay_output_color_only_fb);
968 if (
state.vignette_enabled) {
976 if (
state.show_text ==
false) {
985bool Instance::object_is_selected(
const ObjectRef &ob_ref)
990bool Instance::object_is_paint_mode(
const Object *
object)
992 return (
object ==
state.object_active) &&
996bool Instance::object_is_sculpt_mode(
const ObjectRef &ob_ref)
1000 const bool is_active_object = ob_ref.object == active_object;
1002 bool is_active_geonode_preview = ob_ref.preview_base_geometry() !=
nullptr &&
1003 ob_ref.is_active(
state.object_active);
1004 return is_active_object || is_active_geonode_preview;
1008 const Object *active_object =
state.object_active;
1009 const bool is_active_object = ob_ref.object == active_object;
1010 return is_active_object;
1016bool Instance::object_is_particle_edit_mode(
const ObjectRef &ob_ref)
1021bool Instance::object_is_sculpt_mode(
const Object *
object)
1024 return object ==
state.object_active;
1029bool Instance::object_is_edit_paint_mode(
const ObjectRef &ob_ref,
1032 bool in_sculpt_mode)
1034 bool in_edit_paint_mode = in_edit_mode || in_paint_mode || in_sculpt_mode;
1036 return in_edit_paint_mode || ob_ref.parent_is_in_edit_paint_mode(
1040bool Instance::object_is_edit_mode(
const Object *
object)
1044 switch (object->
type) {
1075 switch (object->
type) {
1084bool Instance::object_needs_prepass(
const ObjectRef &ob_ref,
bool in_paint_mode)
1101 if (in_paint_mode) {
1103 if (object_is_rendered_transparent(ob_ref.object,
state) ||
1104 object_is_in_front(ob_ref.object,
state))
1110 if (!
state.xray_enabled) {
1112 if (!
state.is_render_depth_available && (ob_ref.object->dt >=
OB_SOLID)) {
1120bool Instance::object_is_rendered_transparent(
const Object *
object,
const State &
state)
1122 if (
state.v3d ==
nullptr) {
1126 if (!
state.is_solid()) {
1145 return object->color[3] < 1.0f;
1151 for (
int i = 0;
i < materials_num;
i++) {
1153 if (mat && mat->
a < 1.0f) {
bool BKE_colorband_evaluate(const ColorBand *coba, float in, float out[4])
@ CTX_MODE_EDIT_POINTCLOUD
@ CTX_MODE_EDIT_GREASE_PENCIL
enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, eObjectMode object_mode)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Material * BKE_object_material_get_eval(Object *ob, short act)
int BKE_object_material_used_with_fallback_eval(const Object &ob)
int BKE_render_preview_pixel_size(const RenderData *r)
bool BKE_scene_uses_blender_workbench(const Scene *scene)
#define BLI_assert_unreachable()
MINLINE float max_ff(float a, float b)
void hsv_to_rgb_v(const float hsv[3], float r_rgb[3])
MINLINE void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
int BLI_thread_is_main(void)
float DEG_get_ctime(const Depsgraph *graph)
#define OB_MODE_ALL_PAINT
#define OB_MODE_ALL_PAINT_GPENCIL
#define BASE_SELECTED(v3d, base)
@ SI_OVERLAY_SHOW_OVERLAYS
@ USER_GPU_FLAG_FRESNEL_EDIT
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_OBJECT_COLOR
@ V3D_SHADING_BACKFACE_CULLING
#define RV3D_LOCK_FLAGS(rv3d)
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
struct View3DShading View3DShading
@ V3D_OVERLAY_HIDE_OBJECT_ORIGINS
@ V3D_OVERLAY_HIDE_MOTION_PATHS
@ V3D_OVERLAY_HIDE_OBJECT_XTRAS
void DRW_submission_end()
void DRW_submission_start()
void ED_space_image_get_size(SpaceImage *sima, int *r_width, int *r_height)
void ED_space_image_get_uv_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy)
void ED_space_image_get_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy)
#define SHADING_XRAY_FLAG_ENABLED(shading)
RenderEngineType * ED_view3d_engine_type(const Scene *scene, int drawtype)
static void View(GHOST_IWindow *window, bool stereo, int eye=0)
void GPU_framebuffer_clear_depth(blender::gpu::FrameBuffer *fb, float clear_depth)
void GPU_framebuffer_clear_color(blender::gpu::FrameBuffer *fb, const float clear_col[4])
#define GPU_framebuffer_ensure_config(_fb,...)
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)
void GPU_depth_test(GPUDepthTest test)
void GPU_texture_update_sub(blender::gpu::Texture *texture, eGPUDataFormat data_format, const void *pixels, int offset_x, int offset_y, int offset_z, int width, int height, int depth)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_GENERAL
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_update(blender::gpu::Texture *texture, eGPUDataFormat data_format, const void *data)
@ TH_TRANSPARENT_CHECKER_PRIMARY
@ TH_TRANSPARENT_CHECKER_SECONDARY
@ TH_HANDLE_SEL_AUTOCLAMP
@ TH_TRANSPARENT_CHECKER_SIZE
void UI_GetThemeColorBlendShade4fv(int colorid1, int colorid2, float fac, int offset, float col[4])
void UI_GetThemeColorBlendShade3fv(int colorid1, int colorid2, float fac, int offset, float col[3])
void UI_GetThemeColorShadeAlpha4fv(int colorid, int coloffset, int alphaoffset, float col[4])
void UI_GetThemeColor4fv(int colorid, float col[4])
void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4])
float UI_GetThemeValuef(int colorid)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void display_to_view(View &view)
void ensure_visibility(View &view)
static View & default_get()
static bool is_pose_mode(const Object *armature_ob, const State &state)
void edit_object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void draw_output(Framebuffer &framebuffer, Manager &manager, View &view) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void draw_output(Framebuffer &framebuffer, Manager &manager, View &) final
void edit_object_sync_legacy(Manager &manager, const ObjectRef &ob_ref, Resources &)
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void sculpt_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state)
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void paint_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state)
void draw_color_only(Framebuffer &framebuffer, Manager &manager, View &view) final
void draw_on_render(gpu::FrameBuffer *framebuffer, Manager &manager, View &view) final
void draw(Manager &manager) final
void object_sync(ObjectRef &ob_ref, Manager &manager) final
ImagePrepass image_prepass
AntiAliasing anti_aliasing
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void object_sync(Manager &, const ObjectRef &ob_ref, Resources &res, const State &state) final
void edit_object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &) final
void object_sync_ex(Manager &manager, const ObjectRef &ob_ref, Resources &res, const State &state, const bool in_edit_paint_mode, const bool in_edit_mode)
const DRWContext * DRW_context_get()
bool DRW_object_is_in_edit_mode(const Object *ob)
Simple API to draw debug shapes and log in the viewport.
void DRW_text_cache_draw(const DRWTextStore *dt, const ARegion *region, const View3D *v3d)
DRWTextStore * DRW_text_cache_create()
void DRW_text_cache_destroy(DRWTextStore *dt)
#define unit_float_to_uchar_clamp_v4(v1, v2)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
T interpolate(const T &a, const T &b, const FactorT &t)
bool is_equal(const MatBase< T, NumCol, NumRow > &a, const MatBase< T, NumCol, NumRow > &b, const T epsilon=T(0))
T reduce_add(const VecBase< T, Size > &a)
bool assign_if_different(T &old_value, T new_value)
blender::VecBase< uint8_t, 4 > uchar4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 3 > float3
const char * RE_engine_id_BLENDER_EEVEE
bool is_image_render() const
DefaultFramebufferList * viewport_framebuffer_list_get() const
enum DRWContext::Mode mode
blender::float2 viewport_size_get() const
bool is_viewport_image_render() const
DefaultTextureList * viewport_texture_list_get() const
struct DRWContext::@137223300060360004345077367045216134275315355136 options
bool is_material_select() const
blender::gpu::FrameBuffer * in_front_fb
blender::gpu::Texture * depth_in_front
struct SculptSession * sculpt
SpaceImageOverlay overlay
AttributeTexts attribute_texts
ModeTransfer mode_transfer
AttributeViewer attribute_viewer
GreasePencil grease_pencil
Framebuffer overlay_output_color_only_fb
Framebuffer overlay_output_fb
gpu::FrameBuffer * render_fb
void update_theme_settings(const DRWContext *ctx, const State &state)
draw::UniformArrayBuffer< float4, 6 > clip_planes_buf
bool is_selection() const
static float vertex_size_get()
draw::UniformBuffer< UniformData > globals_buf
void update_clip_planes(const State &state)