Blender  V3.3
Classes | Macros
wm_draw.c File Reference
#include <stdlib.h>
#include <string.h>
#include "DNA_camera_types.h"
#include "DNA_listBase.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "GHOST_C-api.h"
#include "ED_node.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "GPU_batch_presets.h"
#include "GPU_context.h"
#include "GPU_debug.h"
#include "GPU_framebuffer.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
#include "GPU_state.h"
#include "GPU_texture.h"
#include "GPU_viewport.h"
#include "RE_engine.h"
#include "WM_api.h"
#include "WM_toolsystem.h"
#include "WM_types.h"
#include "wm.h"
#include "wm_draw.h"
#include "wm_event_system.h"
#include "wm_surface.h"
#include "wm_window.h"
#include "UI_resources.h"

Go to the source code of this file.

Classes

struct  GrabState
 
struct  WindowDrawCB
 

Macros

#define SPACE_NAME(space)
 

Functions

Draw Paint Cursor
static void wm_paintcursor_draw (bContext *C, ScrArea *area, ARegion *region)
 
Post Draw Region on display handlers
static void wm_region_draw_overlay (bContext *C, ScrArea *area, ARegion *region)
 
Internal Utilities
static bool wm_draw_region_stereo_set (Main *bmain, ScrArea *area, ARegion *region, eStereoViews sview)
 
static void wm_region_test_gizmo_do_draw (bContext *C, ScrArea *area, ARegion *region, bool tag_redraw)
 
static void wm_region_test_render_do_draw (const Scene *scene, struct Depsgraph *depsgraph, ScrArea *area, ARegion *region)
 
static bool wm_region_use_viewport_by_type (short space_type, short region_type)
 
bool WM_region_use_viewport (ScrArea *area, ARegion *region)
 
static const char * wm_area_name (ScrArea *area)
 
Region Drawing

Each region draws into its own frame-buffer, which is then blit on the window draw buffer. This helps with fast redrawing if only some regions change. It also means we can share a single context for multiple windows, so that for example VAOs can be shared between windows.

static void wm_draw_region_buffer_free (ARegion *region)
 
static void wm_draw_offscreen_texture_parameters (GPUOffScreen *offscreen)
 
static void wm_draw_region_buffer_create (ARegion *region, bool stereo, bool use_viewport)
 
static bool wm_draw_region_bind (bContext *C, ARegion *region, int view)
 
static void wm_draw_region_unbind (ARegion *region)
 
static void wm_draw_region_blit (ARegion *region, int view)
 
GPUTexturewm_draw_region_texture (ARegion *region, int view)
 
void wm_draw_region_blend (ARegion *region, int view, bool blend)
 
GPUViewportWM_draw_region_get_viewport (ARegion *region)
 
GPUViewportWM_draw_region_get_bound_viewport (ARegion *region)
 
static void wm_draw_window_offscreen (bContext *C, wmWindow *win, bool stereo)
 
static void wm_draw_window_onscreen (bContext *C, wmWindow *win, int view)
 
static void wm_draw_window (bContext *C, wmWindow *win)
 
static void wm_draw_surface (bContext *C, wmSurface *surface)
 
Main Update Call
static bool wm_draw_update_test_window (Main *bmain, bContext *C, wmWindow *win)
 
static void wm_draw_update_clear_window (bContext *C, wmWindow *win)
 
void WM_paint_cursor_tag_redraw (wmWindow *win, ARegion *UNUSED(region))
 
void wm_draw_update (bContext *C)
 
void wm_draw_region_clear (wmWindow *win, ARegion *UNUSED(region))
 
void WM_draw_region_free (ARegion *region, bool hide)
 
void wm_draw_region_test (bContext *C, ScrArea *area, ARegion *region)
 
void WM_redraw_windows (bContext *C)
 
Region Viewport Drawing

This is needed for viewport drawing for operator use (where the viewport may not have drawn yet).

Otherwise avoid using these since they're exposing low level logic externally.

void WM_draw_region_viewport_ensure (ARegion *region, short space_type)
 
void WM_draw_region_viewport_bind (ARegion *region)
 
void WM_draw_region_viewport_unbind (ARegion *region)
 

Window Drawing (Draw All)

Reference method, draw all each time.

typedef struct WindowDrawCB WindowDrawCB
 
voidWM_draw_cb_activate (wmWindow *win, void(*draw)(const struct wmWindow *, void *), void *customdata)
 
void WM_draw_cb_exit (wmWindow *win, void *handle)
 
static void wm_draw_callbacks (wmWindow *win)
 

Draw Software Cursor

