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)
 
GPUTexture * wm_draw_region_texture (ARegion *region, int view)
 
void wm_draw_region_blend (ARegion *region, int view, bool blend)
 
GPUViewport * WM_draw_region_get_viewport (ARegion *region)
 
GPUViewport * WM_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
 
void * WM_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().