Blender V4.3
grease_pencil_image_render.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6#include "BLI_color.hh"
7#include "BLI_math_matrix.hh"
8
9#include "BKE_attribute.hh"
10#include "BKE_camera.h"
11#include "BKE_curves.hh"
12#include "BKE_image.hh"
13#include "BKE_material.h"
14
15#include "BLI_math_vector.hh"
17#include "DNA_material_types.h"
18#include "DNA_object_types.h"
19#include "DNA_scene_types.h"
20#include "DNA_view3d_types.h"
21
22#include "ED_grease_pencil.hh"
23#include "ED_view3d.hh"
24
25#include "GPU_primitive.hh"
26#include "GPU_shader_builtin.hh"
27#include "IMB_imbuf.hh"
28#include "IMB_imbuf_types.hh"
29
30#include "GPU_debug.hh"
31#include "GPU_framebuffer.hh"
32#include "GPU_immediate.hh"
33#include "GPU_matrix.hh"
34#include "GPU_shader_shared.hh"
35#include "GPU_state.hh"
36#include "GPU_texture.hh"
37#include "GPU_vertex_format.hh"
38
40
41/* Enable GPU debug capture (needs WITH_RENDERDOC option). */
42constexpr const bool enable_debug_gpu_capture = true;
43
44RegionViewData region_init(ARegion &region, const int2 &win_size)
45{
46 const RegionViewData data = {int2{region.winx, region.winy}, region.winrct};
47
48 /* Resize region. */
49 region.winrct.xmin = 0;
50 region.winrct.ymin = 0;
51 region.winrct.xmax = win_size.x;
52 region.winrct.ymax = win_size.y;
53 region.winx = short(win_size.x);
54 region.winy = short(win_size.y);
55
56 return data;
57}
58
59void region_reset(ARegion &region, const RegionViewData &data)
60{
61 region.winx = data.region_winsize.x;
62 region.winy = data.region_winsize.y;
63 region.winrct = data.region_winrct;
64}
65
67{
69 GPU_debug_capture_begin("Grease Pencil Image Render");
70 }
71
72 char err_out[256] = "unknown";
74 win_size.x, win_size.y, true, GPU_RGBA8, GPU_TEXTURE_USAGE_HOST_READ, err_out);
75 if (offscreen == nullptr) {
76 return nullptr;
77 }
78
79 GPU_offscreen_bind(offscreen, true);
80
85
86 GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f);
87 GPU_clear_depth(1.0f);
88
89 return offscreen;
90}
91
93{
96
97 const int2 win_size = {GPU_offscreen_width(buffer), GPU_offscreen_height(buffer)};
98 const uint imb_flag = IB_rect;
99 ImBuf *ibuf = IMB_allocImBuf(win_size.x, win_size.y, 32, imb_flag);
100 if (ibuf->float_buffer.data) {
102 }
103 else if (ibuf->byte_buffer.data) {
105 }
106 if (ibuf->float_buffer.data && ibuf->byte_buffer.data) {
108 }
109
110 Image *ima = BKE_image_add_from_imbuf(&bmain, ibuf, "Grease Pencil Fill");
111 ima->id.tag |= ID_TAG_DOIT;
112
113 BKE_image_release_ibuf(ima, ibuf, nullptr);
114
115 /* Switch back to regular frame-buffer. */
116 GPU_offscreen_unbind(buffer, true);
117 GPU_offscreen_free(buffer);
118
121 }
122
123 return ima;
124}
125
126void compute_view_matrices(const ViewContext &view_context,
127 const Scene &scene,
128 const int2 &win_size,
129 const float2 &zoom,
130 const float2 &offset)
131{
132 rctf viewplane;
133 float clip_start, clip_end;
134 const bool is_ortho = ED_view3d_viewplane_get(view_context.depsgraph,
135 view_context.v3d,
136 view_context.rv3d,
137 win_size.x,
138 win_size.y,
139 &viewplane,
140 &clip_start,
141 &clip_end,
142 nullptr);
143
144 /* Rescale `viewplane` to fit all strokes. */
145 const float2 view_min = float2(viewplane.xmin, viewplane.ymin);
146 const float2 view_max = float2(viewplane.xmax, viewplane.ymax);
147 const float2 view_extent = view_max - view_min;
148 const float2 view_center = 0.5f * (view_max + view_min);
149 const float2 offset_abs = offset * view_extent;
150 const float2 view_min_new = (view_min - view_center) * zoom + view_center + offset_abs;
151 const float2 view_max_new = (view_max - view_center) * zoom + view_center + offset_abs;
152 viewplane.xmin = view_min_new.x;
153 viewplane.ymin = view_min_new.y;
154 viewplane.xmax = view_max_new.x;
155 viewplane.ymax = view_max_new.y;
156
157 float4x4 winmat;
158 if (is_ortho) {
159 orthographic_m4(winmat.ptr(),
160 viewplane.xmin,
161 viewplane.xmax,
162 viewplane.ymin,
163 viewplane.ymax,
164 -clip_end,
165 clip_end);
166 }
167 else {
168 perspective_m4(winmat.ptr(),
169 viewplane.xmin,
170 viewplane.xmax,
171 viewplane.ymin,
172 viewplane.ymax,
173 clip_start,
174 clip_end);
175 }
176
178 &scene,
179 view_context.v3d,
180 view_context.region,
181 nullptr,
182 winmat.ptr(),
183 nullptr,
184 true);
185}
186
188{
190}
191
196
201
206
207void draw_dot(const float4x4 &transform,
208 const float3 &position,
209 const float point_size,
210 const ColorGeometry4f &color)
211{
216
220 immAttr1f(attr_size, point_size * M_SQRT2);
221 immAttr4fv(attr_color, color);
222 immVertex3fv(attr_pos, math::transform_point(transform, position));
223 immEnd();
226}
227
228void draw_polyline(const float4x4 &transform,
229 const IndexRange indices,
230 Span<float3> positions,
231 const VArray<ColorGeometry4f> &colors,
232 const bool cyclic,
233 const float line_width)
234{
236 const uint attr_pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
237 const uint attr_color = GPU_vertformat_attr_add(
238 format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
240
241 GPU_line_width(line_width);
242 /* If cyclic the curve needs one more vertex. */
243 const int cyclic_add = (cyclic && indices.size() > 2) ? 1 : 0;
244 immBeginAtMost(GPU_PRIM_LINE_STRIP, indices.size() + cyclic_add);
245
246 for (const int point_i : indices) {
247 immAttr4fv(attr_color, colors[point_i]);
248 immVertex3fv(attr_pos, math::transform_point(transform, positions[point_i]));
249 }
250
251 if (cyclic && indices.size() > 2) {
252 const int point_i = indices[0];
253 immAttr4fv(attr_color, colors[point_i]);
254 immVertex3fv(attr_pos, math::transform_point(transform, positions[point_i]));
255 }
256
257 immEnd();
259}
260
261static GPUUniformBuf *create_shader_ubo(const RegionView3D &rv3d,
262 const int2 &win_size,
263 const Object &object,
264 const eGPDstroke_Caps cap_start,
265 const eGPDstroke_Caps cap_end,
266 const bool is_fill_stroke)
267{
269 copy_v2_v2(data.viewport, float2(win_size));
270 data.pixsize = rv3d.pixsize;
271 data.objscale = math::average(float3(object.scale));
272 /* TODO Was based on the GP_DATA_STROKE_KEEPTHICKNESS flag which is currently not converted. */
273 data.keep_size = false;
274 data.pixfactor = 1.0f;
275 /* X-ray mode always to 3D space to avoid wrong Z-depth calculation (#60051). */
276 data.xraymode = GP_XRAY_3DSPACE;
277 data.caps_start = cap_start;
278 data.caps_end = cap_end;
279 data.fill_stroke = is_fill_stroke;
280
281 return GPU_uniformbuf_create_ex(sizeof(GPencilStrokeData), &data, __func__);
282}
283
284constexpr const float min_stroke_thickness = 0.05f;
285
286static void draw_grease_pencil_stroke(const float4x4 &transform,
287 const RegionView3D &rv3d,
288 const int2 &win_size,
289 const Object &object,
290 const IndexRange indices,
291 Span<float3> positions,
292 const VArray<float> &radii,
293 const VArray<ColorGeometry4f> &colors,
294 const bool cyclic,
295 const eGPDstroke_Caps cap_start,
296 const eGPDstroke_Caps cap_end,
297 const bool fill_stroke,
298 const float radius_scale)
299{
300 if (indices.is_empty()) {
301 return;
302 }
303
305 const uint attr_pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
306 const uint attr_color = GPU_vertformat_attr_add(
307 format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
308 const uint attr_thickness = GPU_vertformat_attr_add(
309 format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
310
312 GPUUniformBuf *ubo = create_shader_ubo(rv3d, win_size, object, cap_start, cap_end, fill_stroke);
313 immBindUniformBuf("gpencil_stroke_data", ubo);
314
315 /* If cyclic the curve needs one more vertex. */
316 const int cyclic_add = (cyclic && indices.size() > 2) ? 1 : 0;
317
318 immBeginAtMost(GPU_PRIM_LINE_STRIP_ADJ, indices.size() + cyclic_add + 2);
319
320 auto draw_point = [&](const int point_i) {
321 constexpr const float radius_to_pixel_factor =
323 const float thickness = radii[point_i] * radius_scale * radius_to_pixel_factor;
324
325 immAttr4fv(attr_color, colors[point_i]);
326 immAttr1f(attr_thickness, std::max(thickness, min_stroke_thickness));
327 immVertex3fv(attr_pos, math::transform_point(transform, positions[point_i]));
328 };
329
330 /* First point for adjacency (not drawn). */
331 if (cyclic && indices.size() > 2) {
332 draw_point(indices.last() - 1);
333 }
334 else {
335 draw_point(indices.first() + 1);
336 }
337
338 for (const int point_i : indices) {
339 draw_point(point_i);
340 }
341
342 if (cyclic && indices.size() > 2) {
343 draw_point(indices.first());
344 draw_point(indices.first() + 1);
345 }
346 /* Last adjacency point (not drawn). */
347 else {
348 draw_point(indices.last() - 1);
349 }
350
351 immEnd();
353
355}
356
357static void draw_dots(const float4x4 &transform,
358 const IndexRange indices,
359 Span<float3> positions,
360 const VArray<float> &radii,
361 const VArray<ColorGeometry4f> &colors,
362 const float radius_scale)
363{
364 if (indices.is_empty()) {
365 return;
366 }
367
369 const uint attr_pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
371 const uint attr_color = GPU_vertformat_attr_add(
372 format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
373
376
377 immBegin(GPU_PRIM_POINTS, indices.size());
378
379 for (const int point_i : indices) {
380 constexpr const float radius_to_pixel_factor =
382 const float thickness = radii[point_i] * radius_scale * radius_to_pixel_factor;
383
384 immAttr4fv(attr_color, colors[point_i]);
385 /* NOTE: extra factor 0.5 for point size to match rendering. */
386 immAttr1f(attr_size, std::max(thickness, min_stroke_thickness) * 0.5f);
387 immVertex3fv(attr_pos, math::transform_point(transform, positions[point_i]));
388 }
389
390 immEnd();
393}
394
395void draw_circles(const float4x4 &transform,
396 const IndexRange indices,
397 Span<float3> centers,
398 const VArray<float> &radii,
399 const VArray<ColorGeometry4f> &colors,
400 const float2 &viewport_size,
401 const float line_width,
402 const bool fill)
403{
404 if (indices.is_empty()) {
405 return;
406 }
407
408 constexpr const int segments_num = 32;
409 static const float2 coords[] = {
410 {1.0000f, 0.0000f}, {0.9808f, 0.1951f}, {0.9239f, 0.3827f}, {0.8315f, 0.5556f},
411 {0.7071f, 0.7071f}, {0.5556f, 0.8315f}, {0.3827f, 0.9239f}, {0.1951f, 0.9808f},
412 {0.0000f, 1.0000f}, {-0.1951f, 0.9808f}, {-0.3827f, 0.9239f}, {-0.5556f, 0.8315f},
413 {-0.7071f, 0.7071f}, {-0.8315f, 0.5556f}, {-0.9239f, 0.3827f}, {-0.9808f, 0.1951f},
414 {-1.0000f, 0.0000f}, {-0.9808f, -0.1951f}, {-0.9239f, -0.3827f}, {-0.8315f, -0.5556f},
415 {-0.7071f, -0.7071f}, {-0.5556f, -0.8315f}, {-0.3827f, -0.9239f}, {-0.1951f, -0.9808f},
416 {-0.0000f, -1.0000f}, {0.1951f, -0.9808f}, {0.3827f, -0.9239f}, {0.5556f, -0.8315f},
417 {0.7071f, -0.7071f}, {0.8315f, -0.5556f}, {0.9239f, -0.3827f}, {0.9808f, -0.1951f},
418 };
419
421 const uint attr_pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
422 const uint attr_color = GPU_vertformat_attr_add(
423 format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
424
425 const float scale = math::average(math::to_scale(transform));
426
427 if (fill) {
429
430 for (const int point_i : indices) {
431 const float radius = radii[point_i];
432 const ColorGeometry4f color = colors[point_i];
433 const float3 center = math::transform_point(transform, centers[point_i]);
434
435 immBegin(GPU_PRIM_TRI_STRIP, segments_num);
436
437 for (const int i : IndexRange(segments_num / 2)) {
438 immAttr4fv(attr_color, color);
439 immVertex3fv(attr_pos, center + float3(radius * scale * coords[i], 0.0f));
440 if (segments_num - 1 - i > i) {
441 immAttr4fv(attr_color, color);
442 immVertex3fv(attr_pos,
443 center + float3(radius * scale * coords[segments_num - 1 - i], 0.0f));
444 }
445 }
446
447 immEnd();
448 }
449
451 }
452 else {
454
455 immUniform2fv("viewportSize", viewport_size);
456 immUniform1f("lineWidth", line_width * U.pixelsize);
457
458 for (const int point_i : indices) {
459 const float radius = radii[point_i];
460 const ColorGeometry4f color = colors[point_i];
461 const float3 center = math::transform_point(transform, centers[point_i]);
462
463 immBegin(GPU_PRIM_LINE_STRIP, segments_num + 1);
464
465 for (const int i : IndexRange(segments_num)) {
466 immAttr4fv(attr_color, color);
467 immVertex3fv(attr_pos, center + float3(radius * scale * coords[i], 0.0f));
468 }
469 immAttr4fv(attr_color, color);
470 immVertex3fv(attr_pos, center + float3(radius * scale * coords[0], 0.0f));
471
472 immEnd();
473 }
474
476 }
477}
478
479void draw_lines(const float4x4 &transform,
480 IndexRange indices,
481 Span<float3> start_positions,
482 Span<float3> end_positions,
483 const VArray<ColorGeometry4f> &colors,
484 float line_width)
485{
487 const uint attr_pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
488 const uint attr_color = GPU_vertformat_attr_add(
489 format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
491
492 GPU_line_width(line_width);
493 immBeginAtMost(GPU_PRIM_LINES, 2 * indices.size());
494
495 for (const int point_i : indices) {
496 immAttr4fv(attr_color, colors[point_i]);
497 immVertex3fv(attr_pos, math::transform_point(transform, start_positions[point_i]));
498
499 immAttr4fv(attr_color, colors[point_i]);
500 immVertex3fv(attr_pos, math::transform_point(transform, end_positions[point_i]));
501 }
502
503 immEnd();
505}
506
508 const int2 &win_size,
509 const Object &object,
510 const bke::greasepencil::Drawing &drawing,
511 const float4x4 &transform,
512 const IndexMask &strokes_mask,
513 const VArray<ColorGeometry4f> &colors,
514 const bool use_xray,
515 const float radius_scale)
516{
517 set_view_matrix(rv3d);
518
520 /* Do not write to depth (avoid self-occlusion). */
521 const bool prev_depth_mask = GPU_depth_mask_get();
522 GPU_depth_mask(false);
523 if (!use_xray) {
525 /* First arg is normally rv3d->dist, but this isn't
526 * available here and seems to work quite well without. */
527 GPU_polygon_offset(1.0f, 1.0f);
528 }
529
530 const bke::CurvesGeometry &curves = drawing.strokes();
531 const OffsetIndices points_by_curve = curves.points_by_curve();
532 const Span<float3> positions = curves.positions();
533 const bke::AttributeAccessor attributes = curves.attributes();
534 const VArray<bool> cyclic = curves.cyclic();
535 const VArray<float> &radii = drawing.radii();
536 const VArray<int8_t> stroke_start_caps = *attributes.lookup_or_default<int8_t>(
538 const VArray<int8_t> stroke_end_caps = *attributes.lookup_or_default<int8_t>(
540 const VArray<int> materials = *attributes.lookup<int>("material_index", bke::AttrDomain::Curve);
541
542 /* Note: Serial loop without GrainSize, since immediate mode drawing can't happen in worker
543 * threads, has to be from the main thread. */
544 strokes_mask.foreach_index([&](const int stroke_i) {
545 /* Check if the color is visible. */
546 const int material_index = materials[stroke_i];
547 const Material *mat = BKE_object_material_get(const_cast<Object *>(&object),
548 material_index + 1);
549 const eMaterialGPencilStyle_Mode stroke_mode = mat && mat->gp_style ?
551 mat->gp_style->mode) :
553
554 if (mat == nullptr || (mat->gp_style->flag & GP_MATERIAL_HIDE)) {
555 return;
556 }
557
558 switch (eMaterialGPencilStyle_Mode(stroke_mode)) {
561 rv3d,
562 win_size,
563 object,
564 points_by_curve[stroke_i],
565 positions,
566 radii,
567 colors,
568 cyclic[stroke_i],
569 eGPDstroke_Caps(stroke_start_caps[stroke_i]),
570 eGPDstroke_Caps(stroke_end_caps[stroke_i]),
571 false,
572 radius_scale);
573 break;
576 /* NOTE: Squares don't have their own shader, render as dots too. */
577 draw_dots(transform, points_by_curve[stroke_i], positions, radii, colors, radius_scale);
578 break;
579 }
580 });
581
582 if (!use_xray) {
584
585 GPU_polygon_offset(0.0f, 0.0f);
586 }
587 GPU_depth_mask(prev_depth_mask);
590}
591
592} // namespace blender::ed::greasepencil::image_render
Camera data-block and utility functions.
Low-level operations for curves.
Low-level operations for grease pencil.
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
Image * BKE_image_add_from_imbuf(Main *bmain, ImBuf *ibuf, const char *name)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
#define M_SQRT2
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
MINLINE void copy_v2_v2(float r[2], const float a[2])
unsigned int uint
@ ID_TAG_DOIT
Definition DNA_ID.h:1003
@ GP_MATERIAL_HIDE
eMaterialGPencilStyle_Mode
@ GP_MATERIAL_MODE_SQUARE
@ GP_MATERIAL_MODE_DOT
@ GP_MATERIAL_MODE_LINE
Object is a sort of wrapper for general info.
bool ED_view3d_viewplane_get(const Depsgraph *depsgraph, const View3D *v3d, const RegionView3D *rv3d, int winx, int winy, rctf *r_viewplane, float *r_clip_start, float *r_clip_end, float *r_pixsize)
void ED_view3d_update_viewmat(const Depsgraph *depsgraph, const Scene *scene, View3D *v3d, ARegion *region, const float viewmat[4][4], const float winmat[4][4], const rcti *rect, bool offscreen)
void GPU_debug_capture_end()
Definition gpu_debug.cc:93
void GPU_debug_capture_begin(const char *title)
Definition gpu_debug.cc:78
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, eGPUTextureFormat format, eGPUTextureUsage usage, char err_out[256])
int GPU_offscreen_width(const GPUOffScreen *offscreen)
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
int GPU_offscreen_height(const GPUOffScreen *offscreen)
void GPU_clear_color(float red, float green, float blue, float alpha)
void GPU_offscreen_free(GPUOffScreen *offscreen)
void GPU_clear_depth(float depth)
void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data)
void GPU_offscreen_unbind(GPUOffScreen *offscreen, bool restore)
void immEnd()
void immUniform2fv(const char *name, const float data[2])
void immUnbindProgram()
void immAttr4fv(uint attr_id, const float data[4])
void immAttr1f(uint attr_id, float x)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
void immBeginAtMost(GPUPrimType, uint max_vertex_len)
void immBindUniformBuf(const char *name, GPUUniformBuf *ubo)
void immUniform1f(const char *name, float x)
GPUVertFormat * immVertexFormat()
void immVertex3fv(uint attr_id, const float data[3])
void immBegin(GPUPrimType, uint vertex_len)
void GPU_matrix_identity_projection_set()
void GPU_matrix_identity_set()
#define GPU_matrix_set(x)
void GPU_matrix_push()
void GPU_matrix_push_projection()
void GPU_matrix_pop_projection()
#define GPU_matrix_projection_set(x)
void GPU_polygon_offset(float viewdist, float dist)
void GPU_matrix_pop()
@ GPU_PRIM_LINE_STRIP_ADJ
@ GPU_PRIM_LINES
@ GPU_PRIM_POINTS
@ GPU_PRIM_LINE_STRIP
@ GPU_PRIM_TRI_STRIP
@ GPU_SHADER_GPENCIL_STROKE
@ GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR
@ GPU_SHADER_3D_FLAT_COLOR
@ GPU_SHADER_3D_POLYLINE_FLAT_COLOR
void GPU_program_point_size(bool enable)
Definition gpu_state.cc:175
void GPU_line_width(float width)
Definition gpu_state.cc:161
void GPU_depth_mask(bool depth)
Definition gpu_state.cc:110
@ GPU_DEPTH_LESS_EQUAL
Definition GPU_state.hh:111
@ GPU_DEPTH_NONE
Definition GPU_state.hh:108
void GPU_depth_test(eGPUDepthTest test)
Definition gpu_state.cc:68
bool GPU_depth_mask_get()
Definition gpu_state.cc:276
@ GPU_DATA_UBYTE
@ GPU_DATA_FLOAT
@ GPU_TEXTURE_USAGE_HOST_READ
GPUUniformBuf * GPU_uniformbuf_create_ex(size_t size, const void *data, const char *name)
void GPU_uniformbuf_free(GPUUniformBuf *ubo)
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
void IMB_rect_from_float(ImBuf *ibuf)
Definition divers.cc:694
Contains defines and structs used throughout the imbuf module.
@ IB_rect
unsigned int U
Definition btGjkEpa3.h:78
const bke::CurvesGeometry & strokes() const
void foreach_index(Fn &&fn) const
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
static ushort indices[]
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
static uint attr_size(const GPUVertAttr *a)
format
constexpr float LEGACY_RADIUS_CONVERSION_FACTOR
void compute_view_matrices(const ViewContext &view_context, const Scene &scene, const int2 &win_size, const float2 &zoom, const float2 &offset)
void region_reset(ARegion &region, const RegionViewData &data)
void draw_lines(const float4x4 &transform, IndexRange indices, Span< float3 > start_positions, Span< float3 > end_positions, const VArray< ColorGeometry4f > &colors, float line_width)
Image * image_render_end(Main &bmain, GPUOffScreen *buffer)
void draw_grease_pencil_strokes(const RegionView3D &rv3d, const int2 &win_size, const Object &object, const bke::greasepencil::Drawing &drawing, const float4x4 &transform, const IndexMask &strokes_mask, const VArray< ColorGeometry4f > &colors, const bool use_xray, const float radius_scale)
RegionViewData region_init(ARegion &region, const int2 &win_size)
static GPUUniformBuf * create_shader_ubo(const RegionView3D &rv3d, const int2 &win_size, const Object &object, const eGPDstroke_Caps cap_start, const eGPDstroke_Caps cap_end, const bool is_fill_stroke)
static void draw_grease_pencil_stroke(const float4x4 &transform, const RegionView3D &rv3d, const int2 &win_size, const Object &object, const IndexRange indices, Span< float3 > positions, const VArray< float > &radii, const VArray< ColorGeometry4f > &colors, const bool cyclic, const eGPDstroke_Caps cap_start, const eGPDstroke_Caps cap_end, const bool fill_stroke, const float radius_scale)
static void draw_dots(const float4x4 &transform, const IndexRange indices, Span< float3 > positions, const VArray< float > &radii, const VArray< ColorGeometry4f > &colors, const float radius_scale)
void draw_circles(const float4x4 &transform, const IndexRange indices, Span< float3 > centers, const VArray< float > &radii, const VArray< ColorGeometry4f > &colors, const float2 &viewport_size, const float line_width, const bool fill)
void draw_dot(const float4x4 &transform, const float3 &position, const float point_size, const ColorGeometry4f &color)
void draw_polyline(const float4x4 &transform, const IndexRange indices, Span< float3 > positions, const VArray< ColorGeometry4f > &colors, const bool cyclic, const float line_width)
GPUOffScreen * image_render_begin(const int2 &win_size)
T average(const VecBase< T, Size > &a)
VecBase< T, 3 > to_scale(const MatBase< T, NumCol, NumRow > &mat)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
VecBase< float, 2 > float2
VecBase< float, 3 > float3
signed char int8_t
Definition stdint.h:75
int tag
Definition DNA_ID.h:434
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct MaterialGPencilStyle * gp_style
float viewmat[4][4]
float winmat[4][4]
RegionView3D * rv3d
Definition ED_view3d.hh:76
ARegion * region
Definition ED_view3d.hh:73
View3D * v3d
Definition ED_view3d.hh:74
Depsgraph * depsgraph
Definition ED_view3d.hh:68
const c_style_mat & ptr() const
float xmax
float xmin
float ymax
float ymin