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;
70 const bool viewport_uses_workbench =
state.v3d->shading.type <=
OB_SOLID ||
72 const bool viewport_uses_eevee =
STREQ(
79 state.is_render_depth_available = viewport_uses_workbench ||
80 (viewport_uses_eevee && !use_resolution_scaling);
84 state.is_render_depth_available |=
state.is_depth_only_drawing;
86 if (!
state.hide_overlays) {
92 memset(&
state.overlay, 0,
sizeof(
state.overlay));
94 state.v3d_gridflag = 0;
98 state.overlay.wireframe_threshold =
state.v3d->overlay.wireframe_threshold;
99 state.overlay.wireframe_opacity =
state.v3d->overlay.wireframe_opacity;
102 state.do_pose_xray =
state.show_bone_selection();
106 else if (
state.is_space_image()) {
109 state.clear_in_front =
false;
110 state.use_in_front =
false;
111 state.is_wireframe_mode =
false;
113 state.xray_enabled =
false;
115 state.is_render_depth_available =
true;
120 state.is_image_valid = bool(space_image->
image);
129 ensure_weight_ramp_texture();
140void Instance::ensure_weight_ramp_texture()
153 return a.
r ==
b.r && a.
g ==
b.g && a.
b ==
b.b && a.
a ==
b.a && a.
pos ==
b.pos &&
158 if (!is_equal_cbd(a.data[
i],
b.data[
i])) {
174 if (
resources.weight_ramp_tx.is_valid()) {
179 auto evaluate_weight_to_color = [&](
const float weight,
float result[4]) {
180 if (user_weight_ramp) {
187 const float gamma = 1.5f;
188 const float hsv[3] = {
189 (2.0f / 3.0f) * (1.0f - weight), 1.0f,
pow(0.5f + 0.5f * weight, gamma)};
193 for (
int i = 0;
i < 3;
i++) {
199 constexpr int res = 256;
201 float pixels[res][4];
202 for (
int i = 0;
i < res;
i++) {
203 evaluate_weight_to_color(
i / 255.0f, pixels[
i]);
208 for (
int i = 0;
i < res;
i++) {
218 if (!
state.is_space_v3d() ||
state.clipping_plane_count == 0) {
238 using namespace math;
242 return float4(r, g,
b, a) / 255.0f;
292 gb.colors.edit_mesh_middle =
interpolate(gb.colors.vert_select, gb.colors.wire_edit, 0.35f);
294 gb.colors.edit_mesh_middle =
float4(
296 gb.colors.edit_mesh_middle.w);
302 gb.colors.edge_freestyle =
float4(0.0f);
303 gb.colors.face_freestyle =
float4(0.0f);
323 gb.colors.bone_ik_line =
float4(0.8f, 0.8f, 0.0f, 1.0f);
324 gb.colors.bone_ik_line_no_target =
float4(0.8f, 0.5f, 0.2f, 1.0f);
325 gb.colors.bone_ik_line_spline =
float4(0.8f, 0.8f, 0.2f, 1.0f);
357 const bool is_bg_darker =
reduce_add(gb.colors.grid.xyz()) + 0.12f >
379 }
while (++
color <= color_end);
382 gb.sizes.pixel = 1.0f;
385 gb.sizes.light_circle = 9.0f;
386 gb.sizes.light_circle_shadow = (gb.sizes.light_circle + 3.0f);
396 float *
size =
reinterpret_cast<float *
>(&gb.sizes);
397 float *size_end =
size + (
sizeof(gb.sizes) /
sizeof(float));
399 *
size *=
U.pixelsize;
400 }
while (++
size <= size_end);
403 gb.pixel_fac = (
state.rv3d) ?
state.rv3d->pixsize : 1.0f;
405 gb.size_viewport_inv = 1.0f / gb.size_viewport;
420 gb.backface_culling =
false;
431 state.camera_position =
view.viewinv().location();
432 state.camera_forward =
view.viewinv().z_axis();
475 begin_sync_layer(regular);
476 begin_sync_layer(infront);
488 const bool in_paint_mode = object_is_paint_mode(ob_ref.
object);
489 const bool in_sculpt_mode = object_is_sculpt_mode(ob_ref);
490 const bool in_particle_edit_mode = object_is_particle_edit_mode(ob_ref);
491 const bool in_edit_paint_mode = object_is_edit_paint_mode(
492 ob_ref, in_edit_mode, in_paint_mode, in_sculpt_mode);
493 const bool needs_prepass = object_needs_prepass(ob_ref, in_paint_mode);
503 if (in_particle_edit_mode) {
508 if (!
state.hide_overlays &&
state.is_space_image()) {
511 if (in_edit_paint_mode) {
515 else if (in_object_mode) {
523 if (in_paint_mode && !
state.hide_overlays) {
537 if (in_sculpt_mode) {
552 if (in_edit_mode && !
state.hide_overlays) {
585 if (
state.is_wireframe_mode || !
state.hide_overlays) {
587 manager, ob_ref,
resources,
state, in_edit_paint_mode, in_edit_mode);
590 if (!
state.hide_overlays) {
641 if (object_is_selected(ob_ref) && !in_edit_paint_mode) {
668 end_sync_layer(regular);
669 end_sync_layer(infront);
693 {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
706 if (
state.is_depth_only_drawing) {
717 state.ndc_offset_factor =
state.offset_data_get().polygon_offset_factor(
view.winmat());
730 layer.attribute_viewer.pre_draw(manager,
view);
731 layer.cameras.pre_draw(manager,
view);
732 layer.empties.pre_draw(manager,
view);
733 layer.facing.pre_draw(manager,
view);
734 layer.fade.pre_draw(manager,
view);
735 layer.lattices.pre_draw(manager,
view);
736 layer.light_probes.pre_draw(manager,
view);
737 layer.particles.pre_draw(manager,
view);
738 layer.pointclouds.pre_draw(manager,
view);
739 layer.prepass.pre_draw(manager,
view);
740 layer.wireframe.pre_draw(manager,
view);
754 switch (
state.space_type) {
756 draw_node(manager,
view);
759 draw_v2d(manager,
view);
762 draw_v3d(manager,
view);
774 if (
state.is_depth_only_drawing) {
807void Instance::draw_v3d(Manager &manager,
View &
view)
811 auto draw = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
814 layer.fade.draw(framebuffer, manager,
view);
815 layer.mode_transfer.draw(framebuffer, manager,
view);
816 layer.text.draw(framebuffer, manager,
view);
817 layer.paints.draw(framebuffer, manager,
view);
818 layer.particles.draw(framebuffer, manager,
view);
821 auto draw_line = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
822 layer.bounds.draw_line(framebuffer, manager,
view);
823 layer.wireframe.draw_line(framebuffer, manager,
view);
824 layer.cameras.draw_line(framebuffer, manager,
view);
825 layer.empties.draw_line(framebuffer, manager,
view);
826 layer.axes.draw_line(framebuffer, manager,
view);
827 layer.force_fields.draw_line(framebuffer, manager,
view);
828 layer.lights.draw_line(framebuffer, manager,
view);
829 layer.light_probes.draw_line(framebuffer, manager,
view);
830 layer.speakers.draw_line(framebuffer, manager,
view);
831 layer.lattices.draw_line(framebuffer, manager,
view);
832 layer.metaballs.draw_line(framebuffer, manager,
view);
833 layer.pointclouds.draw_line(framebuffer, manager,
view);
834 layer.relations.draw_line(framebuffer, manager,
view);
835 layer.fluids.draw_line(framebuffer, manager,
view);
836 layer.particles.draw_line(framebuffer, manager,
view);
837 layer.attribute_viewer.draw_line(framebuffer, manager,
view);
838 layer.armatures.draw_line(framebuffer, manager,
view);
839 layer.sculpts.draw_line(framebuffer, manager,
view);
840 layer.grease_pencil.draw_line(framebuffer, manager,
view);
843 layer.curves.draw_line(framebuffer, manager,
view);
846 auto draw_color_only = [&](
OverlayLayer &layer, Framebuffer &framebuffer) {
847 layer.light_probes.draw_color_only(framebuffer, manager,
view);
848 layer.meshes.draw_color_only(framebuffer, manager,
view);
849 layer.curves.draw_color_only(framebuffer, manager,
view);
850 layer.grease_pencil.draw_color_only(framebuffer, manager,
view);
856 regular.cameras.draw_scene_background_images(
resources.render_fb, manager,
view);
857 infront.cameras.draw_scene_background_images(
resources.render_in_front_fb, manager,
view);
859 regular.sculpts.draw_on_render(
resources.render_fb, manager,
view);
860 infront.sculpts.draw_on_render(
resources.render_in_front_fb, manager,
view);
865 if (
state.xray_enabled) {
870 if (!
state.is_render_depth_available) {
884 regular.prepass.draw_line(
resources.overlay_line_fb, manager,
view);
888 regular.empties.draw_images(
resources.overlay_fb, manager,
view);
896 infront.prepass.draw_line(
resources.overlay_line_in_front_fb, manager,
view);
901 regular.wireframe.copy_depth(
resources.depth_target_tx);
902 infront.wireframe.copy_depth(
resources.depth_target_in_front_tx);
917 draw_line(regular,
resources.overlay_line_fb);
923 draw_line(infront,
resources.overlay_line_in_front_fb);
931 regular.meshes.draw_line(
resources.overlay_line_fb, manager,
view);
932 infront.meshes.draw_line(
resources.overlay_line_in_front_fb, manager,
view);
934 draw_color_only(regular,
resources.overlay_color_only_fb);
935 draw_color_only(infront,
resources.overlay_color_only_fb);
938 regular.empties.draw_in_front_images(
resources.overlay_color_only_fb, manager,
view);
939 infront.empties.draw_in_front_images(
resources.overlay_color_only_fb, manager,
view);
940 regular.cameras.draw_in_front(
resources.overlay_color_only_fb, manager,
view);
941 infront.cameras.draw_in_front(
resources.overlay_color_only_fb, manager,
view);
946 if (
state.is_depth_only_drawing ==
false) {
952 regular.cameras.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
953 infront.cameras.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
954 regular.empties.draw_background_images(
resources.overlay_output_color_only_fb, manager,
view);
962bool Instance::object_is_selected(
const ObjectRef &ob_ref)
967bool Instance::object_is_paint_mode(
const Object *
object)
969 return (
object ==
state.object_active) &&
973bool Instance::object_is_sculpt_mode(
const ObjectRef &ob_ref)
977 const bool is_active_object = ob_ref.object == active_object;
979 bool is_geonode_preview = ob_ref.dupli_object && ob_ref.dupli_object->preview_base_geometry;
980 bool is_active_dupli_parent = ob_ref.dupli_parent == active_object;
981 return is_active_object || (is_active_dupli_parent && is_geonode_preview);
986 const bool is_active_object = ob_ref.object == active_object;
987 return is_active_object;
993bool Instance::object_is_particle_edit_mode(
const ObjectRef &ob_ref)
998bool Instance::object_is_sculpt_mode(
const Object *
object)
1001 return object ==
state.object_active;
1006bool Instance::object_is_edit_paint_mode(
const ObjectRef &ob_ref,
1009 bool in_sculpt_mode)
1011 bool in_edit_paint_mode = in_edit_mode || in_paint_mode || in_sculpt_mode;
1014 in_edit_paint_mode |= ob_ref.dupli_parent && (object_is_edit_mode(ob_ref.dupli_parent) ||
1015 object_is_sculpt_mode(ob_ref.dupli_parent) ||
1016 object_is_paint_mode(ob_ref.dupli_parent));
1018 return in_edit_paint_mode;
1021bool Instance::object_is_edit_mode(
const Object *
object)
1025 switch (object->
type) {
1056 switch (object->
type) {
1065bool Instance::object_needs_prepass(
const ObjectRef &ob_ref,
bool in_paint_mode)
1078 if (in_paint_mode) {
1080 if (object_is_rendered_transparent(ob_ref.object,
state)) {
1085 if (!
state.xray_enabled) {
1087 if (!
state.is_render_depth_available && (ob_ref.object->dt >=
OB_SOLID)) {
1095bool Instance::object_is_rendered_transparent(
const Object *
object,
const State &
state)
1097 if (
state.v3d ==
nullptr) {
1101 if (!
state.is_solid()) {
1120 return object->color[3] < 1.0f;
1126 for (
int i = 0;
i < materials_num;
i++) {
1128 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 srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[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
#define RV3D_LOCK_FLAGS(rv3d)
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
struct View3DShading View3DShading
@ V3D_SHADING_BACKFACE_CULLING
@ 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_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
void GPU_framebuffer_clear_color(GPUFrameBuffer *fb, const float clear_col[4])
#define GPU_framebuffer_ensure_config(_fb,...)
void GPU_framebuffer_clear_depth(GPUFrameBuffer *fb, float clear_depth)
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_GENERAL
void GPU_texture_update_sub(GPUTexture *texture, eGPUDataFormat data_format, const void *pixels, int offset_x, int offset_y, int offset_z, int width, int height, int depth)
void GPU_texture_update(GPUTexture *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(GPUFrameBuffer *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)
DRWTextStore * DRW_text_cache_ensure()
Simple API to draw debug shapes and log in the viewport.
#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_NEXT
bool is_image_render() const
DefaultFramebufferList * viewport_framebuffer_list_get() const
struct DRWContext::@104106145204363037226002274050347030264243156307 options
enum DRWContext::Mode mode
blender::float2 viewport_size_get() const
bool is_viewport_image_render() const
DefaultTextureList * viewport_texture_list_get() const
bool is_material_select() const
GPUFrameBuffer * in_front_fb
GPUTexture * 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
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()
GPUFrameBuffer * render_fb
draw::UniformBuffer< UniformData > globals_buf
void update_clip_planes(const State &state)