Blender V4.3
wm_subwindow.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include "BLI_math_geom.h"
12#include "BLI_math_vector.h"
13#include "BLI_rect.h"
14
15#include "DNA_screen_types.h"
17
18#include "GPU_matrix.hh"
19#include "GPU_viewport.hh"
20
21#include "WM_api.hh"
22
23void wmViewport(const rcti *winrct)
24{
25 int width = BLI_rcti_size_x(winrct) + 1;
26 int height = BLI_rcti_size_y(winrct) + 1;
27
28 GPU_viewport(winrct->xmin, winrct->ymin, width, height);
29 GPU_scissor(winrct->xmin, winrct->ymin, width, height);
30
31 wmOrtho2_pixelspace(width, height);
33}
34
35void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct)
36{
37 /* Setup part of the viewport for partial redraw. */
38 bool scissor_pad;
39
40 if (partialrct->xmin == partialrct->xmax) {
41 /* Full region. */
42 *drawrct = *winrct;
43 scissor_pad = true;
44 }
45 else {
46 /* Partial redraw, clipped to region. */
47 BLI_rcti_isect(winrct, partialrct, drawrct);
48 scissor_pad = false;
49 }
50
51 int x = drawrct->xmin - winrct->xmin;
52 int y = drawrct->ymin - winrct->ymin;
53 int width = BLI_rcti_size_x(winrct) + 1;
54 int height = BLI_rcti_size_y(winrct) + 1;
55
56 int scissor_width = BLI_rcti_size_x(drawrct);
57 int scissor_height = BLI_rcti_size_y(drawrct);
58
59 /* Partial redraw rect uses different convention than region rect,
60 * so compensate for that here. One pixel offset is noticeable with
61 * viewport border render. */
62 if (scissor_pad) {
63 scissor_width += 1;
64 scissor_height += 1;
65 }
66
67 GPU_viewport(0, 0, width, height);
68 GPU_scissor(x, y, scissor_width, scissor_height);
69
70 wmOrtho2_pixelspace(width, height);
72}
73
74static void wmOrtho2_offset(const float x, const float y, const float ofs);
75
76void wmWindowViewport_ex(const wmWindow *win, float offset)
77{
78 const blender::int2 win_size = WM_window_native_pixel_size(win);
79
80 GPU_viewport(0, 0, win_size[0], win_size[1]);
81 GPU_scissor(0, 0, win_size[0], win_size[1]);
82
83 wmOrtho2_offset(win_size[0], win_size[1], offset);
85}
86
87void wmWindowViewport(const wmWindow *win)
88{
90}
91
92void wmOrtho2(float x1, float x2, float y1, float y2)
93{
94 /* Prevent opengl from generating errors. */
95 if (x2 == x1) {
96 x2 += 1.0f;
97 }
98 if (y2 == y1) {
99 y2 += 1.0f;
100 }
101
104}
105
106static void wmOrtho2_offset(const float x, const float y, const float ofs)
107{
108 wmOrtho2(ofs, x + ofs, ofs, y + ofs);
109}
110
112{
113 wmOrtho2_offset(region->winx, region->winy, -0.01f);
114}
115
116void wmOrtho2_pixelspace(const float x, const float y)
117{
119}
120
121void wmGetProjectionMatrix(float mat[4][4], const rcti *winrct)
122{
123 int width = BLI_rcti_size_x(winrct) + 1;
124 int height = BLI_rcti_size_y(winrct) + 1;
125 orthographic_m4(mat,
127 float(width) - GLA_PIXEL_OFS,
129 float(height) - GLA_PIXEL_OFS,
132}
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:193
bool BLI_rcti_isect(const struct rcti *src1, const struct rcti *src2, struct rcti *dest)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
void GPU_matrix_ortho_set(float left, float right, float bottom, float top, float near, float far)
void GPU_matrix_identity_set()
#define GPU_MATRIX_ORTHO_CLIP_FAR_DEFAULT
#define GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT
void GPU_scissor(int x, int y, int width, int height)
Definition gpu_state.cc:188
void GPU_viewport(int x, int y, int width, int height)
Definition gpu_state.cc:194
#define GLA_PIXEL_OFS
int ymin
int xmin
int xmax
static void wmOrtho2_offset(const float x, const float y, const float ofs)
void wmViewport(const rcti *winrct)
void wmOrtho2(float x1, float x2, float y1, float y2)
void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct)
void wmOrtho2_pixelspace(const float x, const float y)
void wmWindowViewport(const wmWindow *win)
void wmGetProjectionMatrix(float mat[4][4], const rcti *winrct)
void wmWindowViewport_ex(const wmWindow *win, float offset)
void wmOrtho2_region_pixelspace(const ARegion *region)
blender::int2 WM_window_native_pixel_size(const wmWindow *win)