Draw the cursor instead of relying on the graphical environment. Needed when setting the cursor position (warping) isn't supported (GHOST/WAYLAND).

struct {
   int8_t   enabled
 
   int   winid
 
   int   xy [2]
 
g_software_cursor
 
static bool wm_software_cursor_needed (void)
 
static bool wm_software_cursor_needed_for_window (const wmWindow *win, struct GrabState *grab_state)
 
static bool wm_software_cursor_motion_test (const wmWindow *win)
 
static void wm_software_cursor_motion_update (const wmWindow *win)
 
static void wm_software_cursor_motion_clear (void)
 
static void wm_software_cursor_draw_bitmap (const int event_xy[2], const GHOST_CursorBitmapRef *bitmap)
 
static void wm_software_cursor_draw_crosshair (const int event_xy[2])
 
static void wm_software_cursor_draw (wmWindow *win, const struct GrabState *grab_state)
 

Detailed Description

Handle OpenGL buffers for windowing, also paint cursor.

Definition in file wm_draw.c.

Macro Definition Documentation

◆ SPACE_NAME

#define SPACE_NAME (   space)
Value:
case space: \
return #space;

Typedef Documentation

◆ WindowDrawCB

typedef struct WindowDrawCB WindowDrawCB

Function Documentation

◆ wm_area_name()

static const char* wm_area_name ( ScrArea area)
static

◆ wm_draw_callbacks()

static void wm_draw_callbacks ( wmWindow win)
static

Definition at line 585 of file wm_draw.c.

References wmWindow::drawcalls, and LISTBASE_FOREACH.

Referenced by wm_draw_window_onscreen().

◆ WM_draw_cb_activate()

void* WM_draw_cb_activate ( wmWindow win,
void(*)(const struct wmWindow *, void *)  draw,
void customdata 
)

◆ WM_draw_cb_exit()

void WM_draw_cb_exit ( wmWindow win,
void handle 
)

◆ wm_draw_offscreen_texture_parameters()

static void wm_draw_offscreen_texture_parameters ( GPUOffScreen offscreen)
static

◆ wm_draw_region_bind()

static bool wm_draw_region_bind ( bContext C,
ARegion region,
int  view 
)
static

◆ wm_draw_region_blend()

void wm_draw_region_blend ( ARegion region,
int  view,
bool  blend 
)

◆ wm_draw_region_blit()

static void wm_draw_region_blit ( ARegion region,
int  view 
)
static

◆ wm_draw_region_buffer_create()

static void wm_draw_region_buffer_create ( ARegion region,
bool  stereo,
bool  use_viewport 
)
static

◆ wm_draw_region_buffer_free()

static void wm_draw_region_buffer_free ( ARegion region)
static

◆ wm_draw_region_clear()

void wm_draw_region_clear ( wmWindow win,
ARegion UNUSEDregion 
)

Definition at line 1354 of file wm_draw.c.

References bScreen::do_draw, and WM_window_get_active_screen().

Referenced by ui_region_temp_remove().

◆ WM_draw_region_free()

void WM_draw_region_free ( ARegion region,
bool  hide 
)

◆ WM_draw_region_get_bound_viewport()

GPUViewport* WM_draw_region_get_bound_viewport ( ARegion region)

◆ WM_draw_region_get_viewport()

GPUViewport* WM_draw_region_get_viewport ( ARegion region)

◆ wm_draw_region_stereo_set()

static bool wm_draw_region_stereo_set ( Main bmain,
ScrArea area,
ARegion region,
eStereoViews  sview 
)
static

◆ wm_draw_region_test()

void wm_draw_region_test ( bContext C,
ScrArea area,
ARegion region 
)

◆ wm_draw_region_texture()

GPUTexture* wm_draw_region_texture ( ARegion region,
int  view 
)

◆ wm_draw_region_unbind()

static void wm_draw_region_unbind ( ARegion region)
static

◆ WM_draw_region_viewport_bind()

void WM_draw_region_viewport_bind ( ARegion region)

Definition at line 1411 of file wm_draw.c.

References NULL, and wm_draw_region_bind().

Referenced by ED_view3d_depth_override(), and ui_region_redraw_immediately().

◆ WM_draw_region_viewport_ensure()

void WM_draw_region_viewport_ensure ( ARegion region,
short  space_type 
)

◆ WM_draw_region_viewport_unbind()

void WM_draw_region_viewport_unbind ( ARegion region)

Definition at line 1416 of file wm_draw.c.

References wm_draw_region_unbind().

Referenced by ED_view3d_depth_override(), and ui_region_redraw_immediately().

◆ wm_draw_surface()

static void wm_draw_surface ( bContext C,
wmSurface surface 
)
static

Draw offscreen contexts not bound to a specific window.

Definition at line 1179 of file wm_draw.c.

References C, CTX_wm_manager(), GPU_context_begin_frame(), GPU_context_end_frame(), surface, wm_surface_clear_drawable(), wm_surface_make_drawable(), and wm_window_clear_drawable().

Referenced by wm_draw_update().

◆ wm_draw_update()

void wm_draw_update ( bContext C)

◆ wm_draw_update_clear_window()

static void wm_draw_update_clear_window ( bContext C,
wmWindow win 
)
static

◆ wm_draw_update_test_window()

static bool wm_draw_update_test_window ( Main bmain,
bContext C,
wmWindow win 
)
static

◆ wm_draw_window()

static void wm_draw_window ( bContext C,
wmWindow win 
)
static

◆ wm_draw_window_offscreen()

static void wm_draw_window_offscreen ( bContext C,
wmWindow win,
bool  stereo 
)
static

◆ wm_draw_window_onscreen()

static void wm_draw_window_onscreen ( bContext C,
wmWindow win,
int  view 
)
static

◆ WM_paint_cursor_tag_redraw()

void WM_paint_cursor_tag_redraw ( wmWindow win,
ARegion UNUSEDregion 
)

◆ wm_paintcursor_draw()

static void wm_paintcursor_draw ( bContext C,
ScrArea area,
ARegion region 
)
static

◆ WM_redraw_windows()

void WM_redraw_windows ( bContext C)

◆ wm_region_draw_overlay()

static void wm_region_draw_overlay ( bContext C,
ScrArea area,
ARegion region 
)
static

◆ wm_region_test_gizmo_do_draw()

static void wm_region_test_gizmo_do_draw ( bContext C,
ScrArea area,
ARegion region,
bool  tag_redraw 
)
static

◆ wm_region_test_render_do_draw()

static void wm_region_test_render_do_draw ( const Scene scene,
struct Depsgraph depsgraph,
ScrArea area,
ARegion region 
)
static

◆ WM_region_use_viewport()

bool WM_region_use_viewport ( ScrArea area,
ARegion region 
)

◆ wm_region_use_viewport_by_type()

static bool wm_region_use_viewport_by_type ( short  space_type,
short  region_type 
)
static

◆ wm_software_cursor_draw()

static void wm_software_cursor_draw ( wmWindow win,
const struct GrabState grab_state 
)
static

◆ wm_software_cursor_draw_bitmap()

static void wm_software_cursor_draw_bitmap ( const int  event_xy[2],
const GHOST_CursorBitmapRef bitmap 
)
static

◆ wm_software_cursor_draw_crosshair()

static void wm_software_cursor_draw_crosshair ( const int  event_xy[2])
static

◆ wm_software_cursor_motion_clear()

static void wm_software_cursor_motion_clear ( void  )
static

Definition at line 190 of file wm_draw.c.

References g_software_cursor.

Referenced by wm_draw_window_onscreen().

◆ wm_software_cursor_motion_test()

static bool wm_software_cursor_motion_test ( const wmWindow win)
static

Definition at line 175 of file wm_draw.c.

References wmWindow::eventstate, g_software_cursor, wmWindow::winid, and wmEvent::xy.

Referenced by wm_draw_update_test_window().

◆ wm_software_cursor_motion_update()

static void wm_software_cursor_motion_update ( const wmWindow win)
static

Definition at line 182 of file wm_draw.c.

References wmWindow::eventstate, g_software_cursor, wmWindow::winid, and wmEvent::xy.

Referenced by wm_draw_window_onscreen().

◆ wm_software_cursor_needed()

static bool wm_software_cursor_needed ( void  )
static

◆ wm_software_cursor_needed_for_window()

static bool wm_software_cursor_needed_for_window ( const wmWindow win,
struct GrabState grab_state 
)
static

Variable Documentation

◆ enabled

int8_t enabled

Definition at line 133 of file wm_draw.c.

◆ 

struct { ... } g_software_cursor
Initial value:
= {
.enabled = -1,
.winid = -1,
}

Track the state of the last drawn cursor.

Referenced by wm_draw_update_test_window(), wm_software_cursor_motion_clear(), wm_software_cursor_motion_test(), wm_software_cursor_motion_update(), and wm_software_cursor_needed().

◆ winid

int winid

◆ xy

int xy[2]

Definition at line 135 of file wm_draw.c.

Referenced by actionzone_area_poll(), area_actionzone_refresh_xy(), area_event_inside(), BKE_area_find_region_xy(), BKE_maskrasterize_handle_sample(), BKE_screen_area_map_find_area_xy(), BKE_screen_find_area_xy(), BKE_screen_find_main_region_at_xy(), BKE_screen_find_region_xy(), BLI_rctf_clamp_pt_v(), BLI_rctf_do_minmax_v(), BLI_rctf_init_pt_radius(), BLI_rctf_isect_circle(), BLI_rctf_isect_pt_v(), BLI_rcti_clamp_pt_v(), BLI_rcti_do_minmax_v(), BLI_rcti_init_pt_radius(), BLI_rcti_isect_circle(), BLI_rcti_isect_pt_v(), btMatrix3x3(), collection_drop_init(), collection_drop_tooltip(), CreateMatrix(), data_device_handle_drop(), draw_seq_in_view(), dropbox_tooltip(), ED_area_actionzone_find_xy(), ED_area_azones_update(), ED_area_find_under_cursor(), ED_armature_pick_bone(), ed_armature_pick_bone_impl(), ED_armature_pick_ebone(), ED_armature_pick_pchan(), ED_gpencil_project_stroke_to_view(), ED_gpencil_stroke_reproject(), ED_screen_set_active_region(), blender::compositor::ScreenLensDistortionOperation::execute_pixel(), blender::compositor::DisplaceOperation::execute_pixel_sampled(), blender::compositor::MapUVOperation::execute_pixel_sampled(), blender::compositor::MaskOperation::execute_pixel_sampled(), eyedropper_draw_cursor_text_ex(), eyedropper_draw_cursor_text_region(), flushTransNodes(), GHOST_SystemWayland::getAllDisplayDimensions(), KDL::Vector2::GetValue(), gpencil_draw_modal(), gpencil_point_3d_to_xy(), gpencil_select_exec(), gpencil_speed_guide_init(), blender::compositor::FastGaussianBlurOperation::IIR_gauss(), imapaint_pick_uv(), keyframe_region_circle_test(), keyframe_region_lasso_test(), layer_bucket_depth_from_xy(), layer_bucket_index_from_xy(), maskrasterize_buffer_cb(), maskrasterize_layer_isect(), outliner_drop_insert_collection_find(), outliner_drop_insert_find(), blender::compositor::DisplaceOperation::pixel_transform(), blender::compositor::MapUVOperation::pixel_transform(), region_event_inside(), relative_pointer_handle_relative_motion_impl(), ScaleAlongAxis(), screen_actionzone_find_xy(), screen_cursor_set(), sequencer_drop_copy(), setRotation(), setValue(), textview_draw(), textview_draw_sel(), ui_block_bounds_calc_centered_pie(), ui_block_bounds_calc_popup(), UI_block_end_ex(), ui_block_find_mouse_over_ex(), ui_but_contains_point_px(), ui_but_find_mouse_over_ex(), ui_drag_toggle_set(), ui_list_find_mouse_over_ex(), ui_list_row_find_mouse_over(), ui_mouse_motion_towards_check(), ui_mouse_motion_towards_init(), ui_mouse_motion_towards_init_ex(), ui_mouse_motion_towards_reinit(), UI_region_block_find_mouse_over(), ui_region_contains_point_px(), UI_region_views_find_item_at(), ui_screen_region_find_mouse_over_ex(), ui_searchbox_inside(), UI_view2d_edge_pan_apply(), UI_view2d_mouse_in_scrollers(), UI_view2d_mouse_in_scrollers_ex(), ui_view_drop_tooltip(), ui_view_item_find_mouse_over(), blender::compositor::DisplaceOperation::update_memory_buffer_partial(), blender::compositor::MapUVOperation::update_memory_buffer_partial(), blender::compositor::MaskOperation::update_memory_buffer_partial(), blender::compositor::MovieDistortionOperation::update_memory_buffer_partial(), blender::compositor::ScreenLensDistortionOperation::update_memory_buffer_partial(), view2d_edge_pan_loc_compensate(), view3d_mat_drop_tooltip(), view3d_ruler_item_project(), viewdolly_apply(), viewzoom_apply(), viewzoom_apply_3d(), viewzoom_apply_camera(), wm_drag_draw_default(), WM_drag_draw_default_fn(), wm_drag_draw_icon(), WM_drag_draw_item_name_fn(), wm_drag_draw_tooltip(), wm_drags_draw(), WM_event_drag_start_mval(), WM_event_drag_start_mval_fl(), WM_gesture_new(), and wm_handlers_do().